Not logged inCSS-Forum
Forum CSS-Online Help Search Login
CSS-Shop Impressum Datenschutz
Up Topic Hauptforen / CSS-Forum / Idee für Leela-Hybriden
- - By Stefan Pohl Date 2018-07-06 14:09 Edited 2018-07-06 14:24
Idee für eine Leela-Hybrid-Engine

Leela ist ein bionisches Schachprogramm, nimmt sich also die menschliche Art Schach zu spielen zum Vorbild: Ein (emuliertes) neurales Netz lernt Schach zu spielen über das Erlernen und Erkennen von Stellungsmustern. Dies führt nun dazu, daß Leela dieselben prinzipiellen Stärken und Schwächen im Schachspiel zeigt, wie Menschen: Nämlich sehr gutes Positionsspiel auf der einen Seite, generell schwaches taktisches Spiel – gepaart mit teils schrecklichen taktischen Aussetzern auf der anderen Seite. Letzteres ist dem hohen Rechenaufwand bei der Abarbeitung des NeuralNetz-Codes zur Beurteilung der jeweiligen Stellung zuzuschreiben, welcher die Zahl der untersuchbaren Stellungen durch Leela in einer bestimmten Zeitspanne stark limitiert.
Beide Eigenschaften sind nun aber völlig konträr zu den Stärken und Schwächen von klassischen Schachengines, welche eher Schwächen im Positionsspiel zeigen, dafür aber taktisch extrem stark sind. Daher liegt es nahe, Leela und eine klassische Engine zu einem Hybriden zu verbinden und so zu versuchen, die Stärken beider zu verbinden und ihre jeweiligen Schwächen auszumerzen. Dies ist umso verlockender, als Leela den Großteil ihrer Berechnungen auf der Grafikkarte des Rechners ausführt, während die klassische Engine die Prozessorkerne zum Rechnen nutzt. Dies macht ein paralleles Arbeiten von Leela und einer klassischen Engine möglich.
Der naheliegenste Ansatz, nämlich zunächst Leela einen besten Zug errechnen zu lassen und diesen dann anschließend von der klassischen Engine auf taktische Tauglichkeit zu prüfen, ist insofern nicht besonders sinnvoll. Viel sinnvoller scheint, die Berechnungen von Leela und der klassischen Engine parallel ablaufen zu lassen, da jeweils unterschiedliche Hardwarekomponenten genutzt werden. Das Problem, das sich nun ergibt, ist natürlich, daß die klassische Engine nicht weiß, welchen Zug Leela überhaupt spielen wird, wenn beide zur selben Zeit mit den Berechnungen beginnen – nämlich sobald der Gegner seinen Zug auf dem Brett ausgeführt hat. Für dieses Problem schlage ich nun die Nutzung des Multivariantenmodus vor (im folgenden kurz MV-Modus), welcher von vielen aktuellen, klassischen Engines unterstützt wird. Unter anderem auch von Stockfish. Diese Engine würde sich meiner Meinung nach zur Nutzung in einem Leela-Hybriden anbieten, da sie sehr stark spielt (z.Zt. zweifelsfrei die weltbeste Engine) und ihr Programmcode OpenSource ist, sodaß ihr Programmcode für jedermann einsehbar und nutzbar ist. Daher gehe ich im folgenden von Stockfish als Hybridpartner von Leela aus. Generell ist aber jede andere klassische Engine, die den MV-Modus anbietet, ebenfalls nutzbar. Wie soll das Ganze nun ablaufen?
Wenn der Gegner seinen Zug ausgeführt hat, beginnen Leela und Stockfish beide zeitgleich und parallel zu rechnen, wobei Leela die GPU nutzt, sowie einen oder zwei Prozesserkerne. Die restlichen CPU-Kerne bekommt Stockfish zum Rechnen zugewiesen. Während Leela „ganz normal“ rechnet, läuft Stockfish im MV-Modus und errechnet so nicht nur einen besten Zug, sondern n beste Züge. Wobei n als UCI-Parameter für den Benutzer einstellbar gemacht werden könnte. Ich würde einen Wert von 5-10 als sinnvoll erachten, aber dies müßte man experimentell justieren und optimieren. Je mehr Varianten Stockfish berechnet, desto höher der Rechenaufwand, um eine bestimmte Suchtiefe zu erreichen, also umso geringer die taktische Qualität jeder einzelnen der n Varianten. Aber desto mehr spielerische „Freiheit“ hätte Leela für ihr planvolles, positionelles Spiel. Dazu gleich mehr.
Nun kommt noch ein weiterer Parameter ins Spiel, den man ebenfalls als UCI-Parameter für den User extern einstellbar machen könnte, nämlich ein Bewertungs-Schwellwert, den ich hier kurz ev („eval“) nenne. Je höher man ev einstellt, desto mehr spielerische „Freiheit“ hat Leela und desto seltener wird Stockfish eingreifen.
Wenn Leela mit ihren Berechnungen fertig ist (das Zeitmanagement der Hybrid-Engine liegt natürlich bei Leela) und ziehen will, wird auch die MV-Berechnung von Stockfish abgebrochen. Nun gibt es mehrere mögliche Szenarien, die eintreten können:
a) Stockfish und Leela sind sich einig, was der beste Zug ist, also ist der Zug, den Leela spielen will, auch der erste Zug in der MV-Zugliste von Stockfish. In diesem Fall wird dieser Zug natürlich auch ausgespielt.
b) Leelas favorisierter Zug ist nicht in der MV-Zugliste von Stockfish enthalten. Dann wird der von Stockfish favorisierte Zug gespielt, also der erste Zug in der MV-Zugliste von Stockfish. Leela wird also „überstimmt“.
c) Leelas favorisierter Zug ist zwar nicht der erste Zug in der MV-Zugliste von Stockfish, aber er taucht in dieser Liste weiter unten auf. In diesem Fall wird die Differenz der Bewertungen von Stockfish (Leelas Bewertungen spielen in meinem Konzept überhaupt keine Rolle!) dieser beiden Züge (in Stockfishs MV-Zugliste) gebildet und geprüft, ob diese Differenz kleiner oder gleich ev ist, oder aber höher. Ist die Differenz kleiner oder gleich ev, so wird Leelas Zug gespielt. Ist sie aber höher, so „überstimmt“ Stockfish nun Leela und es wird der von Stockfish favorisierte Zug gespielt, also der erste Zug in der MV-Zugliste von Stockfish. Da dies der komplizierteste Fall ist, hier ein Beispiel, wobei Züge und Zugnummern beliebig gewählt sind:
Leela möchte in einer Brettstellung 24.Da4 spielen. Stockfish hat mit 5 Varianten im MV-Modus gerechnet und folgendes Resultat errechnet:
1.) Eval +0.20 Line: 24.Ta5 Kf8 25.Df3 usw...
2.) Eval +0.12 Line: 24.Sc5 Ta8 25.Lf3 usw...
3.) Eval -0.40 Line: 24.Da4 Tf8 25.Sf3 usw...
4.) Eval -0.71 Line: 24.Sd4 Ta8 25.Ta3 usw...
5.) Eval -1.33 Line: 24.Lc7 Ta8 25.Ta3 usw...

