Commit Graph

6303 Commits

Author SHA1 Message Date
Stefan Knoblich a478a5de04 ftmod_libpri: Skip channels marked in use during NT-mode idle restart.
Channels can be in DOWN state but reserved by an incoming call
(FTDM_CHANNEL_INUSE flag). Additionally check the flag in on_timeout_t3xx()
and skip those channels.

Reported-by: privi #freetdm @ irc.freenode.net
Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-09-11 11:09:40 +02:00
David Yat Sin c0e4ca47bc Freetdm: ISDN fix for link not always recovering after T1/E1 alarm 2012-09-11 01:22:31 -04:00
Jeff Lenk d8fc88ea75 FS-4605 --resolve 2012-09-10 19:34:04 -05:00
Steve Underwood d26293e591 Some tweaks to spandsp 2012-09-09 01:08:15 +08:00
Stefan Knoblich 17329d04ad ftmod_libpri: Print warning message in lpwrap_stop_timer(), if timer is not on the active list
Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-09-07 00:04:40 +02:00
Stefan Knoblich a035182582 ftmod_libpri: Append new lpwrap timers in correct order.
List is sorted in ascending order of expiration time,
fix the if clause in lpwrap_start_timer().

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-09-07 00:02:32 +02:00
David Yat Sin f49ee5ebf9 FreeTDM: Added function to listen for mg-tdm-dtmfremoval command to disable/enable DTMF removal per channel 2012-09-06 16:53:58 -04:00
Steve Underwood cc73cb6544 Some tweaks to spandsp tests. Make spandsp write TIFF files more like the
TIFF/FX spec says, even though no software seems to care.
2012-09-07 00:41:41 +08:00
Nenad Corbic 0c49449746 Changed MTP2 events from ERROR to WARN 2012-09-05 23:06:08 -04:00
Nenad Corbic c260bc4b8a Update mtp2 loglevels
Alignment loss - wanring
Alignment up - info
2012-09-05 18:03:08 -04:00
Moises Silva 15fa227699 freetdm: Fix ss7 logger broken compilation 2012-09-05 02:26:39 -04:00
Stefan Knoblich 4ffcb7c9ef ftmod_libpri: Improve RESTART handling, add PTP NT idle channel restart and T316.
Do not try to send RESTART on BRI PTMP spans, libpri will just print
an error and do nothing, causing the channels to be stuck in RESTART
forever.

Add T316 (RESTART ACK timeout), which is not implemented by libpri.
The default timeout is 30 seconds (Q.931 recommends 2 minutes, but
that is a little long and libpri layer 2 is being stupid) and the
restart attempt limit to 3 (instead of 2).

Periodically send RESTART on idle b-channels in PTP NT mode.
Default interval is 15 minutes, feature can be disabled by setting
"idle_restart_interval" to 0 in the span configuration.

Allow timeout / interval values to have an additional time unit
suffix for convenience reasons, the default (no unit specified)
is milliseconds, valid units include:

	w (week), d (day), h (hour), m (minute), s (second)

Only full integers are accepted, no fractional numbers, valid examples:

	2w   = two weeks
	37m  = 37 minutes
	1h   = 1 hour

Combinations of multiple numbers and units (e.g. "1w5d") are not supported.

New span configuration parameters:

	idle_restart_interval		(milliseconds / time unit suffix /
					 0 = disabled)

	t316 / restart_timeout		(milliseconds / time unit suffix)
	t316_limit / restart_attempts	(number of max. attempts)

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-09-05 00:42:32 +02:00
Stefan Knoblich 1a47eb933b ftmod_libpri: Reset timer parameters in lpwrap_run_expired() before invoking the callback.
Allowing us to restart the timer from the callback with lpwrap_start_timer().

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-09-05 00:42:32 +02:00
Anthony Minessale ff3631b474 sigh 2012-09-04 11:13:52 -05:00
Anthony Minessale 07684b2dcb forgot one 2012-09-04 11:13:52 -05:00
Anthony Minessale 52f98724c0 make tiff work on older automistake 2012-09-04 11:01:36 -05:00
Anthony Minessale fbdc05d030 fix build (need make spandsp-reconf) 2012-09-04 11:03:53 -05:00
Jeff Lenk 8c9ddd95ed tiff add missing file required by makefile.am 2012-09-03 22:39:25 -05:00
David Yat Sin 3a57b0bed6 Merge remote branch 'fsorig/master' into nfas
Conflicts:
	libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_cntrl.c
	libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
