JDownloader Community - Appwork GmbH
 

Reply
 
Thread Tools Display Modes
  #1  
Old 14.06.2019, 11:31
Tedolly Tedolly is offline
DSL User
 
Join Date: Dec 2015
Posts: 37
Default Probleme mit Proxy und Setting für Retry gesucht

Hallo,

wenn ich über FTP downloaden will, dauert es sehr lange, bis ein Download losgeht. Zuerst kommt "Starting", dann nach einer ganzen Weile "Retry in 15 minutes". Das passiert extrem oft.

Ich glaube, der FTP braucht einfach länger, um loszulegen.

Deshalb meine Fragen:
1. Kann ich irgendwo festlegen, wie lange dieses "Starting" warten soll, bis "Retry in 15 minutes" kommt?
2. Kann ich irgendwo die 15 Minuten-Zeitraum ändern?

Danke für ne Antwort.
Reply With Quote
  #2  
Old 14.06.2019, 17:11
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 63,945
Default

Bitte mal ein Log erstellen, siehe https://support.jdownloader.org/Know...d-session-logs
und dann logID hier posten. Die 15 Minuten kannst du nicht ändern, da diese immer dann kommen, wenn es zu Verbindungsprobleme kommen, die unerwartet waren
__________________
JD-Dev & Server-Admin
Reply With Quote
  #3  
Old 17.06.2019, 00:46
thecoder2012's Avatar
thecoder2012 thecoder2012 is offline
Official 9kw.eu Support
 
Join Date: Feb 2013
Location: Internet
Posts: 875
Default

Eventuell kannst den Download einfach zurücksetzen und damit die Zeit aufheben. Ggf. auch per Ereignis-Skripter (Event Scripter). Eine Log wäre natürlich hilfreicher.

Quote:
Originally Posted by Jiaz View Post
Die 15 Minuten kannst du nicht ändern, da diese immer dann kommen, wenn es zu Verbindungsprobleme kommen, die unerwartet waren
Es klingt für mich nicht nach einem tatsächlichen Verbindungsproblem sondern nach einem Verbindungs-/readtimeout weil die Gegenseite langsam ist. Sehe ich das korrekt das JDownloader nur 20-30 Sekunden wartet bei einer FTP Verbindung bis die Pause von 15 Minuten kommt?

Diese Zeile aus /AppWorkUtils/src/org/appwork/utils/net/ftpserver/FtpConnection.java sieht mir hardcodiert aus als Fallback:
Code:
this.controlSocket.setSoTimeout(20 * 1000);

Sonst habe ich aus /JDownloader/src/jd/nutils/SimpleFTP.java nur noch folgenden Abschnitt auf Anhieb gefunden:
Code:
    public int getReadTimeout(STATE state) {
        switch (state) {
        case CLOSING:
            return 10 * 1000;
        case CONNECTING:
        case CONNECTED:
        case DOWNLOADING:
        default:
            return 30 * 1000;
        }
    }
Wird wohl dann etwas weiter unten im Code gesetzt:
Code:
socket.setSoTimeout(getReadTimeout(STATE.CONNECTING));
...
socket.setSoTimeout(getReadTimeout(STATE.CONNECTED));
Dazu ist es nur FTP ohne FTPS?

Vergleichbar wohl mit InternetConnectionSettings.httpconnecttimeout und ggf. InternetConnectionSettings.httpreadtimeout aber bei FTP sehe ich diese Option nicht, auch nicht im Code so auf Anhieb. Eventuell kann man die Profieinstellung auch dafür setzen oder eine zweite für FTP machen.
__________________
Join 9kw.eu Captcha Service now and let your JD continue downloads while you sleep.

Last edited by thecoder2012; 17.06.2019 at 00:59.
Reply With Quote
  #4  
Old 17.06.2019, 16:52
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 63,945
Default

Quote:
Originally Posted by thecoder2012 View Post
Diese Zeile aus /AppWorkUtils/src/org/appwork/utils/net/ftpserver/FtpConnection.java sieht mir hardcodiert aus als Fallback:
Code:
this.controlSocket.setSoTimeout(20 * 1000);
Dies ist die Implementierung eines FTP Servers


