Source, Pictures und Documents in das git Repository aufgenommen.
parent
c045f714d5
commit
be90873faa
@ -1,7 +1,4 @@
|
|||||||
*~
|
*~
|
||||||
.*.swp
|
.*.swp
|
||||||
Audio
|
Audio
|
||||||
Source
|
|
||||||
Documents
|
|
||||||
Pictures
|
|
||||||
External
|
External
|
||||||
|
@ -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}
|
@ -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
|
File diff suppressed because it is too large
Load Diff
@ -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
|
Binary file not shown.
@ -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}
|
@ -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
|
Binary file not shown.
After Width: | Height: | Size: 4.8 MiB |
Binary file not shown.
Binary file not shown.
@ -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$<drVlirrVZNjqYKpdq18R*s*t~>
|
||||||
|
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#\<mC"`.Y"o_s$
|
||||||
|
lgFKGrtb@mbH@%cMi3R`R#n,pj6-+8mdU#Hqrdtnq<@/!dZmsiW+Si<lMBkfVJ4"W-MnV[<.Y(/
|
||||||
|
s*t~>
|
||||||
|
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<I<sPF8h7LWob\!p]4=
|
||||||
|
kl20TK)Yf*Tp!obJ;LR_Q/gisrs7q@NL5WWQDB97J/ElqJ:NWAJ:Wc5LQe!bPE1EJJ:Wrc]?9d5
|
||||||
|
rrM,2q1&I%p4*@!R'>#pg?sOlNW4M~>
|
||||||
|
rr3Fr.Ms3o<(/Sk)]B_<)Z(?O.eX\^.8+f^q!\4tqXM+=DI=A%PamgP(clmi4%=KB-DLLh!nlJa
|
||||||
|
kl2/N*;oiO<B@B=(asGD50M%@rs7<q0LIE75ZoB3(`48C(`4qc(`P7N-9FCL3]%us(`PVNKV%Ms
|
||||||
|
rrL7_q%s)[p)!uR6Z9*C]AS8?NW4M~>
|
||||||
|
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`<a/j):X>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~>
|
||||||
|
pAY9<TneMbqLATtde<\Ag8"Us!f+G\mJd^#J>29*[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`cCNmE<KgpZ8'rrCRJJ.$s]K7JKW]n!HgW0I&V
|
||||||
|
!j.!nq>UhbQ(P^HJ>Br<J>)N,rrW/jQi)@8Koih0rsR80aLgm?s2M[3P2CijLAuc~>
|
||||||
|
o`"rQ*;LEO1\C\Jrf$gn"!]KG\F0A-Hl0KKAmsHJ<ACBl:;D5"j8T+`rYQ%a*Zc.8EebKSrEqbe
|
||||||
|
q#:D1(n(4"$TC7HKdmpCMC]TEk4\fVqrgEF(]km>Id6q@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<L!ZU$m`h\]
|
||||||
|
\G?"$"64r_g\_!VrP4*4Rt-71VZ))GeareHpPj]RVU1c^g$/MDNJ.!(k,-A-J<0)Ks+^Q(~>
|
||||||
|
o`"p%r>5]'2&^UpK(K!Krfn<@B4;i3;Xj/T$sGnhV>7MV<m$=;::fEa"MtumB0#r.#pH9LFl9''
|
||||||
|
)h.GUrr^I`(qohH#lBQ'W(@gOOBqi&!42:s#k0Mb(gX+3(qJo2$8<RgrR,#HEYpXiJcCK)J,~>
|
||||||
|
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<rsPK[oCT5?]ArCRJDoGd!6Y7j%?H[FdBfb+\&Gr8
|
||||||
|
P*l.Erri=sM2(g&rs[brWN:W8[YB=!\VA?!rs6&c]YfYXJ;F-grs>+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<eJcCH(J,~>
|
||||||
|
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/@Fc<f(Q0(iWlCqYpr=/LD;s6>4kP(`4OgrsGqM3m4Nl=(!7Sh<b.J07Wius72T.6^NB(
|
||||||
|
L&ZZ~>
|
||||||
|
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<S%]p\b$j"TA2lq"]L@L&ZZ~>
|
||||||
|
oD],RXMBh/iQ%"I_XRR+qM5!!"+l_i\b#k$Z3pKr\$NfMinT*gq;M>ZTRlsFJ=k]8q>L<upXl!d
|
||||||
|
J=<m!rdY*4_27XWrsdWF]n)'Pa+g+?Ru+oZoD]0`P(C=,roM+PTD\'U!JT/)rrhJdPE_ems+UK'~>
|
||||||
|
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+<uB`Nrrl=RX<EAqp\tTk_1c8e
|
||||||
|
0O1sY5c"/S$E>"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<W![7-M[!.$K)j!^DVb*b<\q`JcCH(J,~>
|
||||||
|
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<YSUmSXZrsGa#L8XCgQ.a<Xrq6:!K(/WSLoU75VgsEqi;Wk_JB[E\!i)ptpAYKB
|
||||||
|
KSR+:L8)A?MnSZ\!9O31"NSlHM2Ua#$HeRWs8U`XaH;#8JcCH(J,~>
|
||||||
|
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!8<s2V(6c`N>hJcCH(J,~>
|
||||||
|
p&>El9g,O.)6J.1?l2Z-rs\]I*M`F<Gk1"9(hE=5rsKrV-!]X0Os1_[*mERB!hL@tmf*?o6La^K%
|
||||||
|
.6VB@NlXs3_i]r0^J<0#gj]LY@DCms&n^g$@ljjrgI7uVeS36JcCH(J,~>
|
||||||
|
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=<g,ak=^bJ@PUIrrg31c`Pasrr_21WW)Yl%.f%,i;_f%P/+5QQ2TY@!pkO;n,EIDK])P'%
|
||||||
|
.f[:J:N]jY^jlpL#_b(#j6`#J=N$sqOm3T$G+4VYboV>aiqEXJcG`L"o6rq_peIBs*t~>
|
||||||
|
o`#;f(eAa-S[k1+(k2DOrreEYW+r[<rr^:ZA,Q*$%-SQXa8a:H3fIkq5Pj=<!o+dln,EI&+34'S%
|
||||||
|
-Tbs(`5)YD]#'R,0]WX#h0\M(e[=ip/C>X$A"NBE*]./SYLq`JcG`L"n]R"OfnA;s*t~>
|
||||||
|
o`#<sq=spdqY0a[q"O^TrsS\tp\Omhs8)Kaq>U*f$hsW"qY0gbq>C$^q;;2Qp\s[^!r_ljo`"pj
|
||||||
|
rqHHh#5@ogq"XU^oD\jjq#'mdq#L<YrsS]$qYL3kqYU<gp\WbG!;i\o!W;ckpAk$4rri>uq=sg.
|
||||||
|
s*t~>
|
||||||
|
o`#<HT8hOLWI]ShO+>=?rsQ8cJ>i)>pTT4!U%A$Y%JbP8rNq-OnYF<fJXZMqrrW+QlgXoUjFb):
|
||||||
|
rs\UUJ:Y)0KpS9iQ@n8irrMMKr."j9Vn;<q$`M:YYj21f_u?*T`SLOpqT#Q7"9$cGK)L3"T?I6;
|
||||||
|
oZ*hhZH<,s~>
|
||||||
|
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$<ipAYNprV?6cqtKj^qY0mEs8W#errW2pq=FUorqH3`
|
||||||
|
q"OOXqu$6eo)A^cr:^<hp\4ONrsJMqq>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<c2S!t
|
||||||
|
B,idX`V[dWJ,~>
|
||||||
|
o`#<sq"XU\rVZHeq=smVrri>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`#<FQBR'5iQ[ReTS_4frrhbUaifS>J,tAdpAYMRZ-(dcQGN%=L5GBVrrN,ko)AgjT8<.2rsSd\
|
||||||
|
PDkl\[F(86O3$nl$-RjLKpTE5RGRr1rsSXQo)J<Ycd%N$L=b8]!q_JRg]%<>aOC.liKSkmq#13o
|
||||||
|
pQX:UrrhkmLU?.<rrME+mJd4PaQ<GP~>
|
||||||
|
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`#<tp\XsfqYL-hq=smUrrDomp]('hpAk3ersSW!q"amgqtU!]p\`>:!rM`ho)A^erq?Zor;$0e
|
||||||
|
rqQK`rs&8pqYBm[qs+1hrV-<iqu-Bequ$9eh>[QQqtf(I!W)]Crr`/mp\Fae!ri#nli."_roa:_
|
||||||
|
rV6<arrMunmJd4`qrRj.~>
|
||||||
|
o`#<TKu<E-[C"9HUPdXjrsPu[J;8Z*Ju#&iL%+j:$]Vc]VV_9hMOK3Kd*DXm\U_ZirsQerJ;:,T
|
||||||
|
SsnF#NU??;#l'Xi[@`5*]_Umn$fcd-k/#rTS%-Y5]A<Jg[)TT0rrK=7eGfZiJV'ZrrVlrgREk-u
|
||||||
|
!P\9jrr^r<anb]2!O'*%rrK=7jo9i~>
|
||||||
|
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<L7Y0Yp$8uCJ@Y(I$Gh:XKRfremZE$tp\t[$L5=(Qnt!V``K5cLci4(#J>;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/tY3Kc!G0l2M.=(mlg&RZD`(SSC+?rr_%3pM/L`!qRSaeGfWnhF?],rrTYua6Wa,
|
||||||
|
j;m:ErrVdZnb2tao-)TNrrVd8e)gU[~>
|
||||||
|
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<nrrLirli.%=_;G"e!R[J7rrhf#\@qn;rrLN<r;QfOb3T(X~>
|
||||||
|
p&>E4*#PaOkEL!/)_5@arsHRZ(b2QSE\F>U9)&>okSV)7N_%$s)R+u8bg?@lpGEf7nc'!'6_QP,
|
||||||
|
UfU9a58`_\rsA;<@iZCGNN'hpkl2$](`60<NML@+jXm7arrZ]!s&A7_"Q=fYL].&K!N]#DrrL#[
|
||||||
|
rr3)aD2%Z\rrh;0IY[morrIF2rr3#3T'QCY\<"W.q#:Ar:&=kmiI662rV?HoXA/Wm!PG#is*t~>
|
||||||
|
p&>0mq>($crq?Njq"X[PrsJc"qu6NgqZ$Tpp\+Upp\Xa\rVcKcrquNhd/O1Cp\F=Y#Q+8iqYKs`
|
||||||
|
r;QHjqYp9oq"OU[q"Xg^!;kgV$iKbrrqlZls8W#or87MWrV6Elq<It`rV?Hmp\Xdd!VuZhrrN)r
|
||||||
|
nG`Xjqt^$co)ApirVuloqu6Km"o\8rs7cE`rrW2or;Q]srr)*]!rVllq>UKkr;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,90<k5Pg\(m=3?cE[EL[=,=;rrg@tq<guBrrpPQmJ.Tbq>UJ'
|
||||||
|
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<rrW"Lhu!EUrjdT5rVlotiVriXp?VYV"7DA=j73-Qhgi,:_"7FJGcs7_&Ap&>*+O8\kR
|
||||||
|
!r_`hn,ELhe>_R-rrW"Lhu*KYn##s]pOK1<rrW"LhtI'OrU^!drs.?Zs8LKJN8X^8J,~>
|
||||||
|
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,<s8W&#B.q:(s*t~>
|
||||||
|
o`"pirq?ZmqYg<dp\4URrrE#rpBLKip\Xm_rV6C#r:g!]q>UEmrVlfjdJj=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!<)<b!W2iprr`8sp\4[^#lFYtrr<#sp\Ode"9//kp\spfqtpBnrVlR"rVuos
|
||||||
|
q#C?hr;ZWkrr7K~>
|
||||||
|
o`#<UJq\`@X5CaLJ:uD>rsRh;J:N<USq+>mJDp;'$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<rr\gZf_tXG#
|
||||||
|
QCLis8Uu,[/'_*lIXbRLW]Sq!;l`p"Pf-+NnWq$(&l)'s8W&^Z[dacNf^sRU\"Nchgi*3rsJ_hZ
|
||||||
|
[dacNf^sSqu-O*gl[q`gAh3DO8nF?ec2o)rr7K~>
|
||||||
|
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#*<Kts8#Q_rr3,jlnVN5nG`Sb7(E-i
|
||||||
|
rs/I(kl:\$(j>`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,tqu6<jq>L9ls8;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')_<L=d$]KV_s7NXXimmnY^u>: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<T"X)_LjarrKC%rr3/6384Di7-spZU$.R\(`5``qYpKqT!&(m!dY]r
|
||||||
|
rVm(`+;bqbaSPo9!O8O$rt)e%gAg%us8R:XP<[q(s'"Xcs*t~>
|
||||||
|
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>L<frr2uprr3'!p\=[d"TJ>up\k$is7ufpq"t$i#5S,qs8;Werr3)tp\4XTrri/qr;$?f
|
||||||
|
rrDoprrW2oq"t'rqY:$hs8McirVm6"rVuosq#:<nrqPj[#6+Q"rVlQir;Qcnrr3'!p\=[d"TJ>u
|
||||||
|
p\k$i'_qY,s8Mfms8W)ns8Mceq#:<nrqZNmJ,~>
|
||||||
|
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^#T<eLsaafu^rr]f^K&lD#
|
||||||
|
"ImuoV==?]!W&hqrr`"NM>mGQ#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:@/p8O8Bp<br;ZJ%rr3)i,q8cjrrh2KgEji;rs&F2F/V6[q>UBu;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#<s8V(Dj8]/95l]pd*Brfhs6j@os*t~>
|
||||||
|
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`/orV6<j"T%leqYpHn#Q=Gts8D]dr;Q]tq=jdTrs&Gts8W)or;6Kp
|
||||||
|
r;HWp!rDZfr;Qiop\t0l!r;Tirr3#sq#:9oq>UBns8)*^s8;os!WMllrrN&rrr3&rp\Ogf"8hom
|
||||||
|
q#(-mr:p9k!Vu`os8Vous8)Kbrr2ouqu-KnJ,~>
|
||||||
|
o`#9nJ;0PfURK-gh3@=,%HW/(NoAi]Mm1BTJ@bURrrr:_Xcg6brVlr<JG&.+!SW.nrrf15fn/>S
|
||||||
|
rsPKMZ)iM2WJ?DiQc/Ip$MoscJYof8Mh$E1mf*[>JASA\gS(t#ql%HorsASNXaubHg%aHqr;R>-
|
||||||
|
Lo(*d]`69Inc-2Is8UO1rr3&,J?&SJ"oZ<*jc09<rrf]ZJ?8;>rs.8<q#B#uJC=Gs!h4_Rn,EUI
|
||||||
|
U&Y/^V9So;!Rg01rrTQXWr;r(rMP27s8VqaJFNR<!S3;1rrK"_rr3#(ZL%SqdE_dlm#D#CrrLR2
|
||||||
|
rr3&,J?&SJ"oZ<*jc09<rrL]2rr3"rli-ngZ*OD:J<]^*rrL$jrVqB~>
|
||||||
|
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<s5R=ZrqucsXjd:L!d5DkrVm3$?Pqc%s7Jo"jSo/`[5%[\s'FIZrrI.]m/I9kVZ6\O0`CtM
|
||||||
|
!NjiMrrR?\AGuN3qiF1l0`CtM#.62bs8QE[rr31CF8pG$4mW+I!Kjqks*t~>
|
||||||
|
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<dr;QcmrVm0&p\=af
|
||||||
|
q>:$arr2unrr2uqrr3*!p\4O`rrrArq>U<hrVluup\=^ars/Ats8D]ip\t0l!VcBWrrMrnrVlrr
|
||||||
|
q>U?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
|
||||||
|
V<CC^9jX1s7hiWs8U(;rr^u*KsUdY"lYcEp;jcBrr_&,P2Z<<%A(uIgkX((o)JagK8fWprrJeDr
|
||||||
|
r3*"a.hktrrC%;rr^u*KsUdY$K7;$df9@@S>Li9rr3.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<<g]c,Aers$t6n,NEWIJj*FQ
|
||||||
|
2^dc],2]6rr3/C5[NoKIJj*K=bZnUbF8G1#/(r(k8l\Jrr3&p8cAVfJ,~>
|
||||||
|
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.rqQ<gq>L6eq#(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`#<aJ:O]sl@sh>Jqa'hrsS7FM1W86r5m3WRJlp\%&8?ejluO.jPu_[Mu2`<!QV81rs&:YcE+$t
|
||||||
|
rU9aohm3:FT!IY&^V>U#nG`i\W6:6ieAI`@K&cA#%F^EoN3N<\ceRK8U;?chrrKm_qu6])qYpL'
|
||||||
|
Y(>F/rI]X$r;Zf<\c2U?e,TI8MP'C/g<cUXeGoQEhu3QVa-$)ort"tYk(s#_N8jl&pAb0XJB[K^
|
||||||
|
!pY^Br;QicQc&h&,Lc\mm>@P*S_DGcP1,']s66!$regOOs7M$6s8Tt4s8V)4[I4%srlg8Urr3"p
|
||||||
|
hu*Kce,TI8MP'C/g<cUXeGoQEhu3Qcon2c6s2+X4s5Ja?s1"<arVloJ`;KXc~>
|
||||||
|
o`#<P(`6oZfcq=N*?k+DrsRa%.3*g0q44<]7Jll[$s4@&cdqXFc-/cs/beK/!LdWirs&'KV.aE[
|
||||||
|
qsXOm`H2(.:NP0XMMikSnG`h[@A,JHZ'%XD*R+$Q%B_S(/oU^eW5$G$=-!.=rrJ%[qu6\ApAY(#
|
||||||
|
CDjtgq]-MdqZ$SaJH#Q[YQ+XY.oG>$];\jlYlF`,`Vof<RQ'^6rt"e4dO5!k0?X;Yn,NF?(o-R"
|
||||||
|
!nf1%r;S5&6]qBJs0)J&h()@_9tRB+3NaD!s40`Er@7I>s6Ulgs8S2Rs8U4cGjbS6rLtdWrr3"&
|
||||||
|
`Vf`IYQ+XY.oG>$];\jlYlF`,`VofIm2k?gs,cpRs2lO1s*d,orVlo'PPkH2~>
|
||||||
|
oD\pequ?KhpAk0[rsJc"p\k-krVuomq"F^pq=jaarVl`jqtKpLrrMrlnG`[hq"sj\q<n7jr;6Ee
|
||||||
|
rVcTiqtKj`nG`akp\F^`q"jpfq#LBkrr`,lq#(!g$iKbnqZ$Tor;-Hir8dkYrVQHk$iKo%s8Mci
|
||||||
|
s8W)mqYgEpq>L<m$N:#'q"asirquZlrVllmr;RN0q>^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><c^MT54?PEP83s1c)Ds43;1
|
||||||
|
n,EF']DDOKpS+kks4mY9NM61Jo>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\o<G]6'="(`:Nsnc&uf(djIJ.;#)N:0>R8rrrCC-8ht*qu7&&(`7PurlVEloQI_)rrL/qqYpu3
|
||||||
|
QN.!F*.e.ih&(/1rr3!j`r>uL_#Mb8<V6=URZkqos8VmJqu-O1YZ^nm`0+.OQffJP3SON5MgbX*
|
||||||
|
[5RpNrrJ"0qYqW,<c.m:_#Mb8<V6=URZkqos"DZ\Cut]sKouE8Uhfu0#*\l_Xs7ZXp&>>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>U<l$iThss8Munqu?Zjr8mqZrqcEi"T&)s
|
||||||
|
r;-Em!WMuorrMrprr3*!qY9s^rrN)pqu6iqp\4IZr;Q]srVZTn"T%lhr;?!_!W)fjrs&B#s8Dfh
|
||||||
|
qtU0mrqucns8Vrts8)`orri>uq=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*[<Ng?<nR%MRkW.<1_rt!A+]Bm/Gle^RVU%/0_qNh,2"G+n=MW"I5$dsRsige<os89liqr[n[
|
||||||
|
lBq5.rrM3[rVloqrU'Xbqt'gfrp0Rar:Bphqu+8/!W2iFs*t~>
|
||||||
|
oD\k/@!)Ab"X%e%08#V[rsH"R<\AgbW%]&+`qTK@^_e6HYA27oVu8]-kl1^U(gun6#+-MhQ5^ZC
|
||||||
|
mf*Zf1-naQ6r9T;?l5a0rstnFKAD3@gV_(L<TX8\og&Kn"<4;,.`_Mf$`t91b"S]4s8&**pu_SX
|
||||||
|
fL+uhrrLCBrVlonqsFCaq"OC[!;u0_!;Z6d!VlQYrrE&JrrMoln,ECekPp&~>
|
||||||
|
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<rr:g-br;Q]trVu`VrrW/orIP!C
|
||||||
|
s*t~>
|
||||||
|
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`#<rq#1-js8Momp\FdQrri/oqY1!\rs/JsqtTs_
|
||||||
|
rqZ!^"Sh`gr:p0`!<2Hes8!K+rr;lkqu?Hhs7uE`q"OX]qt^'_rr2p)rV-<ks82fkqu$6Rrr`,l
|
||||||
|
q>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))Eu<p.rs,>ZKK1T'
|
||||||
|
k">(A"@<rmZ9J7)ruD+]mI1&kBQHr$qhJ44pG'/W8f/C,+*2.G6qoSkrr3>>)!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-<kqY9mbs7lGA
|
||||||
|
s+LE&~>
|
||||||
|
p&>DlV1>MVR@DP&s1+llrs@M5Oaqt7NIZQ)o`#<<J;*:gm&84<J=cT&rrqh@_WcTpoD])_N1kg/
|
||||||
|
s8S;Ln,EI"Q(e2-"I6X1JrB*t)"WoRp?])onCbdYp\]brMP6$3J;'QOS)aMJ$K$C*rj@u`jS+e9
|
||||||
|
JcCE'J,~>
|
||||||
|
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*rrqH<dqYp<i
|
||||||
|
p\XFZ#Q=Jmp\=Xaq>U*grp]q)rV6<gqYg<eqYg3hrqH6crqlQgqu-Qhrr2p)rqH?dp\OpirqZDA
|
||||||
|
s+LE&~>
|
||||||
|
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<nnGiOT(g$/*#_50U)eYTg(j#<K$<A1irN^t8pQcYoli.1a?!?hf(ru:K$.p5OG&-#0
|
||||||
|
lQh/Prs-2))&Ocfb"VdO!7gT=(t:.DRW[#?=a@qErRr)iRb!+7H\oZ?+l*(s$JH?"7Mp4Bs5HLn
|
||||||
|
JcCE'J,~>
|
||||||
|
o`#<rp\4Ras8W&rq=jdTrs8Jqp\am_q"OdZrsJZ!rqZNkrqlWfrTjIfqtL$dq"OXWrs8MtqtpEi
|
||||||
|
rqcEXrs\i"p\Fa^q"jg\q#(-\s8Vlor"Ai&rVZ]ls8VlgrVlWjqu6Tjq#14"rqH0^rr;uorqZJC
|
||||||
|
s+LE&~>
|
||||||
|
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<oF!m^)AL
|
||||||
|
d"24Ms*t~>
|
||||||
|
p&>HtOr,$okl:XpdSM$Mn,EZ+(a>Js4XVB)oD]/N;<VB1^sn.8*Ph"@#*^74[4iGDo`#5K9::t>
|
||||||
|
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(<U]o7KEnG`djKoNm._q'Cmo)B';L8E]'a,&gVKs9qD#Mb5pLPV@KXnD]$l%5>9
|
||||||
|
n[@eaj+c^brsXd<VO<"9\;YrpJ:cYJrtj%>_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><rsSZ\(rbs<++13i/jJb'#h0q5,A4hO(qTD?$%Etk
|
||||||
|
i0WG2i/fJWrsPJa*[XrG)jugL(qfA<(Om98c)^+/ia<UNs8U7n59!dVIp*dqrr)j(\/<*_XYE3p
|
||||||
|
*Fo)"s+LE&~>
|
||||||
|
oDejc"T&#lq>($dn,EC`r:^3fnc'!mp\Opeq"t'jqtKmQrs8Jqp\k!drqQ?^rsAGsqu6Nnrr2]j
|
||||||
|
n,EdoqYg9bqYg6bq=jaUrsJSrq>C-irVQKeq>L<uq=jjer;-<iqu7!#p\t-drVZEbrdk*%s*t~>
|
||||||
|
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<Nq\_[uQA69C`#]#>#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>$)<gB
|
||||||
|
fDjt*`/a``rsRYCL7l/cRE<pDKAc>#$a-:UU"\k2\"eMJr;HWsgO[]Ers68gr3>OnJ[>*%s+:9$~>
|
||||||
|
o`#9D(`5:O(a2"k<Jp;G#J1p(1`.'EnaZVfM&8iYR.:$10nu8:NUQlRM\p-5T7t/=1ILg7$!9I.
|
||||||
|
[f=\?P;2k$rsQXt,Z98=7\-_J*lddN$Yrl^<4gpmI9.@eq>L<p]c*gBrs4;sqJk21)0GD"s+:9$~>
|
||||||
|
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?WorqZ<aqYTj`!WMlnpAt*gnGa$tq=j[as8)Kcs8VulqY0gWrs\o&q"a[\rr;lms7uE^
|
||||||
|
rsAYup\b'krr)flmf*[mp\=U^q"sp_q"OdYrs8Gpq"ORXq"O^]rrW&lrV?HtqtL$dp\Ff>s+14M
|
||||||
|
s*t~>
|
||||||
|
o`#9>J:N<kl)0*)Wk%^##4[t/J:XTXnc'4#fq!YZqYdjUUAFetUpPZArUg+!n"u#4L90qF`45W3
|
||||||
|
L&:TD$/gMfbQ%V9g"WInrsR/)NOHKc^pJucJEc\*$2L0CQ\(6OOb([Nrr`8'NSs[5#QDPie'!<:
|
||||||
|
p4<6ps8W+L~>
|
||||||
|
o`#8e(`4BZemK@mA:O1M#3J,e(`H`)nc'4"\kO#-p%s(Y=7uE==`tWSqXjdsia"--,AH<?P^`6q
|
||||||
|
+nt^1$-+5,U&P&Z\\;M?rsP_F0RAF<NHZj=(t\BZ$1gn/66%^(2]A:`rr`480ZX%i#Q9Z"YFlb7
|
||||||
|
mt(Lis8W+L~>
|
||||||
|
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"HJ<T<krrrDml-lnsrdYN\]9@bq]u#k]Mp]InPdocQrql^*
|
||||||
|
d[Ps5g4>4Gkd/CNc'#$ursAPnK;Rr6m/EO&mf*]_MR]"I\raYod$CR,p&>?TP_+O<LrRW+iV3?`
|
||||||
|
rLSVKf@A*`]W$m@Jr"rnrIP!"s8N%K~>
|
||||||
|
p&>K+*>fs<s1L,0rRa$5oCi1gr1>8P(d$IDrrrAaeuj$IrYQ8^KK9qeLQFD2/Zb-Q4atTQrVZQm%
|
||||||
|
]r>HT">mneC8W2R%u`Mp&>?lkoF'_s5!WHXR?)s6n<^R<e3/bhl8tJqXsjp_E8hZ(abTB7`b?(&
|
||||||
|
Gf0BH+1,SPD3O#(`Xn?Nr+D-JcG`LJ,~>
|
||||||
|
pAY9pq=jX\qYpZqp\=a`rrN,qrq?HirU^$hqYp3qq>:*equ$BgqYpKorr)uqq"X^[rV6?cs7lWi
|
||||||
|
!;QHc!<2Ti#5n5lrqQ9amf*gqq#:-grV?ElqY:$bq"jmarrrAuq"OX_rV$<goD\gfq"FjbqYc!F
|
||||||
|
JcGZJJ,~>
|
||||||
|
pAY9aV1=*:rr2unrr3)CJ<os+rs/GdY(M7TW8dFK0r]hVKq,]q`jsLCXg7?iqu?*Pn>hb3J: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>Sn<Hrr2ugrr3(l(d[Zfrs/>OC`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;6<cq"X[]qYU9g!;l`k!r;WdrV$Ehq>1'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.CmkKLihea<D9mdKiJ
|
||||||
|
r;Qugf[na0jo+cM"QZ82M9>Jj*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<j(_%Eo^f2OQ>"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
|
@ -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+<VaF+<VgL*>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<a^B)I=14+s*P?.VnBX]RWl6Q]Y(qc"q7Qos*t~>
|
||||||
|
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<Sq]=Y_f`\[[)
|
||||||
|
jo9i~>
|
||||||
|
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+<M^L)]^(Cq@ruElP9F6!u2RT$2tY>(?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<iI-Z4\HjGBE1Ojh#I!p>.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\+<Thh"<S?p*[(G'!$1AH'H\A;+<VaI*[)pW"!]-?-7:/L!1E!L
|
||||||
|
J,~>
|
||||||
|
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<?e`]Xth`6ia7dkl6/~>
|
||||||
|
lMh=m=o]9Z+<VaM"qr-r']]u9()7Q"'bq8m'bqMD'`]$K'au'+"rSO*+<MX5!36%^s*t~>
|
||||||
|
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+<M^I"!&Hu'GVDG'b(on'c%N!&/#]m'GV;ri=ub=+:AW%+!2UI&HI%Rkl6/~>
|
||||||
|
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<j!u1f(r9402~>
|
||||||
|
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+<VO&#lWueJ,~>
|
||||||
|
lMh<Z!"LA',pjoX)'pCH+5\+A+9i5rr>kq\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+<VX/!86T9J,~>
|
||||||
|
lMgra!#-g[-3GV,$7>0^ru_4]!$1_R!Zr-or#Ph[rZ21a*ZcCFkT1*U,nLnA,pju]#6<H@s*t~>
|
||||||
|
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'+<M^I$376ms*t~>
|
||||||
|
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)<I!g?jHgZ:^HN&<lI1(FNH[U9iKGl[sI!ba=s*WsW%"*c@KJ9gI]=c'Y
|
||||||
|
!-[T+J,~>
|
||||||
|
li.CN!!F;c+<M[J)]ft5r=o;Jm1fU:r=oSP'c%Mu'c.#Yp_EfCjV8.=+;Y;*+!;[M%01S8s*t~>
|
||||||
|
li.+F!!XSor?_Ug+X.rk*WR5Y*WR5[*XWo/+9i8s*uuCD+T<G^*T\=M+!_a2,UOi`-kHB%kl6/~>
|
||||||
|
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<rY5bU'c%N!()7Q"()?c`!=f_>('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<ItNE/GAUG^7lrgp4$5\i3]oJb4?H#3?u1UQKS"`'l?s(e
|
||||||
|
XLLu1]XtejO:hQil2Q8~>
|
||||||
|
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!!+<VaJk8k!V,nCY:,UOl[
|
||||||
|
"9A;_s*t~>
|
||||||
|
li.A;!LU[7]XtheZbD<EmsY4b$@meG>rs2?#R1A3q>^Ksq>^m(":#8@+[T@EKRSF<I11Iq^k6I8
|
||||||
|
]Y(tW(]`+Ns*t~>
|
||||||
|
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!<N0"
|
||||||
|
"9JuD*$,#"ruh"V%NQT3+t"Z_-6srb-O0XGl2Q8~>
|
||||||
|
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;]*rd<?*>oIm!!!$'#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<l2Q8~>
|
||||||
|
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\*+<VaM$ij]"s*t~>
|
||||||
|
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<U'.$e0JUMooI=$GAI1(P?\R))D]=l-m!]]HEJ,~>
|
||||||
|
m/I0=":cUS*s<`/)]g*q(&o%/&-r@<!!NoN*ZmJLOkm^9<YWmP0HD8X+!;J2nAm.$'>a[R@5cTs
|
||||||
|
1*%M\+WhdK*uP[q!!!-+%fR1G'GV>u(B"sU(*F\0*$?@G+V4Z6l2Q8~>
|
||||||
|
m/I0=";*']-3PVA+!`0,*rd<I((16F!!NuU+s]C[Phs0B=rG`[2C'Uq,pjaHn]<R3(W-0YAieH)
|
||||||
|
2^0Op,pjla,odU(!!!0/'ceA;*?Q@E+9!>]*ssAA'I"eK-RTQ.39gHn~>
|
||||||
|
m/IH"!+*LS]=khV?F@'5I8b`1+TqcF31[@c^:V,Ss8UI4s51<VqnB_U]">Ybj8[E;]XRA.h#$L<
|
||||||
|
pqFAP]Xthl]XthgZ_LM$!!<p,K782rI=$<hI!pCW]VMaC]Y)+'!ZpV+J,~>
|
||||||
|
m/I2p!"g@rrZD:a&0;ne'ep7'!<<*,)]g(E*[U(Ns(&tGPS2L:-QX<L*?Z&os'-Qe'$U00oYg[m
|
||||||
|
-QO<O+<rQcrZD7`*"MrJ(BY*^'c%N!()@W#'bql7*$$.F+<hL"*pN]T~>
|
||||||
|
m/IH"!"gS*,psr]&L8Xs*\nfR#lt#+$QgW?-6k&*s8QfLs-FPPo.D:6,:"WTW;g9O-5b#(NqC<g
|
||||||
|
lRaA--71,t.K1Y",p<j#!!3<9+86fZ,pjc[-N5@o(B>N@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+<V9Ip)R:]
|
||||||
|
\+D?q+<M^ts*l18rZDFh*tnhZ!!!H&'a#R%&IeX]"<eZ`)>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<G(9I<%"5CuF#(>>]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]<a(]tDGde,$]j]=c%rJNsD>-<ktJI!g@G^n+rGrk&?Q!YE<8s*t~>
|
||||||
|
mJe*X0*!.<+<M^K*?$(A'bhAu((:9F";)Uu+<^S(.1c(9&0Dcgfqo`!q97^aN,`tX:7!UV+<_SO
|
||||||
|
VSVoge(grH4!,M8s)&kS+9*H#+WhF,!<<<7()7Q"'cnM:&0Du:+!CUq`9RAQ~>
|
||||||
|
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"#+<MF+!!3KA'bhE&+<_UF+<M[K"V%j(s*t~>
|
||||||
|
mJe!E*WRQ5,pt#d'd"eI+<DUC#ljr9+"&H3-5@Enjq\sgl\R\I*2kqe9Ih5.-R0WXr?`%&.RTi"
|
||||||
|
N_M?6h,QI6s(s%X-5e0W,pt#Y$31,9*$?=E,:4`W-RC)d-O($elMlA~>
|
||||||
|
mJe'5$m*'p]=bhh,(.>(I="Nm!">1(]Xthh]DK5i])D</g\U-F]Xthi]=kqm]Y_S'^;Ih)]tV1p
|
||||||
|
]=u"l]Xu);q>07Rd(B.e)83\p]=bhgAcMfPDLd/1^oA*[]Y1tu1'E?ss*t~>
|
||||||
|
mJd?u%Kmmt+9!Ap#8JC$'bq,X!!4#[+<VgL+<^V).NTH%hZo#+[N-J4+=A6Q+<VgO+<hpP+WqjK
|
||||||
|
+<VgR,pXQQ3KEIpX8ccPq]Gh\!$D.^'-@ed!!NuM'cS89"!A[.+!LspL?eeh~>
|
||||||
|
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><u:;FQU]tD"kq7J-So$7:-]t:qg\@9)AJ<di4.6sai/46J+LPEIO
|
||||||
|
\@]Ad]=?ngrq":Eqn*iZ]tD"i]=belWZD-D;LOnI\e:[L]=Z!T!J9V:J,~>
|
||||||
|
mJd6j"pOoI&Kq/o+W;%!!!!HN+!;[J+<Vj**sWi0psrgPgF)tC+!2OG)AO/5$O7%Z#m^nZ)AX,3
|
||||||
|
+<M[J+<M/m`W"Of*W$om+<M^J+<VaK+<:Uc!"Te^+X$t,+9!Aa%0V:Js*t~>
|
||||||
|
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_Fc<qmG(Hr;
|
||||||
|
2C+9%<->XJXM;<YgW@;+]GJ2n]=bbg]t?u@!,\CE`^c<.]=c!j!,_$$J,~>
|
||||||
|
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<V!"pV)r?`!n,pjT6!!O8f,UXrd-7&F7.3pSCoo9Y1+sJ9O&Ig#l"q;jr(`anB(`FV8$jRag
|
||||||
|
&/QQ8,:=HQN)2G/-5.aR,UFca-RC#b-4U%V(a14R%j(]s""+c`D<h.O~>
|
||||||
|
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<I!"C%mr?)Uo*u"_U$lU93+<M^L+Wqp)*t92GiFi`D&./dd'GMK/rZV=brZMCe+X%sNrZVao
|
||||||
|
)\`o+'+,<n*#BV:qB#\\r#l"]&g/8=+:\AO%3H`7*?ZFG+qjrSlMlA~>
|
||||||
|
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_)<F^V%4oNrV]Kli2J~>
|
||||||
|
mf*moDZCFn+<M^J+X%I!!"9tn+o3;`+!;XIr?)@n56VE6(Ddu3r?).c+X$b.+X%mG*$HIL+WqmN
|
||||||
|
+WqmJ)&FA"#8/($+WqmL+<MaL+!2[)+;,b=+;G(_!"9tZ(*OeB+W(2LrTjK6~>
|
||||||
|
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+<UP)rZ<I0+WqmN*YKJ''-&,:+<_jN+s7[7&0CuT!uM4B!#6%M
|
||||||
|
$lp?-+X$b+#U(<2'bVMl&0:`m!$V:`!$D1_$R$W8*utA%!WWZM+8m;a(B?Scli2J~>
|
||||||
|
mf*IcDu^\#./kP&-PQO\*#9hI,pjla-R\j>-7'ud-R0?O&JZK:-R:&c-7C2\()%ts!<aDK!!!lM
|
||||||
|
#Rhk"+=AK`r[&=),8_.>#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<PdaZdn
|
||||||
|
_iA9,DZBd(PaAoZ]*c<e`+LA7RZF_c]DfJB]DoSD]+;Th\V1"`<Oo`S]=tZQ4RMJ7J,~>
|
||||||
|
mf*FU63%]CrZDUm'*&%K(EFY@+!;[JrZD1arZE!u+VOke*[)XK+WhgK'aY0h'bq]8.P+a$?jpCM
|
||||||
|
3>j(\"9KJZ)B^.#+:B>)"pGq_+!DaK+<g\+!$V=a%j)o:(B=FG+!;^L+<CMEmHae&~>
|
||||||
|
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[!<X5F&0W4r+9E].+9!De*uPG%*Zk;(ru_[a"p$2.4A07d]%QHDrs\_\a,=+M
|
||||||
|
$O%C`)BBt"+Tru.#QtqB+93S_+;,h?+!D41*<H9B&g8D?+<^_4e*I$a~>
|
||||||
|
mf,!,6i\2P,UOcN!!*0B#o+a5-7'ub-71#b-6jN?)^6OT,q(&d)$p<t2*juNY.WHSpAZiBhoCaa
|
||||||
|
/.2S%)'0tJ,pt)i+:/5i-7'ub-6srd,paoc-PRCB!s8N<-m^2d,lf=Ali2J~>
|
||||||
|
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["</L+r?2+^&g8;4)\!H$+<_mJ'aGC)<eRR/rr3;ZdCcW_X.5')RJs9-
|
||||||
|
X0U+=qZ$THWcguI!!XA[*[)UJ+;l%8%iZW7+8[/k+q4r')A`GV+<VaJ+93\5li2J~>
|
||||||
|
mf*d[2#ndI-79Q/!>Gtd"<d[j(F1:S,pjr`*$Gh/,UFfc+W(P&0NX"4g]%3[g<mR9XK.kJM4(IE
|
||||||
|
X"(F%lhUS\fWKKq('4^_*[3!Z-R^#V+;#_C,pjrd-7:/e-kHh7*uY4^-iG@n!$onVs*t~>
|
||||||
|
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<g_;AQ.M^V%7m]t:nkO^u4MP:Zd%^q@@q(E^ids*t~>
|
||||||
|
mf*aR(]Y0a)&`YY'd"D=)Z1]`+WqpN'Eo!g+T<Pa*"E8dCpMajs8U>j;`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+<D.3+!;^M)[69]N9U3=s2'"(%/p5V4\o[=I=6QmIVDSS
|
||||||
|
:f9"k%0-A/$ku(Os8VcNY<iR5$5FX*+!;RG"r\Z_+:',4)^#Y'%fd1>+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$<cli2J~>
|
||||||
|
mf*apZQ0#I!W`96+U&\o&,m[m+!DaB!>Qb#+<D73*#25rs7srP#ljr/++Lc:^V@M[]c4]#^;%Cs
|
||||||
|
^r!C>;DSa_!$7*gr;ZfjN$elA+<US*(DHod+<_gM+<_[(,8:S'!!X5K#R:D?Yj;=>~>
|
||||||
|
mf+s;ZQ0#I!W`9:-O1V(&gekN,pjrW!Z!.1-R9KE,9'S1rV=`N$31&/*,hOOWMc]lVu3LnW@t<C
|
||||||
|
In;4"!<=1"nGN=doT1U.&gSeL-79T3(a^UW,pao[!%/Qn)#sp[&.8aD%'T!sJ,~>
|
||||||
|
nc&Ugrr4IT+;n'[,644G0=5VO]Y)"fV4TT5_7QJG6RS&=o(q+%(]XOZ98DF'oC)28%IW]TpA+9F
|
||||||
|
4;InsAA.%&rtb+QSf<!^]tpV+Pa/Yh]tp6DaKheU"T8<&!rs4Rli2J~>
|
||||||
|
nc&Ugrr4FM&d^rt*WR*$#Tj]r+WqpL*#f/%+<MUE$NVD@[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+<Lq4-RKr\%0InM\c:QJ)#sXQ2.)iYX/DhkVPWm]%&^),
|
||||||
|
YGu7b%fcT@^>o4m#cLQK!>d".-6rL2s!84(-6E79,9eH8!!!$$"994OrVllsnGe"~>
|
||||||
|
mf+]T-P]H`<ui$UUSYf-X2DW2:L_#Y_l-ZrX/4D>p9%g5!#]4,fD#"-rTsROo'A$smd9B/p@GnB
|
||||||
|
2uiq5L!9Ssr9'>3R%;"-`/6fK]X+i<EP\)X^E!:g0f_ND$@;U9s*t~>
|
||||||
|
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'$lP<g\2KYedTAJPVKLoC%o0$ih'#d.[5&m-a9-md9?nmI'?.m-aE;
|
||||||
|
e?ENl!$PO\s8W&[bXt%#]tp_"X>LbS^qPpdY#56F>[:WC.1;[4s*t~>
|
||||||
|
nc(*<s2>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?<!*#]#8_(Ek9!Ms/RgXrW!0*&MT?uqXj7Um/QJSm-XE2s6^!Y
|
||||||
|
m-O0>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`![/^/+<MXF*?ZIE%ilDc(edRp9gB0gaR0"X~>
|
||||||
|
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:<Bim_\)MlKRs-&FR3Jl0dj$kNBjH
|
||||||
|
>UBFN!<N0"*\=_os8VG840-$+]Xtkh]t:hhS,a=)>$Fa(5nasdmf.e~>
|
||||||
|
nc&X0%f?;A)*S$4+;>h=+<M^K*uu:+*@d3Lgc+p,#8'pr\%05@Zi7Q.]F;N>RCTrA]"#8@F%IGL
|
||||||
|
!":Ecq#CAo/.!==+<Vd'+:B+g&k,Gc5"@@3#2/GEJ,~>
|
||||||
|
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"3<ar5KCJU$#jAm/ZZt/ZA2EoZ+9r8S
|
||||||
|
0>6TLs,&hKY._Q^]=bBoQbi_49O(dp&2kpG3:627J,~>
|
||||||
|
o)BZ`-j(;8&HEJ:.KC/*(EO\A+Wq^3"X$9WkP0f$!!b<D/Hoa@BYX8R#e6-pO'\r*:FYu;+9_uM
|
||||||
|
0>6TLo7&;4*?ZLI+<V^0)'Jtg5"\F.![eld/aVs+J,~>
|
||||||
|
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>$<E^%h&kQnF6I.~>
|
||||||
|
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#<Y(.3B/Z>*!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<PJ:jGFZ+W'r5?qJW6kUpk!"#.as*t~>
|
||||||
|
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<i$)]'M:#m)nU9eA1)*"r;PQ14g(~>
|
||||||
|
oD^<9kPtSI+p0\i5o0rp=:5?V#R1tpLt2OM7g8rE@=s5eKnOo#E+E6M1_9Ka(5<YW7o#;GV5C/e
|
||||||
|
W2?JiW0[fcE%H8Dq>_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+HVYGMe<S$"C;!+pYg)l"VW%%*!cX'9f)hV"9I>K<R1+6J,~>
|
||||||
|
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&WiV<HL`?tWgR-)`<q8rf]b0%g)apQA;aeN4VN^I-en,2Mamd0<;)3d=1
|
||||||
|
JIr"q:Q*B>bfg".!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<dOna-5As6L0]nCL*t
|
||||||
|
JYeK`Y1qFOrQ5;cb0%iKao':#aOoG<`]j\.A)$q]s7PIDs'bso5R]HW9,\0%mf.e~>
|
||||||
|
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&<m?Vl-DiV5C,gQS<5[
|
||||||
|
F(SQmM1pQ\J,aurIfOrqIiX!%SZ.r1"TW&equ?]OWRUrX!&,o'-F5rH!9jI^nGe"~>
|
||||||
|
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]TV<cHj@g6i\#iO3>VZXcn3^K)L<&JqNuS%#'7\It)m0VP^DlVPj<g%B$(u
|
||||||
|
S?/inW/#nPJ:N:NKGK8pKS"f/JqAQ'IB1N3b/e]\!$cKdn,E=ppb2\%&HK3<s12QSmf.e~>
|
||||||
|
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+]<ntc@fBjCA7&&%84c??G5dO(NM*oT]F2Ec]Y:J0
|
||||||
|
OH5He<_<3[!+l.>#%V:pPDup&rn%tBa,1r=$p%pOKg>bN/-%g#<`*$fX7$"<~>
|
||||||
|
oD^?>s8/9j=@N996pD^m$6^T1!!I>>^!"F7`keXLUgmJ.=B8R)76a(&5<WZYIfb(XV=UPfVl$>h
|
||||||
|
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!<rf."TSW&!=/c3!#i\sc0"E`lj<+LjN>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!<rc5"U+u+!=/c3!>: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<M[C8`YeBJ;,/9k4Fpfhj
|
||||||
|
s4cVT3@l^3-WK!25R%4-c.^h&g"G2I$m-uer_3bm,QIfK0qm\""pKJEs*t~>
|
||||||
|
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/<eE:"pTPFs*t~>
|
||||||
|
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]C<HM]=t!a%
|
||||||
|
E8AH^l__K.4?VaMpB_uIL6'fhYl(@i-5>N/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<lg=rr3J69K+aa1G3Ckg>_F/)s$qao]ueLm-X0$
|
||||||
|
!/CLQ&(<Tk1c$s=;odMBlba'>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+sS<P?/=T+mU[!'VsU>sV4[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
|
||||||
|
]<Uu-rr;o"1En(f<SIEMrqKo^db<C,g"=s=<!"HS-;7'$!#qlij)5S^b<#]"n,In~>
|
||||||
|
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<!,QIg^dPh/$n,In~>
|
||||||
|
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+D<V4S&$rd4qfN11'#A7`Q#m8`Poj;`S'PEmdg)Fo_n1Zm*DElVAQ5.VPgB@mI'B.
|
||||||
|
o(D\Jn*]T,^S[jE`l5mq`>6J%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&!.<pE&=L4$7+@%n.G+(hJ,~>
|
||||||
|
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]Wr<WIIEcB.;bk8TA5#Rr'uW*R+.rVZTmr=Ai)r;?<UmHs?.m-a6-mHji>qs4@On+l;MmeQ2S
|
||||||
|
mHj6,mI'?-rTsUQrTjRPqtp:,rl#m:TEcqf$39JF*hE)o_41)L!#N?<s*t~>
|
||||||
|
oD]Tq<WHmfY&_%i[M=%,!rs&DN_lLsg"H8Ts47_+]Xteg]tCti]tD"k]C<H5]D9)>^&GYE^&G\C
|
||||||
|
]DT;_^=Cohf\+m0g8,9/L]AA(!!(3P)LTN<R=`ku!#N<;s*t~>
|
||||||
|
oD]p%<rcXIT4Ob!U(V?U!rs#BJOl$=`l>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;@H0s0mXK<sfTM!>b]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_KK3<UgN%KHM1#Bdo&`Q#mr`rF![`5ARNr2'UnVPU/dpSIqem\Tu^r2'Ijq5+7i
|
||||||
|
\AcJd`>6LR@_+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].<T!(,'`3%+eWaM66\!">sus*t~>
|
||||||
|
oD]9a5QH;QZ`7mK%6tYA(B+:?:qjof`5T[5`lA"s!Ni0qV?j)sV5C,fVP^3aVZ!@`V?<ZlVPj9f
|
||||||
|
s/5mo%&Ki?_T'R7`Q"jRa2n2Z%6V<N0I-ZFYc5I]!">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*<?9N7_ZI5aMl-:`5T^8[A9[tq5+.grh][lqkaajSY;4"K7\oLVl$<^
|
||||||
|
V?*Tkrh^p:Vl$>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[.<SMlhUQ5!06RKJ,~>
|
||||||
|
oD]fc(BD/$^Uq.nY?i:N:]LcAgI6)8gXt-1f\+Zdm(<J7V&`j%qi:fCYeL+L!5%[3#J7X]^!#*]
|
||||||
|
g&BV<dbJjZQiI?I"U[YZ_7[Fldb?/MNq!(!~>
|
||||||
|
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<Ej36)a^tRGmf@@aM]Y3^F",.),O8Y+=Nrk?)Y5Q$4])fRVo=P(8
|
||||||
|
rk&9IfDaD<fAD"$fZ]-O333*3'`rp&]Y2hL-if7rs*t~>
|
||||||
|
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<i$%I]+VPg;g
|
||||||
|
V5C0[VB)M1Vmj[c`Pod93/'%>!)[Y:AV2f>KrM#da<UbFnGe"~>
|
||||||
|
oD]`a(BE(cp@G6dX3mLWH;+AZ3QjqDpA+Xbp$;VD!Uf@Hm/QGgm.&@<N8W^amdBT6l0%3mmHifZ
|
||||||
|
lg4$-llGK[mIC,Qr;X=0piaml!3!^H?Hh"=;#9_Zs![r-nGe"~>
|
||||||
|
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<oc6BRTH5/tIig`ulZnGe"~>
|
||||||
|
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<J;u]Xteg]tCuJ]Ec-ePqG,-^V9TXrk8?E"c3k_^:h/L
|
||||||
|
]E#SA]G]&If\+,L`T,)l!3k=N(h/dn'u@l?huNhGnGe"~>
|
||||||
|
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`,lG<Y.qW^^&>SD^&5MFUD$P9lb".J`Ribr
|
||||||
|
iet,)_#b%Wg":!fNCs\[bM'?('=[K2J,~>
|
||||||
|
oD]]r:&nJ;_6,p9J6EtqaK,@QPK\u6VoZu_V<k&bX_%tgRAm'\VuEOnV>I+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<r$_!&_dKg56c(9+.TCiGJWFfC8fj~>
|
||||||
|
oD]^+GlSo,_R)38IS)9)a2@r_MU@C'_je?DV<t,`X).i3SuDUb!2]If"/oB(PNo"_V7jm\S&`6#
|
||||||
|
SH(@O`5d<BGX;b!]?Ojd.bF1iJ,~>
|
||||||
|
o)BN&!W_*UqKrmtGWP9lqZ$o4Q9YDUEq8kilic_-2brZ7li?GOm/68Teg>D)mHs<-)=-tnk@;[7
|
||||||
|
O:hO\l2:RU-GiOps7u[?!(HnVs*t~>
|
||||||
|
o)BQ'!W]sgc=73B<AVhOfDl/JJMuPV@F*'-mCWP&/3^T?]E#YD]`#GF^8i;X^$E<K]$8jG<j(>-
|
||||||
|
&-+c2g"VE'MDc-ndH)JN7K2fVJ,~>
|
||||||
|
o)BQ'!W]FD\5s#e9J<rs`;g(&Ftq=$=hV8?mA9uP-TIpuV?!OiV?Wub),R6-V<t,tUq4OP9qTXK%
|
||||||
|
KJ>n`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<WH+6aI!6<?3#Sfa#<u;qX=H7~>
|
||||||
|
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=!+<jX+XVOX+03M."ot%jrp]r<~>
|
||||||
|
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-<S.HGn"onZ(4hJ_<2lOA!VP^2dVks<g!iMolqPFUl2)LF$!$6E^V5O9h$D`qY
|
||||||
|
!rsI01BX#BqPF=jVPX9irMC"$VP^2gaCStg3ip=ErW!9,,!>pCYe<[0!8?i?J,~>
|
||||||
|
n,F6m)ZUl.qbS%T=fRG]4m;^ISc@p&nEoW2rp9[Pq<T*gm-X01\K"A4K`QD7lKdd$lK6E9"CHCI
|
||||||
|
-P!-Gp$;\Gqs50fn*KN<s/H$mU](5uPJqT)(_P6mAH2e*m/MS~>
|
||||||
|
n,F6m)ZUbbej:&p9Tj]%1s"::L>p7^_7R=mrk&6Cpq.'L]Y1tnOr$5t?3!u_[Jm]E\?VB""@?*G
|
||||||
|
*=[b<ot1::pq.?WeDHDMMi-6h"b!@Z1DUM)f2hqRU$Vf0~>
|
||||||
|
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<gs^;IUq<LqN2Lt&3QiGAQ8XkMF[i6P$r!,2,ms*t~>
|
||||||
|
mJe6:'*',9f>knNXTebsZH("O`*Pj7M+"2<XJr(nXK22p!2ogn(TO3]I>)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<EWag
|
||||||
|
X1Gs\rk/EH]=biO]H4k?EkT5OCpq!46cmOfdqDtB;?/Dfg=tSj.f]Qrr9F<4~>
|
||||||
|
nc&UgrVn+W'`\bYaih`3.KFe7`*6ZC0tNc4J#8uMJ#K>WB</&0VPg?kV?!IlVZ3P(Un*?`>"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`q<k5>8Xo4E#-!'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[<f]X<^7g"P0-<amre2Ta[I1]@@SSGW<drpTl;~>
|
||||||
|
li/*f&-)\@Fg\q[!)(7-<QN2"_N]_JV/&>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[tXeLs5<A9n++1RkOIajdcYpRh!OLpm-`m!mYfo+YNe4&>Ij:rM/Ip#
|
||||||
|
ll`J$aP>t*nEfE!md0B0m-.$/l`EGGnE)jBo'uS?m/HPTB)2K/"Xh=Qs*t~>
|
||||||
|
o`"pjqYp]ts8Ph'qZ%B[Rrd</g:teH^VQ0e\%]<uVmp(uXhF_H2nlZ2^2:$3Mn(I@8<Ud*D-(=a
|
||||||
|
],Q[DT<>]"^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#V<o#XZJ:>unqX*\9/C%JC_^F;]
|
||||||
|
S_6$Jo\sH3o>o)@m)3\Dq31"*pu9!+m/O@grNhQu!<aYb%hC^Sn)jY#~>
|
||||||
|
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[!<aYb%hC^Sn)jY#~>
|
||||||
|
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$!<a\c%hC^Sn)jY#~>
|
||||||
|
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;Lc<Q4+Fe"L9!_?8o^R]W\Ae:]XtsrC4oU#A4<I\
|
||||||
|
Y`hVY_/Cs?Pr>JC2Ntbc_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:?(!$K1pa0<Fp;J`:Y+GctoVP5qISt@rpU+UA]?t56OV1`ieOeVfO.A3-(R&-BMQsj*rHrR&A
|
||||||
|
E$Cj+Q_]-ZHDdX:Pt!BWVK>hN_Q_+u)?<.^s*t~>
|
||||||
|
ir:-h$38r_r;?N$\FT-pj6_oQmqR%7mHj9-mI0E.mHj3,rp0^Rm-af<!:BaOrp:h6nF#]2m-O6(
|
||||||
|
Ga.U`_*-?9dY-quZLRk.[/Bk%_%csKhuA3~>
|
||||||
|
ir9^\$37fof@SZES&2q$[CgLU^/S@Nrk&6CqRcgArk&<G]Y"*S!58<C#/.W@^Uq1mrk')U??X#q
|
||||||
|
QnYMQW+il/O29>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<J
|
||||||
|
]<OVB^q[OreDAAMhIQ]mqVV='~>
|
||||||
|
jSp;#s4eRo*-fV![`ZFSU8Xu-4.3(8Xf%tn,[-.qV5XBkrh][lrh_9FVPU,dVl$;fV5C)dXf/1t
|
||||||
|
Vk/oT)&n.&8YVoSUn'PYWMl_s_TTGcb$4rPqVV='~>
|
||||||
|
iVtE&!#F%%Hi2cVEo?B':!<4%Y4C\cm&*'!5B*?p\CgBHp@\%JoCDPEo^_SPo-Nu"p%S.0[$6/T
|
||||||
|
4%u12o'1s`p=jiLdRh";k]_=-rbQ.*!+Q!-i;\<~>
|
||||||
|
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<GWiE%tWi:r#=%+D`;N%?p
|
||||||
|
n+?#7o?1Fkh0_i9X,lDton1BdoM5GehVS9_~>
|
||||||
|
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<bG'Ek/.X$#[F^\340H(ol@WRX0
|
||||||
|
XJVkoN^/o"<\oYYAYH$;At@,Y4TGK=s8N&tir=N~>
|
||||||
|
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<b!!r]K1IQG[V6dkKrk&ua=-(%8
|
||||||
|
Nk`?%Ur0a5+Mc^bO-;X*:Yl&$~>
|
||||||
|
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<Xu
|
||||||
|
FhkmsO3t-WW8#H2!!(^.s*t~>
|
||||||
|
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_GB<?;ki]/<jR)=%m-X3=li?JQm/QJQliHP@rp9sYm-X3.m-O-=
|
||||||
|
lkf07bO+uih;e*KFSO!DoDc^Dm-=oW>4LGKJ,~>
|
||||||
|
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<"<GBoBi`<m+DA"+o;-J,~>
|
||||||
|
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<CKRX./t]#=VPU=(&MI7AN2*\`Z*:F:P^lCiD4[W%V5C)gIlsd3
|
||||||
|
>_/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@<hDbK7pH.On!!pTts*t~>
|
||||||
|
g]&&$$313h7+9iF1VCWE^c&="]!fA0)Sl<a#.gV!Q^F/,rg3\Prg"UlT=)>E^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<Z.T),~>
|
||||||
|
gAaUR,6.^a`8Zhog<@]kCqE!C`0N$T_n<XqWOB==WL]<DS<08%PG,"aW0"g0K<_)^UEl/E[TL:G
|
||||||
|
J\f=[Cl$Eb[lOKkZ.T),~>
|
||||||
|
gAaUR,6.^WZHe)3`k&Nt?`#lZXb8*fXJVkmPbFk>PDb'LML^S7Jrc7jP^f[3FIeDgO!'.ZThMFZ
|
||||||
|
EiZId@XGf'VDJ8TZ.T),~>
|
||||||
|
g]'bBs2cPe!'7=<kjrNgFMbjXs34Qdn?;KRn58bC^$iR_oC8$hYGLgcn%E`&noJ7*Xmj(nbl9EM
|
||||||
|
Z;^<rqrc,bB,^g`Pl987J,~>
|
||||||
|
g]'bBs2cPe!&BhPa3\)G@@ET<aeD+q^l-(E^HoYZQG8\q^qOocM1WO_^Qr$2_-B^GMSGN8UWY'd
|
||||||
|
N'kf`f#=c1=;LrMPl987J,~>
|
||||||
|
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<LMF`?Y.'Ho`)*YHB:$<<>-^\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!rr<X/F!02s"a8r[dM-nfQu<ql+i_Wm^f@fmd0;hJ_bg5qN@93m-O002:V*/f>B?C
|
||||||
|
r;Pf,oMbYf!?1"Ns*t~>
|
||||||
|
gA`_A!!!'d!rr<Q,fn`mj=8KUO1h/9XC87M\=%]Z]p48d]=beTAZo``a)lX>rk&`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#<Ho!!"<cFa$n##QOi2HI`&@?iSKrj&sdXme#r$@H$nFpN;#UmdKN5W8[:<o6usCMXegE
|
||||||
|
rb]LGp53rcrW!0ME-?%8!!%>us*t~>
|
||||||
|
jo5>[q#<Ho!!"?eG'I+(#QOi1Bt*0.;V\RV[R[3n]tqCb9sh^J_d$ih]tV.pL9n\2_..[kD8N-\
|
||||||
|
g0LT,dro4frW!0MEHu@=!!%>us*t~>
|
||||||
|
jo5>[q#<Ho!!"BhG^EU.#QOi0?`28E9$3oqTg+d*VlQ__6_CEUX\rB%Vl6JmG+P\5X&s%1@&oKh
|
||||||
|
``/8A^h[+9rW!0NFaJ!F!!%>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[(<M#R7P?9O6"4#
|
||||||
|
TjB_X!"'8O8To<%=ptB2^tSg=~>
|
||||||
|
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'<Rq^4>4S/TS
|
||||||
|
+oqZD%8'qH-<t_;G<Z31/bIftJ,~>
|
||||||
|
h#Bu;!!></F')g+*E75t7L/to'hFQheCK_AdP-Z^;4YQTW*He5[r5or]Yp+7DcFYoK3PY,1==pA
|
||||||
|
*WZ6@$VFbI.UI=CGsMQ5/bIftJ,~>
|
||||||
|
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<G'.tK'`\G8K79Hep\t6mlMlA~>
|
||||||
|
ir9ebSUc6D;?d+1Fa/+A5p7dpGB[^l-3=)G,9a&2:Y!f?d>DDWcSiO?Y_KT_<PZ%7dVPKid)Ds!
|
||||||
|
T@\*>')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!"io<HE.#0bQ#;4s*DQ^ioasfs!b"dT7)(dm+@CV
|
||||||
|
rW!H4$q>DcG&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'[<f!!53]l/M_n~>
|
||||||
|
jSo;JY;?"T1.-M9G^M1g7<Nlt;GKn3%L)t7!";`@?\HV2S]I%2b$^X]Z*dDmcle.4HXL:)\>aEt
|
||||||
|
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<F4'
|
||||||
|
1&_.f"V`1>;g<M0F`qt?.i`MIAoW;2!!2rs!]$82r;QcrlMlA~>
|
||||||
|
jo5@h5Q(R=!X/Q(#BP-5G[hdC??pa"927o%-TEUj!<<*<'UZCiDWddfmXCnp5c)*$j/suWMm!\4
|
||||||
|
.fKD_"r&=B<I&e4G'A1C/g,.RBQAY8!!2rs!]$82r;QcrlMlA~>
|
||||||
|
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<f2GAfuC8jagK5>=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)<oEHc$r!#^!(GB\!B!!"Y4kPp&~>
|
||||||
|
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=<I&h8Cf3PB1M_>::/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_<bnBR4A@-qmE3
|
||||||
|
:]!le:]!lm<-<J2H=A0G7/fpn9iQ=_;Zd"JIs?3aG]=o-!,Um!J,~>
|
||||||
|
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<PQ$ZgT)*\9u[:JX_\
|
||||||
|
:]*rf:]4#o<-<J5BJ1Pg:&Rg!958fh)#sbTH['d]HYF2p!5.RrJ,~>
|
||||||
|
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<I/sH!!#N:rHABh9a1SKl2Q8~>
|
||||||
|
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\\<d]9O!<>]>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^#&&<U#65QhrH8?eHm/P$^]+65rpKf:~>
|
||||||
|
li/O\!!lVNGBS1N>>cgK!)7]^FB)".9hd\o,=>-u:,aFH:ej_WXCd8n<O/lX9)_Ni8n<-h=rf:i
|
||||||
|
oM,<Y#?H1k0dJ2=:Amlc9a5B[9EtP6J,FKnINeb&^]+65rpKf:~>
|
||||||
|
li.SA!!ueUH$FUV>Z3'O!De)iGZXi=(-Ecb78?TS3?otM:JO\46T%D,,:#<Gr_<\lApJW++#6O^
|
||||||
|
:'s]j:0;pc1a=MC;#3omCjf%`!#U95HiA9nJ0Y+*^]+65rpKf:~>
|
||||||
|
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;,'bWZDOsM<jJuY9)_Ni9Pnrr;&qSh
|
||||||
|
o1f6Y#%DO0+so]Qr(R,b#>AEMC(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!rtl<G'7(\8kVt^!#]KpG#h+)8kDWI4s_C)7nt][.n`H+7/uNOQs9UjU."uP##K5\FANr:
|
||||||
|
p.56Vr^d>f9O^%(-UUW+9,L8m860PNINAIl3*g<BGBJ%S%KJ6Ds8W)ds*t~>
|
||||||
|
m/J\a!rtl=GB[:`9MA7a!#]KqG?7I4:/+JZ5pdg/85Cla02G;;9<t=tG?2#SI7jK5##T>_F\s/=
|
||||||
|
p.YN^r_3Vk9k-7,-q$i-9G^Dr=)E24*rlF'?u:(3G'83B!&<O6s8MHdJ,~>
|
||||||
|
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<E8P;/i+YQM>+>$5X8ONN5kaG`Us.Vm[8I&47G'-Y%
|
||||||
|
2b<a9s%<5]#>IE;*[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<R4,YC!A+=]fR91qrP91qlQBm+WBGCNcr!#S=#92]_PG%1LPI/WF3J,~>
|
||||||
|
mJe!E+93O4GBm=c9MJ;?!!!pLH[L'X@n]Sp9cc8:,W$qq1Jge?9Oq+gGuh5UI7d4.9NQ7YF[@-/
|
||||||
|
9_;%):H0[E.n36,9MJ5T9M82sGBS1TJ6DpQ(emb!<cN>-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!<<d%r^d>qF`hm<!(#l9s*t~>
|
||||||
|
mJdTt#67):G'[(]9h\>9r;[$71M:uXF'AQ;s%EVV+sS?X4&>fL&lk90<O/lX8ki#R>BP+359DgX
|
||||||
|
pJ(Z_#>6m!,Ul;Y:&@Tb;KD_[#%8\W!<<d(r_3W#F`r!>!(#l9s*t~>
|
||||||
|
mJdEo#67/?H$iTj:'"3Hr;[HB2/.D`F^.[::JOYG,UFc^4AbuO&kXcE8g>TB:JOYZ?$CO;5p86_
|
||||||
|
pJ1`a#>@!%-7__a:]!lg<-<NdGm7b(!s&B88H)?h>'YF@%0/]Ym/MS~>
|
||||||
|
mJd]R!!$>LFa6hU8P2]0#mLG/!#lJ7ASu-[9M8#P4<l$l3(lh88P!CPEG,=OU-noO#?l4mF$CX0
|
||||||
|
9(tm^83nUF+W*U@r_!Sl91qr^G^"7G9,RU-%0I;18kDTMDK^4M!"dfLs*t~>
|
||||||
|
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<B1Ne!!EWG1.Y.=8I&%.G'?+M!6+=)J,~>
|
||||||
|
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<r([Jm:f9tP1Em5*!"&cG/3$'t4!c1C:]=*&5<UM[-7'ou:JOYZ??^[=66ANj
|
||||||
|
rD!bs:f'Y?.3TcV#ll/Hr([E#HYPqo#5nN*'eDUH:f%$b#ZPbgH!p[QT`4?YJ,~>
|
||||||
|
mf*UP+93^2G'/(/9`%E]9*S*`7mf?a#lO`:"UPhg+Wj<K8P)@mqtU$err8][r^dr0FEVae*'Qqc
|
||||||
|
92&,N4YJ-*)CTD[!!#/Wr^d8cA6p\p"8r3&+?W%a9E%K_9)_Bf;/g]$B`J-Rr9aN7~>
|
||||||
|
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:/<Pi-71#b,W\^r:/+u;H$;Fn6;L?Q
|
||||||
|
:f9qQ1asXh/U9JZ!'sIX:/4Su?muTgr;[NS5=eRH:/4S\:/4ScF*W"H!!%';mJh\~>
|
||||||
|
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*<H3Q+=^"^8I._$fNQi*s.Vm[8K1ZMFE9#U*?H:B*?cd_
|
||||||
|
2.E5bY=8Kl0-C6&+US,J"p"o@2GHq=p.5Q`<HE;+C_-S/qX+<5~>
|
||||||
|
mf*UD!!"fuG'A1C9_qH`:AITj:/=%q!WWiY/l)@>-V@d7<g^(qI7d4.9NH1YF>"j_+<VgN,:P<.
|
||||||
|
CU1ss9`P/J+TMlo$iU,1!<s/s:ejdZ9aOKoFEVkF&-+ihmJh\~>
|
||||||
|
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<HO_:\?W?*!!!?t,Q%NM!YH\A:.n8R8P)NH9E%Nm8P2NF9367ZG&S`-,Ppg-J,~>
|
||||||
|
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<H35(/h;jWV5h,HaMbs4
|
||||||
|
`4mPt!&%#G'`\4A1,DEr:A@Q^9`Iie9F+jJG'@mM!%%L/s*t~>
|
||||||
|
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<h'9aFKf9h\;\58OP'!!NHj?nrlqr(RH"T<=T0Yd&UKr_4J8Ed)RW/u$>'
|
||||||
|
_ns=._SO.76N@*#7nclf"TSO2;+s[W9`Rrd9aOKtH$4CO,60%dmJh\~>
|
||||||
|
n,EOhU]:Bhr-8?gE)?C+##@ui<'_<*rW!*)6Xheo8Gl3g81Pu<3[>t3:]=*2=*8e20/'<Jbf\&L
|
||||||
|
aN2KGe4'E<'hM,#?3C6.@8fosp.bT`r([Pm>^L^BF<po5qX+<5~>
|
||||||
|
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<K4XD1@rCIbpL]@DOrr2ql6V0j?;K$`".OpUd
|
||||||
|
Ycn&1'!\B6!!!'O9h@oI:hq3S!$+d+n4<p[?[-^9E$G?/qX+<5~>
|
||||||
|
n,EOiR/d4[r-/-`#[L/!9MJ8S73_^2$3C]#G)(WT5pdaKrCn&$DR$@GY-,$X8ki#R<c`J,/2!X7
|
||||||
|
_nuDj&]2(`!<<0Q;,'bY<,<`Y!$=u)9aOR(H$4@N,60%dmJh\~>
|
||||||
|
n,EOiR/d4]r-A9d#[U8%:/4SY6m;O0$3C]%G_q#Z673mMr(\_,,UFc`,pYNI:/4MbFEr$]0;lt8
|
||||||
|
ai_cJb.h<b!!4fN9hnD_DB]&\+&ME$#uG,YG^=KY!%%L/s*t~>
|
||||||
|
n,EOiR/d4Zr,rs%G^!t!8kDN3)Z]p="<'@=G`V7lcoNNr8Gl$l9=jYsqYpMh6V0j?;fQu$+"<BO
|
||||||
|
YSX[JMamaI"=$W491_]I@:BZG!\R/<8P8hNrC[)]$:mfuGBS.K,60%dmJh\~>
|
||||||
|
n,EOiR/d4[r-'$'H$F7*9MS2?*!$$>"<'C?H'.RqdQK'&9`.U;:5Yp%XKJgV8ki#R<cWD*+YTS-
|
||||||
|
_nj40^6q[q!!FQC9h\8U:1RiD!!4fK9heCV:&dlo92&oAGB\$O!%%L/s*t~>
|
||||||
|
n,EOiR/d4]r-90+H[9X0:/4GB*<?-?"<'ICH]dard6B0+:&Ia.9f+7V-7'ou:JOYZ=*/_1,;?(<
|
||||||
|
b/qcM`Lfs,!!=KDrD!\qARu;N!\dGG:/CRY$r'Jk:1eftHZ^V7-2R$/J,~>
|
||||||
|
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.<YG[RcUs7B5>,"2B(,"uHSP>eH`Z$f5=9h\T-GB+Z\
|
||||||
|
VSg9ibb%ZH!!!6[:/+JWr_3SnFA)Z7#X7uW&55_h8l/YuAoW!<GAnc,-2R$/J,~>
|
||||||
|
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<t8;ZGA*ZLs6W-)+#uqb8kDGChtGq)rr8][r^dJmD0Bn9
|
||||||
|
5+T$lU.,jr!!Euu8P)SS8dn-X7p0sp!!!a)8P;\T8J=Wb7SHonC2e39G'%kLG&SZ+-2R$/J,~>
|
||||||
|
n,EOiR/d4[rHBZ2AQ;;o9MS5@&HDgU<t8>\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&HDgU<t8D`H>B5Ss6W6/,!Jdt:JO\5/12qo,pYNIr_<i!E-ZOG
|
||||||
|
7'k.g\5*n>!!3j":]=,h:C0Wb9jDp)!!!g.qb@f!9M82dASlL2G^=X[G^FNX!%%L/s*t~>
|
||||||
|
n,EOiR/d4Zr,sH1G&q.l84cEG/!^/5Op`:CH#7AC?q<!o/kS],8jiXFs8W)ts.Vm[8In[9G&\Ec
|
||||||
|
SV80e!<<*&.8'J1%7Pf)8k*E7('"=]8kDYS8HMt(E;k"[G5l^_Fp)b/!%%L/s*t~>
|
||||||
|
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<DHZgB!
|
||||||
|
Z'Zg<!<<*&/5?":$VH&2:.o;F(B=Fa:]*rh>%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<H<;)
|
||||||
|
*[Use!!<?G85K+W,sg/_s1_?(FCb^X!&m\J:/4MW<*EmLF*)PJGB\4SGBRpM!%%L/s*t~>
|
||||||
|
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<H3/$
|
||||||
|
)]AbX!Y6D>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<H<8(
|
||||||
|
*uk@_!=p;>:epj]%RB@[s3"A8>'NX@!!YngrD!;c&5#Me;H[:<DK0fBGAnc,-2R$/J,~>
|
||||||
|
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<g.5F"V92%rK5XI\'rCIJuEHQ7?
|
||||||
|
)\aJM6qp9F8kStP%mu??k(lT$87luo!!!^'9)V<n85<2f>[1ZEBl8$9G&JQ)-2R$/J,~>
|
||||||
|
n,EOiR/d4[rc]c5DIm$M:/";R8kM`O9hJ)D/#:p6!Ydk8D*fQp/MoXb:J=GV84Q0Br_3ns<H<8(
|
||||||
|
*ZPk>1.>#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<lA7JD/9MJl@EX`!K-W*\<:'OKm?#4b4HiA<jGQ`(6!%%L/s*t~>
|
||||||
|
n,EOiR/d4Zr,r`m?Wg6!8P)QI8P)NI8P)QJJ(ZIQ!!Ec4!=g%I+pK>J6qL!B9)V<k<H*(r)DYl>
|
||||||
|
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[!!#<BWJX%A9`Rld9a"9qB6SY"G6Dn1!%%L/s*t~>
|
||||||
|
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@FdI<Kt4OCM$D,p+<]1Hec_J7Ki?!*`rE1]@@U
|
||||||
|
4utFt!"h/$A4-Ct&tc\R711&gs8Un_r_EJh"AW->H$]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<CLpdO4t%[$,q:Z,0-_J;j7i:j
|
||||||
|
!!!c1m+<!P"c<9SgAh`tkl9.`5tb3qBjsk59he;U9Meu6G'A-.G6Dk1!%%L/s*t~>
|
||||||
|
n,EUkR/d4bH$K:5"'nVr:\[[P:JOl:H?ja[I@>(.e$!V8H$4(DD.d0V4sqR!,q:W*/gDA:j7i:j
|
||||||
|
!!!c1m+<!P"c<9SgAh`skl94c6;(?uBjsq8r([Dn??:@:Gl;mjE[:]3qX+<5~>
|
||||||
|
%%EndData
|
||||||
|
showpage
|
||||||
|
%%Trailer
|
||||||
|
end
|
||||||
|
%%EOF
|
@ -0,0 +1,10 @@
|
|||||||
|
/.dep
|
||||||
|
*~
|
||||||
|
.*.swp
|
||||||
|
*.lst
|
||||||
|
*.o
|
||||||
|
BJ-Keyer.elf
|
||||||
|
BJ-Keyer.hex
|
||||||
|
BJ-Keyer.lss
|
||||||
|
BJ-Keyer.map
|
||||||
|
BJ-Keyer.sym
|
@ -0,0 +1,2 @@
|
|||||||
|
:08000000550F008A02003200D6
|
||||||
|
:00000001FF
|
@ -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 <http://savannah.nongnu.org/projects/avrdude>
|
||||||
|
# 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
|
||||||
|
|
@ -0,0 +1,263 @@
|
|||||||
|
#ifndef BJ-KEYER_H_INCLUDED
|
||||||
|
#define BJ-KEYER_H_INCLUDED
|
||||||
|
|
||||||
|
#define F_CPU 16000000UL
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <avr/eeprom.h>
|
||||||
|
#include <util/delay.h>
|
||||||
|
#include <util/atomic.h>
|
||||||
|
|
||||||
|
#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
|
@ -0,0 +1,161 @@
|
|||||||
|
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#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<<ENC_A_PIN)
|
||||||
|
#define PHASE_B PIN(ENC_B_PORT) & (1<<ENC_B_PIN)
|
||||||
|
#define BUTTONPRESSED (!(PIN(ENC_T_PORT) & (1<<ENC_T_PIN)))
|
||||||
|
|
||||||
|
#define BUTTON_DEBOUNCETIME_MS 30
|
||||||
|
#define BUTTON_PRESSEDLONG_MS 1000
|
||||||
|
|
||||||
|
volatile int8_t enc_delta;
|
||||||
|
static int8_t last;
|
||||||
|
|
||||||
|
volatile int16_t iButtonPressedCounter = 0;
|
||||||
|
volatile int16_t iButtonDebounceCycles = 0;
|
||||||
|
volatile int16_t iButtonPressedLongCycles = 0;
|
||||||
|
|
||||||
|
typedef enum EButtonState
|
||||||
|
{
|
||||||
|
ButtonState_Unpressed,
|
||||||
|
ButtonState_Pressed,
|
||||||
|
ButtonState_Hold,
|
||||||
|
ButtonState_Released
|
||||||
|
}tEButtonState;
|
||||||
|
|
||||||
|
volatile tEButtonState buttonState = ButtonState_Unpressed;
|
||||||
|
volatile tEButtonPressedState buttonPressed = ButtonPressed_Unpressed;
|
||||||
|
|
||||||
|
void EncoderInit(void)
|
||||||
|
{
|
||||||
|
int8_t new;
|
||||||
|
new = 0;
|
||||||
|
if(PHASE_A)
|
||||||
|
new = 3;
|
||||||
|
if(PHASE_B)
|
||||||
|
new ^= 1;
|
||||||
|
last = new;
|
||||||
|
enc_delta = 0;
|
||||||
|
iButtonDebounceCycles = BUTTON_DEBOUNCETIME_MS;
|
||||||
|
iButtonPressedLongCycles = BUTTON_PRESSEDLONG_MS;
|
||||||
|
}
|
||||||
|
/** \brief EncoderPolling
|
||||||
|
* Abfrage des Drehencoders und des Tasters
|
||||||
|
* Wird vom Timer 0 jede ms aufgerufen
|
||||||
|
*/
|
||||||
|
void EncoderPolling(void)
|
||||||
|
{
|
||||||
|
int8_t new, diff;
|
||||||
|
new = 0;
|
||||||
|
if(PHASE_A) new = 3;
|
||||||
|
if(PHASE_B) new ^= 1;
|
||||||
|
diff = last - new;
|
||||||
|
if(diff & 1) {
|
||||||
|
last = new;
|
||||||
|
enc_delta += (diff & 2) - 1;
|
||||||
|
}
|
||||||
|
switch(buttonState)
|
||||||
|
{
|
||||||
|
case ButtonState_Unpressed:
|
||||||
|
if(BUTTONPRESSED) buttonState = ButtonState_Pressed;
|
||||||
|
break;
|
||||||
|
case ButtonState_Pressed:
|
||||||
|
buttonState = ButtonState_Hold;
|
||||||
|
break;
|
||||||
|
case ButtonState_Hold:
|
||||||
|
iButtonPressedCounter++;
|
||||||
|
if(iButtonPressedCounter >= 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;
|
||||||
|
}
|
@ -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_ */
|
@ -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<<pin));
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
** SideToneOn
|
||||||
|
*/
|
||||||
|
void SideToneOn(void)
|
||||||
|
{
|
||||||
|
sbi(TIMSK2,TOIE2);
|
||||||
|
PORTD |= (1<<MORSE_LED);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
** SideToneOff
|
||||||
|
*/
|
||||||
|
void SideToneOff(void)
|
||||||
|
{
|
||||||
|
cbi(TIMSK2,TOIE2);
|
||||||
|
PORTD &= ~(1<<MORSE_LED);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
** TXSidetoneKey
|
||||||
|
*/
|
||||||
|
void TXSidetoneKey(uint8_t State, uint8_t SendingType)
|
||||||
|
{
|
||||||
|
if((State) && (KeyState == 0))
|
||||||
|
{
|
||||||
|
if(KeyTX)
|
||||||
|
{
|
||||||
|
SideToneOn();
|
||||||
|
KeyState = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if((State == 0) && (KeyState))
|
||||||
|
{
|
||||||
|
if(KeyTX)
|
||||||
|
{
|
||||||
|
SideToneOff();
|
||||||
|
}
|
||||||
|
KeyState = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief CheckPaddles
|
||||||
|
* Original code K3NG keyer line 5654
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void CheckPaddles(void)
|
||||||
|
{
|
||||||
|
static uint8_t laststate = NOTHING;
|
||||||
|
|
||||||
|
CheckDitPaddle();
|
||||||
|
CheckDahPaddle();
|
||||||
|
|
||||||
|
if(KeyerMode == SINGLE_PADDLE)
|
||||||
|
{
|
||||||
|
switch(laststate)
|
||||||
|
{
|
||||||
|
case DIT_DAH_OFF:
|
||||||
|
if(DitBuffer) {
|
||||||
|
if(DahBuffer)
|
||||||
|
DahBuffer = 0;
|
||||||
|
else
|
||||||
|
laststate = DIT_DAH_OFF;
|
||||||
|
} else {
|
||||||
|
if(DahBuffer)
|
||||||
|
laststate = DAH_DIT_OFF;
|
||||||
|
else
|
||||||
|
laststate = NOTHING;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DIT_DAH_ON:
|
||||||
|
if(DahBuffer) {
|
||||||
|
if(DitBuffer) {
|
||||||
|
laststate = DAH_DIT_ON;
|
||||||
|
DitBuffer = 0;
|
||||||
|
} else
|
||||||
|
laststate = DAH_DIT_OFF;
|
||||||
|
} else {
|
||||||
|
if(!DitBuffer)
|
||||||
|
laststate = NOTHING;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DAH_DIT_OFF:
|
||||||
|
if(DahBuffer) {
|
||||||
|
if(DitBuffer)
|
||||||
|
DitBuffer = 0;
|
||||||
|
else
|
||||||
|
laststate = DAH_DIT_OFF;
|
||||||
|
} else {
|
||||||
|
if(DitBuffer)
|
||||||
|
laststate = DIT_DAH_OFF;
|
||||||
|
else
|
||||||
|
laststate = NOTHING;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case DAH_DIT_ON:
|
||||||
|
if(DitBuffer) {
|
||||||
|
if(DahBuffer) {
|
||||||
|
laststate = DIT_DAH_ON;
|
||||||
|
DahBuffer = 0;
|
||||||
|
} else
|
||||||
|
laststate = DIT_DAH_OFF;
|
||||||
|
} else {
|
||||||
|
if(!DahBuffer)
|
||||||
|
laststate = NOTHING;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case NOTHING:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// service_tx_inhibit_and_pause{}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief ServiceStraightKey
|
||||||
|
* Original code K3NG keyer line 2762
|
||||||
|
*
|
||||||
|
* ***TODO
|
||||||
|
*/
|
||||||
|
long ServiceStraightKey(void)
|
||||||
|
{
|
||||||
|
long l;
|
||||||
|
static uint8_t last_straight_key_state = 0;
|
||||||
|
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief Schleife für die Dauer der Zeichenelemente
|
||||||
|
**
|
||||||
|
** lengths = count of dits * weigthing / 50
|
||||||
|
** additional_time_ms = increase pausing between elements
|
||||||
|
** speed_wpm_in = speed in WpM
|
||||||
|
** sending_type =
|
||||||
|
*/
|
||||||
|
void Loop(uint8_t len, uint8_t AddMilliSeconds, uint8_t inWpM, uint8_t SendingType)
|
||||||
|
{
|
||||||
|
uint16_t LoE; // lengths of one element in ms
|
||||||
|
uint16_t ticks; // lengths of len elements + AddMilliSeconds in ms
|
||||||
|
|
||||||
|
if((len == 0) || (len < 0))
|
||||||
|
return;
|
||||||
|
|
||||||
|
LoE = 1200/inWpM;
|
||||||
|
ticks = LoE * len + AddMilliSeconds;
|
||||||
|
mselement = 0; // Reset Timer 0 variable
|
||||||
|
while(mselement < ticks) {
|
||||||
|
|
||||||
|
if((KeyerMode == IAMBIC_A) && (!(ReadKeyPin(LEFT_PADDLE))) && (!(ReadKeyPin(RIGHT_PADDLE))))
|
||||||
|
IambicFlag = 1;
|
||||||
|
|
||||||
|
if(SendStatus == SENDING_DIT)
|
||||||
|
CheckDahPaddle();
|
||||||
|
else if(SendStatus == SENDING_DAH)
|
||||||
|
CheckDitPaddle();
|
||||||
|
else {
|
||||||
|
CheckDahPaddle();
|
||||||
|
CheckDitPaddle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if((KeyerMode == IAMBIC_A) && (IambicFlag) && ReadKeyPin(LEFT_PADDLE) && ReadKeyPin(RIGHT_PADDLE)){
|
||||||
|
IambicFlag = 0;
|
||||||
|
DitBuffer = 0;
|
||||||
|
DahBuffer = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
** void SendDit(uint8_t SendingType)
|
||||||
|
*/
|
||||||
|
void SendDit(uint8_t SendingType)
|
||||||
|
{
|
||||||
|
SendStatus = SENDING_DIT;
|
||||||
|
TXSidetoneKey(1,SendingType);
|
||||||
|
Loop(1,0,wpm,SendingType);
|
||||||
|
TXSidetoneKey(0,SendingType);
|
||||||
|
Loop(1,0,wpm,SendingType);
|
||||||
|
}
|
||||||
|
/** \brief Send a dah
|
||||||
|
** A Dah with weight = 50 has the length of 3 Dits.
|
||||||
|
*/
|
||||||
|
void SendDah(uint8_t SendingType)
|
||||||
|
{
|
||||||
|
SendStatus = SENDING_DAH;
|
||||||
|
TXSidetoneKey(1,SendingType);
|
||||||
|
Loop(3,0,wpm,SendingType);
|
||||||
|
TXSidetoneKey(0,SendingType);
|
||||||
|
Loop(1,0,wpm,SendingType);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
** set sidetone frequency
|
||||||
|
*/
|
||||||
|
void SetFrequency(double f)
|
||||||
|
{
|
||||||
|
cbi(TIMSK2,TOIE2);
|
||||||
|
tword_m = pow(2,32)*f/refclk;
|
||||||
|
sbi(TIMSK2,TOIE2);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
** Output a tone width frequency f and duration duration
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
void Tone(uint16_t f, uint8_t duration)
|
||||||
|
{
|
||||||
|
SideToneOff();
|
||||||
|
SetFrequency(f);
|
||||||
|
SideToneOn();
|
||||||
|
delayms(duration);
|
||||||
|
SetFrequency(sidetone_f);
|
||||||
|
SideToneOff();
|
||||||
|
}
|
||||||
|
void Boop(void)
|
||||||
|
{
|
||||||
|
Tone(600,100);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Beep(void)
|
||||||
|
{
|
||||||
|
Tone(1200,100);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BeepBoop(void)
|
||||||
|
{
|
||||||
|
Beep();
|
||||||
|
delayms(100);
|
||||||
|
Boop();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
**
|
||||||
|
** Output the current mode of keyer as CW
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
void TellMode(void)
|
||||||
|
{
|
||||||
|
char text[9];
|
||||||
|
int len = 0;
|
||||||
|
int i = 0;
|
||||||
|
switch(KeyerMode)
|
||||||
|
{
|
||||||
|
case STRAIGHT: sprintf(text,"STRAIGHT");
|
||||||
|
break;
|
||||||
|
case IAMBIC_B: sprintf(text,"IAMBIC B");
|
||||||
|
break;
|
||||||
|
case IAMBIC_A: sprintf(text,"IAMBIC A");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
len = strlen(text);
|
||||||
|
for(i = 0; i < len; i++)
|
||||||
|
{
|
||||||
|
SendChar(text[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SendChar(unsigned char c)
|
||||||
|
{
|
||||||
|
switch(c)
|
||||||
|
{
|
||||||
|
case 'A': SendDit(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case 'B': SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case 'C': SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case 'D': SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case 'E': SendDit(AUTOMATIC); break;
|
||||||
|
case 'F': SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case 'G': SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case 'H': SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case 'I': SendDit(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case 'J': SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case 'K': SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case 'L': SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case 'M': SendDah(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case 'N': SendDah(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case 'O': SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case 'P': SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case 'Q': SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case 'R': SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case 'S': SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case 'T': SendDah(AUTOMATIC); break;
|
||||||
|
case 'U': SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case 'V': SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case 'W': SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case 'X': SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case 'Y': SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case 'Z': SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
|
||||||
|
case '0': SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case '1': SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case '2': SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case '3': SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case '4': SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case '5': SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case '6': SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case '7': SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case '8': SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case '9': SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
|
||||||
|
case '=': SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case '/': SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
case '.': SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case ',': SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); break;
|
||||||
|
case '?': SendDit(AUTOMATIC); SendDit(AUTOMATIC); SendDah(AUTOMATIC); SendDah(AUTOMATIC); SendDit(AUTOMATIC); SendDit(AUTOMATIC); break;
|
||||||
|
|
||||||
|
// ***TODO Umlaute
|
||||||
|
// ***TODO Sonderzeichen
|
||||||
|
|
||||||
|
}
|
||||||
|
Loop(3,0,wpm,AUTOMATIC);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,32 @@
|
|||||||
|
#ifndef FUNCTIONS_H_INCLUDED
|
||||||
|
#define FUNCTIONS_H_INCLUDED
|
||||||
|
|
||||||
|
#define TRUE 0x1
|
||||||
|
#define FALSE 0x0
|
||||||
|
|
||||||
|
#define PI 3.1415926535897932384626433832795
|
||||||
|
#define HALF_PI 1.5707963267948966192313216916398
|
||||||
|
#define TWO_PI 6.283185307179586476925286766559
|
||||||
|
#define DEG_TO_RAD 0.017453292519943295769236907684886
|
||||||
|
#define RAD_TO_DEG 57.295779513082320876798154814105
|
||||||
|
|
||||||
|
uint8_t sreg_tmp;
|
||||||
|
|
||||||
|
// Prototypes
|
||||||
|
|
||||||
|
void ElementLoop(float lengths, float additional_time_ms, int speed_wpm_on, uint8_t sending_type);
|
||||||
|
|
||||||
|
void SideToneOn(void);
|
||||||
|
void SideToneOff(void);
|
||||||
|
|
||||||
|
void IntDisable(void);
|
||||||
|
void IntEnable(void);
|
||||||
|
|
||||||
|
|
||||||
|
// EEPROM
|
||||||
|
void WriteEEProm(void);
|
||||||
|
void ReadEEProm(void);
|
||||||
|
void WriteEEProm_WpM(void);
|
||||||
|
void ReadEEProm_WpM(void);
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,634 @@
|
|||||||
|
/** \brief BJ-Keyer
|
||||||
|
|
||||||
|
Morsekeyer von DL7BJ
|
||||||
|
tom@dl7bj.de
|
||||||
|
|
||||||
|
OLED functions from https://github.com/Sylaina/oled-display
|
||||||
|
|
||||||
|
@verbatim
|
||||||
|
History
|
||||||
|
--------------------------------------------------------------------------
|
||||||
|
2012-05-24 DL7BJ erste Version
|
||||||
|
2013-05-10 DL7BJ Generierung des Mithörtons als Sinus mit PWM/DDS
|
||||||
|
2013-07-15 DL7BJ Änderungen der Keyerfunktionen
|
||||||
|
2013-07-19 DL7BJ Beep/Boop (Spielkram)
|
||||||
|
2013-10-20 DL7BJ Änderungen der PWM Funktionen für besseren Sinus
|
||||||
|
2022-04-10 DL7BJ erste Leiterplatten für Prototyp (bisher Lochraster)
|
||||||
|
2022-09-02 DL7BJ viele Softwareänderungen, neuer Filter für PWM
|
||||||
|
2022-09-11 DL7BJ Encoder, LC-Display, Frontplatine "entsorgt"
|
||||||
|
2023-06-28 DL7BJ Port Anpassungen an neue Leiterplatte V1.01
|
||||||
|
|
||||||
|
ATMEGA328(P)
|
||||||
|
----------
|
||||||
|
(PCINT14/_RESET) PC6 -| 1 28|- PC5 (ADC5/SCL/PCINT13)
|
||||||
|
(PCINT16/RXD) PD0 -| 2 27|- PC4 (ADC4/SDA/PCINT12)
|
||||||
|
(PCINT17/TXT) PD1 -| 3 26|- PC3 (ADC3/PCINT11)
|
||||||
|
(PCINT18/INT0) PD2 -| 4 25|- PC2 (ADC2/PCINT10)
|
||||||
|
(PCINT19/OC2B/INT1) PD3 -| 5 24|- PC1 (ADC1/PCINT9)
|
||||||
|
(PCINT20/XCK/T0) PD4 -| 6 23|- PC0 (ADC0/PCINT8)
|
||||||
|
VCC -| 7 22|- GND
|
||||||
|
GND -| 8 21|- AREF
|
||||||
|
(PCINT6/XTAL1/TOSC1) PB6 -| 9 20|- AVCC
|
||||||
|
(PCINT7/XTAL2/TOSC2) PB7 -|10 19|- PB5 (SCK/PCINT5)
|
||||||
|
(PCINT21/OC0B/T1) PD5 -|11 18|- PB4 (MISO/PCINT4)
|
||||||
|
(PCINT22/OC0A/AIN0) PD6 -|12 17|- PB3 (MOSI/OC2A/PCINT3)
|
||||||
|
(PCINT23/AIN1) PD7 -|13 16|- PB2 (SS/OC1B/PCINT2)
|
||||||
|
(PCINT0/CLK0/ICP1) PB0 -|14 15|- PB1 (OC1A/PCINT1)
|
||||||
|
----------
|
||||||
|
|
||||||
|
Pin 1 - PC6 - Reset Pin 28 - PC5 - SCL Display
|
||||||
|
Pin 2 - PD0 - RxD Pin 27 - PC4 - SDA Display
|
||||||
|
Pin 3 - PD1 - TxD Pin 26 - PC3 - LED Key
|
||||||
|
Pin 4 - PD2 - Left Paddle Pin 25 - PC2 - TRX 2 Out
|
||||||
|
Pin 5 - PD3 - Right Paddle Pin 24 - PC1 - TRX 1 Out
|
||||||
|
Pin 6 - PD4 - Straight Key Pin 23 - PC0 - Mem 4
|
||||||
|
Pin 19 - PB5 - Mem 5
|
||||||
|
Pin 11 - PD5 - Mem 1 Pin 18 - PB4 - _Audio SD
|
||||||
|
Pin 12 - PD6 - Mem 2 Pin 17 - OC2A - Audio PWM output
|
||||||
|
Pin 13 - PD7 - Mem 3 Pin 16 - PB2 - Encoder Switch
|
||||||
|
Pin 14 - PB0 - Encoder A Pin 15 - PB1 - Encoder B
|
||||||
|
|
||||||
|
Value 1 2 4 8 32 64 128 255
|
||||||
|
Bit 1 2 3 4 5 6 7 8
|
||||||
|
Pin 0 1 2 3 4 5 6 7
|
||||||
|
@endverbatim
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bj-keyer.h"
|
||||||
|
// Additional files
|
||||||
|
#include "functions.c"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialsieren der Timer
|
||||||
|
*
|
||||||
|
* Alle Parameter der Timer basieren auf 16MHz Systemtakt.
|
||||||
|
*
|
||||||
|
* Timer 0 - 8 Bit timer für 1ms
|
||||||
|
* Timer 2 - 8 Bit timer für PWM zur Erzeugung des Sinustons
|
||||||
|
* Timer 1A - 16 Bit timer für CW Elemente und Pausen
|
||||||
|
* Timer 1B - 16 Bit timer nicht benutzt
|
||||||
|
*
|
||||||
|
* T - dot duration
|
||||||
|
* wpm - Words per Minute based on PARIS
|
||||||
|
*
|
||||||
|
* Formula T = 1200 / wpm
|
||||||
|
*
|
||||||
|
* Minimum speed 10 wpm - dot duration 120ms
|
||||||
|
* Maximum speed 99 wpm - dot duration 12ms
|
||||||
|
*
|
||||||
|
* Timer 0 with 1ms interrupt
|
||||||
|
* Timer 1A with 64µs interrupt
|
||||||
|
* Timer 2B with 20ms interrupt
|
||||||
|
* Timer 2 is used to generate a sine wave with PWM.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void InitTimer(void)
|
||||||
|
{
|
||||||
|
cli();
|
||||||
|
// Timer 2
|
||||||
|
// prescaler to 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<<PB0) | (1<<PB1) | (1<<PB2) | 1<<(PB4) | (1<<PB5); // Pullup enabled
|
||||||
|
DDRB = (1<<PB3); // PB1, PB3 Output
|
||||||
|
|
||||||
|
// PORTD
|
||||||
|
DDRD = 0x00;
|
||||||
|
DDRD = (1<<PD0) | (1<<PD1) | (1<<PD6) | (1<<PD7); // PD7 Output LED Morsecode, PD6 Output LED_RES
|
||||||
|
PORTD |= (1<<PD6) | (1<<PD7); // Alle LED aus
|
||||||
|
|
||||||
|
// PD4,PD5 paddle input
|
||||||
|
// switch of internal pullups
|
||||||
|
cbi(PORTD,PD4);
|
||||||
|
cbi(PORTD,PD5);
|
||||||
|
t_element_length = (uint16_t)1200/bConfig.wpm;
|
||||||
|
InitTimer();
|
||||||
|
|
||||||
|
EncoderInit();
|
||||||
|
|
||||||
|
// Initialisierung Menüvariablen
|
||||||
|
bMenuCtrl.ClrScr = 1;
|
||||||
|
bMenuCtrl.Update = 1;
|
||||||
|
bMenuCtrl.Config = 0;
|
||||||
|
bMenuCtrl.buttonPressed = 0;
|
||||||
|
bMenuCtrl.WriteEEProm = 0;
|
||||||
|
bMenuCtrl.buttonPressedLong = 0;
|
||||||
|
// Initialisierung Konfiguration
|
||||||
|
bConfig.iambic = 1;
|
||||||
|
bConfig.sidetone_f = 650;
|
||||||
|
bConfig.sidetone = 1;
|
||||||
|
bConfig.trx = 0;
|
||||||
|
bConfig.weight = 50;
|
||||||
|
bConfig.wpmbpm = 1;
|
||||||
|
bConfig.wpm = 15;
|
||||||
|
bConfig.ratio = 30;
|
||||||
|
bConfig.reverse = 0;
|
||||||
|
sei(); // enable all interrupts
|
||||||
|
}
|
||||||
|
/** \brief 16 Bit Timer 1A
|
||||||
|
*
|
||||||
|
* Timer 1A interrupt
|
||||||
|
* Overflow interrupt every 64µs
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
ISR(TIMER1_OVF_vect)
|
||||||
|
{
|
||||||
|
//sCurrentTimer += 0xffff;
|
||||||
|
PORTD ^= (1<<PD1);
|
||||||
|
}
|
||||||
|
/** \brief 8 Bit Timer 0
|
||||||
|
*
|
||||||
|
* The Timer 0 CTC interrupt
|
||||||
|
* Dieser Interrupt wird alle 1ms erzeugt
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
ISR(TIMER0_COMPA_vect)
|
||||||
|
{
|
||||||
|
ms++;
|
||||||
|
StoreEEprom++;
|
||||||
|
MenuCtrlTimer++;
|
||||||
|
|
||||||
|
mselement++; // element length of dit or dat
|
||||||
|
|
||||||
|
t_wait++;
|
||||||
|
l_timer++;
|
||||||
|
encoder_timer++;
|
||||||
|
|
||||||
|
if(l_timer >= 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)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,674 @@
|
|||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
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.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
<program> Copyright (C) <year> <name of author>
|
||||||
|
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
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
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
|
||||||
|
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
@ -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
|
||||||
|
};
|
@ -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 <avr/pgmspace.h>
|
||||||
|
|
||||||
|
extern const char ssd1306oled_font[][6] PROGMEM;
|
||||||
|
extern const char special_char[][2] PROGMEM;
|
||||||
|
|
||||||
|
#endif
|
@ -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<<TWINT)|(1<<TWEN)|(1<<TWEA);
|
||||||
|
uint16_t timeout = F_CPU/F_I2C*2.0;
|
||||||
|
while((TWCR & (1 << TWINT)) == 0 &&
|
||||||
|
timeout !=0){
|
||||||
|
timeout--;
|
||||||
|
if(timeout == 0){
|
||||||
|
I2C_ErrorCode |= (1 << I2C_READACK);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return TWDR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************
|
||||||
|
Public Function: i2c_readNAck
|
||||||
|
|
||||||
|
Purpose: read non-acknowledge from TWI/I2C Interface
|
||||||
|
|
||||||
|
Input Parameter: none
|
||||||
|
|
||||||
|
Return Value: uint8_t
|
||||||
|
- TWDR: recieved value at TWI/I2C-Interface
|
||||||
|
- 0: Error at read
|
||||||
|
**********************************************/
|
||||||
|
uint8_t i2c_readNAck(void){
|
||||||
|
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_READNACK);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return TWDR;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#error "Micorcontroller not supported now!"
|
||||||
|
#endif
|
@ -0,0 +1,48 @@
|
|||||||
|
//
|
||||||
|
// i2c.h
|
||||||
|
// i2c
|
||||||
|
//
|
||||||
|
// Created by Michael Köhler on 09.10.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef i2c_h
|
||||||
|
#define i2c_h
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define F_CPU 16000000
|
||||||
|
|
||||||
|
/* TODO: setup i2c/twi */
|
||||||
|
#define F_I2C 400000UL// clock i2c
|
||||||
|
#define PSC_I2C 1 // prescaler i2c
|
||||||
|
#define SET_TWBR (F_CPU/F_I2C-16UL)/(PSC_I2C*2UL)
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <avr/io.h>
|
||||||
|
|
||||||
|
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 */
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* 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 <string.h>
|
||||||
|
|
||||||
|
#if defined SPI
|
||||||
|
#include <util/delay.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
uint8_t x;
|
||||||
|
uint8_t y;
|
||||||
|
} cursorPosition;
|
||||||
|
|
||||||
|
static uint8_t charMode = NORMALSIZE;
|
||||||
|
#if defined GRAPHICMODE
|
||||||
|
#include <stdlib.h>
|
||||||
|
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<size; i++) {
|
||||||
|
i2c_byte(cmd[i]);
|
||||||
|
}
|
||||||
|
i2c_stop();
|
||||||
|
#elif defined SPI
|
||||||
|
LCD_PORT &= ~(1 << CS_PIN);
|
||||||
|
LCD_PORT &= ~(1 << DC_PIN);
|
||||||
|
for (uint8_t i=0; i<size; i++) {
|
||||||
|
SPDR = cmd[i];
|
||||||
|
while(!(SPSR & (1<<SPIF)));
|
||||||
|
}
|
||||||
|
LCD_PORT |= (1 << CS_PIN);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
void lcd_data(uint8_t data[], uint16_t size) {
|
||||||
|
#if defined I2C
|
||||||
|
i2c_start((LCD_I2C_ADR << 1) | 0);
|
||||||
|
i2c_byte(0x40); // 0x00 for command, 0x40 for data
|
||||||
|
for (uint16_t i = 0; i<size; i++) {
|
||||||
|
i2c_byte(data[i]);
|
||||||
|
}
|
||||||
|
i2c_stop();
|
||||||
|
#elif defined SPI
|
||||||
|
LCD_PORT &= ~(1 << CS_PIN);
|
||||||
|
LCD_PORT |= (1 << DC_PIN);
|
||||||
|
for (uint16_t i = 0; i<size; i++) {
|
||||||
|
SPDR = data[i];
|
||||||
|
while(!(SPSR & (1<<SPIF)));
|
||||||
|
}
|
||||||
|
LCD_PORT |= (1 << CS_PIN);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#pragma mark -
|
||||||
|
#pragma mark GENERAL FUNCTIONS
|
||||||
|
void lcd_init(uint8_t dispAttr){
|
||||||
|
#if defined I2C
|
||||||
|
i2c_init();
|
||||||
|
#elif defined SPI
|
||||||
|
DDRB |= (1 << PB2)|(1 << PB3)|(1 << PB5);
|
||||||
|
SPCR = (1 << SPE)|(1<<MSTR)|(1<<SPR0);
|
||||||
|
LCD_DDR |= (1 << CS_PIN)|(1 << DC_PIN)|(1 << RES_PIN);
|
||||||
|
LCD_PORT |= (1 << CS_PIN)|(1 << DC_PIN)|(1 << RES_PIN);
|
||||||
|
LCD_PORT &= ~(1 << RES_PIN);
|
||||||
|
_delay_ms(10);
|
||||||
|
LCD_PORT |= (1 << RES_PIN);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uint8_t commandSequence[sizeof(init_sequence)+1];
|
||||||
|
for (uint8_t i = 0; i < sizeof (init_sequence); i++) {
|
||||||
|
commandSequence[i] = (pgm_read_byte(&init_sequence[i]));
|
||||||
|
}
|
||||||
|
commandSequence[sizeof(init_sequence)]=(dispAttr);
|
||||||
|
lcd_command(commandSequence, sizeof(commandSequence));
|
||||||
|
lcd_clrscr();
|
||||||
|
}
|
||||||
|
void lcd_gotoxy(uint8_t x, uint8_t y){
|
||||||
|
x = x * sizeof(FONT[0]);
|
||||||
|
lcd_goto_xpix_y(x,y);
|
||||||
|
}
|
||||||
|
void lcd_goto_xpix_y(uint8_t x, uint8_t y){
|
||||||
|
if( x > (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<x2 ? 1 : -1;
|
||||||
|
int dy = -abs(y2-y1), sy = y1<y2 ? 1 : -1;
|
||||||
|
int err = dx+dy, e2; /* error value e_xy */
|
||||||
|
|
||||||
|
while(1){
|
||||||
|
result = lcd_drawPixel(x1, y1, color);
|
||||||
|
if (x1==x2 && y1==y2) break;
|
||||||
|
e2 = 2*err;
|
||||||
|
if (e2 > 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<y) {
|
||||||
|
if (f >= 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
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* 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 <inttypes.h>
|
||||||
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
/* 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 */
|
@ -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;
|
||||||
|
}
|
@ -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.
|
||||||
|
|
||||||
|
<img src="https://github.com/Sylaina/oled-display/blob/master/oled.jpg?raw=true" width="500">
|
||||||
|
|
||||||
|
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:
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Modul</th>
|
||||||
|
<th>Flash</th>
|
||||||
|
<th>Static RAM</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>I2C-Core</td>
|
||||||
|
<td>220 Bytes</td>
|
||||||
|
<td>0 Bytes</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>FONT</td>
|
||||||
|
<td>644 Bytes</td>
|
||||||
|
<td>0 Bytes</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>OLED (Text-Mode)</td>
|
||||||
|
<td>1395 Bytes</td>
|
||||||
|
<td>3 Bytes</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>OLED (Graphic-Mode)</td>
|
||||||
|
<td>2541 Bytes</td>
|
||||||
|
<td>1027 Bytes</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Speed (print 20 charaters (1 line) in normal size to display):
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>Mode</th>
|
||||||
|
<th>Time</th>
|
||||||
|
<th>I2C-Speed</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>OLED (Text-Mode)</td>
|
||||||
|
<td>4.411 ms</td>
|
||||||
|
<td>400 kHz</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>OLED (Text-Mode)</td>
|
||||||
|
<td>15.384 ms</td>
|
||||||
|
<td>100 kHz</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>OLED (Graphic-Mode)</td>
|
||||||
|
<td>26.603 ms</td>
|
||||||
|
<td>400 kHz</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>OLED (Graphic-Mode)</td>
|
||||||
|
<td>96.294 ms</td>
|
||||||
|
<td>100 kHz</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
<img src="https://github.com/Sylaina/oled-display/blob/master/bigchars.JPG?raw=true" width="500">
|
Loading…
Reference in New Issue