Ist ev nun größer oder gleich 60 (centipawns) gesetzt, so würde Stockfish Leela „ihren Willen“ lassen und es würde 24.Da4 gespielt, da die Differenz der Evals von Zug 1 (+0.20 (= +20 centipawns)) und Leelas favorisiertem Zug 24.Da4, also Zug 3 in der MV-Variantenliste von Stockfish, (-0.40 (= -40 centipawns)) = 0.60 = 60 centipawns ist. Wäre ev nur auf z.B. 50 gesetzt, so würde Stockfish hier eingreifen und seinen favorisierten Zug, also 24.Ta5, spielen.

Es ist klar, daß Leela umso mehr „spielerische Freiheiten“ hat, je höher die Parameter n (Zahl der MV-Varianten) und ev (Bewertungsschwellwert) gesetzt werden. Gleichzeitig würde sich aber im Gegenzug auch die taktische Anfälligkeit erhöhen. Welche Werte für n und ev optimal sind, müßten natürlich umfangreiche Experimente (Clop-Tuning?) zeigen. Aus meinen Erfahrungen mit Stockfish heraus, würde ich n=7 und ev=40 ausprobieren, aber das sind nur Schätzungen. Auch die verwendete Hardware, auf der der Leela-Stockfish Hybrid läuft, würde hier sicher eine Rolle spielen.