Quote:
Originally Posted by thecoder2012 View Post
Sonst habe ich aus /JDownloader/src/jd/nutils/SimpleFTP.java nur noch folgenden Abschnitt auf Anhieb gefunden:
Code:
    public int getReadTimeout(STATE state) {
        switch (state) {
        case CLOSING:
            return 10 * 1000;
        case CONNECTING:
        case CONNECTED:
        case DOWNLOADING:
        default:
            return 30 * 1000;
        }
    }
Wird wohl dann etwas weiter unten im Code gesetzt:
Code:
socket.setSoTimeout(getReadTimeout(STATE.CONNECTING));
...
socket.setSoTimeout(getReadTimeout(STATE.CONNECTED));
Korrekte Stelle, es wird ein 30 Sekunden Timeout gesetzt. Wenn das nicht reicht, dann sollte man hier erstmal nach der Ursache suchen und nicht
einfach die Wartezeit reduzieren.


Quote:
Originally Posted by thecoder2012 View Post
Dazu ist es nur FTP ohne FTPS?
Es gab nicht wirklich Gesuch nach FTPs, daher gibts derzeit nur ein Ticket



Quote:
Originally Posted by thecoder2012 View Post
Vergleichbar wohl mit InternetConnectionSettings.httpconnecttimeout und ggf. InternetConnectionSettings.httpreadtimeout aber bei FTP sehe ich diese Option nicht, auch nicht im Code so auf Anhieb. Eventuell kann man die Profieinstellung auch dafür setzen oder eine zweite für FTP machen.
Möglich, aber ohne ein Log indem der Fehler zu sehen ist, sehe ich hierzu keine Veranlassung. Der Fehler kann ja auch ohne Timeout entstehen, zb nicht behandelter FTP Code/Status.
Oder der FTP Server macht die Verbindung zu, oder oder oder....
__________________
JD-Dev & Server-Admin
Reply With Quote
  #5  
Old 17.06.2019, 18:21
thecoder2012's Avatar
thecoder2012 thecoder2012 is offline
Official 9kw.eu Support
 
Join Date: Feb 2013
Location: Internet
Posts: 875
Default

Quote:
Originally Posted by Jiaz View Post
Dies ist die Implementierung eines FTP Servers
Oh gar nicht drauf geachtet. Hatte nur nach Socket/FTP/Timeout gesucht. Ich nehme auch einen FTP Server nicht nur FTP Clients.

Quote:
Originally Posted by Jiaz View Post
Es gab nicht wirklich Gesuch nach FTPs, daher gibts derzeit nur ein Ticket
FTPs fände ich durchaus hilfreich weil inzwischen immer weniger FTP Server noch unverschlüsselt akzeptieren. Ich denke das wird in Zukunft noch mehr werden.
__________________
Join 9kw.eu Captcha Service now and let your JD continue downloads while you sleep.
Reply With Quote
  #6  
Old 17.06.2019, 21:08
Tedolly Tedolly is offline
DSL User
 
Join Date: Dec 2015
Posts: 37
Default

Ok, hier der Log:
17.06.19 20.57.01 <--> 17.06.19 21.03.47 jdlog://6613086935451/

Ich habe den Download von Zippy 1-mal abbrechen müssen, weil es keine 15-Minuten-Reply gab, aber beim zweiten Download-Versuch waren die Probleme wie oft wieder da. Wie beschrieben hat eine ganze Weile gedauert, bis es losging und dann kam auch die "normale" 15-Minuten-warten-Meldung. Diese 15-Minuten-Warterei ist das eigentlich Nervige bei dieser Sache. Vielleicht könnt ihr Profis da was erkennen, was da mein FTP so macht.
Reply With Quote
  #7  
Old 18.06.2019, 14:10
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 63,945
Default

