Thomas Mell: XML-Profis hierher ;-))

Hallo,
nur eine ganz einfache Frage:
(Wann) darf die System-ID in der Documententypdeklaration fehlen?
Alle meine XML-Editoren meckern z.B. bei '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">' die fehlende System-ID an.
Nun habe ich die W3C-Specs mehrmals durchgelesen und komme immer wieder zu dem Schluss das die System-ID optional ist.
Unter http://edition-w3c.de/TR/2000/REC-xml-20001006/#NT-doctypedecl steht >>>Beachten Sie, dass es möglich ist, ein wohlgeformtes Dokument mit einer doctypedecl zu schreiben, das weder auf eine externe Teilmenge verweist, nocht eine interne Teilmenge enthält.<<<
Das gleiche "sagen" auch die dort stehenden RegExp ((S ExternalID)?).
Weiter oben steht noch zusätzlich >>>>Die Dokumenttyp-Deklaration kann entweder auf eine externe Teilmenge (eine besondere Art eines externen Entity) verweisen, die Markup-Deklarationen enthält, oder sie kann Markup-Deklarationen direkt in einer internen Teilmenge enthalten oder beides.<<<<
Zu beachten ist das zweimalige Vorkommen von "kann" (nicht "muss").
Was ist nun richtig? Ich benötig diese Info für Validome da dort momentan eine Warnung angezeigt wird; währe eine Fehlermeldung richtiger (oder überhaupt keine Meldung da erlaubt) und es Geister gibt die uns diesbezüglich Fehlverhalten vorwerfen?