Ich hoffe, ein erfahrener Programmierer wird meine Idee realisieren. Denn ich glaube, so könnte eine alles überragende Spielstärke auf dem Schachbrett erreicht werden!
Der Programmieraufwand sollte relativ überschaubar sein, zumindest für jemanden der mit der Nutzung der UCI-Schnittstelle Erfahrung hat und den Stockfish Programmcode gut kennt. Denn es ist ja nicht nötig, ein eigenes Schachprogramm zu schreiben. Nur eine gemeinsame Schnittstelle für Leela und Stockfish und die Steuerung derselben über die zwei UCI-Parameter n und ev wird benötigt.
Ich hatte diese Idee mal in Kurzform mit Thomas Zipproth (BrainFish) erörtert. Leider ist dieser z.Zt. sehr stark zeitlich ausgelastet und wird wohl nicht dazu kommen, mein Konzept umzusetzen.

Stefan (SPCC)
Parent - By guest171218 Date 2018-07-06 15:55
Hallo,

das geschilderte kann man bereits heute selbst durchführen.
man benötigt natürlich zeit dafür und einen pc mit einigen
cores und einer sehr guten grafikeinheit. dann startet man
die shredder classic oberfläche mehrfach und läßt wie von
ihnen beschrieben spielen. alles ohne ponder, damit das
einzelprogramm oder das 2-hirn keinen vorteil oder nachteil
hat, da man selbst rechnen und dann auch noch ziehen muß.
ich vermute es zeigt sich bereits nach 5-10 partien, daß das
2-hirn, hier also stockfish und leela, keinerlei chance haben
wird. an irgend einem beliebigen zeitpunkt wird leela, egal wie
klein der "ev" gewählt wurde, die partien regelmässig versauen.

Gruß MiKa.
Parent - - By Peter Martan Date 2018-07-06 18:03
Ja, naheliegende Idee!
Stefan Pohl schrieb:

Ich hoffe, ein erfahrener Programmierer wird meine Idee realisieren. Denn ich glaube, so könnte eine alles überragende Spielstärke auf dem Schachbrett erreicht werden!
Der Programmieraufwand sollte relativ überschaubar sein, zumindest für jemanden der mit der Nutzung der UCI-Schnittstelle Erfahrung hat und den Stockfish Programmcode gut kennt. Denn es ist ja nicht nötig, ein eigenes Schachprogramm zu schreiben. Nur eine gemeinsame Schnittstelle für Leela und Stockfish und die Steuerung derselben über die zwei UCI-Parameter n und ev wird benötigt.
Ich hatte diese Idee mal in Kurzform mit Thomas Zipproth (BrainFish) erörtert. Leider ist dieser z.Zt. sehr stark zeitlich ausgelastet und wird wohl nicht dazu kommen, mein Konzept umzusetzen.

Prinzipiell jetzt schon verwirklichbar wäre etwas ähnliches bereits mit "Nucleus" von Ferdinand Mosca:

http://talkchess.com/forum3/viewtopic.php?f=2&t=67434#p762089

Shared Hash wäre natürlich vermutlich das Optimum, aber das bräuchte wohl schon sehr viel mehr Programmieraufwand.
Parent - - By Stefan Pohl Date 2018-07-07 04:17
Peter Martan schrieb:

Ja, naheliegende Idee!
Prinzipiell jetzt schon verwirklichbar wäre etwas ähnliches bereits mit "Nucleus" von Ferdinand Mosca:

Shared Hash wäre natürlich vermutlich das Optimum, aber das bräuchte wohl schon sehr viel mehr Programmieraufwand.