@Tedolly: Du scheinst entweder einen transparenten Proxy zu nutzen oder dein DNS macht/hat Probleme oder Tools auf deinem Rechner versuchen diese.
Viele DNS werden immer auf die gleiche/falsche IP
91.121.xxx.xxx geleitet was natürlich falsch ist und dann zu Fehlern fürt.
Zusätzlich nutzt du die gleiche IP als Http Proxy.

Sieht für mich aus als hättest du einen Proxy eingetragen und willst diesen zwangsweise nutzen und vergessen NO-Proxy abzuschalten. Somit gehen manche Verbindungen über Proxy und alle ohne Proxy führen zu Problemen.

Das log zeigt lediglich Fehler für JDownloader Server und Zippyshare. Keinen FTP Download.
__________________
JD-Dev & Server-Admin
Reply With Quote
  #8  
Old 18.06.2019, 14:10
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 63,945
Default

Quote:
Originally Posted by thecoder2012 View Post
FTPs fände ich durchaus hilfreich weil inzwischen immer weniger FTP Server noch unverschlüsselt akzeptieren. Ich denke das wird in Zukunft noch mehr werden.
Sollte *relativ* einfach nachzurüsten sein. Kennst du öffentliche ftps Server zum testen?
__________________
JD-Dev & Server-Admin
Reply With Quote
  #9  
Old 18.06.2019, 16:06
Tedolly Tedolly is offline
DSL User
 
Join Date: Dec 2015
Posts: 37
Default

Quote:
Originally Posted by Jiaz View Post
@Tedolly: Du scheinst entweder einen transparenten Proxy zu nutzen oder dein DNS macht/hat Probleme oder Tools auf deinem Rechner versuchen diese.
Viele DNS werden immer auf die gleiche/falsche IP
91.121.xxx.xxx geleitet was natürlich falsch ist und dann zu Fehlern fürt.
Zusätzlich nutzt du die gleiche IP als Http Proxy.

Sieht für mich aus als hättest du einen Proxy eingetragen und willst diesen zwangsweise nutzen und vergessen NO-Proxy abzuschalten. Somit gehen manche Verbindungen über Proxy und alle ohne Proxy führen zu Problemen.

Das log zeigt lediglich Fehler für JDownloader Server und Zippyshare. Keinen FTP Download.
So ganz verstehe ich Deinen Text leider nicht.

Noch ein paar Infos:
Der FTP, den ich verwende, ist als 'elite proxy' angegeben.
Die IP des FTP-Servers trage ich nur in JDown unter 'Connection Manager' ein, nicht auf Betriebssystem-Ebene.
Im 'Connection Manager' schalte ich dann den 'No Proxy' aus, damit nur dieser 1 FTP-Server ausgewählt ist.

Wo ist mein Fehler und kann ich da was anderes einstellen?
Reply With Quote
  #10  
Old 18.06.2019, 16:27
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 63,945
Default

Redest du von FTP oder von Proxy?
FTP hat NICHTS mit einem Proxy zu tun aber erklärt nun die Verwirrung. Du sprichst wohl von einem Proxy, was auch aus den Logs hervorgeht. Du trägst also den Proxy in Einstellungen-Verbindungen(Connection Manager) ein und schiebst diesen über den NOPROXY Eintrag und deaktivierst zeitgleich NOPROXY. Nun nutzt JDownloader nur noch den Proxy. Jetzt ergibt auch die Fehlermeldung Sinn Der Proxy antwortet nicht auf deine Anfragen, was zu einem Timeout führt. Wahrscheinlich (so meine Vermutung) hat der Proxy ein Verbindungslimit?
__________________
JD-Dev & Server-Admin
Reply With Quote
  #11  
Old 19.06.2019, 17:00
Tedolly Tedolly is offline
DSL User
 
Join Date: Dec 2015
Posts: 37
Default

Ok, Ok, da habe ich mich eindeutig zweideutig ausgedrückt.
Ich verwende einen fremden FTP irgendwo in der Welt als Proxy in JD, bis er nicht mehr erreichbar ist. Dazu suche ich einen FTP-Server, den ich als Proxy in JD eintrage. Dies muss ich oft machen und zwar seit dem Zippy die Downloads aus Deutschland gesperrt hat.

