TOPFIELD - Multimedia Home Gateway
Home Produkte Support Downloads Taps Forum News Presse Kontakt Händlersuche Jobs Topfield eStore

Zurück   TOPFIELD EUROPE Forum > Topfield-Modding > TF 5x00/6000 PVR TAP
Registrieren Hilfe Benutzerliste Kalender Suchen Heutige Beiträge Alle Foren als gelesen markieren

TF 5x00/6000 PVR TAP Zusatz-Programme für Receiver der 5000er und 6000er Serie. Hier geht's um alles, was mit den TAP Anwendungen für den PVR5x00/6000 zu tun hat.

Antwort
 
Themen-Optionen
Alt 23.02.2007, 20:14:49   #21
DeadBeef
TAP-Guru
 
Registriert seit: 25.12.2005
Beiträge: 392
Standard AW: FireBirdLib

Den Inhalt der Funktion Shutdown() kann man wie folgt ersetzen:

Code:
 
  CallBIOS (14, 1, 3, 0, 0);
Dann spart man sich einen Suchlauf für EventDispatcherAddress.

Im allgemeinen finde ich die Suchmethode für FW-Funktionen etwas (echt-)zeitaufwendig. Daher habe ich meistens versucht, einen Einstieg über die TAP-API-Funktionen zu finden, um dann gezielt zu den gewünschten FW-Funktionen zu gelangen. Dieser Ansatz spart jede Menge Zeit beim Starten von TAPs.

Ein Beispiel:
Code:
 
#define CMD_MASK 0xfc000000
#define JAL_CMD 0x0c000000
#define JR_CMD 0x03e00008
#define ABS_ADDR(x) (0x80000000 | (((dword)(x) & 0x03ffffff) << 2))
//-----------------------------------------------------------------------------
// getCallAddress() retrieves the address of the n-th function call found
// after the specified address.
dword *getCallAddress(dword *pData, int count)
{
  int i = 0, j = 0;
  dword *pAddr = NULL;
  if(count > 0)
  {
    while(pData[i] != JR_CMD)
    {
      if((pData[i] & CMD_MASK) == JAL_CMD)
      {
        j++;
        if(j == count)
        {
          // return the absolute address encoded in the opcode
          pAddr = (dword*)ABS_ADDR(pData[i]);
          break;
        }
      }
      i++;
    }
  }
  return pAddr;
}
 
//--------------------------------------------
// getCallBios(): This operation retrieves the address of the function
// queueing all I/O activities (BIOS).
dword getCallBios()
{
  // Find the FW function handling all BIOS operations
  // Follow the following call chain:
  //    TAP_ChannelSetSubtitleTrack -> 1st call -> 1st call -> ___1st call___
  dword *pCallBios = (dword*)TAP_Channel_SetSubtitleTrack;
 
  if((pCallBios = getCallAddress(pCallBios, 1)) == NULL)
    return 0;
  if((pCallBios = getCallAddress(pCallBios, 1)) == NULL)
    return 0;
 
  // the last call returns the requested address
  return (dword)getCallAddress(pCallBios, 1);
}
__________________
Grüße
DeadBeef

DeadBeef's TAP Collection
DeadBeef ist offline   Mit Zitat antworten
Alt 24.02.2007, 12:43:05   #22
FireBird
Suspekter verdächtiger
Zauberküchenchef,
TAP & Firmware-Guru
 
Benutzerbild von FireBird
 
Registriert seit: 09.12.2005
Ort: Wien
Receiver: SRP-2401CI+
Beiträge: 24.936
Standard AW: FireBirdLib

Danke für den Input, das Shutdown werde ich so übernehmen.

Das JAL-Verfolgen hat den großen Nachteil, dass es keine Sicherheit gegenüber Veränderungen bietet. Wenn Topfield nur einen zusätzlichen Aufruf dazunimmt, biegt man einfach falsch ab, ohne das mitzubekommen. Und dann muss man für unterschiedliche Firmwareversionen eine Lookup-Table verwenden. Meine Methode ist um einiges langsamer, dafür verwende ich auch statische Variablen, damit die Suche nur ein einziges Mal durchlaufen muss.
FireBird ist offline   Mit Zitat antworten
Alt 24.02.2007, 13:08:43   #23
DeadBeef
TAP-Guru
 
