FPV Booster App DOUBLE Vision+ FPV Range

methinx said:
Btw, I bought your app. I went out in the field to test it. First I wanted to see how far I could get without the booster.. But the controller signal dropped about 1km distance. So there was no way (and no need) to test the booster app. Any advice on increasing the control signal range?

Just because it nice, here is a screenshot for my max distance :)
If you set higher Preview Quality, non-boosted FPV range may drop less than 1km for easy testing. For longer control range, you may either change 5.8G patch panel (2-3km control range) or WindSurfer mod.
 
I was out testing again today, this time using an iPad4 for FPV but boosted with Android V2.1. Now that I've added a better 5.8Ghz antenna to my controller, I lose FPV first. Previous record was around 7400' boosted with V1. Similar with V2.1 but today it worked up to 8364'. This is only 320x240@15 and it wasn't solid after about 7000' but still, it's great. I am just about to upgrade the Repeater antennas so this may be the last flight without modifying the FPV hardware.

And my Flytrex Live finally recorded the complete mission, so here's the data and video: http://www.flytrex.com/mission/quadcopt ... ver-74934/

Once I lose FPV, I watch where it is on my phone using my Flytrex /live site - works nice but I need a bigger screen for the map.
 

Attachments

  • iPadScreenShot.PNG
    iPadScreenShot.PNG
    948.4 KB · Views: 475
nhoover said:
I was out testing again today, this time using an iPad4 for FPV but boosted with Android V2.1. Now that I've added a better 5.8Ghz antenna to my controller, I lose FPV first. Previous record was around 7400' boosted with V1. Similar with V2.1 but today it worked up to 8364'. This is only 320x240@15 and it wasn't solid after about 7000' but still, it's great. I am just about to upgrade the Repeater antennas so this may be the last flight without modifying the FPV hardware.

And my Flytrex Live finally recorded the complete mission, so here's the data and video: http://www.flytrex.com/mission/quadcopt ... ver-74934/

Once I lose FPV, I watch where it is on my phone using my Flytrex /live site - works nice but I need a bigger screen for the map.
Well done :D It's great you broke your personal best finally before upgrading antennas. I have updated the scoreboard accordingly and you are currently ranking #4.
 
This application just checks for TX power every 5 seconds and if it's not 13dBm, app sets TX power to 13dBm and distance to 1000 meters.
There are no other juice, no "interference control algorithm", no special settings, nothing else but tons of code to hide that fact.
The selling point of this app is allegation that it's not just sets TX power, but offers some unique algorithms, so I consider this to be a scam.

PVFlyer, admit it and apologize to your customers (that includes me) for lying to them, or I'll publish full step-by-step report. To assure you I'm serious, here are two "secrets":
int res=(reply+4)/6; // challenge-response algo used to authorize android app to launch "fpvbooster" on phantom.
for(int i=start; i<end; ++i)buf-=3; // decryption algo used to "unhide" strings in "fpvbooster".
 
dci said:
This application just checks for TX power every 5 seconds and if it's not 13dBm, app sets TX power to 13dBm and distance to 1000 meters.
There are no other juice, no "interference control algorithm", no special settings, nothing else but tons of code to hide that fact.
The selling point of this app is allegation that it's not just sets TX power, but offers some unique algorithms, so I consider this to be a scam.

PVFlyer, admit it and apologize to your customers (that includes me) for lying to them, or I'll publish full step-by-step report. To assure you I'm serious, here are two "secrets":
int res=(reply+4)/6; // challenge-response algo used to authorize android app to launch "fpvbooster" on phantom.
for(int i=start; i<end; ++i)buf-=3; // decryption algo used to "unhide" strings in "fpvbooster".

Why you are hiding yourselves by registered as new member to post in this thread?

We advertised "It boosts additional 50%-150% FPV range by a single click", and I think most of our customers (probably including you) achieve the claimed performance. I would not rule out some exceptional (below or above the claimed performance) though. If you look at the scoreboard in the OP, they all went well beyond 1000m.

Do your research and improve your product with innovations instead of clone.
 
dci said:
This application just checks for TX power every 5 seconds and if it's not 13dBm, app sets TX power to 13dBm and distance to 1000 meters.