Was mich heute extremst erstaunt: der Effekt ist beim heutigen Download vollkommen weg. Den FTP-Proxy habe ich nicht gewechselt.

Was ich davor gemacht habe, sollte eigentlich irrelevant sein: Nach der Aufforderung hier, habe ich gestern oder so "Log: Debug Mode" eingeschaltet, JD restartet, Log erstellt und hierher gesendet, danach "Log: Debug Mode" wieder ausgeschaltet. Dann eben heute einen Zippy-Download über einen FTP-Proxy und der Effekt war auf einmal weg.

Ich verwende JD in einer VMware Workstation 10. Das Win7-System wird dabei als Snapshot geladen. Und genau deswegen gab es früher seltsame Effekte wg den Win7-Caches. Diese hatte ich mit einem speziellen Cache-Del-Tool in den Griff bekommen. Vielleicht aber hat doch noch ein Cache-Problem überlebt und wurde in den Snapshot übernommen, was wiederum JD seltsam bei dem FTP-Proxy reagieren ließ? Keine Ahnung. Großes Fragezeichen: vielleicht wurde in JD etwas zurückgesetzt, als ich "Log: Debug Mode" ein- und später wieder ausgeschaltet habe?? Keine Ahnung, ein Schuss ins Blaue. Vielleicht ist es auch nur heute eine große Ausnahmen und der FTP-Proxy ist gerade völlig unbelastet.

Result für mich: Grund ist wohl die Überlastung des gewählten FTP-Proxys.

Damit bleiben meine Wünsche:
Schön wäre es, wenn man die 15-Minuten-Wartezeit einstellen könnte. Und auch eine Einstellung, wie lange man warten muss, bis es mit einem Download losgeht, wäre prima. Siehe meinen ersten Beitrag.
Reply With Quote
  #12  
Old 19.06.2019, 17:06
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 63,945
Default

FTP ist FileTransferProtokol und ein FTP Server hat NICHTs mit einem HTTP Proxy zu tun. Rein gar nichts. Wie kommst du auf FTP-Proxy? Wahrscheinlich listet die Website diese so?

Also aus den Logs konnte ich nur erkennen das du einen HTTP-Proxy nutzt und dieser nicht immer erreichbar ist, was evtl an Verbindungslimits seitens des Proxy liegt oder sonstigen.Das mit dem *völlig unberlastet* kann hier der Grund sein, denn irgendwann macht der auch mal dicht.
__________________
JD-Dev & Server-Admin
Reply With Quote
  #13  
Old 19.06.2019, 17:08
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 63,945
Default

Quote:
Originally Posted by Tedolly View Post
Damit bleiben meine Wünsche:
Schön wäre es, wenn man die 15-Minuten-Wartezeit einstellen könnte.
An den 15 Mins wird sich vorerst nichts ändern lassen, da Änderungen hier auch ein paar Änderungen am Kern bedeuten und ich hierfür einfach keine Zeit habe. Sorry.

Quote:
Originally Posted by Tedolly View Post
Damit bleiben meine Wünsche:
Und auch eine Einstellung, wie lange man warten muss, bis es mit einem Download losgeht, wäre prima. Siehe meinen ersten Beitrag.
Das ist keine Wartezeit, sondern das ist die Zeit, welche der TCP Verbindung gegeben wird eine Verbindung aufzubauen. Diese kannst du unter
Einstellungen-Profieinstellungen-
InternetConnectionSettings.httpconnecttimeout
InternetConnectionSettings.httpreadtimeout
Aber zu kleine Werte hier können auch schnell zu Problemen führen.
__________________
JD-Dev & Server-Admin
Reply With Quote
  #14  
Old 19.06.2019, 22:25
Tedolly Tedolly is offline
DSL User
 
Join Date: Dec 2015
Posts: 37
Smile

Ok, Merci.
Vielleicht kann man meinen Wunsch auf die Irgendwann-Todo-Liste setzen, falls sowas exists.