Registriert seit: 25.12.2005
Beiträge: 392
Standard AW: FireBirdLib

Zitat:
Zitat von FireBird Beitrag anzeigen
Danke für den Input, das Shutdown werde ich so übernehmen.

Das JAL-Verfolgen hat den großen Nachteil, dass es keine Sicherheit gegenüber Veränderungen bietet. Wenn Topfield nur einen zusätzlichen Aufruf dazunimmt, biegt man einfach falsch ab, ohne das mitzubekommen. Und dann muss man für unterschiedliche Firmwareversionen eine Lookup-Table verwenden. Meine Methode ist um einiges langsamer, dafür verwende ich auch statische Variablen, damit die Suche nur ein einziges Mal durchlaufen muss.
Das stimmt. Andererseits habe ich bis jetzt keine Änderungen der Aufrufketten in vielen für mich interessanten Funktionen beobachtet (März 2005 bis zu aktuellen FW-Versionen). Mann könnte auch eine hybride Suche benutzen: erst der Aufrufkette folgen und dann mit dem Fingerabdruck verifizieren.
__________________
Grüße
DeadBeef

DeadBeef's TAP Collection
DeadBeef ist offline   Mit Zitat antworten
Alt 24.02.2007, 14:15:41   #24
ibbi
Moderierter Ignorator Bitteschöööön!
 
Benutzerbild von ibbi
 
Registriert seit: 09.12.2005
Receiver: TF5000PVR und TF5000PVRt
Firmware: Sep 2005 PHTF und Oct 2005 PHTFZ
Beiträge: 6.462
Standard AW: FireBirdLib

Zitat:
Zitat von DeadBeef Beitrag anzeigen
Andererseits habe ich bis jetzt keine Änderungen der Aufrufketten in vielen für mich interessanten Funktionen beobachtet
Was überhaupt nichts heißen will und keine Interpolation in die Zukunft gestattet.
__________________
Power Restore 0.7.3c | PiP 1.2 | 1.1u | QuickTimer 1.0.2 (IB) | TF5000 Display 1.49 | dbPlay 1.2 | Auto Resume 1.30 | WSSkkB 0.9 | RecCopy 4.2 | IdleHdd 1.0 | EPPG 1.5 | WWWW 0.1b
(ScreenCapture_OSD 2.10a, A-B Repeat 1.3, Kanalarbeiter 0.9, RecRepair 0.4, SimpleCharEditor 4.0ß, ProfileEditor 1.2a, ScanDisk 1.4)
ibbi ist offline   Mit Zitat antworten
Alt 24.02.2007, 18:42:40   #25
Sigittarius-E
FIQMDTSSOOLUETSNAK
 
Benutzerbild von Sigittarius-E
 
Registriert seit: 09.12.2005
Ort: Österreich, NÖrdl.d.Donau
Receiver: TF5kPVR/TF3kCIpro
Firmware: 13.9.'05 SHUFGmUx/19.4.'04
Beiträge: 7.589
Standard AW: FireBirdLib

Zitat:
Zitat von ibbi Beitrag anzeigen
Was überhaupt nichts heißen will und keine Interpolation in die Zukunft gestattet.
ibbi, hattest du nicht mal eine Glaskugel?
__________________
Grüsse
Sigittarius-E
S-VHS ist nicht S-Video. So schreibt man: Standard, Satellit, wäre. TABs sind was für die Dritten.

TF5000PVR
HD:SP2514N
CAM:irdeto CW v3.15 ORF
Lüfter:Noiseblocker USF S1+Poti.
Verb.:Silex SX2kU2
TV:Toshiba 42"
Auto Start-Reihenf.: GMTTimerBug WA2|QT|IB Prem|StopExit|WSSKiller|JagEPG|Matrix Screensaver|PiP|DisplayTAP|wwww|reccopy|
TSBProtector v0.9.0|CheckAndCreate_EPGTimer v1.1
Manuell: SimpleCharEditor v3.09b,SetCryptFlag v0.3,exie v0.3,EBM v0.01
Sigittarius-E ist offline   Mit Zitat antworten
Alt 26.02.2007, 09:58:46   #26
ibbi
Moderierter Ignorator Bitteschöööön!
 