Ok i want understand: why check TX power every 5 seconds? It's not enough to set it once each time it is powered on?
"set distance to 1000 meters" what "distance" it's set??
 
I'm not hiding, that is my primary nickname and I've never posted on this forum under any other nickname.

I've achieved results I'm currently having by changing tx power and distance in LuCI, then I've purchased your app, but it didn't make any noticeable difference.
That's the reason I've decided to give it a closer look.

1000m is not about maximum archived distance, but about this string in your program (after un-roasting):
"iw phy phy0 set distance 1000"
that is basically the only thing your program is doing besides setting tx power to value passed from phone app (hardcoded to 13).

So do you admit all your words on this (and other) forums about unique "interference control algorithm" are bs and all your program is actually doing is two calls to iw?

btw, I'm not a software developer, I'm malware analyst.
 
Smb said:
dci said:
This application just checks for TX power every 5 seconds and if it's not 13dBm, app sets TX power to 13dBm and distance to 1000 meters.

Ok i want understand: why check TX power every 5 seconds? It's not enough to set it once each time it is powered on?
"set distance to 1000 meters" what "distance" it's set??
Ask PVFlyer, I can only show you the code.
I think it's done because TX power may be lowered automatically or by some other tool (I've never seen such a case however on my phantom with TX power set once at the boot time).

distance is one of the parameters you can pass to iw (or permanently set in LuCI), it basically tells to the wifi phy how far other wifi devices are, so the phy can tune its timings to provide better transmission rate.
See here http://wiki.openwrt.org/doc/uci/wireless
 
dci said:
"iw phy phy0 set distance 1000"
that is basically the only thing your program is doing besides setting tx power to value passed from phone app (hardcoded to 13).

So do you admit all your words on this (and other) forums about unique "interference control algorithm" are bs and all your program is actually doing is two calls to iw?

btw, I'm not a software developer, I'm malware analyst.
LOL. Such "set distance 1000" is just a line of dummy code in the source as I checked with the developer, which was commented out. It seems your analysis was too rough and couldn't distinguish executable codes and dummy codes, though I'm unsure how you do malware analysis. :lol:
 
Commented out, eh? So your program doesn't do anything useful besides setting tx power to 13dBm at all? Let's check.

Current fpvbooster binary (coming with v2.1) has md5sum=78D2672F5B01041BE0BE433EDE13E8A2.
This string is located at the virtual address 0x401138 and has length 29. It's encrypted like the three other encrypted strings in your program -- by adding 3 to every byte code.
Here are all of them:
Code:
LOAD:004010F0 encrypted_strings:.word 0x70, 0x67, 0x38, 0x76, 0x78, 0x70, 0x23, 0x32, 0x77
LOAD:004010F0                                          # DATA XREF: LOAD:encrypted_shellcmd_1o
LOAD:004010F0                 .word 0x70, 0x73, 0x32, 0x6C, 0x7A, 0x6C, 0x71, 0x69, 0x72  # subtract 3 from each value and you'll get:
LOAD:004010F0                 .word 0x6C, 0x7A, 0x23, 0x73, 0x6B, 0x7C, 0x23, 0x73, 0x6B  # ---------
LOAD:004010F0                 .word 0x7C, 0x33, 0x23, 0x76, 0x68, 0x77, 0x23, 0x67, 0x6C  # md5sum /tmp/iwinfo
LOAD:004010F0                 .word 0x76, 0x77, 0x64, 0x71, 0x66, 0x68, 0x23, 0x34, 0x33  # iw phy phy0 set distance 1000
LOAD:004010F0                 .word 0x33, 0x33, 0x6C, 0x7A, 0x6C, 0x71, 0x69, 0x72, 0x23  # iwinfo wlan0 info | grep Tx-Power | cut -d ":" -f2 | cut -d " " -f2
LOAD:004010F0                 .word 0x7A, 0x6F, 0x64, 0x71, 0x33, 0x23, 0x6C, 0x71, 0x69  # /tmp/log/lastlog
LOAD:004010F0                 .word 0x72, 0x23, 0x7F, 0x23, 0x6A, 0x75, 0x68, 0x73, 0x23  # ---------
LOAD:004010F0                 .word 0x57, 0x7B, 0x30, 0x53, 0x72, 0x7A, 0x68, 0x75, 0x23
LOAD:004010F0                 .word 0x7F, 0x23, 0x66, 0x78, 0x77, 0x23, 0x30, 0x67, 0x23
LOAD:004010F0                 .word 0x25, 0x3D, 0x25, 0x23, 0x30, 0x69, 0x35, 0x23, 0x7F
LOAD:004010F0                 .word 0x23, 0x66, 0x78, 0x77, 0x23, 0x30, 0x67, 0x23, 0x25
LOAD:004010F0                 .word 0x23, 0x25, 0x23, 0x30, 0x69, 0x35, 0x32, 0x77, 0x70
LOAD:004010F0                 .word 0x73, 0x32, 0x6F, 0x72, 0x6A, 0x32, 0x6F, 0x64, 0x76
LOAD:004010F0                 .word 0x77, 0x6F, 0x72, 0x6A, 0, 0, 0
This particular string is decoded by MIPS16 code at the virtual address 0x400E66:
Code:
// copy string to local buffer. each byte is stored as 4-byte integer thus the length 0x74
LOAD:00400E66                 addiu   $v0, $sp, 0x208+encrypted_shellcmd_2_local
LOAD:00400E68                 move    $a0, $v0
LOAD:00400E6A                 lw      $a1, encrypted_shellcmd_2
LOAD:00400E6C                 li      $a2, 0x74
LOAD:00400E6E                 jalx    memcpy
LOAD:00400E72                 sw      $v0, 0x208+var_28($sp)