2012-09-03 22:34:13 -04:00
David Yat Sin b0f6e0384d freetdm - ISDN:Fix for invalidating logical span id = 0 for nfas 2012-09-03 22:26:03 -04:00
Steve Underwood 12b5bde226 Merge branch 'master' of git.freeswitch.org:freeswitch 2012-09-04 08:59:43 +08:00
Steve Underwood 7c6f6e306c Added a free space function to the T.31 modem in spandsp, so the app doesn't
need to probe around inside the modem.
2012-09-04 08:58:43 +08:00
Stefan Knoblich f012b7abf8 ftmod_libpri: Major rework of runtime thread, lpwrap event loop, restart b-channel handling and some new features.
Add per b-channel private data (ftdm_libpri_b_data_t), move the q.931 libpri
call pointer into it and use channel->call_data to make it accessible.

Use ftdm_channel_wait() instead of select() to wait for I/O events on
the D-Channel and rewrite the timeout handling, adding support for custom
timers that can be added to the b-channel private data and started/stopped
with lpwrap_timer_start()/_stop().

The (sorted) list of active lpwrap timers is protected by the timer_mutex,
which is initialized in the now unified lpwrap_init_pri() (see below) and
destroyed in the new lpwrap_destroy_pri() function.

Unify lpwrap_init_pri() and lpwrap_init_bri(). Use the span type to select
BRI/PRI and Point-to-Point vs. Multipoint settings.

Use the new custom lpwrap timer API to implement T302 (aka overlap receiving
digit timeout). The default T302 timeout is 3000 miliseconds and can be set
via the "digit_timeout" or "t302" span configuration parameter
(0 = disable timer, valid range = 3000 ... 30000 miliseconds).

The lpwrap_pri_init() changes made it neccessarry to rewrite the span runtime
thread event loop. The d-channel initialization and libpri event handler
registration have been moved out of the event loop. The b-channel restart
handling in the event loop has been left as-is, pending a further clean up in
the future.

Rename on_info() to on_information() and add a new on_keypad_digit() event
handler to convert incoming KEYPAD DIGIT messages to channel DTMF events
(only useful on BRI PTMP NT-mode).

The channel restart handling has been improved to distinguish between locally
triggered and restarts caused by the remote end (= incoming RESTART messages).
Restarts on the D-Channel now use pri_restart(), causing a Q.921 reset on
the span.