Benutzerbild von ibbi
 
Registriert seit: 09.12.2005
Receiver: TF5000PVR und TF5000PVRt
Firmware: Sep 2005 PHTF und Oct 2005 PHTFZ
Beiträge: 6.462
Standard AW: FireBirdLib

Zitat:
Zitat von Sigittarius-E Beitrag anzeigen
ibbi, hattest du nicht mal eine Glaskugel?
Und diese sagt mir, man soll keine Annahmen über die Zukunft anstellen.
__________________
Power Restore 0.7.3c | PiP 1.2 | 1.1u | QuickTimer 1.0.2 (IB) | TF5000 Display 1.49 | dbPlay 1.2 | Auto Resume 1.30 | WSSkkB 0.9 | RecCopy 4.2 | IdleHdd 1.0 | EPPG 1.5 | WWWW 0.1b
(ScreenCapture_OSD 2.10a, A-B Repeat 1.3, Kanalarbeiter 0.9, RecRepair 0.4, SimpleCharEditor 4.0ß, ProfileEditor 1.2a, ScanDisk 1.4)
ibbi ist offline   Mit Zitat antworten
Alt 26.02.2007, 23:12:24   #27
DeadBeef
TAP-Guru
 
Registriert seit: 25.12.2005
Beiträge: 392
Standard AW: FireBirdLib

Zitat:
Zitat von ibbi Beitrag anzeigen
Und diese sagt mir, man soll keine Annahmen über die Zukunft anstellen.
Ohne Annahmen geht es genauso wenig wie ohne Kompromisse. Um Annahmen zu überprüfen, haben wir Betatester.
__________________
Grüße
DeadBeef

DeadBeef's TAP Collection
DeadBeef ist offline   Mit Zitat antworten
Alt 03.03.2007, 12:49:10   #28
FireBird
Suspekter verdächtiger
Zauberküchenchef,
TAP & Firmware-Guru
 
Benutzerbild von FireBird
 
Registriert seit: 09.12.2005
Ort: Wien
Receiver: SRP-2401CI+
Beiträge: 24.936
Standard AW: FireBirdLib

Hi,