// allocate 30 bytes for decoded string (including null byte)
LOAD:00400E74                 li      $a0, 30
LOAD:00400E76                 jalx    malloc
LOAD:00400E7A                 addiu   $s1, $sp, 0x208+encrypted_shellcmd_2_local
LOAD:00400E7C                 sw      $v0, 0x208+iw_set_distance($sp)
LOAD:00400E7E                 move    $v0, $s1
LOAD:00400E80                 addiu   $v0, 0x74
LOAD:00400E82                 sw      $v0, 0x208+iwinfo_wlan0_info($sp)

// the actual decoder. read byte, decrease it by three, use sprintf(%c) to write decoded char, use strcat to add it to the decoded string
LOAD:00400E84 decode_iw_set_distance:                  # CODE XREF: do_background_job+9Aj
LOAD:00400E84                 lw      $a2, 0($s1)
LOAD:00400E86                 move    $a0, $s0
LOAD:00400E88                 lw      $a1, strC_0
LOAD:00400E8A                 jalx    sprintf
LOAD:00400E8E                 addiu   $a2, -3
LOAD:00400E90                 lw      $a0, 0x208+iw_set_distance($sp)
LOAD:00400E92                 jalx    strcat
LOAD:00400E96                 move    $a1, $s0
LOAD:00400E98                 lw      $v0, 0x208+iwinfo_wlan0_info($sp)
LOAD:00400E9A                 addiu   $s1, 4
LOAD:00400E9C                 cmp     $s1, $v0
LOAD:00400E9E                 btnez   decode_iw_set_distance
And few lines later, your magic worker code:
Code:
LOAD:00400EFA do_check_adjust_tx_power:                # CODE XREF: do_background_job+132j

// jump to the exit in case of md5 fail
LOAD:00400EFA                 beqz    $s0, loc_400F38

// execute 'iwinfo wlan0 info | grep Tx-Power | cut -d ":" -f2 | cut -d " " -f2'
LOAD:00400EFC                 jal     shell_execute
LOAD:00400F00                 lw      $a0, 0x208+iwinfo_wlan0_info($sp)

// search for desired value in the returned string
LOAD:00400F02                 lw      $a1, 0x208+arg_tx_power($sp)
LOAD:00400F04                 jalx    strstr
LOAD:00400F08                 move    $a0, $v0

// skip applying values if desired value is found (is already set)
LOAD:00400F0A                 bnez    $v0, loc_400F18