Large patch, i'd have loved to split this into smaller pieces and actually
test some of the bits more toroughly (restart handling), but some people
are f*cking annoying, so here it is.

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-09-03 20:35:48 +02:00
Steve Underwood f3cd4f41a0 Tweak 2012-09-03 14:39:44 +08:00
Steve Underwood 1790a8a97a Changed tiff-4.0.2 to demand autoconf 2.63 or later (which is common) rather
than 2.64 (which is currently a lot less common). This change seems to have
no negative effect, but allows builds to succeed on things like Centos.
2012-09-03 13:10:52 +08:00
Jeff Lenk e4e044e310 FS-4566 --resolve Show fs_cli banner in color(windows) 2012-09-02 21:57:20 -05:00
Steve Underwood 4d56c4c5f2 tiffconf.h is generated by a build, so it shouldn't have been put in the repo. 2012-09-03 07:52:08 +08:00
Steve Underwood cbb28e2ae0 Start introducing some meaningful TIFF/FX stuff 2012-09-02 22:10:04 +08:00
Steve Underwood 01646651ab Handle the TIFF/FX better now we have tiff-4.0.2 in the repo. 2012-09-02 21:45:08 +08:00
Steve Underwood b989f8d3eb The tiff-4.0.2 distribution's configure.ac seems to have two lines missing
AC_PROG_LIBTOOL
m4_include(m4/acinclude.m4)
Adding these and taking out all the Makefile.in files from the tiff-4.0.2
directory seems to sort out the build issues.
2012-09-02 14:38:13 +08:00
Steve Underwood 4ad110aa5b None of the tiff-4.0.2 Makefile.in files were added before, and it built OK for
me. That's not happening for everyone, so let's add them all, just like the
tiff-4.0.2 distribution package.
2012-09-02 12:55:09 +08:00
Jeff Lenk 3f64fe91cb windows fix for libtiff on last commit 2012-09-01 15:52:19 -05:00
Steve Underwood 92fea4a896 Those damn tiff-3.8.2 entries seem to be everywhere 2012-09-01 23:37:46 +08:00
Steve Underwood 495fd99d5d Patched the new libtiff-4.0.2 code to support TIFF/FX tags and the extra
compression and colour profile codes that go with them.
2012-09-01 21:50:47 +08:00
Steve Underwood d1ceeeb7f2 Added missing .update file for tiff-4.0.2
Hopefully made the last of the tiff-3.8.2 -> tiff-4.0.2 changes in the build files
2012-09-01 21:32:34 +08:00
Steve Underwood 1603dc70e2 This should have moved us from tiff-3.8.2 to tiff-4.0.2 . The windows builds
will need rechecking.
2012-09-01 18:45:56 +08:00
Steve Underwood a2b5af5669 Added tiff-4.0.2 as the first step in moving from libtiff 3.8.2 to libtiff 4.0.2 2012-09-01 17:59:43 +08:00
Kapil 4569bbec22 redmine task# 5692 fix, changing log level for link error cases 2012-08-31 11:54:24 -04:00
Steve Underwood 9a862b6667 More cleanups of the FAX modems 2012-08-29 10:10:13 +08:00
Anthony Minessale 7d38669801 fix wrong len in ESL sendMSG method 2012-08-28 12:04:50 -05:00
Steve Underwood 72c073c6cb Bring fax_modem handling in the fax_tester code into line with the upstream code 2012-08-28 15:32:00 +08:00
Steve Underwood 1b3710d5d0 This update brings the fax modem handling into line with the upstream code 2012-08-28 13:32:43 +08:00
Steve Underwood 11cc977391 More cleanups of fax modem stuff 2012-08-27 23:04:05 +08:00
Jeff Lenk 59e1d56cb5 spandsp windows build fix 2012-08-26 16:04:36 -05:00
Steve Underwood 2733e21cd5 More tweaks to spandsp 2012-08-27 00:41:19 +08:00
Steve Underwood e1be1639de Tweaks 2012-08-26 22:53:24 +08:00
Steve Underwood 0e4fb82ecf Tweaks 2012-08-26 22:18:26 +08:00
Steve Underwood acf7c40717 More tweaks 2012-08-26 22:07:01 +08:00
Steve Underwood 3b9dac029e Tweaks 2012-08-26 20:58:54 +08:00
Steve Underwood 124a0742d4 Tweaks 2012-08-26 20:45:49 +08:00
Steve Underwood fe5ac498f7 More tweaks 2012-08-26 20:39:33 +08:00
Steve Underwood dbec2dcbaf More tweaks 2012-08-26 20:28:48 +08:00
Steve Underwood 3b4aafe945 More tweaks 2012-08-26 20:24:20 +08:00
Steve Underwood e60d204a59 More tweaks 2012-08-26 20:11:39 +08:00
Steve Underwood 7f40c5fb41 More tweaks 2012-08-26 19:37:14 +08:00
Steve Underwood ac9656015a More fax modem tweaks 2012-08-26 19:30:42 +08:00
Steve Underwood 887c373c92 Tweaks 2012-08-26 18:12:44 +08:00
Steve Underwood 8cb975f345 Various fax_modems.c related improvements 2012-08-26 15:43:15 +08:00
Stefan Knoblich 7da8e15e96 FreeTDM: Remove oz{rename,replace}.sh scripts.
Remnants from the olden days of the big OpenZAP migration.

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-08-24 20:49:53 +02:00
Stefan Knoblich 5b499e8a59 ftmod_misdn: Use a per-span I/O thread to handle B-channel data.
Move the B-channel message handling into a per-span I/O thread,
to solve most of the problems caused by the intermixed data + control
socket interface of mISDN, missing write poll() support on
mISDN B-channels and the FreeTDM I/O model. This eliminates most of
the audio problems (except for a few minor glitches).