Ich weiß, der Nukleus-Ansatz ist nicht unähnlich.
Shared Hash geht hier übrigens keinesfalls, da Leela ja gar keine richtigen Stellungsbewertungen hat, sondern nur Gewinnwahrscheinlichkeiten aus ihren Rollouts für bestimmte Züge ermittelt. Die in GUIs angezeigte Bewertung ist nur eine formelbasierte Umrechnung dieser Gewinnwahrscheinlichkeiten in einen centipawn-Wert.
Parent - By Peter Martan Date 2018-07-07 05:37
Ich frage mich ohnehin, wie das mit dem Hash bei Leela eigentlich funktioniert, dass das GUI nicht einfach (wie's Shredder, glaub ich, macht) die Evals heranziehen könnte zur Entscheidung, ist daher allerdings auch eher klar.

Beim Nucleus hat halt die Master- Engine dann erst, nachdem beide Slaves "gezogen" haben, eine eigene Stellungsbewertung zur Entscheidung über die zwei (wenn überhaupt verschiedenen) Stellungen einen Halbzug später abzugeben.

Das könnte auch wieder Leela sein, ich glaube nur, sie wäre als Master nicht so gut, weil sie ja die taktische Schwachstelle wäre, zumindest vorläufig, und daher die Finessen, die die Slaves eventuell errechnet hätten, taktisch erst wieder falsch bewerten würde.
Parent - - By Guenter Stertenbrink Date 2018-07-07 05:43 Edited 2018-07-07 05:51
beide greifen staendig, auf jeder Tiefe, auf die evals des anderen zu und "einigen" sich so auf die beste Variante

sf durchsucht den Baum nach abs(sf-lc0) eval-differenzen und Wichtigkeit und delegiert
diese Varianten an x% der threads

lc0 macht zusaetzliche playouts in Partien gegen sf auf y% der threads und baut sf-evals
mit ein . neue eval = a1*sf-eval + a2*lc0-eval

die Parameter werden noch dynamisch optimiert , #kloetze aufm brett, bauernstruktur,eval-volatility

------------------

oder zuerst mal, was am einfachsten aussieht, blitzzugfolgen lc0-sf und sf-lc0 mit sf-evals
(umgerechnet in WS) als zusaetzliche playouts fuer die lc0 - MCTS
Parent - - By Stefan Pohl Date 2018-07-07 09:06 Edited 2018-07-07 09:19
Viel zu kompliziert!
Wer soll das alles programmieren? Darüberhinaus ist es sehr problematisch, Evals verschiedener Engines miteinander zu vergleichen. Meine Hybrid-Lösung benutzt ausschließlich die Stockfish Evals.

Mein Verfahren hat den unschätzbaren Vorteil, daß die beiden Engines (Leela und Stockfish) als bereits compiliertes File in einen Ordner gelegt werden können und nicht umprogrammiert werden müssen. Meine Hybrid-Lösung würde diese Enginefiles dann mit der Brettstellung und dem Gegnerzug über die uci-Schnittstelle starten, fast wie eine GUI. Dadurch muß an den Engines nichts verändert werden und wenn die Engines Updates bekommen, legt man einfach die neuen Versionen in den Hybrid-Ordner. Oder man ersetzt Stockfish einfach durch eine andere Engine. Ohne jeden Aufwand. Die Engine muß nur die UCI-Schnittstelle unterstützen und den Multivariantenmodus. Nicht mal der SourceCode würde benötigt. Man könnte auch Komodo oder Houdini (tactical!) benutzen. Alles egal!
Übrigens hat die von mir skizzierte Hybridlösung zu jedem Zug, den sie ausspielt, immer die Eval von Stockfish und die Hauptvariante von Stockfish. Dadurch wäre auch pondern problemlos machbar.
Parent - By Guenter Stertenbrink Date 2018-07-07 18:50
es ist einfach im Vergleich zu dem was bereits gemacht wurde !

und ich denke effektiver, weil permanent verglichen und angepasst wird,
und nicht nur am Zug-Auswahl-Ende
Parent - - By Thorsten Czub Date 2018-07-07 09:22
Äh, ich will eigentlich gar keinen Hybriden ! ich finde es viel interessanter zu sehen wie ein neuer Ansatz
mit anderer Vorgehensweise stärker wird.
Was will ich denn mit stockfish ??
Der Clou an diesen Monte Carlo und NN Geräten ist doch gerade ihre Andersartigkeit. Und die wollt ihr nun opfern für spielstärke ?
Ne.
Will ich nicht.
Lieber beobachten wie der eine den anderen tangiert.
Parent - - By Peter Martan Date 2018-07-07 09:42 Edited 2018-07-07 09:50
Thorsten Czub schrieb:

Was will ich denn mit stockfish ??
Der Clou an diesen Monte Carlo und NN Geräten ist doch gerade ihre Andersartigkeit. Und die wollt ihr nun opfern für spielstärke ?
Ne.
Will ich nicht.

Dann darfst du die Entwicklung aber auch nicht genau so wie die aller anderen Engines ständig nur aus dem eng-eng-Match heraus beurteilen.
Hast du dazu auch einen alternativen Vorschlag?
Wird vor allem schwer, wenn du ohnehin manuell eigentlich gar nicht ihn ihren Lernprozess eingreifen darfst, und sie sich ohnehin alles nur selbst im eng-eng beibringen muss.

So wie's jetzt läuft, ist's dieselbe Sackgasse wie bei allen anderen Autotuning- Prozessen, die mit Crafty so richtig angefangen haben, mit Rybka ihre erste Hochblüte hatten, dann kam das SF- Framework und jetzt "AI". Warum sollen die neuronalen Netze "menschlicheres" Schach spielen, wenn sie auch nur eng-eng-Partien als Grundlage haben?
Weil die Netze neuronal heißen?


Wo's hakt, wie auch immer es heißt, es entfernt sich von menschlichen Vorstellungen von Schach und daher auch von menschlicher Nutzbarkeit immer weiter, je mehr du es an die Engine allein delegierst.
Die Testbücher werden auch längst nur mehr durch die Engines beurteilt (automatisch editiert oder von Menschen anhand von Engine- Evals), die passen sich also ebenso an die Engines an, wie vize versa die Engines an die Testbücher.

Wie sie Kishons Kunstfigur Jossele erfand: die Maschine, die Kartoffel anbaut, erntet, kocht, schält und aufisst.
Parent - - By Thorsten Czub Date 2018-07-07 10:02
Also wenn ich die Partien von Alpha Zero und leela etc. Sehe dann sehe ich KEIN maschinenschach.
Im Gegenteil.

Die Verbindung aus Monte Carlo mit NN fördert ein computerschach an die Oberfläche das dem
Maschinenschach eines stockfish doch sehr entgegenläuft.

Vor Jahrzehnten waren wir noch dort zu sagen wir brauchen spielstärke und keine Alternativen Methoden die menschliche
Gedanken nachbilden. Mephisto III und Mark V und andere Ideen waren unwichtig.

Diese neuen Monte Carlo und NN Ansätze sind ein solcher alternativer weg wie ihn schon Mephisto III oder ein Mark V im Ansatz verfolgt haben.
Parent - By Peter Martan Date 2018-07-07 10:50 Edited 2018-07-07 11:07 Upvotes 1
Thorsten Czub schrieb:

Diese neuen Monte Carlo und NN Ansätze sind ein solcher alternativer weg wie ihn schon Mephisto III oder ein Mark V im Ansatz verfolgt haben.

Das bildest du dir ein.

Der Grund ist einfach, dass sie auch noch so schwach sind taktisch, wie es die damaligen Schachcomputer waren, der Mensch erkennt in allem vor allem eines gerne: die eigene Schwäche, insbesondere, wenn er sie anders nennen kann.
"Positionelles Spiel, Stategie", was auch immer er für die eigene taktische Unfähigkeit lieber sagt, als zuzugeben, dass er die Pläne, die natürlich auch da sein mögen, nicht durchrechnen kann.
Ja, mach nur einen Plan, und sei ein großes Licht, und mach noch einen zweiten, geh'n tun sie beide nicht.

Für Maschinen, wie auch immer sie funktionieren, sind aber solche Ausdrücke erst recht reine Erfindungen menschlicher Vorstellungskraft, Maschinen planen nicht, sie spielen auch nicht positionell, so wie sich Menschen das vorstellen, der Fachausdruck für das alles heißt einfach Außenprojektion.

Wo sollen denn die wirklich menschlichen Züge (deren es ja schon auch wirklich gute gibt, nur erkennen die noch schwächeren menschlichen Spieler, wie wir welche sind, die ebenso wenig ohne Hilfe wie die wirklich guten der Maschinen) herkommen, wenn die Maschine immer nur mit und gegen sich selbst und  gegen andere Maschinen spielt?

Und wenn die Erfolge, die sie feiern kann, und für die sie entwicklungstechnisch mit Elo belohnt wird, nur gegen Maschinen gemessen werden, anhand von Maschinenbüchern, die ihr von Maschinen über Interfaces (z.B. GUIs) als Eröffnungen vorgesetzt werden.
Parent - - By Stefan Pohl Date 2018-07-07 11:31 Edited 2018-07-07 11:39
Thorsten Czub schrieb:

Äh, ich will eigentlich gar keinen Hybriden ! ich finde es viel interessanter zu sehen wie ein neuer Ansatz
mit anderer Vorgehensweise stärker wird.
Der Clou an diesen Monte Carlo und NN Geräten ist doch gerade ihre Andersartigkeit. Und die wollt ihr nun opfern für spielstärke ?


Wer redet denn von Opfern? Das ist doch völlig absurd. Ich will doch Leela nicht opfern, im Gegenteil. Ich finde den bionischen Ansatz von Leela sehr interessant und hoffe auf die weitere Entwicklung. Eben wegen ihrer Andersartigkeit. Und ich hoffe, die Macher bleiben bei ihrer strikten Haltung, das neurale Netz nur durch selfplay Partien lernen zu lassen und es nicht mit Mensch-Partien oder Engine-Partien klassischer AB-Engines zu verunreinigen. Nur so bleibt Leela wahrhaftig andersartig. Und spielt weiter weder klassisches Engine-Schach noch die schlechte Emulation von Menschenschach. Sondern ihr eigenes Schach. Das Schach einer KI, die sich ihr Wissen aus sich selbst heraus erarbeitet hat. Welches man schwer beschreiben oder klassifizieren kann. Sicherlich ist es aber menschlichem Schach ähnlicher, als maschinellem. Daran besteht kein Zweifel. Auch daran nicht, daß Leela ähnliche Stärken und Schwächen im Schachspiel zeigt, wie Menschen.

Das ist doch aber kein Grund, die Stärken zweier andersartiger Ansätze nicht zu kombinieren und so die jeweiligen Schwächen zu minimieren und etwas Neues, Superstarkes zu kreieren. Im Gegenteil. Was ich vorschlage ist ein "dritter Weg" zwischen beiden Extremen. Und das ist ebenfalls ein Ansatz, der andersartig ist und auch neuartig. Und mein Hybridkonzept greift ja gerade nicht in die jeweiligen Engines und ihre Art zu rechnen ein, sondern bleibt strikt außerhalb davon. Wie schon erläutert, könnten beide Engines als compilierte .exe-Files nur über die UCI-Schnittstelle genutzt werden und blieben intern völlig unangetastet. Und jeder kann Leela ja nach wie vor als standalone Engine in ihrer Reinform nutzen.
Parent - - By Lothar Jung Date 2018-07-07 12:00
Hallo Stefan,
ich finde Deinen UCI-Vorschlag sehr überzeugend,
leicht umzusetzen und sehr flexibel (für andere Engine-Konstellationen).
Glückwunsch!
Was hälst Du von einem Art „Brain“-Leela, indem auf sehr starker GPU-Hardware die Eröffnungen und das frühe Mittelspiel
tief berechnet als Buch zur Verfügung stehen.
Viele Grüße
Lothar
Parent - By Stefan Pohl Date 2018-07-07 13:56 Edited 2018-07-07 13:59
Lothar Jung schrieb:

Hallo Stefan,
ich finde Deinen UCI-Vorschlag sehr überzeugend,
leicht umzusetzen und sehr flexibel (für andere Engine-Konstellationen).
Glückwunsch!


Danke. Nur leider müßte ihn dennoch erst mal jemand programmieren, auch wenn der Aufwand halbwegs überschaubar ist...Ich bin aus diesem Programmier-Metier zu lange raus, als daß ich mich da noch mal reinfummle. Meine letzten Programme datieren noch aus der Atari ST Zeit. Also der Steinzeit.

Lothar Jung schrieb:

Was hälst Du von einem Art „Brain“-Leela, indem auf sehr starker GPU-Hardware die Eröffnungen und das frühe Mittelspiel
tief berechnet als Buch zur Verfügung stehen.
Viele Grüße
Lothar


Nicht so viel. Leela ist taktisch viel zu anfällig. Verläßlichkeit wird man so nie erzeugen, und das sollte für so ein Buch schon der Fall sein. Höchstens als Ergänzung zu den Berechnungen von Stockfish in der Cerebellum-Library könnte das evt. Sinn machen, würde ich sagen. Allerdings könnte man mein Hybrid-Konzept, so es denn jemand realisiert, dafür benutzen. Das könnte klappen.

Grüße - Stefan
Up Topic Hauptforen / CSS-Forum / Idee für Leela-Hybriden

Powered by mwForum 2.29.3 © 1999-2014 Markus Wichitill