// execute 'iw phy phy0 set txpower fixed %s00' with correct value inserted before
LOAD:00400F0C                 jal     shell_execute
LOAD:00400F10                 lw      $a0, 0x208+set_tx_power_cmd($sp)

// execute 'iw phy phy0 set distance 1000'
LOAD:00400F12                 jal     shell_execute
LOAD:00400F16                 lw      $a0, 0x208+iw_set_distance($sp)

LOAD:00400F18 loc_400F18:                              # CODE XREF: do_background_job+106j

// sleep 5 seconds
LOAD:00400F18                 jalx    sleep
LOAD:00400F1C                 li      $a0, 5

// execute 'md5sum /tmp/iwinfo'
LOAD:00400F1E                 lw      $v0, md5sum_tmp_iwinfo
LOAD:00400F20                 li      $s0, 1
LOAD:00400F22                 jal     shell_execute
LOAD:00400F26                 lw      $a0, 0($v0)

// compare with 'c6dc0aefb7223b4d03d4d03692b8c9f9'
LOAD:00400F28                 lw      $a1, strIwinfoMD5Sum
LOAD:00400F2A                 jalx    strstr
LOAD:00400F2E                 move    $a0, $v0
LOAD:00400F30                 sltiu   $v0, 1
LOAD:00400F32                 move    $v0, $t8
LOAD:00400F34                 xor     $s0, $v0

// go to start
LOAD:00400F36                 b       do_check_adjust_tx_power

Now let's double check using strace tool, that can be installed from opkg (here is tutorial on how to use opkg http://www.phantompilots.com/viewtopic.php?f=27&t=17704).
First we need to run fpv booster to copy its binaries to phantom, than ssh 192.168.1.1 root:19881209.
Code:
# go to fpvbooster location
root@Phantom:~# cd /tmp

# kill existing fpvbooster instance
root@Phantom:/tmp# killall fpvbooster

# start fpvbooster first time to get challenge code
root@Phantom:/tmp# ./fpvbooster
54185180root@Phantom:/tmp#

# you can calculate response=(challenge+4)/6 or just get it from lastlog:
root@Phantom:/tmp# cat /var/log/lastlog
9030864root@Phantom:/tmp#

# now start fpvbooster with response and tx power in dBm.
root@Phantom:/tmp# ./fpvbooster 9030864 13
12005root@Phantom:/tmp#

# find running background process
root@Phantom:/tmp# ps|grep fpv
12005 root       784 S    ./fpvbooster 9030864 13
13195 root      1500 S    grep fpv

# change tx power and connect strace to the found process (12005 in this case)
root@Phantom:/tmp# iw phy phy0 set txpower fixed 10 && strace -f -e trace=execve -p12005
Process 12005 attached
Process 27157 attached
[pid 27157] execve("/bin/sh", ["sh", "-c", "md5sum /tmp/iwinfo"], [/* 11 vars */]) = 0
Process 27160 attached
[pid 27160] execve("/usr/bin/md5sum", ["md5sum", "/tmp/iwinfo"], [/* 11 vars */]) = 0
[pid 27160] +++ exited with 0 +++
[pid 27157] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27160, si_status=0, si_utime=0, si_stime=0} ---
[pid 27157] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27157, si_status=0, si_utime=0, si_stime=0} ---
Process 27162 attached
[pid 27162] execve("/bin/sh", ["sh", "-c", "iwinfo wlan0 info | grep Tx-Powe"...], [/* 11 vars */]) = 0
Process 27165 attached
[pid 27165] execve("/bin/grep", ["grep", "Tx-Power"], [/* 11 vars */]) = 0
Process 27164 attached
[pid 27165] +++ exited with 1 +++
[pid 27164] +++ exited with 127 +++
[pid 27162] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27165, si_status=1, si_utime=0, si_stime=0} ---
Process 27168 attached
[pid 27168] execve("/usr/bin/cut", ["cut", "-d", ":", "-f2"], [/* 11 vars */]) = 0
Process 27169 attached
[pid 27169] execve("/usr/bin/cut", ["cut", "-d", " ", "-f2"], [/* 11 vars */]) = 0
[pid 27168] +++ exited with 0 +++
[pid 27162] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27168, si_status=0, si_utime=0, si_stime=1} ---
[pid 27169] +++ exited with 0 +++
[pid 27162] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27169, si_status=0, si_utime=1, si_stime=1} ---
[pid 27162] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27162, si_status=0, si_utime=0, si_stime=1} ---
Process 27174 attached
[pid 27174] execve("/bin/sh", ["sh", "-c", "iw phy phy0 set txpower fixed 13"...], [/* 11 vars */]) = 0
Process 27179 attached
[pid 27179] execve("/usr/sbin/iw", ["iw", "phy", "phy0", "set", "txpower", "fixed", "1300"], [/* 11 vars */]) = 0
[pid 27179] +++ exited with 0 +++
[pid 27174] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27179, si_status=0, si_utime=0, si_stime=0} ---
[pid 27174] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27174, si_status=0, si_utime=1, si_stime=1} ---
Process 27181 attached
[pid 27181] execve("/bin/sh", ["sh", "-c", "iw phy phy0 set distance 1000"], [/* 11 vars */]) = 0
Process 27184 attached
[pid 27184] execve("/usr/sbin/iw", ["iw", "phy", "phy0", "set", "distance", "1000"], [/* 11 vars */]) = 0
[pid 27184] +++ exited with 0 +++
[pid 27181] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27184, si_status=0, si_utime=0, si_stime=0} ---
[pid 27181] +++ exited with 0 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=27181, si_status=0, si_utime=0, si_stime=0} ---
^CProcess 12005 detached
root@Phantom:/tmp#