A unix stream socket pair is used as a bi-directional pipe replacement
(the pipe code is still included in this commit, but will be removed later),
with the RX and TX buffer sizes carefully tuned to avoid excessive buffering
(= latency) and a deadlock situation between the write() call in ftdm_write()
and the code in misdn_span_run() that needs a minimum amount of data in the
TX buffer, before sending out a PH_DATA_REQ to the mISDN socket
(see misdn_span_run() comments for more details).

The minimum size for pipes is PAGE_SIZE (4k), which is ~500 ms worth of
audio. A socket pair RX/TX buffer size of 3k, seems to hold a maximum
amount of around 500 bytes data in practice, giving us a much lower
maximum latency than a unix pipe. (The socket pair might be replaced by a
custom ring buffer / fifo data structure to get even more fine grained
control of the maximum latency.)

The newly introduced span_start / span_stop callbacks in
ftdm_io_interface_t are used to start / stop the I/O thread. The callback
functions will wait up to 10 seconds for the thread to successfully
start up or shut down (using a mutex + condition var).

NOTE: Using any of the locking ftdm_span_() functions in the I/O will cause
      a deadlock between the I/O thread (trying to lock span->mutex) and the
      thread calling ftdm_start()/_stop() (holding the span->mutex).
      (The I/O thread currently uses direct span member access to avoid this.)

The I/O thread uses the epoll(7) family of functions for event handling.
An epoll context is created on startup and all B-channel sockets are
registered (READ, PRI and ERR). Before entering the event loop,
the I/O thread will send a signal on the condition variable, to
indicate it has completed the startup procedure.

Incoming b-channel and command pipe events are handled by the event loop.
Payload of incoming PH_DATA_IND frames (= audio data) is sent to the
rx_audio_pipe_in end of the b-channel's socket pair and, if enough data is
available, a PH_DATA_REQ of the same size is sent to the b-channel mISDN socket
to transmit audio.

A MISDN_CMD_STOP command on the event pipe will wake up the I/O thread and
cause it to shut down. All b-channels will be unregistered from the epoll context
and the epoll fd closed. The I/O thread terminates itself after signalling the
successfull shutdown on the condition variable.

TODOs:
    - Move D-Channel into I/O thread too

    - Custom FIFO/ring buffer for data (even lower latency)

    - Improve epoll() code (per-channel struct w/ callback, for epfd.data.ptr)

    - Use mISDN DSP for audio (e.g. tone generator, dtmf detector, echo cancel)

    - Use a per-port / span control socket to execute channel commands
      synchronously, or add misdn_commands (queue?) that can be used that way

    - Name I/O threads 'mISDN-%SPAN_NAME%', e.g. 'mISDN-M_BRI1'
      (= add ftdm_thread_set_namef(thread, fmt, ...) / ftdm_thread_set_name(thread, name))

TL;DR: "tweak", solves "booboo" with audio

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-08-24 18:03:31 +02:00
Jeff Lenk 72d67cdbd8 FS-4219 --resolve 2012-08-24 08:24:18 -05:00
Stefan Knoblich a4216351c0 ftmod_libpri: Implement channel hunting in NT-mode.
Hunt for a free channel for incoming calls that do not
preselect a channel (pevent->ring.channel == -1).

Verify the preselected channel for calls that do specify a channel
and in case the channel is already taken, hunt for a free one,
or abort with an error message (if the preselection was exclusive).

TE-mode channel selection is the same as before
(there's still room for improvement, though, but i'll save that for later).

The MSN/DDI filter code is moved into the TE-mode section (only useful there).

The duplicate ring detection had to be reworked. We now store the
call reference (CRV) in caller_data->call_reference of the selected channel
and do a CRV -> channel look up with find_channel_by_cref()
at the top of on_ring().

