diff --git a/.gitignore b/.gitignore index 1fb725d..74b0d86 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,4 @@ *~ .*.swp Audio -Source -Documents -Pictures External diff --git a/Documents/Dokumentation BJ-Keyer.aux b/Documents/Dokumentation BJ-Keyer.aux new file mode 100644 index 0000000..6b29333 --- /dev/null +++ b/Documents/Dokumentation BJ-Keyer.aux @@ -0,0 +1,101 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand*\new@tpo@label[2]{} +\providecommand\babel@aux[2]{} +\@nameuse{bbl@beforestart} +\catcode `"\active +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\providecommand\BKM@entry[2]{} +\selectlanguage *{latex} +\@writefile{toc}{\selectlanguage *{latex}} +\@writefile{lof}{\selectlanguage *{latex}} +\@writefile{lot}{\selectlanguage *{latex}} +\selectlanguage *{latex} +\@writefile{toc}{\selectlanguage *{latex}} +\@writefile{lof}{\selectlanguage *{latex}} +\@writefile{lot}{\selectlanguage *{latex}} +\BKM@entry{id=1,dest={636861707465722E31},srcline={111},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030465C303030755C3030306E5C3030306B5C303030745C303030695C3030306F5C3030306E5C303030655C3030306E} +\@writefile{toc}{\contentsline {chapter}{\numberline {1}Funktionen}{5}{chapter.1}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\BKM@entry{id=2,dest={636861707465722E32},srcline={125},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030485C303030695C3030306E5C303030775C303030655C303030695C303030735C303030655C3030305C3034305C3030307A5C303030755C303030725C3030305C3034305C303030445C3030306F5C3030306B5C303030755C3030306D5C303030655C3030306E5C303030745C303030615C303030745C303030695C3030306F5C3030306E} +\@writefile{toc}{\contentsline {chapter}{\numberline {2}Hinweise zur Dokumentation}{7}{chapter.2}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\BKM@entry{id=3,dest={636861707465722E33},srcline={129},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030475C303030725C303030755C3030306E5C303030645C3030306C5C303030615C303030675C303030655C3030306E} +\BKM@entry{id=4,dest={73656374696F6E2E332E31},srcline={131},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030745C303030725C303030695C303030655C303030625C303030735C303030615C303030725C303030745C303030655C3030306E5C3030305C3034305C303030655C303030695C3030306E5C303030655C303030735C3030305C3034305C3030304D5C3030306F5C303030725C303030735C303030655C3030302D5C3030304B5C303030655C303030795C303030655C303030725C30303073} +\BKM@entry{id=5,dest={73756273656374696F6E2E332E312E31},srcline={133},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C3030305A5C303030655C303030695C303030745C303030765C303030655C303030725C303030685C303030615C3030306C5C303030745C303030655C3030306E} +\@writefile{toc}{\contentsline {chapter}{\numberline {3}Grundlagen}{9}{chapter.3}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{toc}{\contentsline {section}{\numberline {3.1}Betriebsarten eines Morse-Keyers}{9}{section.3.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {3.1.1}Zeitverhalten}{9}{subsection.3.1.1}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {3.1}{\ignorespaces Diagramm Mode A\relax }}{9}{figure.caption.4}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {3.2}{\ignorespaces Diagramm Mode B\relax }}{10}{figure.caption.5}\protected@file@percent } +\BKM@entry{id=6,dest={636861707465722E34},srcline={188},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030645C303030695C303030655C3030306E5C303030755C3030306E5C30303067} +\BKM@entry{id=7,dest={73656374696F6E2E342E31},srcline={190},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030615C303030735C303030745C303030615C303030745C303030755C303030725C303030625C303030655C3030306C5C303030655C303030675C303030755C3030306E5C30303067} +\BKM@entry{id=8,dest={73756273656374696F6E2E342E312E31},srcline={192},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C3030305C3333345C303030625C303030655C303030725C303030735C303030695C303030635C303030685C30303074} +\@writefile{toc}{\contentsline {chapter}{\numberline {4}Bedienung}{11}{chapter.4}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{toc}{\contentsline {section}{\numberline {4.1}Tastaturbelegung}{11}{section.4.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.1.1}Übersicht}{11}{subsection.4.1.1}\protected@file@percent } +\BKM@entry{id=9,dest={636861707465722E35},srcline={196},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030535C303030635C303030685C303030615C3030306C5C303030745C303030755C3030306E5C30303067} +\BKM@entry{id=10,dest={73656374696F6E2E352E31},srcline={198},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030735C303030635C303030685C303030725C303030655C303030695C303030625C303030755C3030306E5C30303067} +\BKM@entry{id=11,dest={73656374696F6E2E352E32},srcline={200},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030535C303030635C303030685C303030615C3030306C5C303030745C303030705C3030306C5C303030615C3030306E} +\@writefile{toc}{\contentsline {chapter}{\numberline {5}Schaltung}{13}{chapter.5}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{toc}{\contentsline {section}{\numberline {5.1}Beschreibung}{13}{section.5.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {5.2}Schaltplan}{13}{section.5.2}\protected@file@percent } +\@writefile{lot}{\contentsline {table}{\numberline {5.1}{\ignorespaces Programmierpunkte Teil 1\relax }}{13}{table.caption.6}\protected@file@percent } +\BKM@entry{id=12,dest={636861707465722E36},srcline={235},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030735C303030635C303030685C303030725C303030655C303030695C303030625C303030755C3030306E5C303030675C3030305C3034305C303030645C303030655C303030725C3030305C3034305C303030485C303030615C303030725C303030645C303030775C303030615C303030725C30303065} +\@writefile{toc}{\contentsline {chapter}{\numberline {6}Beschreibung der Hardware}{15}{chapter.6}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{lot}{\contentsline {table}{\numberline {6.1}{\ignorespaces Klemmenbelegung\relax }}{15}{table.caption.7}\protected@file@percent } +\BKM@entry{id=13,dest={636861707465722E37},srcline={245},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030425C303030655C303030735C303030635C303030685C303030725C303030655C303030695C303030625C303030755C3030306E5C303030675C3030305C3034305C303030645C303030655C303030725C3030305C3034305C303030535C3030306F5C303030665C303030745C303030775C303030615C303030725C30303065} +\BKM@entry{id=14,dest={73656374696F6E2E372E31},srcline={246},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C30303031} +\BKM@entry{id=15,dest={73756273656374696F6E2E372E312E31},srcline={253},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030545C303030695C3030306D5C303030655C303030725C3030305C3034305C303030655C303030695C3030306E5C303030735C303030745C303030655C3030306C5C3030306C5C303030655C3030306E} +\BKM@entry{id=16,dest={73656374696F6E2E372E32},srcline={260},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030535C303030695C3030306E5C303030755C303030735C3030305C3034305C3030304D5C303030695C303030745C303030685C3030305C3336365C303030725C303030745C3030306F5C3030306E5C3030305C3034305C303030645C303030755C303030725C303030635C303030685C3030305C3034305C303030505C303030755C3030306C5C303030735C303030775C303030655C303030695C303030745C303030655C3030306E5C3030306D5C3030306F5C303030645C303030755C3030306C5C303030615C303030745C303030695C3030306F5C3030306E} +\BKM@entry{id=17,dest={73756273656374696F6E2E372E322E31},srcline={266},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030475C303030725C303030755C3030306E5C303030645C3030306C5C303030615C303030675C303030655C3030306E} +\@writefile{toc}{\contentsline {chapter}{\numberline {7}Beschreibung der Software}{17}{chapter.7}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\@writefile{toc}{\contentsline {section}{\numberline {7.1}Timer 1}{17}{section.7.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {7.1.1}Timer einstellen}{17}{subsection.7.1.1}\protected@file@percent } +\@writefile{toc}{\contentsline {section}{\numberline {7.2}Sinus Mithörton durch Pulsweitenmodulation}{17}{section.7.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {7.2.1}Grundlagen}{17}{subsection.7.2.1}\protected@file@percent } +\@writefile{lof}{\contentsline {figure}{\numberline {7.1}{\ignorespaces PWM Ausgangssignal\relax }}{18}{figure.caption.8}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\nonumberline Pulsweitenmodulation}{18}{subsubsection*.10}\protected@file@percent } +\BKM@entry{id=18,dest={73756273656374696F6E2E372E322E32},srcline={346},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030535C303030695C3030306E5C303030755C303030735C303030745C303030615C303030625C303030655C3030306C5C3030306C5C30303065} +\@writefile{toc}{\contentsline {subsection}{\numberline {7.2.2}Sinustabelle}{19}{subsection.7.2.2}\protected@file@percent } +\BKM@entry{id=19,dest={617070656E6469782E41},srcline={365},srcfile={2E2F446F6B756D656E746174696F6E20424A2D4B657965722E746578}}{5C3337365C3337375C303030455C3030306E5C303030745C303030775C303030695C303030635C3030306B5C3030306C5C303030755C3030306E5C303030675C303030735C303030755C3030306D5C303030675C303030655C303030625C303030755C3030306E5C30303067} +\@writefile{toc}{\contentsline {chapter}{\numberline {A}Entwicklungsumgebung}{25}{appendix.A}\protected@file@percent } +\@writefile{lof}{\addvspace {10\p@ }} +\@writefile{lot}{\addvspace {10\p@ }} +\global\csname @altsecnumformattrue\endcsname +\global\@namedef{scr@dte@chapter@lastmaxnumwidth}{16.04095pt} +\global\@namedef{scr@dte@section@lastmaxnumwidth}{28.08197pt} +\global\@namedef{scr@dte@subsection@lastmaxnumwidth}{40.12299pt} +\global\@namedef{scr@dte@table@lastmaxnumwidth}{28.08197pt} +\global\@namedef{scr@dte@figure@lastmaxnumwidth}{28.08197pt} +\@writefile{toc}{\providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file} +\@writefile{lot}{\providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file} +\@writefile{lof}{\providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file} +\gdef \@abspage@last{26} diff --git a/Documents/Dokumentation BJ-Keyer.lof b/Documents/Dokumentation BJ-Keyer.lof new file mode 100644 index 0000000..b933774 --- /dev/null +++ b/Documents/Dokumentation BJ-Keyer.lof @@ -0,0 +1,14 @@ +\selectlanguage *{latex} +\selectlanguage *{latex} +\addvspace {10\p@ } +\addvspace {10\p@ } +\addvspace {10\p@ } +\contentsline {figure}{\numberline {3.1}{\ignorespaces Diagramm Mode A\relax }}{9}{figure.caption.4}% +\contentsline {figure}{\numberline {3.2}{\ignorespaces Diagramm Mode B\relax }}{10}{figure.caption.5}% +\addvspace {10\p@ } +\addvspace {10\p@ } +\addvspace {10\p@ } +\addvspace {10\p@ } +\contentsline {figure}{\numberline {7.1}{\ignorespaces PWM Ausgangssignal\relax }}{18}{figure.caption.8}% +\addvspace {10\p@ } +\providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file diff --git a/Documents/Dokumentation BJ-Keyer.log b/Documents/Dokumentation BJ-Keyer.log new file mode 100644 index 0000000..9b91b67 --- /dev/null +++ b/Documents/Dokumentation BJ-Keyer.log @@ -0,0 +1,2251 @@ +This is LuaHBTeX, Version 1.12.0 (TeX Live 2020/Debian) (format=lualatex 2023.6.25) 28 JUN 2023 23:32 + restricted system commands enabled. +**"Dokumentation BJ-Keyer.tex" +("./Dokumentation BJ-Keyer.tex" +LaTeX2e <2020-10-01> patch level 4 +Lua module: luaotfload 2021-01-08 3.17 Lua based OpenType font support +Lua module: lualibs 2020-12-30 2.73 ConTeXt Lua standard libraries. +Lua module: lualibs-extended 2020-12-30 2.73 ConTeXt Lua libraries -- extended c +ollection. +luaotfload | conf : Root cache directory is "/home/tom/.texlive2020/texmf-var/lu +atex-cache/generic/names". +luaotfload | init : Loading fontloader "fontloader-2021-01-07.lua" from kpse-res +olved path "/usr/share/texlive/texmf-dist/tex/luatex/luaotfload/fontloader-2021- +01-07.lua". +Lua-only attribute luaotfload@noligature = 1 +Lua-only attribute luaotfload@syllabe = 2 +luaotfload | init : Context OpenType loader version 0x1.8e76c8b439581p+1 +Inserting `luaotfload.node_processor' at position 1 in `pre_linebreak_filter'. +Inserting `luaotfload.node_processor' at position 1 in `hpack_filter'. +Inserting `luaotfload.glyph_stream' at position 1 in `glyph_stream_provider'. +Inserting `luaotfload.define_font' at position 1 in `define_font'. +Lua-only attribute luaotfload_color_attribute = 3 +luaotfload | conf : Root cache directory is "/home/tom/.texlive2020/texmf-var/lu +atex-cache/generic/names". +Inserting `luaotfload.harf.strip_prefix' at position 1 in `find_opentype_file'. +Inserting `luaotfload.harf.strip_prefix' at position 1 in `find_truetype_file'. +Inserting `luaotfload.harf.finalize_vlist' at position 1 in `post_linebreak_filt +er'. +Inserting `luaotfload.harf.finalize_hlist' at position 2 in `hpack_filter'. +Inserting `luaotfload.cleanup_files' at position 1 in `wrapup_run'. +Inserting `luaotfload.harf.finalize_unicode' at position 1 in `finish_pdffile'. +Inserting `luaotfload.glyphinfo' at position 1 in `glyph_info'. +Inserting `luaotfload.aux.set_sscale_dimens' at position 1 in `luaotfload.patch_ +font'. +Inserting `luaotfload.aux.set_font_index' at position 2 in `luaotfload.patch_fon +t'. +Inserting `luaotfload.aux.patch_cambria_domh' at position 3 in `luaotfload.patch +_font'. +Inserting `luaotfload.aux.fixup_fontdata' at position 1 in `luaotfload.patch_fon +t_unsafe'. +Inserting `luaotfload.aux.set_capheight' at position 4 in `luaotfload.patch_font +'. +Inserting `luaotfload.aux.set_xheight' at position 5 in `luaotfload.patch_font'. +Inserting `luaotfload.rewrite_fontname' at position 6 in `luaotfload.patch_font' +. L3 programming layer <2021-01-09> xparse <2020-03-03> +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbook.cls +Document Class: scrbook 2020/09/21 v3.32 KOMA-Script document class (book) +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrkbase.sty +Package: scrkbase 2020/09/21 v3.32 KOMA-Script package (KOMA-Script-dependent ba +sics and keyval usage) + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrbase.sty +Package: scrbase 2020/09/21 v3.32 KOMA-Script package (KOMA-Script-independent b +asics and keyval usage) + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile.sty +Package: scrlfile 2020/09/21 v3.32 KOMA-Script package (file load hooks) + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty +Package: scrlfile-hook 2020/09/21 v3.32 KOMA-Script package (using LaTeX hooks) + +LaTeX3 Info: Defining command \BeforeFile with sig. 'm' on line 61. + + +LaTeX3 Info: Defining command \AfterFile with sig. 'm' on line 65. + + +LaTeX3 Info: Defining command \BeforeClass with sig. 'm' on line 69. + + +LaTeX3 Info: Defining command \BeforePackage with sig. 'm' on line 73. + + +LaTeX3 Info: Defining command \AfterAtEndOfClass with sig. 'smo+m' on line 83. + + +LaTeX3 Info: Defining command \AfterAtEndOfPackage with sig. 'smo+m' on line +(LaTeX3) 93. + + +LaTeX3 Info: Defining command \scrlfile@AfterClass with sig. 'smo+m' on line +(LaTeX3) 173. + + +LaTeX3 Info: Defining command \AfterClass with sig. '' on line 174. + + +LaTeX3 Info: Defining command \scrlfile@AfterPackage with sig. 'smo+m' on line +(LaTeX3) 191. + + +LaTeX3 Info: Defining command \AfterPackage with sig. '' on line 192. + + +LaTeX3 Info: Defining command \ReplaceInput with sig. '' on line 193. + + +LaTeX3 Info: Defining command \ReplaceClass with sig. 'mm' on line 196. + + +LaTeX3 Info: Defining command \ReplacePackage with sig. 'mm' on line 199. + + +LaTeX3 Info: Defining command \UnReplaceInput with sig. '' on line 200. + + +LaTeX3 Info: Defining command \UnReplaceClass with sig. 'm' on line 203. + + +LaTeX3 Info: Defining command \UnReplacePackage with sig. 'mm' on line 206. + + +LaTeX3 Info: Defining command \PreventPackageFromLoading with sig. 's+om' on +(LaTeX3) line 234. + + +LaTeX3 Info: Defining command \StorePreventPackageFromLoading with sig. 'm' on +(LaTeX3) line 242. + + +LaTeX3 Info: Defining command \ResetPreventPackageFromLoading with sig. '' on +(LaTeX3) line 247. + + +LaTeX3 Info: Defining command \UnPreventPackageFromLoading with sig. 'sm' on +(LaTeX3) line 261. + + +LaTeX3 Info: Defining command \BeforeClosingMainAux with sig. 'om' on line +(LaTeX3) 274. + + +LaTeX3 Info: Defining command \AfterReadingMainAux with sig. 'om' on line 287. + + +LaTeX3 Info: Defining command \protected@immediate@write with sig. 'm+m+m' on +(LaTeX3) line 298. + + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrlogo.sty +Package: scrlogo 2020/09/21 v3.32 KOMA-Script package (logo) +))) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 2014/10/28 v1.15 key=value parser (DPC) +\KV@toks@=\toks15 +))) +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/tocbasic.sty +Package: tocbasic 2020/09/21 v3.32 KOMA-Script package (handling toc-files) +\scr@dte@tocline@numberwidth=\skip47 +\scr@dte@tocline@numbox=\box47 +) +Package tocbasic Info: babel extension for `toc' omitted +(tocbasic) because of missing \bbl@set@language on input line 137. +Package scrbook Info: You've used standard option `10pt'. +(scrbook) This is correct! +(scrbook) Internally I'm using `fontsize=10pt'. +(scrbook) If you'd like to set the option with \KOMAoptions, +(scrbook) you'd have to use `fontsize=10pt' there +(scrbook) instead of `10pt', too. +Class scrbook Info: File `scrsize10pt.clo' used to setup font sizes on input lin +e 2437. + +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/scrsize10pt.clo +File: scrsize10pt.clo 2020/09/21 v3.32 KOMA-Script font size class option (10pt) + +luaotfload | db : Font names database loaded from /home/tom/.texlive2020/texmf-v +ar/luatex-cache/generic/names/luaotfload-names.luc) +(/usr/share/texlive/texmf-dist/tex/latex/koma-script/typearea.sty +Package: typearea 2020/09/21 v3.32 KOMA-Script package (type area) +\ta@bcor=\skip48 +\ta@div=\count173 +Package typearea Info: You've used standard option `a4paper'. +(typearea) This is correct! +(typearea) Internally I'm using `paper=a4'. +(typearea) If you'd like to set the option with \KOMAoptions, +(typearea) you'd have to use `paper=a4' there +(typearea) instead of `a4paper', too. +\ta@hblk=\skip49 +\ta@vblk=\skip50 +\ta@temp=\skip51 +\footheight=\skip52 +Package typearea Info: These are the values describing the layout: +(typearea) DIV = 8 +(typearea) BCOR = 0.0pt +(typearea) \paperwidth = 597.50793pt +(typearea) \textwidth = 373.44246pt +(typearea) DIV departure = -4% +(typearea) \evensidemargin = 77.107pt +(typearea) \oddsidemargin = 2.4185pt +(typearea) \paperheight = 845.04694pt +(typearea) \textheight = 538.0pt +(typearea) \topmargin = 0.36087pt +(typearea) \headheight = 15.0pt +(typearea) \headsep = 18.0pt +(typearea) \topskip = 10.0pt +(typearea) \footskip = 42.0pt +(typearea) \baselineskip = 12.0pt +(typearea) on input line 1740. +) +\c@part=\count174 +\c@chapter=\count175 +\c@section=\count176 +\c@subsection=\count177 +\c@subsubsection=\count178 +\c@paragraph=\count179 +\c@subparagraph=\count180 +\scr@dte@chapter@maxnumwidth=\skip53 +Class scrbook Info: using compatibility default `afterindent=bysign' +(scrbook) for `\chapter on input line 5625. +\scr@dte@section@maxnumwidth=\skip54 +Class scrbook Info: using compatibility default `runin=bysign' +(scrbook) for `\section on input line 5636. +Class scrbook Info: using compatibility default `afterindent=bysign' +(scrbook) for `\section on input line 5636. +\scr@dte@part@maxnumwidth=\skip55 +Class scrbook Info: using compatibility default `afterindent=true' +(scrbook) for `\part on input line 5645. +\scr@dte@subsection@maxnumwidth=\skip56 +Class scrbook Info: using compatibility default `runin=bysign' +(scrbook) for `\subsection on input line 5655. +Class scrbook Info: using compatibility default `afterindent=bysign' +(scrbook) for `\subsection on input line 5655. +\scr@dte@subsubsection@maxnumwidth=\skip57 +Class scrbook Info: using compatibility default `runin=bysign' +(scrbook) for `\subsubsection on input line 5665. +Class scrbook Info: using compatibility default `afterindent=bysign' +(scrbook) for `\subsubsection on input line 5665. +\scr@dte@paragraph@maxnumwidth=\skip58 +Class scrbook Info: using compatibility default `runin=bysign' +(scrbook) for `\paragraph on input line 5676. +Class scrbook Info: using compatibility default `afterindent=bysign' +(scrbook) for `\paragraph on input line 5676. +\scr@dte@subparagraph@maxnumwidth=\skip59 +Class scrbook Info: using compatibility default `runin=bysign' +(scrbook) for `\subparagraph on input line 5686. +Class scrbook Info: using compatibility default `afterindent=bysign' +(scrbook) for `\subparagraph on input line 5686. +\abovecaptionskip=\skip60 +\belowcaptionskip=\skip61 +\c@pti@nb@sid@b@x=\box48 +Package tocbasic Info: babel extension for `lof' omitted +(tocbasic) because of missing \bbl@set@language on input line 6929. +\scr@dte@figure@maxnumwidth=\skip62 +\c@figure=\count181 +Package tocbasic Info: babel extension for `lot' omitted +(tocbasic) because of missing \bbl@set@language on input line 6950. +\scr@dte@table@maxnumwidth=\skip63 +\c@table=\count182 +Class scrbook Info: Redefining `\numberline' on input line 7123. +\bibindent=\dimen138 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2020/08/10 v2.0s Standard LaTeX package +LaTeX Font Info: Trying to load font information for T1+lmr on input line 112 +. + +(/usr/share/texmf/tex/latex/lm/t1lmr.fd +File: t1lmr.fd 2009/10/30 v1.6 Font defs for Latin Modern +)) +(/usr/share/texlive/texmf-dist/tex/latex/fontspec/fontspec.sty +(/usr/share/texlive/texmf-dist/tex/latex/l3packages/xparse/xparse.sty +(/usr/share/texlive/texmf-dist/tex/latex/l3kernel/expl3.sty +Package: expl3 2021-01-09 L3 programming layer (loader) + +(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-luatex.def +File: l3backend-luatex.def 2020-01-29 L3 backend support: PDF output (LuaTeX) +\l__color_backend_stack_int=\count183 +\l__pdf_internal_box=\box49 +)) +Package: xparse 2020-10-27 L3 Experimental document command parser + +(/usr/share/texlive/texmf-dist/tex/latex/l3packages/xparse/xparse-generic.tex)) +Package: fontspec 2020/02/21 v2.7i Font selection for XeLaTeX and LuaLaTeX +Lua module: fontspec 2020/02/21 2.7i Font selection for XeLaTeX and LuaLaTeX (/ +usr/share/texlive/texmf-dist/tex/latex/fontspec/fontspec-luatex.sty +Package: fontspec-luatex 2020/02/21 v2.7i Font selection for XeLaTeX and LuaLaTe +X +\l__fontspec_script_int=\count184 +\l__fontspec_language_int=\count185 +\l__fontspec_strnum_int=\count186 +\l__fontspec_tmp_int=\count187 +\l__fontspec_tmpa_int=\count188 +\l__fontspec_tmpb_int=\count189 +\l__fontspec_tmpc_int=\count190 +\l__fontspec_em_int=\count191 +\l__fontspec_emdef_int=\count192 +\l__fontspec_strong_int=\count193 +\l__fontspec_strongdef_int=\count194 +\l__fontspec_tmpa_dim=\dimen139 +\l__fontspec_tmpb_dim=\dimen140 +\l__fontspec_tmpc_dim=\dimen141 + +(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2020/08/10 v2.0s Standard LaTeX package +) +(/usr/share/texlive/texmf-dist/tex/latex/fontspec/fontspec.cfg))) +(/usr/share/texlive/texmf-dist/tex/generic/babel/babel.sty +Package: babel 2021/01/26 3.53 The Babel package + +(/usr/share/texlive/texmf-dist/tex/generic/babel/babel.def +File: babel.def 2021/01/26 3.53 Babel common definitions + +(/usr/share/texlive/texmf-dist/tex/generic/babel/luababel.def +\bbl@readstream=\read2 +\l@dumylang=\language2 +Package babel Info: Non-standard hyphenation setup on input line 117. +\l@nohyphenation=\language3 +\l@finnish=\language4 +\l@latin=\language5 +\l@classiclatin=\language6 +\l@danish=\language7 +\l@kannada=\language8 +\l@ethiopic=\language9 +\l@esperanto=\language10 +\l@german=\language11 +\l@estonian=\language12 +\l@thai=\language13 +\l@ukenglish=\language14 +\l@ancientgreek=\language15 +\l@swissgerman=\language16 +\l@usenglishmax=\language17 +\l@georgian=\language18 +\l@uppersorbian=\language19 +\l@catalan=\language20 +\l@croatian=\language21 +\l@assamese=\language22 +\l@galician=\language23 +\l@french=\language24 +\l@armenian=\language25 +\l@nynorsk=\language26 +\l@belarusian=\language27 +\l@telugu=\language28 +\l@german-x-2019-04-04=\language29 +\l@slovenian=\language30 +\l@bokmal=\language31 +\l@coptic=\language32 +\l@ibycus=\language33 +\l@tamil=\language34 +\l@oriya=\language35 +\l@afrikaans=\language36 +\l@hindi=\language37 +\l@polish=\language38 +\l@italian=\language39 +\l@turkish=\language40 +\l@latvian=\language41 +\l@mongolianlmc=\language42 +\l@churchslavonic=\language43 +\l@icelandic=\language44 +\l@marathi=\language45 +\l@russian=\language46 +\l@bulgarian=\language47 +\l@ngerman=\language48 +\l@pali=\language49 +\l@piedmontese=\language50 +\l@serbian=\language51 +\l@swedish=\language52 +\l@spanish=\language53 +\l@turkmen=\language54 +\l@portuguese=\language55 +\l@farsi=\language56 +\l@ukrainian=\language57 +\l@lithuanian=\language58 +\l@bengali=\language59 +\l@sanskrit=\language60 +\l@pinyin=\language61 +\l@romanian=\language62 +\l@basque=\language63 +\l@czech=\language64 +\l@indonesian=\language65 +\l@gujarati=\language66 +\l@romansh=\language67 +\l@mongolian=\language68 +\l@macedonian=\language69 +\l@interlingua=\language70 +\l@dutch=\language71 +\l@panjabi=\language72 +\l@occitan=\language73 +\l@arabic=\language74 +\l@serbianc=\language75 +\l@monogreek=\language76 +\l@hungarian=\language77 +\l@welsh=\language78 +\l@liturgicallatin=\language79 +\l@greek=\language80 +\l@slovak=\language81 +\l@kurmanji=\language82 +\l@malayalam=\language83 +\l@ngerman-x-2019-04-04=\language84 +\l@friulan=\language85 +\l@irish=\language86 +\babelcatcodetablenum=\catcodetable12 +\bbl@pattcodes=\catcodetable13 +) +\babel@savecnt=\count195 +\U@D=\dimen142 +\l@babelnohyphens=\language87 + +(/usr/share/texlive/texmf-dist/tex/generic/babel/luababel.def +\bbl@attr@locale=\attribute4 +)) +(/usr/share/texlive/texmf-dist/tex/generic/babel-german/ngerman.ldf +Language: ngerman 2020/07/21 v2.12 German support for babel (post-1996 orthograp +hy) + +(/usr/share/texlive/texmf-dist/tex/generic/babel-german/ngermanb.ldf +Language: ngermanb 2020/07/21 v2.12 German support for babel (post-1996 orthogra +phy) +Package babel Info: Making " an active character on input line 121. + +(/usr/share/texlive/texmf-dist/tex/generic/hyph-utf8/loadhyph/loadhyph-de-1996. +tex UTF-8 German hyphenation patterns (reformed orthography) +(/usr/share/texlive/texmf-dist/tex/generic/hyph-utf8/patterns/tex/hyph-de-1996. +tex +German Hyphenation Patterns (Reformed Orthography, 2006) `dehyphn-x' 2019-04-04 + (WL)))))) (/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty +Package: color 2020/02/24 v1.2b Standard LaTeX Color (DPC) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package color Info: Driver file: luatex.def on input line 147. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/luatex.def +File: luatex.def 2020/10/05 v1.2a Graphics/color driver for luatex +)) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2020/09/09 v1.2b Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2020/08/30 v1.4c Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2016/01/03 v1.10 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: luatex.def on input line 105. +) +\Gin@req@height=\dimen143 +\Gin@req@width=\dimen144 +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/longtable.sty +Package: longtable 2020/01/07 v4.13 Multi-page Table package (DPC) +\LTleft=\skip64 +\LTright=\skip65 +\LTpre=\skip66 +\LTpost=\skip67 +\LTchunksize=\count196 +\LTcapwidth=\dimen145 +\LT@head=\box50 +\LT@firsthead=\box51 +\LT@foot=\box52 +\LT@lastfoot=\box53 +\LT@cols=\count197 +\LT@rows=\count198 +\c@LT@tables=\count199 +\c@LT@chunks=\count266 +\LT@p@ftn=\toks16 +) +Class scrbook Info: longtable captions redefined on input line 8. + +(/usr/share/texlive/texmf-dist/tex/latex/subfig/subfig.sty +Package: subfig 2005/06/28 ver: 1.3 subfig package + +(/usr/share/texlive/texmf-dist/tex/latex/caption/caption.sty +Package: caption 2020/10/26 v3.5g Customizing captions (AR) + +(/usr/share/texlive/texmf-dist/tex/latex/caption/caption3.sty +Package: caption3 2020/10/21 v2.2e caption3 kernel (AR) +\captionmargin=\dimen146 +\captionmargin@=\dimen147 +\captionwidth=\dimen148 +\caption@tempdima=\dimen149 +\caption@indent=\dimen150 +\caption@parindent=\dimen151 +\caption@hangindent=\dimen152 +Package caption Info: KOMA-Script document class detected. + +(/usr/share/texlive/texmf-dist/tex/latex/caption/caption-koma.sto +File: caption-koma.sto 2020/09/21 v2.0b Adaption of the caption package to the K +OMA-Script document classes (AR) +)) +\c@caption@flags=\count267 +\c@continuedfloat=\count268 +Package caption Info: longtable package is loaded. + +(/usr/share/texlive/texmf-dist/tex/latex/caption/ltcaption.sty +Package: ltcaption 2020/05/30 v1.4b longtable captions (AR) +)) +\c@KVtest=\count269 +\sf@farskip=\skip68 +\sf@captopadj=\dimen153 +\sf@capskip=\skip69 +\sf@nearskip=\skip70 +\c@subfigure=\count270 +\c@subfigure@save=\count271 +\c@lofdepth=\count272 +\c@subtable=\count273 +\c@subtable@save=\count274 +\c@lotdepth=\count275 +\sf@top=\skip71 +\sf@bottom=\skip72 +) +(/usr/share/texlive/texmf-dist/tex/latex/floatflt/floatflt.sty +Package: floatflt 1997/07/16 v. 1.31 +\c@OptionTest=\count276 +\figbox=\box54 +\tabbox=\box55 +\pagebox=\box56 +\ffigcount=\count277 +\ftabcount=\count278 +\fftest=\count279 +\hangcount=\count280 +\nosuccesstryfig=\count281 +\nosuccesstrytab=\count282 +\figgutter=\dimen154 +\tabgutter=\dimen155 +\htdone=\dimen156 +\pageht=\dimen157 +\startpageht=\dimen158 +\tabbredd=\dimen159 +\floatfltwidth=\dimen160 +\fltitemwidth=\dimen161 +\outputpretest=\toks17 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/epsfig.sty +Package: epsfig 2017/06/25 v1.7b (e)psfig emulation (SPQR) +\epsfxsize=\dimen162 +\epsfysize=\dimen163 +) +(/usr/share/texlive/texmf-dist/tex/latex/units/nicefrac.sty +Package: nicefrac 1998/08/04 v0.9b Nice fractions +\L@UnitsRaiseDisplaystyle=\skip73 +\L@UnitsRaiseTextstyle=\skip74 +\L@UnitsRaiseScriptstyle=\skip75 + +(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty +Package: ifthen 2014/09/29 v1.1c Standard LaTeX ifthen package (DPC) +)) +(/usr/share/texlive/texmf-dist/tex/latex/units/units.sty +Package: units 1998/08/04 v0.9b Typesetting units +) +(/usr/share/texlive/texmf-dist/tex/latex/keystroke/keystroke.sty +Package: keystroke 2010/04/23 v1.6 3D keystrokes (SuSE GmbH/RN) +\suse@key=\box57 +\keystroke@left=\box58 +\keystroke@right=\box59 +\keystroke@middle=\box60 + +File: keystroke_left.pdf Graphic file (type pdf) + +Package luatex.def Info: keystroke_left.pdf used on input line 171. +(luatex.def) Requested size: 42.15738pt x 195.73076pt. + +File: keystroke_middle.pdf Graphic file (type pdf) + +Package luatex.def Info: keystroke_middle.pdf used on input line 172. +(luatex.def) Requested size: 116.43471pt x 195.73076pt. + +File: keystroke_right.pdf Graphic file (type pdf) + +Package luatex.def Info: keystroke_right.pdf used on input line 173. +(luatex.def) Requested size: 42.15738pt x 195.73076pt. +) +(/usr/share/texlive/texmf-dist/tex/latex/pstricks/pstricks.sty +Package: pstricks 2020/06/11 v0.70 LaTeX wrapper for `PSTricks' (RN,HV) + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +) +(/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2016/05/11 v2.12 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: luatex.def on input line 225. +LaTeX Info: Redefining \color on input line 709. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1348. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1352. +Package xcolor Info: Model `RGB' extended on input line 1364. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1366. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1367. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1368. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1369. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1370. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1371. +) +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/pst-xkey.tex +File: pst-xkey.tex 2005/11/25 v1.6 PSTricks specialization of xkeyval (HA) + +(/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2020/11/20 v2.8 package option processing (HA) + +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks18 +\XKV@tempa@toks=\toks19 +) +\XKV@depth=\count283 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +))) +(/usr/share/texlive/texmf-dist/tex/generic/pstricks/pstricks.tex +(/usr/share/texlive/texmf-dist/tex/generic/pstricks/pst-fp.tex +`pst-fp' v0.05, 2010/01/17 (hv) +\pstFP@xs=\count284 +\pstFP@xia=\count285 +\pstFP@xib=\count286 +\pstFP@xfa=\count287 +\pstFP@xfb=\count288 +\pstFP@rega=\count289 +\pstFP@regb=\count290 +\pstFP@regs=\count291 +\pstFP@times=\count292 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks20 +\pgfutil@tempdima=\dimen164 +\pgfutil@tempdimb=\dimen165 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t +ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks21 +\pgfkeys@temptoks=\toks22 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t +ex +\pgfkeys@tmptoks=\toks23 +)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Loading pgffor.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex +\pgf@x=\dimen166 +\pgf@xa=\dimen167 +\pgf@xb=\dimen168 +\pgf@xc=\dimen169 +\pgf@y=\dimen170 +\pgf@ya=\dimen171 +\pgf@yb=\dimen172 +\pgf@yc=\dimen173 +\c@pgf@counta=\count293 +\c@pgf@countb=\count294 +\c@pgf@countc=\count295 +\c@pgf@countd=\count296 +\pgfutil@tempcnta=\count297 +\pgfutil@tempcntb=\count298 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen174 +\pgfmath@count=\count299 +\pgfmath@box=\box61 +\pgfmath@toks=\toks24 +\pgfmath@stack@operand=\toks25 +\pgfmath@stack@operation=\toks26 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet +ric.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod +e.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison +.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari +thmetics.code.tex))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count300 +)) +\pgffor@iter=\dimen175 +\pgffor@skip=\dimen176 +\pgffor@stack=\toks27 +\pgffor@toks=\toks28 +) +\psLoopIndex=\count301 + +`PSTricks' v3.01 <2020/09/18> (tvz,hv) +\pst@dima=\dimen177 +\pst@dimb=\dimen178 +\pst@dimc=\dimen179 +\pst@dimd=\dimen180 +\pst@dimg=\dimen181 +\pst@dimh=\dimen182 +\pst@dimm=\dimen183 +\pst@dimn=\dimen184 +\pst@dimo=\dimen185 +\pst@dimp=\dimen186 +\pst@hbox=\box62 +\pst@ibox=\box63 +\pst@boxg=\box64 +\pst@cnta=\count302 +\pst@cntb=\count303 +\pst@cntc=\count304 +\pst@cntd=\count305 +\pst@cntg=\count306 +\pst@cnth=\count307 +\pst@cntm=\count308 +\pst@cntn=\count309 +\pst@cnto=\count310 +\pst@cntp=\count311 +\@zero=\count312 +\pst@toks=\toks29 +(/usr/share/texlive/texmf-dist/tex/generic/pstricks/pstricks.con) +\psunit=\dimen187 +\psxunit=\dimen188 +\psyunit=\dimen189 +\pst@C@@rType=\count313 +\pslinewidth=\dimen190 +\psk@startLW=\dimen191 +\psk@endLW=\dimen192 +\pst@customdefs=\toks30 +\pslinearc=\dimen193 +\pst@symbolStep=\dimen194 +\pst@symbolWidth=\dimen195 +\pst@symbolLinewidth=\dimen196 +\everypsbox=\toks31 +\psframesep=\dimen197 +\pslabelsep=\dimen198 +\sh@wgridXunit=\dimen199 +\sh@wgridYunit=\dimen256 +\pst@shift=\dimen257 +) +File: pstricks.tex 2020/09/18 v3.01 `PSTricks' (tvz,hv) + +(/usr/share/texlive/texmf-dist/tex/generic/pstricks/pst-fp.tex) +File: pst-fp.tex 2020/09/18 v3.01 `PST-fp' (hv) +) +(/usr/share/texlive/texmf-dist/tex/latex/pst-node/pst-node.sty +Package: pst-node 2012/09/18 v1.01 LaTeX wrapper for `pst-node' (HV) +Package: pst-node 2010/04/22 package wrapper for pst-node.tex + +(/usr/share/texlive/texmf-dist/tex/generic/pst-node/pst-node.tex + v1.42a, 2020/04/01 +\psrow=\count314 +\pscol=\count315 +\psmatrixcnt=\count316 +\psrowsep=\skip76 +\pscolsep=\skip77 +\pst@args=\count317 +\num@pts=\count318 +\pst@argcnt=\count319 +) +File: pst-node.tex 2020/04/01 1.42a `pst-node' (tvz,hv) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/rotating.sty +Package: rotating 2016/08/11 v2.16d rotated objects in LaTeX +\c@r@tfl@t=\count320 +\rotFPtop=\skip78 +\rotFPbot=\skip79 +\rot@float@box=\box65 +\rot@mess@toks=\toks32 +) +(/usr/share/texlive/texmf-dist/tex/latex/bbding/bbding.sty +Package: bbding 1999/04/15 v1.01 Dingbats symbols +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks33 +\pgfutil@tempdima=\dimen258 +\pgfutil@tempdimb=\dimen259 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t +ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box66 +) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2020/12/27 v3.1.8b (3.1.8b) +)) +Package: pgf 2020/12/27 v3.1.8b (3.1.8b) + +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2020/12/27 v3.1.8b (3.1.8b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex) +\pgf@x=\dimen260 +\pgf@y=\dimen261 +\pgf@xa=\dimen262 +\pgf@ya=\dimen263 +\pgf@xb=\dimen264 +\pgf@yb=\dimen265 +\pgf@xc=\dimen266 +\pgf@yc=\dimen267 +\pgf@xd=\dimen268 +\pgf@yd=\dimen269 +\w@pgf@writea=\write3 +\r@pgf@reada=\read3 +\c@pgf@counta=\count321 +\c@pgf@countb=\count322 +\c@pgf@countc=\count323 +\c@pgf@countd=\count324 +\t@pgf@toka=\toks34 +\t@pgf@tokb=\toks35 +\t@pgf@tokc=\toks36 +\pgf@sys@id@count=\count325 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2020/12/27 v3.1.8b (3.1.8b) +) +Driver file for pgf: pgfsys-luatex.def + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-luatex.def +File: pgfsys-luatex.def 2020/12/27 v3.1.8b (3.1.8b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de +f +File: pgfsys-common-pdf.def 2020/12/27 v3.1.8b (3.1.8b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code. +tex +File: pgfsyssoftpath.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgfsyssoftpath@smallbuffer@items=\count326 +\pgfsyssoftpath@bigbuffer@items=\count327 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code. +tex +File: pgfsysprotocol.code.tex 2020/12/27 v3.1.8b (3.1.8b) +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2020/12/27 v3.1.8b (3.1.8b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te +x +File: pgfcorepoints.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgf@picminx=\dimen270 +\pgf@picmaxx=\dimen271 +\pgf@picminy=\dimen272 +\pgf@picmaxy=\dimen273 +\pgf@pathminx=\dimen274 +\pgf@pathmaxx=\dimen275 +\pgf@pathminy=\dimen276 +\pgf@pathmaxy=\dimen277 +\pgf@xx=\dimen278 +\pgf@xy=\dimen279 +\pgf@yx=\dimen280 +\pgf@yy=\dimen281 +\pgf@zx=\dimen282 +\pgf@zy=\dimen283 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct. +code.tex +File: pgfcorepathconstruct.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgf@path@lastx=\dimen284 +\pgf@path@lasty=\dimen285 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code +.tex +File: pgfcorepathusage.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgf@shorten@end@additional=\dimen286 +\pgf@shorten@start@additional=\dimen287 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te +x +File: pgfcorescopes.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgfpic=\box67 +\pgf@hbox=\box68 +\pgf@layerbox@main=\box69 +\pgf@picture@serial@count=\count328 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c +ode.tex +File: pgfcoregraphicstate.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgflinewidth=\dimen288 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation +s.code.tex +File: pgfcoretransformations.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgf@pt@x=\dimen289 +\pgf@pt@y=\dimen290 +\pgf@pt@temp=\dimen291 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2020/12/27 v3.1.8b (3.1.8b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t +ex +File: pgfcoreobjects.code.tex 2020/12/27 v3.1.8b (3.1.8b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing +.code.tex +File: pgfcorepathprocessing.code.tex 2020/12/27 v3.1.8b (3.1.8b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te +x +File: pgfcorearrows.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgfarrowsep=\dimen292 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgf@max=\dimen293 +\pgf@sys@shading@range@num=\count329 +\pgf@shadingcount=\count330 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2020/12/27 v3.1.8b (3.1.8b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code. +tex +File: pgfcoreexternal.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgfexternal@startupbox=\box70 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te +x +File: pgfcorelayers.code.tex 2020/12/27 v3.1.8b (3.1.8b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c +ode.tex +File: pgfcoretransparency.code.tex 2020/12/27 v3.1.8b (3.1.8b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code. +tex +File: pgfcorepatterns.code.tex 2020/12/27 v3.1.8b (3.1.8b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2020/12/27 v3.1.8b (3.1.8b) +))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgfnodeparttextbox=\box71 +) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2020/12/27 v3.1.8b (3.1.8b) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65 +.sty +Package: pgfcomp-version-0-65 2020/12/27 v3.1.8b (3.1.8b) +\pgf@nodesepstart=\dimen294 +\pgf@nodesepend=\dimen295 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18 +.sty +Package: pgfcomp-version-1-18 2020/12/27 v3.1.8b (3.1.8b) +)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2020/12/27 v3.1.8b (3.1.8b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex) +\pgffor@iter=\dimen296 +\pgffor@skip=\dimen297 +\pgffor@stack=\toks37 +\pgffor@toks=\toks38 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +Package: tikz 2020/12/27 v3.1.8b (3.1.8b) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers +.code.tex +File: pgflibraryplothandlers.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgf@plot@mark@count=\count331 +\pgfplotmarksize=\dimen298 +) +\tikz@lastx=\dimen299 +\tikz@lasty=\dimen300 +\tikz@lastxsaved=\dimen301 +\tikz@lastysaved=\dimen302 +\tikz@lastmovetox=\dimen303 +\tikz@lastmovetoy=\dimen304 +\tikzleveldistance=\dimen305 +\tikzsiblingdistance=\dimen306 +\tikz@figbox=\box72 +\tikz@figbox@bg=\box73 +\tikz@tempbox=\box74 +\tikz@tempbox@bg=\box75 +\tikztreelevel=\count332 +\tikznumberofchildren=\count333 +\tikznumberofcurrentchild=\count334 +\tikz@fig@count=\count335 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex +File: pgfmodulematrix.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgfmatrixcurrentrow=\count336 +\pgfmatrixcurrentcolumn=\count337 +\pgf@matrix@numberofcolumns=\count338 +) +\tikz@expandcount=\count339 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarytopaths.code.tex +File: tikzlibrarytopaths.code.tex 2020/12/27 v3.1.8b (3.1.8b) +))) +(/usr/share/texlive/texmf-dist/tex/latex/tikz-timing/tikz-timing.sty +Package: tikz-timing 2017/12/20 v0.7f Digital Timing Diagrams using TikZ + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarycalc.code.tex +File: tikzlibrarycalc.code.tex 2020/12/27 v3.1.8b (3.1.8b) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarybackgrounds.code.tex +File: tikzlibrarybackgrounds.code.tex 2020/12/27 v3.1.8b (3.1.8b) +\pgf@layerbox@background=\box76 +\pgf@layerboxsaved@background=\box77 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarydecorations.pathmorphing.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarydecorations.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduledecorations.cod +e.tex +\pgfdecoratedcompleteddistance=\dimen307 +\pgfdecoratedremainingdistance=\dimen308 +\pgfdecoratedinputsegmentcompleteddistance=\dimen309 +\pgfdecoratedinputsegmentremainingdistance=\dimen310 +\pgf@decorate@distancetomove=\dimen311 +\pgf@decorate@repeatstate=\count340 +\pgfdecorationsegmentamplitude=\dimen312 +\pgfdecorationsegmentlength=\dimen313 +) +\tikz@lib@dec@box=\box78 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/decorations/pgflibrary +decorations.pathmorphing.code.tex)) +(/usr/share/texlive/texmf-dist/tex/latex/environ/environ.sty +Package: environ 2014/05/04 v0.3 A new way to define environments + +(/usr/share/texlive/texmf-dist/tex/latex/trimspaces/trimspaces.sty +Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list +) +\@envbody=\toks39 +) +\tikztiming@numint=\count341 +\tikztiming@numfrac=\count342 +\tikztiming@xunit=\skip80 +\tikztiming@yunit=\skip81 +\tikztiming@debug=\count343 +\c@tikztiming@nrows=\count344 +\c@tikztimingrows=\count345 +\c@tikztimingtrans=\count346 +\c@tikztimingtranspos=\count347 +) +(/usr/share/texlive/texmf-dist/tex/latex/ccicons/ccicons.sty +Package: ccicons 2017/10/30 v1.6 LaTeX support for Creative Commons icons +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2020/09/23 v2.17i AMS math features +\@mathmargin=\skip82 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 AMS text + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 generic functions +\@emptytoks=\toks40 +\ex@=\dimen314 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d Bold Symbols +\pmbraise@=\dimen315 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 2016/03/08 v2.02 operator names +) +\inf@bad=\count348 +LaTeX Info: Redefining \frac on input line 236. +\uproot@=\count349 +\leftroot@=\count350 +LaTeX Info: Redefining \overline on input line 399. +\classnum@=\count351 +\DOTSCASE@=\count352 +LaTeX Info: Redefining \ldots on input line 496. +LaTeX Info: Redefining \dots on input line 499. +LaTeX Info: Redefining \cdots on input line 620. +\Mathstrutbox@=\box79 +\strutbox@=\box80 +\big@size=\dimen316 +LaTeX Font Info: Redeclaring font encoding OML on input line 743. +LaTeX Font Info: Redeclaring font encoding OMS on input line 744. +\macc@depth=\count353 +\c@MaxMatrixCols=\count354 +\dotsspace@=\muskip16 +\c@parentequation=\count355 +\dspbrk@lvl=\count356 +\tag@help=\toks41 +\row@=\count357 +\column@=\count358 +\maxfields@=\count359 +\andhelp@=\toks42 +\eqnshift@=\dimen317 +\alignsep@=\dimen318 +\tagshift@=\dimen319 +\tagwidth@=\dimen320 +\totwidth@=\dimen321 +\lineht@=\dimen322 +\@envbody=\toks43 +\multlinegap=\skip83 +\multlinetaggap=\skip84 +\mathdisplay@stack=\toks44 +LaTeX Info: Redefining \[ on input line 2923. +LaTeX Info: Redefining \] on input line 2924. +) +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Redeclaring math symbol \hbar on input line 98. +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/unicode-math/unicode-math.sty +Package: unicode-math 2020/01/31 v0.8q Unicode maths in XeLaTeX and LuaLaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/unicode-math/unicode-math-luatex.sty +Package: unicode-math-luatex 2020/01/31 v0.8q Unicode maths in XeLaTeX and LuaLa +TeX + +(/usr/share/texlive/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty +Package: l3keys2e 2020-10-27 LaTeX2e option processing using LaTeX3 keys +) +(/usr/share/texlive/texmf-dist/tex/latex/base/fix-cm.sty +Package: fix-cm 2015/01/14 v1.1t fixes to LaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def +File: ts1enc.def 2001/06/05 v3.0e (jk/car/fm) Standard LaTeX file +LaTeX Font Info: Redeclaring font encoding TS1 on input line 47. +)) +(/usr/share/texlive/texmf-dist/tex/lualatex/lualatex-math/lualatex-math.sty +Package: lualatex-math 2020/09/25 v1.9 Patches for mathematics typesetting with +LuaLaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count360 +) +Lua module: lualatex-math 2013/08/03 1.3 Patches for mathematics typesetting wit +h LuaLaTeX) +\g__um_fam_int=\count361 +\g__um_fonts_used_int=\count362 +\l__um_primecount_int=\count363 +\g__um_primekern_muskip=\muskip17 + +(/usr/share/texlive/texmf-dist/tex/latex/unicode-math/unicode-math-table.tex))) (/usr/share/texlive/texmf-dist/tex/latex/polyglossia/polyglossia.sty +Package: polyglossia 2020/12/08 v1.51 Modern multilingual typesetting with XeLaT +eX and LuaLaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/makecmds/makecmds.sty +Package: makecmds 2009/09/03 v1.0a extra command making commands +) +(/usr/share/texlive/texmf-dist/tex/luatex/luatexbase/luatexbase.sty +Package: luatexbase 2015/10/04 v1.3 luatexbase interface to LuaTeX + +(/usr/share/texlive/texmf-dist/tex/luatex/ctablestack/ctablestack.sty +Package: ctablestack 2015/10/01 v1.0 Catcode table stable support +\@catcodetablestackcnt=\count364 +) +\CatcodeTableOther=\catcodetable14 +\CatcodeTableExpl=\catcodetable15 +) +Lua module: polyglossia 2013/05/11 1.3 Polyglossia +(/usr/share/texlive/texmf-dist/tex/latex/polyglossia/gloss-latex.ldf +File: gloss-latex.ldf polyglossia: module for default language +The property list \polyglossia@langsetup contains the pairs (without outer +braces): +> {latex/script} => {latin} +> {latex/lcscript} => {latin} +> {latex/scripttag} => {} +> {latex/language} => {Latex} +> {latex/langtag} => {ENG} +> {latex/bcp47} => {} +> {latex/hyphennames} => {english} +> {latex/direction} => {LR} +> {latex/hyphenmins} => {2,3} +> {latex/frenchspacing} => {false} +> {latex/indentfirst} => {false} +> {latex/fontsetup} => {true} +> {latex/envname} => {latex} +> {latex/babelname} => {latex} +> {latex/localnumeral} => {polyglossia@C@localnumeral} +> {latex/Localnumeral} => {polyglossia@C@localnumeral}. +) +Package polyglossia Info: Default language is latex. +Package polyglossia Info: Setting LuaTeX font renderer to Harfbuzz. +) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2020-05-15 v7.00e Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty +Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO) + + +(/usr/share/texlive/texmf-dist/tex/generic/infwarerr/infwarerr.sty +Package: infwarerr 2019/12/03 v1.5 Providing info/warning/error messages (HO) +) +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +\pdftexcmds@toks=\toks45 +) +(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty +Package: kvdefinekeys 2019-12-19 v1.6 Define keys (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/pdfescape/pdfescape.sty +Package: pdfescape 2019/12/09 v1.15 Implements pdfTeX's escape features (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/hycolor/hycolor.sty +Package: hycolor 2020-01-27 v1.10 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty +Package: letltxmacro 2019/12/03 v1.6 Let assignment for LaTeX macros (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/auxhook/auxhook.sty +Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) +) +\@linkdim=\dimen323 +\Hy@linkcounter=\count365 +\Hy@pagecounter=\count366 + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2020-05-15 v7.00e Hyperref: PDFDocEncoding definition (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/intcalc/intcalc.sty +Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/etexcmds/etexcmds.sty +Package: etexcmds 2019/12/15 v1.7 Avoid name clashes with e-TeX commands (HO) +) +\Hy@SavedSpaceFactor=\count367 +Package hyperref Info: Option `colorlinks' set `true' on input line 4338. +Package hyperref Info: Hyper figures OFF on input line 4464. +Package hyperref Info: Link nesting OFF on input line 4469. +Package hyperref Info: Hyper index ON on input line 4472. +Package hyperref Info: Plain pages OFF on input line 4479. +Package hyperref Info: Backreferencing OFF on input line 4484. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4717. +\c@Hy@tempcnt=\count368 + +(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip18 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +LaTeX Info: Redefining \url on input line 5076. +\XeTeXLinkMargin=\dimen324 + +(/usr/share/texlive/texmf-dist/tex/generic/bitset/bitset.sty +Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty +Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO) + +)) +\Fld@menulength=\count369 +\Field@Width=\dimen325 +\Fld@charsize=\dimen326 +Package hyperref Info: Hyper figures OFF on input line 6347. +Package hyperref Info: Link nesting OFF on input line 6352. +Package hyperref Info: Hyper index ON on input line 6355. +Package hyperref Info: backreferencing OFF on input line 6362. +Package hyperref Info: Link coloring ON on input line 6365. +Package hyperref Info: Link coloring with OCG OFF on input line 6372. +Package hyperref Info: PDF/A mode OFF on input line 6377. +LaTeX Info: Redefining \ref on input line 6417. +LaTeX Info: Redefining \pageref on input line 6421. + +(/usr/share/texlive/texmf-dist/tex/latex/base/atbegshi-ltx.sty +Package: atbegshi-ltx 2020/08/17 v1.0a Emulation of the original atbegshi packag +e +with kernel methods +) +\Hy@abspage=\count370 +\c@Item=\count371 +\c@Hfootnote=\count372 +) +Package hyperref Info: Driver (autodetected): hluatex. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hluatex.def +File: hluatex.def 2020-05-15 v7.00e Hyperref driver for luaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/puenc.def +File: puenc.def 2020-05-15 v7.00e Hyperref: PDF Unicode definition (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/stringenc/stringenc.sty +Package: stringenc 2019/11/29 v1.12 Convert strings between diff. encodings (HO) + +) +(/usr/share/texlive/texmf-dist/tex/latex/base/atveryend-ltx.sty +Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atvery package + +with kernel methods +) +\Fld@listcount=\count373 +\c@bookmark@seq@number=\count374 + +(/usr/share/texlive/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty +Package: rerunfilecheck 2019/12/05 v1.9 Rerun checks for auxiliary files (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty +Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO) +) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 28 +6. +) +\Hy@SectionHShift=\skip85 +) +luaotfload | cache : Lookup cache loaded from /home/tom/.texlive2020/texmf-var/l +uatex-cache/generic/names/luaotfload-lookup-cache.luc. +luaotfload | db : Reload initiated (formats: otf,ttf,ttc); reason: Font "DejaVuS +ansMNerdFont-Regular" not found. + +Package fontspec Info: Could not resolve font "DejaVuSansMNerdFont-Regular/BI" +(fontspec) (it probably doesn't exist). + + +Package fontspec Info: Could not resolve font "DejaVuSansMNerdFont-Regular/B" +(fontspec) (it probably doesn't exist). + + +Package fontspec Info: Could not resolve font "DejaVuSansMNerdFont-Regular/I" +(fontspec) (it probably doesn't exist). + + +Package fontspec Info: Font family 'DejaVuSansMNerdFont-Regular(0)' created +(fontspec) for font 'DejaVuSansMNerdFont-Regular' with options +(fontspec) [Renderer=Harfbuzz,Ligatures=TeX]. +(fontspec) +(fontspec) This font family consists of the following NFSS +(fontspec) series/shapes: +(fontspec) +(fontspec) - 'normal' (m/n) with NFSS spec.: +(fontspec) <->"DejaVuSansMNerdFont-Regular:mode=harf;script=latn;lan +guage=dflt;+tlig;" +(fontspec) - 'small caps' (m/sc) with NFSS spec.: + + +Package fontspec Info: Could not resolve font "DejaVuSansMNerdFont-Regular/BI" +(fontspec) (it probably doesn't exist). + + +Package fontspec Info: Could not resolve font "DejaVuSansMNerdFont-Regular/B" +(fontspec) (it probably doesn't exist). + + +Package fontspec Info: Could not resolve font "DejaVuSansMNerdFont-Regular/I" +(fontspec) (it probably doesn't exist). + +luaotfload | aux : font no 33 (nil) does not define feature smcp for script latn + with language dflt + +Package fontspec Info: Font family 'DejaVuSansMNerdFont-Regular(1)' created +(fontspec) for font 'DejaVuSansMNerdFont-Regular' with options +(fontspec) [Renderer=Harfbuzz,Renderer=Basic]. +(fontspec) +(fontspec) This font family consists of the following NFSS +(fontspec) series/shapes: +(fontspec) +(fontspec) - 'normal' (m/n) with NFSS spec.: +(fontspec) <->"DejaVuSansMNerdFont-Regular:mode=base;script=latn;lan +guage=dflt;" +(fontspec) - 'small caps' (m/sc) with NFSS spec.: + +LaTeX Font Info: Overwriting math alphabet `\mathrm' in version `normal' +(Font) OT1/cmr/m/n --> TU/DejaVuSansMNerdFont-Regular(1)/m/n on + input line 45. +LaTeX Font Info: Overwriting math alphabet `\mathit' in version `normal' +(Font) OT1/cmr/m/it --> TU/DejaVuSansMNerdFont-Regular(1)/m/it +on input line 45. +LaTeX Font Info: Overwriting math alphabet `\mathbf' in version `normal' +(Font) OT1/cmr/bx/n --> TU/DejaVuSansMNerdFont-Regular(1)/b/n o +n input line 45. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `normal' +(Font) OT1/cmss/m/n --> TU/DejaVuSansMNerdFont-Regular(1)/m/n o +n input line 47. +LaTeX Font Info: Overwriting math alphabet `\mathsf' in version `bold' +(Font) OT1/cmss/bx/n --> TU/DejaVuSansMNerdFont-Regular(1)/b/n +on input line 47. + +Package fontspec Info: Could not resolve font +(fontspec) "CaskaydiaCoveNerdFont-Regular/BI" (it probably doesn't +(fontspec) exist). + + +Package fontspec Info: Could not resolve font +(fontspec) "CaskaydiaCoveNerdFont-Regular/B" (it probably doesn't +(fontspec) exist). + + +Package fontspec Info: Could not resolve font +(fontspec) "CaskaydiaCoveNerdFont-Regular/I" (it probably doesn't +(fontspec) exist). + + +Package fontspec Info: Font family 'CaskaydiaCoveNerdFont-Regular(0)' created +(fontspec) for font 'CaskaydiaCoveNerdFont-Regular' with options +(fontspec) [Renderer=Harfbuzz,WordSpace={1,0,0},HyphenChar=None,Punc +tuationSpace=WordSpace]. +(fontspec) +(fontspec) This font family consists of the following NFSS +(fontspec) series/shapes: +(fontspec) +(fontspec) - 'normal' (m/n) with NFSS spec.: +(fontspec) <->"CaskaydiaCoveNerdFont-Regular:mode=harf;script=latn;l +anguage=dflt;" +(fontspec) - 'small caps' (m/sc) with NFSS spec.: +(fontspec) and font adjustment code: +(fontspec) \fontdimen 2\font =1\fontdimen 2\font \fontdimen 3\font +(fontspec) =0\fontdimen 3\font \fontdimen 4\font =0\fontdimen +(fontspec) 4\font \fontdimen 7\font =0\fontdimen 2\font +(fontspec) \tex_hyphenchar:D \font =-1\scan_stop: + + +Package fontspec Info: Could not resolve font +(fontspec) "CaskaydiaCoveNerdFont-Regular/BI" (it probably doesn't +(fontspec) exist). + + +Package fontspec Info: Could not resolve font +(fontspec) "CaskaydiaCoveNerdFont-Regular/B" (it probably doesn't +(fontspec) exist). + + +Package fontspec Info: Could not resolve font +(fontspec) "CaskaydiaCoveNerdFont-Regular/I" (it probably doesn't +(fontspec) exist). + +luaotfload | aux : font no 42 (nil) does not define feature smcp for script latn + with language dflt + +Package fontspec Info: Font family 'CaskaydiaCoveNerdFont-Regular(1)' created +(fontspec) for font 'CaskaydiaCoveNerdFont-Regular' with options +(fontspec) [Renderer=Harfbuzz,Renderer=Basic]. +(fontspec) +(fontspec) This font family consists of the following NFSS +(fontspec) series/shapes: +(fontspec) +(fontspec) - 'normal' (m/n) with NFSS spec.: +(fontspec) <->"CaskaydiaCoveNerdFont-Regular:mode=base;script=latn;l +anguage=dflt;" +(fontspec) - 'small caps' (m/sc) with NFSS spec.: + +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `normal' +(Font) OT1/cmtt/m/n --> TU/CaskaydiaCoveNerdFont-Regular(1)/m/n + on input line 48. +LaTeX Font Info: Overwriting math alphabet `\mathtt' in version `bold' +(Font) OT1/cmtt/m/n --> TU/CaskaydiaCoveNerdFont-Regular(1)/b/n + on input line 48. + +("./Dokumentation BJ-Keyer.aux" +LaTeX Info: Redefining \rmfamily on input line 24. +LaTeX Info: Redefining \sffamily on input line 24. +LaTeX Info: Redefining \ttfamily on input line 24. +LaTeX Info: Redefining \rmfamily on input line 28. +LaTeX Info: Redefining \sffamily on input line 28. +LaTeX Info: Redefining \ttfamily on input line 28. +) +\openout1 = Dokumentation BJ-Keyer.aux + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 53. +LaTeX Font Info: ... okay on input line 53. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 53. +LaTeX Font Info: ... okay on input line 53. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 53. +LaTeX Font Info: ... okay on input line 53. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 53. +LaTeX Font Info: ... okay on input line 53. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 53. +LaTeX Font Info: ... okay on input line 53. +LaTeX Font Info: Checking defaults for TU/lmr/m/n on input line 53. +LaTeX Font Info: ... okay on input line 53. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 53. +LaTeX Font Info: ... okay on input line 53. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 53. +LaTeX Font Info: ... okay on input line 53. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 53. +LaTeX Font Info: ... okay on input line 53. +LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 53. +LaTeX Font Info: ... okay on input line 53. +LaTeX Info: Redefining \rmfamily on input line 53. +LaTeX Info: Redefining \sffamily on input line 53. +LaTeX Info: Redefining \ttfamily on input line 53. + +(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count375 +\scratchdimen=\dimen327 +\scratchbox=\box81 +\nofMPsegments=\count376 +\nofMParguments=\count377 +\everyMPshowfont=\toks46 +\MPscratchCnt=\count378 +\MPscratchDim=\dimen328 +\MPnumerator=\count379 +\makeMPintoPDFobject=\count380 +\everyMPtoPDFconversion=\toks47 +) (/usr/share/texlive/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty +Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf +Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 48 +5. + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg +File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Live + +)) +Package caption Info: Begin \AtBeginDocument code. +Package caption Info: subfig package v1.3 is loaded. +Package caption Info: floatflt package is loaded. +Package caption Info: hyperref package is loaded. +Package caption Info: rotating package is loaded. +Package caption Info: End \AtBeginDocument code. + +Package fontspec Info: Font family 'latinmodern-math.otf(0)' created for font +(fontspec) 'latinmodern-math.otf' with options +(fontspec) [Renderer=Harfbuzz,Renderer=Basic,BoldItalicFont={},Itali +cFont={},SmallCapsFont={},Script=Math,FontAdjustment={\__um_luatex_copy_fontdime +ns: +(fontspec) },BoldFont={latinmodern-math.otf}]. +(fontspec) +(fontspec) This font family consists of the following NFSS +(fontspec) series/shapes: +(fontspec) +(fontspec) - 'normal' (m/n) with NFSS spec.: +(fontspec) <->"[latinmodern-math.otf]:mode=base;script=math;language +=dflt;" +(fontspec) - 'small caps' (m/sc) with NFSS spec.: +(fontspec) and font adjustment code: +(fontspec) \__um_luatex_copy_fontdimens: +(fontspec) - 'bold' (b/n) with NFSS spec.: +(fontspec) <->"[latinmodern-math.otf]:mode=base;script=math;language +=dflt;" +(fontspec) - 'bold small caps' (b/sc) with NFSS spec.: +(fontspec) and font adjustment code: +(fontspec) \__um_luatex_copy_fontdimens: + + +Package fontspec Info: Font family 'latinmodern-math.otf(1)' created for font +(fontspec) 'latinmodern-math.otf' with options +(fontspec) [Renderer=Harfbuzz,Renderer=Basic,BoldItalicFont={},Itali +cFont={},SmallCapsFont={},Script=Math,SizeFeatures={{Size=8.5-},{Size=6-8.5,Font +=latinmodern-math.otf,Style=MathScript},{Size=-6,Font=latinmodern-math.otf,Style +=MathScriptScript}},FontAdjustment={\__um_luatex_copy_fontdimens: +(fontspec) },BoldFont={latinmodern-math.otf}]. +(fontspec) +(fontspec) This font family consists of the following NFSS +(fontspec) series/shapes: +(fontspec) +(fontspec) - 'normal' (m/n) with NFSS spec.: +(fontspec) <8.5->"[latinmodern-math.otf]:mode=base;script=math;langu +age=dflt;"<6-8.5>"[latinmodern-math.otf]:mode=base;script=math;language=dflt;+ss +ty=0;"<-6>"[latinmodern-math.otf]:mode=base;script=math;language=dflt;+ssty=1;" +(fontspec) - 'small caps' (m/sc) with NFSS spec.: +(fontspec) and font adjustment code: +(fontspec) \__um_luatex_copy_fontdimens: +(fontspec) - 'bold' (b/n) with NFSS spec.: +(fontspec) <->"[latinmodern-math.otf]:mode=base;script=math;language +=dflt;" +(fontspec) - 'bold small caps' (b/sc) with NFSS spec.: +(fontspec) and font adjustment code: +(fontspec) \__um_luatex_copy_fontdimens: + +LaTeX Font Info: Encoding `OT1' has changed to `TU' for symbol font +(Font) `operators' in the math version `normal' on input line 53. +LaTeX Font Info: Overwriting symbol font `operators' in version `normal' +(Font) OT1/cmr/m/n --> TU/latinmodern-math.otf(1)/m/n on input +line 53. +LaTeX Font Info: Encoding `OT1' has changed to `TU' for symbol font +(Font) `operators' in the math version `bold' on input line 53. +LaTeX Font Info: Overwriting symbol font `operators' in version `bold' +(Font) OT1/cmr/bx/n --> TU/latinmodern-math.otf(1)/b/n on input + line 53. + +Package fontspec Info: latinmodern-math scale = 1.0001. + + +Package fontspec Info: latinmodern-math scale = 1.0001. + + +Package fontspec Info: latinmodern-math scale = 1.0001. + + +Package fontspec Info: latinmodern-math scale = 1.0001. + + +Package fontspec Info: latinmodern-math scale = 1.0001. + + +Package fontspec Info: Font family 'latinmodern-math.otf(2)' created for font +(fontspec) 'latinmodern-math.otf' with options +(fontspec) [Renderer=Harfbuzz,Renderer=Basic,BoldItalicFont={},Itali +cFont={},SmallCapsFont={},Script=Math,SizeFeatures={{Size=8.5-},{Size=6-8.5,Font +=latinmodern-math.otf,Style=MathScript},{Size=-6,Font=latinmodern-math.otf,Style +=MathScriptScript}},FontAdjustment={\__um_luatex_copy_fontdimens: +(fontspec) },BoldFont={latinmodern-math.otf},ScaleAgain=1.0001,FontA +djustment={\fontdimen +(fontspec) 8\font =6.76999pt\relax \fontdimen 9\font +(fontspec) =3.93999pt\relax \fontdimen 10\font =4.43999pt\relax +(fontspec) \fontdimen 11\font =6.85999pt\relax \fontdimen 12\font +(fontspec) =3.45pt\relax \fontdimen 13\font =3.62999pt\relax +(fontspec) \fontdimen 14\font =3.62999pt\relax \fontdimen 15\font +(fontspec) =2.89pt\relax \fontdimen 16\font =2.46999pt\relax +(fontspec) \fontdimen 17\font =2.46999pt\relax \fontdimen 18\font +(fontspec) =2.5pt\relax \fontdimen 19\font =2.0pt\relax \fontdimen +(fontspec) 22\font =2.5pt\relax \fontdimen 20\font =0pt\relax +(fontspec) \fontdimen 21\font =0pt\relax }]. +(fontspec) +(fontspec) This font family consists of the following NFSS +(fontspec) series/shapes: +(fontspec) +(fontspec) - 'normal' (m/n) with NFSS spec.: +(fontspec) <8.5->s*[1.0001]"[latinmodern-math.otf]:mode=base;script= +math;language=dflt;"<6-8.5>s*[1.0001]"[latinmodern-math.otf]:mode=base;script=ma +th;language=dflt;+ssty=0;"<-6>s*[1.0001]"[latinmodern-math.otf]:mode=base;script +=math;language=dflt;+ssty=1;" +(fontspec) - 'small caps' (m/sc) with NFSS spec.: +(fontspec) and font adjustment code: +(fontspec) \__um_luatex_copy_fontdimens: \fontdimen 8\font +(fontspec) =6.76999pt\relax \fontdimen 9\font =3.93999pt\relax +(fontspec) \fontdimen 10\font =4.43999pt\relax \fontdimen 11\font +(fontspec) =6.85999pt\relax \fontdimen 12\font =3.45pt\relax +(fontspec) \fontdimen 13\font =3.62999pt\relax \fontdimen 14\font +(fontspec) =3.62999pt\relax \fontdimen 15\font =2.89pt\relax +(fontspec) \fontdimen 16\font =2.46999pt\relax \fontdimen 17\font +(fontspec) =2.46999pt\relax \fontdimen 18\font =2.5pt\relax +(fontspec) \fontdimen 19\font =2.0pt\relax \fontdimen 22\font +(fontspec) =2.5pt\relax \fontdimen 20\font =0pt\relax \fontdimen +(fontspec) 21\font =0pt\relax +(fontspec) - 'bold' (b/n) with NFSS spec.: +(fontspec) <->s*[1.0001]"[latinmodern-math.otf]:mode=base;script=mat +h;language=dflt;" +(fontspec) - 'bold small caps' (b/sc) with NFSS spec.: +(fontspec) and font adjustment code: +(fontspec) \__um_luatex_copy_fontdimens: \fontdimen 8\font +(fontspec) =6.76999pt\relax \fontdimen 9\font =3.93999pt\relax +(fontspec) \fontdimen 10\font =4.43999pt\relax \fontdimen 11\font +(fontspec) =6.85999pt\relax \fontdimen 12\font =3.45pt\relax +(fontspec) \fontdimen 13\font =3.62999pt\relax \fontdimen 14\font +(fontspec) =3.62999pt\relax \fontdimen 15\font =2.89pt\relax +(fontspec) \fontdimen 16\font =2.46999pt\relax \fontdimen 17\font +(fontspec) =2.46999pt\relax \fontdimen 18\font =2.5pt\relax +(fontspec) \fontdimen 19\font =2.0pt\relax \fontdimen 22\font +(fontspec) =2.5pt\relax \fontdimen 20\font =0pt\relax \fontdimen +(fontspec) 21\font =0pt\relax + +LaTeX Font Info: Encoding `OMS' has changed to `TU' for symbol font +(Font) `symbols' in the math version `normal' on input line 53. +LaTeX Font Info: Overwriting symbol font `symbols' in version `normal' +(Font) OMS/cmsy/m/n --> TU/latinmodern-math.otf(2)/m/n on input + line 53. +LaTeX Font Info: Encoding `OMS' has changed to `TU' for symbol font +(Font) `symbols' in the math version `bold' on input line 53. +LaTeX Font Info: Overwriting symbol font `symbols' in version `bold' +(Font) OMS/cmsy/b/n --> TU/latinmodern-math.otf(2)/b/n on input + line 53. + +Package fontspec Info: latinmodern-math scale = 0.9999. + + +Package fontspec Info: latinmodern-math scale = 0.9999. + + +Package fontspec Info: latinmodern-math scale = 0.9999. + + +Package fontspec Info: latinmodern-math scale = 0.9999. + + +Package fontspec Info: latinmodern-math scale = 0.9999. + + +Package fontspec Info: Font family 'latinmodern-math.otf(3)' created for font +(fontspec) 'latinmodern-math.otf' with options +(fontspec) [Renderer=Harfbuzz,Renderer=Basic,BoldItalicFont={},Itali +cFont={},SmallCapsFont={},Script=Math,SizeFeatures={{Size=8.5-},{Size=6-8.5,Font +=latinmodern-math.otf,Style=MathScript},{Size=-6,Font=latinmodern-math.otf,Style +=MathScriptScript}},FontAdjustment={\__um_luatex_copy_fontdimens: +(fontspec) },BoldFont={latinmodern-math.otf},ScaleAgain=0.9999,FontA +djustment={\fontdimen +(fontspec) 8\font =0.4pt\relax \fontdimen 9\font =2.0pt\relax +(fontspec) \fontdimen 10\font =1.67pt\relax \fontdimen 11\font +(fontspec) =1.10999pt\relax \fontdimen 12\font =6.0pt\relax +(fontspec) \fontdimen 13\font =0pt\relax }]. +(fontspec) +(fontspec) This font family consists of the following NFSS +(fontspec) series/shapes: +(fontspec) +(fontspec) - 'normal' (m/n) with NFSS spec.: +(fontspec) <8.5->s*[0.9999]"[latinmodern-math.otf]:mode=base;script= +math;language=dflt;"<6-8.5>s*[0.9999]"[latinmodern-math.otf]:mode=base;script=ma +th;language=dflt;+ssty=0;"<-6>s*[0.9999]"[latinmodern-math.otf]:mode=base;script +=math;language=dflt;+ssty=1;" +(fontspec) - 'small caps' (m/sc) with NFSS spec.: +(fontspec) and font adjustment code: +(fontspec) \__um_luatex_copy_fontdimens: \fontdimen 8\font +(fontspec) =0.4pt\relax \fontdimen 9\font =2.0pt\relax \fontdimen +(fontspec) 10\font =1.67pt\relax \fontdimen 11\font +(fontspec) =1.10999pt\relax \fontdimen 12\font =6.0pt\relax +(fontspec) \fontdimen 13\font =0pt\relax +(fontspec) - 'bold' (b/n) with NFSS spec.: +(fontspec) <->s*[0.9999]"[latinmodern-math.otf]:mode=base;script=mat +h;language=dflt;" +(fontspec) - 'bold small caps' (b/sc) with NFSS spec.: +(fontspec) and font adjustment code: +(fontspec) \__um_luatex_copy_fontdimens: \fontdimen 8\font +(fontspec) =0.4pt\relax \fontdimen 9\font =2.0pt\relax \fontdimen +(fontspec) 10\font =1.67pt\relax \fontdimen 11\font +(fontspec) =1.10999pt\relax \fontdimen 12\font =6.0pt\relax +(fontspec) \fontdimen 13\font =0pt\relax + +LaTeX Font Info: Encoding `OMX' has changed to `TU' for symbol font +(Font) `largesymbols' in the math version `normal' on input line 53 +. +LaTeX Font Info: Overwriting symbol font `largesymbols' in version `normal' +(Font) OMX/cmex/m/n --> TU/latinmodern-math.otf(3)/m/n on input + line 53. +LaTeX Font Info: Encoding `OMX' has changed to `TU' for symbol font +(Font) `largesymbols' in the math version `bold' on input line 53. +LaTeX Font Info: Overwriting symbol font `largesymbols' in version `bold' +(Font) OMX/cmex/m/n --> TU/latinmodern-math.otf(3)/b/n on input + line 53. +LaTeX Font Info: Font shape `TU/latinmodern-math.otf(2)/m/n' will be +(Font) scaled to size 10.00107pt on input line 53. +LaTeX Font Info: Font shape `TU/latinmodern-math.otf(2)/m/n' will be +(Font) scaled to size 7.00075pt on input line 53. +LaTeX Font Info: Font shape `TU/latinmodern-math.otf(2)/m/n' will be +(Font) scaled to size 5.00053pt on input line 53. +LaTeX Font Info: Font shape `TU/latinmodern-math.otf(3)/m/n' will be +(Font) scaled to size 9.99893pt on input line 53. +LaTeX Font Info: Font shape `TU/latinmodern-math.otf(3)/m/n' will be +(Font) scaled to size 6.99925pt on input line 53. +LaTeX Font Info: Font shape `TU/latinmodern-math.otf(3)/m/n' will be +(Font) scaled to size 4.99947pt on input line 53. +LaTeX Font Info: Trying to load font information for U+msa on input line 53. + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Trying to load font information for U+msb on input line 53. + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +Package hyperref Info: Link coloring ON on input line 53. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2019/09/16 v2.46 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/latex/refcount/refcount.sty +Package: refcount 2019/12/15 v3.6 Data extraction from label references (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty +Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO) +) +\c@section@level=\count381 +) +LaTeX Info: Redefining \ref on input line 53. +LaTeX Info: Redefining \pageref on input line 53. +LaTeX Info: Redefining \nameref on input line 53. + +("./Dokumentation BJ-Keyer.out") ("./Dokumentation BJ-Keyer.out") +\@outlinefile=\write4 + +\openout4 = Dokumentation BJ-Keyer.out +Class scrbook Info: loading recommended package `bookmark'. +(scrbook) Using `bookmark' together with `hyperref' is recommended, +(scrbook) because of handling of possible bookmark level gaps. +(scrbook) You can avoid loading `bookmark' with KOMA-Script option +(scrbook) `bookmarkpackage=false' before \begin{document} and +(scrbook) you can avoid this message adding: +(scrbook) \usepackage{bookmark} +(scrbook) before \begin{document} on input line 53. + +(/usr/share/texlive/texmf-dist/tex/latex/bookmark/bookmark.sty +Package: bookmark 2020-11-06 v1.29 PDF bookmarks (HO) + +(/usr/share/texlive/texmf-dist/tex/latex/bookmark/bkm-pdftex.def +File: bkm-pdftex.def 2020-11-06 v1.29 bookmark driver for pdfTeX (HO) +\BKM@id=\count382 +)) +LaTeX Info: Redefining \rmfamily on input line 53. +LaTeX Info: Redefining \sffamily on input line 53. +LaTeX Info: Redefining \ttfamily on input line 53. +Package epstopdf Info: Source file: <../Pictures/dl7bj.eps> +(epstopdf) date: 2014-05-13 14:47:09 +(epstopdf) size: 55998 bytes +(epstopdf) Output file: <../Pictures/dl7bj-eps-converted-to.pdf> +(epstopdf) date: 2022-07-24 21:03:10 +(epstopdf) size: 17759 bytes +(epstopdf) Command: +(epstopdf) \includegraphics on input line 59. +Package epstopdf Info: Output file is already uptodate. +<../Pictures/dl7bj-eps-converted-to.pdf, id=10, 151.56625pt x 151.56625pt> +File: ../Pictures/dl7bj-eps-converted-to.pdf Graphic file (type pdf) + +Package luatex.def Info: ../Pictures/dl7bj-eps-converted-to.pdf used on input l +ine 59. +(luatex.def) Requested size: 60.62541pt x 60.62541pt. +Package epstopdf Info: Source file: <../Pictures/dl7bj-logo.eps> +(epstopdf) date: 2014-05-13 14:47:37 +(epstopdf) size: 30328 bytes +(epstopdf) Output file: <../Pictures/dl7bj-logo-eps-converted-to.pdf +> +(epstopdf) date: 2022-07-24 21:03:10 +(epstopdf) size: 18189 bytes +(epstopdf) Command: +(epstopdf) \includegraphics on input line 61. +Package epstopdf Info: Output file is already uptodate. +<../Pictures/dl7bj-logo-eps-converted-to.pdf, id=11, 470.75874pt x 61.22874pt> +File: ../Pictures/dl7bj-logo-eps-converted-to.pdf Graphic file (type pdf) + +Package luatex.def Info: ../Pictures/dl7bj-logo-eps-converted-to.pdf used on in +put line 61. +(luatex.def) Requested size: 353.06819pt x 45.92143pt. +LaTeX Font Info: Font shape `TU/latinmodern-math.otf(2)/m/n' will be +(Font) scaled to size 9.00096pt on input line 73. +LaTeX Font Info: Font shape `TU/latinmodern-math.otf(2)/m/n' will be +(Font) scaled to size 6.00064pt on input line 73. +LaTeX Font Info: Font shape `TU/latinmodern-math.otf(3)/m/n' will be +(Font) scaled to size 8.99904pt on input line 73. +LaTeX Font Info: Font shape `TU/latinmodern-math.otf(3)/m/n' will be +(Font) scaled to size 5.99936pt on input line 73. + [1 +Non-PDF special ignored! +Non-PDF special ignored! +Non-PDF special ignored! +Non-PDF special ignored! +Non-PDF special ignored! + + +Non-PDF special ignored! +Non-PDF special ignored! +Non-PDF special ignored! +Non-PDF special ignored! + + +{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}<../Pictures/dl7bj-eps-conver +ted-to.pdf><../Pictures/dl7bj-logo-eps-converted-to.pdf>] + +LaTeX Font Warning: Font shape `TU/DejaVuSansMNerdFont-Regular(0)/b/n' undefined + +(Font) using `TU/DejaVuSansMNerdFont-Regular(0)/m/n' instead on inp +ut line 79. + +LaTeX Font Info: Font shape `U/ccicons/m/n' will be +(Font) scaled to size 10.0pt on input line 101. + +LaTeX Font Warning: Font shape `TU/DejaVuSansMNerdFont-Regular(0)/m/sl' undefine +d +(Font) using `TU/DejaVuSansMNerdFont-Regular(0)/m/n' instead on inp +ut line 109. + +[2] ("./Dokumentation BJ-Keyer.toc" +LaTeX Info: Redefining \rmfamily on input line 1. +LaTeX Info: Redefining \sffamily on input line 1. +LaTeX Info: Redefining \ttfamily on input line 1. +LaTeX Info: Redefining \rmfamily on input line 2. +LaTeX Info: Redefining \sffamily on input line 2. +LaTeX Info: Redefining \ttfamily on input line 2. + + +Package tocbasic Warning: number width of section toc entries should be increase +d! +(tocbasic) Currently used number width = 24.08203pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 23.00003pt on input line + 6. + + +Overfull \hbox (1.082pt too wide) detected at line 6 +\TU/DejaVuSansMNerdFont-Regular(0)/b/n/10 3.1. + [] + + +Package tocbasic Warning: number width of subsection toc entries should be incre +ased! +(tocbasic) Currently used number width = 36.12305pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 31.99997pt on input line + 7. + + +Overfull \hbox (4.12308pt too wide) detected at line 7 +\TU/DejaVuSansMNerdFont-Regular(0)/b/n/10 3.1.1. + [] + + +Package tocbasic Warning: number width of section toc entries should be increase +d! +(tocbasic) Currently used number width = 24.08203pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 23.00003pt on input line + 9. + + +Overfull \hbox (1.082pt too wide) detected at line 9 +\TU/DejaVuSansMNerdFont-Regular(0)/b/n/10 4.1. + [] + + +Package tocbasic Warning: number width of subsection toc entries should be incre +ased! +(tocbasic) Currently used number width = 36.12305pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 31.99997pt on input line + 10. + + +Overfull \hbox (4.12308pt too wide) detected at line 10 +\TU/DejaVuSansMNerdFont-Regular(0)/b/n/10 4.1.1. + [] + + +Package tocbasic Warning: number width of section toc entries should be increase +d! +(tocbasic) Currently used number width = 24.08203pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 23.00003pt on input line + 12. + + +Overfull \hbox (1.082pt too wide) detected at line 12 +\TU/DejaVuSansMNerdFont-Regular(0)/b/n/10 5.1. + [] + + +Package tocbasic Warning: number width of section toc entries should be increase +d! +(tocbasic) Currently used number width = 24.08203pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 23.00003pt on input line + 13. + + +Overfull \hbox (1.082pt too wide) detected at line 13 +\TU/DejaVuSansMNerdFont-Regular(0)/b/n/10 5.2. + [] + + +Package tocbasic Warning: number width of section toc entries should be increase +d! +(tocbasic) Currently used number width = 24.08203pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 23.00003pt on input line + 16. + + +Overfull \hbox (1.082pt too wide) detected at line 16 +\TU/DejaVuSansMNerdFont-Regular(0)/b/n/10 7.1. + [] + + +Package tocbasic Warning: number width of subsection toc entries should be incre +ased! +(tocbasic) Currently used number width = 36.12305pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 31.99997pt on input line + 17. + + +Overfull \hbox (4.12308pt too wide) detected at line 17 +\TU/DejaVuSansMNerdFont-Regular(0)/b/n/10 7.1.1. + [] + + +Package tocbasic Warning: number width of section toc entries should be increase +d! +(tocbasic) Currently used number width = 24.08203pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 23.00003pt on input line + 18. + + +Overfull \hbox (1.082pt too wide) detected at line 18 +\TU/DejaVuSansMNerdFont-Regular(0)/b/n/10 7.2. + [] + + +Package tocbasic Warning: number width of subsection toc entries should be incre +ased! +(tocbasic) Currently used number width = 36.12305pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 31.99997pt on input line + 19. + + +Overfull \hbox (4.12308pt too wide) detected at line 19 +\TU/DejaVuSansMNerdFont-Regular(0)/b/n/10 7.2.1. + [] + + +Package tocbasic Warning: number width of subsection toc entries should be incre +ased! +(tocbasic) Currently used number width = 36.12305pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 31.99997pt on input line + 21. + + +Overfull \hbox (4.12308pt too wide) detected at line 21 +\TU/DejaVuSansMNerdFont-Regular(0)/b/n/10 7.2.2. + [] + +) +\tf@toc=\write5 + +\openout5 = Dokumentation BJ-Keyer.toc + [3 + + +] [4 + + +] +chapter 1. +[5] [6 + + +] +chapter 2. +[7] [8 + + +] +chapter 3. + +Overfull \hbox (109.98212pt too wide) in paragraph at lines 157--158 +[][] + [] + + +Overfull \hbox (109.98212pt too wide) in paragraph at lines 182--183 +[][] + [] + +[9] +LaTeX Info: Redefining \rmfamily on input line 188. +LaTeX Info: Redefining \sffamily on input line 188. +LaTeX Info: Redefining \ttfamily on input line 188. + [10] +chapter 4. +[11 + + +] [12 + + +] +chapter 5. + +Overfull \hbox (30.88551pt too wide) in paragraph at lines 229--232 + [][] + [] + +[13] [14 + + +] +chapter 6. +[15] [16 + + +] +chapter 7. +[17] +LaTeX Info: Redefining \rmfamily on input line 320. +LaTeX Info: Redefining \sffamily on input line 320. +LaTeX Info: Redefining \ttfamily on input line 320. + [18] +LaTeX Info: Redefining \rmfamily on input line 352. +LaTeX Info: Redefining \sffamily on input line 352. +LaTeX Info: Redefining \ttfamily on input line 352. + [19] +LaTeX Info: Redefining \rmfamily on input line 362. +LaTeX Info: Redefining \sffamily on input line 362. +LaTeX Info: Redefining \ttfamily on input line 362. + [20] ("./Dokumentation BJ-Keyer.lot" +LaTeX Info: Redefining \rmfamily on input line 1. +LaTeX Info: Redefining \sffamily on input line 1. +LaTeX Info: Redefining \ttfamily on input line 1. +LaTeX Info: Redefining \rmfamily on input line 2. +LaTeX Info: Redefining \sffamily on input line 2. +LaTeX Info: Redefining \ttfamily on input line 2. + + +Package tocbasic Warning: number width of table toc entries should be increased! + +(tocbasic) Currently used number width = 24.08203pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 23.00003pt on input line + 8. + + +Overfull \hbox (1.082pt too wide) detected at line 8 +\TU/DejaVuSansMNerdFont-Regular(0)/m/sl/10 5.1. + [] + + +Package tocbasic Warning: number width of table toc entries should be increased! + +(tocbasic) Currently used number width = 24.08203pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 23.00003pt on input line + 10. + + +Overfull \hbox (1.082pt too wide) detected at line 10 +\TU/DejaVuSansMNerdFont-Regular(0)/m/sl/10 6.1. + [] + +) +\tf@lot=\write6 + +\openout6 = Dokumentation BJ-Keyer.lot + [21 + + +] [22 + + +] ("./Dokumentation BJ-Keyer.lof" +LaTeX Info: Redefining \rmfamily on input line 1. +LaTeX Info: Redefining \sffamily on input line 1. +LaTeX Info: Redefining \ttfamily on input line 1. +LaTeX Info: Redefining \rmfamily on input line 2. +LaTeX Info: Redefining \sffamily on input line 2. +LaTeX Info: Redefining \ttfamily on input line 2. + + +Package tocbasic Warning: number width of figure toc entries should be increased +! +(tocbasic) Currently used number width = 24.08203pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 23.00003pt on input line + 6. + + +Overfull \hbox (1.082pt too wide) detected at line 6 +\TU/DejaVuSansMNerdFont-Regular(0)/m/sl/10 3.1. + [] + + +Package tocbasic Warning: number width of figure toc entries should be increased +! +(tocbasic) Currently used number width = 24.08203pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 23.00003pt on input line + 7. + + +Overfull \hbox (1.082pt too wide) detected at line 7 +\TU/DejaVuSansMNerdFont-Regular(0)/m/sl/10 3.2. + [] + + +Package tocbasic Warning: number width of figure toc entries should be increased +! +(tocbasic) Currently used number width = 24.08203pt, +(tocbasic) Wanted number separation = 3.99994pt, +(tocbasic) Reserved number width = 23.00003pt on input line + 12. + + +Overfull \hbox (1.082pt too wide) detected at line 12 +\TU/DejaVuSansMNerdFont-Regular(0)/m/sl/10 7.1. + [] + +) +\tf@lof=\write7 + +\openout7 = Dokumentation BJ-Keyer.lof + [23] [24 + + +] +chapter A. +[25] +The property list \polyglossia@langsetup contains the pairs (without outer +braces): +> {latex/script} => {latin} +> {latex/lcscript} => {latin} +> {latex/scripttag} => {} +> {latex/language} => {Latex} +> {latex/langtag} => {ENG} +> {latex/bcp47} => {} +> {latex/hyphennames} => {english} +> {latex/direction} => {LR} +> {latex/hyphenmins} => {2,3} +> {latex/frenchspacing} => {false} +> {latex/indentfirst} => {false} +> {latex/fontsetup} => {true} +> {latex/envname} => {latex} +> {latex/babelname} => {latex} +> {latex/localnumeral} => {polyglossia@C@localnumeral} +> {latex/Localnumeral} => {polyglossia@C@localnumeral}. +LaTeX Info: Redefining \rmfamily on input line 391. +LaTeX Info: Redefining \sffamily on input line 391. +LaTeX Info: Redefining \ttfamily on input line 391. + [26] ("./Dokumentation BJ-Keyer.aux" +LaTeX Info: Redefining \rmfamily on input line 24. +LaTeX Info: Redefining \sffamily on input line 24. +LaTeX Info: Redefining \ttfamily on input line 24. +LaTeX Info: Redefining \rmfamily on input line 28. +LaTeX Info: Redefining \sffamily on input line 28. +LaTeX Info: Redefining \ttfamily on input line 28. +) + +LaTeX Font Warning: Some font shapes were not available, defaults substituted. + +Package rerunfilecheck Info: File `"Dokumentation BJ-Keyer".out' has not changed +. +(rerunfilecheck) Checksum: . +) + +Here is how much of LuaTeX's memory you used: + 38689 strings out of 478824 + 100000,1648299 words of node,token memory allocated + 995 words of node memory still in use: + 28 hlist, 2 vlist, 5 rule, 4 dir, 8 glue, 7 kern, 1 glyph, 25 attribute, 78 g +lue_spec, 25 attribute_list, 2 write nodes + avail lists: 1:1,2:2121,3:832,4:204,5:139,6:59,7:4107,8:43,9:480,10:7,11:205 + 56746 multiletter control sequences out of 65536+600000 + 83 fonts using 96345159 bytes + 111i,13n,116p,10642b,1074s stack positions out of 5000i,500n,10000p,200000b,200000s + + +Output written on Dokumentation BJ-Keyer.pdf (26 pages, 118089 bytes). + +PDF statistics: 296 PDF objects out of 1000 (max. 8388607) + 245 compressed objects within 3 object streams + 68 named destinations out of 1000 (max. 131072) + 168 words of extra memory for PDF output out of 10000 (max. 100000000) + diff --git a/Documents/Dokumentation BJ-Keyer.lot b/Documents/Dokumentation BJ-Keyer.lot new file mode 100644 index 0000000..b2711fa --- /dev/null +++ b/Documents/Dokumentation BJ-Keyer.lot @@ -0,0 +1,13 @@ +\selectlanguage *{latex} +\selectlanguage *{latex} +\addvspace {10\p@ } +\addvspace {10\p@ } +\addvspace {10\p@ } +\addvspace {10\p@ } +\addvspace {10\p@ } +\contentsline {table}{\numberline {5.1}{\ignorespaces Programmierpunkte Teil 1\relax }}{13}{table.caption.6}% +\addvspace {10\p@ } +\contentsline {table}{\numberline {6.1}{\ignorespaces Klemmenbelegung\relax }}{15}{table.caption.7}% +\addvspace {10\p@ } +\addvspace {10\p@ } +\providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file diff --git a/Documents/Dokumentation BJ-Keyer.out b/Documents/Dokumentation BJ-Keyer.out new file mode 100644 index 0000000..e69de29 diff --git a/Documents/Dokumentation BJ-Keyer.pdf b/Documents/Dokumentation BJ-Keyer.pdf new file mode 100644 index 0000000..a9bc53a Binary files /dev/null and b/Documents/Dokumentation BJ-Keyer.pdf differ diff --git a/Documents/Dokumentation BJ-Keyer.tex b/Documents/Dokumentation BJ-Keyer.tex new file mode 100644 index 0000000..f6fb90a --- /dev/null +++ b/Documents/Dokumentation BJ-Keyer.tex @@ -0,0 +1,391 @@ +\documentclass[10pt,a4paper,twoside,parskip=full-]{scrbook} +\usepackage[T1]{fontenc} +\usepackage{fontspec} +\usepackage[ngerman]{babel} +\usepackage{color} +\usepackage{graphicx} +\usepackage{longtable} +\usepackage{subfig} +\usepackage{floatflt,epsfig} +\usepackage{nicefrac} +\usepackage{units} +\usepackage{keystroke} +\usepackage{pstricks} +\usepackage{pst-node} +\usepackage{rotating} +\usepackage{bbding} +\usepackage{tikz} +\usepackage{tikz-timing} +\usepackage{ccicons} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{unicode-math, polyglossia} + + +%% PDF Meta Information und Links +\usepackage[ +colorlinks=true,urlcolor=blue,linkcolor=black, +pdftitle={BJ-Keyer}, +pdfsubject={An electronic morse keyer}, +pdfauthor={Thomas 'Tom' Malkus, DL7BJ}, +pdfkeywords={Software, Hardware, Electronic CW Keyer, Amateur Radio, Open Source, Open Hardware}, +pdfcreator={Neovim \& LuaLaTeX(Linux)}, +pdfproducer={LaTeX}] +{hyperref} + +% Getestete und funktionierende Fonts. +% \setmainfont{Rosario} - Schöner, eleganter Font. +% \setmainfont{Roboto} - Schnörkelos +% \setmainfont{QTAntiquePost} +% \setmainfont{QTFloraline} +% \setmainfont{BaskervilleF} +% \setmainfont{EB Garamond} - ähnlich Rosario + +\setmainfont{DejaVuSansMNerdFont-Regular} +\setsansfont{DejaVuSansMNerdFont-Regular} +% \setmathfont{SourceCodePro} +\setmonofont{CaskaydiaCoveNerdFont-Regular} +\urlstyle{same} + +% \usepackage{placeins} +\definecolor{fond}{RGB}{240,240,240} + +\begin{document} +\begin{titlepage} + \raggedright + \begin{figure}[h] + \centering + \hfill % + \subfloat{\includegraphics[scale=0.4]{../Pictures/dl7bj}} + \hfill % + \subfloat{\includegraphics[scale=0.75]{../Pictures/dl7bj-logo}} + \hfill % + \end{figure} + \huge + \vspace{2cm} + BJ-Keyer\\ + Dokumentation \\ + \small + ab Version 1.00 vom \today \\ + Tom, DL7BJ \\ + \vspace{0.1cm} + Mail \href{mailto:tom@dl7bj.de}{tom@dl7bj.de} \\ + Site \url{https://isnix.de} \\ + \vspace{2cm} +\normalsize +\end{titlepage} + + +\section*{Vorwort} + +Was ist ein elektronischer Morsezeichengeber? Das ist ein Gerät, welches wir Funkamateure besser +unter dem Namen Morse-Keyer kennen. Kurzgesagt, ein Morse-Keyer erzeugt elektronisch Punkte, Striche +und Pausen. Während dies mit der Handtaste zum Morsen manuell gemacht werden muss, wird ein Morse-Keyer +in Verbindung mit Ein- oder Zweihebeltasten verwendet und erzeugt bei Betätigung die Punkte und Striche +sowie die Pausen selbständig. + +Ist das neu? + +Nein, Morse-Keyer gibt es schon sehr lange. Als Fertiggeräte, als Bausätze und auch nur als Bauanleitungen +in vielen verschiedenen Varianten. Etwas, das man quasi an jeder Straßenecke bekommt, in unterschiedlichen +Preisklassen. + +Warum noch ein Morse-Keyer? + +Einige der erhältlichen Morse-Keyer sind in großen Gehäusen untergebracht, mit vielen Funktionen, Abschluß für eine Tastatur, dutzende Speicher und LC-Display und kosten viel Geld. Andere sind sehr günstig, haben aber nur einen Anschluß für eine Taste. Wenn man nicht gerade der Contester und DX-Jäger ist, gerne mal diverse Tasten an mehr als einem Transceiver verwendet und weder Steuerung über den PC noch Anschluß für Tastaturen benötigt, findet fast nichts am Markt. + +Deswegen der BJ-Keyer, einfach, simpel, klein und trotzdem können mehrere Tasten und 2 Transceiver angeschlossen werden. Alles, was ich nicht benötige, habe ich auch weggelassen. Wer also auf der Suche nach einem Morse-Keyer mit ganz vielen Funktionen ist, dem empfehle ich eher sich woanders umzuschauen. + +Wer aber einen kleinen Keyer mit wenigen aber praktischen Funktionen sucht, sollte hier weiterlesen. + +Alle Unterlagen, wie Dokumentation, Schaltpläne und Software - kurz gesagt das gesamte Werk mit allem was dazu gehört, unterliegt der Attribution-NonCommercial-ShareAlike 4.0 International \href{https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.de}{\ccbyncsa} Lizenz, wenn nicht anders angegeben. + +Viel Spaß! +Tom, DL7BJ + +% \newline + +\renewcommand\contentsname{Inhalt} +\tableofcontents + +\chapter{Funktionen} +\begin{itemize} +\item{BJ-Keyer Funktionsübersicht} + \begin{itemize} + \item{Iambic A und Iambic B Mode} + \item{Anschluß für Handtaste und Paddle} + \item{Ausgang für Key-Eingang TRX} + \item{Ausgang für PTT} + \item{Stromversorgung 7-15V} + \item{Integrierter Lautsprecher für Mithörton} + \item{Mithörton als Sinussignal} + \end{itemize} +\end{itemize} + +\chapter{Hinweise zur Dokumentation} + +In dieser Dokumentation werden diverse gleichbleibende Darstellungsweisen verwendet. Dies erleichtert Dir das Verständnis der Bedeutung. Texte, die auf dem Display erscheinen, werden in der Bedienungsanleitung so \texttt{dargestellt}. Quellcode wird in einer farbigen Code-Darstellung eingebunden. + +\chapter{Grundlagen} + +\section{Betriebsarten eines Morse-Keyers} + +\subsection{Zeitverhalten} + +\begin{figure}[!ht] +\begin{tikztimingtable}[ + timing/slope=0, + timing/coldist=2pt, + xscale=5.0,yscale=3.1, + semithick + ] + %% Timing + DIT\ & LH 1{2C} \\ + DAH\ & 0.5LLHH 1{2C} \\ + Mode A\ & LHLHH 1{2C} \\ + \extracode + \makeatletter + \begin{pgfonlayer}{background} + \begin{scope}[gray,semitransparent,semithick] + \horlines{} + \vertlines{1,...,7} + \end{scope} + \node[anchor=south east,inner sep=0pt] + at (10,-4) {\tiny Output}; + \end{pgfonlayer} + \endextracode +\end{tikztimingtable} +\caption{Diagramm Mode A} +\end{figure} + +\begin{figure}[!ht] +\begin{tikztimingtable}[ + timing/slope=0, + timing/coldist=2pt, + xscale=5.0,yscale=3.1, + semithick + ] + %% Timing + DIT\ & LH 1{2C} \\ + DAH\ & 0.5LLHH 1{2C} \\ + Mode B\ & LHLHHLH 1{2C} \\ + \extracode + \makeatletter + \begin{pgfonlayer}{background} + \begin{scope}[gray,semitransparent,semithick] + \horlines{} + \vertlines{1,...,7} + \end{scope} + \node[anchor=south east,inner sep=0pt] + at (10,-4) {\tiny Output}; + \end{pgfonlayer} +\end{tikztimingtable} + +\caption{Diagramm Mode B} +\end{figure} + + +\chapter{Bedienung} + +\section{Tastaturbelegung} + +\subsection{Übersicht} + + + +\chapter{Schaltung} + +\section{Beschreibung} + +\section{Schaltplan} + +% \begin{figure} +% \centering +% \includegraphics[scale=0.7, angle=90]{../CAD/Schematic-Page-1} +% \caption{Mikrocontroller} +% \end{figure} + +% \begin{figure} +% \centering +% \includegraphics[scale=0.7, angle=90]{../CAD/Schematic-Page-2} +% \caption{Filter \& NF-Verstärker} +% \end{figure} + +% \begin{figure} +% \centering +% \includegraphics[scale=0.7, angle=90]{../CAD/Schematic-Page-3} +% \caption{Spannungsversorgung} +% \end{figure} + +% \begin{figure} +% \centering +% \includegraphics[scale=0.7, angle=90]{../CAD/Schematic-Page-4} +% \caption{Zusatzplatine mit Klinkenbuchsen} +% \end{figure} + +\begin{table}[!ht] + \centering + \small + \begin{tabular}{|p{1cm}|p{5cm}|p{5cm}|l|} + Prg. & Beschreibung & Wertebereich & Standard \\ \hline + \end{tabular} + \caption{Programmierpunkte Teil 1} +\end{table} + +\chapter{Beschreibung der Hardware} +\begin{table}[!ht] + \centering + \small + \begin{tabular}{|l|l|l|l|} + Klemme & Funktion & Beschreibung & Prg.-Punkt\\ \hline + \end{tabular} + \caption{Klemmenbelegung} +\end{table} + +\chapter{Beschreibung der Software} +\section{Timer 1} + +Der Timer 1 ist ein 16Bit Timer. Dieser wird für die Erzeugung von 2 Zeiten verwendet. +Der Timer löst jeweils beim Erreichen der Zeit einen Interrupt aus. Die Interrupts werden +alle 1ms und 20ms ausgelöst. So können einfach Interrupt gesteuerte Zeiten verwendet werden. + + +\subsection{Timer einstellen} + +\begin{align} + f_{OCnA} = \frac{f_{clk\_I/O}}{2 \cdot N \cdot (1+OCRnA)} +\end{align} + + +\section{Sinus Mithörton durch Pulsweitenmodulation} + +Der BJ-Keyer erzeugt einen Mithörton mit Sinuskurve, statt dem vielfach verwendeten Rechtecksignal. +Der Klang eines Sinussignals ist angenehmer. Um mit dem Mikrocontroller ein Sinussignal zu erzeugen, +wird die Pulsweitenmodulation verwendet. + +\subsection{Grundlagen} + +Die Pulsweitenmodulation, kurz PWM genannt, ist eine digitale Modulationsart, bei der eine Spannung +zwischen zwei Werten wechselt. + +\begin{figure}[!ht] +\centering +\begin{tikztimingtable}[timing/slope=.005, yscale=3] + \ & 4L N(A1) 4H N(A2) 5L N(A3) 4H N(A4) 8L\\ + \extracode + \begin{pgfonlayer}{background} + \begin{scope}[gray,semitransparent,semithick] + \vertlines{4,13} + \end{scope} + \end{pgfonlayer} + \draw [<->] (A1|-row1.mid) --node[below]{\tiny Duty Cycle} (A2|-row1.mid); + \draw [<->] (4,1.5) --node[below]{\tiny Period} (13,1.5); +\end{tikztimingtable} +\caption{PWM Ausgangssignal} +\end{figure} + +Mit einer konstanten Frequenz wird ein Rechteckimpuls moduliert, bei +dem die Weite variert. Das Verhältnis zwischen Impuls und Pause wird Tastgrad (Duty Cycle) genannt. + +Bei einer Rechteckschwingung gilt für den Tastgrad D: +\begin{align} + D = \frac{\tau}{T} +\end{align} +mit $\tau$ als Impulsdauer und T als Periodendauer. Mit einem Tastgrad D = 0,5 = 50\% würde ein +symmetrischer Impuls erzeugt werden. Der Mikrocontroller schaltet den Ausgang zwischen $V_{SS}$ und $V_{DD}$. + +Die resultierende Ausgangsspannung berechnet sich wie folgt: +\begin{align} + U_{Out} = \frac{\tau}{T} \cdot U_{In} +\end{align} +Dabei ist $U_{In}$ gleich $V_{SS}$. Bei einem Tastgrad von 50\% und einer Spannung $V_{SS}$ von 5V +beträgt $U_{Out}$ = 2,5V. + +\subsubsection{Pulsweitenmodulation} + +Das PWM Signal wird mit einem Timer erzeugt. Um die Frequenz des PWM Signals zu verändern, wird +die Taktrate und der obere Grenzwert des Zählers eines Timers verändert. Eine Änderung des Output- +Compare-Registers ändert das Pausenverhältnis. Der PWM Ausgang des ATMega328 ist High bis der Wert +im zugehörigen OCR erreicht ist und Low bis der obere Zählwert erreicht wird. Das ist der Fast-PWM +Mode des ATMega328. + +Für die Erzeugung des Sinussignals wird der Timer 2 im Fast-PWM Mode verwendet. Der PWM Ausgang des +Timers 2 ist OC2A. Die Taktquelle des Timers 2 wird eingestellt und der PWM Mode ausgewählt, so dass +OC2A geschaltet wird. Weiter wird der Overflow-Interrupt aktiviert. + +Der maximale Wert für FastPWM berechnet sich wie folgt: + +\begin{align} + f = \frac{f_{Quarz}}{2 \cdot 1 \cdot 256} +\end{align} + +Der maximale Wert bei einem Quarz mit 8MHz und der minimalen Vorteilung von 1 beträgt somit: + +\begin{align} + \frac{8.000000Hz}{2 \cdot 1 \cdot 256} = 15.625Hz +\end{align} + +15625Hz entspricht einer Periodendauer von 64µs. + +Diese 15.625Hz wären die Samplerate. Für einen Sinuston von 800Hz bei 256 Schritten für die Einzelwerte +der PWM wären aber 800 \cdot 256 = 204.800Hz erforderlich. Die einzige Möglichkeit, mit dieser niedrigen +Samplerate ist die Verringerung der Schritte. Auf jeden Fall wird die Pulsbreitenänderung im hörbaren Bereich +liegen, dies soll das RLC Filter am Ausgang des Controllers bereinigen. + +Bei 16 Schritten würde eine Samplerate von 800Hz \cdot 16 = 12.800Hz erforderlich sein. +Da ich 800Hz als Mithörton zu hoch empfinde und damit die PWM und die Nachladefrequenz +möglichst synchron laufen, habe ich 32 Schritte gewählt. Dies führt dann dazu, dass bei +32 Teilschritten der Sinusperiode pro Teilschritt 4 PWM Impulse erzeugt werden. Damit ist die Nachladefrequenz +und die PWM Frequenz synchron und es ergibt sich ein Mithörton mit einer Frequenz von 488.28Hz. + + +\begin{align} + \frac{\frac{15.625}{32}} = 488.28Hz +\end{align} + +\subsection{Sinustabelle} + +Über den Overflow-Interrupt vom Timer 2 wird der jeweils nächste Wert einer Sinustabelle in OCR2A +geladen. Die Sinustabelle wurde mit einem einfachen Perl-Script erzeugt und wird als Include Datei +eingebunden. Bei jedem Interrupt wird der nächste Wert nach OCR2A geladen. Die Sinustabelle hat 32 +Werte. Die Frequenz für das Sinussignal berechnet sich wie folgt: + +\begin{align} + f = \frac{Samplerate}{32} +\end{align} + +Jeder Eintrag der Sinustabelle bestimmt das Pausenverhältnis von Timer 2. Jetzt müssen die 32 Werte +zum richtigen Zeitpunkt in OCR2A geladen werden. Dies übernimmt der Timer 0. Timer 0 ist ein 8-Bit +Timer und der nötige Werte wären \begin{align}\frac{8.000000Hz}{15625Hz} = 512\end{align}. + + +\listoftables +\listoffigures +\appendix +\chapter{Entwicklungsumgebung} + +Als Entwicklungsumgebung verwende ich mehrere, ausschließlich kostenfreie und überwiegend Open Source Programme: + + \begin{itemize} + \item{Editor vim \& neovim} + \item{Shell bash} + \item{Filemanager mc} + \item{Terminalmultiplexer tmux} + \item{RS232 Terminal minicom} + \item{Dokumentation lualatex} + \item{PDF Reader zathura} + \item{Compiler avr-gcc} + \item{Flashprogrammer avrdude} + \item{Layout \& Schaltplan KiCad 7.xx} + \item{Bohrschablonen FrontDesigner} + \item{Softwareverwaltung Git} + \item{Softwaredokumentation Doxygen} + \item{Website Nginx \& Dokuwiki} + \item{Website Sourcecode Gitea} + \item{Betriebssystem Entwicklung MX-Linux} + \item{Betriebssystem Webserver Debian} + \end{itemize} + +Wie man sieht, sind das bis auf die CAD Anwendungen und dem PDF Reader alles Anwendungen für die Textconsole. Ich finde, richtig produktiv kann man nur mit der Textconsole arbeiten ;-) + +\end{document} diff --git a/Documents/Dokumentation BJ-Keyer.toc b/Documents/Dokumentation BJ-Keyer.toc new file mode 100644 index 0000000..86f7ef5 --- /dev/null +++ b/Documents/Dokumentation BJ-Keyer.toc @@ -0,0 +1,23 @@ +\selectlanguage *{latex} +\selectlanguage *{latex} +\contentsline {chapter}{\numberline {1}Funktionen}{5}{chapter.1}% +\contentsline {chapter}{\numberline {2}Hinweise zur Dokumentation}{7}{chapter.2}% +\contentsline {chapter}{\numberline {3}Grundlagen}{9}{chapter.3}% +\contentsline {section}{\numberline {3.1}Betriebsarten eines Morse-Keyers}{9}{section.3.1}% +\contentsline {subsection}{\numberline {3.1.1}Zeitverhalten}{9}{subsection.3.1.1}% +\contentsline {chapter}{\numberline {4}Bedienung}{11}{chapter.4}% +\contentsline {section}{\numberline {4.1}Tastaturbelegung}{11}{section.4.1}% +\contentsline {subsection}{\numberline {4.1.1}Übersicht}{11}{subsection.4.1.1}% +\contentsline {chapter}{\numberline {5}Schaltung}{13}{chapter.5}% +\contentsline {section}{\numberline {5.1}Beschreibung}{13}{section.5.1}% +\contentsline {section}{\numberline {5.2}Schaltplan}{13}{section.5.2}% +\contentsline {chapter}{\numberline {6}Beschreibung der Hardware}{15}{chapter.6}% +\contentsline {chapter}{\numberline {7}Beschreibung der Software}{17}{chapter.7}% +\contentsline {section}{\numberline {7.1}Timer 1}{17}{section.7.1}% +\contentsline {subsection}{\numberline {7.1.1}Timer einstellen}{17}{subsection.7.1.1}% +\contentsline {section}{\numberline {7.2}Sinus Mithörton durch Pulsweitenmodulation}{17}{section.7.2}% +\contentsline {subsection}{\numberline {7.2.1}Grundlagen}{17}{subsection.7.2.1}% +\contentsline {subsubsection}{\nonumberline Pulsweitenmodulation}{18}{subsubsection*.10}% +\contentsline {subsection}{\numberline {7.2.2}Sinustabelle}{19}{subsection.7.2.2}% +\contentsline {chapter}{\numberline {A}Entwicklungsumgebung}{25}{appendix.A}% +\providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file diff --git a/Pictures/boards.jpg b/Pictures/boards.jpg new file mode 100644 index 0000000..5d916ce Binary files /dev/null and b/Pictures/boards.jpg differ diff --git a/Pictures/dl7bj-eps-converted-to.pdf b/Pictures/dl7bj-eps-converted-to.pdf new file mode 100644 index 0000000..aaf505f Binary files /dev/null and b/Pictures/dl7bj-eps-converted-to.pdf differ diff --git a/Pictures/dl7bj-logo-eps-converted-to.pdf b/Pictures/dl7bj-logo-eps-converted-to.pdf new file mode 100644 index 0000000..01b8681 Binary files /dev/null and b/Pictures/dl7bj-logo-eps-converted-to.pdf differ diff --git a/Pictures/dl7bj-logo.eps b/Pictures/dl7bj-logo.eps new file mode 100644 index 0000000..873b71a --- /dev/null +++ b/Pictures/dl7bj-logo.eps @@ -0,0 +1,515 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1,17 by Peter Kirchgessner +%%Title: DL7BJ website logo.eps +%%CreationDate: Tue May 13 14:47:37 2014 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 483 75 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228346456694 14.173228346456694 translate +% Translate to begin of first scanline +0 59.992500937382829 translate +467.94150731158607 -59.992500937382829 scale +% Image geometry +468 60 8 +% Transformation matrix +[ 468 0 0 60 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 468 string def +/gstr 468 string def +/bstr 468 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 29288 ASCII Bytes +colorimage +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +_>jQ7nc&ajqtg-dl2Lb^p\t6mJcC<$W;hA~> +_Z'`4l0nQArrr5S`2oNVlMgqakPY/U!W2Vbrri?!s82eHs,I&/~> +_Z'`.fAcYurrr&2PA![ilMgq^eG8q?!Vl/Xrri;srqQGCs,I&/~> +aSuAAq=saapAt'brq?EfrqQTiq>U6jq>9mdr9=4^p\Fdf!r_ujrq?Hirq$-lqZ$Qor;QitrVZKg +!;uiqs8W,uj8],X&,lD$qu$ +r;QcpcMnaSUm@-qJ:NTNJ:WE8R%9e5R'EouVjN0hrI=mplMgq`JYE&B!oC/BrdY$NlLY#YW;-#Y +qYpL1qt&js`4j"$^rOI3c0=`gqZ$9`qtp?TrtPD&oBbVYUqG$SS_Nf7p#+,shl)>-J,l9os,I&/~> +r;Qform1T]lrlY6*Z,_H;&C5q1IOr35"'F2C1'FR)uUTRWp9TcqAWH5rrU)W2#\ +rr3)uq"OO^q>^6`pAk!^pB13dqY]^['E.e(q=jX\r;66_q"jd\q>0m\r;QZoroj@mq"OggrV?6d +q"OR[p\=^cpAYBsp\=RZp\=R^pBgWhp\=OXp\=LWr:p6b"Shijr;Q*`!<)]e!;Q6]"o8#mrVc_H +s,I&/~> +rr3GKML^>HTp^suJUrE*JbsrtMY;Q'M4CouqsXP"r:nsOYGZr&`6#lHJ#pg?sOlNW4M~> +rr3Fr.Ms3o<(/Sk)]B_<)Z(?O.eX\^.8+f^q!\4tqXM+=DI=A%PamgP(clmi4%=KB-DLLh!nlJa +kl2/N*;oiO +rVlotr;HKmq>U*hq"jj]')M@uqY^?krVlfprVQ?ap\=R]li.Ilp\b$dq>L9dq>C3ep\j(N#Q"2o +r:g'eq#0phrV-'apAY0jqYU9nrqcWgrqHNkq>U*grVQTsrr)fmrV-?e!rDionGiLd&cVh0r;69c +q"OX`q"X^[q"OZ:s+^Q(~> +rVm8he\f&8\Xe;%J<$c.J.o5@UUJY@guRebjQ=:6Mh$___t`Tu%`EqKm@U$+hhRiOjdC\[iVs.] +JEk4-Xm_ANJ-:MXKRh\JrrKs9qu6]f[/PR]N0KRCVLa8NjSSrZp#Y5FrI>$,NjHq'nGa6Vg>MAn +m*EM1Z&aI7g5hE(L5LMopjrI#s*t~> +rVm8UZ]^'%In^dt(c#k&(_^s3=F.12^WkK_c-hUu/Jp$EOn%f<%[7j:h,$ta`$J6]cUAesiVs-j +(tb;tC>h)M(^(nj*uMK\rrJ0lqu6][G5`oOV'c27MCmEj(/r>5Ya13B5ZnGa66]>rdu +h5HAoEASSB]/)Hk,:XOanU^^qs*t~> +pAY9nq=j[Zq=amepAY0lq>Bsfqu6!_&,Q%rrr;ihqYpEep\=aeqW%S[qtKj[q>9scpB:Bhq"OXZ +rrW/nqtg=$rqH0_q"ss_p\=LWq=jmirV69a!VlZYrsSi$q=sd\r;QWlp\KI@L&ZZ~> +pAY929*[t1jNbCtJ1nF`pDrs$DlKT2bGNW"A1_4d'E +[J0\&k(15Brs\4GKq+CA\VG^!JUsTkrrW2_P5Bb1QLX5>$hT@HOe@``l-[q2Z%;q/s*t~> +pAY8f<@01LqA95PXnMbq]NG+L![`WdmJd]7(fo2_Hl@([THY46j6^UArs"])+#$f_0`;gkO&\4] +H2%=?d2@`9rs[X'+\Y%UIjGpn)];`PrrW/K3r9`p5iq81$gT?82c;B6euYtnEe47Es*t~> +o`"pgq"Fd`oD\gfrV$Bgp\jO[&,Q&!rqcKjrqZ?ep\FdarT!nXr;$'kqYU$`s8)NbrrW&kqt^9l +p^-cnq"OU]q"OU`p&>'lq"sddq"s@V$iKbsqu6Wqqtp0`rIP!'s*t~> +o`"s.K)'osO7WAO_#AidL5gu@mf*g,JD0:hW9`cCNmEUhbQ(P^HJ>Br)N,rrW/jQi)@8Koih0rsR80aLgm?s2M[3P2CijLAuc~> +o`"rQ*;LEO1\C\Jrf$gn"!]KG\F0A-Hl0KKAmsHJId6q@XX'?fhuE\CKJY^-JcCK)J,~> +o`"pirV-?e"8DZhqssamqtKj]qY0d\rpTjqq=sd`s8;ZfrVQ?brSdbZrV-'_q#0plr;$3gr;-0b +q>UQqp\4X_rs/Gqr;$*]qt^6c!;uHg#laVnp\Fa_p\j@V$MaAps8DckqY0daJcCK)J,~> +o`"pErI>';OFaaQ](5k,`INTAWIg&$p[A+jUm@Orr76t(ikL#8g#;r6hLL-WP5]t +o`"p%r>5]'2&^UpK(K!Krfn<@B4;i3;Xj/T$sGnhV>7MV +o`#9np\4IYq"OU\q"sU]#l=;iqYg3`qYp!a$i0SsrqcBdrVlWerS[\Ur;HBip^6ipqYC*dqtp?e +q>1*mq=s^\rs\l'qYKs]qY0aZqtL$Zrs/Dpqtp0_p\="Q$2OQ"rVQTmrqHDCs+UK'~> +o`#8]J:NWSQ@Yp9NkFr_$3%;dJuRIeJ?nn+Ks4k?YhX5p]JcCH(J,~> +o`#7Y(`4r.5T*jC0o#9!$2o&n*+QTA(j#-7rsM^Zkj*(/K?WCS(s(Y8!1s-+%5^(DX)q^aI?oH% +3^`Z>rri7&.4"H\rsZbs@VHZDH6a=oIjCcZrs3rmKp"#)(ao.Ers;01s1jKQ_qu +p&>$jrq?Znq"t$dp\4LRrs8Psq>C$_p\4ORrs\f#r:p*ds8;cmp\XmIrtG;(p\=X_q"sj]p\Xdc +r;Z`iq#13l"TJ5lqtg-g$NBhpq"XUYrVZHcnG`Ucp\4XcpAk-Vrs8E!r;Q`rrqcD@s+LE&~> +p&>E_K7e]CQH.[WL4H/krs75.V:(0WJ:P)trsZK3bDMhPs2r7;JA07drtDtoJ;UkJMS>73KYjVU +aS=MEN8=L5"RMqH^TdP6$M'7.Od(BYf[Q"Anc&akNIZQ7rdY!jlMh0Sn]^:us6QkNpjrI!s*t~> +p&>EL*Zc.h5af2k,8a_Vrs6%R>HK5%(`7SgrsXKXTdrdargo:m(l>$HrtBu$(b0ud.u?;<+-9gi +S+=6;0#7Jd"Pd0?Mf8Fk$Kj5_2`qp9\?IhCnc&aj0GkYArYPX*lMh/Pk+gT/s4qEMnq$gps*t~> +p&G'k$2F8lrqcEdqY0mVrr`2np\=^]!;c6c%/T_or;ZcorVZNdq>0(M"SqffrqlZg')DG#p\4L\ +q"jj^q>:$_p\Oa`qYpj"q"OOXq"jsbrqGs_$N0YnrVZKeqY0gbm/I+]qu-Nsqu6BfJcCH(J,~> +p&>Hcl&^P:n#2&HZ%0C_nc&a7J:NH0rdY!Snc'$,J=Y-fn'U%>[=OmUiVs%SJ=Z&;rdYZ7R^ef? +JtBlAY-j+\^9)s:Yc,D7rsRY@LObVUXQQC0J;3Uo$IaTij3X3gW.q)7m/IBN\c)R.prDTb`e"/D +s*t~> +p&>HRf/4S6iF+'PEYs<%nc&`a(`4VErYPZWrpp'tHl,S[rSjlrWd#CUGN&Q)<>\HcJ,U8u*_1ZM ++rsIA2/@Fc4kP(`4OgrsGqM3m4Nl=(!7Sh +oD]-lqYU'brVQBcqsXR]pB(-aqt'jfq?d3$qYL*crVcKei;X&Xp](*aq>L3grs&K$q=jXZqYg-j +q"sjcqYq!&rqlHbqtp-`q"a^^o)B$qq"O[as8Dihq +oD],RXMBh/iQ%"I_XRR+qM5!!"+l_i\b#k$Z3pKr\$NfMinT*gq;M>ZTRlsFJ=k]8q>L +oD]+FBoOg%adP%UORW8Nod9SR!us?DJ+N^?EshZtI!(6Zb.nm3oAT]T;Ao1L(fA24oDS[on@)%- +(eAlnrYP_qO!s#arscHhLDqaqR3P?O8L]PpoD]0P3?*atrQpiP;#9PY!@"uOrrg_a3]pJps+UK'~> +oD]0nq#(*eq"OUZp\XI[!;uij"o.upr:g$YrsSZ#qt^-grr;olp\s+N"Sqijp\XX`$2sbtq=sd` +s7lNdrsJ\uqYBp]p\4LYq==OhqtKserV?He!;Pm[$2=K"qYL$drqQJDs+UK'~> +oD]/dOOW6gNJ*d[JA^mV!71Xp#*d%$bCH)]o`#;qf=[Tdkj\VsUO_^hrro'Sd=o:4p\tTqh7T\T +NMY2&QHf1($IF@1R>d5YJXVCco)Am(L8k46R/VU9Q0eMXre1:NZEBYPl\XtZs+UK'~> +oD].f2R1A50H`q>(m=Cg!2of5#!A%?TGU9!o`#;([Y7;.e`?b+"e75$P:)+Q#Jo)AlC,\-l!7/e#'54&:Vr#kq;F)4@^g*tg.s+UK'~> +oD]-lqtg'`rVlckqsOLapBUTpr;-0_p\FI]#5IreqYpNnrqQThqr%JVq=jX]mJd4bq"F^prV-'^ +q=ja`q=jdVrrW/pq>Bseq!A"frqHHkp\Y!hq"ao?s+UK'~> +o`#9tPK'qZZ/Y3/UUopo$M].,_=lHcJWt_To`#;bJUk)us4Wm5U4Bu9rr]0MK[fDh!m6i+p\tTQ +KRokiJ?$b`J@b:N!p?)Ir."g(qsFCjmXb;kJ\;$CQCdPrs+UK'~> +o`#9r3gXq*EQ[1W=For@$h>,]Npa;r)a,*2rq6:!5T1J^kl87`:f\Ehi;Wme)BZ3NrrScWq"Odq +\0)\k;&El::De]RrrUYC +o`#9sp\4L^s8Voip\aIZ$2FJuq"OR\qtKsZrsSVtrr;upp\Fdap\j%M!rDZemJd7ep\aab!W;]k +q$$Zjp\OX]nc&Ueq=amgmJdOlq>0pds8Minqu20HL&ZZ~> +o`#9UJ:OHTqY-G7JCa2h$iZ%;pQ^8la1d)'rq6:!M4a&4n%=@GgSo__i;WkeJ=c0.!pkZkpAYKB +J=`:$^QjJQJB%-Z!6Ftd!;>g[$J_2WV!\3PV!,DSJcCH(J,~> +o`#9:(`6H!p$kO"(q&i4$iMQfn37aMR>Dbir:U't.8e[rieAUP]j_i$i;Wk*(f'Ju!o,$*pAYJk +(f*duME`1q(msjn!1N^#!:T=T$G]AU=l',>>1A,SJcCH(J,~> +p&>F!p\4UbrV6-^q>'mTrsAPtp\Fgdq#1-do`#9mrr;ljqZ$Nip\3SF!rDZhmJd4_qXsjqr:fs_ +qY0g_q"XaVrrE#spAt0hrqPj[$N0\ss8W&or:p$bJcCH(J,~> +p&>EhJV2DAgm +p&>E[)'5pC^Hrtt>"!f,rsE4:,[fH75.R7lr:U't*TQjU-=lYq?l0pVi;Wjs(o-Ku!a'79pAYJl ++=;VH,Z][R/;Ncq!71W]"e)D?-nPAbrsGAZV#UJ(FIP6,d=M=Os*t~> +o`#*jq#'p]r;QNnp\F7Ws7Zfss8)Tlrr)Tfp&>6jq=j^as82ch!<(jU!rVflmf*@dq#:!e%0$(t +qY0a\q"aa[q#9ja#lXMpr;-9gs7u$]$N']"s82Zgr;-3eJcCH(J,~> +p&>EqSWqN[J^Us7W.:K.rs\gZK?X7l[J9:LJ?&J>rsOLXLSaS?_hEVkKB(ni!m6)emf*@=QhU4R% +/--NWJ,l$PFeM$NV)fA#j-cRe#BM1s.o#]$G!8hJcCH(J,~> +p&>El9g,O.)6J.1?l2Z-rs\]I*M`F +o`#9qp\F[\r;HNep\XCY"T/#mqY^?m!r_lipAYO"p\=^erV60bqY0dBrrN,nmf*@ep\jdb!WMln +pBUKjqY0pap\j[_"9%uhp\sshs7u$]s8**%qYC'hr;?HjJcG]K"9&/pr/L`,~> +o`#<>J=aiqEXJcG`L"o6rq_peIBs*t~> +o`#;f(eAa-S[k1+(k2DOrreEYW+r[X$A"NBE*]./SYLq`JcG`L"n]R"OfnA;s*t~> +o`#U*f$hsW"qY0gbq>C$^q;;2Qp\s[^!r_ljo`"pj +rqHHh#5@ogq"XU^oD\jjq#'mdq#Luq=sg. +s*t~> +o`#=?rsQ8cJ>i)>pTT4!U%A$Y%JbP8rNq-OnYF +o`#<":b]GV@N-.V1`2_NrsO,i(h)\/nS]?`<9a/W%J1L_qK<`Zk#n<2)+XM]rrW!Ag[P4Ec5qW1 +rs\<@(`IU5+[SaW5p">CrrLt6r"oK'@"dnH$XofYDqY##P5IifQ/2H@p6qr["8]<+*W6fT:s8kA +l^D*7F34H4~> +o`#9rp\Xpap\Fgdp\O=X#5S#hs8VukrV$UEjrVlWeq:tuNqt[5k$2jSnqu-Nos8;Z:rrrAtp\=Xa +aT$b~> +o`#9EKtZ3&J>_\XJZeG@#+U4As7jBcrI=mjpAYMNh4p%O\:K:BXb4=ErrL3mnc&[_Nh#_@$h&V4 +UQg:ZM8RDoeFNV>Sc+'ALRNmH[dF)&reHH/pAV,TkbE['h#@DkTrS,"rQC7Y\_?EFr5b,Irs%Ye +JrmM"rQ5(i~> +o`#8r+c!]i(gu$o)f+mA#"oe@s72*rr>5O,pAYL;_,iF]I2X,TC*&/frrJRsnc&[V0h_-<$fW!i +=?IE;.$C#QYk%eo:&Pn3-:f6rHgUhAr?a1&n,-hGeQ3Sirn[STN`E+Z$MpGQ."Jtdo(ne +o`#rr;??epAk0crsSStr;HEcqu6Nfq#9.M!<2Ng!r;Wjo)B'kq"X[Z +qY^-aq#'^_!;uij"Shlhq>KXZ$MXQ"rqZKiq"OO\h>[QUq"ibF!WN#Grr`5pp\Ode!VlT=rri>t +p\OjarrN,smJd4dr8ms/~> +o`#J,tAdpAYMRZ-(dcQGN%=L5GBVrrN,ko)AgjT8<.2rsSd\ +PDkl\[F(86O3$nl$-RjLKpTE5RGRr1rsSXQo)JaOC.liKSkmq#13o +pQX:UrrhkmLU?. +o`#;s5WU-=aJ:k/;^es?rrh4ESY7S3(]bi.pAYLBEhC!.6'(!.,UhX/rrN&`o)Agh;((Z#rsS]N +3\Ec>H)s521n+"8$)&1Q,!pr@7Do)krsSH9kPsaOW220e,e)V0!pVIQg]%<,S(%B?a?:ANo)8Ri +nNFA-rrhIs-?m`1rrLcAmJd4>S)s[#~> +o`#:!rM`ho)A^erq?Zor;$0e +rqQK`rs&8pqYBm[qs+1hrV-[QQqtf(I!W)]Crr`/mp\Fae!ri#nli."_roa:_ +rV6 +o`# +o`#<8,*CreH$?4B=":WGrsNW[(aU"9*Ec;X+li=s$S[2n?GlZ'.RtTuWQtMFIi+LBrsP,0(a`_" +:.N"R0\u@##k:'!Gu,h,L%O^2$d0CKd>u7X8q*F/K\cY0G*dX3rrHtfeGfZ8)]`&ZrVlrZ7]#GN +!Jp1,rr]enSFlRU!H!DTrrHtfjo9i~> +o`#9qp\FX^rr2chp\X@X$N'Smp\4L_rqQ6`pAYKoq#(0kq>:0gq"N)6!r_lhnc'!pp\=^ap\Xpa +q"OaYs8VltrVQ?brTX=irV-3aq#($cqY^3bhZ!]Wq#C3FrrMlmeGfXLrqZQlrrW/prTjIbrqHET +rrDlerrMlmmJd4]rT4'0~> +o`#9;Z7$dsQbjM6Pi +hj94NiUm-TqP9t@]RZL6l2M.RJB!J'aMG9`afU]^rr_VJqlSZR!r7Q5eGfX1m@!PDrrUi@i9UCE +n:L/nrrW"`q"F^hq1\#"rrW"MkN2_o~> +o`#8b,YhF*m+QV7(k:rQ$BH,h+;eD@h`)H[p\t[",:92ak=q#nPr0]Xci4'Z(g->.$`t7"c&=!7 +`'Ppjan5T

+p&>Eup\4UcrqlQdp\=UPrsJ`!p\=[cqY:!cq=jmtrqHBkqt^3hp\ap_rQkKFq"OaWrsSc#r:p'b +q>'s`p\smd#Q=Mnp\=X`rTF1gr:fs]rqlWirVlTihZ!]Sr;ZTWrrE&tqtU0lr;"e@!WDlorrW2r +qtpBnrr2fdrrMukrr3#tr9O@arVQQfrrN&nqYpQprqlKj!W;ckrrN)rli2J~> +p&>ERJq28Go#.edJVpDnrsIS4J;V_IZ&I#JS+lpko75Wr_4'65J^hAaj3[f.qiH?inc'!IR*1YY +c(giQQ%8N$rs8GZWIfY_^sLs$rsQr!J=uSNc*#mmMp1&X"/s<@U$;R[n$om@rqZQpd@J_c!T(0^ +rr_kr]__R+"Rik1^&I[(!Oe +p&>E4*#PaOkEL!/)_5@arsHRZ(b2QSE\F>U9)&>okSV)7N_%$s)R+u8bg?@lpGEf7nc'!'6_QP, +UfU9a58`_\rsA;<@iZCGNN'hpkl2$](`60 +p&>0mq>($crq?Njq"X[PrsJc"qu6NgqZ$Tpp\+Upp\Xa\rVcKcrquNhd/O1Cp\F=Y#Q+8iqYKs` +r;QHjqYp9oq"OU[q"Xg^!;kgV$iKbrrqlZls8W#or87MWrV6ElqUKkr;6KtrV?Hmp\Xdd +!VuZkrrN,tli2J~> +p&>EFSt58AL4OoNPEVC$rsJLOa7ml=Wr;taLA1]Vqgc;>PN1SRMX/N;jO!o.V1>9/rt`+qJ?QG; +`QNjaJ?,]=R$j1nS"Q%3Jc:0%\c)R)k5Ph3JA_#mjOF50f!s5errh8?r:Z]HrrqD[p&'?Zq>UJn +anbr;jiHrk"S]a%Q07`<#,(#Vo"DR&qu6iZVtKt<`V'64oRtQirrM]IlMh"bbbWDZqYpSoanu)A +ihuJIJAq?a!N4';rrM]Ili2J~> +p&>Dr:/0PB,8hA#4$#dsrsJ66Rdd.-AGcD_,PV3Hp_\W>43PYb/)-j:c-ZIl>8UB0rt^##(i=XI +QD#<:(hR;K6Ua-_8Q%c;)ZCQUJ,90UJ' +Sb`9dd$sP)"RqFD5L]3'##i_FkD+NIqu6iB@.!b,QM(7ZlQE/*rrM<#lMh"`U04,bqYpS(SbrEj +b$aW4(mb!t!FVJrrrM<#li2J~> +o`#9sq=s^Zq"OR\q"X4U$2FJpp\Xj`p\jj\rsSi#p\Og_q"t'iqY/A:"8hlgrUBgpqY0j]q#'s_ +qt^!^rV$Ehq>:*hr<)uop\4[^!Vu`YrsSc!rqZNms8Dcgp\WkJ"SquqrqZ'`s8N#t#6+Gus8Mcg +q>UKirVHNqqtKj_rrE#ss8W)rrr`8qq#0a_"o\2lqYU9grs&Jus8W)mq=XagqtTmb!<2Bc!rVon +qu6]krVZ["rqZTorqH6arrMlmp&>$kr;Qcqrr3)uqY:$gs*t~> +o`#9SU5XVdP_PC9LmIE-$C';6JAo$eK\V+Qq#:`cJ:OrKOI!ZLnZ.2err^'$NnEk$+0gO$P*=+a +MoVZERXfp>LQSLSf%f*6b,^&COH,3lo]Z;_eU[%_f`2!3S!Sc>i;Wu[R*YfrSac[ZmJd+in##s] +pOK1*+O8\kR +!r_`hn,ELhe>_R-rrW"Lhu*KYn##s]pOK1 +o`#97<\G:O4X3"D-:$qt$9c*o(m]V@+M\ibq#:`O(`7=e2F35Yj_#FWrr\3B0t?`Q+*&Q=3]j*< +/=B`[8/N0^-9,D#[(jGdSn8fV2DQd^lKJ6UZ5DG%\GuTP8OFMNi;WuZ7&^.9:%8/`hVJ22#3&q^ +s6pk4qYpWh+2n'V"8mZe+8u3?rQ5'=!Unb?rr_1?6-Sm!"iV='C5qKSrs%IgpAaV!?hOF#Kf&]% +rrW&]qsXOerNThXr;Qij+2n*W#3&q^s6pk4qYpWh+2mmQ!rD0YrVm, +o`"pirq?ZmqYgUEmrVlfjdJj=Jq#1!Vrseo#p\F^\ +qu6Egq"jpfpAYBrp\4LXp\OjQrsS_uq#(0lrV-3gqY]:O"oS2rs8Dcjrri>ts8MlmrrW)lqYpL! +q>UEorV-0crr`8sp\4[^#5eH#q=sm_rVloqqYpKqq>C6ls8E&oq="@`q#LBfrs&;us8W&lqYC-p +rqu`op\agd!<)ol!<) +o`#rsRh;J:NmJDp;'$eBiiMP0P>in3tkJEHk3rpB^gnqbqSrp]ps +aG,55]RmrbUV`%oc0k<*#hXoaR=Kjrh>HR<$bV"QfDkm4J]@>hbM`C(c'eS2fq&$?"R`DlnZ_ul% +K=>!X8i5!U\"Nchgi*3rso"lZ[dacNf^sSqko_/M>dGY_Q3_:rL_42rri)hNhH7 +o`#<:*?c7cB>fiY(a#sLrsQsf(`4B2:DeMN(s)LP$agg/.oPR/b.$iq)!:hur9aLek9mber:'^r +Rj/b=KcH*+=HG:RUu21Grs6+\*(:\^H,9=ArsOMt3k,.hcPr59G+ddn"f+Tcs11r%rrh7ps5n7u +rsepm*bPHPr)i1_s25atr;R9(eoV`Q-8IK7s7]nbYUKJM#*`T"k^;seKpjdrrDimrrg+s68?.@rtYHn\c;^,eoV`Q-8IK7r)i1_s25atr;R-$ +eoV`Q-8IK7s7lQm&&:.k0tdPdk;<4h>I4?MZMslS~> +o`#-pp\4O_qYC-b!VlW]rsSc!p\Omcp\4LYp\agd$iKbnqu?Zlr;ZfqpZDJUq!J+]q>pQjn,Ego +q"jd\rV?3`q=j^ao`"phrqQHd!W2l_rsSVrr;Zcmq#1-jrVPRR#6+Drs8Vrkqu6fqr;HEcrr39' +q>:!cs8W#prr3&rp\k'j!;lci!Vu]lrri/orqZEirseu%rVuoop\t3mrV63`n,EIfp\FR`s8;lr +!rDZiqu6m!q"ag`p\=^es8;lr"o\5qs8Mi\rrW,tqu6L9ls8;lr!rDZirVllprq?HhrVccr +r;Q^-rV6BlrqZToqYL*arr<#orr2qJ~> +o`#-\J;1;d\#0.T!K6./rsR2(J?J+;J:aM^JBdlh$eBiZ^\[E$ec5[+JEQq5plFhB"1#)hVsjWo +cAnreP2iBkV4)q*p%87dc]+9PrdY')_:tp5A&4qmW-nrrfCRieiis +rs87m^7E[Os2rgirrTWZgAV$U_M!GiRGn)Crrr=oWV!$grr3JnKAuq2[".KBs5B05P54VI"5A?r +r:p9mb1$@i!k*X5qu6o^Q__9sJW'F)rrLWprr3/UOmE&8R-ahYbO`T(J:O'Hr;Q]sb1$@i!k*X5 +rVm)=KReT@iV`]T!S#Eort*nHli6C?s8TI.`0K`is.o8cs*t~> +o`#-K(aF"?I9lgh!A)agrsPeC(i.W8(`cXD(o6s,$agfjMY?%EZN'sA)!Co"nhfb6"*88#?gn"' +VD;aA3QkYJ>Y#]+m.C;[V_CFnrYP\]O4N[t$SE9qs6Ob_b-UcPN8ad@mk)lcpj>g5rrcrAaso:J +rs7mmM+t&Ns.6CmrrRK`]`%j7O<>AW7`bH*rrr3u@d733rr3J\*QnE^Fr8s5s2d>t3V2b?"2,OE +q=ssjT!&(m!dY]rqu6oG6 +o`#9tp\t$`q>9p_r;#a[%K?,#qtTs`rVH9_q"Xgars&8mqu?Znrr2our:fCS!WDc\rri>qrqcN\ +rs/Jsp\Fa]p\Fg_!<2Qh$2XDkqYKs]p\4RPrsS_urr;ckrqZEeq"WhJ#5\,kq=jXZr;R3(q#1'e +qZ$Toq>Lup\k$is7ufpq"t$i#5S,qs8;Werr3)tp\4XTrri/qr;$?f +rrDoprrW2oq"t'rqY:$hs8McirVm6"rVuosq#:u +p\k$i'_qY,s8Mfms8W)ns8Mceq#: +o`#9jJa0IiVn.Sjb*hYs%I8W#a,#\efr]dTNfi)nrs/C\KuEu^eaNM;!nVu%kl1_EJGAU5"RLp0 +ZcDP7$d4WbS'6P9R"U!?o()efY(2P?W/$7\Kt73NrsQ\on+Vgdn>*@sMN?`r#-j2qSqMWbr;R>k +Q.W:kW;lnYRcO%+rr;hprr3)pLPc$/rrh`2l\FBrrs&J%ZHncMr;Q^#TmGQ#I]]Us8VS?_uBZDrfQ@Cs6l9Cs8VJPm/I:]b3e*YLYr(1!W&hq +rr`"NM>mJR"RX=sLYr(1(&j?Xs8VPRnGiOUQN-K-JsH!.s7WAhs*t~> +o`#9`)q]*H?\0JJT1//I%GMo;RO9_A\S;ru1,uuErs/3O+d;igZf:ua!k0$Ekl1_-)"I(p"Pb?Y +Fd_^u$_]F"8Y[CF6m!6_kOSW[CD\gP?m[??+b9LYrsOo*ipe^uj'$MI.Pp&`#&uAA:*:BJr;R>X +5.>F:@/p8O8BpUBu;02d;S/>'$rr[cg*6msP +"A6&0>iY\\!VU+(rr_a:.K',D#CA;Us8V+"P5bIhr&<%'s5H<(s8Uq@m/I:RTAINP-,oi_!VU+( +rr_a:.K'/E"Q#['-,oi_(&U# +oDejbrV6Qmrr)WZrs\l#q"Xgdq"X^`p\4R[rri,nq"t'hrrW)lroj@_rV,a["Sqrnp\jR\$i0Pn +qY0a\p\=^^qsj[mq"ja\qY9j[p\aIZ$iKbrqYpHhqY^Biqr@\^r;-0_qYgHmq>C7(qY9mdqtpEk +q>UEkr;ZfprVlfuqY0jarr`/orV6UBns8)*^s8;os!WMllrrN&rrr3&rp\Ogf"8hom +q#(-mr:p9k!Vu`os8Vous8)Kbrr2ouqu-KnJ,~> +o`#9nJ;0PfURK-gh3@=,%HW/(NoAi]Mm1BTJ@bURrrr:_Xcg6brVlrS +rsPKMZ)iM2WJ?DiQc/Ip$MoscJYof8Mh$E1mf*[>JASA\gS(t#ql%HorsASNXaubHg%aHqr;R>- +Lo(*d]`69Inc-2Is8UO1rr3&,J?&SJ"oZ<*jc09rs.8 +o`#9h(aM^T=@\S2_*%,b%F?"S1!%7!/9%7!(kVGWrrr-XC,pe*rVlqa)"$Pe!k]QQn,EMqMRa_R +n,Eeo(ij:/,[r&Oa$Q!hoD]0k3b'(7G;Lif*OY>8$`"W$B(*E5FfG+DPiViNpT80J5CL*4`D-:1 +&7[(mrJZI1V+]tNJuSeMXjd:L!d5DkrVm&uO@.AKrVca!Fr2'0jo,2a].rmV\JlBfrr3$k(l.S[ +#JX7 +o`#9tp\FRXqYpHkqYBOY$iKbqrqcBdrr2`fqY:'mrqH0crVm$"qtKjakl1\]q="=dr:p6hq!S.i +q"k!bq>0m`rqcBgnc&spq"jg`qY9m^p\jR\$iKf"rqlKerr)`irT*t\rqZ:$arr2unrr2uqrr3*!p\4O`rrrArq>UU?m!;lcq"9%ugqYpL$rV6-bs8W)oq=jjf"o8&qs8DlprrW/nrU'UhrV6Bls8;clrrDrqrr`5o +p\Omh"o\5lrquZkrrr5qs8W&qrr33$p\k*cq#:6l!;ZQmJ,~> +o`#9_J=21H[di>#\!ZR_$dsX3n#h>TmcpBoX8)\sl\'rGrVm#g\:B;)kl1\5SF?I]er/GAQi6FR% +/uTnmuO*AO2LFiJFN+/$K6iLR)H@hSXP5an,Eg?MuN.WQF-#@]VaK_jo5GTTRt\krrAqprt+IHN +VLi9rr3.t]`8#laSu2@gO\PTrs%YMpAb06\GZ@,` +W#l>g44m`rr3/\QDXAs\GZ@1UqHa-j2h6"#2=^lnq3+srr3&sS,WBdJ,~> +o`#9M(e#bqHKN>EI7*E%$`tFiibKWehq1^AB))B.g)hEMrVm#XIMa6lkl1[f9^hubZn9546Mp9P% +/iM'i\XJD1m-a7)!(5e$HOW@6^2dF9h6A9n,Efk/c=O]6$D&2KjDIijo5GJ;B<%?rr?C(rt*j$0 +^o$9Lj)qms7&8Ks8SA`rr]kM+a*ea"irr8n!eb(rr^%R3Q_0u%8O#)^a>`nkPtSZ*\R*RrrH$*r +r3*!RTJ2@rrA>`rr]kM+a*ea$HPILXoJFi93iD4rr3.)L&_1rRf< +o`#*op\4OarquNXrsJc"q"O[cs8;fjq=jmsq=jdbrr;urrV?3_kPkS[qX=Feq#(!bp[8%grVHQm +q>1*gqtp0WrsJPtr:p*cqt^$]rUBgqr:p6cqZ$TnrVcNeqrIbXqu$?k!;cZo#Q"2ns8VifqYpKq +r;6Kn&H)S.rqQL6eq#(0lq>L9l!rMclr;Zfq%/Bl#q#16frr<#tp\aL[!WMlkrrW2pqu6U0 +r;Zfrq"apbrVZKdr:g6krqZKlq#:9srqHEls82fq!r_limJd7cq#13l!Vu]lrt,,.s8MfhrqZNj +q=smfs7uWlrrrDrrr<#qrr33$p\Opeq#:6l!W;ims*t~> +o`#Jqa'hrsS7FM1W86r5m3WRJlp\%&8?ejluO.jPu_[Mu2`U#nG`i\W6:6ieAI`@K&cA#%F^EoN3N<\ceRK8U;?chrrKm_qu6])qYpL' +Y(>F/rI]X$r;Zf<\c2U?e,TI8MP'C/g@P*S_DGcP1,']s66!$regOOs7M$6s8Tt4s8V)4[I4%srlg8Urr3"p +hu*Kce,TI8MP'C/g +o`#$];\jlYlF`,`Vofs6Ulgs8S2Rs8U4cGjbS6rLtdWrr3"& +`Vf`IYQ+XY.oG>$];\jlYlF`,`VofIm2k?gs,cpRs2lO1s*d,orVlo'PPkH2~> +oD\pequ?KhpAk0[rsJc"p\k-krVuomq"F^pq=jaarVl`jqtKpLrrMrlnG`[hq"sj\qL^Hmqt^$arqH3_rr<#qqu?]oq!S1^qt^74 +q>1-krVuikq>^Kor;6Hms7lQiqYpNpqtpEnr;-Em"oJ?"r:g'[rrN#qrr*'!qtU!drVllmqu7$% +s8D`gs8W)rqu-Kn!;QKl!W;fnrsAT&s8;Wfs8W#rr;QforqueH~> +o`#'jK"LoRqg\\0mf*[YJ:ubYn_4$CO,s86rsP6IZ.mpqbaZ5"Rf;ON!MZgfrroop]Tn&:mf*[G +\B^Arg9\c8J:Q_MrsQr!R)?dtX3%*-UYu(M"1!]De,'(Pc[^PRs8V*-\,!D_jSo8=^&%a;f#@[h +n:J7Os6P9@rr2ouS)F;G$Jb[CNM61Jo>nl1rr3&tN;`_T(=]/Zp>nl1s8S&=_liP0s1H8Ls37_Grs$F>s3l_(rUp0s^>APUmG>L; +RcsbN!rS#Ur;R,Zs5f66q>^'-`8gjs!rS#UrVloCY5\G-`;KYaL91@RaS5W4!O_:ls*t~> +o`#'f*J=)cq\T=_mf*[F(a$Qnk.L]n1Gen%rsM7:Ek]'8UIp.b8,VTN!EO1/rrmg0L-?PImf*^' +I\oR8rrrCC-8ht*qu7&&(`7PurlVEloQI_)rrL/qqYpu3 +QN.!F*.e.ih&(/1rr3!j`r>uL_#Mb8>S_sQjI +_hL$>eGfILq(MXCrt*!GcnJJls65u9bPqPAq(MXDrrJp2rr3:gq>[TBC&@q!nGN:eGhi5sJ,~> +oD\jcq"j^bq!J(gqY0pdqYC0kr:g-`rsSf"p\=[cqu$Bfq#'@U!rhrjnc&gmp\=U^p\F7W%/p)$ +rV??fqY9m\p\s[^"Shihqu$Hj!rVfkrr3#uq>L$gq>Uuq=sjXrs&Dsp\4IZrVZZrrVHEk"9&)kqtL*krVHHl!W)fprri>u +q=sj]rrDuos*t~> +oD\lEQ\PBf!JpaCrsH2cbi,Uus8UQ"c1h5GidlWAeEaZgetA)Hkl1_TKXC:L#5!Y,XLs(]mf*^M +^")85_Rck0R"9hUnc'!nM6NJ`ago4*aarINrrMkbrI=p:lMUYifmpa8n_(=es7(rsjo5DHWrDkp +$N@0es2qDAs8Vf,r;Qebnc&OkfW0hDrV6BnkHb$c%/crQJ<-YUqZ$TLcMRV@"oGQVXj>D_rrKCn +q>Ua!]__Z\X,+Riq>UN`dI-u5"oc$Ds/k\frrr)3S<1_ho`#0paI.a8PHj!BrrM;gqu6fOX,+Ri +q#:BXZMa_'XmQ,f"nf^%ON%4orrLCDr;V9~> +oD\k466uFF!@Ia4rsO/kU<$tNs8K/@V#L/h$d'A)26bhcTX7WST'61Uk9"m;rs%a6-u"AP?gdq& +^5'#A7Z`191.)s!hXUURp*joOLn0'UPFNT7rr3#g:&Pn07G.P<$b7+.s5pn;OT+>j[H7Dif4FmV +rsSa>b5\)Gr;ZfbM>mJR!CQ#KrrfiE-]IrtrrLVjr;R3$>8\87@&ir#s1G3&rr3/rE?&_kXR?)h +ET6fo#lB>Ls0u\hN;NGN!oC$:rVm'!IY@`9hZ!NYm#F^sQMpIU#PslY+Wrje_YjE7e8tNe"Lr(l +N;NDM!Ru2grrHlkrr3/gN_;9rrV6BnV#C5kJ,~> +oD\mdqYL0b"T%lfqtoj^$N0Yoq"k!fq"OO]p\tX"p\4[bqYgBjs7lKTrrW,mq=4IhqtKm_p\4LO +rsSc"q"amaq>C6gp\aO\#5n5mrqlTlrqulnrr2otq#0phr;69frVm'!p\t-er;Q]sqtK4P!ri#p +l2Lb^JcEC_J,~> +oD\lBW3cJR"ba.2N4[*ursI8/U5ZSQc]*I+i:m6Zgjk+Ce#hZbci0-=kl1_,J>_r;#0)=W`IWQ7 +mf*[ +oD\k/@!)Ab"X%e%08#V[rsH"R<\AgbW%]&+`qTK@^_e6HYA27oVu8]-kl1^U(gun6#+-MhQ5^ZC +mf*Zf1-naQ6r9T;?l5a0rstnFKAD3@gV_(L +oDed`#5J#kqtKj_mf*Iep\Ophq#:!fqtC$tqtU!aqZ$Hlrr;chkl1_[qY0O[!r;clrq?Ehn,E[l +q"O^ap\Operq?EhnGa!tq>9scs8Vrps8)`ps8)Zf"8i,rq>L +oDef?#_@f$]YT>QcMI#0"g3BWs6u3NJ,m7UrsQl(S@c'(a7o<%OJ_7A"/DiHq""FhVUWeAJ:O]h +rs\%GJ^M\o[/IanJ:P,ursnIga-YTWqQ'>iW9jQaZi#=U\GapRrVm5VJC0h8s8VoRs/G/\!o8q" +JcDJEJ,~> +o`"pjrYPnY-VB,S,8d9Nn,EQ-(his13rTrrL%bNSROLm^Er)3nn*r;Bkl1`e@iOt/rruf7TH+jd +B(,a.d3fg4U)nOTM]ioSI.7.Gi(f\-^[q,2n,HeOs8I0=(^#6`Z!@8-$FUeQ8$W*ooZ@,Ck5PLu +1X^jSUAo`~> +o`#'kp\4IYrqccqqYBOY#l",nqt^!]p\=C\$MsMprVHNns8;Wgl2Lncq>0jboD]'pp\ssaq"X^S +rs8Mtp\=U`r;$-ep[8%ip\Fddqu?]qrVHNnr;63jq"O[[rVlrtp\Omh"TA>urV5XW"TA>rp\f[C +U&TW~> +o`#9=J:NKO\\lJCWh/VX$&"N2\Y"D6JrBX$rsGfZe(h4ps8UDt`p*L+ka]#1oCMteo7HUrZAOLA +n,Eg5Sq)d"gWPtEJ:NFMnG`slLS!Jd_ts/rk,IbJd/8CtJV]'!KDYZJ$ep32r;ZfTo&\Y_rp'Ld +kNfI.h1>U"s*t~> +o`#8d(`4Z&J!$28A5DXn$N;,.iI=]A2'"7Gp&>A2*j3;!h>dMR*gl3l"Op(f)!UYl#O!2o2018r +D"%B4OA?]GA\Oj+0c1`RnaQPfnKgrOd$"(mi6l)ks/Go5"WA^4PTKW!rsQOX@f$-)`ok[_-iE90 +"Ou.I,/Jj1U&TW~> +p&>Erp\4I^q=sd_rquZ]rr`8prV6Bd!rDZdo`#GmET`9N~> +p&>E#J:O!RVN.1`pW:&8rsA7HgQR/BL95ufo`#<6Q/g?js6RP@J=50WrreplZ@ME8rs-f2]98)W +nXJtH"IFYYeWp,a"+u2Xp$_nsXKnG_rOnrAqi9;.Rt-$QKX.\iR%9?'rr3>[JFig?_Y9nIc]IDk +"0mQNk(3Q*s*t~> +p&>D3(`5Tq?8>39n=5.!rs@j*^,d)U,\e/So`#;W50U2(s4iR#(e24(rrc))EuZKK1T' +k">(A"@>)!V(uORQJCW&Eo? +"*#MZdXhFks*t~> +p&G'f$2=;nq>'sgs82W[rrW/nq#:!iq"OO\o`#9qp\4[erqcQhp\F+S"oe8nrqH?^s8Viuq=jac +s7lT^rrW)mq>U*kq"ss_q!\5"rqQ9frqcKjrVQEis7c9_q=sg\p\Fd`rVlg(rV- +p&>DlV1>MVR@DP&s1+llrs@M5Oaqt7NIZQ)o`#< +p&>Cr>Spk%77sNYs+"2=rs?I\3#EJR0GkY'o`#;a(a7T4ggHt)(f0eirrq9sOOk>EoD](`02rj3 +rr5(8n,EH>5?.V!"?qNh*A$[Z)!O%AmbDl2j1:L_nG+=H.TJ0;(a;\n8^.26$H*eGrHLG'cLEl' +JcCE'J,~> +o`#9sp\4O[rr<#tp\F7W#lFDnp\Og_p\OL]$MjGps8;cns82QglMpn["982krUg*rrqHU*grp]q)rV6 +o`#9QJ:Or!p](9dJ>2K3#e?8(JZHkKJ?neH$DN14rmeRLqo+*3li.1dVPO$TJDg)"$0m,T['&he +oS1!Hrs.8FJUiTrigg!u!9iqP)!?h-aKt$HUp]*Brp,*/a6C4C[_CVuL$\g=$L<5kR=MU@s6lA` +JcCE'J,~> +o`#94(`7 +o`# +p&>I!_gm9PoDejEk+@=Fn,EZoJ;)+RP_b"XoD]00TC\u@h<;PsK&#\l#/l2Cer>3go`#3.SB&PG +YN`*Lmf*^AJ:XWJM2AI+J;_YDnc'F$N/6*8TYT^:rN6,"Q\!lST?t=Fl)0jGrsJ=IJ +p&>HtOr,$okl:XpdSM$Mn,EZ+(a>Js4XVB)oD]/N; +D:`DXrpTjqW#-F\Yp_#=8Jj%SlLFlkoIhQ"Yu?Y0Wr$Q2s$Ia;ePN6%mFP`2rr2p)k85%%ec4QL +i^9_ss+LE&~> +p&>-kp\4L_rrr>tqtTp^n,EXeq"sj`r:g0\rsJYtq>L?jq#16eqX"4erV60^q"a[\p&>Bup\F^c +qYp?ip\jR\%/BSmq=ja_q"ORXp\jX^(]=(*q>:0hqYpBgs8VrlrV?Efrr;ojr;HX&qtKmbs8Dcf +q=ji=s+LE&~> +p&>H8J:O-hrr(9 +n[@eaj+c^brsXd_k4L)e?%uOW;ln&WTC#8VY:&:J^=;p$H@U^m/Q48 +L8KO[JcCE'J,~> +p&>GX(`5mFr;*RELFsEZnG`de+u"s1P-c1?o)B&b,[8%[R3p2X+`H`I#JVi?,pl(uCA%T6ef@25 +k'GiobTkO(rsUA!?:>`DIP)Hc(`gK`rth[cP#-\^Y\;dM@/p7I@aAB#?17fn)5mH5$C;Sph>bkj +,@28-JcCE'J,~> +p&>I!r;$9jr;6?fqY0danG`akp\FRXq"O[UrsJPqrVl`hqY^Bgq!J(]rVlNoqYg3`rUp0sqtL$f +qu6HkqtTUZ$iKeop\FUYqtp0_rUBh&qtKscr;Q`qq=jacs8D`fp\F^`q=j^_rsAYurVufjq=s^\ +JcCB&J,~> +p&>H^c_&M^e\eW-W.C$&nG`aAJ=;"AP(:.7rsSadJD^(EKX]D0N0Wf1#j6kkL9'-mJD'Vq$+YZ4 +m`+^om_XkLrsR#8K864`J]GZkJD0Mm(:essjO*T!n#(]Fs8V,;Q%>aA\YOeQr;R)UJDU=SNgP`V +WIb)%s*t~> +p&>HIW)9DhZ]T3e?l:ffnG``q(e5Dc3>d> +oDejc"T&#lq>($dn,EC`r:^3fnc'!mp\Opeq"t'jqtKmQrs8Jqp\k!drqQ?^rsAGsqu6Nnrr2]j +n,EdoqYg9bqYg6bq=jaUrsJSrq>C-irVQKeq>L +oD],_PH;^%V4=Qd[.""pSG[m;Y4;N#VgtfG_26&%r5F2FqsOIiX+5c^\B"<0WqHB!qLlYpoZd.' +oT7>drsRScj/dd4kFdX"J?nbG%/QcNU"%$YfYP=hSG<*`#Fg;,l,]gBn,*+kc[bTHNS)I*MXc8t +KE$H~> +oD]+_3bagf>YJ[@G45G29DfV,D"7N6?Pm>MO!p+Wq3DjNq!S.fAf)E1I[]^lAbH'1ocT6Dl_O(< +l8>C+rsQP[b@h`,do.Sa(j#9J%/!dA#l^es^!3iqr`^V\nU@0Y!kp.cu<^ +KE$H~> +o`#$lp\4I^pB13fq>9[]#6";kq"OOZnG`pop\FX^s8Vukqu$3cn,E^kp\Ogcqu-Nhq=O[mq=spd +s8Droq!S.irV6-_qtg-dr:p$bo)B'nq=j^`rqZEdp\Fae!r_lkpAYBpp](*hqY0i;s+13#~> +o`#9ZJ:Nf6J;'5uTtg*s#MO`cO+;b_q!n@m^4;]C`q]JHNkEMb_!h:0^OWE9b.QTuO-oS>$)#$a-:UU"\k2\"eMJr;HWsgO[]Ers68gr3>OnJ[>*%s+:9$~> +o`#9D(`5:O(a2"kL +o`#9tp\FXZq#(!`p\XL\!WMlmpAk-[rsei!qZ$Toq"aphrV60enc&smp\FXZrVufnqYBd`#lFJo +s8;lpq>'IY#5n5lqY:!crqHNgr:9jorqQ9eqtg-_p\Xge!rDZip](9h"TSDpq##^CJc>`MJ,~> +o`#9`J>\uhO3b4kJAC^T#5411K7JWtn,Ej(J>rSKj,]i#s4r]sp@8.i[Xb9QK'30bc)@0)rs639 +T)[(.fVb;.rsR&$Wj%E4_NL%DJC=#g$M0=>jh7smJ:P91qu6`%K&l\+#+2:fb(u%uJcC<$!<7Q~> +o`#9O(gp,V1oPXL(l\"b#OaVi*Z-#krpg!urc]2grr:.t:uMAh1,eUlrsSgQ(ggPhe,QhO?qg4m +#_?M]s.o"j?VTtg$_eJLD_/8W3]K&8Xn)K!kqk3CLN?B2(khe`rrR-ZcM.>C6XKea-8:p?s+11M +s*t~> +o`"phrq?WorqZs+14M +s*t~> +o`#9>J:N +o`#8e(`4BZemK@mA:O1M#3J,e(`H`)nc'4"\kO#-p%s(Y=7uE==`tWSqXjdsia"--,AH +p&>$irq?]ss8D`ks8Mfko`"phrq?Hgrq$0irW<#oq#:!uqYU'^p\Xj_p\=[`p\=Xaq#:j%q=jgc +p\=^dqY^6gq"jX_#laSorr;utq>B[\$i0Spq"ag^qu6Ngq=O[frV6Bd"Shllq>L$e!r;Terqufn +#5\,hp\=L[JcC<$rVqB~> +p&>KNJq/R4s4`Onrp#Tpq=agmrlU"HJ4Gkd/CNc'#$ursAPnK;Rr6m/EO&mf*]_MR]"I\raYod$CR,p&>?TP_+O +p&>K+*>fs8P(d$IDrrrAaeuj$IrYQ8^KK9qeLQFD2/Zb-Q4atTQrVZQm% +]r>HT">mneC8W2R%u`Mp&>?lkoF'_s5!WHXR?)s6n<^R +pAY9pq=jX\qYpZqp\=a`rrN,qrq?HirU^$hqYp3qq>:*equ$BgqYpKorr)uqq"X^[rV6?cs7lWi +!;QHc!<2Ti#5n5lrqQ9amf*gqq#:-grV?ElqY:$bq"jmarrrAuq"OX_rV$ +pAY9aV1=*:rr2unrr3)CJhb3J:W?) +JUrN2MN3[LJ:WK4OI2W!J:N3$J;!Uers-r(Wq;RBV>BZ\&D*3;WSl^4ir?-@hP-(8\buC*%/J\j +Q[u*\Kn+]+Y5.bj!r9BZq1&O&[,-B6JcGZJJ,~> +pAY9T>SnOC`O?0@*8*@0k)4A+\[BVR"268C3/5'p\s+/jC^M,(`OM9 +)]9eG.l&e#(`=YL2+(+m(`4/.(a&/:rs,VGAEl?E>kRRc&@OgcA&cMqb5Z33_cAU5JGT3D%.q;f +65j:/+rD.;D"RE#!qUm_q%s/\G/Ah1JcGZJJ,~> +r;R'%r;61'Zs8W)`rs/N#qu$Bks8W)tqu6j!rVZTlrUKmj +rV?3_r:L"/rqu]kqu$?cqY^6fr;6Bfq=sd\p\4IZqYBs`q>L$lqYBm[q"t$[rs8W%qYBm[q"jo> +s+14Gs*t~> +r;R)ee[hTFQ'@]:]`,qd`4rpmZF%3NYGnLmQ&LKQJ;92U[c-cV!rh`^li.CmkKLiheaJj*U_+sa1]^9KsB"B^!FO.YbRMQP(87IX/r+p\!r!KJ-N*KJ:Nlr +j73-Un]8,+KnGJgeGOmtJcGTHJ,~> +r;R)RZ@Q7L5!2;FLAmVVPDb'?F*E4\D.7!M5;+?/(a_%3HHG^W!r_6Hli.Cle"`)&ZebZ[i8O)% +rVm-%hRL#'^!HTHrrgVI,Uo>WruL$kW1&L9Q6L=KOb]lrLN$<[83.S21hLE(@!kNcrYPiQ<>ZQ8 +K?Wlc$0@V$7Nrm2BsIJbs+14Hs*t~> +r;Qp!r;HWolMpn`RK!9aqY(*grV?3eq#pQnrVulqrs\o'q"XUXq"t!dqu$GEs+14+s*t~> +r;Qofbi%^Tli.%_nFi:M!P*m]J.7(/h4]RoUn+RMkPk/Prr3DtZ'U8uLR,Ho]>2qaJcC<$h>`!~> +r;QoXUW1gFli.%[jR8N:!Iu"rVZeGS\0rr3DiEC)#n,sZpSK8d(nJcC<$h>`!~> +JcGBBrVhBJJcEIaJ,~> +JcGBB"SD0MmeVM7JcELbJ,~> +JcGBB"RG((i:_a%JcELbJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +JcC<$JcDkPJ,~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/Pictures/dl7bj.eps b/Pictures/dl7bj.eps new file mode 100644 index 0000000..af89f3d --- /dev/null +++ b/Pictures/dl7bj.eps @@ -0,0 +1,901 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1,17 by Peter Kirchgessner +%%Title: dl7bj-cw-150x150.eps +%%CreationDate: Tue May 13 14:47:09 2014 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 165 165 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228346456694 14.173228346456694 translate +% Translate to begin of first scanline +0 149.98110236220472 translate +149.98110236220472 -149.98110236220472 scale +% Image geometry +150 150 8 +% Transformation matrix +[ 150 0 0 150 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 150 string def +/gstr 150 string def +/bstr 150 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 54957 ASCII Bytes +colorimage +li7"arr3R8!&hs3]=YJF]t:tjY).OSHg?([HiAEqKHE.&kC*AX&q,(aZFmi^;1--j]=khoD?1^N +jo9i~> +li7"arr3R8!!jbj+T>((@)\8(B,$M('P$,(&o$O'bhH*rZD4O(&T0W+VOhppZ;F*~> +li7"arr3L6!"(/%-6sfZ-RC&c,T[uh*X*Z-+9r>tk8sXF&fr,:,UXia%iH`A-7:)d'EB*Hjo9i~> +kPl(I'`jH4]=bh(+h#(rV0mUNI0Y.L +kPl%H'`]*o+!;^A"Wng/*#.TO!#GMJ!Yu7WrY5DKjV8:A*$?@I)AF89+!2UI!=c*ks*t~> +kPl(I'`]4#,pXiV"skTC+rqch*X3`.*ZlI<(Z?D?+!`-X-ls3Nr[%ao,QS@Tjo9i~> +kPl'F![P^r]Xtm4=N/%KH[L5>I/nZ[I0k:O=($K*I!g?km!TRqI=-BiI".m'^5 +kPl!D"U6(l+!;[3%jE,8']Bc-%M8OQ!#F]3%Mg!++;b2"+!DaL+p\0Xjo9i~> +kPl$E":$;#-71)H'.>1O*ZaAa"Wnd,*u,[k*WR;K*Y]V9*ZZ:C+!W'Z*!@E3-RL,e$34Pss*t~> +kl2+\6i_eR]=bbjR]4*-JGX`pI-Z4\HjP4T*B/IrI=$Bkm!Sq_I=(sA%siYs^UQU]]tM(l^P;eN +m,n=u~> +kl2([6i[uF+(?uV9'GVD]'a,I!*t&k_+9Wi(!'BQ0s*t~> +kl24_6i\,O,UFcb*?cdU*ZcFGrZ2%[l5g*L*Zt[s+6XaH+!(5""W\g6,n1dl-NthC)ZVtdk5Tr~> +kl2C8(B_7^]=YhBHc*RVI=$BiH[U.I27-WH[L6iI"$Kl[(Wo_]=Y_g +]=\@`^?5HG~> +kl1_%(]aIV#oXL$*u>Y-'bhGH(&nsL('Fp%(&o$Z'bh]2*ZlLI+!;[J!#E<2s*t~> +kl2(/(]Yg/,paoZ(apaTrZ2%[jrXOC"!7^V+8m5\*UOmL*?H7"*Y0>6+!`0Z-RL/d,pjr>(;Ar2 +J,~> +kl1^D!*T95#fT#'a/4B8I=(1+s*Xfo#_5oaI!pBjI=1F1!IT7nI1^gSI=$C*_QXof]=kkj]fZ:_ +k5Tr~> +kl2$M!"^:q+Wqp9%3Z_j'`]$5'`]$J'aPQb&Jc)s'bqGE'b1uo(a0q'+!;[J+<_'lRHFO"~> +kl1aE!"p[Y-3bn-&LSeF+T!2\+ +mJd1crr3)g8cY.U]*H!g(5BVeI!u!Al$X"gH@1'fJ6?E3I=-HkHgQ4lI"$KkH[U9hI=6[N`#ij4 +rO`5R!+trfs*t~> +mJd1crr3)g8cTb-+9s(o(EaP0'bo^D";V^e%hSXR!#Fr:";DRc()Hf_%2L!."VMt#+<_jA!+trf +s*t~> +mJd1crr3Ms8cTqY-6sod"WAa2+!)Hb*WR5[*WdDu)#PET+71-K+9!>]*WI/a+!`3>(+B,.!uM#M +p?2I+~> +l2M:Q#T^"[]XterHF'c*I=6M)I0P(II>&UqJ,XiWIK+["H[U:-_fB#!rO`6-!%[*ms*t~> +mJd1crr3Mf$NhCk+!;[M'cnD3'bqMG'aYWj'c$rY'bhAui"ZY<+VPD1+!2UK)uqMLkPp&~> +l2LnF$NqY$r[%as)'^@Jh];nC"q2RorZ2%]iZ8LO-P[:C,pt#e+TO%QkPp&~> +li.Rrs02Ps[_05b_01dPS:#[3I,]PWKblOqI,]P[I!pEjLpOLd_Z%1N];ukMf]W9b~> +l2Ljj!"9qJ+9Wi%)'KsU'a,9T#Se'1'a5Bq*uuOKrZD:`!s%!:s*t~> +l2M3t!"^J'-7(#V*%)pO*T.tA+9`2r*SqhG+XSKY-6si`-6WKlf]W9b~> +mJddts8W('!-c/h]Y)<3F1dEXHf]\UHjP4JI=Gd?H[U9hj*_JcI=6RDa +lMh=m=o]9Z+ +lMh@n>6#Kf,U=]c#Snd0*?a5\rtk_ViZ8^Q+!)IG*[E*<*[W0[-6s'$WrD5^J,~> +lMhCn'G$>@]tD%`&Z2mXH[U8'IK+[&I=$BlA8cmBI=6KlidD;`Q,5db`Orjq\mtebrVl']J,~> +lMhCn'`]'o+ +lMh@m'`f@%-RL,b"!]$2+!BG^"rJ:#*??1AjW4CDr>l@i-Opb:,pjl`'EE@Ukl6/~> +lMh=M!%Oq[]t:qnL:s:*I,B>SKblFlrI"Znja@\fI=-Et\;N5c]=YbjJcJ4:kl6/~> +lMgtC!!jSC+9Nc'+WK5P!u;"E(B"sJ']p/1'F,?e'c%o0#pT +lMgtC!!skK-3Y\C*@2sOrZ2%ZiZ81E"q)OO*WR5C*rd5k*ZZ:D-6!=@,pjub)?<2'kl6/~> +lMhB\!(4K5]tD+>HG#;cI=-G'I0k:LI>&UqJ:2injF.&Urd>3$YJ?j>]Y(khPnF?#kl6/~> +lMgpO!"AcJ!uMaq(]G-M()5jF#o46j('FmX'GVDD'`]$J'al'+*$6:F+ +lMhkq\i>rCL,psf]-7'ub*!$?Dkl6/~> +m/I7gs&&i0_u@:S_cSb.I=-HkI.MddHj5"HI=-HkI/SI"I!pBjH[f.-IXCs?!IT@qI/nZ_I/nZn +I11Fp]LmOe]XtkQ-NMi`s*t~> +lMgra!"pIS*sEbt$6Kuun.bp;r=o;Hp(dTC!=oe<(&o'K'`]$5'akp&%M^-1+ +lMgra!#-g[-3GV,$7>0^ru_4]!$1_R!Zr-or#Ph[rZ21a*ZcCFkT1*U,nLnA,pju]#6 +m/IOorrW^c^q@=n`B@S:H0fqZI/\NoHiAF&H@:3gI=6El?"JA2I=2$B!IK4kI/n`^I11Ih]gbN3 +]=bhb492PJs*t~> +lMh4o!Yun#+!;^6&0;PP'`]$K'`]$H'`]$J'`ejYrY5DIp([QAl4j[E+Uec'+ +lMpkd#TP3=-7:2N'.)Z[!$2"Z#Tt-0'c7r6*?G,#!$1&?$R$f+%Oi_O-R9*#XQ]\7~> +li.RS!#M`N]=bejT<5) +li.CN!!F;c+ +li.+F!!XSor?_Ug+X.rk*WR5Y*WR5[*XWo/+9i8s*uuCD+T +li.Qr!%,q%]XthYGdF&hI=-HkI.MalH[L3hI"$KkI/SKnHj5%IKcDt"IK"TpI=1j=!IfF^I1(A5 +^9k5Y]Y)*k!'ocJJ,~> +li.Qr!!XYj+!2UG'H\8.'c%N!(@r:@(B,!J(AegJ'G_G_('k'M'bqJu'bqGY(&o'8'ak]u+WhdK ++!;a>!(#iKJ,~> +li.Bm!!ao!-6ji^)'pFHm2l9L!Zi@(p`9qf*Zt[s+!)ID*Zc=C*ZuI$*WR;H*XX5A,:"T_,q'H- +60S?!~> +li.H:!(k2C]Xtk:.&WJ[I=1R5s*Xip'7>.SI=-HlJ:W<(JV/T0;e(K5KDgB-J:E&sI!pEjI-Q+h +GdaqVK>5(2_12k)s8M<`J,~> +li.B8!":%o+WqjD"s"QqmhGg('53d(AegJ'G_DJ'au-*%Mp62 ++<_O%'EA'ss*t~> +li.B8!"LA&,UFcW#9P*0l5g$J*Zc@$*r@#]+VYb9qB,SU!$18E$m[,1)^csZ-lN."s8M<`J,~> +li.&M!,9@M]EQ#m,Hm2VmsP1`rd>o +li.#L!"o2R"Wnj%"s+WH(&SgM'bUud$hOc2$P!^[(Ddi&kS447*Zkk&r?)1[!s&2^s*t~> +li.#L!#>J\s!@g`#9tDY*W[?(rZD._"WSHs'bLrR%fm+Jr=9/D&JQ!!+ +li.A;!LU[7]XtheZbDrs2?#R1A3q>^Ksq>^m(":#8@+[T@EKRSF +li.,4!#Zn%+9!Aa+!;Be'akcl((q,b"Te]*!!2rs!!2iprrE?+!sK#B&/H&I'al!(((q]4+!D[. +!7g?6J,~> +li.&2!$EZe-3>D=+71-L*s`u,(_$`Q"9JW#!!*-%q#CBqrW39/&/Q-+*Zs_i$R-r:(+1IV-6`Tn +e`m*a~> +m/IIP)$.Lb]Y1tjLQKCFI/nZnI4]ekBg+9[!!!''#RDM7@;:^aPa@lcs1%7WTSmJu=YpNm"p=r, +!"(JNF*E%[rI"ZnrI+]n&USqSI!g:1^V%%f]=bho+TS8$s*t~> +m/I4I)#tg&r?24X(a/Gc!#GMJrtGPI$4-e5!<3':!X0&H',MN(+YArYBu\7F)AsJ.#m(//!WE'' +!=0&H'bqM_'`\sF'akcl'bhDu)B^.E+!CP+!X8Y!l2Q8~> +m/I7J)#tp/-iPCn)]^=%*WR;W*rd5_)@[2YrW!i;!W`K;'G_].+!`V-s(fWs0-D5U(((*E! +m/II*&.-Fi]Xth]1Mt),I62h)I=?TlI=HchC.o':!"'Mf:hbTibKT7p_8!b!a6rHis8M#nhtm*: +da,7gHsT,`)$L!?*a*9#IX_6D!.=Zlrd5*:^mZpN]Y(r".fbIks*t~> +m/I1!&-=*U+TEMb#SSEY'a#3d'c-`_1):N8%0?M0!X&`:&/H<00:b9J+<_jh]uf13pmWLbgsWW( +0cCrF&.8[F!<<*'%h]QlneDNL+;tM*+WhgN#69YGs*t~> +m/II)&HO=--RC)c$5Fu`*WR;]*rdoIm!!!$'#S%Og,UbOC6mO'+-:,DhhuEJB.#Zs3[neq+ +*>fG!#6b,.!!j>Y*$-.D*Zc=#*WR;\*Xs,4+X\?<+!r<^.1$!3l2Q8~> +m/IH]#:d^)]Y(kW-\/i'I273YIt26&.g>tV2dV-'\'Dq-^UW;'`W!OM],nMmjT!iC\EX"7ioT(C +_8=13ZCcGL57.Au.S+?'Jc:$!I=-HirI#*%N52;:S%QAGa%-2 +m/I0U$3h^R+9Wc,#8JBQ'fcm8#64`)$4dd\&jRc\,Sm*R59(af+<;(.WW.;b'"7a5TW+>^,p=EU +*ubq+$N^;/#RqF]()@W#rY,>Jr"TSU+WL\*+ +m/IH]#mVk*-RU5c#9"r]*]G2[&IJR>!"9MW'H'@k+=\D+s$ItW-7'oT)6Ejf+;_Qd;PU=_>q.0L +.3ouP'+G!C!t,\Z+!:J'rZ1kW$Qpf@#9YB@-7KE)@-R]A~> +m/I0=!)pc5]E>a:Yd=1Ss*R1^ItD,_&c_nJ>)]W%aQhXSlefmqnGL,7]=beg]?pEC^UgrAs6.eG +nb9o3]t;"m_8N[FB-I +m/I0=":cUS*s<`/)]g*q(&o%/&-r@a[R@5cTs +1*%M\+WhdK*uP[q!!!-+%fR1G'GV>u(B"sU(*F\0*$?@G+V4Z6l2Q8~> +m/I0=";*']-3PVA+!`0,*rd]*ssAA'I"eK-RTQ.39gHn~> +m/IH"!+*LS]=khV?F@'5I8b`1+TqcF31[@c^:V,Ss8UI4s51Ybj8[E;]XRA.h#$L< +pqFAP]Xthl]XthgZ_LM$!! +m/I2p!"g@rrZD:a&0;ne'ep7'!<<*,)]g(E*[U(Ns(&tGPS2L:-QX +m/IH"!"gS*,psr]&L8Xs*\nfR#lt#+$QgW?-6k&*s8QfLs-FPPo.D:6,:"WTW;g9O-5b#(NqCN@s*t~> +mJdUn9`U3f]=bbhRj55FqL&WsD^YSc$;mn?rk(2"m/QC`^:_;^hR<+S\\$&5caq'dhn-M5\FTR/ +c.;.W_7RCn]ug<-]tCtj]YCgk-NX8M8:>m^I1*^*@nO>E]YC*A)>NLsJ,~> +mJd=f9`PtQr?)1\"s+f\'a>?X!!!'2*<%'2*u)Wm]H8^I2?/pQhshR*=D1q\4Pc>I+NLsJ,~> +mJdUn9`Q4^-RC)e*sX#;q&VjA#ljr,&L&SJ,UFAIs1Td8,<>dj(>nX)-!Y:o,XL:T-RL2VfCgFo +I(Jr-+snWa:]H%q-R:&c-6s<3!<<*4*ut+u$RR57%jWJK-QrL.q!.m0~> +mJdU\4ogtb]=bbhEBqCIr-\m%CdA.'*(d$K^AY])\,6!0]Xtbtr6_tJs5r55s8BFWs380g]t!b8 +n%ur\roCW%]tMJde\&T-]Y(kj_S^jU$igo>]Y:6F(#J6UJ,~> +mJd@U4ocHD+9!Ab'FQ'+r"V.+&dn^?"Ul@p+<_mN+;").%Nc`1:\eT4kP_HIj8\lgG5keh+!;0O +s2m,U5Q@Su*?ZIrs)]@^+<;OH+WqpC#Qau.%MTWl'G_Du*?c(%+<_mN*!$f2lMlA~> +mJd=T4ocZNr?_U^$mm:u*`*ps&-2b9%j35F-RU/d(\-f+,UFX7q.^W-rNDXMs7dOZs'[3#-Q(b@ +bW%[Qri%"c-RMOeGpFaa,pjrb-R]i>!WW?;*$H=D+!)IL-5['g-Nkb=!>XJVs*t~> +mJe'X0*&f"]Y(qiVj"s!I=$BmHqP4T(LNuZ^AGPk\,?$1]Xl;XjLVi!nFcY5eCD.Qhnd"=]Xl_U +lhgJIo]- +mJe*X0*!.<+ +mJe$W/c[7F,pjrb+WVpU*ZZ:D*YAPU";E"-qBdX-o]m8>+B[?r+r0puhX?MJGTKeP2('au*eLB. +o]ao^X=$7\+]&,X-2Jr+-R^>[%KZV9(*=V=*ZcRR*totJ-RL5A&B*l6J,~> +mJd=2*WWmcrk&cRB:$H0I!pZ]-3+$BS\Dl7]G.mSpUI`HptETs\E(NFaM#-q]t:iP]FMWnio/\6 +^ruAn_TMo,]DK5S]=bbg^pf4S!"(Z1J9uX=]toiCrk&?R*"94>s*t~> +mJd70*ru0\%2'O$)\j)'&dJC:%N6Mi+T!60')1N")(+['2]W[21d=DT)As\<)'0nC+WqpQ5Fn=' +8M+!!:GbfGBc['mrZE"#+ +mJe!E*WRQ5,pt#d'd"eI+ +mJe'5$m*'p]=bhh,(.>(I="Nm!">1(]Xthh]DK5i])D07Rd(B.e)83\p]=bhgAcMfPDLd/1^oA*[]Y1tu1'E?ss*t~> +mJd?u%Kmmt+9!Ap#8JC$'bq,X!!4#[+ +mJe*6%L"1*,pt&c"rSg8*ZYgp!!=8g,pjud,q&X<(aU:!i!t_6\K`IK-7pMi,UXrd-mpAj,q&[=% +OWPQ/1Mtl5*>7$XoE,]q^*4--RL/c-7:,S!!!3A+!)XQ+p9/<-RL8K#);FCJ,~> +mJe$*"!YIk]Y1qj#b&T*Hn> +mJd6j"pOoI&Kq/o+W;%!!!!HN+!;[J+ +mJd9j"pQIR-5%U++"&?U$NL/;-RL,e-6src-2f.s,prE=A,k@:-7&R:*@;mI*@D7$%O)8d%3ci5 +)C6^U-6srb(okUTg/]Kr-35A>r?_t$,pjc=!!!ZR+snZ@+oWej-k?H4lMlA~> +mJdrh!)L8?]=begOhADa&c`f!_7[Io]Y"0U!5&3B.D*@or7n`pZDY'a=[fhM)aq5_FcXJXM; +mJd6T!"JoMruVOi(a't;!rrK@+oWSf+!;[J+!CM(.30i5oSX)!*ZQ7<%gsHb":H7c'Gqo0'G_`& +$3h@]%M^'+*$H%5MG#]#+9*G`+oNMs+!;[J%KQPC)^-C6)B^.E+V=cmlMlA~> +mJd +mJd9H!(jm&]F_]j\T\>[7@_6/]=bbg]Y1rS]I:D/qUiBdB0J\dFa0Ija2l95_SX.%_Ss@(_T'[3 +Uj-LSDF%X;VRs_<]`5SQ]Xthh^:R2B!)9i9Vm-05"2]$X;X4:4~> +mJd +mJd9G!"UFU,n_OM-70N1!"C%u-RL,d-7'ub-2])=,<=b"(*sY(%O2f,+=/Ea.4-Gj-RC&e-RL2h +-mp/S'-e5$&gSY?+XHn2)CHjX,U=]`,pXf`,nBtU%O3>G,:"W`-5QY[lMlA~> +mf*jnDuaXc]=bbg]Y.n[!(XN6rk(>)]Y(qi]Y1tj]tD(s_i[PRTo"Ai]YM=r^r4+&aNDQ<\Yl@A +_T'U/^;.V%^9*EL^+LdDZH0tu]Y(lU]E#SC]G8&k]=bhoIj>L(7_) +mf*moDZCFn+ +mf*moDu^V!,pjrb-79K.!"L;&,lT+i-3>P@-2o5O-R:#c/OB[N+<2=C-7:,e-RL2f-RgJk,p=K\ +-mpAh-RL2f-R0WN-OC%m,:Fre-7'uc-RU5f,piI9#q$Vs!rrfY&K)tq-3G:h8,_cRJ,~> +mf*FbDZFsork&ZO^L.$DNcMqI]"G\fr4G#$]XtklY\((EDlC7]]tM1t_nC\5?a:=M*h>+h#``[S +5cUrX^V.@q]tM(ZH"Em,@BI>Y]=khirk/6B'>;#i^9%X9%KK;,\%KAc^Q&:Vmd'n'~> +mf*FbE<$[rrZ;Ii+V=\T(_e,9+ +mf*IcDu^\#./kP&-PQO\*#9hI,pjla-R\j>-7'ud-R0?O&JZK:-R:&c-7C2\()%ts!#neF0-71#c-RC#b,UOiar[&.#!?hRG%j<8G-RC)\!'K]8s*t~> +mf,Z?63)5B]=YbkD#afmNip+/]Xteg]=Ybh]tM(g]Pn!OZG+#b]XYAZHTsI#BOQA!`Pp +mf*FU63%]CrZDUm'*&%K(EFY@+!;[JrZD1arZE!u+VOke*[)XK+WhgK'aY0h'bq]8.P+a$?jpCM +3>j(\"9KJZ)B^.#+:B>)"pGq_+!DaK+ +mf*g`63%lN-71)g'`\:R*?um.-3YY@-RC,frZq[`!>-S)r[&(#-7'H9$7?T+*\9$"?N"ICARmtG +-l`Bl*ZZ=#-4M=L-kupi*ZQIP-70ucr?`1(-6sob,pX?.!"^G%-RC,c!'BT6s*t~> +mf,!,6i`(V]Y1pk!!Eh".q-9-]t:ni]=Y_h^U9+fN39J*^;%@mK/sabOc6`qn+?MUp&?]DnAEUm +(bVP:Q);(*_oKih/fT,N]Y;(m]=bhh]Y1qp@s+j`%01%X]Y(kl!%67]s*t~> +mf*CT6i\)&+:&S[! +mf,!,6i\2P,UOcN!!*0B#o+a5-7'ub-71#b-6jN?)^6OT,q(&d)$p +mf*s`2#sSk^qjjf#\$9!)5P!Z]XtfT]HG(qM5*XWY.h]eVLV[3H>p1Rr;Zfpe]bP(WiMYIMOCRF +X"gp+l1b5XrU.MF=uAjCQEJ0<^VQ+uRTZ8p]=bei]=Y_g`DT"8R=l"W`4N[p^AoP*li2J~> +mf*j]2#nX>+WqEu!Y>b[" +mf*d[2#ndI-79Q/!>Gtd" +mf+Tj)$"T,O-LgfICuPlR_?>F]Xtkh]tJ_5>.:uV^;d+PDGcAGqYpL!bBd)M*u>4Z!<*'U!Xg&( +3b!fdn,N=Rd]foI)ct"u_S +mf*aR(]Y0a)&`YY'd"D=)Z1]`+WqpN'Eo!g+Tj;`u6@$iU2*!<*-@":QA- +3b!iho`+$pQWY%'!=p=t+<_jJ%Kd[prZDjr+WqmN)%du*)@-<]+WqmN"!PkRs*t~> +mf,'"(]Y?j*?GFc)C6OQ+!i6[-7'rb-79T6'I4tP-R^/^$kmH`gA:jLbBm/O+W:ak!s8E$rWXAH +$m78b@YW+ts5qLn>oNhH<"S-7'lL"X>HD-2o5',UFfY'IO\:#lktm-7'o?+j93OJ,~> +mf*aV,le/U$4?hn\l3^#EW*QM]+2Qb[Uk-#]>2:S,RT+Tnc&Oj_K[44rW!L'A:^ADSt2FDK4AD% +B0@aXrW!]B'gp(Bs8DZKTm`k#I_EA+\#Zt_S\kB<&\PfiZ^n[-A6Jt@a2#R3+q(^Bs*t~> +mf+`r,ldrH!Wi?.+:])$'HnS@+WqmN++T_cVZKqO@~> +mf*@K,lmlF+ohut&JuB$-R:#d-71)c,o%=C,pt)_#QPs,l2(G[_K[44rW"*"7TjYJCi+'.>Xq4O +81P\i!!!'/'LU"Bs7YKX6P(7F)#bid-R'f@+=AN8,l]2$+s/'B'+t9Y-mpAj"V.j(s*t~> +mf*apZQK;O!s&C<]H<)D>5c&Q]Xi\%F2>N&[s<%lB=mm:q9ERY!!*9OT]Yk8n+lDMmkO>%o\[&i +5n="s*fTUds8W&PN?)-6\%B8gD%M04]Y(qj_4:SJF\d\l-A,)G.L$ +mf*apZQ0#I!W`96+U&\o&,m[m+!DaB!>Qb#+;DSa_!$7*gr;ZfjN$elA+~> +mf+s;ZQ0#I!W`9:-O1V(&gekN,pjrW!Z!.1-R9KE,9'S1rV=`N$31&/*,hOOWMc]lVu3LnW@t +nc&Ugrr4IT+;n'[,644G0=5VO]Y)"fV4TT5_7QJG6RS&=o(q+%(]XOZ98DF'oC)28%IW]TpA+9F +4;InsAA.%&rtb+QSf +nc&Ugrr4FM&d^rt*WR*$#Tj]r+WqpL*#f/%+6F)#sXT4)2"B_=,#G]=bns`kcjP +&HDf@^#T+l*i)IU!>HRt+WM@<(a'tD+WLM-*ul=&!!!$%"TT:Orr2utn,In~> +nc&Ugrr4US'*p`e)ZUs,#p^9+,pjuc+o4m#cLQK!>d".-6rL2s!84(-6E79,9eH8!!!$$"994OrVllsnGe"~> +mf+]T-P]H`p9%g5!#]4,fD#"-rTsROo'A$smd9B/p@GnB +2uiq5L!9Ssr9'>3R%;"-`/6fK]X+i +mf+]P)[/H"8/VFK*#p+B*?cRD%1s^,+rh+"(`Zkgo<_p8!#&(JX2VuirO`-Bn@\e5s1Bu%_3JF[ +!!"a-bl@_7X\fZE)^-=I(CLZp+!)C8+W:t9"TT)_0/OFEEVoe9rr2EeJ,~> +mf+]P)[/2h5SjMG+<`*V+t+]W%hg6:-R'-1*?nt$o<_p8!"hV1Q`[BgrMBRjm%tArX+OG"!!"a- +bl@_7YZ)8Q+9!W&)[m0&,pFKK-6EsM"oo,Z.5)>7Er55'J,~> +nc(3?s2cQ!94:db$nS]!8'$lPLbS^qPpdY#56F>[:WC.1;[4s*t~> +nc(*iX4&A@#$jRje$mHPq%N?)q*[)RF'akF=[cNlC$iglVVSpEd]t<@<+i(pnN)Bi[+^2V[ +s6mL#"UH.l+<;4<#m:SX+W1S,%KIOK9ES02!1*!OJ,~> +nc(-=s2>iW1e0\[$OJ'n%O`>*&K_l,,UXl^)@R6O\E0)E$igfGPHCpaVP^9jV?!I]VZ3J=VPg;g +WiMA27Kic8>JC.;n%2j1#U:ZD,8_R2":QY)*=3r%!#bc("%sI2QgFa&~> +o)Bj3s2Z)i1,9g_.f`G]0PJD4?lmV;np@7,u!!!?d_Z0Z7j`j&4_S*XoX/N&3]VeZ.IK1Bn=]o'.*"0mUs*t~> +nGa*?%0@b!%L!mV%Nl&j+s.@+)#bWa'Ef'b2mW4Y0a@UW#6PG`FK3Bs^AbbI^:V%ko"5";^&,Gj +]thP$ZRPqT$9?$(s7aA`![/^/+ +nGaQK%0@Un$j7LN&17_u-mTH<*[E!Y(]tQq4gb!a0a@UW#6G;XB:#j&W;`XoVuEOnV=^W'Vl6Mi +VPg8eVP^>oWLP46!"(a(s8Vl21'B$(-5%OG+t"W[&0`"m'h(GV7QLqX`pNeV~> +nc&^5)\*AW%2C6_!,'&jU;"7R]tC\PR5:DQhu;@hp&GF6C:UBFN!$Fa(5nasdmf.e~> +nc&X0%f?;A)*S$4+;>h=+RCTrA]"#8@F%IGL +!":Ecq#CAo/.!==+ +nc&X0%f?;A'fH%,-PmpQ,psra,U+99+>B)Ygc+p,#7aCUU8"Q@TDkYYV@9ATLnpoEUnXT@AjIC8 +!!!'!!$3]!q#:;r/digL-7:,f,UXoc-QW7!4[MIo5:m$Cg$\lj~> +o)BZa1Ctfg*XO&q1B;X:KsAA*^:g4&.BUtLq!Wt,!!bd"36TLs,&hKY._Q^]=bBoQbi_49O(dp&2kpG3:627J,~> +o)BZ`-j(;8&HEJ:.KC/*(EO\A+Wq^3"X$9WkP0f$!!b6TLo7&;4*?ZLI+ +o)B3R-NY,5&HEG0-3+f/)C#/.#pg`("t*&gkP0f$!!b*--j3^s>H.=n#c!#?IT2V@7O7[-+9ViJ +0YQ]Mo7&;8+t"]`-70oB+".*s2a]ng![AK]/aVs+J,~> +oD^30MK"s%[P8V">:0E%a!cSZ[Ypf4?bG=ss.;+J$t!@E>$=N^/.r$_!"T)1!)K+&+fAi2mHs9- +mHji>#OM)<."7pHP4el$*'72HO(/_$5+M$?kh8U:VS0g_W[s^T'F.'3>$ +oD^30KP-IcZm?)K8g+6U*sWT+*u>n2#rRn@s.V@N#Xh$E5X.+W+:SAM!"8l.!'YcF)h^qo]t:uW +]E#YE]EZ5g+(TsNFSu1>!W)j.'Il:IAOZt+5Fh3BjFe-O)ZCi`*XEZ,!s^gb8d647!<<+!n*p@-~> +oD^3/K4^:aZR,uB65otK,mYD;,TIsE$Tj[Ks.M7L#*!u`F!"&`,!&nd.(Ni0>Vu3D! +Vkp8eX'Q`IE[#/i!$i1'2G74;#QR)Zn,ML*'+5s0-79uD+=73q1.";p(]XR:!*&FVs*t~> +oD]m-kPtSI/eUf^=s=E[d;1J2.OKtiht-ll7g&f\RaM)^#KOTbT9Oe%)>jI<^`bsTE7=gQ%IWTL +mdBH1edcVk5HY[r!%8L[AX01,d*U+^Vc<]s4K8A\[p4 +oD]p.k5YJH+p:##8K82);$dFH#6k_bK[]tG7g/lIDNg=aPm<>)IW9()3thGk"dg5a;-Kpq]F)9` +]YCHR=ar2a%f-/R%m3BtG(l0EP)siL!!#-\s8TT;)A +oD^<9kPtSI+p0\i5o0rp=:5?V#R1tpLt2OM7g8rE@=s5eKnOo#E+E6M1_9Ka(5_oP2*bJ_GCtNuIq^b?!'I7\s0uJZ(E+26)'^I8!A-Z,-nPQA'*&#tnGe"~> +n,F:$&gCC\>9XKfs5:/`NMk>$s8R3R!$.EDbPKB]b7Dh>_n3L#/.DSi>tlhm_X7?j!:BaO#5E.M +;2o6gquA5p@[t'J`QZNKb0%iKbf,\Z!!HU+s7Pu^.P#;M]=U]95$gVe(D7;9T3fn6s*t~> +oD\girr3l2!Ye*s8fS8Qpn]PW&f5rXrr7'P!"s++OSY"QOHGWcMM-[\*shpC90OS-S%ZJJ]Y"-T +#/aP@5]9Ofqu?p?7;mm;Midmu+HVYGMeK +n,F:"!td^`65L*EpS]hc(ES.hrr7'P!"`LaJGOcpJ.[9XF`p:q#674\2]bhPVPU2gr2'\#:IdBR +83?_L#oPm9G'\OdIt*%KIia,f=q(H7?2aftic5#%'dk=P$Ni%N0)u7\!Sa&Cc1(a`~> +n,F7(D@9!?>9XHds8W&WiVbfg".!m/U,rlP5_rlPD[7L&o#^Ae-Cr7/Kn^"Hut5[YB<&e5(lmJh\~> +n,F4&A,nS^8fS5Ms8VhcQK\AF`?tWfK>*ZHNrY:=NsUo1Ncn$\D`(+Rpq.'W'6Gs9Ae"nN2e%i0 +OSt4ANfT5"NsUi-O-,8U"oo"Err3MoB-&9?G\$k3:C."(!!%*-s*t~> +n,F7'AH4MR6Q-BEs8VheRHabJ_^>EdG-$FIpjW?rIt%BH-\-etBgRM`/jY5iVP^2eV5:&dYn:V! +;d'S3$8P_5IXlotJU`,uIf=g'IXcp!GqT=$$GQN>&*n!W-R=+M!%pbI!!E9%EUEdV~> +mf*O@"Yj(]0`[X>rsA(f3rf[jeGnaXrlPJfb0%fIai_a)aoKQ^ap62Zna +mf*O?!$Y!-.0,e6rsA.h49,[[\)=ocrf7&@rf72DNfT9aqMu#H\A5h=]YD+m]tD&X]F2HT2gT+h +F_#igQ';0-"ceY)NfT4tNuFdr];@Ij!+Xd\s8UiNdf3eW2D>+YYs8`ukjJJ$~> +mf*O?!$4Bl,ljA2rsA.h49,XTVTc)qqgTuBIt3#uJ:E&tIt3$!JYK0BI& +oD\girVmc6>7a\98,t`PcHj@h63&-.\GuU'le0D$cMPs'daQXndaQOab0%f[mHsQ5m-X0,mI'u@ +'("l?o_%hFeBQ(Wb0e\ddaQXmrm(eqcHjbXaQWU&#*qOT,''jTrr3B$0EOTc#Isg6^1_]Xs*t~> +oD\girVmc6;#s!U3WM7BcHa:f63%rrS_r5O^S?gKOo(=BPl-dHOoCCJNMa>#^qICo]Y"'R$b3CX +_nj*TOcGK`Pl-dHQMZjUOcPI7h:pfBJ2[HPEN\a/rsSTU!B(Pj[/^0;?>T'0J,~> +oD\girVmc5:]NRD1]TVVZXcn3^K)L<&JqNuS%#'7\It)m0VP^DlVPj +nc('8Rp9&h"ZTag.KBbt+;Oq`P19(&rVZWiki:s%MN!LRNJDC`An>R_VZ+^>ajo_Sloa\%m-X3, +m-X6-m-W`Sai_cQH=^]"AnG\9N/WaTO0d0Sir8lRrVu/U,le?8A;#Y&!YRO)8FBMU>!oI\s*t~> +nc'X,Rp9&b!%CQ2+ohrm+Vk%^I^RMYg"=s+]#%V:pPDup&rn%tBa,1r=$p%pOKg>bN/-%g#<`*$fX7$"<~> +oD^?>s8/9j=@N996pD^m$6^T1!!I>>^!"F7`keXLUgmJ.=B8R)76a(&5h +Q\#-c.tpY]5=%M!6!@Dn=BSgJK79N7`Pfa=[XB(p$p%pOKg>eM-3-0r<`*$fWp]n;~> +nc';9#ljr/$k?';=@">\,Ua79qZ$NkrqlorrVpL:r!EH2"oSQ1!>WDmb/iE*m-aK3#jq'8ai_`T +I16)X!X/]0q[*EBKuiTWr!r\V,Qe#H!s8N.748CS*rQ'>-Jn4kJ,~> +nc';9#ljr-!!#>X8MqS3*?YM\f@eg.rn.G+f\KU5r!*6,"T8E/!=ssHO,U$L]Y!dJs1JW4OH5Kh +=:"d+qZd<;?Au\Rg"?8V!OrsF!<3-*!!PD%!+R,L!!+G'n,In~> +nc'SA#ljr-!!##G5qj;s)]f/O`5]d8`l5p8`Q1gYqZ[Q5!WiK+!=a:'IsmTYVP^3^V?3ZoP5]q4 +Kh_mP!r`<$#7h"E"qXa\YK+W#`l?!;W##@4#Qk20"u-knA01[L!@H[ls*t~> +o)Bf`.f_Fq+9i8j=BSj5>ZtDX55Y9UrVcZlrprha!Wh +OV%a$rWN9'r;d0*"U"f*HLC_/rr!T0s1BC!/h&V11g*?_#64`/1.qZQMXURq~> +o)B*L.f_+^)uosE8kVeU9,()9/CrG)f\"m/g!E%c!:3MPI8*n]F;KYP)k`< +$O$_<"U5&,!=/`1"98F%`7ioDfF6BfS.6D_+Y+oi8N6kP!!NQX5QV.In,In~> +o)B$J.f^tU)?9aB5lF(M6k^4__o0L4`l>s:^H2Dr"pY>:"TnW'#6P/2&:8t\T^\feV5Tl6It:i4 +"U5,7"oJB*!X8c-!)0`u`rF!d`6+,M'ce;C+sfQ2"9&9("XcD6#)_mLJ,~> +o`$WEs3N(mb5^d9)@/$&>?b66?8)rgqu$Ekr;>_a!#T,;s4u8A3&W]S3Ig%A#U.COrp0[RmIKTO +n(>aX&h3GPdFl<'r\l#X>1K`<"osAFrr)fnr;X)B.Q:74?=-ek$NLDl^&S*<"b6"@J,~> +o)B?L-31.3a]&uT+A>C"91qu&"53Y*(tmN\:]M>?pAa72a"/_l/1uA +o)BBM-30Ud\4mY;*(3+[6UO9_!6)nU`>ch8Zq167@.sWck0#%r,9nL]o8a4nJX`R7V5<^Z0r^4_ +BF-3Zs5E7d1En%i+].706O*U)]#Ve/`l?/X$Q16O779R1*rl9F/ +o)Ag?-NLp\rsZeJ$:S6)9M]%]!p'@[r#>P,D?(Qos8W&>Zu[fU1GgtMai\B!B(PBWmd9W4!:KjR ++P&CW`W,tLOBjb#1c6\=`Q?2I$35;MrVZWls,n!L3*?/a"Aog4,a&'*rriCSn,In~> +o)BBO-NKsuhW(M)!&[GC4[2au!5dFgfG`Gk?iV(as8W&D]5]#D-n6a0e'r78;8KoW]CN/4`E*8jELZ++;r'g?8YCK(&_i~> +o)CDl-NKFSb0ZMA!&$`-2E+,W!3sP_`Pfd2=9'5Ys8W)I^Mb#6+sJ:qf\1?G8#rM`nYR5&V5C/O +*t?3hs2L4%,9\6U'TCMmf7FA1?-E2c"jCcb+=9AQ645dV!$$""c,eB;"bQ4CJ,~> +o)B]B'`c8Ff)PdB?kH=C6Q&0d%AEh#r;HQib_F/)s$qao]ueLm-X0$ +!/CLQ&(dJWnVs*"l.1I58L>VQ75`rH)/g&EB!?gn#F~> +o)BB:('(A\\)-&j8d%IS2%)0)!/05-fEBd/3=u/grt;S*/LW%r,[oBakNugp[Cs5c]C3B6[/c!] +ru09=+Xnfg+A'f5hXJMl=0gH0f[nd8?N;Q(1&afR+TNmihVlekiZJ5.n,In~> +o`#[*s1B'HS%Y`DbeHRJ3^kY-/NEfVb5T?``l"E*&cM_/&$J8H+sSsV4[gD +s8W&G.N'BR,8`eoiSsCJ$r3Vr`>$Qu!$WO:6UO6_!$duUc+^7)*WTR9s*t~> +o`#[*s0<%5q1/Q>lMoa"/Ql3^%kA-9s8Diuqu-5;K`:u\ok5a+0.Klfrqucqo@O!.!q,FBo]ueN +m-a6,fCo4D.K$P;/hS\\h#.*KpLU>qrVcZlrVcb1%l+qZ?!C>;/&qSgJJC$/70$*Os*t~> +o`$!3s0E.7eSbIRa4n9P+%]!'!?;)Jhq?]7f@\d*CPMig&bB?M+sS1$mJm.as6chs]Y(lG]J7%2 +] +o`$ZFs0<(6_did/[E#Bm*'ljj!>kf>bf7Z@`Poj4@#"^\s7BP3*$#eali6q_s6Q#IV=18bV5C)c +U@S<`.K$8!*#fhngAV!Lq-S]e`l5p:`l67t!$;Ii6pa$:)4JRlAJ$?$2#pG@s*t~> +o)BH1%06Fh/cYmns.p2t=Vhbg$:Y!nr;QZpquZoFj8Ju^a-iI!rr;usrrDTdm/QMOliZYAmd9i: +!U]RXrrg`AS>uA`rrrAEe+rq?rVRE/m8"Q8%lRa!*#"A4pFZFGO8hZL:@J45~> +o)BH1%05/#-ia7LgPPtk9*b_.!&NZffDaG&f)jd7gAV$S`g)mgrr2p"rr:3Rqn)p@r4E-F]XtfN +]E$U^rrgW:R&B`Yru_0PVU3rIf@\d.g<;Vc#luDJ9b%>Lim]=U!.*ci!)E"_J,~> +o)BK2%04GS,QIh:aaF.F63mc$!%lO9`Q%nr"2r?Xg&:pR`0$7\rqucs];5A%!2odms.o^np8.ke +bP_Afba4Wkp](9lqmDX$`Pod7`l,m.2@'Qh,"4s1"Dc +o)BDb!#5Fm.@*U,`:cn><[:)I8dtaurqlcnrqls"rVQHgqu-O!r;6EhqtB@Lm/QJJlj<(Gm-X35 +qu$?grVm6&qu$9\nEp,Or;6Hk($\Bu*"P#9*=Xe#oK!\e/Y)iW!&j*2s*t~> +o`#g.s,R-mg;G4Z4TMJ13X8(g0qU?(gtLE6fDaD0g"b9Bn+-&Cq>0mbncJ=7\a-m3]tD"k]\WPW% +JKVnq"+(Ima&PXe_&RRfG<2]2ZO9f-r(6P,1t6s&;_]gj]hdCkj\V&~> +o)C"s!"d2V+D6J%1&q^`,=N%A+ND)H%XB1Cd8L$&kOAM%~> +oD]U'GQ:23Zk:4B7jmt="t;GRcLtMfs8;iorqlfqq#0LYm/?5Mm/H;NmJ?/LmJcJPmec>NmJcGP +mJZAPlg4W:!:'RL!:'RL+7/Clqu-Hkr;?QE1_?_n3B[u^P5fqE^[>6"pn.U9fC8fj~> +oD]R&GQ9kYRgtn"3[3!N!#d3tYL?(Gh#,h(f`BaNrjMm;qR6L8\bWl<]Crl;^&GYE^&GYH\[T&X +qR?L7+M,1te_&L+g"=s2[3>X5!%BN&!. +oD]p0G5sVAN=1Q>1EO>*!#QsmT>3abai26=`Poj:`Q#IfTDtS`TDtPdT:hpVm\Tu^rh][nrh][i +r1F%^rLb@.TVSH^_SsI4`Q#m;VB5hj!$iup!--Fr%u7&H4i)OH.b=+hJ,~> +oD]Wrqs4@On+l;MmeQ2S +mHj6,mI'?-rTsUQrTjRPqtp:,rl#m:TEcqf$39JF*hE)o_41)L!#N? +oD]Tq^&GYE^&G\C +]DT;_^=Cohf\+m0g8,9/L]AA(!!(3P)LTN +oD]p%s9`l5p:`5]FfV?!OkV?!OhV?!I^V?!OnV?!OjV?Wrq +VPU/f_Yh@h`lFAR-@>e1%0-C>W>KNUVhfH/VuR[KnGe"~> +oD]os63*VUq!%:H;[#+?&IB![%$pYdr;?Nkr;HTlqu#mZlicbDm-a9/liQSBmeQ2LmJZAOmJ?/O +md094r;@H0s0mXKb]g!'Z1um-jiN!"H+#s*t~> +oD]os63)end(-oF5m8ld%fcV3#(b:Wf@eg0g"=p0f[mn7]E>j[]=mXFrk&!=!58?D!5&*?"1u4X +bl$*0g"Mp2b=_g=!!!\jE<%_1[(O?/f`2JanGe"~> +oD]Wk63)AO]q_KK36LR@_+r-"TSN7b\$o*@A0O$`5VcdY42IA~> +oD]Tj5QISXoCAI]'3cN3)upBPD=m`'qu-Nl"o\AtrUK:Qlj3"Fm-a9/m-O07m/H;SmI'?-mI'i; +s6]jQ"7PXDmf)PTn*TN1rp0X`r;7?/g"66'!"K/4:%C&/1]]Q4med"a%'8suJ,~> +oD]]m5QH_q`k[!/%S.IV(]XR:=4,[Rf\"g-g&9P(_Ro`Y"22@[]CNW4]DoPD]DB/?]D]AD]=bcT +]`,SJ]=beif\$,T't:X*g].sus*t~> +oD]9a5QH;QZ`7mK%6tYA(B+:?:qjof`5T[5`lA"s!Ni0qV?j)sV5C,fVP^3aVZ!@`V?sus*t~> +oD]Q\'`cb]mdJT,n*F+f,ln5j@e9!@s8Dj#qu$Balg4',rTjXRm-O'5lic_3hW`eoc32YYmd094 +liZ\Cm-ai=,44a`n*KH6r;HQlqu$Kog[>+`)ZZ2C&\n@YVt'*Ks!.T&nGe"~> +oD]W^'`bYn^V-S&]t?a9+9;TR:=7:sgXk-Xf)s^[b.@G^"22@[]D0#I]s+cMVO3[6S$9Q<]Cii: +])]PB]E#YD]EGggg"4jTfG3,r]?C6e(BB#c%@GA*KYb7KgE6KSnGe"~> +oD]rg'`b&JWMbo)VklLQ*hVPU]?`Pfa6`Q--%])W?U!-Ob=Lp_q[Wh[>M*<;#es*t~> +oD]le(BE:hn*KK5n+VbZ9)oDiIc++Ss8;fnr;?Qgm-aE1&FJiNmcS;7bK.fJaiVcfmHso>s6]jQ +!:B@D"7GRCmJd##qu-Kks+F5g7K`_F@kQg6nau26qYr2KNUZsu~> +oD]le(BD/#^q7=s^Vk%-5QD-NBu!5ViRlf9f\"m&]Y3^F$b')EP)YK^O,fC.^%o>@]CWZ;]=kkj +rn&(@f@\a8ECL?u"TZ,7,dbD'_7[A-gF3,^nGe"~> +oD]Q\(BCPUWMQPnW3'JD3WKIA?`lY*c2>N]a1CT6$_g3oJpi)tIsus=Vu!:jV=CE(Vl$B2`l5p8 +`Pp/9579:N!3/d9SuSciV51lH,liqos*t~> +oD]fc(BE7gmd0<0gNY%F>Q>+bs%n=HrqlWlrVZHZm-G;Ocm+4cb0%iJb0&#imHj3,rTjOOo'?SJ +m-O-3rVc]m'_VKZ,-LtOrr`a1[. +oD]fc(BD/$^Uq.nY?i:N:]LcAgI6)8gXt-1f\+Zdm( +oD]fc(BCSUWhlPjR8Y%)8H9!/a$+(Ta2Gp8`l5Zkm\U2bVP]Lp<.=^o$%n_EV5:&cVP^3XVAuMA +a2Q$9`PoU5BbcL*"NgiR4+F9-VPLuI,QNkos*t~> +oD]le(BE:gnE]N!*sP4M=9&Vfs6][7i;`cRr;,sMm-X6-"RW)tWQY7^s2kDbbiAZg"RYXFm-XE2 +!:BdP)t*Y%rVQNmOH'2+ScD$t!'q\.U\!j>q>W&INUZsu~> +oD]le(BD/$`4Nag)?VZ&9E5 +oD]le(BCPTY,/(d)$;Dt6i[F1cagrmYK+W#`PSdTV5N^X"*=lbJ,Og#JU`-#R\lqFV?*a9rP]Mq +EG`\*HN5gl!%AT`EiZ(7^rRc$NUZsu~> +oD]`a(BE:io'Prp.(7>]6k99*d6Ztgo`"dcqss^P!:K=B$0GVV^<4s]gssUIap?>Zm-X3.m-a<0 +ll5Bcr;HNjqu93f5!8mZNX)<,;ZOT%meZr9!0-LJJ,~> +oD]cb(BD/$`k9).*.a8$3t;6gZo?#idFm.(fZ:Yi]G.hK.>NtVVPKfGOH>Nh]"G_h]=bcB]Gf#I +f\"m.gHC]W1]U[)"*0Ve!1CU:e_;JPNUZsu~> +oD]of(BCPVZDFN>)KUHU2@KRYUGB2;^rOF4`3Z89VPU3]V@05tVP6F'G^k^9P)K!)[Y:AV2f>KrM#da +oD]`a(BE(cp@G6dX3mLWH;+AZ3QjqDpA+Xbp$;VD!Uf@Hm/QGgm.&@ +oD]`a(BD&!beSo8GEQkXC-hn;19NdKe(*+'be*ke!P?&9]GS8n^8)KXVm!nL]tV7j[C!?R]X"BF +]Y2#J]H+\u]>W=Rf@uj[eRbuo!0 +oD]of(BCGS\>aTRCP-+.?p"E)/=net_8F42\>5suV5C0[VAH1n&7(KfWMc\oWM,rVTVeTWP,5%R +VPWg[*N,d3Y/J;ua,c"l?(_Q*K9cs-J;+RmYH>[`+97Djs*t~> +oD]ol-igXQq"/eEcFl/Fs-`ou]D]I?SaQLQm-X0-mHj63m/QGhoXd.Vkje*-m-X3+n*KH0mHgni +`pW6]o'@Icmd0<-meH_Yr8MYVs6DKAcMt?pN7CoFp@A([!W\YXs*t~> +oD]ol-if^hd)'-!P(k>agk,S9T\6#uL +oD]]f-if4G]rP*?Jp/G6a`mdoP/`]9HFh)/V>d=mVkrm[#-3D+1S^qIrMBRkrMT[m"aLZ;W2?E] +V?!OmVA[%c`Q#/aZd-$.!2.Jq(0H;J'!&7SbQ.^3nGe"~> +oD]ct:&oD7qY4)7bE4(+s4mYi^&PL4ec5[>m-O-.lj<(ROqBS+o'G`1rp1'Zmd0<-mHi%6BB\^L +na$8CrTkEkqu-KnU<`es!=df]rHg`LCC]"js3^l\\+'EJ~> +oD]]r:&nbWeAaonOCfWKgV!S"U>MDq\(fZU]Bm09`,lGSD^&5MFUD$P9lb".J`Ribr +iet,)_#b%Wg":!fNCs\[bM'?('=[K2J,~> +oD]]r:&nJ;_6,p9J6EtqaK,@QPK\u6VoZu_VI+lO:b'Zl_YSsYJ\?" +c@2J7Y5o!1`Pu=4I7"C/[`G6E'=RE1J,~> +oD][*GlT5lqtj)0b'5u7rVHR$YlD*1qSr!qm-FrKS,dNfn*^2A"7,=?mec>QmstPglg4Z=)#4'u +a8Y^!a8eEfqu3<;^M45(qYu*H.bF1iJ,~> +oD]^+GlSuBe]^/lN`7jZg=H<0QfXXheuI$8]C!67_L2DdZG-:M"1u4Y]DK5C^1@>ClF\"GdFcaF +g +oD]^+GlSo,_R)38IS)9)a2@r_MU@C'_je?DV +o)BN&!W_*UqKrmtGWP9lqZ$o4Q9YDUEq8kilic_-2brZ7li?GOm/68Teg>D)mHs<-)=-tnk@;[7 +O:hO\l2:RU-GiOps7u[?!(HnVs*t~> +o)BQ'!W]sgc=73B- +&-+c2g"VE'MDc-ndH)JN7K2fVJ,~> +o)BQ'!W]FD\5s#e9Jn`lNWEH86)@^X4#$7K2fVJ,~> +o)BNd2?6q\rMp$rV%^cGr@J#!1]H]P`;fJsliZXg'=@](#4:dDlg4!*rTj^Tm.kc>md'3VmJ-VZ +Vg8"96ND*!qt*l`aq[kRs0_t9TC;f1~> +o)BQe2?6G1dt\$HF:kG*fI-`:/_J6KW8,P-m^rY8Pn9&T]EZ'^]Xthh^&>SI]tD?j&\[MC(qRuD +g5osriAgmFdb)o<2NJ;7cJP&m$(p\dJ,~> +o)BQe2?61k^NK]kBFgKN`?P@n.)`VlREDq6m\U)aKFWM0V?NlpVPU/dr2'XqVQWl-VsC2sV7X^f +JmZ=<1]UUm`4eSlIgeHLbDlW1TC;f1~> +oD]a.s)\;Ff)P:_7*-umq>;T?G3ZNa_>jK.o'>c2#48E=dI$Ahqs4g[m-X0+mHj6.nA#+>nEoZ1 +)=?b`s8;T0^=@-%D"RbF%$[%X]))Cr!?:n(s*t~> +oD]^-s)\;F\(\\9097/XeCc#GA]L=JVVTqN_="r>]n[`-]Y"$Q%DBEf]Y(qj]=YkG!g^Uf]GS6+ +gtC/UUpaV1>ghB)$#"&RPL/#H!#te's*t~> +oD]^-s)\;EVT,_R."3%2_8[Mr>IKTgQc[7YWU?VcVfs,Dpne.kVP^9jV?WloWJ:P0WU-K!Uq4Xd +^m^Rd +nc'Hd(]Zu!s*t0FNXi,i7KA4h3q!%ErV2iPn*C>JW$9[XoCqeBr9OmYmHj3,n*]Z7dL1^"mHj0V +k2619s3rne!.=h4.6YU)/Frh/#6:1lrp]r<~> +nc'Hd(]ZSGdUW>uA."OW4TKT.1X"Y+g!P/_n%8q>L)Zu&_8O+%r4EHM]tD"l^q[Y#V[."Rm(=4J +_nOmXhmG$k!,C60,q=ft,/N)f"ot(krp]r<~> +nc'Hd(]ZG1]2nuD=UBf*2ZRQb0"T6E`k?2gn"pAgFVp=?X0&A!r2'n!Vl$>hWMlerPQtKqm%tYs +YH>jabG6R=!+ +o`#m0s8N%[!!eVcnL#Bj>R//D!-UHRs-SoJQ#-0_ljE-m&[pZ&J]7$CmJcG]md0<-j4`8>gWTqf +oBkr3(@C9;s-SrKZ2alOhDuUq@fXUIgFN=_mJh\~> +o`#m0s8N%[!![f(_&sJI5mF2U!+dmngk1"4IoaMV]F)?;%?IW??C/@<^&,GK]rdotR\QP\Fi*IW +'uVKWJplIC!!$`H0bTF8!1qTM,lfjjs*t~> +o`#m0s8N%[!![D^WuMaq3sCs8!*h+Ra`_XIED*G&V@'5S$\+U`;hV$FVuERnV$a)tR>d)]OH'NY +X6c]$V6_DhG&bW`!!$B./.d1l!0"Ul,60Y%s8MNfJ,~> +oD\girr3ig!$'&Uh\[Y@$31),:@J,=8(d8BmHs9,mJQ>NmeH,Vi_)qu%fe>sm-O-,rp1$XiH,5' +2rmI2f'r)&lkJmTm-X0-m-O--m-O->JV)oSg]&f&!!tGg!1`WN@/p;]mJh\~> +oD\girr3ig!#VcaYS.p=#64c)6d46"4h/fI]=kki^&5MC]D&rGZogIF$329+]=bhhrk&WMW)<]t +-E&j+WkH%>]G%uk]tCti]Y1qi]Y3*=EPauRfd6Rs#pht>IDsN2!!(a?s*t~> +oD\girr3lh!#M-pCYe<[0!8?i?J,~> +n,F6m)ZUl.qbS%T=fRG]4m;^ISc@p&nEoW2rp9[Pq +n,F6m)ZUbbej:&p9Tj]%1s"::L>p7^_7R=mrk&6Cpq.'L]Y1tnOr$5t?3!u_[Jm]E\?VB""@?*G +*=[b +n,F6m)ZUYO_)i8N7>5UZ0=JcTI*]3sX/2YjqkaFkVPX6g%B$)$VQ,4^2IKJa97*?1UC*QG8cq.K +0,b4BVt[(gV>d=lV>d>/V5L/h^s%J[IX]<;"`g)9/eeef`D6I8U$Vf0~> +mf*dH*rn:Jqr%JRs3gr`K[fu##6'2Cp<2jirU'UN!:K^M([_"=8Jaa"'g\8'aMu5f72BSr+":4! +nb;A\mHj6,mHj3,mHj2coC@b;rVlua!#*$Ers%ZQnU^`BL$Sbh~> +mf+-R*rn%&f>$#"hmEFtEjjl`gtUOs^;?SUrk&6Cot2*Q`1K+(0gZC'CQ"@=O)$E\8LPK#6^#1M +]G@?Z`cg"lgYgu1!"bj^j5\/&c>WabL$Sbh~> +mf+?X*rmmg`372-bbP4NAu3braiMM.VlPiSV5C)dVks*a(TiTO&1T^M.pm^UJ:CoV%R;9U*B\kN +V=CG^V&-"lWj$6WbK.lM[f?r&bg=\D\\)PT!f$%@J,~> +mJe6:'*'Gks8Mrph$3pejT#4pr-)ND_dVitp$qG;p%8+I)XZnYmIKGN[*#+0&g&ML-jhMthT3d` +nFQ#6q<\.Ks6Lftp$M,9p?q6^a8];7pV-V+IK1S7rqu]onlPklB_UimJ,~> +mJe9;'*'5Jle:%E^BXa9_V3\=f4@[rS5-Z/_nWgq_ns%_]E#YE]GA;mPE(rK/drI7)]T&'Ei>S% +UqXXW]D9)`]tD"i_8 +mJe6:'*',9f>knNXTebsZH("O`*Pj7M+"2)2\$549n)$LsjP`1Q_ +W2ZVjV>@&5Vl$>fX/r1qWNE%o8rUANIDM2hc!p_lT#Sagc+HFE!,2,ms*t~> +nc&UgrVn+W'`\r(s8W)\2#s3GqK.,055*c,[dNF;[.!OGPOnA3m-X3>lk8^RmHs?0lfZU$O*Q2. +[GC09oD\+Zm-a6-pZrsmUQFp4\;BJ:W`A]Z)>8>is'GabiVifVbV9+uHi31/J,~> +nc&UgrVn+W'`\hfgtp`(/HCOYf48[#29r?hOh82BOM8MMG/D#,]Y2#W]Fhcg]Y;+lZ^HDU +nc&UgrVn+W'`\bYaih`3.KFe7`*6ZC0tNc4J#8uMJ#K>WB"hao +I$^Y+X/DloV?!OgVB2aXAZ)JX@%sN@41;[6_-^-`8cUBGa2uT"-NF-pr9F<4~> +li/*f&HDeEPj.aO!+Ge=DZB\5r78UFn!dSOn&-[Fo:P76qWns_m-O',a6VETo's'>H0sCNn*]T1 +n+Q)clKn$jhsU&FQg`q8Xo4E#-!'oiL^,u;o!1`rd!<2HeJ,~> +li/*f%fcS@J&ou=!)qKP?/4,deZ+tG]mNGd^RHC^^jWc,qRcg?rk&fVS\(qS_8),4@(`[a^:_+j +ot20S]Y>Yp]t[ +li/*f&-)\@Fg\q[!)(7-pVhc=kWc+Z1qPO:h';hV)Mkub]X/^W9<2Q0tW26>f +VtQu*Unt%2S>W>TBr@SMY/SE#^JJ&f!&;"(PV<"9!1`rd!<2HeJ,~> +o`"pjqYp]ts8Ph'qZ'JI[tXeLs5Ij:rM/Ip# +ll`J$aP>t*nEfE!md0B0m-.$/l`EGGnE)jBo'uS?m/HPTB)2K/"Xh=Qs*t~> +o`"pjqYp]ts8Ph'qZ%B[Rrd]"^V%+a]tD%m]X]tI]88>]]so\Y_84R@b1Y+s=8Dmu"Xh=Qs*t~> +o`"pjqYp]ts8Ph'qZ%BXNbHGEa03"SW2YJ!TrFb2PbV2;Q`'h[2lE:EVI>sAH_`*X6%Q#:?VOa1 +V&+HXN1-N'WMZJ`Vl$AiVPGq_Uj4PnW1k_kWiEb@\Al2(:AOql"Xh=Qs*t~> +kl5(s9H+KS*!ZK7s,*uV2:_Hc`5^j/lIWB7aFN:=n^FE$drG#VunqX*\9/C%JC_^F;] +S_6$Jo\sH3o>o)@m)3\Dq31"*pu9!+m/O@grNhQu! +kl5(s9H+KS*!ZJii-1L<0"&a1S=d1)\uUk.Sn>=B^ScdtVcprj7'A,;An@t``Ormp,c+)+RNJh> +IB>,t_R!+;^n@C6]UMlX`cef$`O(r$^=nrDg6m5[! +kl5(s9H+KS*!ZJXc"i*Q.]'GGMMn+-Um?J2NE`$QWKMD"PY\<%4e!a\>?I./Xeqtk+-AgKL`;m^ +DO;l8X.MnHWf<%9VMRolY%XN(Xe(6(WQ'f[a,Fr$! +kPnlZaM#Bq.fbd(NV%@Ws6P61p"=H6naZ#7BVOt=8tkK=WnLM%?B!)neioPpm-XA$L8JbSJ618p +i4<.Go85Zu]113)7(M[No@m]Bp@G/3nGe5[pR*f;(!O\2^#S2RJ,~> +kPnlZaM#Bq.fb!QH.$5Pi50#U_5pq<^;.Fp;LcJC2Ntbc_5p@W`57+?cJN\KdtK=Q(!O\2^#S2RJ,~> +kPnlZaM#Bq.faX;DSKCsc*(5jX-chJW2ZYl8TCVf1NB0FG*kCU6Xc$,Pq-[OVP^A#?Z\r==Zr$, +S:NqmX'mESKJ8RZ07p'tX-l@kXK-DK]?=kf_0@@.(!Xb3^#S2RJ,~> +ir;tV!%Ia;s5NeECmsjs0uNJJm-%)eiT!_HkX(s/MN,kNmC].]cfXW_md0&il.G:\ESH@unZmE/ +m%?)l]\2VZ2R2]:lI9B2]'Z5/nG2&CpE9N(huA3~> +ir;tV!$p+CgV_Rh>C4&A-(DW_]XKt/Za;r`\2A]IDK)C2]Tn#^Uq"(L]=bST\ZEEM=flON^PlR6 +]R;-4Q`[f]/WIHV]VnU`PJ)WUcd]bce/\NVhuA3~> +ir:?(!$K1pa0hN_Q_+u)?<.^s*t~> +ir:-h$38r_r;?N$\FT-pj6_oQmqR%7mHj9-mI0E.mHj3,rp0^Rm-af +ir9^\$37fof@SZES&2q$[CgLU^/S@Nrk&6CqRcgArk&BRG$3HV%Nd,huA3~> +ir9sc$379N`Pf]TN2rn)TVc:`Vb'a`VP^2dVPg9hV?3ZmV>6tgV>I,6Vkl_ZVP^8gVPg+eBW%_^ +.[Hrr>c!+$WkXgX`Pooc&HJces*t~> +jSpG's4eRp,FSR?m/Qt6kO7f/;qplqp[@A:21`m'lL=93nEp/?s6fpR!q#@Bqs5Kop?qD>mGc6B +,Ug1gB]eIElJ>C#nF5`#q>]hps*"JKqVV='~> +jSpA%s4eRo++rBJakbLK\A#Y)6E\&(`4WXr.;#6U]"btnqRcg?ot2H]`4it$]sFAI*$CKV<4B +iVt2u!#)bIC"U4B?*_/54eTZAMSZcd]S/-b0NimZPH2F:`59@,_"tkn^qmk(_o9HlOEG26/j+No +_7OGs`33LPV`L'U]k;#lfNqW5!+OgbJ,~> +iVt)r!"l&.?c9-^<1]tD2NFkYH`EckVKFI2.o(&*JsWI=XfV/p,-.fJX-S3I>=U/#D5O>/>[FP$ +;k0"*Ju>PR?*)"E:FcESrr2utir=N~> +iVt1G!!HE'oDc^fo[*$"Uubfda7c6HkjdrTTNXrX)^e$WH@DHbrMh +iVt4H!!>oVd,:gHbGW%(K=+3?T#?4`\\PbDIRuU\(*>G+@V("ELAQ`SL51P=DI#[i+!3gfK;-)s +]tD.T8uo1)3hM4L[^ae+XP_Al!!(mUro!g,~> +iVt7I!!>ZC^!2s^\!3e0FeCrbN3..rU8arEE'Q68'-&\j<`s +i;Y*+!#<\tQN$p%1#2!ala5gBj@Z*7m-X92k1nb>Xa45P.P1`&!Vl^>![g34Q-%J5mI9T5m.P>' +mZFgCnB'#Jke\P#s8Agq6i^$=s*t~> +i;Y$)!"uH8J_AnW.'C+s\rO86[6&iP]Y(qm[BH^.LgNbB,9m +i;Y-,!"kfnG/h[l,FY@-V1,)9TJUVeVP^8jTpqL5GZ@!j*[(Rb!!2or+orZ84)'\;Su8NbVl$Oi +I]$e+W2Yc>X.tOlY/eP5Kf&j+h>`!~> +i;Xnh!!"]$li+OW`pTg6p[a+2d=C&Jo'G`2md0?.m-X6;m/l_En,D\Vmd9E0rTkKjmd0B.m-X"N +p$V2;Q1OZd[J.lq_Z/pA!!(^.s*t~> +i;XYa!!"GnaOm.?VnRp[`566(Ve3&^^:_+jr4E-F]=klT^&G\D]`Gj\qn*l[]Y(kh]Y1dQ_n +i;Y.o!!">g[Dn=\QDesoXfGa.P?ODqWMZMhV5C)dVPg;hVP^8hV5F-f"fS;rW2?EjV?!IkVA6&) +8?8VbX(\N7:4BjJ,+-K]('"?fh>`!~> +jSo5ZrVmh+!!%*=k"!i!j"fH_GB4LGKJ,~> +jSo5ZrVm_)!!$N]`BCQc\gFYu?X1FW\[[R4[_08bqRcg?qRcsC]XthirO`-BqRdT;T=i(QYdM>R +>f*'hceYI'bKC+j>4LGKJ,~> +jSo5ZrVmV%!!$0A[5ar+W$In7;c'NgUnE(5U&(VdV>[:kV>I+oV5C,dVP^3dVAH.jNM`bQS"QfZ +;6>g0]ul^A\@;_C>4LGKJ,~> +hu=Pg;ud2tqu,[ETr6ko;WmDGRITsgF6;u\r9XINs6TdQs6TaP!po=Brp9[Ps6L]nmHj6/o!1a4 +mHfOomHRKfk(Ln1kl(6D!#s;?s*t~> +hu=Mf;ud/\f\+6dMM\X56FXU^HG@=d>dhEE]E#YE]`5SH]Xthg]D&u;],82p^Pt1M]tA')]t-G! +\8JF[a4\s(!#s;?s*t~> +hu=_l;ud)M`5]0oIX@WH3hiKpCT4@k;5'teV5C,dV>R1jVtm1iV>d>5Vl$>hVPL&eWI6IaVkmX6 +VPH20ULTmq[`-'?!#j2=s*t~> +hZ"nU/cZ-Ks+&2hc&(?0o](>'o%Ga^nAjMTm-X0+oD\U[nF5l5mJcGsmI0Z@q=F"?m-X0-nAaGV +Rn2f6UMJl\f%H1lpTAE6C&eBgg])d~> +hZ"GI0)u34mVT&WYA^_I_R3j2^oSl,^R_XArO`BOb/_E8^V.8X]EZ!^^r=:.^&5MZ]q)ICH9/RN +Jlf=rWi^H5eWsS#>6"eXg])d~> +hZ"DH/cZ*'fOLGjT44=WWh3@>Wg=lBW/@/DV?O!+YcOh(qPFIqWNNG*VksBi(o=-fSZ$?\UT&9, +T<" +h>^-]$ih-)IH:E+htHi3hbVu#R=Y"i6fRP$m-XB[(drkga6ER"rVQKke$WmlWTNU7m-X00[T*"l +K=CKt7bXa6p>n.2ic&]?!'L&2s*t~> +h>^-]$ih#gCW"su_90`AYs5A/G\4h!2RL02]Y))n'K'HiT"2taa2l6@W0("IHEt5s]tM%nO$gk% +B9C'+33InQb/>mg_-gLR!'L&2s*t~> +h>^-\$NLiX@^=0BYI(EIRlHk_/r;0q!-c['D+'YZFd/!'L&2s*t~> +h#A2&!WW4QrkN=Ls0,S>7f1]kn*t.Wld5)!licUiF?M#L!$hRh1bE*cUsnMnm-<[#d-?%;o'bD_ +q+J>$XT/<>T)Y,W!"\)Cs*t~> +h#A2&!WW4Ag7qp4hNUEq2oqr#]Y7Bg];<7@]EG[%<@f*e!$hR\,ToHYFIBPL]XY>`V7U/R_7d+N +`]]PTNSWQ$Lu!U^!"\)Cs*t~> +h#AJ.!WW46a-BTLbCr-90X-h2Vl34#V3.XPV5Bu89.1\U!$hRZ+W`aAAr*+WV5'Z]P,2/eX/;DP +Y;LqrJB?&;HcgR5!"\)Cs*t~> +g]'dU$31:,;"Xbe45]Z(njV9ilK.N7,4b0gm-j>uf@AL)f[e[*e^W*sdamUMm-gico-:.&g?dkU +4nA@ +g]&&$$313h7+9iF1VCWE^c&="]!fA0)SlE^4]G$)hl&/]!\^p +^r4(!0](R61rh-I#fbQtJ,~> +g]&&$$316[5/5+Z/uYnSW%jU/V4jl4(omS4#H+D\M2$e@LAlr.LAllJL5_b&VPnW/W>K`URA?LC +/#fYOV(0[0^b<&B!!pTts*t~> +gAaUR,6.^tjo;6,rUBTWM!S%(pUrW:p$M,7e`GuMh:0TseAg%Xb1Y_9e$\`7Vr>_`bq6[(k&'X) +U@IUMI\-0'e3a3 +gAaUR,6.^a`8Zhog<@]kCqE!C`0N$T_n +gAaUR,6.^WZHe)3`k&Nt?`#lZXb8*fXJVkmPbFk>PDb'LML^S7Jrc7jP^f[3FIeDgO!'.ZThMFZ +EiZId@XGf'VDJ8TZ.T),~> +g]'bBs2cPe!'7= +g]'bBs2cPe!&BhPa3\)G@@ET +g]'bBs2cMd!%iu,[CoJY=GV__ZB%)-WI(YEW&UekKrBZ,WMjHjHZH*hW.[s?W_Z!YH)ZQOOL-7! +HTS`,_R,l@:_`sCPl987J,~> +gA_3QPPkJF%Xe;AKDNslH]n3VdINo`NQ.-7g2t[0W.jm4hWD:cp1N1CK>-g4F5pN"nA3]PGF7j8 +qcU*%s*"YI!"HKjs*t~> +gA_3QPPkJF$u=dOE7V>FAT>YgUqqIoDk;&dY$Im-^\M^R2%A?[0Sf +f1VFdgh$Zh!"HKjs*t~> +gA_3QPPkJF$Xh/"B#LI]>%Ok'OfE>*@uP#+R8B$EF^D/HS"Y=+X[\bR>D8uG:nBsnWJ?bC;eiV) +`C,L)a^"uK!"HKjs*t~> +gAa@S!!!'e!rrB?C +r;Pf,oMbYf!?1"Ns*t~> +gA`_A!!!'d!rrrk&`S.]C"HWLbU" +f\+5[dRa?;!s&B?j4OB^~> +gA`_A!!!$h!WW3J+goA/cR6;hI]&)MQr]XkUPEZaVh0&kVP^2S>+8`*Y%DIGrh^1(-'kH`QB!6; +`Q#2m^-VYs!?1"Ns*t~> +g]%NO.0'?9H"S/s!'GGZq#B1CGF[J9k*:mnL%4X&g[+G$pJf3$n+?).,l6H1m<@cgceLkZUOi9h +m?HT!^EW^Y'keuq!)*+?s*t~> +g]%NO.0'?9H>"B!!'Fi)eD.deAq7--[Wc\:CV[[#XLc0]`C-?4^;7Oi*Q>@L]jA7#UTHAjK5]>I +b^[IRU`KL9'l#,s!)*+?s*t~> +g]%NO.0'?:Htj`%!'FMd_9&jq??;YVUM44R?`C!(RAHj^XZVQ?W2cbe)6]T`Vc0@2OdRf&F_/Ic +\T>!fPT'T&(MkQ$!)*+?s*t~> +jo5>[q#us*t~> +jo5>[q#us*t~> +jo5>[q#us*t~> +h#BIY#QP?AGBe:+*AU+r!!"Eg[-dmtqXUuNoXKtYKoGAlpADEdm>0E_mI@cZip5Mk^KKj`VZ5`C +]5Bq6!"'8N7s/uu=UP30^tSg=~> +h#BIY#QP?BG^4L0+>ub&!!"3PS'1#]f?0;]^li`XC2^b7_oRut]ka^`]>0VZ[( +h#BIY#QPBEH@'p7+?)k(!!"*DNk!Pp_mb;gWe"`a?"'UKXKd@0VdGghVQ,5eT;7u2LdA>PK$^d3 +P#X=;!"'8P96b`->RLN3^tSg=~> +h#Bu;!!>9-E`ZU$)H1fn6jE\m(fdYIq>%%is$!gDB#aI$eTBpUkDXuamIn8/N,8'4S/TS ++oqZD%8'qH- +h#Bu;!!> +h#Bu;!!><1F]r62*E@H&7L&nn'1%FK_Sh(V]IeN!8;aDpPu44UT42!*VQ>JD?q[Y5G>b-K0##D\ +)?Bg<%SU:R.pmRKHpIl8/bIftJ,~> +ir9ebSUc6D;?d+1F*De<4WPtdG'7Ic,Q[lE,:CIu>kmkDr2=`1r'0@Ze=YI7BBe8YrI_d#o&mpJ +]DI1B(&e1H$q52XE&\b +ir9ebSUc6D;?d+1Fa/+A5p7dpGB[^l-3=)G,9a&2:Y!f?d>DDWcSiO?Y_KT_')hkE$q52\E&eqAGBS1O'`\G8K79Hep\t6mlMlA~> +ir9ebSUc6D;?d+3GC"OK66[ptH$O-s-is;I,9E;c8AVqb\pIPf].g?_S9q#p9s16Y]4$d7]sO01 +P/Lra&cMbD$q>DdF?:LIH$Xg[('"P9K79Hep\t6mlMlA~> +jSo;JY;?"T1-p81Fa#DX6#q'e:.e)"%0Ze5!"ioDcG&qh(*\qq_Fa7*c!!53]l/M_n~> +jSo;JY;?"T1-p;3G'GV_6ZREl;,'_0%gE(8!"N/\BTh8oXkKLlh.WbE_o5cRj!9kfLML_^b.)dM +rW!')$qGShrc\TF+?"IgG'[ +jSo;JY;?"T1.-M9G^M1g7aEt +rW!H4%7tnpH$Xg9+#\LmG^N`l!!53]l/M_n~> +jo5@h5Q(R=!X/Q(#BP'2G@DR>??^Qp7nQ/m,r@"`!<<*@)6qegK)`Wts-(+q9>]E4s2m.aU;g +jo5@h5Q(R=!X/Q(#BP-5G[hdC??pa"927o%-TEUj!<<*<'UZCiDWddfmXCnp5c)*$j/suWMm!\4 +.fKD_"r&=B +jo5@h5Q(R=!X/Q($$CT?HXn6I@!m9+9M\/*-TWak!<<*:'8rc=AC?d+flNA-3gZkCc^cJoI\%$^ +-2mlI"V`7B=8mRHGmeq30->:XBm#%>!!2rs!]$82r;QcrlMlA~> +k5PI5#lXfi'fSuG!!#$*F`hml+?"7`GXtCu6R!d>:.@&]"TSN:/132^93Ysk6=Vc4C1^pb$Tga1 +!rr<((aq=49MA&dG]j"/%raEH:K'huG[:@M"[P-p$iU,,9%W2)J,~> +k5PI5#lXfi'KAuI!!#',GBS3q+ZFIeGtUk,7O09F:e*>a"98E7-6as>5Yb?;3E7Rb>?=d($8X^l +!rr<)(b%F9:eshpH$912%rjNN;-$D*H!^OO"[Y3r%/p5-9%W2)J,~> +k5PI5#lXfh'g#>M!!#-0H$Oa&+usdmHq[:17jTNL;+NSf"98E6+s/.*3_)t"1ef>M;c$.^#qe(] +!rr<*)Cda>;Gg5"I/\C&HZM1i;cle2HXQmS"[kF"%/p5-9%W2)J,~> +kPlfB!<<*5=))hs,lds`F`r"B/g=dE83\I,lMq,$0L86&9M5:U!F'gJFV]1: +1*/VN86^.Y0`V2OFDb_T"onWRd,t@Y~> +kPlfB!<<*5=)2r!,ldsaG'A4F0-j)7G]6;M:.HQU5Yb!I8O4a2lMq."N*r(R2sH2_t&G\f/Z +6;:-ZFE]G>!)n#YBKlY#!%ZFYs*t~> +kPlfB!<<*6=`&G+,QIjbG^4XN0dB;>H?)\S:Ilf[6;UEQ90t'5lMq)#1.4`0:]4#h?@2Zr(4:!W +,"#+"?Zp]M!!$#CEG@]A!!"Ork5Tr~> +lMgqbqh4qK!BtW)G!9R@!%)i3GB[(@+?Ogm@7Ws^66da@9MA)P8P)T9-mTZC&eblj&JQ6(%1*4N +(*k+]5=nF=8P)QJ9M%fSGlDk&G@N-E6qKsCEHYpp!#]s&G'7d=!!"Y4kPp&~> +lMgqbqh4qK!BtZ*G8Y)r!%)l5G^*:D,!:-r@SBKk7jKBH9he;Tr_4@n.3ocD&eblj&JQ6(%1!4Q +(*t4`6VU9M9he;Tr_3DmH2`!jG[rBM8H) +lMgqbqh4qK!Bt`,Go(5s!%)r9H?r^L,!L@#A5,fp7j]TN:J^pa),E@E,T.4-'+toi'H\5&#mV([ +-RLc?:/4U`:'=?f:0)`@Gm&M,/L*jd:(MDkB`\8PH$FX\E#&ER0')3qJ,~> +l2Lpl!!!+$I/\:*F\Dc8;Kd2,Bh^]40PG].8P)NA,:,fQr_!Dd8kViP9D_Eh9NZ[Y.N_8X9`@Zb +9)D3[9-6bt;g!8+G'$4p.S33(7q-X\/-#ZWGBS.RFW^Ya/b8-*J,~> +l2Lpl!!!+$IK"F,G"hr:;g3D0C/@/>0kko29heAQ,UQ#Ur_+,&9MA/U:f1%d:f("c>((6=,>M*4 +:esm`:&dm/:/+]2GBS1Q809HY9hn>kGB#/6!+:%qGBe9R!!"VAkl6/~> +l2Mm2!!!+&J9uTfGYS5=::/4SU-7DG]qb@2g:f7*f#Z4iVD_<;2;c3Nj!)NDc ++&>X4G^4OZG=`i.:/4SYB6ePN!!$JSH$O^]+ohTpo'$+(~> +lMh@K$316-H$+7QG'>>7#\a3[%pV[t+sU'.9M%fK5pI[F9`@[#8Oc6B7RfsB91hfL87d!W-6u,T +8P2SR9*.^W9)D0c;0$i&G@)R<5Q44[85XJQ:]^VDI/S0jDBJoZD!:nL~> +lMh@K$319/H?OIUGBbP:#\j9]#$jqt,U?B3r_3Pl73j3M:&[g%9h\8U91qrP9h\5T8nN<\-RMG[ +9hnF^9`Ifh:/+GXr_3YrF*DeP?mHp`r_3Yl;K[4]!WXTrrH8<^+92CXkl6/~> +lMh@K$3191I!U'`H?q%@#\s?`%pr(,-72f;:JOY]7OBNT:]=,h:]F2h:B=3dr_ +lMgrJ!!#=^Fs;#0!$H-$GA^2J8M_GC=%u7X8in7D786EJ7TXn79l"KH8Gl$cE->\3.7d''8P/kQ +q+2W)Ecu\=/0?]>8P)NG7qHpY(]XYPG]e.PG@hNh!5.RrJ,~> +lMgrJ!!#=^G9M)1!$H0&G]-JS9fF.L=ADRb:-^'O7SZWN8Q9>"9j_4,qb7?9G@VgI92&)Uq+Uia +rCmPqF*DnA/KcoErCmkrBR+;/!!?t\G'8(SB+t=G]]oHH~> +lMgrJ!!#CbGp@Q\G6.afE-Q\K;bg(I+uEJ":/4SM-7DD]:/4SX6VL3D7S +li0#4!!"6`G'.tOG^!'d!'#(DG%4'88OOjJ2+pM48in7E9hS,OHXE1A=Ru!M77p-C85aPQ@N-sm +92,=X!_c6Zr^e>.92%oK;07&'/g)`:8kDWI91`!,GqoC#7X0'!G&qk%"op4=s*t~> +li/T(!!"6aG]n:TH$<3f!',1GG@X?A9h6TT2G?h>:-U!O:/">SB3BFX<2c^>92>I\#Zl.m@iR0p +9MPL[!DQ8c9`Rld9aXd@H#kV_/kA`3:B!rm +li.ih!!"6bH?a^\H[8]m!'5=LH"KcH:.QZU3W;bV:I$6U;#X2r6V':38gl)M:f%'c#Zl:uAKER" +:/Cja!)NMf,>V'1:/4c4HZ_%d0M5,9:JO\\]>G^+R]HqjkG/F!1b~> +li/pg!!lSLG'.tJ=A:+B!).T[F&Ye*8P(i`+[Sgp9f=.?9M.lDqfoS^=o\Mr6V0jA8Rlpd=WB(c +oLTB\91r92E%iIa7nrtU!)!5^#&& +li/O\!!lVNGBS1N>>cgK!)7]^FB)".9hd\o,=>-u:,aFH:ej_WXCd8n +li.SA!!ueUH$FUV>Z3'O!De)iGZXi=(-Ecb78?TS3?otM:JO\46T%D,,:# +m/Ia9&c`_pG'7t<9M%ti!"2tSF_O>D8K^GP+XTfT9f!n<9h@oDs7$&P>Q=_u6qKsB95J`n:`MCa +8cMEf@;e"H-::N+9)qT`8HrFGBak%LA,LKQG[:CN@-[cB~> +m/Ia9&c`_qGB\1@9h\Fr!"2tTG%s\K9bp;Q+t$#X:,F4F;,'bWZDOsMAEMC(1.MAGgWSH!^RP@-[cB~> +m/Ia9&c`btH$OUH:JFb#!"3%XG\g%O:)6GS,UlG`:c9OJ;GKt_,:Fd"8L#KA;#O,nDg6M*+$!'c +:'P6L3$]qB;#*il?[Z`#!"3CbHiA9nHXQpT@-[cB~> +m/J\a!rtlf9O^%(-UUW+9,L8m860PNINAIl3*g +m/J\a!rtl=GB[:`9MA7a!#]KqG?7I4:/+JZ5pdg/85Cla02G;;9_F\s/= +p.YN^r_3Vk9k-7,-q$i-9G^Dr=)E24*rlF'?u:(3G'83B!& +m/J\a!rtrAH$N^h:/4^h!#]QuH!*g9:JO\]67=*48l7>g0MkM?:a7D74%UYB3`#`M##fPeG>fSE +p.bT`rD!PmAN_1d7SrqV(/.kLH@d4="?Kt0G^=UZILZ?4j8]/Ymf.e~> +mJdI^5QCn+GB[^kr_"J(!!"6dG'7Cl7nH+>$5X8ONN5kaG`Us.Vm[8I&47G'-Y% +2bIE;*[sHM9`.Nu8kEB2GBJ3t!!"08:Kh[\G'Z:O"fUbeJ,~> +mJf6;5QCn-G^*pq9MJ5M!!"6eGB[Us92//U9hmer,;;hC,V`(h9hMR+UNfhFZ$f5=9h\Q-GBQk) +3)'-Bs%`Me#>[T?+"BZQ:&@Tu9jr-gG'lRU!$P*8>B4t4HT_?4W9aJ6~> +mJf6;5QCn/H[0C$:/4ST!!"9hH$O(&9MSAY:/=)!+u2qH,;W.k:/<-".Q^3H,W\^r:/+f3H$E:1 +3_fEFs%iSg#>mfE+Y6)Y:\mg"@s**BI6mo6,#D6EFF&7]56(kcli2J~> +mJei]+93I1G'R+[91hl7!!!mJH@'jT@7s-_8P2Z8+!WQi+>6D[8P!r)d@=G@s.Vm[8I&:9G'$"j +2b +mJe!E+93O4GBm=c9MJ;?!!!pLH[L'X@n]Sp9cc8:,W$qq1Jge?9Oq+gGuh5UI7d4.9NQ7YF[@-/ +9_;%):H0[E.n36,9MJ5T9M82sGBS1TJ6DpQ(emb!-A,lUWrTsQ7~> +mJdF5+93L5H[Aur:(0rX!!!sOIXZTaA55ku:'aWV+so2u,;i?t:(oue00;`M,W\^r:/+l5H$;Y! +3_f6A,Z$NM,:uG^:/4S\:/4M]DL6\TH@f<#!#\R.:02L`HY*6XI/WF3J,~> +mJdTt#67&8Fa6eT8P2]0r;[*91M1lUE`kt*r_!GS+X/-R2bX*@#?]N!=o\Mr6iKX^>'+n/4ruUQ +pIYBW#=gHl,:H)U9`%H`;/uPX#%/VV!<qF`hm +mJdTt#67):G'[(]9h\>9r;[$71M:uXF'AQ;s%EVV+sS?X4&>fL&lk90BP+359DgX +pJ(Z_#>6m!,Ul;Y:&@Tb;KD_[#%8\W!<!(#l9s*t~> +mJdEo#67/?H$iTj:'"3Hr;[HB2/.D`F^.[::JOYG,UFc^4AbuO&kXcE8g>TB:JOYZ?$CO;5p86_ +pJ1`a#>@!%-7__a:]!lg<-'YF@%0/]Ym/MS~> +mJd]R!!$>LFa6hU8P2]0#mLG/!#lJ7ASu-[9M8#P4 +mJd]R!!$ANG'[+^9h\>8$3pV1!$r4CAoDEd:/">U4s_I!4AS[H9heib@U67DI7d4.9NlR_F?gm5 +p.Ycc74TT.)+I@"9F=Kf9MJ`:G]djs)>sO:!u+*$9a=U8GBbJ8&D6@LJ,~> +mJdEJ!!$GRH@/`l:'=EJ$3pY2!$r:GBQ7ik:ejb]59qHu4]"mL:/4>077SUK3_rLG9jMsgG![<= +p.bie7P#f/)G![':'scl:/>/BH?O4$)Z9XF!u+.!:/4c/H[7"=&D6@LJ,~> +mf*Uc@/p:QG'8.09E%Kd92%Gp'asp>(`#)2<)u[c9J%8-5"eL>8O[(LA*a-oU-noO-!GD6F$:O+ +91hfJ8P2QG8k_Q-+!;X:##@i`91_]G:1nro +mf*Uc@/p:RGB\@39`@`j:es5&((10A!$rC?<`N:!9i!Gd,XP:%9he8aTj+=qZ$f5=9h\c6GB?(l +5u(-JqFqYn2'X@h&I)0.9h\8V9N#PPE`P42r;Zs.(c"ZXr_3VsDg-Fj!!(")s*t~> +mf*Rb@/p:TH$Xm=rD*Ai"$\7O$iBuL(cbZ!>>\0n0d7o2:esh]:Ils+-m^-":JOYZ?$CU<5or?g +qG.&d'Lju),U*d(<)-4a:JX\`C4LG/3Xu#f":H)(92PU_#?>bhH9hN2`U*VT~> +mf*U\8H93DF`r%.9DqEe92&#L4>@rdr;[T7)(RO0:cKR?6:sg@7uNMgOS8\RU-noO#$Z1mF?^g1 +r^m2_9)_Ku6Sg,2*$#:b+\YL"8kDTWG\9Ag"oSE)'Il4<9M>=U#Z#;\G$Y.KT`4?YJ,~> +mf*U\8H93EG'A729`7Zj:/=_[5VaJkr;[rA)([[6;E5sI7SZZP9Q5*FF/lCJI7d4.9NuX`F?gp6 +qb@)c#tHm'+Whg5!$b>=9a46oG\BGi"oSE('e2CB:]*om;f?l(?N:)!rpB`9~> +mf*R[8H99IG^=d +mf*UP+93^2G'/(/9`%E]9*S*`7mf?a#lO`:"UPhg+Wj +mf*RO+93^3GBS:3qFq5h9hnGV6p)e%r;\e\#o"^3,>M!.9hUVMWiWA+Z$f5=9h\`5GBH(k5tt'L +:JaVK1++:e/Ts2U!'sCU9heAo?RZHerW!Z6+[&@k:JFPY:/+GX<,m,*C&e6Sr9aN7~> +mf*CJ+93egGliCp:\mfk:Jah\76N"(r;\e\#o"a6,Yq32:/ +mf*UN)#u:3F`r"59Dh?i8k_oM8P2QG91VAq#lO`*%Nccdr^dDdP)nUbp\t2e6iKXt>'+q//0-oJ +90Y9`+X/*O-YB9?!rrp'2aC&17NVI-!XL;IrCR#_%SKDc8kDWSF*;\A%00]3mJh\~> +mf*UN)#u=5G'A499`.Tn:/">U9hnDX9h[o$#lO`*%O32pr_4k9F`O*qWiiUT8ki#R>]k74/g3PU +9L(Nh,pX`[.WDnk!rrp(3'pA:7iqR.!XL>Jqb@)a$r'Jk9NQ:ZG&.Tf?2X*iJ,~> +mf*RM)#uC9G^=aCqb@,erD!Sn:/=Y[748K@!!<`W,Z4P9),E@Y.m>=,,W\^r:/,&=H$1ha6VgHD +3%lQV,7Q/E^Sh88&P>)P:f0e*qu?g*/kSk;:B+,h:('im:0;XaG]!rj?2X*iJ,~> +mf*UD!!"csF`qt?9DV3[9);*d92//E* +mf*UD!!"fuG'A1C9_qH`:AITj:/=%q!WWiY/l)@>-V@d7"j_+ +mf*RC!!"j#G^=^Mq+^ocq+_5m;*Z0(!"pM0:]4$":IZp./gVc(:JOYZ=EJn50`E70+WhjR.l0;) +\';uj!!"\t!":+[rW!-'"qimm:f$aZ#[)CtH#=/n4SnIFJ,~> +mf*XB!!#]9FEMbO=%E6]s%3>a8k].Ur^dGj9g:*9!!!WS01u17#Y8mf@qboBU-noO(K>BrE\/Ij +2)dNb +mf*XB!!#`;G]n:V=A8<\$;XA^.guCX'I5J0r(SADRTj+'Z$f5=9h\Q-G]PJ_2`s2e9O<=O_ofp: +U]:B%8gXB8"Tf8_5uLMW9`e'a9`7Zo:/+GU=E\n4E?tT0qX+<5~> +mf*C;!!#dnGlrA>>"ncf!)NJes%itf/.;LY'I5M2r(\G)/4`5U,W\^r:/+f3H?Ckd3'B>h9ji[\ +bL4SXWW3#+9I0N9&HWRl6<$cV:JOY\:JOY\:/4Ua:'b'MH$OHX!$h@-s*t~> +mf*IA!!#W7FoHOsE`,J$8P2TH8P2TK8P)QN3Zee0!!ENH+ZN*m8I.duj^N!)s.Vm[8L%/QF`K#\ +I[6:hWO'%=Yck=5+TMKp85p9'!"1M97SZWK8PAqPr_!\m91qlL=a5(4D^,6.qX+<5~> +mf*C?!!#XhG62hb9_M0`:Js7s%/p50#9G*P:Amm<93n2p?Epb`8ki#R +mf*C?!!#^jGli+g:&.Nh:JOY]<';?4rW!'+*[*[BrD"n>7k.&!,U>EH:/4MbF*Vm]/Wd$6YeeW3 +bK7lL`?tWc025I_!!!B_1eCP?oM,fj:/4MhI!BsY,lf7fmJh\~> +n,EOhU]:Ber,r-aD,'n!#>.Z_8PVDb#6"T+"$g6J*CK`r#[lZkfV/?FU-noO#?5\dE\&])ZMq*D +Yck77Ydlpt!#.po;d9J+!+/Mp9M5%N%n]Db8kDTH=Ent3E$G?/qX+<5~> +n,EOhU]:Bfr-&6dDG' +_ns=._SO.76N@*#7nclf"TSO2;+s[W9`Rrd9aOKtH$4CO,60%dmJh\~> +n,EOhU]:Bhr-8?gE)?C+##@ui<'_<*rW!*)6Xheo8Gl3g81Pu<3[>t3:]=*2=*8e20/'^L^BF +n,EOiR/d4ZrcSKiF`qq?8kJqR"A)3P)$9d;#6Qu,E`sn38,Z!r8!O&Qrr)irU-hLD85aDME[rW& +Yck77YPta;Zqpi)"uf1H8nC0d!"!")9(5CY8m$=]G&JT*-2R$/J,~> +n,EOiR/d4[rc\QkG'A.B9hkOZ"AMW\)$9d;#6Ho,G$?I?9DqR89Qd\EY-"k3I7d4.9NH1XF"K#< +_ns:._SO(*``<0A#!#IR9kHQh!"!%+mnF*^>BtF:E$G?/qX+<5~> +n,EOiR/d4]rcnWmG^4RJq+_#f7iDI.!!`TfFa%+B+&)T-!B_V*,n)%[:JOYZ=*8e2/ha1#aV)\: +c<15L#!5XV:1ulm!"!.0:[h*c9jN*kHZUP6-2R$/J,~> +n,EOiR/d4Zr-&'^#[0en8kDTF6m;O0$3C]#FbY +n,EOiR/d4[r-/-`#[L/!9MJ8S73_^2$3C]#G)(WT5pdaKrCn&$DR$@GY-,$X8ki#R +n,EOiR/d4]r-A9d#[U8%:/4SY6m;O0$3C]%G_q#Z673mMr(\_,,UFc`,pYNI:/4MbFEr$]0;lt8 +ai_cJb.h +n,EOiR/d4Zr,rs%G^!t!8kDN3)Z]p="<'@=G`V7lcoNNr8Gl$l9=jYsqYpMh6V0j?;fQu$+" +n,EOiR/d4[r-'$'H$F7*9MS2?*!$$>"<'C?H'.RqdQK'&9`.U;:5Yp%XKJgV8ki#R +n,EOiR/d4]r-90+H[9X0:/4GB* +n,EOiR/d4ZrH9)uBOP.H91_Ji!<<*#!D.9WG@.QRs7B/9*^KZq,"Q]kbZ4?8s.VkP8Oud!G&\BR +Q*@Ht\r]Ju!!!6Y8kMZJr^dGkE_?B4#X(gP8P8kO&5#Se8P`GqASuX6G&JQ)-2R$/J,~> +n,EOiR/d4[rHB0"Bjt@M:JF7t!<<*#!D.,"2B(,"uHSP>eH`Z$f5=9h\T-GB+Z\ +VSg9ibb%ZH!!!6[:/+JWr_3SnFA)Z7#X7uW&55_h8l/YuAoW! +n,EOiR/d4]rHT<&CLgdU:ejJ#!<<*#!D7H^H=F,Ys7B;A+@Z3's$[n]9.)#23_rLG9ilC]F<*9? +aiVcVUf/'0!!kDXqb@AnF\Mi9#sV5[:(L&m9N#)(BQJEDHZUM5-2R$/J,~> +n,EOiR/d4ZrH9T0A5l)i84lE4&-)^T +n,EOiR/d4[rHBZ2AQ;;o9MS5@&HDgU\G\NiNs6W-*+?`Io:/+?ZSuJ6^Y-ECIr_3bsDKg+@ +6a"JSZ:l#4!#-,3:/+DV:/4AO9NlU"!!!d+9h\7[9bU2n8krN!CN4E=G^+CTGB"i--2R$/J,~> +n,EOiR/d4]rHTf6B3.`"9i"GE&HDgUB5Ss6W6/,!Jdt:JO\5/12qo,pYNIr_!!3j":]=,h:C0Wb9jDp)!!!g.qb@f!9M82dASlL2G^=X[G^FNX!%%L/s*t~> +n,EOiR/d4Zr,sH1G&q.l84cEG/!^/5Op`:CH#7AC?q +n,EOiR/d4[r-(2FGB@@p9MJ5V/X?A7Op`=EH>[SI@n\^(1/:P<9M2UdYck44Z$f5=9h\H'GB+Wl +XH=b/!<<*&.SKY4%7u,/9M9#@(]XOc:/+F]9`eF.EW1.]GQ2jaG6Dn1!%%L/s*t~> +n,EOiR/d4]r-93*H$3e#9hnJZ/=$86OpiIJHuO"PA5+s-1Je!F#u;cp,U=Z^,W\a#:(L%i'XGlN'hGl2giF!Uf4qX+<5~> +n,EOiR/d4ZrcT`5G'8"OGBe1><(p(RV#R"p!!"ljEE>b)3[5\98kDWGH9kPMq>^Ji6iKX]<,m)$ +)Bo7]!!EEF7nlVR8L6OMs8Ti-8TSDJ!!"oM8P2TH92eu)C3"B;F`qqNG'8"H,60%dmJh\~> +n,EOiR/d4[rc^/AGB\4SG^4@A=A_p^VZ34r!!"lkE`u454s_CG:/+DUB1Z$1XKSpX8ki#R +n,EOiR/d4]rcoN1H[0j]H@'mL=]/0dVuN=s!!"roFB_O:5:7[L:]=*%6;U9C-7'lt:JOYZ=*/e2 ++"%-h!!E<+*_K<,:*i9Ys8Tl2:3L7W!!##U:/=Y\:0(Y6D0:#GG^4RZH$OXT,lf7fmJh\~> +n,EOiR/d4ZrcT`5Dea'&C2%?qCLU@<6u50p!"U:W6"Xt77jfE17nlZL77p!N^;J!F7K,je

9_h6m4R<%Ib>Ci5G=ho:#!tsS91__S8.S3]:fgk4D/aT>G&JQ)-2R$/J,~> +n,EOiR/d4[rc\EeE,5Gh1i$i@CLgUE88Ua#!"U:X6>(1=8h))?8kr)T8khrYMiNm992/,S:epj]%RB@[s3"A8>'NX@!!YngrD!;c&5#Me;H[: +n,EOiR/d4]rHSEbD>nDQD#S9*AmA/(DF=a1%jM3DBlI6K.O?fB:esh^:/=M>1,;*j:/4MbFEhmK +)?Km>%jFD>:\mg460nRNbZ.AAHqOM@#Y.]d:JOYZ9h\2R;d3UCE-$5JH#b/1-2R$/J,~> +n,EOiR/d4ZrcT]3D.HgE8k;HC8P)NH8Oc33/#:p6!Ydh6CdK[1ZEBl8$9G&JQ)-2R$/J,~> +n,EOiR/d4[rc]c5DIm$M:/";R8kM`O9hJ)D/#:p6!Ydk8D*fQp/MoXb:J=GV84Q0Br_3ns1.>#79h\7X9b0aSkiRar9hf5C.f]Pa8l#:Y&5ZJ4?X@5PC2\6=GAnc,-2R$/J,~> +n,EOiR/d4]rcn]lE+`HT:JLd]*DK=)92.W&UYBJa'gHPR6ms?62F'u5:/4S];,C'f:(0iuFEhpL +*>TqX7SutV:(KmVl0!t!:/,GI/-#Yc9MbR]&5lY9?smMUCiOZEH#b/1-2R$/J,~> +n,EOiR/d4ZrH8NjG&q\<=\D@\9M5:U(J@FoWW3!)!!3g%@1a\-+!W*m8k_fJ9)D0f<,cu")^dg= +8P)HFr^d)^r(@u$94)%"84H3VG&@`h!%(B38P)NI9Meo,Fa/01G5l[fE$G?/qX+<5~> +n,EOiR/d4[rHAQkGB@n@>u+3h9`7[#9MJ9]s8QC*!Y[t2'I>%N-Rq/M:JUa\$qsZ@G&eWP5"\OD +92#4XqFgs#@SQhp#[MXm%0-AT:JUm`#>@ih>AA>,H2`$fFp)e0!%%L/s*t~> +n,EOiR/d4]rd"Ni"aP96CgKs;:]*uf:C4*%s'>[,'Lu[IrZhXq.m-O&:\mfp9ilC^F<)er9285V +:%h +n,EOiR/d4Zr,r`m?Wg6!8P)QI8P)NI8P)QJJ(ZIQ!!Ec4!=g%I+pK>J6qL!B9)V +B3nkE<_,gX9)hd4=(,leG'A7@!!!-]8kDTH91_`I8kN&lEHZMJF`8Q*-2R$/J,~> +n,EOiR/d4[r-&Bc?s?W,9he=\9`Rrf9a"-cJD2dV!!Ec4!>$7M,R,SQ852iR:B!ru9NH.VC`YEF +ChR6`='&'hq+D2r<`igIG'A1X@fQK43DTQJ&PPno9heAbAo`*>G'7jM!%%L/s*t~> +n,EOiR/d4]rcn]oHuib&<`&Zgs%iVh"&OR(0`:t]%KQS@)^?RQ-oOXl:JO^a:(16GG]"T]BPqQp +?s-Y,9b(0)>%DMqH$XpK!!!0`:]*ru:JO\]=_Di%H$FRT,lf7fmJh\~> +n,EOiR/d4ZrcSEeFDOE;rCR#]rCR#]s%+D(6;BET==F4M76D.k3\r$&+t,QC84cEF8Q^%W>9#eC +FEIM,s*4WkH2Mt&H$4:MEGfQ"4Wje+!sT&K6V0jA9`.Hi8kr`7G'.tI,60%dmJh\~> +n,EOiR/d4[rceBe!cUb*rD!;erD!;es%O_178GiY==F4M76D.l4?"T1,:l&O9MJ8V9NcI]>TH"G +F`i!,HMi+$H?XLQEc5c&4s9t-!sT&L7/0Ia:/YJAGBS1M,60%dmJh\~> +n,EOiR/d4]r-8?`925@[s%iSgs%iYi,YLU(3>YdH!!#GM&Ipl\-m9if5YFgH:JOVgG'RC95]D!m +I!bj?!I]@nI1UdOG]e+KDIYpU!WW<,#oQ53:&n)f:('ir@Wm$AH#k83-2R$/J,~> +n,EgqR/d4YG'8"NG'6JMo1:2t8PW97s5luTmc]4/V7:M9-m'KU1Hn9$93ZO^>ob+:0JZ3mr_Oh3 +91r&W:eX841EmnR%gj<\!!#?CWej#78P2WJ8P)Z[Ap/FtFp)b/!%%L/s*t~> +n,EOiR/d4Zrc\NhGBZ\R:@q7.92/;bJ,eY)!:K*(@&CGT8h(r+-oO:Z92&T6G?u@9-S[AJ9MnV_ +r_*5e&PPVL1a=(T%LO3[!!# +n,EjrR/d4\H$OX\H[/=\:\7C-9MSMgJcFk+!:K*)@]?qZ8gtr..5sL`:/5,?H!ha@-o*VP:&\$/ +9MJ5Y;Gp7Z1c6O%'+bQl"TSNgMQ)G":JO^a:'=I!BmG((Gm&17!%%L/s*t~> +n,EgqRK*=ZF`qnMG'-SOoLU?*?Y+(oLr]Om.f[OcH#n5'NF5C5+<;XT0fi6TI:403!*`uF1]@@U +4utFt!"h2%AOHLu&tc\R711#es8Uk[r^d;e9M/?&G'Eq/#Bb35E$G?/qX+<5~> +n,EdpR/d4ZG'A+QGBQgS9dNbKBPqjIaT&+ds2Ru_FEsR>@8&O(+=&Hm3`L6M@NZBc>@V5#rW!!` +3\gU6&N=946i[3"T=Dm0$lap#s5%)[9a"-lDKg@)G6`;8GB"i--2R$/J,~> +n,EgqR/d4\G^4OZH?`=^oM-]4A86(*Mou't.K@FdIH$]I8#C(N>F!Uf4qX+<5~> +n,EUkR/d4_G'3b,"'S8f9(knO;0[;.F`htrCG=5=C3FcACM[`r>>mU1+sA0Z0JG""*!#$npN6H9 +(&I:L'EA;ns7k=K%he(*dsjMN;Jp,U9M.lK91hiQ>B"_.Fo?IdD^,6.qX+<5~> +n,EUkR/d4`GBWq/"'\Dm:A@LX9h\K3G^"=SHC/M&e#dD0GB@Y +n,EUkR/d4bH$K:5"'nVr:\[[P:JOl:H?ja[I@>(.e$!V8H$4(DD.d0V4sqR!,q:W*/gDA:j7i:j +!!!c1m+ +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/Source/.gitignore b/Source/.gitignore new file mode 100644 index 0000000..5320d34 --- /dev/null +++ b/Source/.gitignore @@ -0,0 +1,10 @@ +/.dep +*~ +.*.swp +*.lst +*.o +BJ-Keyer.elf +BJ-Keyer.hex +BJ-Keyer.lss +BJ-Keyer.map +BJ-Keyer.sym diff --git a/Source/BJ-Keyer.eep b/Source/BJ-Keyer.eep new file mode 100644 index 0000000..fd54301 --- /dev/null +++ b/Source/BJ-Keyer.eep @@ -0,0 +1,2 @@ +:08000000550F008A02003200D6 +:00000001FF diff --git a/Source/Makefile b/Source/Makefile new file mode 100644 index 0000000..78e7b9c --- /dev/null +++ b/Source/Makefile @@ -0,0 +1,424 @@ +# Hey Emacs, this is a -*- makefile -*- +# +# WinAVR Sample makefile written by Eric B. Weddington, Jörg Wunsch, et al. +# Released to the Public Domain +# Please read the make user manual! +# +# Additional material for this makefile was submitted by: +# Tim Henigan +# Peter Fleury +# Reiner Patommel +# Sander Pool +# Frederik Rouleau +# Markus Pfaff +# +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB). +# +# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio +# 4.07 or greater). +# +# make program = Download the hex file to the device, using avrdude. Please +# customize the avrdude settings below first! +# +# make filename.s = Just compile filename.c into the assembler code only +# +# To rebuild project do "make clean" then "make all". +# + + +# atmega328 atmega328p + +# MCU name +MCU = atmega328p +DUDEMCU = atmega328p +F_CPU = 16000000UL + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + +# Target file name (without extension). +TARGET = BJ-Keyer + +# List C source files here. (C dependencies are automatically generated.) +SRC = main.c oled/i2c.c oled/lcd.c oled/font.c encoder.c + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = 0 + +# Debugging format. +# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. +# AVR (extended) COFF requires stabs, plus an avr-objcopy run. +DEBUG = dwarf-2 + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +EXTRAINCDIRS = + + +# Compiler flag to set the C Standard level. +# c89 - "ANSI" C +# gnu89 - c89 plus GCC extensions +# c99 - ISO C99 standard (not yet fully implemented) +# gnu99 - c99 plus GCC extensions +CSTANDARD = -std=gnu99 + +# Place -D or -U options here +CDEFS = + +# Place -I options here +CINCS = + + +# Compiler flags. +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) $(CINCS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +CFLAGS += -Wall -Wstrict-prototypes -Wfatal-errors +CFLAGS += -Wa,-adhlns=$(<:.c=.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) + + + +# Assembler flags. +# -Wa,...: tell GCC to pass this to the assembler. +# -ahlms: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs + + + +#Additional libraries. + +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +PRINTF_LIB = + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +SCANF_LIB = + +MATH_LIB = -lm + +# External memory options + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + +# Linker flags. +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) + + + + +# Programming support using avrdude. Settings and variables. + +# Programming hardware: alf avr910 avrisp bascom bsd +# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 +# +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = stk500v2 + +# com1 = serial port. Use lpt1 to connect to parallel port. +# AVRDUDE_PORT = usb # programmer connected to serial device +# AVRDUDE_PORT = /dev/ttyACM0 +AVRDUDE_PORT = /dev/ttyACM0 +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep + +AVRDUDE_WRITE_FLASH += -U lfuse:w:0xce:m +AVRDUDE_WRITE_FLASH += -U hfuse:w:0xd9:m +AVRDUDE_WRITE_FLASH += -U efuse:w:0xfc:m + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +# AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -F -p $(DUDEMCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) -B50 +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) + +# --------------------------------------------------------------------------- + +# Define directories, if needed. +DIRAVR = c:/winavr +DIRAVRBIN = $(DIRAVR)/bin +DIRAVRUTILS = $(DIRAVR)/utils/bin +DIRINC = . +DIRLIB = $(DIRAVR)/avr/lib + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +COPY = cp + + + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: + + + + +# Define all object files. +OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) + +# Define all listing files. +LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) + + +# Compiler flags to generate dependency files. +GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d + + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter finished end + +build: elf hex eep lss sym + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +finished: + @echo $(MSG_ERRORS_NONE) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) -A $(TARGET).elf +sizebefore: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi + +sizeafter: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) --debugging \ +--change-section-address .data-0x800000 \ +--change-section-address .bss-0x800000 \ +--change-section-address .noinit-0x800000 \ +--change-section-address .eeprom-0x810000 + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + + +# Target: clean project. +clean: begin clean_list finished end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).a90 + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lnk + $(REMOVE) $(TARGET).lss + $(REMOVE) $(OBJ) + $(REMOVE) $(LST) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) .dep/* + + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff \ +clean clean_list program + diff --git a/Source/bj-keyer.h b/Source/bj-keyer.h new file mode 100644 index 0000000..837d409 --- /dev/null +++ b/Source/bj-keyer.h @@ -0,0 +1,263 @@ +#ifndef BJ-KEYER_H_INCLUDED +#define BJ-KEYER_H_INCLUDED + +#define F_CPU 16000000UL + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "oled/i2c.h" +#include "oled/lcd.h" +#include "oled/font.h" + +#include "encoder.h" +#include "functions.h" + +// Const strings for display +const char CALL[] = " DL7BJ "; +const char PRG[] = " BJ-Keyer "; +const char VER[] = " V1.0 "; +const char Trx1[] = "TRX 1"; +const char Trx2[] = "TRX 2"; +const char Trx[] = "Beide TRX"; +const char IambicA[] = "Iambic A"; +const char IambicB[] = "Iambic B"; +const char Ratio[] = "Ratio"; +const char Reverse[] = "R"; +const char SideToneOnOff[] = "Mithörton"; +const char SideToneFreq[] = "Frequenz"; + +const char Yes[] = "J"; +const char No[] = "N"; +const char Hz[] = "Hz"; + +#ifndef EEMEM +#define EEMEM __attribute__ ((section (".eeprom"))) +#endif + +#ifndef NOINIT +#define NOINIT __attribute__ ((section (".noinit"))) +#endif + +#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) // clear bit +#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) // set bit + +// The length of one dit at 1wpm is 1.2s. The timer resolution +// of Timer 1 is set to 64µs, so there are 18750 ticks needed. +#define TICKS_PER_WPM 18750 + +#define L_WAIT 500 // Frequency for debug LED Timer 0 + +#define NOTHING 0 +#define DIT_DAH_OFF 1 +#define DAH_DIT_OFF 2 +#define DIT_DAH_ON 3 +#define DAH_DIT_ON 4 +// Keyer mode +#define STRAIGHT 0 +#define IAMBIC_B 1 +#define IAMBIC_A 2 +#define SINGLE_PADDLE 3 +// Paddle Mode +#define PADDLE_NORMAL 0 +#define PADDLE_REVERSE 1 +// Machine Mode +#define NORMAL 0 +#define COMMAND 1 +// Sending Mode +#define SENDING_NOTHING 0 +#define SENDING_DIT 1 +#define SENDING_DAH 2 +#define SENDING_ELEMENT_SPACE 3 +// +#define AUTOMATIC_SENDING 0 +#define AUTOMATIC 0 +#define MANUAL 1 +#define MANUAL_SENDING 1 +// Side Tone +#define SIDETONE_OFF 0 +#define SIDETONE_ON 1 +// Ports +#define LEFT_PADDLE PD2 // Left Paddle Input +#define RIGHT_PADDLE PD3 // Right Paddle Input +#define STRAIGHT_KEY PD4 // Straight key Input +#define MORSE_LED PC3 // LED Morse Output +#define MEM1 PD5 // Mem 1 Input +#define MEM2 PD6 // Mem 2 Input +#define MEM3 PD7 // Mem 3 Input +#define MEM4 PC0 // Mem 4 Input +#define MEM5 PB5 // Mem 5 Input +#define TRX1 PC1 // TRX1 Output +#define TRX2 PC2 // TRX2 Output +#define AUDIO PB3 // PWM Audio Output +#define AUDIO_EN PB4 // Audio PA Enable +#define SCL PC5 // I²C LC Display +#define SDA PC4 // I²C LC Display +// States +#define ON 1 +#define OFF 0 +// Menue und Drehencoder +#define M_TRX1 1 +#define M_TRX2 2 +#define M_IAMBICA 3 +#define M_IAMBICB 4 +#define M_REVERSE 5 +#define M_RATIO 6 +#define M_TON_FREQ 7 +#define M_TON 8 +#define M_WPMBPM 9 +#define M_MAX 9 // maximale Menuepunke +// LCD +#define CLEARLINE " " + +// Sine wave table for PWM, 256 values +const int sinewave_length=256; +const unsigned char sinewave[] PROGMEM = { + 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae, + 0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8, + 0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5, + 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7, + 0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc, + 0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3, + 0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83, + 0X80,0X7C,0X79,0X76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51, + 0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27, + 0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a, + 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08, + 0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23, + 0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c, + 0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c +}; + +// Sidetone generation +double sidetone_f = 650; +const double refclk = 31376.6; +volatile unsigned long tword_m; +volatile unsigned long phaccu; +volatile uint8_t c4ms; +volatile uint8_t icnt; +volatile uint8_t icnt1; +volatile uint16_t idx; + +// Diverse Zähler für Timer 0 +uint16_t StoreEEprom = 0; // Wartezeit bis EEPROM geschrieben wird +uint16_t MenuCtrlTimer = 0; // Wartezeit bis zur Betriebsanzeige nach Config +volatile uint16_t ms; // Timer 0 max. 65535ms, all purpose timer variable +volatile uint16_t mselement; // Timer 0 max. 65535ms, element length of dit or dah + +int8_t wpm = 15; // Geschwindigkeit in wpm +uint8_t weight = 50; // Gewichtung Punkt-Strich Verhältnis +uint8_t t_element_length; + +struct Merker +{ + uint8_t WpMChanged: 1; + uint8_t WriteWpMEEProm: 1; +} bMerker; + +struct MenuCtrl +{ + uint8_t buttonPressed: 1; + uint8_t buttonPressedLong: 1; + uint8_t m_buttonPressed: 1; + uint8_t m_buttonPressedLong: 1; + uint8_t ClrScr: 1; + uint8_t Config: 1; + uint8_t WriteEEProm: 1; + uint8_t Update: 1; + uint8_t CurMenue; + +} bMenuCtrl; + +// State Machines +uint8_t MachineMode = NORMAL; +uint8_t PaddleMode = PADDLE_NORMAL; +uint8_t KeyerMode = IAMBIC_A; +uint8_t SidetoneMode = NORMAL; + +volatile uint8_t Mode = NORMAL; +volatile uint8_t SendStatus = SENDING_NOTHING; +volatile uint8_t LastSendStatus = MANUAL_SENDING; + +uint8_t KeyTX = 1; + +uint8_t DahBuffer = 0; +uint8_t DitBuffer = 0; +uint8_t Weighting = 50; +uint8_t IambicFlag = 0; +uint8_t KeyState = 0; +uint8_t DitCounter = 0; +uint8_t DahCounter = 0; +uint8_t CurrentTRX = TRX1; +uint8_t SpeedWpM = 1; + +volatile uint16_t l_timer = 0; // counter for LED on +volatile uint8_t t_timer = 0; // Frequency of audio output +volatile uint16_t t_wait = 0; // delayms max. 65535ms +volatile uint8_t t_pwm = 0; +volatile uint16_t t_wait_led = 50; + +volatile uint8_t encoder_timer = 0; // 10ms Timer for Encoder +volatile int8_t encoder_counter = 0; // Vor/Rück Zähler + +// EEPROM +uint8_t dummy = 0x55; +uint8_t ee_dummy EEMEM = 0x55; // Dummy for Address 0 +uint8_t ee_wpm EEMEM = 15; // WpM +uint8_t ee_sidetone EEMEM = 0; // Mithörton An (1) oder Aus (0) +uint16_t ee_sidetone_f EEMEM = 650; // Frequenz des Mithörtons +uint8_t ee_iambic EEMEM = 0; // Iambic Mode A oder B +uint8_t ee_weight EEMEM = 50; // Dah dit Ratio +uint8_t ee_trx EEMEM = 0; // TRX 1 (0), TRX 2 (1), Beide (2) + +struct Config +{ + uint8_t trx; + uint8_t iambic; + uint8_t ratio; + uint16_t sidetone_f; + uint8_t sidetone; + uint8_t wpmbpm; + uint8_t wpm; + uint8_t reverse; + uint8_t weight; + +} bConfig; +// Function prototypes +void Init(void); +void InitTimer(void); + +void CheckDahPaddle(void); +void CheckDitPaddle(void); +void CheckPaddle(void); +void SendDit(uint8_t SendingType); +void SendDah(uint8_t SendingType); +void PTTKey(uint8_t State); +void SideToneOff(void); +void SideToneOn(void); +void TXSidetoneKey(uint8_t State, uint8_t SendingType); +void TellMode(void); +void SendChar(uint8_t); +void ChangeSpeed(void); + +void dah(void); +void dit(void); +void DoMorse(void); + +void SetFrequency(double f); + +#endif // BJ-KEYER_H_INCLUDED diff --git a/Source/encoder.c b/Source/encoder.c new file mode 100644 index 0000000..7fa3ed6 --- /dev/null +++ b/Source/encoder.c @@ -0,0 +1,161 @@ + +#include +#include +#include "encoder.h" + +int8_t DrehgeberPosition; +int8_t DrehgeberMax = 127; +int8_t DrehgeberMin = -127; + +#define DDR(x) (*(&x-1)) +#define Port(x) (*(&x)) +#define PIN(x) (*(&x-2)) + +#define PHASE_A PIN(ENC_A_PORT) & (1<= iButtonDebounceCycles && (! BUTTONPRESSED)) + { + buttonState = ButtonState_Released; + if(buttonPressed != ButtonPressed_Long) buttonPressed = ButtonPressed_Short; + } + if(iButtonPressedCounter >= iButtonPressedLongCycles) + { + buttonPressed = ButtonPressed_Long; + } + break; + case ButtonState_Released: + iButtonPressedCounter = 0; + buttonState = ButtonState_Unpressed; + break; + } +} +#if defined (SingleStep) +int8_t EncodeRead(void) +{ + int8_t val; + cli(); + val = enc_delta; + enc_delta = 0; + sei(); + return val; +} +#elif defined (TwoStep) +int8_t EncodeRead(void) +{ + int8_t val; + cli(); + val = enc_delta; + enc_delta = val & 1; + sei(); + return val >> 1; +} +#elif defined (FourStep) +int8_t EncodeRead(void) +{ + int8_t val; + cli(); + val = enc_delta; + enc_delta = val & 3; + sei(); + return val >> 2; +} +#endif + +int8_t EncoderRead(char Ueberlauf) +{ + DrehgeberPosition += EncodeRead(); + if(DrehgeberPosition > DrehgeberMax) + { + if(Ueberlauf) + DrehgeberPosition = DrehgeberPosition - DrehgeberMax + DrehgeberMin - 1; + else + DrehgeberPosition = DrehgeberMax; + } + if(DrehgeberPosition < DrehgeberMin) + { + if(Ueberlauf) + DrehgeberPosition = DrehgeberPosition + DrehgeberMax - DrehgeberMin + 1; + else + DrehgeberPosition = DrehgeberMin; + } + return(DrehgeberPosition); +} +void EncoderWrite(int8_t EncoderPos) +{ + DrehgeberPosition = EncoderPos; +} + +void EncoderMinMax(int8_t EncoderMin, int8_t EncoderMax) +{ + DrehgeberMin = EncoderMin; + DrehgeberMax = EncoderMax; + if(DrehgeberPosition > DrehgeberMax) DrehgeberPosition = DrehgeberMax; + if(DrehgeberPosition < DrehgeberMin) DrehgeberPosition = DrehgeberMin; +} +tEButtonPressedState EncoderGetButtonState(void) +{ + tEButtonPressedState retVal = buttonPressed; + buttonPressed = ButtonPressed_Unpressed; + return retVal; +} diff --git a/Source/encoder.h b/Source/encoder.h new file mode 100644 index 0000000..2d20574 --- /dev/null +++ b/Source/encoder.h @@ -0,0 +1,36 @@ +#ifndef ENCODER_H_ +#define ENCODER_H_ + +//Art des Drehencoders definieren +//#define SingleStep +//#define TwoStep +#define TwoStep + +#define ENC_A_PORT PORTB /**< port for line A */ +#define ENC_A_PIN PB0 /**< pin for line A */ +#define ENC_B_PORT PORTB /**< port for line B */ +#define ENC_B_PIN PB1 /**< pin for line B */ +#define ENC_T_PORT PORTB /**< port for button */ +#define ENC_T_PIN PB2 /**< pin for button */ + +typedef enum EButtonPressedState +{ + ButtonPressed_Unpressed, + ButtonPressed_Short, + ButtonPressed_Long + +}tEButtonPressedState; +//Initialisiert den Encoder und aktiviert den Interrupt + Timer +void EncoderInit( void ); +//Liest die Position des Encoders aus +//Wenn Ueberlauf=1 dann zählt der Encoder nach Max +//wieder von Min und umgekehrt +int8_t EncoderRead( char Ueberlauf ); +//Ruft den Status des Encoder-Knopfes +tEButtonPressedState EncoderGetButtonState(void); +//Setzt die aktuelle Drehencoderposition +void EncoderWrite(int8_t EncoderPos); +//Setzt Min- und Max-Werte für die Drehgeberposition +void EncoderMinMax(int8_t EncoderMin,int8_t EncoderMax); +void EncoderPolling(void); +#endif /* ENCODER_H_ */ diff --git a/Source/functions.c b/Source/functions.c new file mode 100644 index 0000000..c8da67d --- /dev/null +++ b/Source/functions.c @@ -0,0 +1,402 @@ +#include "functions.h" + +void delayms(uint16_t ms) +{ + t_wait = 0; + while(t_wait < ms); +} + +void IntEnable(void) +{ + SREG = sreg_tmp; + sei(); +} + +void IntDisable(void) +{ + sreg_tmp = SREG; + cli(); +} +/** \brief MilliSeconds + * + * Get the milliseconds of TIMER 0 + * +*/ +uint32_t MilliSeconds(void) +{ + uint32_t m; + ATOMIC_BLOCK(ATOMIC_FORCEON){ + m = ms; + } + return m; +} +void ResetMilliSeconds(void) +{ + ATOMIC_BLOCK(ATOMIC_FORCEON){ + ms = 0; + } +} + +/** \brief EEPROM schreiben + */ +void WriteEEProm(void) +{ + cli(); + eeprom_write_byte(&ee_dummy,0x55); + eeprom_write_byte(&ee_wpm, bConfig.wpm); + eeprom_write_byte(&ee_iambic, bConfig.iambic); + eeprom_write_word(&ee_sidetone_f, bConfig.sidetone_f); + eeprom_write_byte(&ee_trx, bConfig.trx); + sei(); +} + +void ReadEEProm(void) +{ +// wpm = eeprom_read_byte(&ee_wpm); +} + +void WriteEEProm_WpM(void) +{ + cli(); + eeprom_write_byte(&ee_wpm, bConfig.wpm); + sei(); +} + +void ReadEEProm_WpM(void) +{ + cli(); + bConfig.wpm = eeprom_read_byte(&ee_wpm); + sei(); + if(bConfig.wpm > 50) { + bConfig.wpm = 15; + WriteEEProm_WpM(); + } +} + + + + +/** \brief Read port pin of morse keys + * This function reads the input of + * the Paddle or Straight key. + * +*/ +uint8_t ReadKeyPin(uint8_t pin) +{ + return(PIND & (1< foc2apwm = fclk_I/O / 256 = 15.625Hz (p.149) + // PWM mode to phase correct PWM, 16.000.000MHz / 510 = 31372.55Hz + // (p.150) + sbi(TCCR2B,CS20); + cbi(TCCR2B,CS21); + cbi(TCCR2B,CS22); + // Clear OC2A on compare match + cbi(TCCR2A,COM2A0); + sbi(TCCR2A,COM2A1); + // Phase correct PWM Mode 1 + sbi(TCCR2A,WGM20); + cbi(TCCR2A,WGM21); + cbi(TCCR2A,WGM22); + + // Timer 1 + // 16MHz / (65535 * 1024) = 238.42Hz + // T = 1 / 238.42Hz = 4.19ms + // Timertick = 64µs + TCCR1A = 0; TCCR1B = 0; TCCR1C = 0; TCNT1 = 0; + sbi(TCCR1B,CS12); + cbi(TCCR1B,CS11); + sbi(TCCR1B,CS10); // prescaler 1024 (p.135) + sbi(TIMSK1,TOIE1); // Enable Overflow Interrupt + + // Timer 0 + // 16MHz / 64 = 250kHz + // Timertick T = 1 / 250kHz = 4µs + // CTC 250 x 4µs = 1ms + TCCR0A = 0; TCCR0B = 0; TCNT0 = 0; + cbi(TCCR0A,WGM00); + sbi(TCCR0A,WGM01); + cbi(TCCR0B,WGM02); // CTC Mode 2 Immediate + cbi(TCCR0B,CS02); + sbi(TCCR0B,CS01); + sbi(TCCR0B,CS00); // prescaler 64 + OCR0A = 249; // CTC 1ms + sbi(TIMSK0,OCIE0A); // Enable Timer 0 CTC + sei(); +} + +void Init() +{ + + cli(); // disable all interrupts + + MachineMode = NORMAL; + SendStatus = SENDING_NOTHING; + + // PORTB + PORTB |= (1<= L_WAIT){ + PORTD ^= (PD7); + l_timer = 0; + } + // Alle 5ms den Drehencoder abfragen + if(encoder_timer > 5) { + EncoderPolling(); + // Schalter vom Drehencoder abfragen + if(EncoderGetButtonState() == ButtonPressed_Short) + bMenuCtrl.buttonPressed = 1; + if(EncoderGetButtonState() == ButtonPressed_Long) + bMenuCtrl.buttonPressedLong = 1; + } + // Wpm verändert? + if((StoreEEprom > 1000) && (bMerker.WpMChanged)) + { + StoreEEprom = 0; + bMerker.WriteWpMEEProm = 1; + bMerker.WpMChanged = 0; + } + if((MenuCtrlTimer > 3000) && (bMenuCtrl.Config == 1)) + { + bMenuCtrl.Config = 0; + bMenuCtrl.Update = 1; + bMenuCtrl.ClrScr = 1; + BeepBoop(); + } +} + +/** \brief 8 Bit Timer 2 + * + * Timer 2 overflow interrupt + * Mit diesem Interrupt wird der nächste Wert für die + * Erzeugung des Sinus für den Mithörton geladen. + * +*/ +ISR(TIMER2_OVF_vect) +{ + phaccu = phaccu + tword_m; + icnt = phaccu >> 24; + OCR2A = pgm_read_byte_near(sinewave+icnt); +} +/** \brief ClearSendBuffer + * +*/ +void ClearSendBuffer(void) +{ + // sendbufferbytes = 0; +} + +/** \brief CheckDitPaddle + * + * +*/ +void CheckDitPaddle(void) +{ + uint8_t pinvalue = 0; + uint8_t ditpaddle = 0; + + if(PaddleMode == PADDLE_NORMAL) // no reverse paddle + ditpaddle = LEFT_PADDLE; + else + ditpaddle = RIGHT_PADDLE; // reverse paddle + + pinvalue = ReadKeyPin(ditpaddle); + + if(pinvalue == 0) + DitBuffer = 1; +} +/* + ** CheckDahPaddle + */ +void CheckDahPaddle(void) +{ + uint8_t pinvalue = 0; + uint8_t dahpaddle = 0; + + if(PaddleMode == PADDLE_NORMAL) // no reverse paddle + dahpaddle = RIGHT_PADDLE; + else + dahpaddle = LEFT_PADDLE; // reverse paddle + + pinvalue = ReadKeyPin(dahpaddle); + + if(pinvalue == 0) { + if(DahBuffer == 0) { + DahCounter++; + DitCounter = 0; + } + DahBuffer = 1; + } +} +/* + ** DoMorse + */ +void DoMorse(void) +{ + if((KeyerMode == IAMBIC_A) || (KeyerMode == IAMBIC_B) || KeyerMode == SINGLE_PADDLE) + { + if((KeyerMode == IAMBIC_A) && (IambicFlag) && (ReadKeyPin(LEFT_PADDLE))) + { + IambicFlag = 0; + DitBuffer = 0; + DahBuffer = 0; + } + else + { + if(DitBuffer) + { + DitBuffer = 0; + SendDit(MANUAL_SENDING); + } + if(DahBuffer) + { + DahBuffer = 0; + SendDah(MANUAL_SENDING); + } + } + } + else + { + if(KeyerMode == STRAIGHT) + { + if(DitBuffer) + { + DitBuffer = 0; + TXSidetoneKey(1,MANUAL_SENDING); + } + else + { + TXSidetoneKey(0,MANUAL_SENDING); + } + DitCounter = 0; + } + } +} + +void ConfigMenue(void) +{ + char line[22]; + + lcd_charMode(NORMAL); + lcd_gotoxy(0,0); + sprintf(line,"%s - %i","Konfiguration", bMenuCtrl.CurMenue); + lcd_puts(line); + lcd_charMode(DOUBLESIZE); + lcd_gotoxy(0,3); + lcd_puts(CLEARLINE); + switch(bMenuCtrl.CurMenue) + { + case M_TRX1: + lcd_gotoxy(0,3); + if((bConfig.trx == 1) || (bConfig.trx == 0)) + sprintf(line,"[%s]", "TRX 1"); + else + sprintf(line,"%s", "TRX 1"); + lcd_puts(line); + break; + case M_TRX2: + lcd_gotoxy(0,3); + if((bConfig.trx == 2) || (bConfig.trx == 0)) + sprintf(line,"[%s]", "TRX 2"); + else + sprintf(line,"%s", "TRX 2"); + lcd_puts(line); + break; + case M_IAMBICA: + lcd_gotoxy(0,3); + if(bConfig.iambic == 1) + sprintf(line,"[%s]", "Iambic A"); + else + sprintf(line,"%s", "Iambic A"); + lcd_puts(line); + break; + case M_IAMBICB: + lcd_gotoxy(0,3); + if(bConfig.iambic == 2) + sprintf(line,"[%s]", "Iambic B"); + else + sprintf(line,"%s", "Iambic B"); + lcd_puts(line); + break; + case M_REVERSE: + lcd_gotoxy(0,3); + if(bConfig.reverse == 0) + sprintf(line,"%s", "L . R -"); + else + sprintf(line,"%s", "L - R ."); + lcd_puts(line); + break; + case M_RATIO: + lcd_gotoxy(0,3); + if(bConfig.ratio == 30) + sprintf(line,"%s", "Ratio 3:1"); + else + sprintf(line,"%s %f:1", "Ratio", bConfig.ratio/10); + lcd_puts(line); + break; + case M_TON_FREQ: + lcd_gotoxy(0,3); + if(bConfig.sidetone_f == 650) + sprintf(line,"%s", "Ton 650Hz"); + else + sprintf(line,"%s %uHz", "Ton", bConfig.sidetone_f); + lcd_puts(line); + break; + case M_TON: + lcd_gotoxy(0,3); + if(bConfig.ratio == 1) + sprintf(line,"%s", "Ton an"); + else + sprintf(line,"%s", "Ton aus"); + lcd_puts(line); + break; + case M_WPMBPM: + lcd_gotoxy(0,3); + if(bConfig.wpmbpm == 0) + sprintf(line,"%s", "WpM"); + else + sprintf(line,"%s", "BpM"); + lcd_puts(line); + break; + } + bMenuCtrl.Update = 0; + lcd_charMode(NORMAL); +} +/** \brief UpdateDisplay + * + * Aktualisierung der Anzeigen auf dem Display je nach + * aktueller Funktion. + * + * DOUBLESIZE 4x10 character + * NORMALSIZE 8x21 character +*/ +void UpdateDisplay(void) +{ + char line[22]; + + if(bMenuCtrl.Update) + { + if(bMenuCtrl.ClrScr) + { + lcd_clrscr(); + bMenuCtrl.ClrScr = 0; + } + + if(!(bMenuCtrl.Config)) + { + lcd_charMode(DOUBLESIZE); + lcd_gotoxy(4,3); + if(bConfig.wpmbpm) + sprintf(line,"%i WpM ",bConfig.wpm); + else + sprintf(line,"%i BpM ", bConfig.wpm*5); + lcd_puts(line); + lcd_charMode(NORMAL); + lcd_gotoxy(13,0); + if(bConfig.iambic == 1) + sprintf(line,"%s", IambicA); + if(bConfig.iambic == 2) + sprintf(line,"%s", IambicB); + lcd_puts(line); + lcd_gotoxy(0,0); + if(bConfig.trx == 1) + sprintf(line, "%s", Trx1); + if(bConfig.trx == 2) + sprintf(line, "%s", Trx2); + if(bConfig.trx == 0) + sprintf(line, "%s %s", Trx1, Trx2); + lcd_puts(line); + } + if(bMenuCtrl.Config) + { + ConfigMenue(); + } + bMenuCtrl.Update = 0; + } +} +void Drehencoder(void) +{ + int8_t st = 0; + static int8_t last; + + if(!(bMenuCtrl.Config)) + { + EncoderMinMax(5,50); + st = EncoderRead(1); + if(bConfig.wpm != st) + { + bConfig.wpm = st; + bMerker.WpMChanged = 1; + bMenuCtrl.Update = 1; + } + } + + if((bMenuCtrl.buttonPressed == 1) && (bMenuCtrl.Config == 0)) + { + bMenuCtrl.Config = 1; + MenuCtrlTimer = 0; + bMenuCtrl.buttonPressed = 0; + } + + if((bMenuCtrl.buttonPressedLong == 1) && (bMenuCtrl.Config == 1)) + { + bMenuCtrl.Config = 0; + bMenuCtrl.Update = 1; + bMenuCtrl.buttonPressedLong = 0; + bMenuCtrl.buttonPressed = 0; + bMenuCtrl.m_buttonPressed = 0; + bMenuCtrl.m_buttonPressed = 0; + MenuCtrlTimer = 0; + } + + if(bMenuCtrl.Config == 1) + { + if(!bMenuCtrl.buttonPressed) + { + EncoderMinMax(1,M_MAX); + st = EncoderRead(1); + if(last != st) + { + bMenuCtrl.CurMenue = st; + bMenuCtrl.Update = 1; + } + last = st; + } + + if(bMenuCtrl.buttonPressed) + { + bMenuCtrl.m_buttonPressed = 1; + bMenuCtrl.buttonPressed = 0; + } + + if(bMenuCtrl.m_buttonPressed == 1) + { + UpdateDisplay(); + switch(bMenuCtrl.CurMenue) + { + case M_TRX1: + if(bConfig.trx == 2) + bConfig.trx = 0; + else + bConfig.trx = 1; + bMenuCtrl.m_buttonPressed = 0; + break; + case M_TRX2: + if(bConfig.trx == 1) + bConfig.trx = 0; + else + bConfig.trx = 2; + bMenuCtrl.m_buttonPressed = 0; + break; + case M_IAMBICA: + bConfig.iambic = 1; + bMenuCtrl.m_buttonPressed = 0; + break; + case M_IAMBICB: + bConfig.iambic = 2; + bMenuCtrl.m_buttonPressed = 0; + break; + case M_REVERSE: + if(bConfig.reverse == 1) + bConfig.reverse = 0; + else + bConfig.reverse = 1; + bMenuCtrl.m_buttonPressed = 0; + break; + case M_RATIO: + EncoderMinMax(15,30); + st = EncoderRead(1); + bConfig.ratio = st; + if(bConfig.ratio > 30) bConfig.ratio = 30; + if(bConfig.ratio < 15) bConfig.ratio = 15; + bMenuCtrl.Update = 1; + break; + case M_TON_FREQ: + break; + } + } + } +} + +/* + ** main + */ +int main(void) +{ + Init(); + SetFrequency(650); + SideToneOff(); + + lcd_init(LCD_DISP_ON); + lcd_charMode(DOUBLESIZE); + lcd_home(); + lcd_puts(PRG); + lcd_gotoxy(1,2); + lcd_puts(VER); + lcd_gotoxy(2,4); + lcd_puts(CALL); + delayms(1000); + + BeepBoop(); + MachineMode = NORMAL; + KeyerMode = IAMBIC_A; + ReadEEProm_WpM(); + + EncoderWrite(bConfig.wpm); + + while(1) + { + Drehencoder(); + + if(bMerker.WriteWpMEEProm) + WriteEEProm_WpM(); + + UpdateDisplay(); + + if(MachineMode == NORMAL) + { + CheckPaddles(); + DoMorse(); + } + + if(MachineMode == COMMAND) + { + + } + } +} + + diff --git a/Source/oled/LICENSE b/Source/oled/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/Source/oled/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + 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 + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Source/oled/Makefile b/Source/oled/Makefile new file mode 100644 index 0000000..5525857 --- /dev/null +++ b/Source/oled/Makefile @@ -0,0 +1,454 @@ +# Hey Emacs, this is a -*- makefile -*- +# +# WinAVR makefile written by Eric B. Weddington, Jˆrg Wunsch, et al. +# Released to the Public Domain +# Please read the make user manual! +# +# Additional material for this makefile was submitted by: +# Tim Henigan +# Peter Fleury +# Reiner Patommel +# Sander Pool +# Frederik Rouleau +# Markus Pfaff +# +# On command line: +# +# make all = Make software. +# +# make clean = Clean out built project files. +# +# make coff = Convert ELF to AVR COFF (for use with AVR Studio 3.x or VMLAB). +# +# make extcoff = Convert ELF to AVR Extended COFF (for use with AVR Studio +# 4.07 or greater). +# +# make program = Download the hex file to the device, using avrdude. Please +# customize the avrdude settings below first! +# +# make filename.s = Just compile filename.c into the assembler code only +# +# To rebuild project do "make clean" then "make all". +# + +# mth 2004/09 +# Differences from WinAVR 20040720 sample: +# - DEPFLAGS according to Eric Weddingtion's fix (avrfreaks/gcc-forum) +# - F_CPU Define in CFLAGS and AFLAGS + + +# MCU name +MCU = atmega328p + +# Main Oscillator Frequency +# This is only used to define F_CPU in all assembler and c-sources. +F_CPU = 16000000UL + +# Output format. (can be srec, ihex, binary) +FORMAT = ihex + +# Target file name (without extension). +TARGET = main + + +# List C source files here. (C dependencies are automatically generated.) +SRC = $(wildcard *.c) + +# List Assembler source files here. +# Make them always end in a capital .S. Files ending in a lowercase .s +# will not be considered source files but generated files (assembler +# output from the compiler), and will be deleted upon "make clean"! +# Even though the DOS/Win* filesystem matches both .s and .S the same, +# it will preserve the spelling of the filenames, and gcc itself does +# care about how the name is spelled on its command-line. +ASRC = + + + +# Optimization level, can be [0, 1, 2, 3, s]. +# 0 = turn off optimization. s = optimize for size. +# (Note: 3 is not always the best optimization level. See avr-libc FAQ.) +OPT = s + +# Debugging format. +# Native formats for AVR-GCC's -g are stabs [default], or dwarf-2. +# AVR (extended) COFF requires stabs, plus an avr-objcopy run. +#DEBUG = stabs +DEBUG = dwarf-2 + +# List any extra directories to look for include files here. +# Each directory must be seperated by a space. +EXTRAINCDIRS = + + +# Compiler flag to set the C Standard level. +# c89 - "ANSI" C +# gnu89 - c89 plus GCC extensions +# c99 - ISO C99 standard (not yet fully implemented) +# gnu99 - c99 plus GCC extensions +CSTANDARD = -std=gnu99 + +# Place -D or -U options here +CDEFS = + +# Place -I options here +CINCS = + + +# Compiler flags. +# -g*: generate debugging information +# -O*: optimization level +# -f...: tuning, see GCC manual and avr-libc documentation +# -Wall...: warning level +# -Wa,...: tell GCC to pass this to the assembler. +# -adhlns...: create assembler listing +CFLAGS = -g$(DEBUG) +CFLAGS += $(CDEFS) $(CINCS) +CFLAGS += -O$(OPT) +CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums +CFLAGS += -Wall -Wstrict-prototypes +CFLAGS += -Wa,-adhlns=$(<:.c=.lst) +CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) +CFLAGS += $(CSTANDARD) +CFLAGS += -DF_CPU=$(F_CPU) +#CFLAGS += -finput-charset=utf-8 -fexec-charset=iso-8859-15 + + + +# Assembler flags. +# -Wa,...: tell GCC to pass this to the assembler. +# -ahlms: create listing +# -gstabs: have the assembler create line number information; note that +# for use in COFF files, additional information about filenames +# and function names needs to be present in the assembler source +# files -- see avr-libc docs [FIXME: not yet described there] +ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs +ASFLAGS += -DF_CPU=$(F_CPU) + + +#Additional libraries. + +# Minimalistic printf version +PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min + +# Floating point printf version (requires MATH_LIB = -lm below) +PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt + +PRINTF_LIB = + +# Minimalistic scanf version +SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min + +# Floating point + %[ scanf version (requires MATH_LIB = -lm below) +SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt + +SCANF_LIB = + +MATH_LIB = -lm + +# External memory options + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# used for variables (.data/.bss) and heap (malloc()). +#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff + +# 64 KB of external RAM, starting after internal RAM (ATmega128!), +# only used for heap (malloc()). +#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff + +EXTMEMOPTS = + +# Linker flags. +# -Wl,...: tell GCC to pass this to linker. +# -Map: create map file +# --cref: add cross reference to map file +LDFLAGS = -Wl,-Map=$(TARGET).map,--cref +LDFLAGS += $(EXTMEMOPTS) +LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB) + + + + +# Programming support using avrdude. Settings and variables. + +# Programming hardware: alf avr910 avrisp bascom bsd +# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500 +# +# Type: avrdude -c ? +# to get a full listing. +# +AVRDUDE_PROGRAMMER = avrispmkii + +# com1 = serial port. Use lpt1 to connect to parallel port. +AVRDUDE_PORT = usb # programmer connected to serial device + +AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex +AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep +AVRDUDE_WRITE_FUSES = -U lfuse:w:0xFF:m -U hfuse:w:0xdf:m +#-U efuse:w:0xff:m +AVRDUDE_WRITE_LOCKS = -U lock:w:0f:m + + +# Uncomment the following if you want avrdude's erase cycle counter. +# Note that this counter needs to be initialized first using -Yn, +# see avrdude manual. +#AVRDUDE_ERASE_COUNTER = -y + +# Uncomment the following if you do /not/ wish a verification to be +# performed after programming the device. +#AVRDUDE_NO_VERIFY = -V + +# Increase verbosity level. Please use this when submitting bug +# reports about avrdude. See +# to submit bug reports. +#AVRDUDE_VERBOSE = -v -v + +AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) +AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY) +AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE) +AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER) +AVRDUDE_FLAGS += -b 19200 + + + +# --------------------------------------------------------------------------- + +# Define directories, if needed. +# DIRAVR = c:/winavr/ #for Windows +DIRAVR = /usr/local/avr/ #for Mac OS (crossavr) +DIRAVRBIN = $(DIRAVR)/bin +DIRAVRUTILS = $(DIRAVR)/utils/bin +DIRINC = . +DIRLIB = $(DIRAVR)/avr/lib + + +# Define programs and commands. +SHELL = sh +CC = avr-gcc +OBJCOPY = avr-objcopy +OBJDUMP = avr-objdump +SIZE = avr-size +NM = avr-nm +AVRDUDE = avrdude +REMOVE = rm -f +COPY = cp + + + + +# Define Messages +# English +MSG_ERRORS_NONE = Errors: none +MSG_BEGIN = -------- begin -------- +MSG_END = -------- end -------- +MSG_SIZE_BEFORE = Size before: +MSG_SIZE_AFTER = Size after: +MSG_COFF = Converting to AVR COFF: +MSG_EXTENDED_COFF = Converting to AVR Extended COFF: +MSG_FLASH = Creating load file for Flash: +MSG_EEPROM = Creating load file for EEPROM: +MSG_EXTENDED_LISTING = Creating Extended Listing: +MSG_SYMBOL_TABLE = Creating Symbol Table: +MSG_LINKING = Linking: +MSG_COMPILING = Compiling: +MSG_ASSEMBLING = Assembling: +MSG_CLEANING = Cleaning project: + + + + +# Define all object files. +OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) + +# Define all listing files. +LST = $(ASRC:.S=.lst) $(SRC:.c=.lst) + + +# Compiler flags to generate dependency files. +### GENDEPFLAGS = -Wp,-M,-MP,-MT,$(*F).o,-MF,.dep/$(@F).d +GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d + +# Combine all necessary flags and optional flags. +# Add target processor to flags. +ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS) +ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS) + + + + + +# Default target. +all: begin gccversion sizebefore build sizeafter finished end + +build: elf hex eep lss sym + +elf: $(TARGET).elf +hex: $(TARGET).hex +eep: $(TARGET).eep +lss: $(TARGET).lss +sym: $(TARGET).sym + + + +# Eye candy. +# AVR Studio 3.x does not check make's exit code but relies on +# the following magic strings to be generated by the compile job. +begin: + @echo + @echo $(MSG_BEGIN) + +finished: + @echo $(MSG_ERRORS_NONE) + +end: + @echo $(MSG_END) + @echo + + +# Display size of file. +HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex +ELFSIZE = $(SIZE) -A $(TARGET).elf +sizebefore: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); echo; fi + +sizeafter: + @if [ -f $(TARGET).elf ]; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); echo; fi + + + +# Display compiler version information. +gccversion : + @$(CC) --version + + + +# Program the device. +program: $(TARGET).hex $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM) $(AVRDUDE_WRITE_FUSES) + +# Write only flash +flash: $(TARGET).hex + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) + +# Write only eeprom +eeprom: $(TARGET).eep + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_EEPROM) + +# Write fuses +fuse: + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FUSES) + +# Write locks +lock: + $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_LOCKS) + +# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB. +COFFCONVERT=$(OBJCOPY) --debugging \ +--change-section-address .data-0x800000 \ +--change-section-address .bss-0x800000 \ +--change-section-address .noinit-0x800000 \ +--change-section-address .eeprom-0x810000 + + +coff: $(TARGET).elf + @echo + @echo $(MSG_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-avr $< $(TARGET).cof + + +extcoff: $(TARGET).elf + @echo + @echo $(MSG_EXTENDED_COFF) $(TARGET).cof + $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof + + + +# Create final output files (.hex, .eep) from ELF output file. +%.hex: %.elf + @echo + @echo $(MSG_FLASH) $@ + $(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@ + +%.eep: %.elf + @echo + @echo $(MSG_EEPROM) $@ + -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ + --change-section-lma .eeprom=0 -O $(FORMAT) $< $@ + +# Create extended listing file from ELF output file. +%.lss: %.elf + @echo + @echo $(MSG_EXTENDED_LISTING) $@ + $(OBJDUMP) -h -S $< > $@ + +# Create a symbol table from ELF output file. +%.sym: %.elf + @echo + @echo $(MSG_SYMBOL_TABLE) $@ + $(NM) -n $< > $@ + + + +# Link: create ELF output file from object files. +.SECONDARY : $(TARGET).elf +.PRECIOUS : $(OBJ) +%.elf: $(OBJ) + @echo + @echo $(MSG_LINKING) $@ + $(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS) + + +# Compile: create object files from C source files. +%.o : %.c + @echo + @echo $(MSG_COMPILING) $< + $(CC) -c $(ALL_CFLAGS) $< -o $@ + + +# Compile: create assembler files from C source files. +%.s : %.c + $(CC) -S $(ALL_CFLAGS) $< -o $@ + + +# Assemble: create object files from assembler source files. +%.o : %.S + @echo + @echo $(MSG_ASSEMBLING) $< + $(CC) -c $(ALL_ASFLAGS) $< -o $@ + + + +# Target: clean project. +clean: begin clean_list finished end + +clean_list : + @echo + @echo $(MSG_CLEANING) + $(REMOVE) $(TARGET).hex + $(REMOVE) $(TARGET).eep + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).cof + $(REMOVE) $(TARGET).elf + $(REMOVE) $(TARGET).map + $(REMOVE) $(TARGET).obj + $(REMOVE) $(TARGET).a90 + $(REMOVE) $(TARGET).sym + $(REMOVE) $(TARGET).lnk + $(REMOVE) $(TARGET).lss + $(REMOVE) $(OBJ) + $(REMOVE) $(LST) + $(REMOVE) $(SRC:.c=.s) + $(REMOVE) $(SRC:.c=.d) + $(REMOVE) .dep/* + + + +# Include the dependency files. +-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*) + + +# Listing of phony targets. +.PHONY : all begin finish end sizebefore sizeafter gccversion \ +build elf hex eep lss sym coff extcoff \ +clean clean_list program + diff --git a/Source/oled/font.c b/Source/oled/font.c new file mode 100644 index 0000000..0ca02a4 --- /dev/null +++ b/Source/oled/font.c @@ -0,0 +1,140 @@ +/* + * font.c + * i2c + * + * Created by Michael Köhler on 16.09.18. + * Copyright 2018 Skie-Systems. All rights reserved. + * + */ +#include "font.h" + +const char ssd1306oled_font[][6] PROGMEM = { +{0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // sp +{0x00, 0x00, 0x00, 0x2f, 0x00, 0x00}, // ! +{0x00, 0x00, 0x07, 0x00, 0x07, 0x00}, // " +{0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14}, // # +{0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12}, // $ +{0x00, 0x62, 0x64, 0x08, 0x13, 0x23}, // % +{0x00, 0x36, 0x49, 0x55, 0x22, 0x50}, // & +{0x00, 0x00, 0x05, 0x03, 0x00, 0x00}, // ' +{0x00, 0x00, 0x1c, 0x22, 0x41, 0x00}, // ( +{0x00, 0x00, 0x41, 0x22, 0x1c, 0x00}, // ) +{0x00, 0x14, 0x08, 0x3E, 0x08, 0x14}, // * +{0x00, 0x08, 0x08, 0x3E, 0x08, 0x08}, // + +{0x00, 0x00, 0x00, 0xA0, 0x60, 0x00}, // , +{0x00, 0x08, 0x08, 0x08, 0x08, 0x08}, // - +{0x00, 0x00, 0x60, 0x60, 0x00, 0x00}, // . +{0x00, 0x20, 0x10, 0x08, 0x04, 0x02}, // / +{0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E}, // 0 +{0x00, 0x00, 0x42, 0x7F, 0x40, 0x00}, // 1 +{0x00, 0x42, 0x61, 0x51, 0x49, 0x46}, // 2 +{0x00, 0x21, 0x41, 0x45, 0x4B, 0x31}, // 3 +{0x00, 0x18, 0x14, 0x12, 0x7F, 0x10}, // 4 +{0x00, 0x27, 0x45, 0x45, 0x45, 0x39}, // 5 +{0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30}, // 6 +{0x00, 0x01, 0x71, 0x09, 0x05, 0x03}, // 7 +{0x00, 0x36, 0x49, 0x49, 0x49, 0x36}, // 8 +{0x00, 0x06, 0x49, 0x49, 0x29, 0x1E}, // 9 +{0x00, 0x00, 0x36, 0x36, 0x00, 0x00}, // : +{0x00, 0x00, 0x56, 0x36, 0x00, 0x00}, // ; +{0x00, 0x08, 0x14, 0x22, 0x41, 0x00}, // < +{0x00, 0x14, 0x14, 0x14, 0x14, 0x14}, // = +{0x00, 0x00, 0x41, 0x22, 0x14, 0x08}, // > +{0x00, 0x02, 0x01, 0x51, 0x09, 0x06}, // ? +{0x00, 0x32, 0x49, 0x59, 0x51, 0x3E}, // @ +{0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C}, // A +{0x00, 0x7F, 0x49, 0x49, 0x49, 0x36}, // B +{0x00, 0x3E, 0x41, 0x41, 0x41, 0x22}, // C +{0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C}, // D +{0x00, 0x7F, 0x49, 0x49, 0x49, 0x41}, // E +{0x00, 0x7F, 0x09, 0x09, 0x09, 0x01}, // F +{0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A}, // G +{0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F}, // H +{0x00, 0x00, 0x41, 0x7F, 0x41, 0x00}, // I +{0x00, 0x20, 0x40, 0x41, 0x3F, 0x01}, // J +{0x00, 0x7F, 0x08, 0x14, 0x22, 0x41}, // K +{0x00, 0x7F, 0x40, 0x40, 0x40, 0x40}, // L +{0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F}, // M +{0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F}, // N +{0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E}, // O +{0x00, 0x7F, 0x09, 0x09, 0x09, 0x06}, // P +{0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E}, // Q +{0x00, 0x7F, 0x09, 0x19, 0x29, 0x46}, // R +{0x00, 0x46, 0x49, 0x49, 0x49, 0x31}, // S +{0x00, 0x01, 0x01, 0x7F, 0x01, 0x01}, // T +{0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F}, // U +{0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F}, // V +{0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F}, // W +{0x00, 0x63, 0x14, 0x08, 0x14, 0x63}, // X +{0x00, 0x07, 0x08, 0x70, 0x08, 0x07}, // Y +{0x00, 0x61, 0x51, 0x49, 0x45, 0x43}, // Z +{0x00, 0x00, 0x7F, 0x41, 0x41, 0x00}, // [ +{0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55}, // backslash +{0x00, 0x00, 0x41, 0x41, 0x7F, 0x00}, // ] +{0x00, 0x04, 0x02, 0x01, 0x02, 0x04}, // ^ +{0x00, 0x40, 0x40, 0x40, 0x40, 0x40}, // _ +{0x00, 0x00, 0x01, 0x02, 0x04, 0x00}, // ' +{0x00, 0x20, 0x54, 0x54, 0x54, 0x78}, // a +{0x00, 0x7F, 0x48, 0x44, 0x44, 0x38}, // b +{0x00, 0x38, 0x44, 0x44, 0x44, 0x20}, // c +{0x00, 0x38, 0x44, 0x44, 0x48, 0x7F}, // d +{0x00, 0x38, 0x54, 0x54, 0x54, 0x18}, // e +{0x00, 0x08, 0x7E, 0x09, 0x01, 0x02}, // f +{0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C}, // g +{0x00, 0x7F, 0x08, 0x04, 0x04, 0x78}, // h +{0x00, 0x00, 0x44, 0x7D, 0x40, 0x00}, // i +{0x00, 0x40, 0x80, 0x84, 0x7D, 0x00}, // j +{0x00, 0x7F, 0x10, 0x28, 0x44, 0x00}, // k +{0x00, 0x00, 0x41, 0x7F, 0x40, 0x00}, // l +{0x00, 0x7C, 0x04, 0x18, 0x04, 0x78}, // m +{0x00, 0x7C, 0x08, 0x04, 0x04, 0x78}, // n +{0x00, 0x38, 0x44, 0x44, 0x44, 0x38}, // o +{0x00, 0xFC, 0x24, 0x24, 0x24, 0x18}, // p +{0x00, 0x18, 0x24, 0x24, 0x18, 0xFC}, // q +{0x00, 0x7C, 0x08, 0x04, 0x04, 0x08}, // r +{0x00, 0x48, 0x54, 0x54, 0x54, 0x20}, // s +{0x00, 0x04, 0x3F, 0x44, 0x40, 0x20}, // t +{0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C}, // u +{0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C}, // v +{0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C}, // w +{0x00, 0x44, 0x28, 0x10, 0x28, 0x44}, // x +{0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C}, // y +{0x00, 0x44, 0x64, 0x54, 0x4C, 0x44}, // z +{0x00, 0x00, 0x08, 0x77, 0x41, 0x00}, // { +{0x00, 0x00, 0x00, 0x63, 0x00, 0x00}, // ¦ +{0x00, 0x00, 0x41, 0x77, 0x08, 0x00}, // } +{0x00, 0x08, 0x04, 0x08, 0x08, 0x04}, // ~ +/* end of normal char-set */ +/* put your own signs/chars here, edit special_char too */ +/* be sure that your first special char stand here */ +{0x00, 0x3A, 0x40, 0x40, 0x20, 0x7A}, // ü, !!! Important: this must be special_char[0] !!! +{0x00, 0x3D, 0x40, 0x40, 0x40, 0x3D}, // Ãœ +{0x00, 0x21, 0x54, 0x54, 0x54, 0x79}, // ä +{0x00, 0x7D, 0x12, 0x11, 0x12, 0x7D}, // Ä +{0x00, 0x39, 0x44, 0x44, 0x44, 0x39}, // ö +{0x00, 0x3D, 0x42, 0x42, 0x42, 0x3D}, // Ö +{0x00, 0x02, 0x05, 0x02, 0x00, 0x00}, // ° +{0x00, 0x7E, 0x01, 0x49, 0x55, 0x73}, // ß +{0x00, 0x7C, 0x10, 0x10, 0x08, 0x1C}, // µ +{0x00, 0x30, 0x48, 0x20, 0x48, 0x30}, // ω +{0x00, 0x5C, 0x62, 0x02, 0x62, 0x5C} // Ω +}; +const char special_char[][2] PROGMEM = { + // define position of special char in font + // {special char, position in font} + // be sure that last element of this + // array are {0xff, 0xff} and first element + // are {first special char, first element after normal char-set in font} + {'ü', 95}, // special_char[0] + {'Ãœ', 96}, + {'ä', 97}, + {'Ä', 98}, + {'ö', 99}, + {'Ö', 100}, + {'°', 101}, + {'ß', 102}, + {'µ', 103}, + {'ω', 104}, + {'Ω', 105}, + {0xff, 0xff} // end of table special_char +}; diff --git a/Source/oled/font.h b/Source/oled/font.h new file mode 100644 index 0000000..da8d44c --- /dev/null +++ b/Source/oled/font.h @@ -0,0 +1,16 @@ +/* + * font.h + * i2c + * + * Created by Michael Köhler on 13.09.18. + * Copyright 2018 Skie-Systems. All rights reserved. + * + */ +#ifndef _font_h_ +#define _font_h_ +#include + +extern const char ssd1306oled_font[][6] PROGMEM; +extern const char special_char[][2] PROGMEM; + +#endif diff --git a/Source/oled/i2c.c b/Source/oled/i2c.c new file mode 100644 index 0000000..607e0fa --- /dev/null +++ b/Source/oled/i2c.c @@ -0,0 +1,179 @@ +// +// i2c.c +// i2c +// +// Created by Michael Köhler on 09.10.17. +// +// + +#include "i2c.h" + +#if defined (__AVR_ATmega328__) || defined(__AVR_ATmega328P__) || \ +defined(__AVR_ATmega168P__) || defined(__AVR_ATmega168PA__) || \ +defined(__AVR_ATmega88P__) || \ +defined(__AVR_ATmega8__) || \ +defined(__AVR_ATmega48P__) || \ +defined(__AVR_ATmega1284P__) || \ +defined (__AVR_ATmega324A__) || defined (__AVR_ATmega324P__) || defined (__AVR_ATmega324PA__) || \ +defined (__AVR_ATmega644__) || defined (__AVR_ATmega644A__) || defined (__AVR_ATmega644P__) || defined (__AVR_ATmega644PA__) || \ +defined (__AVR_ATmega1284P__) || \ +defined (__AVR_ATmega2560__) +#if PSC_I2C != 1 && PSC_I2C != 4 && PSC_I2C != 16 && PSC_I2C != 64 +#error "Wrong prescaler for TWI !" +#elif SET_TWBR < 0 || SET_TWBR > 255 +#error "TWBR out of range, change PSC_I2C or F_I2C !" +#endif + +uint8_t I2C_ErrorCode; +/********************************************** + Public Function: i2c_init + + Purpose: Initialise TWI/I2C interface + + Input Parameter: none + + Return Value: none + **********************************************/ +void i2c_init(void){ + // set clock + switch (PSC_I2C) { + case 4: + TWSR = 0x1; + break; + case 16: + TWSR = 0x2; + break; + case 64: + TWSR = 0x3; + break; + default: + TWSR = 0x00; + break; + } + TWBR = (uint8_t)SET_TWBR; + // enable + TWCR = (1 << TWEN); +} +/********************************************** + Public Function: i2c_start + + Purpose: Start TWI/I2C interface + + Input Parameter: + - uint8_t i2c_addr: Adress of reciever + + Return Value: none + **********************************************/ +void i2c_start(uint8_t i2c_addr){ + // i2c start + TWCR = (1 << TWINT)|(1 << TWSTA)|(1 << TWEN); + uint16_t timeout = F_CPU/F_I2C*2.0; + while((TWCR & (1 << TWINT)) == 0 && + timeout !=0){ + timeout--; + if(timeout == 0){ + I2C_ErrorCode |= (1 << I2C_START); + return; + } + }; + // send adress + TWDR = i2c_addr; + TWCR = (1 << TWINT)|( 1 << TWEN); + timeout = F_CPU/F_I2C*2.0; + while((TWCR & (1 << TWINT)) == 0 && + timeout !=0){ + timeout--; + if(timeout == 0){ + I2C_ErrorCode |= (1 << I2C_SENDADRESS); + return; + } + }; +} +/********************************************** + Public Function: i2c_stop + + Purpose: Stop TWI/I2C interface + + Input Parameter: none + + Return Value: none + **********************************************/ +void i2c_stop(void){ + // i2c stop + TWCR = (1 << TWINT)|(1 << TWSTO)|(1 << TWEN); +} +/********************************************** + Public Function: i2c_byte + + Purpose: Send byte at TWI/I2C interface + + Input Parameter: + - uint8_t byte: Byte to send to reciever + + Return Value: none + **********************************************/ +void i2c_byte(uint8_t byte){ + TWDR = byte; + TWCR = (1 << TWINT)|( 1 << TWEN); + uint16_t timeout = F_CPU/F_I2C*2.0; + while((TWCR & (1 << TWINT)) == 0 && + timeout !=0){ + timeout--; + if(timeout == 0){ + I2C_ErrorCode |= (1 << I2C_BYTE); + return; + } + }; +} +/********************************************** + Public Function: i2c_readAck + + Purpose: read acknowledge from TWI/I2C Interface + + Input Parameter: none + + Return Value: uint8_t + - TWDR: recieved value at TWI/I2C-Interface, 0 at timeout + - 0: Error at read + **********************************************/ +uint8_t i2c_readAck(void){ + TWCR = (1< +#include + +extern uint8_t I2C_ErrorCode; // variable for communication error at twi + // ckeck it in your code + // 0 means no error + // define bits in I2C-ErrorCode: +#define I2C_START 0 // bit 0: timeout start-condition +#define I2C_SENDADRESS 1 // bit 0: timeout device-adress +#define I2C_BYTE 2 // bit 0: timeout byte-transmission +#define I2C_READACK 3 // bit 0: timeout read acknowledge +#define I2C_READNACK 4 // bit 0: timeout read nacknowledge + +void i2c_init(void); // init hw-i2c +void i2c_start(uint8_t i2c_addr); // send i2c_start_condition +void i2c_stop(void); // send i2c_stop_condition +void i2c_byte(uint8_t byte); // send data_byte + +uint8_t i2c_readAck(void); // read byte with ACK +uint8_t i2c_readNAck(void); // read byte with NACK + +#ifdef __cplusplus +} +#endif + +#endif /* i2c_h */ diff --git a/Source/oled/lcd.c b/Source/oled/lcd.c new file mode 100644 index 0000000..394661f --- /dev/null +++ b/Source/oled/lcd.c @@ -0,0 +1,534 @@ +/* + * This file is part of lcd library for ssd1306/ssd1309/sh1106 oled-display. + * + * lcd library for ssd1306/ssd1309/sh1106 oled-display is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * + * lcd library for ssd1306/ssd1309/sh1106 oled-display 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 + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see . + * + * Diese Datei ist Teil von lcd library for ssd1306/ssd1309/sh1106 oled-display. + * + * lcd library for ssd1306/ssd1309/sh1106 oled-display ist Freie Software: Sie können es unter den Bedingungen + * der GNU General Public License, wie von der Free Software Foundation, + * Version 3 der Lizenz oder jeder späteren + * veröffentlichten Version, weiterverbreiten und/oder modifizieren. + * + * lcd library for ssd1306/ssd1309/sh1106 oled-display wird in der Hoffnung, dass es nützlich sein wird, aber + * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite + * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÃœR EINEN BESTIMMTEN ZWECK. + * Siehe die GNU General Public License für weitere Details. + * + * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem + * Programm erhalten haben. Wenn nicht, siehe . + * + * lcd.h + * + * Created by Michael Köhler on 22.12.16. + * Copyright 2016 Skie-Systems. All rights reserved. + * + * lib for OLED-Display with ssd1306/ssd1309/sh1106-Controller + * first dev-version only for I2C-Connection + * at ATMega328P like Arduino Uno + * + * at GRAPHICMODE lib needs static SRAM for display: + * DISPLAY-WIDTH * DISPLAY-HEIGHT + 2 bytes + * + * at TEXTMODE lib need static SRAM for display: + * 2 bytes (cursorPosition) + */ + +#include "lcd.h" +#include "font.h" +#include + +#if defined SPI +#include +#endif + +static struct { + uint8_t x; + uint8_t y; +} cursorPosition; + +static uint8_t charMode = NORMALSIZE; +#if defined GRAPHICMODE +#include +static uint8_t displayBuffer[DISPLAY_HEIGHT/8][DISPLAY_WIDTH]; +#elif defined TEXTMODE +#else +#error "No valid displaymode! Refer lcd.h" +#endif + + +const uint8_t init_sequence [] PROGMEM = { // Initialization Sequence + LCD_DISP_OFF, // Display OFF (sleep mode) + 0x20, 0b00, // Set Memory Addressing Mode + // 00=Horizontal Addressing Mode; 01=Vertical Addressing Mode; + // 10=Page Addressing Mode (RESET); 11=Invalid + 0xB0, // Set Page Start Address for Page Addressing Mode, 0-7 + 0xC0, // Set COM Output Scan Direction 0xC0 normal, 0xC8 flip 180° + 0x00, // --set low column address + 0x10, // --set high column address + 0x40, // --set start line address + 0x81, 0x3F, // Set contrast control register + 0xA0, // Set Segment Re-map. A0=address mapped; A1=address 127 mapped. + 0xA6, // Set display mode. A6=Normal; A7=Inverse + 0xA8, DISPLAY_HEIGHT-1, // Set multiplex ratio(1 to 64) + 0xA4, // Output RAM to Display + // 0xA4=Output follows RAM content; 0xA5,Output ignores RAM content + 0xD3, 0x00, // Set display offset. 00 = no offset + 0xD5, // --set display clock divide ratio/oscillator frequency + 0xF0, // --set divide ratio + 0xD9, 0x22, // Set pre-charge period + // Set com pins hardware configuration +#if DISPLAY_HEIGHT==64 + 0xDA, 0x12, +#elif DISPLAY_HEIGHT==32 + 0xDA, 0x02, +#endif + 0xDB, // --set vcomh + 0x20, // 0x20,0.77xVcc + 0x8D, 0x14, // Set DC-DC enable + + +}; +#pragma mark LCD COMMUNICATION +void lcd_command(uint8_t cmd[], uint8_t size) { +#if defined I2C + i2c_start((LCD_I2C_ADR << 1) | 0); + i2c_byte(0x00); // 0x00 for command, 0x40 for data + for (uint8_t i=0; i (DISPLAY_WIDTH) || y > (DISPLAY_HEIGHT/8-1)) return;// out of display + cursorPosition.x=x; + cursorPosition.y=y; +#if defined (SSD1306) || defined (SSD1309) + uint8_t commandSequence[] = {0xb0+y, 0x21, x, 0x7f}; +#elif defined SH1106 + uint8_t commandSequence[] = {0xb0+y, 0x21, 0x00+((2+x) & (0x0f)), 0x10+( ((2+x) & (0xf0)) >> 4 ), 0x7f}; +#endif + lcd_command(commandSequence, sizeof(commandSequence)); +} +void lcd_clrscr(void){ +#ifdef GRAPHICMODE + for (uint8_t i = 0; i < DISPLAY_HEIGHT/8; i++){ + memset(displayBuffer[i], 0x00, sizeof(displayBuffer[i])); + lcd_gotoxy(0,i); + lcd_data(displayBuffer[i], sizeof(displayBuffer[i])); + } +#elif defined TEXTMODE + uint8_t displayBuffer[DISPLAY_WIDTH]; + memset(displayBuffer, 0x00, sizeof(displayBuffer)); + for (uint8_t i = 0; i < DISPLAY_HEIGHT/8; i++){ + lcd_gotoxy(0,i); + lcd_data(displayBuffer, sizeof(displayBuffer)); + } +#endif + lcd_home(); +} +void lcd_home(void){ + lcd_gotoxy(0, 0); +} +void lcd_invert(uint8_t invert){ + uint8_t commandSequence[1]; + if (invert != YES) { + commandSequence[0] = 0xA6; + } else { + commandSequence[0] = 0xA7; + } + lcd_command(commandSequence, 1); +} +void lcd_flip180(void) +{ + uint8_t commandSequence[1]; + commandSequence[0] = 0xC8; + lcd_command(commandSequence,1); + commandSequence[0] = 0xA0 | 0x1; + lcd_command(commandSequence,1); +} + +void lcd_sleep(uint8_t sleep){ + uint8_t commandSequence[1]; + if (sleep != YES) { + commandSequence[0] = 0xAF; + } else { + commandSequence[0] = 0xAE; + } + lcd_command(commandSequence, 1); +} +void lcd_set_contrast(uint8_t contrast){ + uint8_t commandSequence[2] = {0x81, contrast}; + lcd_command(commandSequence, sizeof(commandSequence)); +} +void lcd_putc(char c){ + switch (c) { + case '\b': + // backspace + lcd_gotoxy(cursorPosition.x-charMode, cursorPosition.y); + lcd_putc(' '); + lcd_gotoxy(cursorPosition.x-charMode, cursorPosition.y); + break; + case '\t': + // tab + if( (cursorPosition.x+charMode*4) < (DISPLAY_WIDTH/ sizeof(FONT[0])-charMode*4) ){ + lcd_gotoxy(cursorPosition.x+charMode*4, cursorPosition.y); + }else{ + lcd_gotoxy(DISPLAY_WIDTH/ sizeof(FONT[0]), cursorPosition.y); + } + break; + case '\n': + // linefeed + if(cursorPosition.y < (DISPLAY_HEIGHT/8-1)){ + lcd_gotoxy(cursorPosition.x, cursorPosition.y+charMode); + } + break; + case '\r': + // carrige return + lcd_gotoxy(0, cursorPosition.y); + break; + default: + // char doesn't fit in line + if( (cursorPosition.x >= DISPLAY_WIDTH-sizeof(FONT[0])) || (c < ' ') ) break; + // mapping char + c -= ' '; + if (c >= pgm_read_byte(&special_char[0][1]) ) { + char temp = c; + c = 0xff; + for (uint8_t i=0; pgm_read_byte(&special_char[i][1]) != 0xff; i++) { + if ( pgm_read_byte(&special_char[i][0])-' ' == temp ) { + c = pgm_read_byte(&special_char[i][1]); + break; + } + } + if ( c == 0xff ) break; + } + // print char at display +#ifdef GRAPHICMODE + if (charMode == DOUBLESIZE) { + uint16_t doubleChar[sizeof(FONT[0])]; + uint8_t dChar; + if ((cursorPosition.x+2*sizeof(FONT[0]))>DISPLAY_WIDTH) break; + + for (uint8_t i=0; i < sizeof(FONT[0]); i++) { + doubleChar[i] = 0; + dChar = pgm_read_byte(&(FONT[(uint8_t)c][i])); + for (uint8_t j=0; j<8; j++) { + if ((dChar & (1 << j))) { + doubleChar[i] |= (1 << (j*2)); + doubleChar[i] |= (1 << ((j*2)+1)); + } + } + } + for (uint8_t i = 0; i < sizeof(FONT[0]); i++) + { + // load bit-pattern from flash + displayBuffer[cursorPosition.y+1][cursorPosition.x+(2*i)] = doubleChar[i] >> 8; + displayBuffer[cursorPosition.y+1][cursorPosition.x+(2*i)+1] = doubleChar[i] >> 8; + displayBuffer[cursorPosition.y][cursorPosition.x+(2*i)] = doubleChar[i] & 0xff; + displayBuffer[cursorPosition.y][cursorPosition.x+(2*i)+1] = doubleChar[i] & 0xff; + } + cursorPosition.x += sizeof(FONT[0])*2; + } else { + if ((cursorPosition.x+sizeof(FONT[0]))>DISPLAY_WIDTH) break; + + for (uint8_t i = 0; i < sizeof(FONT[0]); i++) + { + // load bit-pattern from flash + displayBuffer[cursorPosition.y][cursorPosition.x+i] =pgm_read_byte(&(FONT[(uint8_t)c][i])); + } + cursorPosition.x += sizeof(FONT[0]); + } +#elif defined TEXTMODE + if (charMode == DOUBLESIZE) { + uint16_t doubleChar[sizeof(FONT[0])]; + uint8_t dChar; + if ((cursorPosition.x+2*sizeof(FONT[0]))>DISPLAY_WIDTH) break; + + for (uint8_t i=0; i < sizeof(FONT[0]); i++) { + doubleChar[i] = 0; + dChar = pgm_read_byte(&(FONT[(uint8_t)c][i])); + for (uint8_t j=0; j<8; j++) { + if ((dChar & (1 << j))) { + doubleChar[i] |= (1 << (j*2)); + doubleChar[i] |= (1 << ((j*2)+1)); + } + } + } + uint8_t data[sizeof(FONT[0])*2]; + for (uint8_t i = 0; i < sizeof(FONT[0]); i++) + { + // print font to ram, print 6 columns + data[i<<1]=(doubleChar[i] & 0xff); + data[(i<<1)+1]=(doubleChar[i] & 0xff); + } + lcd_data(data, sizeof(FONT[0])*2); + +#if defined (SSD1306) || defined (SSD1309) + uint8_t commandSequence[] = {0xb0+cursorPosition.y+1, + 0x21, + cursorPosition.x, + 0x7f}; +#elif defined SH1106 + uint8_t commandSequence[] = {0xb0+cursorPosition.y+1, + 0x21, + 0x00+((2+cursorPosition.x) & (0x0f)), + 0x10+( ((2+cursorPosition.x) & (0xf0)) >> 4 ), + 0x7f}; +#endif + lcd_command(commandSequence, sizeof(commandSequence)); + + for (uint8_t i = 0; i < sizeof(FONT[0]); i++) + { + // print font to ram, print 6 columns + data[i<<1]=(doubleChar[i] >> 8); + data[(i<<1)+1]=(doubleChar[i] >> 8); + } + lcd_data(data, sizeof(FONT[0])*2); + + commandSequence[0] = 0xb0+cursorPosition.y; +#if defined (SSD1306) || defined (SSD1309) + commandSequence[2] = cursorPosition.x+(2*sizeof(FONT[0])); +#elif defined SH1106 + commandSequence[2] = 0x00+((2+cursorPosition.x+(2*sizeof(FONT[0]))) & (0x0f)); + commandSequence[3] = 0x10+( ((2+cursorPosition.x+(2*sizeof(FONT[0]))) & (0xf0)) >> 4 ); +#endif + lcd_command(commandSequence, sizeof(commandSequence)); + cursorPosition.x += sizeof(FONT[0])*2; + } else { + uint8_t data[sizeof(FONT[0])]; + if ((cursorPosition.x+sizeof(FONT[0]))>DISPLAY_WIDTH) break; + + for (uint8_t i = 0; i < sizeof(FONT[0]); i++) + { + // print font to ram, print 6 columns + data[i]=(pgm_read_byte(&(FONT[(uint8_t)c][i]))); + } + lcd_data(data, sizeof(FONT[0])); + cursorPosition.x += sizeof(FONT[0]); + } +#endif + break; + } + +} +void lcd_charMode(uint8_t mode){ + charMode = mode; +} +void lcd_puts(const char* s){ + while (*s) { + lcd_putc(*s++); + } +} +void lcd_puts_p(const char* progmem_s){ + register uint8_t c; + while ((c = pgm_read_byte(progmem_s++))) { + lcd_putc(c); + } +} +#ifdef GRAPHICMODE +#pragma mark - +#pragma mark GRAPHIC FUNCTIONS +uint8_t lcd_drawPixel(uint8_t x, uint8_t y, uint8_t color){ + if( x > DISPLAY_WIDTH-1 || y > (DISPLAY_HEIGHT-1)) return 1; // out of Display + + if( color == WHITE){ + displayBuffer[(y / 8)][x] |= (1 << (y % 8)); + } else { + displayBuffer[(y / 8)][x] &= ~(1 << (y % 8)); + } + + return 0; +} +uint8_t lcd_drawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color){ + uint8_t result; + + int dx = abs(x2-x1), sx = x1 dy) { err += dy; x1 += sx; } /* e_xy+e_x > 0 */ + if (e2 < dx) { err += dx; y1 += sy; } /* e_xy+e_y < 0 */ + } + + return result; +} +uint8_t lcd_drawRect(uint8_t px1, uint8_t py1, uint8_t px2, uint8_t py2, uint8_t color){ + uint8_t result; + + result = lcd_drawLine(px1, py1, px2, py1, color); + result = lcd_drawLine(px2, py1, px2, py2, color); + result = lcd_drawLine(px2, py2, px1, py2, color); + result = lcd_drawLine(px1, py2, px1, py1, color); + + return result; +} +uint8_t lcd_fillRect(uint8_t px1, uint8_t py1, uint8_t px2, uint8_t py2, uint8_t color){ + uint8_t result; + + if( px1 > px2){ + uint8_t temp = px1; + px1 = px2; + px2 = temp; + temp = py1; + py1 = py2; + py2 = temp; + } + for (uint8_t i=0; i<=(py2-py1); i++){ + result = lcd_drawLine(px1, py1+i, px2, py1+i, color); + } + + return result; +} +uint8_t lcd_drawCircle(uint8_t center_x, uint8_t center_y, uint8_t radius, uint8_t color){ + uint8_t result; + + int16_t f = 1 - radius; + int16_t ddF_x = 1; + int16_t ddF_y = -2 * radius; + int16_t x = 0; + int16_t y = radius; + + result = lcd_drawPixel(center_x , center_y+radius, color); + result = lcd_drawPixel(center_x , center_y-radius, color); + result = lcd_drawPixel(center_x+radius, center_y , color); + result = lcd_drawPixel(center_x-radius, center_y , color); + + while (x= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + + result = lcd_drawPixel(center_x + x, center_y + y, color); + result = lcd_drawPixel(center_x - x, center_y + y, color); + result = lcd_drawPixel(center_x + x, center_y - y, color); + result = lcd_drawPixel(center_x - x, center_y - y, color); + result = lcd_drawPixel(center_x + y, center_y + x, color); + result = lcd_drawPixel(center_x - y, center_y + x, color); + result = lcd_drawPixel(center_x + y, center_y - x, color); + result = lcd_drawPixel(center_x - y, center_y - x, color); + } + return result; +} +uint8_t lcd_fillCircle(uint8_t center_x, uint8_t center_y, uint8_t radius, uint8_t color) { + uint8_t result; + for(uint8_t i=0; i<= radius;i++){ + result = lcd_drawCircle(center_x, center_y, i, color); + } + return result; +} +uint8_t lcd_drawBitmap(uint8_t x, uint8_t y, const uint8_t *picture, uint8_t width, uint8_t height, uint8_t color){ + uint8_t result,i,j, byteWidth = (width+7)/8; + for (j = 0; j < height; j++) { + for(i=0; i < width;i++){ + if(pgm_read_byte(picture + j * byteWidth + i / 8) & (128 >> (i & 7))){ + result = lcd_drawPixel(x+i, y+j, color); + } else { + result = lcd_drawPixel(x+i, y+j, !color); + } + } + } + return result; +} +void lcd_display() { +#if defined (SSD1306) || defined (SSD1309) + lcd_gotoxy(0,0); + lcd_data(&displayBuffer[0][0], DISPLAY_WIDTH*DISPLAY_HEIGHT/8); +#elif defined SH1106 + for (uint8_t i = 0; i < DISPLAY_HEIGHT/8; i++){ + lcd_gotoxy(0,i); + lcd_data(displayBuffer[i], sizeof(displayBuffer[i])); + } +#endif +} +void lcd_clear_buffer() { + for (uint8_t i = 0; i < DISPLAY_HEIGHT/8; i++){ + memset(displayBuffer[i], 0x00, sizeof(displayBuffer[i])); + } +} +uint8_t lcd_check_buffer(uint8_t x, uint8_t y) { + if( x > DISPLAY_WIDTH-1 || y > (DISPLAY_HEIGHT-1)) return 0; // out of Display + return displayBuffer[(y / (DISPLAY_HEIGHT/8))][x] & (1 << (y % (DISPLAY_HEIGHT/8))); +} +void lcd_display_block(uint8_t x, uint8_t line, uint8_t width) { + if (line > (DISPLAY_HEIGHT/8-1) || x > DISPLAY_WIDTH - 1){return;} + if (x + width > DISPLAY_WIDTH) { // no -1 here, x alone is width 1 + width = DISPLAY_WIDTH - x; + } + lcd_goto_xpix_y(x,line); + lcd_data(&displayBuffer[line][x], width); +} +#endif diff --git a/Source/oled/lcd.h b/Source/oled/lcd.h new file mode 100644 index 0000000..68a0d62 --- /dev/null +++ b/Source/oled/lcd.h @@ -0,0 +1,197 @@ +/* + * This file is part of lcd library for ssd1306/ssd1309/sh1106 oled-display. + * + * lcd library for ssd1306/ssd1309/sh1106 oled-display is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * + * lcd library for ssd1306/ssd1309/sh1106 oled-display 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 + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see . + * + * Diese Datei ist Teil von lcd library for ssd1306/ssd1309/sh1106 oled-display. + * + * lcd library for ssd1306/ssd1309/sh1106 oled-display ist Freie Software: Sie können es unter den Bedingungen + * der GNU General Public License, wie von der Free Software Foundation, + * Version 3 der Lizenz oder jeder späteren + * veröffentlichten Version, weiterverbreiten und/oder modifizieren. + * + * lcd library for ssd1306/ssd1309/sh1106 oled-display wird in der Hoffnung, dass es nützlich sein wird, aber + * OHNE JEDE GEWÄHRLEISTUNG, bereitgestellt; sogar ohne die implizite + * Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÃœR EINEN BESTIMMTEN ZWECK. + * Siehe die GNU General Public License für weitere Details. + * + * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem + * Programm erhalten haben. Wenn nicht, siehe . + * + * lcd.h + * + * Created by Michael Köhler on 22.12.16. + * Copyright 2016 Skie-Systems. All rights reserved. + * + * lib for OLED-Display with ssd1306/ssd1309/sh1106-Controller + * first dev-version only for I2C-Connection + * at ATMega328P like Arduino Uno + * + * at GRAPHICMODE lib needs SRAM for display + * DISPLAY-WIDTH * DISPLAY-HEIGHT + 2 bytes + */ + +#ifndef LCD_H +#define LCD_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if (__GNUC__ * 100 + __GNUC_MINOR__) < 303 +#error "This library requires AVR-GCC 3.3 or later, update to newer AVR-GCC compiler !" +#endif + +#include +#include + + /* TODO: define bus */ +#define I2C // I2C or SPI + /* TODO: define displaycontroller */ +#define SSD1306 // or SSD1306, check datasheet of your display + /* TODO: define displaymode */ +#define TEXTMODE // TEXTMODE for only text to display, + // GRAPHICMODE for text and graphic + /* TODO: define font */ +#define FONT ssd1306oled_font// set font here, refer font-name at font.h/font.c + + /* TODO: define I2C-adress for display */ + + // using 7-bit-adress for lcd-library + // if you use your own library for twi check I2C-adress-handle +#define LCD_I2C_ADR (0x78 >> 1) // 7 bit slave-adress without r/w-bit + // r/w-bit are set/unset by library + // e.g. 8 bit slave-adress: + // 0x78 = adress 0x3C with cleared r/w-bit (write-mode) + +#ifdef SSD1306 + // Fundamental Commands + #define CONTRAST 0x81 + #define DISPLAY_ALL_ON 0xA5 + #define DISPLAY_ALL_ON_RESUME 0xA4 + #define NORMAL_DISPLAY 0xA6 + #define DISPLAY_ON 0xAF + #define DISPLAY_OFF 0xAE + #define NOP 0xE3 + // Scrolling Commands + #define ACTIVATE_SCROLL 0x2F + #define DEACTIVATE_SCROLL 0x2E + #define SCROLL_RIGHT 0x26 + #define SCROLL_LEFT 0x27 + #define SCROLL_RIGHT_UP 0x29 + #define SCROLL_LEFT_UP 0x2A + // // Addressing Setting Commands + #define MEMORY_MODE 0x20 + #define COLUMN_ADDR 0x21 + #define PAGE_ADDR 0x22 + #define PAM_SETCOLUMN_LSB 0x00 + #define PAM_SETCOLUMN_MSB 0x10 + #define PAM_PAGE_ADDR 0xB0 // 0xb0 -- 0xb7 + // Hardware Configuration Commands + #define DISPLAY_START_LINE 0x40 + #define SEGMENT_REMAP 0xA0 + #define SEGMENT_REMAP_INV 0xA1 + #define MULTIPLEX_RATIO 0xA8 + #define COM_SCAN_INC 0xC0 + #define COM_SCAN_DEC 0xC8 + #define DISPLAY_OFFSET 0xD3 + #define COM_PINS 0xDA + #define COM_PINS_SEQ 0x02 + #define COM_PINS_ALT 0x12 + #define COM_PINS_SEQ_LR 0x22 + #define COM_PINS_ALT_LR 0x32 + // Timing & Driving Commands + #define DISPLAY_CLOCK 0xD5 + #define PRE_CHARGE_PERIOD 0xD9 + #define VCOM_DETECT 0xDB + // Charge Pump Commands + #define CHARGE_PUMP 0x8D + // // Misc defines + #define OLED_BLOCK_COUNT (sizeof(OLED_BLOCK_TYPE) * 8) + #define OLED_BLOCK_SIZE (OLED_MATRIX_SIZE / OLED_BLOCK_COUNT) +#endif + + +#ifdef I2C +#include "i2c.h" // library for I2C-communication + // if you want to use other lib for I2C + // edit i2c_xxx commands in this library + // i2c_start(), i2c_byte(), i2c_stop() + +#elif defined SPI + // if you want to use your other lib/function for SPI replace SPI-commands +#define LCD_PORT PORTB +#define LCD_DDR DDRB +#define RES_PIN PB0 +#define DC_PIN PB1 +#define CS_PIN PB2 + +#endif + +#ifndef YES +#define YES 1 +#endif + +#define NORMALSIZE 1 +#define DOUBLESIZE 2 + +#define LCD_DISP_OFF 0xAE +#define LCD_DISP_ON 0xAF + +#define WHITE 0x01 +#define BLACK 0x00 + +#define DISPLAY_WIDTH 128 +#define DISPLAY_HEIGHT 64 + + + + void lcd_command(uint8_t cmd[], uint8_t size); // transmit command to display + void lcd_data(uint8_t data[], uint16_t size); // transmit data to display + void lcd_init(uint8_t dispAttr); + void lcd_home(void); // set cursor to 0,0 + void lcd_flip180(void); // flip display 180° + void lcd_invert(uint8_t invert); // invert display + void lcd_sleep(uint8_t sleep); // display goto sleep (power off) + void lcd_set_contrast(uint8_t contrast); // set contrast for display + void lcd_puts(const char* s); // print string, \n-terminated, from ram on screen (TEXTMODE) + // or buffer (GRAPHICMODE) + void lcd_puts_p(const char* progmem_s); // print string from flash on screen (TEXTMODE) + // or buffer (GRAPHICMODE) + + void lcd_clrscr(void); // clear screen (and buffer at GRFAICMODE) + void lcd_gotoxy(uint8_t x, uint8_t y); // set curser at pos x, y. x means character, + // y means line (page, refer lcd manual) + void lcd_goto_xpix_y(uint8_t x, uint8_t y); // set curser at pos x, y. x means pixel, + // y means line (page, refer lcd manual) + void lcd_putc(char c); // print character on screen at TEXTMODE + // at GRAPHICMODE print character to buffer + void lcd_charMode(uint8_t mode); // set size of chars +#if defined GRAPHICMODE + uint8_t lcd_drawPixel(uint8_t x, uint8_t y, uint8_t color); + uint8_t lcd_drawLine(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t color); + uint8_t lcd_drawRect(uint8_t px1, uint8_t py1, uint8_t px2, uint8_t py2, uint8_t color); + uint8_t lcd_fillRect(uint8_t px1, uint8_t py1, uint8_t px2, uint8_t py2, uint8_t color); + uint8_t lcd_drawCircle(uint8_t center_x, uint8_t center_y, uint8_t radius, uint8_t color); + uint8_t lcd_fillCircle(uint8_t center_x, uint8_t center_y, uint8_t radius, uint8_t color); + uint8_t lcd_drawBitmap(uint8_t x, uint8_t y, const uint8_t picture[], uint8_t width, uint8_t height, uint8_t color); + void lcd_display(void); // copy buffer to display RAM + void lcd_clear_buffer(void); // clear display buffer + uint8_t lcd_check_buffer(uint8_t x, uint8_t y); // read a pixel value from the display buffer + void lcd_display_block(uint8_t x, uint8_t line, uint8_t width); // display (part of) a display line +#endif + +#ifdef __cplusplus +} +#endif +#endif /* LCD_H */ diff --git a/Source/oled/main.c b/Source/oled/main.c new file mode 100644 index 0000000..3ad654c --- /dev/null +++ b/Source/oled/main.c @@ -0,0 +1,19 @@ +//****main.c****// +#include "lcd.h" + + +int main(void){ + lcd_init(LCD_DISP_ON); // init lcd and turn on + + lcd_puts("Hello World"); // put string from RAM to display (TEXTMODE) or buffer (GRAPHICMODE) + lcd_gotoxy(0,2); // set cursor to first column at line 3 + lcd_puts_p(PSTR("String from flash")); // puts string form flash to display (TEXTMODE) or buffer (GRAPHICMODE) +#if defined GRAPHICMODE + lcd_drawCircle(64,32,7,WHITE); // draw circle to buffer white lines + lcd_display(); // send buffer to display +#endif + for(;;){ + //main loop + } + return 0; +} diff --git a/Source/oled/readme.md b/Source/oled/readme.md new file mode 100644 index 0000000..2d445ce --- /dev/null +++ b/Source/oled/readme.md @@ -0,0 +1,130 @@ +# OLED for AVR mikrocontrollers +Library for oled-displays with SSD1306, SSD1309 or SH1106 display-controller connected with I2C or SPI at an AVR Atmel Atmega like Atmega328P. + + + +This library allows you to display text or/and graphic at oled-display. +The library need less than 2 kilobytes flash-memory and 3 bytes sram in textmode, in graphicmode library need less than 3 kilobytes flash-memory and 1027 bytes static sram so you can use oled-displays e.g with Atmega48PA (only with textmode). +Library is only tested with 128x64 Pixel display, lower resolution not tested but should work too. + +If you want to use your own I2C library you have to fit i2c-function at lcd-library. +Settings for I2C-bus have to set at i2c.h +Settings for display have to set at lcd.h + +If you want to use characters like e.g. ä set your compiler input-charset to utf-8 and your compiler exec-charset to iso-8859-15 (look at makefile line 115). + +Testcondition: Display: SSD1306 OLED, Compiler Optimizelevel: -Os, µC: Atmega328p @ 8 MHz internal RC + +Memory: + + + + + + + + + + + + + + + + + + + + + + + + + + +
ModulFlashStatic RAM
I2C-Core220 Bytes0 Bytes
FONT644 Bytes0 Bytes
OLED (Text-Mode)1395 Bytes3 Bytes
OLED (Graphic-Mode)2541 Bytes1027 Bytes
+ + + +Speed (print 20 charaters (1 line) in normal size to display): + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ModeTimeI2C-Speed
OLED (Text-Mode)4.411 ms400 kHz
OLED (Text-Mode)15.384 ms100 kHz
OLED (Graphic-Mode)26.603 ms400 kHz
OLED (Graphic-Mode)96.294 ms100 kHz
+ + +example: + +```c +//****main.c****// +#include "lcd.h" + + +int main(void){ + lcd_init(LCD_DISP_ON); // init lcd and turn on + + lcd_puts("Hello World"); // put string from RAM to display (TEXTMODE) or buffer (GRAPHICMODE) + lcd_gotoxy(0,2); // set cursor to first column at line 3 + lcd_puts_p(PSTR("String from flash")); // puts string form flash to display (TEXTMODE) or buffer (GRAPHICMODE) +#if defined GRAPHICMODE + lcd_drawCircle(64,32,7,WHITE); // draw circle to buffer + lcd_display(); // send buffer to display +#endif + for(;;){ + //main loop + } + return 0; +} +``` +example for chars with double height: +```c +//****main.c****// +#include "lcd.h" + +int main(void){ + + lcd_init(LCD_DISP_ON); + lcd_clrscr(); + lcd_set_contrast(0x00); + lcd_gotoxy(4,1); + lcd_puts("Normal Size"); + lcd_charMode(DOUBLESIZE); + lcd_gotoxy(0,4); + lcd_puts(" Double \r\n Size"); + lcd_charMode(NORMALSIZE); + +#ifdef GRAPHICMODE + lcd_display(); +#endif + for(;;){ + //main loop + } + return 0; +} +``` + +