So here we are
Code:
[pid 27181] execve("/bin/sh", ["sh", "-c", "iw phy phy0 set distance 1000"], [/* 11 vars */]) = 0
This line is actually executing.

You lied about your fairy magic algorithms, now you're lying about the code your program executes. The truth is that your program can be replaced with a 5-line shell script.
You're so paranoid about this fact -- all that challenge-response, encryption and checksum checking just to ensure no one see these precious commands your're actually executing...
Insulting me as a professional is not going to work, I'm working in this field for over a decade and all your "protection" and "encryption" is child play compared to methods used in modern malware.

Your friend-developer write quite poor C code, btw. The fpvbooster binary is one big memory leak, there's only one free() call (freeing buffer used to sprintf tx power command, executed if md5sum fails), all other malloc() calls, including the one in the function I called shell_execute (which gets called four times in the worker loop) are unmatched, so they are leaking memory.
Argc in main() checked for two while it should be checked for three.
Storing strings as int arrays instead of char arrays is silly, takes 4x space for no reason.
Writing characters with concat(dest,sprintf(%c)) is silly, character can be written directly to string like str[offset]=code; saving memory for extra buffer and sparing two function calls...
...and many more.
 
I'm happy with what the app has done for me allowing me to go longer distances with intact FPV but must admit these last posts are intriguing.
 
DCI, if you can write simple script working on android, doing the same , and for free, pls do it. Or even paid, pls do it and post it on google play , you make some money :)
 
I should say that I have nothing against selling two shell commands for 10 bucks, that's convinient -- you don't have to edit configs with vi or bother installing luci or connectbot, but posts like this
http://www.phantompilots.com/viewtopic.php?f=27&t=13496&start=1010#p162198 (Power is nothing without proper control.)
or the first post promising to further increase the range by 50% with "interference control algorithm"
that's what "really grind my gears".
 
dronebandit said:
DCI, if you can write simple script working on android, doing the same , and for free, pls do it. Or even paid, pls do it and post it on google play , you make some money :)
Shell script should run on the Phantom, not on the phone, also you'll need iwinfo installed on Phantom (either from opkg or just copied to /sbin or /tmp manually).
I believe all this (upload, run) may be automated to one click with android apps like smanager with ssh addon and smwidgets.
I'm not at home to test it right now, but all the useful logic of fpvbooster should look like this in the form of the shell script:
Code:
#!/bin/sh
while [ 1 ] ; do
       TESTSTR="`iwinfo wlan0 info | grep Tx-Power | cut -d ":" -f2 | cut -d " " -f2`"
       if [ "$TESTSTR" != "13" ] ; then
               iw phy phy0 set txpower fixed 1300
               iw phy phy0 set distance 1000
       fi
       sleep 5