NOTE: This is only lightly tested (NT/TE mode), i'd either have to
      write a lot of custom code to check it toroughly or the need for
      a scriptable ISDN stack...

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-08-24 00:36:34 +02:00
Stefan Knoblich 716f4c0675 ftmod_libpri: Check for '#' key to leave overlap receiving state.
Same as ftmod_isdn, '#' key ends overlap receive and moves the incoming
call to RING state.

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-08-23 22:26:49 +02:00
Kapil Gupta 917609df1b removing "raw_ftdm_chan_open" API as we have M2UA sig type 2012-08-23 10:59:21 -04:00
Steve Underwood fa5569caac A line got deleted somewhere along the line. I didn't do it, honest.
Its them damn gremlins.
2012-08-21 20:09:59 +08:00
Kapil Gupta 12e61692dd adding signaling FTDM_SIGTYPE_M2UA type 2012-08-17 19:05:12 -04:00
Jeff Lenk bdb73beb8e FS-4526 --resolve 2012-08-17 19:46:54 -05:00
Jeff Lenk 0807b39c8d FS-4543 --resolve thanks Peter 2012-08-17 19:31:47 -05:00
Steve Underwood e399c69765 Fixed a typo in the fixed point image translate code 2012-08-17 18:36:29 +08:00
Moises Silva f3160f9ecf freetdm: ss7 - Fix bug where TDM alarms are not delivered when the span is in M2UA mode 2012-08-16 19:08:34 -04:00
kapil 106e17f7a2 Merge branch 'nsg-4.3' of ssh://git.sangoma.com/smg_freeswitch into nsg-4.3 2012-08-16 16:43:00 -04:00
kapil 583bd7a811 Added debugging to confirm echo_cancel event works 2012-08-16 16:42:17 -04:00
Anthony Minessale f454b79b9b fix color coding to be OS appropriate 2012-08-16 13:04:33 -05:00
Nenad Corbic a24706aed6 Changed EC ENABLE/DISABLE failure from ERROR to WARNING.
As some installations have no ec. I will have to test
without ec and confirm that we handle that case gracefully.
2012-08-16 02:06:10 -04:00
Mathieu Rene e07d588d10 turn on echo cancellation and turn it off in mg_notify 2012-08-16 01:29:43 -04:00
Mathieu Rene a7d51f5f4f turn on echo cancellation and turn it off in mg_notify 2012-08-16 01:28:32 -04:00
Robert Jongbloed cd21b67c1d Updated mod_opal to latest stable OPAL version.
Enhancements to trace logging, include threads and context ID.

Changed default opal_conf.xml to allow more than just G.711 uLaw and not to clutter log file with debug logs.

Added to opal_conf.xml item for "disable-transcoding".

Updated build/buildopal.sh to use correct ./configure items for PTLib, allow for something other than standard install directory for PTLib/OPAL and be able to easily bind to a specific release of PTLib/OPAL.
2012-08-16 14:23:48 +10:00
Anthony Minessale bb69310259 FS-4079 FS-4540 please update to this version 2012-08-15 22:51:41 -05:00
Kapil Gupta fd39c5b44a renaming CONFIG_ERROR macro to LOAD_ERROR 2012-08-15 16:11:13 -04:00
Kapil Gupta 4f8e843610 adding code to check return type of "ftdm_start_span" API 2012-08-15 14:26:09 -04:00
Stefan Knoblich 548222f9f3 FreeTDM: Add span start/stop callbacks to ftdm_io_interface.
Callbacks are invoked from ftdm_span_start/_stop().
I/O is started before SIG and shut down in reverse order.

This is needed for ftmod_misdn, to move the mISDN message handling
into a separate thread (solving the mISDN socket vs. FreeTDM API issues).

With these callbacks, the I/O thread can be started after the span I/O configuration
has been (successfully) completed and stopped before destroying the span.