> Aber zu kleine Werte hier können auch schnell zu Problemen führen.
Ich möchte die Zeit erhöhen, nicht verringern. Damit möchte ich dem FTP-Proxy einfach mehr Zeit geben, damit ich nicht 15 Minuten warten muss. Ich weiß natürlich, dass ich diese Wartezeit manuell abbrechen kann. Ich versuche es mal mit der von Ihnen vorgeschlagenen Einstellung.
Reply With Quote
  #15  
Old 20.06.2019, 00:46
thecoder2012's Avatar
thecoder2012 thecoder2012 is offline
Official 9kw.eu Support
 
Join Date: Feb 2013
Location: Internet
Posts: 875
Default

Bei einem Elite-Proxy (L1 Proxy) sind einfach die Variablen (HTTP_X_FORWARDED_FOR, HTTP_CLIENT_IP, X_FORWARDED_FOR, X_HTTP_FORWARDED_FOR, HTTP_VIA, HTTP_FORWARDED, HTTP_PROXY_CONNECTION) nicht gesetzt. Ein anonymer Proxy (L2 Proxy) dagegen setzt die Werte außer die Client IP. Ein transparenter Proxy (L3 Proxy) setzt dagegen alle Werte.

Quote:
Originally Posted by Jiaz View Post
Sollte *relativ* einfach nachzurüsten sein. Kennst du öffentliche ftps Server zum testen?
Spontan fällt mir nur **External links are only visible to Support Staff****External links are only visible to Support Staff** ein. Zugangsdaten stehen auf der Seite dort. Ein öffentlicher Test FTP Server der auch "FTP using implicit SSL (Auth SSL)" und "FTP using explicit SSL (Auth TLS)" unterstützt jeweils Port 21 und unverschlüsselt (SimpleFTP).

Kann sonst auch private ftps Server (z.B. Filezilla server unter Windows oder proftpd unter Linux mit ftps only) übersenden, wenn ftps only server dazu benötigt werden.

Quote:
Originally Posted by Tedolly View Post
Vielleicht kann man meinen Wunsch auf die Irgendwann-Todo-Liste setzen, falls sowas exists.
Nutz doch einfach den Ereignis-Skripter (Event Scripter) dafür.

Kleines Beispiel (ungetestet!):
Code:
// Zippyshare.com - Faster skip than 15 minutes (reason e.g. readtimeout)
// Trigger: Interval

var links = getAllDownloadLinks();
for (i = 0; i < links.length; i++) {
    var link = links[i];
    if (link.isEnabled() && link.getHost() == "zippyshare.com") {
        var reason = link.getConditionalSkipReason();
        if (reason) {
            if (reason.getWaitingSkipReason() == "FILE_TEMP_UNAVAILABLE") {
                link.setSkipped(true);
                sleep(1000);
                link.setSkipped(false);//link.reset();
            }
        }
    }
}
Zusätzlich die bereits genannten Werte InternetConnectionSettings.httpconnecttimeout bzw. InternetConnectionSettings.httpreadtimeout erhöhen.
__________________
Join 9kw.eu Captcha Service now and let your JD continue downloads while you sleep.

Last edited by thecoder2012; 12.07.2019 at 13:02.
Reply With Quote
  #16  
Old 20.06.2019, 05:55
Tedolly Tedolly is offline
DSL User
 
Join Date: Dec 2015
Posts: 37
Default

Vielen Dank für das Script, es funktioniert sehr gut.

Geändert habe ich:
Delete: && link.getHost() == "zippyshare.com"
Change: sleep(1000) // meine maschine ist extrem langsam.

Interval = 30000