die Library wurde upgedatet. Neben einigen neuen Funktionen und Bugfixes besteht die wichtigste Neuerung in der Implementierung einer TAP zu TAP-Kommunikation. Dabei handelt es sich um eine erweiterte Version von asraels TAPCOM. Dank an ihn für die Bereitstellung seiner Library. Wir haben versucht, die Sache so einfach wie möglich halten. Ein HowTo gibt es in der beigepackten PDF (siehe auch Post #1). Mein Dank gilt auch meinem Qualitätsmanager ibbi und DeJe für die rege Teilnahme an der Entwicklung.

Jetzt werden nur mehr Server- und Client-TAPs benötigt. Um ein paar Leute zu motivieren, werde ich den WSSkiller demnächst auf TAPCOM umstellen.

Eine englische Beschreibung reiche ich nach.

MfG. Alex

P.S.:
Zitat:
Zitat von DeadBeef Beitrag anzeigen
Den Inhalt der Funktion Shutdown() kann man wie folgt ersetzen:
Code:
CallBIOS (14, 1, 3, 0, 0);
Leider habe ich unvorsichtigerweise zu viel versprochen. Shutdown schaltet nicht nur den Topf ab, sondern kann auch Aufnahmen, Wiedergaben und die Audio- bzw. Videoausgabe stoppen.
FireBird ist offline   Mit Zitat antworten
Alt 03.03.2007, 13:31:35   #29
DeadBeef
TAP-Guru
 
Registriert seit: 25.12.2005
Beiträge: 392
Standard AW: FireBirdLib

Zitat:
Zitat von FireBird Beitrag anzeigen
P.S.:
Leider habe ich unvorsichtigerweise zu viel versprochen. Shutdown schaltet nicht nur den Topf ab, sondern kann auch Aufnahmen, Wiedergaben und die Audio- bzw. Videoausgabe stoppen.
Sorry, ich habe diese "kleine" Differenz zwischen den beiden Funktionen in meinem Posting nicht berücksichtigt.
__________________
Grüße
DeadBeef

DeadBeef's TAP Collection
DeadBeef ist offline   Mit Zitat antworten
Alt 03.03.2007, 13:50:09   #30
ibbi
Moderierter Ignorator Bitteschöööön!
 
Benutzerbild von ibbi
 
Registriert seit: 09.12.2005
Receiver: TF5000PVR und TF5000PVRt
Firmware: Sep 2005 PHTF und Oct 2005 PHTFZ
Beiträge: 6.462
Standard AW: FireBirdLib

Zitat:
Zitat von FireBird Beitrag anzeigen
Jetzt werden nur mehr Server- und Client-TAPs benötigt. Um ein paar Leute zu motivieren, werde ich den WSSkiller demnächst auf TAPCOM umstellen.
Wenn es soweit ist, stelle ich PiP natürlich darauf um.
__________________
Power Restore 0.7.3c | PiP 1.2 | 1.1u | QuickTimer 1.0.2 (IB) | TF5000 Display 1.49 | dbPlay 1.2 | Auto Resume 1.30 | WSSkkB 0.9 | RecCopy 4.2 | IdleHdd 1.0 | EPPG 1.5 | WWWW 0.1b
(ScreenCapture_OSD 2.10a, A-B Repeat 1.3, Kanalarbeiter 0.9, RecRepair 0.4, SimpleCharEditor 4.0ß, ProfileEditor 1.2a, ScanDisk 1.4)
ibbi ist offline   Mit Zitat antworten
Alt 03.03.2007, 14:01:45   #31
flechumer
Vollzeit-Guru
 
Benutzerbild von flechumer
 
Registriert seit: 10.12.2005
Ort: Emsland
Beiträge: 2.449
Standard AW: FireBirdLib

Hallo FireBird,

habe gerade mal mit dem neuen Release getestet und festgestellt, daß der Delete jetzt funktioniert. Wunderbar, danke! Beim ersten Delete bleibt allerdings eine temporäre Datei ~FireBirdLib.tmp~ zurück. Wenn ich die dann händisch lösche, bleibt beim nächsten Delete nichts zurück. Wenn Du das noch richten könntest?

Gruß
__________________
flechumer
flechumer ist offline   Mit Zitat antworten
Alt 03.03.2007, 14:03:33   #32
FireBird
Suspekter verdächtiger
Zauberküchenchef,
TAP & Firmware-Guru
 
Benutzerbild von FireBird
 
Registriert seit: 09.12.2005
Ort: Wien
Receiver: SRP-2401CI+
Beiträge: 24.936
Standard AW: FireBirdLib

Prüfe ich gleich.
FireBird ist offline   Mit Zitat antworten
Alt 03.03.2007, 14:09:39   #33
ibbi
Moderierter Ignorator Bitteschöööön!
 
Benutzerbild von ibbi
 
Registriert seit: 09.12.2005
Receiver: TF5000PVR und TF5000PVRt
Firmware: Sep 2005 PHTF und Oct 2005 PHTFZ
Beiträge: 6.462
Standard AW: FireBirdLib

Zitat:
Zitat von flechumer Beitrag anzeigen
Beim ersten Delete bleibt allerdings eine temporäre Datei ~FireBirdLib.tmp~ zurück.
Das kann nur passieren, wenn TAP_Hdd_Rename nicht TRUE zurückliefert, aber trotzdem umbenennt.

Welchen Returncode erhältst Du in diesem Fall von TAP_Hdd_Delete?
__________________
Power Restore 0.7.3c | PiP 1.2 | 1.1u | QuickTimer 1.0.2 (IB) | TF5000 Display 1.49 | dbPlay 1.2 | Auto Resume 1.30 | WSSkkB 0.9 | RecCopy 4.2 | IdleHdd 1.0 | EPPG 1.5 | WWWW 0.1b
(ScreenCapture_OSD 2.10a, A-B Repeat 1.3, Kanalarbeiter 0.9, RecRepair 0.4, SimpleCharEditor 4.0ß, ProfileEditor 1.2a, ScanDisk 1.4)
ibbi ist offline   Mit Zitat antworten
Alt 03.03.2007, 14:10:23   #34
Happy
TAP-Guru
 
Benutzerbild von Happy
 
Registriert seit: 09.12.2005
Ort: bei Karlsruhe
Receiver: TF4000-5500-6000-TMS
Beiträge: 5.643
Standard AW: FireBirdLib

Da hat jemand an meinem Code gebastelt
TAP_HDD_Rename liefert FALSE, wenn es geklappt hat
Das habe ich in Automove gefunden:
Code:
res = !TAP_Hdd_Rename(filename,newname);  //liefert FALSE, wenns geklappt hat ???

Gruß,
Happy
__________________
Meine TAPs und Tools

TF5500 PVR (Fw Jan. 2007 P)- 400GB Samsung - AC light 1.05 - Yamaha RX-V 1500
- LAN: Asus WL-500g Deluxe mit ftpd-topfield 0.7.4
TAPs: Quicktimer, Autodelete, Standby, 3PG, Automove, NiceDisplay, PowerRestore, WSS Killer, Eurostirf, Overfly
TV: Sony KDL-46W4500
TF6000 PVR (Fw Okt. 2008)- 160GB Samsung SV1604N
TAPs: iTina, Autodelete, Automove, Autoresume, NiceDisplay, WSS Killer
SRP-2100 (Fw Okt. 2009)
TAPs: SmartEPG, ChangePreview, Autodelete, Automove, BackupSettings,RescueRecs, MySkip, NiceDisplay
Happy ist offline   Mit Zitat antworten
Alt 03.03.2007, 14:13:35   #35
ibbi
Moderierter Ignorator Bitteschöööön!
 
Benutzerbild von ibbi
 
Registriert seit: 09.12.2005
Receiver: TF5000PVR und TF5000PVRt
Firmware: Sep 2005 PHTF und Oct 2005 PHTFZ
Beiträge: 6.462
Standard AW: FireBirdLib

Zitat:
Zitat von Happy Beitrag anzeigen
Da hat jemand an meinem Code gebastelt
Gebastelt würde ich es nicht nennen. Eher wasserabgedichtet.
__________________
Power Restore 0.7.3c | PiP 1.2 | 1.1u | QuickTimer 1.0.2 (IB) | TF5000 Display 1.49 | dbPlay 1.2 | Auto Resume 1.30 | WSSkkB 0.9 | RecCopy 4.2 | IdleHdd 1.0 | EPPG 1.5 | WWWW 0.1b
(ScreenCapture_OSD 2.10a, A-B Repeat 1.3, Kanalarbeiter 0.9, RecRepair 0.4, SimpleCharEditor 4.0ß, ProfileEditor 1.2a, ScanDisk 1.4)
ibbi ist offline   Mit Zitat antworten
Alt 03.03.2007, 14:14:57   #36
Happy
TAP-Guru
 
Benutzerbild von Happy
 
Registriert seit: 09.12.2005
Ort: bei Karlsruhe
Receiver: TF4000-5500-6000-TMS
Beiträge: 5.643
Standard AW: FireBirdLib

Zitat:
Zitat von ibbi Beitrag anzeigen
Gebastelt würde ich es nicht nennen. Eher wasserabgedichtet.
Stimmt schon, so gehört es sich eigentlich
__________________
Meine TAPs und Tools

TF5500 PVR (Fw Jan. 2007 P)- 400GB Samsung - AC light 1.05 - Yamaha RX-V 1500
- LAN: Asus WL-500g Deluxe mit ftpd-topfield 0.7.4
TAPs: Quicktimer, Autodelete, Standby, 3PG, Automove, NiceDisplay, PowerRestore, WSS Killer, Eurostirf, Overfly
TV: Sony KDL-46W4500
TF6000 PVR (Fw Okt. 2008)- 160GB Samsung SV1604N
TAPs: iTina, Autodelete, Automove, Autoresume, NiceDisplay, WSS Killer
SRP-2100 (Fw Okt. 2009)
TAPs: SmartEPG, ChangePreview, Autodelete, Automove, BackupSettings,RescueRecs, MySkip, NiceDisplay
Happy ist offline   Mit Zitat antworten
Alt 03.03.2007, 14:18:40   #37
ibbi
Moderierter Ignorator Bitteschöööön!
 
Benutzerbild von ibbi
 
Registriert seit: 09.12.2005
Receiver: TF5000PVR und TF5000PVRt
Firmware: Sep 2005 PHTF und Oct 2005 PHTFZ
Beiträge: 6.462
Standard AW: FireBirdLib

Zitat:
Zitat von Happy Beitrag anzeigen
TAP_HDD_Rename liefert FALSE, wenn es geklappt hat
Stimmt!

Ich hoffe, es macht mir niemand zum Vorwurf, dass ich der Topfield-Doku traue und nicht so denken kann, wie ein Topfield-Entwickler.

Also:

Code:
if (!TAP_Hdd_Rename(name, "~FireBirdLib.tmp~")) return real_TAP_Hdd_Delete("~FireBirdLib.tmp~");
EDIT: Würde flechumer Rückgabewerte beachten , hätte es in seinem Programm eine entsprechende Fehlermeldung gegeben.
__________________
Power Restore 0.7.3c | PiP 1.2 | 1.1u | QuickTimer 1.0.2 (IB) | TF5000 Display 1.49 | dbPlay 1.2 | Auto Resume 1.30 | WSSkkB 0.9 | RecCopy 4.2 | IdleHdd 1.0 | EPPG 1.5 | WWWW 0.1b
(ScreenCapture_OSD 2.10a, A-B Repeat 1.3, Kanalarbeiter 0.9, RecRepair 0.4, SimpleCharEditor 4.0ß, ProfileEditor 1.2a, ScanDisk 1.4)

Geändert von ibbi (03.03.2007 um 14:22:36 Uhr).
ibbi ist offline   Mit Zitat antworten
Alt 03.03.2007, 14:26:16   #38
FireBird
Suspekter verdächtiger
Zauberküchenchef,
TAP & Firmware-Guru
 
Benutzerbild von FireBird
 
Registriert seit: 09.12.2005
Ort: Wien
Receiver: SRP-2401CI+
Beiträge: 24.936
Standard AW: FireBirdLib

Ab jetzt gibt es die Lib sogar mit ! und der Preis hat sich sensationeller Weise nicht geändert.
FireBird ist offline   Mit Zitat antworten
Alt 03.03.2007, 14:29:18   #39
flechumer
Vollzeit-Guru
 
Benutzerbild von flechumer
 
Registriert seit: 10.12.2005
Ort: Emsland
Beiträge: 2.449
Standard AW: FireBirdLib

Zitat:
Zitat von ibbi Beitrag anzeigen
Welchen Returncode erhältst Du in diesem Fall von TAP_Hdd_Delete?
65034
__________________
flechumer
flechumer ist offline   Mit Zitat antworten
Alt 03.03.2007, 14:29:23   #40
ibbi
Moderierter Ignorator Bitteschöööön!
 
Benutzerbild von ibbi
 
Registriert seit: 09.12.2005
Receiver: TF5000PVR und TF5000PVRt
Firmware: Sep 2005 PHTF und Oct 2005 PHTFZ
Beiträge: 6.462
Standard AW: FireBirdLib

Zitat:
Zitat von FireBird Beitrag anzeigen
Ab jetzt gibt es die Lib sogar mit ! und der Preis hat sich sensationeller Weise nicht geändert.
Und wer ersetzt mir den Freizeit-Ausfall? Von der Aldarinsche Denk-Pauschale gar nicht zu sprechen.
__________________
Power Restore 0.7.3c | PiP 1.2 | 1.1u | QuickTimer 1.0.2 (IB) | TF5000 Display 1.49 | dbPlay 1.2 | Auto Resume 1.30 | WSSkkB 0.9 | RecCopy 4.2 | IdleHdd 1.0 | EPPG 1.5 | WWWW 0.1b
(ScreenCapture_OSD 2.10a, A-B Repeat 1.3, Kanalarbeiter 0.9, RecRepair 0.4, SimpleCharEditor 4.0ß, ProfileEditor 1.2a, ScanDisk 1.4)
ibbi ist offline   Mit Zitat antworten
Antwort

Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:31:00 Uhr.

©2005-2011 TOPFIELD Europe GmbH  | Datenschutz & Nutzungsbedingungen | Impressum

Powered by vBulletin Version 3.8.6 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.