Viele Grüße
Thomas Mell

  1. Hi,

    (Wann) darf die System-ID in der Documententypdeklaration fehlen?

    Immer ;-)

    Alle meine XML-Editoren meckern z.B. bei '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">' die fehlende System-ID an.

    Versuchen diese XML-Editoren eine Validierung?

    Nun habe ich die W3C-Specs mehrmals durchgelesen und komme immer wieder zu dem Schluss das die System-ID optional ist.

    Seh ich auch so.

    Das gleiche "sagen" auch die dort stehenden RegExp ((S ExternalID)?).

    Das sind keine Regexe ...

    Was ist nun richtig? Ich benötig diese Info für Validome da dort momentan eine Warnung angezeigt wird;

    Wenn die DTD nicht direkt angegeben ist oder per URL, dann setzt eine Validierung voraus, daß der Validator aus einer anderen Quelle erfährt, wie die zugehörige DTD aussieht (bei weitverbreiteten DTD wie den [X]HTML-Varianten ist es oft so, daß die Validatoren die DTDs "im Bauch" dabeihaben).
    Bei einer "selbsterfundenen" XML-DTD ist das eher nicht der Fall.

    währe eine Fehlermeldung richtiger

    "Ewig w_äh_rt am längsten" w_ä_re richtig ;-)

    Eine Fehlermeldung bei fehlender DTD (also weder intern noch Referenz auf extern) ist m.E. falsch, da XML das ja eindeutig als optional ansieht.

    Wenn dem Validator aber die passende DTD nicht anderweitig bekannt ist, kann eben keine Validierung vorgenommen werden, sondern nur eine Prüfung auf Wohlgeformtheit.

    (oder überhaupt keine Meldung da erlaubt) und es Geister gibt die uns diesbezüglich Fehlverhalten vorwerfen?

    Naja, kann halt lästig sein (so wie die CSS-Validator-Warnungen bzgl. Vorder- und Hintergrundfarbe ...)

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hi,

      Wenn dem Validator aber die passende DTD nicht anderweitig bekannt ist, kann eben keine Validierung vorgenommen werden, sondern nur eine Prüfung auf Wohlgeformtheit.

      Nachtrag: anstelle einer DTD kann ja auch ein Schema festlegen, welche Elemente/Attribute wo benutzt werden dürfen ...

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. Hallo Thomas,

    Ich zitiere  mal aus der XML-Recommendation:
    [28]    doctypedecl    ::=    '<!DOCTYPE' S Name (S ExternalID)? S? ('[' intSubset ']' S?)? '>'
    [75]    ExternalID    ::=    'SYSTEM' S SystemLiteral
       | 'PUBLIC' S PubidLiteral S SystemLiteral

    Wie man sieht, ist es möglich, keinerlei DTD anzugeben. Wenn man aber PUBLIC verwendet, muss man ein PubidLiteral _und_ ein SysteLiteral angeben.
    Wenn man eine externe DTD angibt, muss also klar sein, wo diese zu finden ist. Die Pubid soll lediglich ermöglichen, dass der Client die zu verwendende DTD erkennt, ohne sie mindestens einmal vom angegebenen Ort abgerufen zu haben.

    Grüße

    Daniel

  3. Hallo,

    Unter http://edition-w3c.de/TR/2000/REC-xml-20001006/#NT-doctypedecl steht >>>Beachten Sie, dass es möglich ist, ein wohlgeformtes Dokument mit einer doctypedecl zu schreiben, das weder auf eine externe Teilmenge verweist, nocht eine interne Teilmenge enthält.<<<
    Das gleiche "sagen" auch die dort stehenden RegExp ((S ExternalID)?).

    Du meinst die EBNF-Grammatik.

    Im genannten Dokument steht doch eindeutig:

    doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' (markupdecl | DeclSep)* ']' S?)? '>'

    S steht fuer mind. ein Whitespace-Zeichen, definiert durch (#x20 | #x9 | #xD | #xA)+

    ? steht fuer optional, also 0|1 und das betrifft sowohl die ExternalID als auch das interne Subset fuer eine DTD-Erweiterung.

    * kennzeichnet die Moeglichkeit von 0 bis n Deklarationen im internen Subset oder Parameter-Entitys (%...;), sofern vorhanden.

    S? sagt wiederum aus, dass an der genannten Stelle Whitespace sein kann.

    MfG, Thomas

    1. [Nachtrag:]

      ? steht fuer optional, also 0|1 und das betrifft sowohl die ExternalID als auch das interne Subset fuer eine DTD-Erweiterung.

      Der Hinweis von Daniel auf [75] macht es dann noch klarer, also zwingend PublicID und SystemID, wenn PUBLIC verwendet wird.

      MfG, Thomas

  4. Hallo Thomas,

    nur eine ganz einfache Frage:
    (Wann) darf die System-ID in der Documententypdeklaration fehlen?

    Wenn sie überhapt als gesamtest fehlt.

    Alle meine XML-Editoren meckern z.B. bei '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">' die fehlende System-ID an.

    Das sie meckern ist korrekt. [1]

    Nun habe ich die W3C-Specs mehrmals durchgelesen und komme immer wieder zu dem Schluss das die System-ID optional ist.
    Unter http://edition-w3c.de/TR/2000/REC-xml-20001006/#NT-doctypedecl steht >>>Beachten Sie, dass es möglich ist, ein wohlgeformtes Dokument mit einer doctypedecl zu schreiben, das weder auf eine externe Teilmenge verweist, nocht eine interne Teilmenge enthält.<<<

    _wohlgeformtes_ nicht valides.

    Weiter oben steht noch zusätzlich >>>>Die Dokumenttyp-Deklaration kann entweder auf eine externe Teilmenge (eine besondere Art eines externen Entity) verweisen, die Markup-Deklarationen enthält, oder sie kann Markup-Deklarationen direkt in einer internen Teilmenge enthalten oder beides.<<<<
    Zu beachten ist das zweimalige Vorkommen von "kann" (nicht "muss").

    Hat überhaupt nichts damit zu tun.

    Was ist nun richtig? Ich benötig diese Info für Validome da dort momentan eine Warnung angezeigt wird; währe eine Fehlermeldung richtiger (oder überhaupt keine Meldung da erlaubt) und es Geister gibt die uns diesbezüglich Fehlverhalten vorwerfen?

    Richtig ist:
    ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral

    [1] Es ist ein Fehler wenn bei einem XML-Dokument zwar ein Public-Identifier aber kein System-Identifier angegeben ist.

    Die Fehlermeldung des Validoms sollte dem Rechnung tragen.

    Grüße
    Thomas

    1. Hi Thomas,

      Richtig ist:
      ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral

      Das ist mir schon klar, jedoch ist der Ausdruck "ExternalID" optional. Demnach ist es doch Wurst ob dieser gültig ist:
      ('SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral)?
      Könnte sich doch auch wie (false)? verhalten und demnach wahr sein.
      Zumindest wäre das so wenn das „?“ in der EBNF-Grammatik die gleiche Bedeutung besitzt wie Thomas Meinike im Posting < http://forum.de.selfhtml.org/?t=119334&m=765381> geschrieben hat.
      Ein paar Beispiele:
      $REG = "/((SYSTEM 'foo')|(PUBLIC 'foo' 'foo'))?/";

      echo preg_match($REG, "");
      echo preg_match($REG, "blabla");
      echo preg_match($REG, "SYSTEM");
      echo preg_match($REG, "SYSTEM 'foo'");
      echo preg_match($REG, "PUBLIC");
      echo preg_match($REG, "PUBLIC 'foo'");
      echo preg_match($REG, "PUBLIC 'foo' 'foo'");

      Ergebnis -> alle Ausdrücke sind “wahr”.

      Es ist durchaus einleuchtend das die SystemID bei vorhandener PublicID vorhanden sein muss, ich möchte mich nur vergewissern das dies auch _wirklich_ so spezifiziert ist. Die EBNF-Grammatik gibt diese Klarheit jedenfalls nicht. Ich habe diesbezügliche auch keine weiteren Hinweise in der Spec gefunden, habe ich da etwas übersehen oder hat mich die Logik verlassen?

      Viele Grüße
      Thomas Mell

      1. Noch etwas:
        hat das "::=" eine besondere Bedeutung in der EBNF-Grammatik ? Das würde dann evt. Sinn machen...

      2. Hallo Thomas,

        ? heißt einfach, dass dieser Teil weggelassen werden kann. Es bedeutet nicht, dass er irgend eine Form haben kann.
        Die EBNF beschreibt auch kein Muster, das irgendwie als Teilstring gesucht wird oder was auch immer Du da mit Deinen regulären Ausdrücken sagen willst.

        Diese Regel tritt ja auch in einem Kontext auf.
        Bsp: s ::= a(xyz)?b würde eben bedeuten, dass xyz zwischen a stehen kann oder nicht. Wenn s das Wurzelsymbol ist, dann beschreibt diese EBNF eben nur eine Sprache die die Wörter axyzb und ab enthält.

        Grüße

        Daniel

      3. Hallo,

        Richtig ist:
        ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral

        Das ist mir schon klar, jedoch ist der Ausdruck "ExternalID" optional. Demnach ist es doch Wurst ob dieser gültig ist:
        ('SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral)?
        Könnte sich doch auch wie (false)? verhalten und demnach wahr sein.

        Ja, kann es auch (du hast selbst den Teil in der REc. verlink, wo das gesagt wird, aber das produziert nur wohlgeformte Dokumente).

        Was aber nicht sein kann ist ein Public-Identifier ohne System-Identifier. Darum geht es ja in deiner Frage:
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN">'
                               ^^^^^^^ Public-Identifier ^^^^^^

        Zumindest wäre das so wenn das „?“ in der EBNF-Grammatik die gleiche Bedeutung besitzt wie Thomas Meinike im Posting https://forum.selfhtml.org/?t=119334&m=765381 geschrieben hat.

        Fragezeichen heisst einfach "optional".

        Ein paar Beispiele:
        $REG = "/((SYSTEM 'foo')|(PUBLIC 'foo' 'foo'))?/";

        echo preg_match($REG, "");

        1. echo preg_match($REG, "blabla"); <-- muss eine Fehlermeldung zurückgeben.
        2. echo preg_match($REG, "SYSTEM"); <-- muss eine Fehlermeldung zurückgeben.

        echo preg_match($REG, "SYSTEM 'foo'");

        1. echo preg_match($REG, "PUBLIC"); <-- muss eine Fehlermeldung zurückgeben.
        2. echo preg_match($REG, "PUBLIC 'foo'"); <-- muss eine Fehlermeldung zurückgeben.

        echo preg_match($REG, "PUBLIC 'foo' 'foo'");

        Ergebnis -> alle Ausdrücke sind “wahr”.

        Das muss du mir aber erklären: 1,2, 3 und 4 entsprechen definitiv nicht den Regeln.

        Es ist durchaus einleuchtend das die SystemID bei vorhandener PublicID vorhanden sein muss, ich möchte mich nur vergewissern das dies auch _wirklich_ so spezifiziert ist.

        Es ist so spezifiziert. Es wird ja nun wirklich eindeutig vorgeschrieben:
        "'PUBLIC' S PubidLiteral S SystemLiteral".
        Es ligt an mir, aber ich verstehen nicht, was du daran nicht verstehst.

        »»Die EBNF-Grammatik gibt diese Klarheit jedenfalls nicht. Ich habe diesbezügliche auch keine weiteren Hinweise in der Spec gefunden, habe ich da etwas übersehen oder hat mich die Logik verlassen?

        OK, ich kapituliere :)
        Was heisst es dass die EBFN keine klarheit gitb?
        Eindeutiger kann das ja nicht sein:

        ExternalID  ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral

        Die Regel dazu:
        -----------------
        symbol := alternative1 | alternative2 ...
        A production rule simply states that the symbol on the left-hand side of the := must be replaced by one of the alternatives on the right hand side.

        The alternatives are separated by |s. (One variation on this is to use ::= instead of :=, but the meaning is the same.)
        Alternatives usually consist of both symbols and something called terminals. Terminals are simply pieces of the final string that are not symbols.
        -----------------

        Terminals sind in diesem Fall 'SYSTEM' und 'PUBLIC'.

        doctypedecl  ::= '<!DOCTYPE' S Name  (S ExternalID)?
        ^^^^^^^^^^^^     ^^^^^^^^^^^          ^^^^^^^^^^^^^^
        symbol              terminal           (symbol gruppe) - optional.

        Wenn es vorhanden ist, müssen die Regel für diese Symbole erfüllt sein.

        '?', '*' und '+' haben in EBFN dieselbe Bedeutung wie in (SGML) DTDs.
        ? = 0 oder 1
        * = 0 oder n

        • = 1 oder n

        Grüße
        Thomas

        1. Habe was dazu gefunden:

          http://skew.org/xml/tutorial/#3

          Grüße
          Thomas

        2. Hep,

          Ja, kann es auch (du hast selbst den Teil in der REc. verlink, wo das gesagt wird, aber das produziert nur wohlgeformte Dokumente).

          Wo steht das dies wohlgeformt und mit SystemID valide ist?

          Fragezeichen heisst einfach "optional".

          Eben, das ist der Knackpunkt.

          Ein paar Beispiele:
          $REG = "/((SYSTEM 'foo')|(PUBLIC 'foo' 'foo'))?/";

          echo preg_match($REG, "");

          1. echo preg_match($REG, "blabla"); <-- muss eine Fehlermeldung zurückgeben.
          2. echo preg_match($REG, "SYSTEM"); <-- muss eine Fehlermeldung zurückgeben.

          echo preg_match($REG, "SYSTEM 'foo'");

          1. echo preg_match($REG, "PUBLIC"); <-- muss eine Fehlermeldung zurückgeben.
          2. echo preg_match($REG, "PUBLIC 'foo'"); <-- muss eine Fehlermeldung zurückgeben.

          echo preg_match($REG, "PUBLIC 'foo' 'foo'");

          Ergebnis -> alle Ausdrücke sind “wahr”.

          Das muss du mir aber erklären: 1,2, 3 und 4 entsprechen definitiv nicht den Regeln.

          Richtig, ich wollte damit demonstrieren das man jeden Blödsinn schreiben kann und der Ausdruck IMMER wahr ist.

          Es ligt an mir, aber ich verstehen nicht, was du daran nicht verstehst.

          *Seufz*, neuer Versuch:
          "'PUBLIC' S PubidLiteral S SystemLiteral" ODER "'SYSTEM' S SystemLiteral" ist gültig, ok?!
          Da aber beides optional ist (eben wegen dem ? außen herum):
          ('PUBLIC' S PubidLiteral S SystemLiteral ODER 'SYSTEM' S SystemLiteral)?
          spielt es überhaupt keine Rolle ob einer der beiden Ausdrücke innerhalb der Klammer gültig ist; und eben das habe ich demonstriert.

          symbol := alternative1 | alternative2 ...

          Genau, aber es lautet weiterhin (symbol)?, demnach ist egal was „symbol“ ergibt, d.h. ob alternative1 oder alternative2 überhaupt vorhanden ist, oder schlichten Blödsinn darstellen.
          Wenn alternative1 ODER alternative2 „blabla“ lauten (s.o.) ist zwar „symbol“ ungültig aber wegen dem „?“ doch wieder gültig da es dann ignoriert wird (bzw. ignoriert werden muss). „fehlen“ und „falsch“ bedeutet beim „?“ das selbe und werden ignoriert (zumindest bei RegExp).

          ? = 0 oder 1

          Und 0 bedeutet in diesen Fall „falsch“ oder „fehlt“ -> also immer WAHR.

          Meiner Ansicht nach fehlt ein Ausdruck nach dem Muster:
          „Wenn einer der beiden Alternativen vorhanden ist, muss diese gültig sein. Sollte diese nicht gültig sein, ist (S ExternalID) FALSCH (und nicht optional, da es sonst wieder WAHR wird)“.

          Ich hoffe das Du mich jetzt verstanden hast und ich nicht einen bitterbösen logischen Fehler erliege ;-))

          Viele Grüße
          Thomas

          1. Hallo,

            *Seufz*, neuer Versuch:
            "'PUBLIC' S PubidLiteral S SystemLiteral" ODER "'SYSTEM' S SystemLiteral" ist gültig, ok?!
            Da aber beides optional ist (eben wegen dem ? außen herum):
            ('PUBLIC' S PubidLiteral S SystemLiteral ODER 'SYSTEM' S SystemLiteral)?
            spielt es überhaupt keine Rolle ob einer der beiden Ausdrücke innerhalb der Klammer gültig ist; und eben das habe ich demonstriert.

            Mal ganz einfach von DTD-Syntax ausgegangen:

            <!ELEMENT bla (x,y)?>

            ist nicht identisch mit

            <!ELEMENT bla (x?,y?)>

            Ersteres sagt, dass bla die optionale Folge [(...) = Gruppierung] der Kindelemente x und y haben kann, also wenn dann beide nacheinander, aber nicht eines von beiden.

            Letzteres sagt, dass nacheinander sowohl x und y als auch x oder y allein auftreten koennen, ggf. auch keines von beiden.

            In dieser Analogie sollte sich auch die Definition von ExternalID auffassen lassen.

            Hier nochmal das Beispiel zum Testen:

              
            <?xml version="1.0" encoding="ISO-8859-1"?>  
            <!DOCTYPE abc [  
              <!ELEMENT abc (bla)*>  
              <!ELEMENT bla (x,y)?>  
              <!ELEMENT x (#PCDATA)>  
              <!ELEMENT y (#PCDATA)>  
            ]>  
            <abc>  
              <bla>  
                <x>Test</x>  
                <y>Test</y>  
              </bla>  
            </abc>
            

            Validiere mal ohne x- bzw. y-Element.

            MfG, Thomas

            1. Hi Thomas,
              ok, das ist jetzt einleuchtend ;-))

              Vielen Dank
              Thomas

          2. Hallo Thomas, :)

            Ja, kann es auch (du hast selbst den Teil in der REc. verlink, wo das gesagt wird, aber das produziert nur wohlgeformte Dokumente).
            Wo steht das dies wohlgeformt und mit SystemID valide ist?

            Das steht niergendwo, vielleicht habe ich es misverständlich ausgedrück.

            http://edition-w3c.de/TR/2000/REC-xml-20001006/#NT-doctypedecl
            "Beachten Sie, dass es möglich ist, ein wohlgeformtes Dokument mit einer
            doctypedecl  zu schreiben, das weder auf eine externe Teilmenge verweist, nocht eine interne Teilmenge enthält."

            Fragezeichen heisst einfach "optional".
            Eben, das ist der Knackpunkt.
            Das muss du mir aber erklären: 1,2, 3 und 4 entsprechen definitiv nicht den Regeln.
            Richtig, ich wollte damit demonstrieren das man jeden Blödsinn schreiben kann und der Ausdruck IMMER wahr ist.

            Das kann nicht immer "WAHR" sein, dann ist der Parser falsch programmiert.

            Es ligt an mir, aber ich verstehen nicht, was du daran nicht verstehst.
            *Seufz*, neuer Versuch:
            "'PUBLIC' S PubidLiteral S SystemLiteral" ODER "'SYSTEM' S SystemLiteral" ist gültig, ok?!
            Da aber beides optional ist (eben wegen dem ? außen herum):
            ('PUBLIC' S PubidLiteral S SystemLiteral ODER 'SYSTEM' S SystemLiteral)?
            spielt es überhaupt keine Rolle ob einer der beiden Ausdrücke innerhalb der Klammer gültig ist; und eben das habe ich demonstriert.

            Natürlich spielt es eine Rolle, dass die Ausdücke innerhalb des Klammers gültig sind oder nicht. Siehe auch Thomas ausführungen in seiner Antwort.

            symbol := alternative1 | alternative2 ...
            Genau, aber es lautet weiterhin (symbol)?, demnach ist egal was „symbol“ ergibt, d.h. ob alternative1 oder alternative2 überhaupt vorhanden ist, oder schlichten Blödsinn darstellen.

            Nein, natürlich ist es nicht egal was symbol ergibt und es darf auch keinen Blödsinn darstellen, was sybol sein muss, wird in in den anderen Regeln definiert.

            Wenn alternative1 ODER alternative2 „blabla“ lauten (s.o.) ist zwar „symbol“ ungültig aber wegen dem „?“ doch wieder gültig

            Nein, ist es nicht. Ich denke du hast ein ganz anderes Verständnis von der Sache.

            »»da es dann ignoriert wird (bzw. ignoriert werden muss). „fehlen“ und „falsch“ bedeutet beim „?“ das selbe und werden ignoriert (zumindest bei RegExp).

            "fehlen" und "falsch" ist keineswegs dasselbe.
            Das sind zwei unterschiedliche Schritte in der Prüfung.

            1. fehlt | vorhanden
              falls vorhanden:
            2. richtig | falsch

            ? = 0 oder 1
            Und 0 bedeutet in diesen Fall „falsch“ oder „fehlt“ -> also immer WAHR.

            Diese Erklärung ist eher was für Politiker :) "falsch" ist "falsch".

            Meiner Ansicht nach fehlt ein Ausdruck nach dem Muster:
            „Wenn einer der beiden Alternativen vorhanden ist, muss diese gültig sein. Sollte diese nicht gültig sein, ist (S ExternalID) FALSCH (und nicht optional, da es sonst wieder WAHR wird)“.

            Aber ...  Aber genau das sagen die EBNF-Regel aus! ;-)

            Grüße
            Thomas

            1. Und noch einmal ;-)
              siehste, da habe ich doch endlich meinen Gedankenfehler gefunden, hat nur etwas länger gedauert als sonst ;-))
              echo preg_match("/X(a)?Y/", 'XaY');
              echo preg_match("/X(a)?Y/", 'XbY'); <-- ist unwahr
              echo preg_match("/X(a)?Y/", 'XY');
              Ich glaube das ich Urlaub brauche ;-)))

              Viele Grüße
              Thomas