NOTE: Both SIG and I/O callbacks are called with the span mutex locked,
so threads created or destroyed synchronously in either of the custom
start/stop functions, can not use ftdm_span_*() functions that lock
the span mutex (e.g. ftdm_span_get_channel_count()).

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-08-15 13:34:22 +02:00
Stefan Knoblich 431f7dd6bf spandsp: Fix libjpeg checks for --enable-builtin-tiff builds.
The --enable-builtin-tiff option appends libs/tiff-3.8.2/libtiff/libtiff.la
to LIBS, causing the AC_CHECK_LIB([jpeg]...) check to fail, because
libtiff.la does not exist at configure time.

Temporarily store tiff and jpeg libs in TIFF_-/JPEG_LIBS variables and
append them to LIBS after all library checks have run.

Example error output:
    configure:20049: checking for jpeg_start_compress in -ljpeg
    configure:20074: cc -o conftest -O2 -pipe -fno-strict-aliasing    -L/usr/local/lib conftest.c -ljpeg  -lm  /usr/home/ports/net/freeswitch-core-devel/work/freeswitch-1.2.1/libs/tiff-3.8.2/libtiff/libtiff.la >&5
    cc: /usr/home/ports/net/freeswitch-core-devel/work/freeswitch-1.2.1/libs/tiff-3.8.2/libtiff/libtiff.la: No such file or directory

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-08-15 12:52:28 +02:00
Mathieu Rene bd84a23f51 set tdm pre buffer len to 200ms by default, and set it to 0 before fax calls 2012-08-14 16:22:31 -04:00
Steve Underwood 0b763a6286 Merge branch 'master' of git.freeswitch.org:freeswitch 2012-08-14 22:33:17 +08:00
Steve Underwood e30406cea6 Improvements to image translation 2012-08-14 22:32:30 +08:00
Jeff Lenk 3d9d42b798 FS-4517 --resolve 2012-08-13 21:31:46 -05:00
Jeff Lenk a293512f60 FS-4219 --resolve 2012-08-13 21:30:10 -05:00
Anthony Minessale fa5113557b stub for mod_html5 2012-08-13 15:20:41 -05:00
Anthony Minessale 61ab0b8878 libwebsocket inline configure 2012-08-13 14:29:04 -05:00
Anthony Minessale a05e414c41 fix libwebsocket build 2012-08-13 14:15:06 -05:00
Steve Underwood 5f12c3dc1c Improvements to T.4 end of image handling, and the related tests.
A lot of tiny tidy up edits
2012-08-12 22:11:06 +08:00
Steve Underwood e69a5a3037 Various little tweaks
A bug in end of image handling fixed, which could mean some T.85 images would
screw up.
2012-08-11 18:32:00 +08:00
Stefan Knoblich 2ad2b6d31b ftmod_isdn: Avoid stack smashing buffer overflow in isdn_tones_run().
The len variable can, in certain situations (large burst of incoming non-SLIN audio),
exceed the size of the on-stack frame buffer, which causes ftdm_buffer_read_loop() to
overwrite the dt_buffer pointer.

Use ftdm_min() to make sure len (after conversion to SLIN units) isn't larger
than the frame buffer size.

Also adds are couple more code comments.

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-08-10 17:16:05 +02:00
Stefan Knoblich 036063d2a9 mod_freetdm: Fix typo.
Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
2012-08-10 17:16:05 +02:00
Jeff Lenk 659c06d356 FS-4219 -- resolve windows version string. thanks Peter 2012-08-10 07:47:10 -05:00
Jeff Lenk 6e8736bb06 FS-4504 vs2008 pro still need express 2012-08-09 13:42:21 -05:00
Steve Underwood d3c89bae34 Fixed a misplaced #endif that only causes trouble when you hit the right
combination
2012-08-09 22:19:49 +08:00
Steve Underwood d1b45ae65b A couple of typos in spandsp
Improvements to image flattening in spandsp's image translate code
2012-08-09 21:58:22 +08:00
Jeff Lenk 3389f32363 FS-4504 - tweak 2012-08-08 21:29:06 -05:00
Jeff Lenk e9ce6ae0e9 FS-4504 vs2010 only - plus mod_sofia fix - anybody want to help with 2008 2012-08-08 21:18:06 -05:00