Bis es lief, habe ich mir eine "ganze Weile" einen abgebrochen. Es wollte einfach nicht laufen. Als dann alles Mögliche versucht wurde, habe ich im Netz gesucht. Natürlich war zu meinem Pech gerade die Intervall-Trigger-Funktion defekt und soll in der nächsten Core-Update verbessert werden (https://board.jdownloader.org/showpo...4&postcount=28). Nach einem Update hat es dann normal funktioniert.

Was schön wäre: ein extra Event für "FILE_TEMP_UNAVAILABLE".
Reply With Quote
  #17  
Old 21.06.2019, 11:08
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 63,945
Default

Quote:
Originally Posted by Tedolly;443419Natürlich war zu meinem Pech gerade die Intervall-Trigger-Funktion defekt und soll in der nächsten Core-Update verbessert werden ([url
https://board.jdownloader.org/showpost.php?p=442964&postcount=28[/url]). Nach einem Update hat es dann normal funktioniert.
Das Update ist aber schon lange live. Das sind zb. Gründe warum wir vom deaktivieren der Updates abraten, denn gerade wenn man denkt ein Update sei nicht nötig, behebt genau dieses dann eine Funktion/Plugin welche man nutzt.

Quote:
Originally Posted by Tedolly View Post
Was schön wäre: ein extra Event für "FILE_TEMP_UNAVAILABLE".
Ein solches Event wird es nicht geben. Zum einen kann sich dieser Status von selbst ändern, wenn zb ein Multihoster/Account seinen Zustand ändert und das Herunterladen wieder möglich wird. Zum anderen macht es keinen Sinn für jeden Status/Zustand einen Event zu machen. Es bläht nur unnötig den Code auf
und macht es am Ende auch nicht wirklich einfacher. Am Ende hat man für An/Aus, Umbennen/Verschieben/Status1...Stats934234234 usw...ein Event. Und
dennoch werden sich immer wieder Nutzer finden, deren Zustand/Status noch kein Event hat.
__________________
JD-Dev & Server-Admin
Reply With Quote
  #18  
Old 21.06.2019, 11:09
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 63,945
Default

Quote:
Originally Posted by Tedolly View Post
> Aber zu kleine Werte hier können auch schnell zu Problemen führen.
Ich möchte die Zeit erhöhen, nicht verringern. Damit möchte ich dem FTP-Proxy einfach mehr Zeit geben, damit ich nicht 15 Minuten warten muss. Ich weiß natürlich, dass ich diese Wartezeit manuell abbrechen kann. Ich versuche es mal mit der von Ihnen vorgeschlagenen Einstellung.
Okay, dann haben wir uns falsch verstanden. Du willst die Zeiten *erhöhen* damit langsame/überfüllte Proxies nicht direkt als Fehler *raushüpfen* sondern mehr Zeit haben. Sorry für meine falsche Vermutung
__________________
JD-Dev & Server-Admin
Reply With Quote
  #19  
Old 21.06.2019, 11:11
Jiaz's Avatar
Jiaz Jiaz is offline
JD Manager
 
Join Date: Mar 2009
Location: Germany
Posts: 63,945
Default

Quote:
Originally Posted by thecoder2012 View Post
Kann sonst auch private ftps Server (z.B. Filezilla server unter Windows oder proftpd unter Linux mit ftps only) übersenden, wenn ftps only server dazu benötigt werden.
Wenn man FTPs einbaut dann beide Variante, also direkt FTPs(implicit) und FTP->FTPs(Explicit) upgrade
__________________
JD-Dev & Server-Admin
Reply With Quote
  #20  
Old 21.06.2019, 19:04
Tedolly Tedolly is offline
DSL User
 
Join Date: Dec 2015
Posts: 37
Default

Quote:
Originally Posted by Jiaz View Post
Ein solches Event wird es nicht geben. Zum einen kann sich dieser Status von selbst ändern, wenn zb ein Multihoster/Account seinen Zustand ändert und das Herunterladen wieder möglich wird. Zum anderen macht es keinen Sinn für jeden Status/Zustand einen Event zu machen. Es bläht nur unnötig den Code auf und macht es am Ende auch nicht wirklich einfacher.
Wie wäre es mit einem Event "Download konnte wg irgendeinem (Server-)Fehler nicht gestartet werden, aber ich versuche es weiter"? Würde das nicht helfen?
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

All times are GMT +2. The time now is 11:25.
Provided By AppWork GmbH | Privacy | Imprint
Parts of the Design are used from Kirsch designed by Andrew & Austin
Powered by vBulletin® Version 3.8.10 Beta 1
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.