done

Basically it should be sufficient to run just these two (also you won't need iwinfo in this case)
Code:
iw phy phy0 set txpower fixed 1300
iw phy phy0 set distance 1000
I've never seen a case where iwinfo check loop would be useful (i.e. txpower changes by itself after being set to fixed) on my phantom.

Or you can just install LuCI from opkg, set this values (13dBm, 1000 meters) in the web UI and that will be permanent, without need to apply before each flight. (there is small glitch in the mac80211.sh script of the openwrt build used in phantom, it applies tx power to IF instead of PHY, that may lead to tx power applied as "limit", not as "fixed". While it shouldn't cause much trouble, I can post the patch to mac80211.sh script so the tx power will be set as "fixed").
If you're worrying about voiding your warranty because of filesystem alteration -- you can just clear /overlay/usr folder (sparing ./lib/libcrypto.*, ./lib/libssl.*, ./lib/lighttpd and ./sbin/lighttpd) on your phantom at any time to make it like brand new one (or just remove LuCI etc... with opkg remove).
 
So here's the update on the automation:

Two-liner is easy to automate, you'll need free "connectbot-pslib" from market.
  1. Connect to the phantom network.
  2. Launch ConnectBot-pslib.
  3. Enter "[email protected]" in the address input, press Done
  4. Confirm unknown key request
  5. Return to the first screen (session list)
  6. Long press "[email protected]" session, choose "Edit host"
  7. Edit nickname to something meaningful, if you want.
  8. Choose post-login automation, enter "iw phy phy0 set txpower fixed 1300 && iw phy phy0 set distance 1000 && exit", press enter in the end of this string to create empty line, press ok.
  9. Check "Autosave password"
  10. Return to the first screen (session list)
  11. Lauch the newly created session, enter the password -- 19881209 (it will be saved)
  12. All done. Now each time you launch the session, tx power will be set to 13dBm.

Full logic with iwinfo and loop is a bit trickier. You will need free version of "Script Manager - SManager" from market.
  1. Download the attached "boost.tar", extract it (with winrar for example), copy to your phone
  2. Connect to the phantom network.
  3. Launch SManager
  4. Navigate to the folder with extracted files.
  5. Choose boost.sh
  6. Press run
  7. On the first run you'll need to confirm the unknown key request by pressing Y button on the keyboard
  8. Wait a couple of seconds (two files should be copied successfully, then 'Done' should appear), press X button in the top left corner.
  9. All done. Now each time you launch this script, background process on your phantom will be started to ensure tx power stays at 13dBm. You should be able to create a desktop shortcut for this script by adding SManager widget and choosing boost.sh ("smwidgets" addon is probably required to do this).

There is no error checking in these scripts, so they're more a proof of concept than a working solution.
fpvbooster has almost no error checking too, however.
 

Attachments

  • boost.tar
    193.5 KB · Views: 186
Why don't you fly with your clone codes (5-line shell script or so) in the field, and prove it working instead of sitting behind screen and throwing a bunch of codes? If it really works in the field, great, then this is just another clone (you are not the first clone anyway) to prove our research results as the original booster app inventor. :lol:

Anyhow, our booster app is proven (it works) by thousands of users/pilots in the past several months.
 
I'm flying without any codes with these values set in LuCI.
"Research", "inventor" are such a loud words for setting two well-documented parameters...
You know, people have written kernel, drivers, all the the middleware and documentation. You've got it for free and with the source code.
There is free and opensource (and much more powerful) LuCI, that can do the same your app is doing.
Your "invention" is just one-click solution for one particular task, that openwrt (and just linux) users solved for years without knowing they're "researching" or "inventing" something.
You know that, that's why every time you're being asked about tx power you're writing all that bs about control and algorithms.

I've published this code because I was requested to prove the point. This wouldn't happen if you'd apologized for your, lets call it "marketing strategy", on the previous page.
 

Recent Posts

Members online

No members online now.

Forum statistics

Threads
143,099
Messages
1,467,640
Members
104,986
Latest member
dlr11164