The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
ChangeLog 0416
Changes 7140
Documentation/README 94
Examples/chkshares.pl 33
INSTALL 089
LICENSE 3450
MANIFEST 12049
META.json 950
META.yml 6413
Makefile.PL 1118
README 160
debian/changelog 170
debian/control 130
debian/copyright 180
debian/rules 680
htdocs/Images/Button1.gif --
htdocs/Images/Button2.gif --
htdocs/Images/bg.jpg --
htdocs/Images/bg2.jpg --
htdocs/Images/logo_big1.gif --
htdocs/Images/logo_medium1.gif --
htdocs/Images/logo_small1.gif --
htdocs/Images/logo_small2.gif --
htdocs/Stylesheet.css 240
htdocs/developer.html 1180
htdocs/discussion.html 830
htdocs/documentation.html 750
htdocs/download.html 1050
htdocs/index.html 1850
htdocs/tpj/finance-quote-example 760
htdocs/tpj/finance-quote-sidebar 360
htdocs/tpj/finance-quote.txt 4650
lib/Finance/Quote/AEX.pm 114575
lib/Finance/Quote/AIAHK.pm 77
lib/Finance/Quote/ASEGR.pm 1618
lib/Finance/Quote/ASX.pm 9281
lib/Finance/Quote/BMONesbittBurns.pm 2930
lib/Finance/Quote/BSERO.pm 1830
lib/Finance/Quote/Bourso.pm 262325
lib/Finance/Quote/CSE.pm 1720
lib/Finance/Quote/Cdnfundlibrary.pm 67
lib/Finance/Quote/Citywire.pm 3980
lib/Finance/Quote/Cominvest.pm 1700
lib/Finance/Quote/Currencies.pm 3650
lib/Finance/Quote/DWS.pm 192102
lib/Finance/Quote/Deka.pm 34
lib/Finance/Quote/FTPortfolios.pm 99
lib/Finance/Quote/FTfunds.pm 3940
lib/Finance/Quote/Fidelity.pm 55
lib/Finance/Quote/FinanceCanada.pm 45
lib/Finance/Quote/Finanzpartner.pm 1150
lib/Finance/Quote/Fool.pm 44
lib/Finance/Quote/GoldMoney.pm 2640
lib/Finance/Quote/HEX.pm 33
lib/Finance/Quote/HU.pm 2490
lib/Finance/Quote/IndiaMutual.pm 3934
lib/Finance/Quote/LeRevenu.pm 3638
lib/Finance/Quote/MStaruk.pm 3130
lib/Finance/Quote/ManInvestments.pm 55
lib/Finance/Quote/Morningstar.pm 1180
lib/Finance/Quote/MorningstarJP.pm 2020
lib/Finance/Quote/MtGox.pm 2730
lib/Finance/Quote/NZX.pm 35
lib/Finance/Quote/Platinum.pm 66
lib/Finance/Quote/SEB.pm 53
lib/Finance/Quote/SIXfunds.pm 660
lib/Finance/Quote/SIXshares.pm 660
lib/Finance/Quote/StockHouseCanada.pm 12973
lib/Finance/Quote/TNetuk.pm 4200
lib/Finance/Quote/TSP.pm 5621
lib/Finance/Quote/TSX.pm 2170
lib/Finance/Quote/Tdefunds.pm 54
lib/Finance/Quote/Tdwaterhouse.pm 44
lib/Finance/Quote/Tiaacref.pm 1109298
lib/Finance/Quote/Troweprice.pm 44
lib/Finance/Quote/Trustnet.pm 1212
lib/Finance/Quote/USFedBonds.pm 11
lib/Finance/Quote/Union.pm 39
lib/Finance/Quote/UserAgent.pm 43
lib/Finance/Quote/VWD.pm 143100
lib/Finance/Quote/Yahoo/Asia.pm 33
lib/Finance/Quote/Yahoo/Australia.pm 33
lib/Finance/Quote/Yahoo/Base.pm 5527
lib/Finance/Quote/Yahoo/Brasil.pm 44
lib/Finance/Quote/Yahoo/Europe.pm 326
lib/Finance/Quote/Yahoo/NZ.pm 44
lib/Finance/Quote/Yahoo/USA.pm 33
lib/Finance/Quote/YahooJSON.pm 1850
lib/Finance/Quote/ZA.pm 12576
lib/Finance/Quote/ZA_UnitTrusts.pm 1640
lib/Finance/Quote.pm 598345
t/00-use.t 880
t/01-pod.t 110
t/02-pod-coverage.t 120
t/03-kwalitee.t 110
t/04-critic.t 170
t/05-data-dumper.t 200
t/aex.t 450
t/aiahk.t 470
t/asegr.t 480
t/asx.t 670
t/bmonesbittburns.t 520
t/bourso.t 870
t/bsero.t 480
t/cdnfundlibrary.t 350
t/citywire.t 320
t/cominvest.t 350
t/cse.t 390
t/currencies.t 200
t/currency.t 520
t/currency_lookup.t 560
t/deka.t 420
t/dws.t 330
t/fidelity.t 440
t/financecanada.t 360
t/finanzpartner.t 330
t/ftfunds.t 320
t/ftportfolios.t 400
t/goldmoney.t 470
t/hex.t 360
t/hu.t 670
t/indiamutual.t 370
t/lerevenu.t 500
t/maninvestments.t 390
t/morningstar.t 400
t/morningstarJP.t 520
t/mstaruk.t 320
t/mtgox.t 610
t/nzx.t 370
t/platinum.t 340
t/quote.t 530
t/release-pod-syntax.t 140
t/seb.t 340
t/sixfunds.t 360
t/sixshares.t 360
t/stockhousecanada.t 410
t/tdefunds.t 250
t/tdwaterhouse.t 390
t/tiaacref.t 610
t/tnetuk.t 320
t/troweprice.t 430
t/trustnet.t 400
t/tsp.t 560
t/tsx.t 490
t/ukfunds.t 320
t/union.t 350
t/usfedbonds.t 630
t/vanguard.t 360
t/vwd.t 530
t/yahoo.t 420
t/yahoo_asia.t 370
t/yahoo_australia.t 460
t/yahoo_brasil.t 400
t/yahoo_europe.t 1050
t/yahoo_nz.t 370
t/yahoojson.t 620
t/za.t 440
t/za_unittrusts.t 430
test/Use.t 089
test/aex.t 061
test/aiahk.t 039
test/asegr.t 044
test/asx.t 040
test/bmonesbittburns.t 048
test/bourso.t 045
test/cdnfundlibrary.t 031
test/currency.t 034
test/deka.t 034
test/dws.t 029
test/fidelity.t 040
test/financecanada.t 032
test/ftportfolios.t 033
test/hex.t 032
test/indiamutual.t 033
test/lerevenu.t 046
test/maninvestments.t 031
test/nzx.t 031
test/platinum.t 031
test/seb.t 031
test/stockhousecanada.t 035
test/tdefunds.t 021
test/tdwaterhouse.t 035
test/tiaacref.t 052
test/troweprice.t 039
test/trustnet.t 037
test/tsp.t 052
test/union.t 031
test/usfedbonds.t 047
test/vanguard.t 032
test/vwd.t 029
test/yahoo.t 038
test/yahoo_asia.t 034
test/yahoo_australia.t 034
test/yahoo_brasil.t 037
test/yahoo_europe.t 066
test/yahoo_nz.t 034
test/za.t 038
197 files changed (This is a version diff) 130794373
@@ -0,0 +1,416 @@
+2007-01-07  David Hampton  <hampton@employees.org>
+
+	* CVSTAG: finance_quote_1_13
+
+	* lib/Finance/Quote.pm: Update version to 1.13.
+
+	* lib/Finance/Quote.pm: Update the store_date() function for the
+	case when the year isn't explicitly stated.  If the specified
+	month would put the quote in the future, then consider this a
+	quite from last year.  manly intended to handle the rollover from
+	December to January on web sites that don't specify the year.
+	Suggestion from Christian Lupien.
+
+	* lib/Finance/Quote/BMONesbittBurns.pm: Enhance module to support
+	mutual fund quotes (which have less data than stock quotes).
+	Correct date format parsing.  Fix from Christian Lupien <lupien at
+	users.sourceforge.net>.
+
+	* lib/Finance/Quote/StockHouseCanada.pm: The fund name seems to be
+	a moving target. Search all tables of depth one looking for it.
+
+2007-01-01  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/FTPortfolios.pm: Rewrite this module for the
+	new web site design.
+
+	* lib/Finance/Quote/TSP.pm: Strip spaces around the dollar values.
+
+	* lib/Finance/Quote/FinanceCanada.pm: Rewrite this module for the
+	new web site design.
+
+	* test/*.t: Some restructuring of tests.  Add a couple more tests
+	on dates.  Replace a couple of test stocks that are no longer
+	valid.
+
+	* test/*.t: Accept last year as a valid date.  Comes in hand when
+	testing modules at the start of the new year.
+
+	* lib/Finance/Quote/ZA.pm: Update for changes in the display of
+	the web site.
+
+2006-12-31  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/StockHouseCanada.pm:
+	* test/stockhousecanada.t: New module for getting Canadian Mutual
+	fund quotes from Chris Carton <ctcarton@gmail.com>.
+
+	* lib/Finance/Quote/Deka.pm: Update for changes in the display
+	of the web site.  Now uses an https url.
+
+	* lib/Finance/Quote/LeRevenu.pm: Updates from Dominique Corbex for
+	changes in the display of the web site.
+
+	* lib/Finance/Quote/Trustnet.pm: Update for changes in the display
+	of the web site.
+
+2006-09-11  David Hampton  <hampton@employees.org>
+
+	* Move AIA.pm to AIAHK.pm since AIA has sites in multiple
+	countries.
+
+2006-09-10  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/AIA.pm:
+	* test/aia.pm: New module to access American International
+	Assurance fund information.  Based on perl script from Wouter van
+	Marle <wouter@squirrel-systems.com>.
+
+	* lib/Finance/Quote/Bourso.pm: Update the URL to track changes on
+	the web site.
+
+2006-07-10  David Hampton  <hampton@cisco.com>
+
+	* lib/Finance/Quote.pm: Update version to 1.12.
+
+	* CVSTAG: finance_quote_1_12
+
+2006-06-27  David Hampton  <hampton@employees.org>
+
+	* Makefile.PL: State the dependency on Crypt::SSLeay that several
+	modules now have.
+
+	* lib/Finance/Quote/Yahoo/Base.pm: Don't set fields that are
+	defined but are empty..
+
+	* test/yahoo_brasil.t: Update the test module to have more cases
+	and use better stocks.
+
+	* lib/Finance/Quote/Yahoo/Brasil.pm: Update for the change of the
+	data separator from a semicolon to a comma.
+
+	* test/financecanada.t:
+	* test/hex.t: Add new test cases to cover the last untested
+	modules. All modules are now tested.
+
+	* lib/Finance/Quote/FinanceCanada.pm: Don't set the success flag
+	if the lookup failed.
+
+	* lib/Finance/Quote/Platinum.pm: Use the new url of the pricing
+	information.
+
+	* lib/Finance/Quote/ManInvestments.pm: Update for the new table
+	format on the web site.
+
+	* test/indiamutual.t:
+	* test/aex.t: Update the test cases to use currently listed funds.
+
+	* lib/Finance/Quote/ManInvestments.pm: The url for updating
+	quotes has changed, as has the table header.
+
+	* lib/Finance/Quote/Bourso.pm:
+	* lib/Finance/Quote/LeRevenu.pm:
+	* test/bourso.t:
+	* test/lerevenu.t: Updated modules from Dominique Corbex
+	<domcox@sourceforge.net>. The name field now returns the real name
+	and not ticker symbols, and other small fixes.
+
+2006-04-08  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/Trustnet.pm: Work around the fact that gnucash
+	escapes the ampersand character when passing stock names to F::Q.
+
+	* lib/Finance/Quote/DWS.pm: Updated module from Klaus Dahlke
+	<klaus.dahlke@gmx.de> to retrieve quotes from the new DWS web
+	page.
+
+	* lib/Finance/Quote/Tiaacref.pm: Explicitly state in the code that
+	this module requires ssl support (it uses an https:// url).  This
+	prevents perl from trying to run the code when ssl support isn't
+	present.
+
+	* lib/Finance/Quote.pm:
+	* lib/Finance/Quote/HEX.pm: 
+	* test/hex.t: New module from Mika Laari
+	<mikalaari@users.sourceforge.net> to fetch quote information from
+	the Helsinki stock exchange.
+
+	* Documentation/Hackers-Guide: Add a section on the q->store_date()
+	function.  All modules should use this function to set the 'date'
+	and 'isodate' fields based on the retrieved textual date (or lack
+	thereof).
+	
+	* test/lerevenu.t: Test the right module.
+
+2006-04-07  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote.pm:
+	* lib/Finance/Quote/LeRevenu.pm:
+	* test/lefrevenu.t: New module from Dominique Corbex
+	<domcox@sourceforge.net> to fetch information from the
+	LeRevenu.com site in France.
+
+	* t/yahoo_europe.t: New test cases for non-GBP London exchange
+	stocks.  Use new stock for test of the XETRA exchange.  (Can't
+	find a non-Euro stock there, so remove those tests.)
+
+	* lib/Finance/Quote/Yahoo/Base.pm: Patch from p1n0@sourceforge.net
+	to only divide London exchange values by 100 if they are
+	denominated in pence.
+
+2006-04-06  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote.pm:
+	* lib/Finance/Quote/Bourso.pm:
+	* test/bourso.t: New module from Dominique Corbex
+	<domcox@sourceforge.net> to fetch information from the "Paris
+	Stock Exchange", http://www.boursorama.com.
+
+	* lib/Finance/Quote/VWD.pm: Updated module from Jörg Sommer that
+	is more tolerant of the advertising added to the web page.
+
+2006-01-11  David Hampton  <hampton@employees.org>
+
+	* CVSTAG: finance_quote_1_11
+	* lib/Finance/Quote.pm: Updated $VERSION to 1.01
+
+2006-01-10  David Hampton  <hampton@employees.org>
+
+	* test/dws.t: 
+	* test/maninvestments.t: 
+	* test/yahoo_brasil.t: Accept dates in both the previous and
+	current year as valid responses.
+
+	* test/aex.t: Change test currency to one still on the exchange.
+
+	* lib/Finance/Quote/VWD.pm: Jörg Sommer's patch to work better
+	with invalid WKNs and to extract the exchange information from its
+	new location.
+
+2005-11-18  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/AEX.pm: Use the store_date function.
+
+	* lib/Finance/Quote/ASX.pm:
+	* lib/Finance/Quote/Cdnfundlibrary.pm:
+	* lib/Finance/Quote/Platinum.pm:
+	* lib/Finance/Quote/Trustnet.pm:
+	* lib/Finance/Quote/Yahoo/Base.pm: Add code to protect against
+	empty tables, data fields, etc.
+
+	* test/aex.t: Correct the number of test cases.  Changed test
+	stock to one that is still on the exchange.  Site no longer
+	provides time (date only) so remove tests for time of quote.
+	Futures quotes don't always have bid/ask values so comment out
+	those tests.
+	
+	* test/indiamutual.t:
+	* test/trustnet.t:
+	* test/union.t:
+	* test/yahoo.t: Changed test stock to one that is still on the
+	exchange.
+	
+	* test/yahoo_brasil.t: All returned prices (for all stocks I
+	tried) return a price of zero, so comment out the test for
+	non-zero.
+
+2005-10-23  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/VWD.pm: Put back the call to the
+	HTML::TableExtract first_table_state_found() function for now.  At
+	some point this should be removed and the 2.0 version of
+	HTML::TableExtract required.
+
+	* lib/Finance/Quote.pm: Make note of an alternate yahoo URL that
+	can be used to obtain currency quotes. From Gerry Barksdale <gbark
+	at barksys.com>.
+
+2005-10-22  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/Tiaacref.pm:
+	* test/tiaacref.t: Add Support for TIAA-CREF mutual funds from
+	Brandon <brandon2 at users.sourceforge.net>.
+
+	* lib/Finance/Quote/VWD.pm: Remove the thousands separator
+	character from quote values.
+
+	* lib/Finance/Quote/TSP.pm: 
+	* test/tsp.t: Frank Mori Hess's <fmhess at speakeasy.net> change
+	to add support for the TSP lifecycle L funds.
+
+	* ChangeLog: Archive pre-2005 data into a separate file.
+
+	* lib/Finance/Quote/Deka.pm: Add a new module to retrieve German
+	investment fund prices from Deka.  Module from Knut Franke
+	<Knut.Franke at gmx.de>
+
+	* lib/Finance/Quote/USFedBonds.pm: 
+	* test/usfedbonds.t: Add a new US Federal Bonds stock quote module
+	from Stephen Langenhoven <langenhoven at users.sourceforge.net>.
+
+2005-10-21  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote.pm: Updated to work with new Yahoo currency
+	conversion pages.
+
+	* lib/Finance/Quote/Tiaacref.pm: New URL from Kevin Foss.  Uses
+	https, so the Crypt::SSLeay module is now required for TIAA-CREF
+	quotes.
+
+	* lib/Finance/Quote/ZI.pm: Zürich Invest has been purchased by
+	Deutsche Bank and integrated into DWS.  The DWS.pm module should
+	now be used in place of the ZI.pm module.
+
+	* lib/Finance/Quote/VWD.pm: Patch from Rainer Dorsch to return the
+	current price as 'last'.  The HTML::TableExtract
+	first_table_state_found() function has been deprecated.  Accept
+	both the old and new values as correct answers.
+
+	* lib/Finance/Quote/ZA.pm:
+	* test/za.t: Add a new South African stock quote module from
+	Stephen Langenhoven <langenhoven at users.sourceforge.net>.
+	
+2005-08-10  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/VWD.pm: Handle invalid ISINs better. VWD
+	delivers a 404 error instead of a blank page.  Fix suggested by 
+	Uwe Simon <uwe.simon.koeln at t-online dot de>
+
+2005-07-04  Paul Fenwick  <pjf@cpan.org>
+
+	* lib/Finance/Quote.pm: Bumped $VERSION to 1.10, primarily
+	  to work around a problem with CPAN distributions.
+
+	* CVSTAG: finance_quote_1_10
+
+2005-06-29  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/VWD.pm: Updated module from Jörg Sommer
+	<joerg@alea.gnuu.de>.
+
+	* lib/Finance/Quote/cdnfundlibrary.pm: Changes inspired by
+	kalaleq@users.sourceforge.net allow retrieval of more data.
+
+	* lib/Finance/Quote.pm:
+	* lib/Finance/Quote/Yahoo/NZ.pm: New module from Stephen Judd
+	<saniac@users.sourceforge.net>.
+
+	* lib/Finance/Quote/NZX.pm: Tweak to allow both NZX and Yahoo:NZ
+	to get quotes for New Zealand Stocks (use method nz).
+
+	* CVSTAG: finance_quote_1_09
+
+2005-05-30  Paul Fenwick  <pjf@cpan.org>
+
+	* MANIFEST: Updated with files intended for distribution.
+
+	* lib/Finance/Quote.pm: Updated $VERSION to 1.09
+
+	* CVSTAG: Updated finance_quote_1_09 tag on MANIFEST and
+	  lib/Finace/Quote.pm
+
+	* Released updated version 1.09 with new MANIFEST and Quote.pm
+	  to Sourceforge.
+
+	* lib/Finance/Quote/VWD.pm: Re-enabled $VERSION and bumped
+	  to 1.01 to allow correct indexing on CPAN, however the
+	  older version currently remains in the 1.09 release.
+
+2005-05-04  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/FTPortfolios.pm: Update for changes in the
+	website.
+
+	* t/ftportfolios.t: New test module.
+
+	* TSP.pm: Replace core parsing with tighter code.  Support the
+	symbols used by both Frank Mori Hess' and Trent Piepho's TSP
+	modules.  Make the symbols case insensitive.
+
+	* lib/Finance/Quote/Cdnfundlibrary.pm: Find table by headers
+	instead of by index.
+
+	* test/asegr.t: New module
+	* lib/Finance/Quote/ASEGR.pm: New module
+
+	* lib/Finance/Quote/ASX.pm: Skip any blank lines in the table.
+	Pass an extra parameter to TableExtract to keep it from doing
+	unnecessary work that produces warnings.
+
+2005-03-19  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/Trustnet.pm: Encode the '&' character before
+	calling the user agent GET function.  Fixes bug 747080.
+
+2005-03-19  David Hampton  <hampton@employees.org>
+
+	* almost all files: Collapsed all date parsing code into a single
+	function.  This function handles the date formats provided by all
+	current quote sources and converts them all into the F::Q standard
+	of a US date format.  It also adds an ISO format date to all
+	quotes in the new isodate field.  Added lots of test functions to
+	check date formats.
+
+
+2005-03-19  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/AEX.pm: Spelling correcting from Frank Mori
+	Hess.
+
+	* lib/Finance/Quote.pm: Documentation correction from Trent
+	Piepho.
+	
+	* lib/Finance/Quote/Yahoo/Base.pm (yahoo_request): Fix an
+	undefined reference when Yahoo ocassionally returns an empty
+	field.
+
+2005-03-01  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote.pm: New modules.  New function to parse files
+	separated by semicolons instead of commas.
+
+	* lib/Finance/Quote/AEX.pm: Worked over modules from Johan van
+	Oostrum.  Most of the old AEX data has migrated elsewhere.
+
+	* lib/Finance/Quote/ASX.pm:
+	* lib/Finance/Quote/Trustnet.pm: Got the modules working again.
+	
+	* lib/Finance/Quote/ManInvestments.pm:
+	* lib/Finance/Quote/Platinum.pm: New modules for Australian
+	investment price sources from Ian Dall <iandall at
+	users.sourceforge.net>.
+
+	* lib/Finance/Quote/NZX.pm: New modules for fetching quotes the
+	from the New Zealand stock exchange. Provided by Michael Curtis.
+	
+	* lib/Finance/Quote/SEB.pm: New modules for fetching quotes from
+	the Swedish Bank.  Submitted by Tomas Carlsson.
+	
+	* lib/Finance/Quote/TSP.pm: New modules for fetching quotes from
+	the US Govt. Thrift Service Plan.  Submitted by Frank Mori Hess.
+
+	* lib/Finance/Quote/Yahoo/Base.pm: Corrected currency tags for Vienna and Valence.  
+
+	* lib/Finance/Quote/Yahoo/Brasil.pm: Add new Yahoo Brasil module
+	from Ismael Orenstein <perdig at users.sourceforge.net>.
+
+	* t/*: Various new test modules.
+	
+2005-02-09  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/Fidelity.pm:
+	* lib/Finance/Quote/Union.pm: Got the modules working again.
+	
+	* lib/Finance/Quote/Yahoo/Base.pm: Extract the currency directly
+	from Yahoo, instead of looking it up in an exchange/currency
+	mapping table.
+
+	* t/*: Various new test and updated modules.
+	
+2005-02-06  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/BMONesbittBurns.pm: Got the modules working again.
+
+2005-01-14  David Hampton  <hampton@employees.org>
+
+	* lib/Finance/Quote/Cdnfundlibrary.pm: Got the module working again.
@@ -1,714 +0,0 @@
-1.37      2015-02-01 20:24:32+01:00 Europe/Brussels
-        * modified 00-use.t to show more info
-        * Remove Crypt::SSLeay dependency in favor of LWP::Protocol::https (Geert Janssens)
-        * Updated HU.pm and test file to current website (Kristof Marussy)
-
-1.36      2015-01-31
-        * MorningstarJP : changed dependency from Date::Calc to DateTime
-
-1.35      2014-06-17 08:06:14+02:00 Europe/Brussels
-        * BUGFIX: VWD - currency returned.
-
-1.34      2014-06-15 21:30:03+02:00 Europe/Brussels
-        * VWD adapted to recent website change.
-
-1.33      2014-06-01 11:24:24+02:00 Europe/Brussels
-        * BUGFIX: yahoo_json never returns currency. so don't set a default.
-                  yahoo_json returned current timestamp instead of quote date.
-
-1.32      2014-05-18 21:55:12+02:00 Europe/Brussels
-        * return "symbol" for yahoo_json module
-        * allow to retrieve ISIN codes with VWD module
-
-1.31      2014-05-04 22:56:45+02:00 Europe/Brussels
-        * Case mismatch in ZA_UnitTrusts pod
-
-1.30      2014-05-04 21:56:34+02:00 Europe/Brussels
-        * Bourso.pm works on current website changes. Thanks to Guillaume
-        * New module CSE.pm by Hiranya Samarasekera. Covers Colombo Stock
-          Exchange (CSE) in Sri Lanka.
-
-1.29      2014-04-08 08:28:25+02:00 Europe/Brussels
-        * New module za_unittrusts. kudos to Rolf Endres.
-	* Indiamutual patched to current website. kudos to Vinay S Shastry.
-
-1.28      2014-03-16 12:05:19+01:00 Europe/Brussels
-
-        * Removed some unnecessary dependencies
-
-1.27      2014-03-05 15:04:22+01:00 Europe/Brussels
-
-        * New module YahooJSON added (Abhijit Kshirsagar)
-        * mtgox.t should not create errors when ONLINE_TEST is not defined
-
-1.26      2014-03-03 22:24:58+01:00 Europe/Brussels
-
-        * VWD adapted to current website (skaringa)
-        * Boursorama module mostly fixed (Arnaud Gardelein)
-
-1.25      2014-03-02 23:18:23+01:00 Europe/Brussels
-
-        * AEX.pm : Some checking added. Not working yet
-        * Quote.pm : readded sub parse_csv_semicolon.
-
-1.24      2014-03-02 21:39:00+01:00 Europe/Brussels
-
-        * Added module Citywire.pm written by Martin Sadler
-        * Added module FTfunds.pm written by Martin Sadler
-        * Added module MStaruk.pm written by Martin Sadler
-        * Added module TNetuk.pm written by Martin Sadler
-        * Data::Dumper is no more required to build
-
-1.23_02   2014-03-02 14:46:41+01:00 Europe/Brussels (TRIAL RELEASE)
-
-        TEST RELEASE
-
-1.22      2014-03-02 10:38:18+01:00 Europe/Brussels (TRIAL RELEASE)
-
-        TEST RELEASE
-
-1.21      2014-03-02 09:56:38+01:00 Europe/Brussels (TRIAL RELEASE)
-
-        * ASX.pm now supports querying more than 10 symbols (goodvibes2)
-        * Travis config added for automated test build
-        * BUILD: Updated to use Dist::Zilla
-
-2014-02-17  Erik Colson <eco@ecocode.net>
-
-	* INSTALLATION FIX: Install Date::Calc as dependency
-
-2014-02-16  Erik Colson <eco@ecocode.net>
-
-	* MtGox support added by Sam Morris
-	* MorningstarJP support added by Christopher Hill
-	* Yahoo modules changed due to site change
-
-2010-02-16  Erik Colson <eco@ecocode.net>
-
-	* TSP.pm updated. Patch from Kevin Ryde.
-	* YAHOO/Base.pm added conversion from 'B' billions to
-	                numbers. Patch from Kevin Ryde.
-	* Billions support moved to Quote.pm
-
-2009-10-05  Erik Colson <eco@ecocode.net>
-
-	* Lots of tests added
-
-2009-10-04  Erik Colson <eco@ecocode.net>
-
-	* IndiaMutual.t tests added
-	* Yahoo_europe: Bug 44245 solved. Wrong fields returned.
-	* Documentation: Bug 48818 corrected.
-
-2009-10-03  Erik Colson <eco@ecocode.net>
-
-	* yahoo_europe.t tests corrected
-
-2009-09-30  Erik Colson <eco@ecocode.net>
-
-	* Bourso.t tests corrected
-
-2009-09-29  Erik Colson <eco@ecocode.net>
-
-	* AEX.pm removed code for options and futures. (didn't work)
-
-2009-07-19  Erik Colson <eco@ecocode.net>
-
-	* Bug in Yahoo::Base corrected. Sometimes year range is wrongly returned.
-
-2009-07-19  Giles Robertson
-
-	* Bug in Yahoo::Base corrected. GBp wrongly interpreted.
-
-2009-07-19  Stephan Ebelt
-
-	* Goldmoney.pm patched. support for platinum added.
-
-2009-07-18  Zoltan Levardy <zoltan@levardy.org>
-
-	* New module HU.pm (Hungarian stocks)
-
-2009-06-14  Divakar Ramachandran
-
-	* Bug RT 46155 solved by modifying link in IndiaMutual.pm
-
-2009-06-14  Stephan Ebelt
-
-	* Cominvest URL modified
-
-2009-06-14  Erik Colson <eco@ecocode.net>
-
-	* currencies adapted to yahoo denomination
-
-2009-06-13  Sattvik
-
-	* currency retrieval updated (yahoo website changed)
-
-2009-04-27  Bradley Dean <bjdean@bjdean.id.au>
-
-	* ASX.pm updated due to website change
-
-2009-04-13  Erik Colson <eco@ecocode.net>
-
-	* Release 1.16
-
-2009-04-12  Erik Colson <eco@ecocode.net>
-
-	* BUGFIX: Bourso.pm allmost completely rewritten due to website change.
-	* BUGFIX: Morningstar.pm patched by Fredrik Persson.
-	* BUGFIX: AEX.pm patched by Herman van Rink.
-
-2009-03-19  Erik Colson <eco@ecocode.net>
-
-	* BUGFIX: 12:XXpm formatted time handling.
-
-2009-03-04  Erik Colson <eco@ecocode.net>
-
-	* RENAMED ITE is now RZR
-
-2009-03-02  Erik Colson <eco@ecocode.net>
-
-	* BUGFIX: ZA.pm patched.
-
-2009-03-01  Erik Colson <eco@ecocode.net>
-
-	* BUGFIX: Stephen Ebelt patch applied for goldmoney.pm
-	* BUGFIX: Encoding problem solved by Ashwin
-
-2009-02-16  Bradley Dean <bjdean@bjdean.id.au>
-
-	* NEW: Function fetch_live_currencies.
-
-2009-02-15  Bradley Dean <bjdean@bjdean.id.au>
-
-	* NEW: Module Finance::Quote::Currencies created for use in
-          currency_lookup.
-
-2008-12-05  Erik Colson <eco@ecocode.net>
-
-	* Finanzpartner module adapted to site updated. By Jan Wilamowius.
-	* Morningstar patched by Fredrik Persson.
-
-2008-11-09  Erik Colson <eco@ecocode.net>
-
-	* Bourso.pm updated due to website update. By Bernard Fuentes
-
-2008-10-26  Erik Colson <eco@ecocode.net>
-
-	* BUG correction : IndiaMutual.pm: symbol not set it module.
-	* Release 1.15
-
-2008-10-21  Erik Colson <eco@ecocode.net>
-
-        * BUG correction : function isoTime - make sure $hours and $mins are treated as numbers
-        * use sprintf in isoTime
-
-2008-10-15  Erik Colson <eco@ecocode.net>
-
-        * Release 1.14
-
-2008-10-13  Erik Colson <eco@ecocode.net>
-
-        * Finanzpartner.pm added by Jan Willamowius
-
-2008-10-12  Erik Colson <eco@ecocode.net>
-
-        * isoTime function added
-        * added quote.t
-        * yahoo time is now format using isoTime
-
-2008-10-11  Erik Colson <eco@ecocode.net>
-
-        * added prerequisite for HTML::TreeBuilder
-        * union.t from todo
-
-2008-10-10  Paul Fenwick <pjf@cpan.org>
-        * TEST: Ensure Data::Dumper is not accidently left in
-          F::Q code.
-
-2008-10-07  Erik Colson <eco@ecocode.net>
-
-        * Root README added
-        * BUGFIX: asx.t
-
-2008-10-05  Erik Colson <eco@ecocode.net>
-
-        * Added Cominvest module from Stephan Ebelt
-
-2008-10-04  Erik Colson <eco@ecocode.net>
-
-        * Failing tests moved to todo-state for trustnet, usfedbonds,
-          bourso, deka, union
-        * BUGFIX: currency.t
-        * BUGFIX: lerevenu.t - index ID corrected
-
-2008-10-02  Erik Colson <eco@ecocode.net>
-
-        * Failing tests moved to todo-state for ftportfolios, aiahk, nzx,
-          maninvestments.
-
-2008-09-30  Paul Fenwick <pjf@cpan.org>
-
-        * BUGFIX: Applied patch from Bill Carlson to fix Tiaacref.pm.
-          Thanks Bill, you rock!
-
-2008-09-28  Erik Colson <eco@ecocode.net>
-
-	* StockHouseCanada.pm updated to new site layout
-
-	* DWS.pm updated
-
-2008-09-27  Erik Colson <eco@ecocode.net>
-
-	* VWD.pm updated to new site layout
-
-	* TSX.pm added
-
-2008-09-27  Paul Fenwick  <pjf@cpan.org>
-
-        * DOCUMENTATION: Fixed malformed formatting in authors
-          email addresses in Fiannce/Quote.pm.
-
-2008-09-26  Erik Colson <eco@ecocode.net>
-
-	* AEX.pm updated to new site layout (comma used in numbers)
-
-2008-09-22  Paul Fenwick  <pjf@cpan.org>
-
-        * BUILD: Module::Install 0.77 is now used for building
-        and installation.  (PJF)
-
-        * TESTING: Finance::Quote's test system has been restructured.
-        Tests are now run during installation, but online and author
-        tests are skipped by default.  (PJF)
-
-2008-09-21  Erik Colson <eco@ecocode.net>
-
-	* lib/Finance/Quote/Yahoo/Brasil.pm: Enable semicolon.
-
-2007-05-13  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/SEB.pm: Patch from Henrik Riomar <henrik.riomar at
-	gmail.com> to fix a problem finding quotes for funds with the Swedish
-	chars åäö in the name.
-
-	* lib/Finance/Quote/IndiaMutual.pm: Patch from Devendra Gera <gera0ul
-	at yahoo.com> to remove white space when splitting the results in the
-	AMFI data file.
-
-2007-01-07  David Hampton  <hampton@employees.org>
-
-	* CVSTAG: finance_quote_1_13
-
-	* lib/Finance/Quote.pm: Update version to 1.13.
-
-	* lib/Finance/Quote.pm: Update the store_date() function for the
-	case when the year isn't explicitly stated.  If the specified
-	month would put the quote in the future, then consider this a
-	quite from last year.  manly intended to handle the rollover from
-	December to January on web sites that don't specify the year.
-	Suggestion from Christian Lupien.
-
-	* lib/Finance/Quote/BMONesbittBurns.pm: Enhance module to support
-	mutual fund quotes (which have less data than stock quotes).
-	Correct date format parsing.  Fix from Christian Lupien <lupien at
-	users.sourceforge.net>.
-
-	* lib/Finance/Quote/StockHouseCanada.pm: The fund name seems to be
-	a moving target. Search all tables of depth one looking for it.
-
-2007-01-01  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/FTPortfolios.pm: Rewrite this module for the
-	new web site design.
-
-	* lib/Finance/Quote/TSP.pm: Strip spaces around the dollar values.
-
-	* lib/Finance/Quote/FinanceCanada.pm: Rewrite this module for the
-	new web site design.
-
-	* test/*.t: Some restructuring of tests.  Add a couple more tests
-	on dates.  Replace a couple of test stocks that are no longer
-	valid.
-
-	* test/*.t: Accept last year as a valid date.  Comes in hand when
-	testing modules at the start of the new year.
-
-	* lib/Finance/Quote/ZA.pm: Update for changes in the display of
-	the web site.
-
-2006-12-31  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/StockHouseCanada.pm:
-	* test/stockhousecanada.t: New module for getting Canadian Mutual
-	fund quotes from Chris Carton <ctcarton@gmail.com>.
-
-	* lib/Finance/Quote/Deka.pm: Update for changes in the display
-	of the web site.  Now uses an https url.
-
-	* lib/Finance/Quote/LeRevenu.pm: Updates from Dominique Corbex for
-	changes in the display of the web site.
-
-	* lib/Finance/Quote/Trustnet.pm: Update for changes in the display
-	of the web site.
-
-2006-09-11  David Hampton  <hampton@employees.org>
-
-	* Move AIA.pm to AIAHK.pm since AIA has sites in multiple
-	countries.
-
-2006-09-10  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/AIA.pm:
-	* test/aia.pm: New module to access American International
-	Assurance fund information.  Based on perl script from Wouter van
-	Marle <wouter@squirrel-systems.com>.
-
-	* lib/Finance/Quote/Bourso.pm: Update the URL to track changes on
-	the web site.
-
-2006-07-10  David Hampton  <hampton@cisco.com>
-
-	* lib/Finance/Quote.pm: Update version to 1.12.
-
-	* CVSTAG: finance_quote_1_12
-
-2006-06-27  David Hampton  <hampton@employees.org>
-
-	* Makefile.PL: State the dependency on Crypt::SSLeay that several
-	modules now have.
-
-	* lib/Finance/Quote/Yahoo/Base.pm: Don't set fields that are
-	defined but are empty..
-
-	* test/yahoo_brasil.t: Update the test module to have more cases
-	and use better stocks.
-
-	* lib/Finance/Quote/Yahoo/Brasil.pm: Update for the change of the
-	data separator from a semicolon to a comma.
-
-	* test/financecanada.t:
-	* test/hex.t: Add new test cases to cover the last untested
-	modules. All modules are now tested.
-
-	* lib/Finance/Quote/FinanceCanada.pm: Don't set the success flag
-	if the lookup failed.
-
-	* lib/Finance/Quote/Platinum.pm: Use the new url of the pricing
-	information.
-
-	* lib/Finance/Quote/ManInvestments.pm: Update for the new table
-	format on the web site.
-
-	* test/indiamutual.t:
-	* test/aex.t: Update the test cases to use currently listed funds.
-
-	* lib/Finance/Quote/ManInvestments.pm: The url for updating
-	quotes has changed, as has the table header.
-
-	* lib/Finance/Quote/Bourso.pm:
-	* lib/Finance/Quote/LeRevenu.pm:
-	* test/bourso.t:
-	* test/lerevenu.t: Updated modules from Dominique Corbex
-	<domcox@sourceforge.net>. The name field now returns the real name
-	and not ticker symbols, and other small fixes.
-
-2006-04-08  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/Trustnet.pm: Work around the fact that gnucash
-	escapes the ampersand character when passing stock names to F::Q.
-
-	* lib/Finance/Quote/DWS.pm: Updated module from Klaus Dahlke
-	<klaus.dahlke@gmx.de> to retrieve quotes from the new DWS web
-	page.
-
-	* lib/Finance/Quote/Tiaacref.pm: Explicitly state in the code that
-	this module requires ssl support (it uses an https:// url).  This
-	prevents perl from trying to run the code when ssl support isn't
-	present.
-
-	* lib/Finance/Quote.pm:
-	* lib/Finance/Quote/HEX.pm:
-	* test/hex.t: New module from Mika Laari
-	<mikalaari@users.sourceforge.net> to fetch quote information from
-	the Helsinki stock exchange.
-
-	* Documentation/Hackers-Guide: Add a section on the q->store_date()
-	function.  All modules should use this function to set the 'date'
-	and 'isodate' fields based on the retrieved textual date (or lack
-	thereof).
-
-	* test/lerevenu.t: Test the right module.
-
-2006-04-07  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote.pm:
-	* lib/Finance/Quote/LeRevenu.pm:
-	* test/lefrevenu.t: New module from Dominique Corbex
-	<domcox@sourceforge.net> to fetch information from the
-	LeRevenu.com site in France.
-
-	* t/yahoo_europe.t: New test cases for non-GBP London exchange
-	stocks.  Use new stock for test of the XETRA exchange.  (Can't
-	find a non-Euro stock there, so remove those tests.)
-
-	* lib/Finance/Quote/Yahoo/Base.pm: Patch from p1n0@sourceforge.net
-	to only divide London exchange values by 100 if they are
-	denominated in pence.
-
-2006-04-06  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote.pm:
-	* lib/Finance/Quote/Bourso.pm:
-	* test/bourso.t: New module from Dominique Corbex
-	<domcox@sourceforge.net> to fetch information from the "Paris
-	Stock Exchange", http://www.boursorama.com.
-
-	* lib/Finance/Quote/VWD.pm: Updated module from Jörg Sommer that
-	is more tolerant of the advertising added to the web page.
-
-2006-01-11  David Hampton  <hampton@employees.org>
-
-	* CVSTAG: finance_quote_1_11
-	* lib/Finance/Quote.pm: Updated $VERSION to 1.01
-
-2006-01-10  David Hampton  <hampton@employees.org>
-
-	* test/dws.t:
-	* test/maninvestments.t:
-	* test/yahoo_brasil.t: Accept dates in both the previous and
-	current year as valid responses.
-
-	* test/aex.t: Change test currency to one still on the exchange.
-
-	* lib/Finance/Quote/VWD.pm: Jörg Sommer's patch to work better
-	with invalid WKNs and to extract the exchange information from its
-	new location.
-
-2005-11-18  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/AEX.pm: Use the store_date function.
-
-	* lib/Finance/Quote/ASX.pm:
-	* lib/Finance/Quote/Cdnfundlibrary.pm:
-	* lib/Finance/Quote/Platinum.pm:
-	* lib/Finance/Quote/Trustnet.pm:
-	* lib/Finance/Quote/Yahoo/Base.pm: Add code to protect against
-	empty tables, data fields, etc.
-
-	* test/aex.t: Correct the number of test cases.  Changed test
-	stock to one that is still on the exchange.  Site no longer
-	provides time (date only) so remove tests for time of quote.
-	Futures quotes don't always have bid/ask values so comment out
-	those tests.
-
-	* test/indiamutual.t:
-	* test/trustnet.t:
-	* test/union.t:
-	* test/yahoo.t: Changed test stock to one that is still on the
-	exchange.
-
-	* test/yahoo_brasil.t: All returned prices (for all stocks I
-	tried) return a price of zero, so comment out the test for
-	non-zero.
-
-2005-10-23  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/VWD.pm: Put back the call to the
-	HTML::TableExtract first_table_state_found() function for now.  At
-	some point this should be removed and the 2.0 version of
-	HTML::TableExtract required.
-
-	* lib/Finance/Quote.pm: Make note of an alternate yahoo URL that
-	can be used to obtain currency quotes. From Gerry Barksdale <gbark
-	at barksys.com>.
-
-2005-10-22  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/Tiaacref.pm:
-	* test/tiaacref.t: Add Support for TIAA-CREF mutual funds from
-	Brandon <brandon2 at users.sourceforge.net>.
-
-	* lib/Finance/Quote/VWD.pm: Remove the thousands separator
-	character from quote values.
-
-	* lib/Finance/Quote/TSP.pm:
-	* test/tsp.t: Frank Mori Hess's <fmhess at speakeasy.net> change
-	to add support for the TSP lifecycle L funds.
-
-	* ChangeLog: Archive pre-2005 data into a separate file.
-
-	* lib/Finance/Quote/Deka.pm: Add a new module to retrieve German
-	investment fund prices from Deka.  Module from Knut Franke
-	<Knut.Franke at gmx.de>
-
-	* lib/Finance/Quote/USFedBonds.pm:
-	* test/usfedbonds.t: Add a new US Federal Bonds stock quote module
-	from Stephen Langenhoven <langenhoven at users.sourceforge.net>.
-
-2005-10-21  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote.pm: Updated to work with new Yahoo currency
-	conversion pages.
-
-	* lib/Finance/Quote/Tiaacref.pm: New URL from Kevin Foss.  Uses
-	https, so the Crypt::SSLeay module is now required for TIAA-CREF
-	quotes.
-
-	* lib/Finance/Quote/ZI.pm: Zürich Invest has been purchased by
-	Deutsche Bank and integrated into DWS.  The DWS.pm module should
-	now be used in place of the ZI.pm module.
-
-	* lib/Finance/Quote/VWD.pm: Patch from Rainer Dorsch to return the
-	current price as 'last'.  The HTML::TableExtract
-	first_table_state_found() function has been deprecated.  Accept
-	both the old and new values as correct answers.
-
-	* lib/Finance/Quote/ZA.pm:
-	* test/za.t: Add a new South African stock quote module from
-	Stephen Langenhoven <langenhoven at users.sourceforge.net>.
-
-2005-08-10  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/VWD.pm: Handle invalid ISINs better. VWD
-	delivers a 404 error instead of a blank page.  Fix suggested by
-	Uwe Simon <uwe.simon.koeln at t-online dot de>
-
-2005-07-04  Paul Fenwick  <pjf@cpan.org>
-
-	* lib/Finance/Quote.pm: Bumped $VERSION to 1.10, primarily
-	  to work around a problem with CPAN distributions.
-
-	* CVSTAG: finance_quote_1_10
-
-2005-06-29  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/VWD.pm: Updated module from Jörg Sommer
-	<joerg@alea.gnuu.de>.
-
-	* lib/Finance/Quote/cdnfundlibrary.pm: Changes inspired by
-	kalaleq@users.sourceforge.net allow retrieval of more data.
-
-	* lib/Finance/Quote.pm:
-	* lib/Finance/Quote/Yahoo/NZ.pm: New module from Stephen Judd
-	<saniac@users.sourceforge.net>.
-
-	* lib/Finance/Quote/NZX.pm: Tweak to allow both NZX and Yahoo:NZ
-	to get quotes for New Zealand Stocks (use method nz).
-
-	* CVSTAG: finance_quote_1_09
-
-2005-05-30  Paul Fenwick  <pjf@cpan.org>
-
-	* MANIFEST: Updated with files intended for distribution.
-
-	* lib/Finance/Quote.pm: Updated $VERSION to 1.09
-
-	* CVSTAG: Updated finance_quote_1_09 tag on MANIFEST and
-	  lib/Finace/Quote.pm
-
-	* Released updated version 1.09 with new MANIFEST and Quote.pm
-	  to Sourceforge.
-
-	* lib/Finance/Quote/VWD.pm: Re-enabled $VERSION and bumped
-	  to 1.01 to allow correct indexing on CPAN, however the
-	  older version currently remains in the 1.09 release.
-
-2005-05-04  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/FTPortfolios.pm: Update for changes in the
-	website.
-
-	* t/ftportfolios.t: New test module.
-
-	* TSP.pm: Replace core parsing with tighter code.  Support the
-	symbols used by both Frank Mori Hess' and Trent Piepho's TSP
-	modules.  Make the symbols case insensitive.
-
-	* lib/Finance/Quote/Cdnfundlibrary.pm: Find table by headers
-	instead of by index.
-
-	* test/asegr.t: New module
-	* lib/Finance/Quote/ASEGR.pm: New module
-
-	* lib/Finance/Quote/ASX.pm: Skip any blank lines in the table.
-	Pass an extra parameter to TableExtract to keep it from doing
-	unnecessary work that produces warnings.
-
-2005-03-19  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/Trustnet.pm: Encode the '&' character before
-	calling the user agent GET function.  Fixes bug 747080.
-
-2005-03-19  David Hampton  <hampton@employees.org>
-
-	* almost all files: Collapsed all date parsing code into a single
-	function.  This function handles the date formats provided by all
-	current quote sources and converts them all into the F::Q standard
-	of a US date format.  It also adds an ISO format date to all
-	quotes in the new isodate field.  Added lots of test functions to
-	check date formats.
-
-
-2005-03-19  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/AEX.pm: Spelling correcting from Frank Mori
-	Hess.
-
-	* lib/Finance/Quote.pm: Documentation correction from Trent
-	Piepho.
-
-	* lib/Finance/Quote/Yahoo/Base.pm (yahoo_request): Fix an
-	undefined reference when Yahoo ocassionally returns an empty
-	field.
-
-2005-03-01  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote.pm: New modules.  New function to parse files
-	separated by semicolons instead of commas.
-
-	* lib/Finance/Quote/AEX.pm: Worked over modules from Johan van
-	Oostrum.  Most of the old AEX data has migrated elsewhere.
-
-	* lib/Finance/Quote/ASX.pm:
-	* lib/Finance/Quote/Trustnet.pm: Got the modules working again.
-
-	* lib/Finance/Quote/ManInvestments.pm:
-	* lib/Finance/Quote/Platinum.pm: New modules for Australian
-	investment price sources from Ian Dall <iandall at
-	users.sourceforge.net>.
-
-	* lib/Finance/Quote/NZX.pm: New modules for fetching quotes the
-	from the New Zealand stock exchange. Provided by Michael Curtis.
-
-	* lib/Finance/Quote/SEB.pm: New modules for fetching quotes from
-	the Swedish Bank.  Submitted by Tomas Carlsson.
-
-	* lib/Finance/Quote/TSP.pm: New modules for fetching quotes from
-	the US Govt. Thrift Service Plan.  Submitted by Frank Mori Hess.
-
-	* lib/Finance/Quote/Yahoo/Base.pm: Corrected currency tags for Vienna and Valence.
-
-	* lib/Finance/Quote/Yahoo/Brasil.pm: Add new Yahoo Brasil module
-	from Ismael Orenstein <perdig at users.sourceforge.net>.
-
-	* t/*: Various new test modules.
-
-2005-02-09  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/Fidelity.pm:
-	* lib/Finance/Quote/Union.pm: Got the modules working again.
-
-	* lib/Finance/Quote/Yahoo/Base.pm: Extract the currency directly
-	from Yahoo, instead of looking it up in an exchange/currency
-	mapping table.
-
-	* t/*: Various new test and updated modules.
-
-2005-02-06  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/BMONesbittBurns.pm: Got the modules working again.
-
-2005-01-14  David Hampton  <hampton@employees.org>
-
-	* lib/Finance/Quote/Cdnfundlibrary.pm: Got the module working again.
@@ -1,7 +1,6 @@
 Welcome to Finance::Quote
 =========================
 Maintained by: Paul Fenwick <pjf@cpan.org>
-               Erik Colson <eco@ecocode.net>
 
 What does Finance::Quote provide?
 =================================
@@ -18,8 +17,8 @@ I've found a bug / written a patch / have an idea.  What do I do?
 =================================================================
 Well, you could always mail it to <finance-quote-devel@lists.sourceforge.net>,
 which is read by all the active developers.  Alternatively, you
-might wish to visit 
-<http://rt.cpan.org/Dist/Display.html?Queue=Finance-Quote>.
+might wish to visit <http://sourceforge.net/project/?group_id=4232>
+and make use of the patch manager, bug tracker, or public forums.
 
 How do I download the most recent copy of Finance::Quote?
 =========================================================
@@ -31,12 +30,8 @@ which can be done from: <http://sourceforge.net/mail/?group_id=4232>.
 
 How can I get a copy of the current CVS development tree?
 =========================================================
-You can't. The CVS repo has been ported to GIT as of version 1.13_01.
-
-How can I get a copy of the current GIT development tree?
-=========================================================
-The GIT repository is available at:
-<http://github.com/pfenwick/finance-quote/tree/master>.
+Check out the instructions at <http://sourceforge.net/cvs/?group_id=4232>.
+You can also browse the repository using your web-browser at this site.
 
 Where can I find more information?
 ==================================
@@ -24,12 +24,12 @@ format STDOUT_TOP =
 
                                  STOCK REPORT
 
-TICKER         DATE       LAST  %CHANGE        HIGH       LOW    VOLUME      CLOSE
-----------------------------------------------------------------------------------
+TICKER         DATE      LAST  %CHANGE       HIGH      LOW    VOLUME     CLOSE
+-------------------------------------------------------------------------------
 .
 
 format STDOUT =
-@<<<<<< @>>>>>>>>>>  @####.### @###.###   @####.### @####.### @>>>>>>>>  @####.###
+@<<<<<< @>>>>>>>>>>  @###.### @###.###   @###.### @###.### @>>>>>>>>  @###.###
 $name,  $date,       $last,   $p_change, $high,   $low,    $volume,   $close
 .
 
@@ -0,0 +1,89 @@
+Finance::Quote 
+==============
+
+IMPORTANT
+=========
+
+Read Documentation/License for the license (GPL) covering this code.
+
+Dependancies
+------------
+Finance::Quote depends upon a number of other perl modules to
+function correctly.  These modules include:
+
+	LWP::UserAgent
+	HTTP::Request::Common
+	HTML::TableExtract
+
+You will receive a warning during the make process if one or more of
+these modules are missing.
+
+One easy way to install the modules that Finance::Quote requires is
+to use perl's CPAN module:
+
+	hostname$ perl -MCPAN -e shell (as root)
+
+If you haven't used the CPAN module before, then it may ask you a few
+simple configuration questions before you get to the cpan> prompt.
+You can install any module from CPAN using:
+
+	cpan> install my::module
+
+Indeed, it's possible to install Finance::Quote and all the modules
+it depends upon using:
+
+	cpan> install Finance::Quote
+
+Install instructions
+--------------------
+
+$ perl Makefile.PL
+$ make
+# make install		(as root)
+
+Couldn't be easier, could it?
+
+Running the Regression Tests
+----------------------------
+By default, Finance::Quote does not run its regression tests for
+an automatic install.  This is because the tests rely upon a working
+Internet connection, and for third-party websites to be operating
+correctly, which is not always the case.
+
+If you wish to run the regression tests, then unpack the module as
+per normal, but instead use the following steps:
+
+$ ln -s test t
+$ perl Makefile.PL
+$ make
+$ make test
+# make install		(as root)
+
+The tests do take some time to run, so please be patient.
+
+Note, there are two modules that are known to currency require
+maintenance, so expect the asx.t and trustnet.t tests to fail.
+
+What if my tests fail?
+----------------------
+Your tests could fail if your machine does not have a connection to the
+Internet, if your machine must use an HTTP proxy and you do not have
+your http_proxy environment variable set, or if one or more of the
+servers that Finance::Quote uses is down or unhappy.
+
+The tests can also fail if you have not installed all the modules
+that Finance::Quote depends upon.  See the section on dependancies
+above.
+
+If you believe you've found a bug, please report it using our
+bugtracking system at http://sourceforge.net/bugs/?group_id=4232
+or send mail to <finance-quote-devel@lists.sourceforge.net>.
+
+More information?
+-----------------
+Try visiting the Finance::Quote webpage
+at http://finance-quote.sourceforge.net/
+
+Maintainer
+----------
+Paul Fenwick <pjf@cpan.org>
@@ -1,345 +0,0 @@
-This software is Copyright (c) 2013 by Erik Colson <eco@ecocode.net>.
-
-This is free software, licensed under:
-
-  The GNU General Public License, Version 2, June 1991
-
-                    GNU GENERAL PUBLIC LICENSE
-                       Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users.  This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it.  (Some other Free Software Foundation software is covered by
-the GNU Lesser General Public License instead.)  You can apply it to
-your programs, too.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
-  To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
-  For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have.  You must make sure that they, too, receive or can get the
-source code.  And you must show them these terms so they know their
-rights.
-
-  We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
-  Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software.  If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
-  Finally, any free program is threatened constantly by software
-patents.  We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary.  To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                    GNU GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License.  The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language.  (Hereinafter, translation is included without limitation in
-the term "modification".)  Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
-  1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
-  2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) You must cause the modified files to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    b) You must cause any work that you distribute or publish, that in
-    whole or in part contains or is derived from the Program or any
-    part thereof, to be licensed as a whole at no charge to all third
-    parties under the terms of this License.
-
-    c) If the modified program normally reads commands interactively
-    when run, you must cause it, when started running for such
-    interactive use in the most ordinary way, to print or display an
-    announcement including an appropriate copyright notice and a
-    notice that there is no warranty (or else, saying that you provide
-    a warranty) and that users may redistribute the program under
-    these conditions, and telling the user how to view a copy of this
-    License.  (Exception: if the Program itself is interactive but
-    does not normally print such an announcement, your work based on
-    the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
-    a) Accompany it with the complete corresponding machine-readable
-    source code, which must be distributed under the terms of Sections
-    1 and 2 above on a medium customarily used for software interchange; or,
-
-    b) Accompany it with a written offer, valid for at least three
-    years, to give any third party, for a charge no more than your
-    cost of physically performing source distribution, a complete
-    machine-readable copy of the corresponding source code, to be
-    distributed under the terms of Sections 1 and 2 above on a medium
-    customarily used for software interchange; or,
-
-    c) Accompany it with the information you received as to the offer
-    to distribute corresponding source code.  (This alternative is
-    allowed only for noncommercial distribution and only if you
-    received the program in object code or executable form with such
-    an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it.  For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable.  However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License.  Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
-  5. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Program or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
-  6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions.  You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
-  7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all.  For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded.  In such case, this License incorporates
-the limitation as if written in the body of this License.
-
-  9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time.  Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number.  If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation.  If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
-  10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission.  For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this.  Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
-                            NO WARRANTY
-
-  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
-  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the program's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License along
-    with this program; if not, write to the Free Software Foundation, Inc.,
-    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
-    Gnomovision version 69, Copyright (C) year name of author
-    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
-    This is free software, and you are welcome to redistribute it
-    under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License.  Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
-  `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
-  <signature of Ty Coon>, 1 April 1989
-  Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs.  If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library.  If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
@@ -1,89 +1,45 @@
-# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.029.
+ChangeLog
 ChangeLog.1
-Changes
 Documentation/FAQ
 Documentation/Hackers-Guide
 Documentation/License
 Documentation/README
-Examples/Quote_example.pl
 Examples/chkshares.pl
 Examples/currency-lookup.pl
+Examples/Quote_example.pl
 Examples/stockdump.pl
-LICENSE
-MANIFEST
-META.json
-META.yml
-Makefile.PL
-README
-debian/changelog
-debian/control
-debian/copyright
-debian/rules
-htdocs/Images/Button1.gif
-htdocs/Images/Button2.gif
-htdocs/Images/bg.jpg
-htdocs/Images/bg2.jpg
-htdocs/Images/logo_big1.gif
-htdocs/Images/logo_medium1.gif
-htdocs/Images/logo_small1.gif
-htdocs/Images/logo_small2.gif
-htdocs/Stylesheet.css
-htdocs/developer.html
-htdocs/discussion.html
-htdocs/documentation.html
-htdocs/download.html
-htdocs/index.html
-htdocs/tpj/finance-quote-example
-htdocs/tpj/finance-quote-sidebar
-htdocs/tpj/finance-quote.txt
+INSTALL
 lib/Finance/Quote.pm
 lib/Finance/Quote/AEX.pm
 lib/Finance/Quote/AIAHK.pm
 lib/Finance/Quote/ASEGR.pm
 lib/Finance/Quote/ASX.pm
 lib/Finance/Quote/BMONesbittBurns.pm
-lib/Finance/Quote/BSERO.pm
 lib/Finance/Quote/Bourso.pm
-lib/Finance/Quote/CSE.pm
 lib/Finance/Quote/Cdnfundlibrary.pm
-lib/Finance/Quote/Citywire.pm
-lib/Finance/Quote/Cominvest.pm
-lib/Finance/Quote/Currencies.pm
-lib/Finance/Quote/DWS.pm
 lib/Finance/Quote/Deka.pm
-lib/Finance/Quote/FTPortfolios.pm
-lib/Finance/Quote/FTfunds.pm
+lib/Finance/Quote/DWS.pm
 lib/Finance/Quote/Fidelity.pm
 lib/Finance/Quote/FinanceCanada.pm
-lib/Finance/Quote/Finanzpartner.pm
 lib/Finance/Quote/Fool.pm
-lib/Finance/Quote/GoldMoney.pm
+lib/Finance/Quote/FTPortfolios.pm
 lib/Finance/Quote/HEX.pm
-lib/Finance/Quote/HU.pm
 lib/Finance/Quote/IndiaMutual.pm
 lib/Finance/Quote/LeRevenu.pm
-lib/Finance/Quote/MStaruk.pm
 lib/Finance/Quote/ManInvestments.pm
-lib/Finance/Quote/Morningstar.pm
-lib/Finance/Quote/MorningstarJP.pm
-lib/Finance/Quote/MtGox.pm
 lib/Finance/Quote/NZX.pm
 lib/Finance/Quote/Platinum.pm
 lib/Finance/Quote/SEB.pm
-lib/Finance/Quote/SIXfunds.pm
-lib/Finance/Quote/SIXshares.pm
 lib/Finance/Quote/StockHouseCanada.pm
-lib/Finance/Quote/TNetuk.pm
-lib/Finance/Quote/TSP.pm
-lib/Finance/Quote/TSX.pm
 lib/Finance/Quote/Tdefunds.pm
 lib/Finance/Quote/Tdwaterhouse.pm
 lib/Finance/Quote/Tiaacref.pm
 lib/Finance/Quote/Troweprice.pm
 lib/Finance/Quote/Trustnet.pm
-lib/Finance/Quote/USFedBonds.pm
+lib/Finance/Quote/TSP.pm
 lib/Finance/Quote/Union.pm
 lib/Finance/Quote/UserAgent.pm
+lib/Finance/Quote/USFedBonds.pm
 lib/Finance/Quote/VWD.pm
 lib/Finance/Quote/Yahoo/Asia.pm
 lib/Finance/Quote/Yahoo/Australia.pm
@@ -92,73 +48,46 @@ lib/Finance/Quote/Yahoo/Brasil.pm
 lib/Finance/Quote/Yahoo/Europe.pm
 lib/Finance/Quote/Yahoo/NZ.pm
 lib/Finance/Quote/Yahoo/USA.pm
-lib/Finance/Quote/YahooJSON.pm
 lib/Finance/Quote/ZA.pm
-lib/Finance/Quote/ZA_UnitTrusts.pm
-t/00-use.t
-t/01-pod.t
-t/02-pod-coverage.t
-t/03-kwalitee.t
-t/04-critic.t
-t/05-data-dumper.t
-t/aex.t
-t/aiahk.t
-t/asegr.t
-t/asx.t
-t/bmonesbittburns.t
-t/bourso.t
-t/bsero.t
-t/cdnfundlibrary.t
-t/citywire.t
-t/cominvest.t
-t/cse.t
-t/currencies.t
-t/currency.t
-t/currency_lookup.t
-t/deka.t
-t/dws.t
-t/fidelity.t
-t/financecanada.t
-t/finanzpartner.t
-t/ftfunds.t
-t/ftportfolios.t
-t/goldmoney.t
-t/hex.t
-t/hu.t
-t/indiamutual.t
-t/lerevenu.t
-t/maninvestments.t
-t/morningstar.t
-t/morningstarJP.t
-t/mstaruk.t
-t/mtgox.t
-t/nzx.t
-t/platinum.t
-t/quote.t
-t/release-pod-syntax.t
-t/seb.t
-t/sixfunds.t
-t/sixshares.t
-t/stockhousecanada.t
-t/tdefunds.t
-t/tdwaterhouse.t
-t/tiaacref.t
-t/tnetuk.t
-t/troweprice.t
-t/trustnet.t
-t/tsp.t
-t/tsx.t
-t/ukfunds.t
-t/union.t
-t/usfedbonds.t
-t/vanguard.t
-t/vwd.t
-t/yahoo.t
-t/yahoo_asia.t
-t/yahoo_australia.t
-t/yahoo_brasil.t
-t/yahoo_europe.t
-t/yahoo_nz.t
-t/yahoojson.t
-t/za.t
-t/za_unittrusts.t
+Makefile.PL
+MANIFEST			This list of files
+META.yml
+test/aex.t
+test/aiahk.t
+test/asegr.t
+test/asx.t
+test/bmonesbittburns.t
+test/bourso.t
+test/cdnfundlibrary.t
+test/currency.t
+test/deka.t
+test/dws.t
+test/fidelity.t
+test/financecanada.t
+test/ftportfolios.t
+test/hex.t
+test/indiamutual.t
+test/lerevenu.t
+test/maninvestments.t
+test/nzx.t
+test/platinum.t
+test/seb.t
+test/stockhousecanada.t
+test/tdefunds.t
+test/tdwaterhouse.t
+test/tiaacref.t
+test/troweprice.t
+test/trustnet.t
+test/tsp.t
+test/union.t
+test/Use.t
+test/usfedbonds.t
+test/vanguard.t
+test/vwd.t
+test/yahoo.t
+test/yahoo_asia.t
+test/yahoo_australia.t
+test/yahoo_brasil.t
+test/yahoo_europe.t
+test/yahoo_nz.t
+test/za.t
@@ -1,95 +0,0 @@
-{
-   "abstract" : "Get stock and mutual fund quotes from various exchanges",
-   "author" : [
-      "Dj Padzensky <djpadz@padz.net>, PadzNet, Inc.",
-      "Linas Vepstas <linas@linas.org>",
-      "Yannick LE NY <y-le-ny@ifrance.com>",
-      "Paul Fenwick <pjf@cpan.org>",
-      "Brent Neal <brentn@users.sourceforge.net>",
-      "Volker Stuerzl <volker.stuerzl@gmx.de>",
-      "Keith Refson <Keith.Refson#earth.ox.ac.uk>",
-      "Rob Sessink <rob_ses@users.sourceforge.net>",
-      "Leigh Wedding <leigh.wedding@telstra.com>",
-      "Tobias Vancura <tvancura@altavista.net>",
-      "James Treacy <treacy@debian.org>",
-      "Bradley Dean <bjdean@bjdean.id.au>",
-      "Erik Colson <eco@ecocode.net>"
-   ],
-   "dynamic_config" : 0,
-   "generated_by" : "Dist::Zilla version 5.029, CPAN::Meta::Converter version 2.142690",
-   "license" : [
-      "gpl_2"
-   ],
-   "meta-spec" : {
-      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
-      "version" : 2
-   },
-   "name" : "Finance-Quote",
-   "prereqs" : {
-      "configure" : {
-         "requires" : {
-            "ExtUtils::MakeMaker" : "0"
-         }
-      },
-      "develop" : {
-         "requires" : {
-            "Test::Pod" : "1.41"
-         }
-      },
-      "runtime" : {
-         "requires" : {
-            "CGI" : "0",
-            "Carp" : "0",
-            "DateTime" : "0",
-            "Encode" : "0",
-            "Exporter" : "0",
-            "HTML::Parser" : "0",
-            "HTML::TableExtract" : "0",
-            "HTML::TokeParser" : "0",
-            "HTML::TreeBuilder" : "0",
-            "HTTP::Cookies" : "0",
-            "HTTP::Headers" : "0",
-            "HTTP::Request::Common" : "0",
-            "HTTP::Status" : "0",
-            "JSON" : "0",
-            "LWP::Protocol::https" : "0",
-            "LWP::Simple" : "0",
-            "LWP::UserAgent" : "0",
-            "Mozilla::CA" : "0",
-            "POSIX" : "0",
-            "Time::Piece" : "0",
-            "URI" : "0",
-            "URI::Escape" : "0",
-            "URI::QueryParam" : "0",
-            "base" : "0",
-            "constant" : "0",
-            "perl" : "5.010",
-            "strict" : "0",
-            "utf8" : "0",
-            "vars" : "0",
-            "warnings" : "0"
-         }
-      },
-      "test" : {
-         "requires" : {
-            "Data::Dumper" : "0",
-            "File::Spec" : "0",
-            "Test::More" : "0"
-         }
-      }
-   },
-   "release_status" : "stable",
-   "resources" : {
-      "bugtracker" : {
-         "web" : "https://rt.cpan.org/Dist/Display.html?Name=Finance-Quote"
-      },
-      "homepage" : "http://finance-quote.sourceforge.net/",
-      "repository" : {
-         "type" : "git",
-         "url" : "git://github.com/finance-quote/finance-quote",
-         "web" : "https://github.com/finance-quote/finance-quote"
-      }
-   },
-   "version" : "1.37"
-}
-
@@ -1,65 +1,14 @@
----
-abstract: 'Get stock and mutual fund quotes from various exchanges'
-author:
-  - 'Dj Padzensky <djpadz@padz.net>, PadzNet, Inc.'
-  - 'Linas Vepstas <linas@linas.org>'
-  - 'Yannick LE NY <y-le-ny@ifrance.com>'
-  - 'Paul Fenwick <pjf@cpan.org>'
-  - 'Brent Neal <brentn@users.sourceforge.net>'
-  - 'Volker Stuerzl <volker.stuerzl@gmx.de>'
-  - 'Keith Refson <Keith.Refson#earth.ox.ac.uk>'
-  - 'Rob Sessink <rob_ses@users.sourceforge.net>'
-  - 'Leigh Wedding <leigh.wedding@telstra.com>'
-  - 'Tobias Vancura <tvancura@altavista.net>'
-  - 'James Treacy <treacy@debian.org>'
-  - 'Bradley Dean <bjdean@bjdean.id.au>'
-  - 'Erik Colson <eco@ecocode.net>'
-build_requires:
-  Data::Dumper: '0'
-  File::Spec: '0'
-  Test::More: '0'
-configure_requires:
-  ExtUtils::MakeMaker: '0'
-dynamic_config: 0
-generated_by: 'Dist::Zilla version 5.029, CPAN::Meta::Converter version 2.142690'
-license: gpl
-meta-spec:
-  url: http://module-build.sourceforge.net/META-spec-v1.4.html
-  version: '1.4'
-name: Finance-Quote
+# http://module-build.sourceforge.net/META-spec.html
+#XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#
+name:         Finance-Quote
+version:      1.13
+version_from: lib/Finance/Quote.pm
+installdirs:  site
 requires:
-  CGI: '0'
-  Carp: '0'
-  DateTime: '0'
-  Encode: '0'
-  Exporter: '0'
-  HTML::Parser: '0'
-  HTML::TableExtract: '0'
-  HTML::TokeParser: '0'
-  HTML::TreeBuilder: '0'
-  HTTP::Cookies: '0'
-  HTTP::Headers: '0'
-  HTTP::Request::Common: '0'
-  HTTP::Status: '0'
-  JSON: '0'
-  LWP::Protocol::https: '0'
-  LWP::Simple: '0'
-  LWP::UserAgent: '0'
-  Mozilla::CA: '0'
-  POSIX: '0'
-  Time::Piece: '0'
-  URI: '0'
-  URI::Escape: '0'
-  URI::QueryParam: '0'
-  base: '0'
-  constant: '0'
-  perl: '5.010'
-  strict: '0'
-  utf8: '0'
-  vars: '0'
-  warnings: '0'
-resources:
-  bugtracker: https://rt.cpan.org/Dist/Display.html?Name=Finance-Quote
-  homepage: http://finance-quote.sourceforge.net/
-  repository: git://github.com/finance-quote/finance-quote
-version: '1.37'
+    Crypt::SSLeay:                 0
+    HTML::TableExtract:            0
+    HTTP::Request::Common:         0
+    LWP::UserAgent:                0
+
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version 6.30
@@ -1,115 +1,12 @@
-
-# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.029.
+#!/usr/bin/perl -w
 use strict;
-use warnings;
-
-use 5.010;
 
 use ExtUtils::MakeMaker;
 
-
-
-my %WriteMakefileArgs = (
-  "ABSTRACT" => "Get stock and mutual fund quotes from various exchanges",
-  "AUTHOR" => "Dj Padzensky <djpadz\@padz.net>, PadzNet, Inc., Linas Vepstas <linas\@linas.org>, Yannick LE NY <y-le-ny\@ifrance.com>, Paul Fenwick <pjf\@cpan.org>, Brent Neal <brentn\@users.sourceforge.net>, Volker Stuerzl <volker.stuerzl\@gmx.de>, Keith Refson <Keith.Refson#earth.ox.ac.uk>, Rob Sessink <rob_ses\@users.sourceforge.net>, Leigh Wedding <leigh.wedding\@telstra.com>, Tobias Vancura <tvancura\@altavista.net>, James Treacy <treacy\@debian.org>, Bradley Dean <bjdean\@bjdean.id.au>, Erik Colson <eco\@ecocode.net>",
-  "CONFIGURE_REQUIRES" => {
-    "ExtUtils::MakeMaker" => 0
-  },
-  "DISTNAME" => "Finance-Quote",
-  "EXE_FILES" => [],
-  "LICENSE" => "gpl",
-  "MIN_PERL_VERSION" => "5.010",
-  "NAME" => "Finance::Quote",
-  "PREREQ_PM" => {
-    "CGI" => 0,
-    "Carp" => 0,
-    "DateTime" => 0,
-    "Encode" => 0,
-    "Exporter" => 0,
-    "HTML::Parser" => 0,
-    "HTML::TableExtract" => 0,
-    "HTML::TokeParser" => 0,
-    "HTML::TreeBuilder" => 0,
-    "HTTP::Cookies" => 0,
-    "HTTP::Headers" => 0,
-    "HTTP::Request::Common" => 0,
-    "HTTP::Status" => 0,
-    "JSON" => 0,
-    "LWP::Protocol::https" => 0,
-    "LWP::Simple" => 0,
-    "LWP::UserAgent" => 0,
-    "Mozilla::CA" => 0,
-    "POSIX" => 0,
-    "Time::Piece" => 0,
-    "URI" => 0,
-    "URI::Escape" => 0,
-    "URI::QueryParam" => 0,
-    "base" => 0,
-    "constant" => 0,
-    "strict" => 0,
-    "utf8" => 0,
-    "vars" => 0,
-    "warnings" => 0
-  },
-  "TEST_REQUIRES" => {
-    "Data::Dumper" => 0,
-    "File::Spec" => 0,
-    "Test::More" => 0
-  },
-  "VERSION" => "1.37",
-  "test" => {
-    "TESTS" => "t/*.t"
-  }
-);
-
-
-my %FallbackPrereqs = (
-  "CGI" => 0,
-  "Carp" => 0,
-  "Data::Dumper" => 0,
-  "DateTime" => 0,
-  "Encode" => 0,
-  "Exporter" => 0,
-  "ExtUtils::MakeMaker" => 0,
-  "File::Spec" => 0,
-  "HTML::Parser" => 0,
-  "HTML::TableExtract" => 0,
-  "HTML::TokeParser" => 0,
-  "HTML::TreeBuilder" => 0,
-  "HTTP::Cookies" => 0,
-  "HTTP::Headers" => 0,
-  "HTTP::Request::Common" => 0,
-  "HTTP::Status" => 0,
-  "JSON" => 0,
-  "LWP::Protocol::https" => 0,
-  "LWP::Simple" => 0,
-  "LWP::UserAgent" => 0,
-  "Mozilla::CA" => 0,
-  "POSIX" => 0,
-  "Test::More" => 0,
-  "Time::Piece" => 0,
-  "URI" => 0,
-  "URI::Escape" => 0,
-  "URI::QueryParam" => 0,
-  "base" => 0,
-  "constant" => 0,
-  "strict" => 0,
-  "utf8" => 0,
-  "vars" => 0,
-  "warnings" => 0
-);
-
-
-unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) {
-  delete $WriteMakefileArgs{TEST_REQUIRES};
-  delete $WriteMakefileArgs{BUILD_REQUIRES};
-  $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs;
-}
-
-delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
-  unless eval { ExtUtils::MakeMaker->VERSION(6.52) };
-
-WriteMakefile(%WriteMakefileArgs);
-
-
-
+WriteMakefile( NAME         => "Finance::Quote",
+               PREREQ_PM    => { "LWP::UserAgent" => 0,
+				 "Crypt::SSLeay" => 0,
+                                 "HTTP::Request::Common" => 0,
+				 "HTML::TableExtract" => 0},
+               VERSION_FROM => "lib/Finance/Quote.pm"
+             );
@@ -1,16 +0,0 @@
-
-
-This archive contains the distribution Finance-Quote,
-version 1.37:
-
-  Get stock and mutual fund quotes from various exchanges
-
-This software is Copyright (c) 2013 by Erik Colson <eco@ecocode.net>.
-
-This is free software, licensed under:
-
-  The GNU General Public License, Version 2, June 1991
-
-
-This README file was generated by Dist::Zilla::Plugin::Readme v5.029.
-
@@ -1,17 +0,0 @@
-libfinance-quote-perl (1.06-1) unstable; urgency=low
-
-  * Version update.
-
- -- Ross Peachey <rcp@debian.org>  Tue, 03 Jul 2001 21:14:12 +1000
-
-libfinance-quote-perl (1.05-1) unstable; urgency=low
-
-  * Initial Debian release. 
-
- -- Ross Peachey <rcp@debian.org>  Wed, 14 Feb 2001 15:24:49 +1100
-
-Local variables:
-mode: debian-changelog
-user-mail-address: "rcp@debian.org"
-End:
-
@@ -1,13 +0,0 @@
-Source: libfinance-quote-perl
-Section: interpreters
-Priority: optional
-Maintainer: Ross Peachey <rcp@debian.org>
-Standards-Version: 3.5.2
-
-Package: libfinance-quote-perl
-Architecture: all
-Depends: ${perl:Depends}, libhtml-tableextract-perl, debhelper(>=2.0.86)
-Description: Perl module for retrieving stock quotes from a variety of sources
- This is a Perl module that retrieves stock quotes and other securities
- information from various locations
-
@@ -1,18 +0,0 @@
-This is Debian GNU/Linux's prepackaged version of Finance::Quote.  This
-is a set of perl modules which provide access to securities prices.
-
-This package was put together by Ross Peachey <rcp@debian.org>, from
-the original sources, available from:
-
-     http://sourceforge.net/projects/finance-quote/
-
-The library is also available from the Comprehensive Perl Archive
-Network (CPAN). Visit <URL:http://www.perl.com/CPAN/> to find a CPAN
-site near you.
-
-The only change for the Debian package was the addition of the debian/
-files.
-
-Finance::Quote is released under the GNU Public Licence, which can be found in
-/usr/share/common-licenses/GPL on Debian systems. 
-
@@ -1,68 +0,0 @@
-#! /usr/bin/make -f
-#                                                       -*- makefile -*-
-# debian/rules file for the Debian/GNU Linux libfinance-yahooquote-perl package
-# Copyright (C) 1999 by Dirk Eddelbuettel <edd@debian.org>
-
-package        := $(shell grep Package debian/control | sed 's/^Package: //')
-version        := $(shell head -1 debian/changelog | \
-                       perl -nle 'm/\S+\s+\((\S+)\)/ && print $$1')
-debtmp := $(shell pwd)/debian/tmp
-debdoc := $(debtmp)/usr/share/doc/$(package)
-
-# New Perl Policy by Raphael
-ifndef PERL
-PERL = /usr/bin/perl
-endif
-
-TMP     =`pwd`/debian/tmp
-archlib =`$(PERL) -MConfig -e 'print $$Config{installarchlib}'`
-config  =INSTALLDIRS=perl INSTALLMAN1DIR=$(TMP)/usr/share/man/man1 INSTALLMAN3DIR=$(TMP)/usr/share/man/man3 INSTALLPRIVLIB=$(TMP)/usr/lib/perl5 INSTALLARCHLIB=$(TMP)$(archlib)
-
-build: build-stamp
-build-stamp:
-	dh_testdir
-	$(PERL) Makefile.PL $(config)
-	$(MAKE) CFLAGS="-O2 -g -Wall"
-	touch build-stamp
-
-clean:
-	dh_testdir
-	dh_testroot
-	rm -f build-stamp
-	-test -f Makefile && $(MAKE) realclean
-	dh_clean
-
-binary-indep: build
-	dh_testdir
-	dh_testroot
-	dh_clean -k
-	dh_installdirs
-	$(MAKE)                 pure_install
-	dh_perl
-	find `pwd`/debian/tmp -type f -name .packlist | xargs -r rm -f
-	-find `pwd`/debian/tmp -type d -empty | xargs -r rmdir -p --ignore-fail-on-non-empty
-	dh_installdocs          Documentation/README  \
-				Documentation/Hackers-Guide Documentation/FAQ
-	dh_installexamples      Examples/*.pl
-#      dh_installmenu
-#      dh_installinit
-#      dh_installcron
-#      dh_installmanpages
-#      dh_undocumented
-	dh_installchangelogs    ChangeLog
-	dh_compress
-	dh_fixperms
-#      dh_suidregister
-	dh_installdeb
-	dh_gencontrol
-	dh_md5sums
-	dh_builddeb
-
-binary-arch: build
-
-source diff:                                                                  
-	@echo >&2 'source and diff are obsolete - use dpkg-source -b'; false
-
-binary: binary-indep binary-arch
-.PHONY: build clean binary-indep binary-arch binary
-
diff --git a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/Button1.gif b/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/Button1.gif
deleted file mode 100644
index 23e31f18..00000000
Binary files a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/Button1.gif and /dev/null differ
diff --git a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/Button2.gif b/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/Button2.gif
deleted file mode 100644
index 7fa77686..00000000
Binary files a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/Button2.gif and /dev/null differ
diff --git a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/bg.jpg b/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/bg.jpg
deleted file mode 100644
index 7d9fbaad..00000000
Binary files a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/bg.jpg and /dev/null differ
diff --git a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/bg2.jpg b/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/bg2.jpg
deleted file mode 100644
index cead0948..00000000
Binary files a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/bg2.jpg and /dev/null differ
diff --git a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/logo_big1.gif b/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/logo_big1.gif
deleted file mode 100644
index 87edcf30..00000000
Binary files a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/logo_big1.gif and /dev/null differ
diff --git a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/logo_medium1.gif b/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/logo_medium1.gif
deleted file mode 100644
index af0ab1ca..00000000
Binary files a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/logo_medium1.gif and /dev/null differ
diff --git a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/logo_small1.gif b/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/logo_small1.gif
deleted file mode 100644
index 0445630c..00000000
Binary files a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/logo_small1.gif and /dev/null differ
diff --git a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/logo_small2.gif b/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/logo_small2.gif
deleted file mode 100644
index 8a9aae3c..00000000
Binary files a/var/tmp/source/ECOCODE/Finance-Quote-1.37/Finance-Quote-1.37/htdocs/Images/logo_small2.gif and /dev/null differ
@@ -1,24 +0,0 @@
-ul { font-family: Verdana, Arial, Helvetica, sans-serif;
-font-size: 12pt;
-font-style: normal; color: #FFFFFF}
-p,li { font-family: Verdana, Arial, Helvetica, sans-serif; 
-font-size: 12pt; 
-font-style: normal; color: #FFFFFF}
-h1 { font-family: Verdana, Arial, Helvetica, sans-serif; 
-font-size: 18pt; 
-font-style: normal; 
-color: #FFFFFF; 
-background-position: center}
-h2 { font-family: Verdana, Arial, Helvetica, sans-serif; 
-font-size: 16pt; 
-font-style: normal; color: #FFFFFF}
-h3 { font-family: Verdana, Arial, Helvetica, sans-serif; 
-font-size: 14pt; 
-font-style: normal; color: #FFFFFF}
-.footer {  font-family: Verdana, Arial, Helvetica, sans-serif; 
-font-size: 9pt; 
-color: #FFFFFF}
-a {  font-family: Verdana, Arial, Helvetica, sans-serif; 
-font-size: 12pt; 
-color: #AAAA77}
-h2[class^=new], p[class^=new], li[class^=new] { color : red }
\ No newline at end of file
@@ -1,118 +0,0 @@
-<html>
-<head>
-<title>Finance::Quote Homepage</title>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<link rel="stylesheet" href="./Stylesheet.css">
-</head>
-
-<body bgcolor="#003333" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
-<div align="center"><img src="Images/logo_small2.gif" width="300" height="59" alt="Finance :: Quote" border="0" vspace="20">
-</div>
-<table width="100%" border="0" cellspacing="10" cellpadding="0">
-  <tr>
-
-    <td width="0" valign="top">
-      <table width="78%" border="0" cellspacing="5" cellpadding="0">
-        <tr valign="middle">
-          <td nowrap><img src="Images/Button2.gif" width="40" height="38" alt="Button" border="0"></td>
-          <td nowrap> <a href="index.html">Home</a></td>
-        </tr>
-        <tr valign="middle">
-          <td nowrap><img src="Images/Button2.gif" width="40" height="38" alt="Button" border="0"></td>
-          <td nowrap> <a href="documentation.html">Documentation</a></td>
-        </tr>
-        <tr valign="middle">
-          <td><img src="Images/Button2.gif" width="40" height="38" alt="Button" border="0"></td>
-          <td> <a href="discussion.html">Discussion Groups and Mailing Lists</a></td>
-        </tr>
-        <tr valign="middle">
-          <td><img src="Images/Button2.gif" width="40" height="38" alt="Button" border="0"></td>
-          <td> <a href="download.html">Download</a></td>
-        </tr>
-        <tr valign="middle">
-          <td><img src="Images/Button2.gif" width="40" height="38" alt="Button" border="0"></td>
-          <td> <a href="http://sourceforge.net/projects/finance-quote/"><img src="http://sourceforge.net/sflogo.php?group_id=4232&type=1" width="88" height="31" border="0" alt="SourceForge Page"</a></td>
-        </tr>
-      </table>
-    </td>
-
-    <td width="0" valign="top">
-      <h2 class="new" align="center">Important note</h2>
-        <p class="new">After the release 1.13 we took two important
-           decisions :</p>
-        <p class="new"><li class="new">Current evolution of
-           development tools made us port the repository to Git</li>
-        <li class="new">Since Finance::Quote releases are available
-            through <a href="http://www.cpan.org">CPAN</a> we also
-            decided to make full use of the tools available on the
-            Cpan platform.</li></p>
-        <p class="new">Please note that we are in the early stages of
-           the implementation of these changes. Some of the work has
-           already been done, but some data has still to be ported or
-           disgarded. Please take a look at this page for further
-           evolution. Reports will also be posted to the developers
-           mailing-list. We sincerely apologize for any inconvenience
-           these changes may cause.</p>
-
-      <h2 align="center">Bug-tracking</h2>
-	<p>Bugs can be submitted and tracked via Cpan's RT
-	   <a href="http://rt.cpan.org/Public/Dist/Display.html?Status=Active&Name=Finance-Quote">
-	   bug-tracking system</a>.  Before submitting a bug, please
-	   make sure that someone else has not submitted the bug
-	   already.</p>
-        <p>Bugs posted on the Sourceforge's
-           <a href="http://sourceforge.net/bugs/?group_id=4232">bug tracking system</a>
-           after 1.7.2007 are ported to RT. Older bug reports (prior
-           to release 1.13) will certainly be disgarded. Don't use the
-           Sourceforge's BTS for new bug reports as those won't be checked.</p>
-
-      <h2 align="center">Patches</h2>
-        <p>Patches must be submitted as file attachments to bug
-           reports (see above).</p>
-        <p>Patches submitted on Sourceforge's site after 1.7.2007 will
-           eventually be lookad at. Older patches will certainly be disgarded.</p>
-	<p>For reference, we'll mention the link to the SourceForge's
-	   <a href="http://sourceforge.net/patch/?group_id=4232">
-	   patch manager.</a> Don't use it for new patches as those won't
-           be checked.</p>
-        <p>Before submitting a patch please make
-	   sure that you have the most up-to-date version of
-	   Finance::Quote, and that nobody has submitted an equivalent
-	   patch already.</p>
-
-      <h2 align="center">Mailing-lists</h2>
-	<p>A developer's mailing list exists for those people who are
-	   using or developing Finance::Quote.  For more information,
-	   see our <a href="discussion.html">Discussion Groups and
-	   Mailing Lists page</a>.</p>
-
-     <h2 align="center">Git</h2>
-        <p>Anonymous access to the development branch is available
-           for those wishing to use the development branch of Finance::Quote.
-           Details on anonymous Git access can be found
-           <a href="http://github.com/pjf/finance-quote">here</a>.</p>
-
-     <h2 align="center">CVS</h2>
-	<p>The development repository has been ported to Git.
-           Please note that while CVS is still available, updates
-           starting at version 1.13 won't be sent to the CVS repository.</p>
-	<p>Details on anonymous CVS access can be found
-           <a href="http://sourceforge.net/cvs/?group_id=4232">here</a>.</p>
-
-     <h2 align="center">Hacker's Guide</h2>
-	<p>The Hacker's Guide contains information on how to extend
-	   Finance::Quote to make use of your own custom information
-	   sources.  The most recent version of the Hacker's Guide
-	   can be found <a href="http://sourceforge.net/docman/display_doc.php?docid=158&group_id=4232">here</a>.</p>
-
-      </td>
-    </tr>
-  </table>
-
-  <hr align="center">
-
-<div class="footer" align="center">This page was last updated on the 21th
-  of September 2008. Thanks to <a href="http://www.sourceforge.net/">SourceForge</A>
-  for hosting this project.</div>
-</body>
-</html>
@@ -1,83 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-  <title>Finance::Quote Discussion</title>
-  <meta http-equiv="Content-Type"
- content="text/html; charset=iso-8859-1">
-  <link rel="stylesheet" href="./Stylesheet.css">
-</head>
-<body leftmargin="0" topmargin="0"
- style="background-color: rgb(0, 51, 51);" marginheight="0"
- marginwidth="0">
-<div align="center"><img src="Images/logo_small2.gif"
- alt="Finance :: Quote" border="0" height="59" vspace="20" width="300">
-</div>
-<table border="0" cellpadding="0" cellspacing="10" width="100%">
-  <tbody>
-    <tr>
-      <td valign="top" width="0">
-      <table border="0" cellpadding="0" cellspacing="5" width="78%">
-        <tbody>
-          <tr valign="middle">
-            <td nowrap="nowrap"><img src="Images/Button2.gif"
- alt="Button" border="0" height="38" width="40"></td>
-            <td nowrap="nowrap">
-            <a href="index.html">Home</a></td>
-          </tr>
-          <tr valign="middle">
-            <td nowrap="nowrap"><img src="Images/Button2.gif"
- alt="Button" border="0" height="38" width="40"></td>
-            <td nowrap="nowrap">
-            <a href="documentation.html">Documentation</a></td>
-          </tr>
-          <tr valign="middle">
-            <td><img src="Images/Button2.gif" alt="Button" border="0"
- height="38" width="40"></td>
-            <td> <a href="developer.html">Bugs, Patches and Development</a></td>
-          </tr>
-          <tr valign="middle">
-            <td><img src="Images/Button2.gif" alt="Button" border="0"
- height="38" width="40"></td>
-            <td> <a href="download.html">Download</a></td>
-          </tr>
-          <tr valign="middle">
-            <td><img src="Images/Button2.gif" alt="Button" border="0"
- height="38" width="40"></td>
-            <td> <a
- href="http://sourceforge.net/projects/finance-quote/"><img
- src="http://sourceforge.net/sflogo.php?group_id=4232&amp;type=1"
- alt="SourceForge Page" border="0" height="31" width="88"></a></td>
-          </tr>
-        </tbody>
-      </table>
-      </td>
-      <td valign="top" width="0">
-      <h2 align="center">Mailing
-lists.</h2>
-      <p>There are two
-Finance::Quote mailing lists. <a
- href="http://lists.sourceforge.net/lists/listinfo/finance-quote-devel">
-finance-quote-devel</a>
-is a high-volume list for developers and technical issues. <a
- href="http://lists.sourceforge.net/lists/listinfo/finance-quote-news">
-finance-quote-news</a> is a
-low-volume list for announcements only. Archives of the mailing lists,
-and details on how to join, can be found <a
- href="http://sourceforge.net/mail/?group_id=4232">
-here</a>.</p>
-      <h2 align="center">Discussion
-Forums.</h2>
-      <p>Public discussion forums,
-including a general discussion and help forum, can be found <a
- href="http://sourceforge.net/forum/?group_id=4232">here</a>.</p>
-      </td>
-    </tr>
-  </tbody>
-</table>
-<hr align="center">
-<div class="footer" align="center">This
-page was last updated on the 30th of June 2005. Thanks to <a
- href="http://www.sourceforge.net/">SourceForge</a>
-for hosting this project.</div>
-</body>
-</html>
@@ -1,75 +0,0 @@
-<html>
-<head>
-<title>Finance::Quote Homepage</title>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<link rel="stylesheet" href="./Stylesheet.css">
-</head>
-
-<body bgcolor="#003333" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
-<div align="center"><img src="Images/logo_small2.gif" width="300" height="59" alt="Finance :: Quote" border="0" vspace="20"> 
-</div>
-<table width="100%" border="0" cellspacing="10" cellpadding="0">
-  <tr>
-      
-    <td width="0" valign="top"> 
-      <table width="78%" border="0" cellspacing="5" cellpadding="0">
-        <tr valign="middle">
-          <td nowrap><img src="Images/Button2.gif" width="40" height="38" alt="Button" border="0"></td>
-          <td nowrap> <a href="index.html">Home</a></td>
-        </tr>
-        <tr valign="middle">
-          <td nowrap><img src="Images/Button2.gif" width="40" height="38" alt="Button" border="0"></td>
-          <td nowrap> <a href="discussion.html">Discussion Groups and Mailing Lists</a></td>
-        </tr>
-        <tr valign="middle">
-          <td><img src="Images/Button2.gif" width="40" height="38" alt="Button" border="0"></td>
-          <td> <a href="developer.html">Bugs, Patches and Development</a></td>
-        </tr>
-        <tr valign="middle">
-          <td><img src="Images/Button2.gif" width="40" height="38" alt="Button" border="0"></td>
-          <td> <a href="download.html">Download</a></td>
-        </tr>
-        <tr valign="middle">
-          <td><img src="Images/Button2.gif" width="40" height="38" alt="Button" border="0"></td>
-          <td> <a href="http://sourceforge.net/projects/finance-quote/"><img src="http://sourceforge.net/sflogo.php?group_id=4232&type=1" width="88" height="31" border="0" alt="SourceForge Page"></a></td>
-        </tr>
-      </table>
-    </td>
-      
-    <td width="0" valign="top"> 
-      <h2 align="center">Documentation</h2>
-	<p>Manual pages, the hacker's guide, and other documentation for
-	   Finance::Quote is available through SourceForge's documentation
-	   manager.  It can be found <a href="http://sourceforge.net/docman/index.php?group_id=4232">here</a>.</p>
-
-      <h2 align="center">The Perl Journal</h2>
-	<p><a href="http://www.tpj.com/">The Perl Journal</a> published an
-	   article about Finance::Quote in issue number 19.  The final draft
-	   of this article is also available via this website.  It comes in
-	   three parts (text-only):
-	</p>
-
-	   <ul>
-	   	<li><a href="tpj/finance-quote.txt">The article itself</a>
-		<li><a href="tpj/finance-quote-sidebar">The sidebar</a>
-			which lists the various return labels at the
-			time of writing.
-		<li><a href="tpj/finance-quote-example">An example stock-ticker program</a>
-	   </ul>
-           
-	<p>
-	   HTML-ised versions of the article are being worked upon.  However,
-	   the plain-text versions are very readable.
-	</p>
-
-      </td>
-    </tr>
-  </table>
-
-  <hr align="center">
-
-<div class="footer" align="center">This page was last updated on the 30th
-  of October 2000. Thanks to <a href="http://www.sourceforge.net/">SourceForge</A>
-  for hosting this project.</div>
-</body>
-</html>
@@ -1,105 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-  <title>Finance::Quote Downloads</title>
-  <meta http-equiv="Content-Type"
- content="text/html; charset=iso-8859-1">
-  <link rel="stylesheet" href="./Stylesheet.css">
-</head>
-<body leftmargin="0" topmargin="0"
- style="background-color: rgb(0, 51, 51);" marginheight="0"
- marginwidth="0">
-<div align="center"><img src="Images/logo_small2.gif"
- alt="Finance :: Quote" border="0" height="59" vspace="20" width="300">
-</div>
-<table border="0" cellpadding="0" cellspacing="10" width="100%">
-  <tbody>
-
-    <tr>
-      <td valign="top" width="0">
-      <table border="0" cellpadding="0" cellspacing="5" width="78%">
-        <tbody>
-          <tr valign="middle">
-            <td nowrap="nowrap"><img src="Images/Button2.gif"
- alt="Button" border="0" height="38" width="40"></td>
-            <td nowrap="nowrap">
-            <a href="index.html">Home</a></td>
-
-          </tr>
-          <tr valign="middle">
-            <td nowrap="nowrap"><img src="Images/Button2.gif"
- alt="Button" border="0" height="38" width="40"></td>
-            <td nowrap="nowrap">
-            <a href="documentation.html">Documentation</a></td>
-          </tr>
-          <tr valign="middle">
-            <td><img src="Images/Button2.gif" alt="Button" border="0"
- height="38" width="40"></td>
-
-            <td> <a href="discussion.html">Discussion Groups and
-Mailing
-Lists</a></td>
-          </tr>
-          <tr valign="middle">
-            <td><img src="Images/Button2.gif" alt="Button" border="0"
- height="38" width="40"></td>
-            <td> <a href="developer.html">Bugs, Patches and
-Development </a></td>
-          </tr>
-          <tr valign="middle">
-
-            <td><img src="Images/Button2.gif" alt="Button" border="0"
- height="38" width="40"></td>
-            <td> <a
- href="http://sourceforge.net/projects/finance-quote/"><img
- src="http://sourceforge.net/sflogo.php?group_id=4232&amp;type=1"
- alt="SourceForge Page" border="0" height="31" width="88"></a></td>
-          </tr>
-        </tbody>
-      </table>
-      </td>
-      <td valign="top" width="0">
-      <h2 align="center">Latest Release</h2>
-      <p>The latest tarball release of Finance::Quote can be downloaded <a
- href="https://sourceforge.net/project/showfiles.php?group_id=4232">here</a>.</p>
-      <h2 align="center">Previous Releases</h2>
-      <p>The previous tarball
-release of Finance::Quote (version 1.13) can be downloaded <a
- href="http://prdownloads.sourceforge.net/finance-quote/Finance-Quote-1.13.tar.gz">here</a>.</p>
-      <p>Finance::Quote (version 1.12) can be downloaded <a
- href="http://prdownloads.sourceforge.net/finance-quote/Finance-Quote-1.12.tar.gz">here</a>.</p>
-      <p>Finance::Quote (version 1.11) can be downloaded <a
- href="http://prdownloads.sourceforge.net/finance-quote/Finance-Quote-1.11.tar.gz">here</a>.</p>
-
-      <p>Finance::Quote (version 1.10) can be downloaded <a
- href="http://prdownloads.sourceforge.net/finance-quote/Finance-Quote-1.10.tar.gz">here</a>.</p>
-      <p>Finance::Quote (version 1.08) can be downloaded <a
- href="http://prdownloads.sourceforge.net/finance-quote/Finance-Quote-1.08.tar.gz">here</a>.
-The Debian package of Finance::Quote 1.08
-is <a
- href="http://prdownloads.sourceforge.net/finance-quote/libfinance-quote-perl_1.08-1_all.deb">here</a>.</p>
-      <p>All Finance::Quote
-versions can be found <a
- href="http://sourceforge.net/project/showfiles.php?group_id=4232">here</a></p>
-      <h2 align="center">CVS
-Tree</h2>
-
-      <p>Those people who want to
-play with the development branch of Finance::Quote can should consult
-the directions regarding anonymous CVS access <a
- href="http://sourceforge.net/cvs/?group_id=4232">here</a>.
-Alternatively, you can <a
- href="http://cvs.sourceforge.net/cvstarballs/finance-quote-cvsroot.tar.bz2">download
-a nightly tarball of the CVS tree</a>.</p>
-      </td>
-    </tr>
-  </tbody>
-</table>
-<hr align="center">
-<div class="footer" align="center">This
-page was last updated on the 7th of January 2007. Thanks to <a
- href="http://www.sourceforge.net/">SourceForge</a>
-
-for hosting this project.</div>
-</body>
-</html>
@@ -1,185 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-  <title>Finance::Quote Homepage</title>
-  <meta http-equiv="Content-Type"
- content="text/html; charset=iso-8859-1">
-  <link rel="stylesheet" href="./Stylesheet.css">
-</head>
-<body leftmargin="0" topmargin="0"
- style="background-color: rgb(0, 51, 51);" marginheight="0"
- marginwidth="0">
-<div align="center"><img src="Images/logo_small2.gif"
- alt="Finance :: Quote" border="0" height="59" vspace="20" width="300">
-</div>
-<table border="0" cellpadding="0" cellspacing="10" width="100%">
-  <tbody>
-    <tr>
-      <td valign="top" width="0">
-      <table border="0" cellpadding="0" cellspacing="5" width="78%">
-        <tbody>
-          <tr valign="middle">
-            <td nowrap="nowrap"><img src="Images/Button2.gif"
- alt="Button" border="0" height="38" width="40"></td>
-            <td nowrap="nowrap">
-            <a href="documentation.html">Documentation</a></td>
-          </tr>
-          <tr valign="middle">
-            <td nowrap="nowrap"><img src="Images/Button2.gif"
- alt="Button" border="0" height="38" width="40"></td>
-            <td nowrap="nowrap">
-            <a href="discussion.html">Discussion
-Groups and Mailing Lists </a></td>
-          </tr>
-          <tr valign="middle">
-            <td><img src="Images/Button2.gif" alt="Button" border="0"
- height="38" width="40"></td>
-            <td> <a href="developer.html">Bugs, Patches and Development</a></td>
-          </tr>
-          <tr valign="middle">
-            <td><img src="Images/Button2.gif" alt="Button" border="0"
- height="38" width="40"></td>
-            <td> <a href="download.html">Download</a></td>
-          </tr>
-          <tr valign="middle">
-            <td><img src="Images/Button2.gif" alt="Button" border="0"
- height="38" width="40"></td>
-            <td> <a
- href="http://sourceforge.net/projects/finance-quote/"><img
- src="http://sourceforge.net/sflogo.php?group_id=4232&amp;type=1"
- alt="SourceForge Page" border="0" height="31" width="88"></a></td>
-          </tr>
-        </tbody>
-      </table>
-      </td>
-      <td valign="top" width="0">
-      <h1 align="center">Welcome
-to the Finance::Quote webpage.</h1>
-      <p>Finance::Quote is a perl
-module which can be used to obtain information from a variety of
-sources, including markets in Australia, USA, Canada, Europe, and a
-number of managed funds.</p>
-      <p>The latest version of
-Finance::Quote is (soon to be) available via <a
- href="http://www.cpan.org/">CPAN</a>, and is currently available on
-our <a href="download.html">download
-page</a>.</p>
-      <h2 align="center">News</h2>
-      <p class="new"><b>2015-Feb-02</b>
-        Release 1.37 is available both from CPAN and Sourceforge. This
-        removes some dependencies to obtain better compatibility.</p>
-      <p><b>2014-Feb-17</b>
-        Release 1.20 is available both from CPAN and Sourceforge. This
-        autoinstalls Date::Calc if needed.</p>
-      <p><b>2014-Feb-16</b>
-        Release 1.19 is available both from CPAN and Sourceforge. It
-        solves Yahoo quote retrieval changes and adds 2 new modules.</p>
-      <p><b>2012-Sep-30</b>
-        Release 1.18 is available both from CPAN and Sourveforge. It
-        solves most used module errors.</p>
-      <p><b>2009-Oct-5</b>
-        Release 1.17 is available both from CPAN and Sourceforge.</p>
-      <p><b>2009-Apr-13</b> Release 1.16 is available both from CPAN
-        and Sourceforge. Thanks to Bradley Dean a currency_lookup function is
-        available. As usual, some modules were patched due to site
-        modifications.</p>
-      <p><b>2008-Oct-26</b>
-        Release 1.15 is available both from CPAN and Sourceforge. It
-        is a bugfix release. Upgrade is strongly recommended.</p>
-      <p><b>2008-Oct-15</b>
-        Release 1.14 considered as the latest stable release has been
-        uploaded to CPAN and Sourceforge.</p>
-      <p><b>2008-Sep-21</b>
-        The development of Finance::Quote is undergoing a
-        lifting. More information is available on
-        the <a href="developer.html">developer page</a></p>
-      <p><b>2006-Jul-10</b>
-Finance::Quote 1.12 has been released. The new version includes
-support for new information sources, including Bourso and LeRevenu in
-France, and the Helsinki stock exchange in Finland.  This release also
-fixes the problem with retrieving quotes with the DWS and VWD modules.
-The full set of release notes are available <a
-href="http://sourceforge.net/project/shownotes.php?release_id=430906">
-here</a>. You can download this release from our <a
-href="download.html"> download page</a>.</p>
-      <p><b>2006-Jan-11</b>
-Finance::Quote 1.11 has been released. The new version includes support
-for new information sources, including Sharenet (South Africa) and U.S.
-Federal Bonds.  This release also fixes the problem with retrieving
-currency quotes from Yahoo Finance.  The full set of release notes
-are available <a
- href="http://sourceforge.net/project/shownotes.php?release_id=384496">
-here</a>. You can download this
-release from our <a href="download.html">
-download page</a>.</p>
-      <p><b>2005-Jul-04</b>
-Finance::Quote 1.10 has been released. The new version includes support
-for new information sources, including the New Zealand stock exchange,
-TD Waterhouse Canada
-Efunds, the Swedish Bank, the U.S. Govt. Thrift
-Savings Plan, and several Yahoo sources. The full set of release notes
-are available <a
- href="http://sourceforge.net/project/shownotes.php?release_id=339604">
-here</a>. You can download this
-release from our <a href="download.html">
-download page</a>.</p>
-      <p><b>2005-Jun-30</b>
-Finance::Quote 1.09 has been released. The new version includes support
-for new information sources, including the New Zealand stock exchange,
-TD Waterhouse Canada
-Efunds, the Swedish Bank, the U.S. Govt. Thrift
-Savings Plan, and several Yahoo sources. The full set of release notes
-are available <a
- href="http://sourceforge.net/project/shownotes.php?release_id=338760">
-here</a>. You can download this
-release from our <a href="download.html">
-download page</a>.</p>
-      <p><b>2003-Jul-04</b>
-Finance::Quote 1.08 was released.</p>
-      <p><b>2002-Apr-18</b>
-Finance::Quote 1.07 was released.</p>
-      <p><b>2001-Jun-26</b>
-Finance::Quote 1.06 has been released. The new version includes support
-for many new information sources, including Dutch stocks and indexes,
-UK unit trusts, managed funds from TD waterhouse, and quote lookups
-from <a href="http://www.fool.com">fool.com</a>.
-The full set of release notes are available <a
- href="http://sourceforge.net/project/shownotes.php?release_id=41061">
-here</a>. You can download this
-release from our <a href="download.html">download
-page</a>.</p>
-      <p><b>2001-Feb-23</b>
-Finance::Quote 1.05 has been released. This version fixes some bugs
-that people have been experiencing with currency conversion, and also
-provides easier methods for users to load their custom modules at
-run-time. The new release is available from our <a href="download.html">download
-page</a>.</p>
-      <p><b>2000-Nov-05</b>
-Finance::Quote 1.04 has been released. This version fixes a bug whereby
-the 40th symbol of a large Yahoo lookup would fail. It also removes
-some of the headaches people have been experiencing with the test
-suite. For the adventurous, support for proxy authentication has also
-been added. See the <a
- href="https://sourceforge.net/docman/display_doc.php?docid=1544&amp;group_id=4232">FAQ</a>
-for more details. </p>
-      <p><b>2000-Oct-30</b>
-An article on Finance::Quote was featured in <a
- href="http://www.tpj.com/">The Perl Journal</a>,
-issue number 19. The article is a good introduction to the module and
-well worth reading if you are beginning to work with Finance::Quote.
-The draft is available from our <a href="documentation.html">documentation
-page</a>.
-      </p>
-      <p><a href="http://sourceforge.net/projects/finance-quote">
-Older news items and SourceForge page</a>.</p>
-      </td>
-    </tr>
-  </tbody>
-</table>
-<hr align="center">
-<div class="footer" align="center">This
-page was last updated on the 21th of September 2008. Thanks to <a
- href="http://www.sourceforge.net/">SourceForge</a>
-for hosting this project.</div>
-</body>
-</html>
@@ -1,76 +0,0 @@
-#!/usr/bin/perl -w
-#
-# Example stock-ticker program.  Can look up stocks from multiple
-# markets and return the results in local currency.
-#
-# Revision: 1.1 
-
-use strict;
-use Finance::Quote;
-
-my $CURRENCY = "AUD";	# Set preferred currency here, or empty string for
-			# no conversion.
-
-# The stocks array contains a set of array-references.  Each reference
-# has the market as the first element, and a set of stocks thereafter.
-
-my @STOCKS = ([qw/australia CML ITE BHP/],
-	      [qw/usa MSFT RHAT LNUX/]
-	     );
-
-# These define the format.  The first item in each pair is the label,
-# the second is the printf-style formatting, the third is the width
-# of the field (used in printing headers).
-
-my @labels = (["name",  "%12s",  15],
-	      ["date",  "%11s",  11], 
-	      ["time",  "%10s",  11],
-	      ["last",  "%8.2f",  8],
-	      ["high",  "%8.2f",  8], 
-	      ["low",   "%8.2f",  8],
-	      ["close", "%8.2f",  8], 
-	      ["volume","%10d",  10]);
-
-my $REFRESH = 120;	# Seconds between refresh.
-
-# --- END CONFIG SECTION ---
-
-my $quoter = Finance::Quote->new();
-my $clear  = `clear`;			# So we can clear the screen.
-
-# Build our header.
-
-my $header = "\t\t\t\tSTOCK REPORT" .($CURRENCY ? " ($CURRENCY)" : "") ."\n\n";
-
-foreach my $tuple (@labels) {
-	my ($name, undef, $width) = @$tuple;
-	$header .= sprintf("%".$width."s",uc($name));
-}
-
-$header .= "\n".("-"x79)."\n";
-
-# Header is all built.  Looks beautiful.
-
-$quoter->set_currency($CURRENCY) if $CURRENCY;	# Set default currency.
-
-for (;;) {	# For ever.
-	print $clear,$header;
-
-	foreach my $stockset (@STOCKS) {
-		my ($exchange, @symbols) = @$stockset;
-		my %info = $quoter->fetch($exchange,@symbols);
-
-		foreach my $symbol (@symbols) {
-			next unless $info{$symbol,"success"}; # Skip failures.
-			foreach my $tuple (@labels) {
-				my ($label,$format) = @$tuple;
-				printf $format,$info{$symbol,$label};
-			}
-			print "\n";
-		}
-	}
-
-	sleep($REFRESH);
-}
-
-__END__
@@ -1,36 +0,0 @@
-SIDEBAR - Standard Finance::Quote Labels
-========================================
-Not all exchanges or stocks have all these labels available, but the
-range of information that Finance::Quote can return includes:
-
-name         Company or Mutual Fund Name
-last         Last Price
-high         Highest trade today
-low          Lowest trade today
-date         Last Trade Date  (MM/DD/YY format)
-time         Last Trade Time
-net          Net Change
-p_change     Percent Change from previous day's close
-volume       Volume
-avg_vol      Average Daily Vol
-bid          Bid
-ask          Ask
-close        Previous Close
-open         Today's Open
-day_range    Day's Range
-year_range   52-Week Range
-eps          Earnings per Share
-pe           P/E Ratio
-div_date     Dividend Pay Date
-div          Dividend per Share
-div_yield    Dividend Yield
-cap          Market Capitalization
-ex_div       Ex-Dividend Date.
-nav          Net Asset Value
-yield        Yield (usually 30 day avg)
-exchange     The exchange the information was obtained from.
-success      Did the stock successfully return information? (true/false)
-errormsg     If success is false, this field may contain the reason why.
-method       The module (as could be passed to fetch) which found
-             this information.
-
@@ -1,465 +0,0 @@
-#!/usr/bin/perl -w
-#
-# Run perl over this document to get Jon Orwant preferred formatting.  :)
-#
-
-use strict;
-my $code_indent = -1;	# -1 means we're not in code.
-while (<DATA>) {
-	(/(\t*)#!\/\S+\/perl/) and $code_indent = length($1);
-	$code_indent = -1 if (/__END__/);
-	if ($code_indent >= 0) { s/^\t{0,$code_indent}//; } else { s/^\t*//; }
-	print;
-}
-
-__END__
-
-Finance::Quote (for TPJ)
-Paul Fenwick <pjf at cpan dot org>, Aug 2000
-$Revision: 1.1 $
-
-Introduction
-============
-	If you have a reason to watch the world's financial
-	markets, and you know a little about perl, then you
-	may find that the Finance::Quote package comes in handy.
-	I personally use it to remind myself that I should never
-	buy shares, as I have a good history of losing money
-	on the stock exchange.  However, you can use Finance::Quote
-	to help track those tasty stock options you've been offered,
-	or even to help you build dynamic artwork driven by
-	fluctuations in the world markets[1].
-
-	Finance::Quote is a perl module that makes accessing financial
-	information easy.  You can look up stocks and shares, managed
-	funds, currency rates, and all this from a variety of countries
-	and markets.  It's even easy to add your own specialised sources
-	if you find something the module does not do.
-
-	[1] Yes, this actually exists and uses Finance::Quote to
-	    help drive the back-end.  See 
-	    <http://www.terrestrialmap.org/StockPuppets.htm>.
-
-History (or credit where credit is due).
-========================================
-
-	Finance::Quote started as the Quote module which was
-	distributed as part of Gnucash <http://www.gnucash.org>.
-	This module (simple called "Quote") was a modified version
-	of Finance::YahooQuote written by DJ Padzensky
-	<http://www.padz.net/~djpadz/YahooQuote/>.  Linas Vepstas
-	and Yannick LE NY had added extra sources for GnuCash,
-	at which point I asked if anyone had any objections to me
-	breaking it off into a separate project with a range of
-	uses outside of GnuCash.
-
-	Since that time, many people have contributed to Finance::Quote,
-	including Xose Manoel Ramos (for inheritable Yahoo! methods),
-	Brent Neal, Keith Refson, and Volker Stuerzl for writing
-	pluggable modules, and Peter Thatcher, Jacinta Richardson
-	and Steven Murdoch for various bugfixes and improvements.
-	Ben Hemming was kind enough to save the world from my poor
-	web-design skills and supply a web-page look-and-feel.
-
-
-Legality (Or what can I use it for?)
-====================================
-
-	When discussing Finance::Quote, one question which often
-	arises is "how legal is all this"?  Finance::Quote obtains
-	quotes of various organisations who make this information
-	available via the web.  Actually fetching the data is
-	not illegal[2], web-browsers do it all the time, and
-	Finance::Quote is just a rather specialised web-browser.
-	The main problems occur with what you do with that data.
-
-	Each organisation has a different set of restrictions
-	and conditions pertaining to the data you obtain from
-	them.  The most common restriction is that forbidding
-	redistribution, although some of them are as odd to
-	limit the number of copies you can have in memory at
-	any one time!  The Finance::Quote manual pages provide
-	some pointers as to where these licenses can be found,
-	and it would be wise to check those licenses if you
-	wish to be in safe legal waters.
-
-	In general, obtaining information and displaying it or
-	processing it into some useful form for personal
-	use should be okay -- that's what your web-browser does.
-	Obtaining the information and re-badging it as your
-	own is probably a no-no.  If in doubt, check with your
-	lawyer.
-
-	[2] Although there have been a couple of court cases where
-	    "deep linking" into web-page has been cast into legal
-	    shadow.
-
-Terminology
-===========
-
-	Before we begin, it's worth taking the time to explain a
-	few pieces of terminology that may be otherwise a little
-	confusing.  For simplicity, a stock, mutual fund, index,
-	or other parcel of information which can be fetched using
-	Finance::Quote we will refer to as a "stock".
-
-	All stocks have a unique identifier or "symbol" which we
-	can use to look them up, and an "exchange" (or locality)
-	in which they exist.  For example, VA Linux Systems have
-	the symbol "LNUX" on the Nasdaq exchange.  Symbols are
-	traditionally all upper-case, but there exist some symbols
-	(such as the pseudo-symbols used in the TIAA-CREF module)
-	that are mixed case.
-
-	Finance::Quote essentially provides a way of taking a
-	list of symbols for a given exchange, and returning
-	information about those symbols.  Each bit of information
-	has a "label" (such as volume, close, high, low, etc),
-	which identifies what that information is.  All making
-	sense?  Good.  Let's do something fun then.
-
-Using Finance::Quote
-====================
-
-	The Basics
-	----------
-		I'll demonstrate the usage of Finance::Quote by way of
-		a useful example, which will be expanded upon as we
-		go.  For starters, let's just say you're interested in
-		stocks from a single market, and wish to print their
-		current value and volume traded.
-
-#!/usr/bin/perl -w
-use strict;
-use Finance::Quote;
-
-@ARGV >= 2 or die "Usage: $0 exchange symbol symbol symbol ...\n";
-
-my $exchange = shift;	# Where do we fetch our stocks from.
-my @symbols = @ARGV;	# Which stocks are we interested in.
-
-my $quoter = Finance::Quote->new;	# Create the F::Q object.
-
-$quoter->timeout(30);		# Cancel fetch operation if it takes
-				# longer than 30 seconds.
-
-# Grab our information and place it into %info.
-my %info = $quoter->fetch($exchange,@symbols);
-
-foreach my $stock (@symbols) {
-	unless ($info{$stock,"success"}) {
-		warn "Lookup of $stock failed - ".$info{$stock,"errormsg"}.
-		     "\n";
-		next;
-	}
-	print "$stock:\t\t",
-	      "Volume: ",$info{$stock,"volume"},"\t",
-	      "Price: " ,$info{$stock,"price"},"\n";
-}
-__END__
-
-		If our script was called "showstocks", and you were
-		interested in Australian supermarkets, you could call
-		it like this:
-
-			showstocks australia CML WOW
-
-		This will provide you with information about Coles-Myer
-		and Woolworths.
-
-		Alternatively, if you were interested some US
-		technology stocks, you could try this:
-
-			showstocks usa LNUX RHAT MSFT IBM
-
-		which will provide you with information about VA Linux
-		Systems, Red Hat, Microsoft and International Business
-		Machines.
-
-		This script demonstrates a number of capabilities of
-		Finance::Quote.  In particular:
-
-			* Finance::Quote is object-oriented,
-			  and a Finance::Quote object can be
-			  generated using Finance::Quote->new().
-
-			* The fetch() method can be used for
-			  retrieving information.  This method
-			  is very powerful, and will be explained
-			  in some depth later in this article.
-
-			* The fetch method returns a two-dimensional
-			  hash.  This is the topic of our next
-			  section.
-
-	The Return Hash
-	---------------
-		Finance::Quote's most useful function, fetch(),
-		returns a two-dimensional hash.  This contains
-		a variety of information about the stocks you
-		requested, including volume, price, highs and lows,
-		percentage changes, and other information.  Each
-		key in the hash has two parts:
-
-			$info{$symbol,$label}
-
-		The symbol is the symbol that you've requested.  In
-		the examples above, "RHAT" and "LNUX" are examples
-		of symbols.  The label refers to a specific type
-		of information about that stock, such as "volume",
-		"price", "close", "p_change" or "name".  Labels are
-		always lower-case.
-
-		There exists some very special labels that you should
-		be aware of.  The label "success" is used to
-		indicate if the information could be successfully
-		retrieved.  If the value of the success label for a
-		given stock is false, then no useful information could
-		be gained about that symbol at this time.  If a failure
-		did occur, the reason for that failure will be in the
-		label "errormsg".
-
-		The special label "price" is used to indicate the
-		worth or value of the given stock.  This varies a
-		little depending upon what you're fetching information
-		on.  For stocks, it's usually the last price the stock
-		was traded at.  For some investments, it's the current
-		yield (a percentage per-annum).  For currencies
-		it's the exchange rate, and for indexes it's the
-		last value of that index (in points).
-
-		The reason the price label is important is that it
-		allows for applications to track the movement of
-		information without having to know if we're dealing
-		with a stock or a managed fund or an indicator --
-		the price label will provide us with the information
-		that we (usually) want.  This is particularly
-		useful for things such as stock-tickers, allowing
-		them to track things other than just stocks.
-
-		For applications that care about the details, there
-		are a wide range of labels that can be returned.
-		These include the highest and lowest prices for the
-		day, dividend yields and dates, the time and date
-		that the information is current for, the volume
-		traded, the name of the stock, and many others.
-		The standard labels are listed in the side-bar.
-
-		It's important to remember that the information fetched
-		by Finance::Quote is usually delayed, and so is often 30
-		minutes or more behind what's really happening.  If you're
-		doing currency conversions as well, then the currency
-		conversion rate may also be delayed.  You can use the
-		labels "date" and "time" to determine when the data was
-		valid -- it's not unknown for some sources to provide data
-		that is a week old or more.
-
-Advanced Usage
-==============
-
-	Now, the basics of Finance::Quote are pretty simple.  You
-	create yourself a F::Q object, you ask it for some information,
-	and you get that information back in a hash.  For most
-	applications, this is all you really need.  However,
-	Finance::Quote provides a wide range of extra features to
-	help make your life easier.
-
-	Currency Conversion
-	-------------------
-		Finance::Quote has the ability to look up currency
-		rates, and can even automatically convert foreign
-		stocks into local currencies.  Let's say that
-		you live in Australia, but you have some stocks
-		in the USA.  You may be interested in knowing
-		the value of those stocks in Australian dollars,
-		which have more meaning to you than US dollars.
-		Here's how to do it:
-
-		#!/usr/bin/perl -w
-		use strict;
-		use Finance::Quote;
-
-		my $market = shift;
-		my @stocks = @ARGV;
-
-		my $quoter = Finance::Quote->new();
-		$quoter->set_currency("AUD"); # Aussie dollars, thanks.
-		my %info = $quoter->fetch($market,@stocks);
-
-		# Print the info here.
-
-		__END__
-
-		The set_currency() method asks Finance::Quote to
-		convert all values into the given currency before
-		returning them to you.  Finance::Quote knows which
-		things it can convert (like prices and ranges),
-		and which things it cannot (like percentage changes
-		and volumes).  It's even smart enough to (usually)
-		not touch indexes and other abstract indicators
-		that don't have currencies attached to them.
-
-		Be aware that set_currency() can significantly increase
-		the time of a query, as currency lookup information
-		has to be fetched as well as the stock information.
-
-		It's also possible to fetch currency exchange rates
-		directly.  This is done using the currency() method.
-		Eg:
-
-		my $exchange_rate = $quoter->currency("USD","AUD");
-		print "1 US dollar is $exchange_rate Australian dollars.\n";
-
-		The currency() method can also do clever things like
-		take a prefix to the FROM currency.  Hence the following
-		script is a quick'n'dirty command-line utility to
-		convert between currencies:
-
-#!/usr/bin/perl -w
-use strict;
-use Finance::Quote;
-
-# Command-line currency conversion.
-
-die "Usage: $0 FROM TO\n" unless defined($ARGV[1]);
-
-my $quoter = Finance::Quote->new();
-my $exchange_rate = $quoter->currency($ARGV[0],$ARGV[1]);
-
-die "Don't know how to convert $ARGV[0] to $ARGV[1]\n" unless $exchange_rate;
-
-print "$ARGV[0] -> $ARGV[1] = $exchange_rate\n";
-__END__
-
-		If this script were to be called "currency-lookup", you
-		could show the going rate between Australian and American
-		dollars like this:
-
-		currency-lookup AUD USD
-
-		If you wanted to know how much 95 Australian Dollars were
-		in French Francs, you could do this:
-
-		currency-lookup "95 AUD" FRF
-
-		
-	Fail-over Support and Custom Modules
-	-----------------------------------
-		Finance::Quote provides automatic fail-over support
-		if you specify the market that you're interested
-		in and not the actual source from which you want
-		to fetch it.  This means that if you use "nasdaq" instead
-		of "yahoo" as your source, Finance::Quote will
-		automatically try all sources of nasdaq data in
-		case the first one failed.  Fail-over support is
-		on by default in all newly create Finance::Quote
-		objects.
-
-		Fail-over support can increase the time of a query,
-		especially if you're searching for a non-existent
-		stock.  It's possible to (un)set fail-over support
-		explicitly like this:
-
-		$quoter->failover(0);	# Disable failover support.
-
-		Likewise, when you create your Finance::Quote object, it's
-		possible to state which modules you'd like to be
-		able to fetch information from.  For example:
-
-		my $quoter = Finance::Quote->new("Yahoo::Australia");
-
-		will only use the Finance::Quote::Yahoo::Australia 
-		module for queries.  This is particularly useful
-		if you have a deal with a particular information
-		supplier, or otherwise wish to restrict where
-		Finance::Quote can search for information.  Specifying modules
-		to load at creation time can also let you load
-		custom modules that are not part of the standard
-		Finance::Quote distribution.
-
-		my $quoter = Finance::Quote->new("-defaults", "MyBank");
-
-		Here we would load the Finance::Quote::MyBank module,
-		as well as all the default modules that are packaged
-		with Finance::Quote.  Note that "-defaults" as an
-		argument to new is only magical when passed as the
-		first argument (although in the future it MAY be
-		legal to pass it anywhere in the arguments list).
-
-		If you're interested in writing your own modules for
-		Finance::Quote, then you should read the Hacker's Guide
-		that comes with Finance::Quote, or which can be found
-		in the Finance::Quote documentation manager at
-		<http://sourceforge.net/docman/index.php?group_id=4232>.
-
-	Required Labels
-	---------------
-		Fail-over support is a wonderful thing -- the source you're
-		fetching data from may have fallen over and you might never
-		have to worry.  Unfortunately, not all sources provide all
-		the information you're looking for, and having bits of
-		information disappear when you're used to them being there
-		can be a little surprising.
-
-		Rather than having to worry about your fail-over sources not
-		providing the information you're looking for, Finance::Quote
-		allows you to define a list of things that are important
-		to you, using the require_labels() method.  Say that your
-		program relies upon the labels price, date, high, low and
-		volume.  You can express this to your Finance::Quote object
-		like so:
-
-		    $quoter->require_labels(qw/price date high low volume/);
-	
-		If you now use the $quoter->fetch() to obtain information, you
-		can be guaranteed that those fields will be available if they
-		apply to what you've requested.  This means you can use
-		fail-over methods safe in the knowledge that the information
-		you actually care about will not disappear.
-
-	Tricks with the user agent
-	--------------------------
-
-		If you've ever used LWP::UserAgent before, then you'll be
-		pleased to know that you can customise the underlying
-		LWP::UserAgent object in Finance::Quote.  For example:
-
-			$quoter->user_agent->agent("MyTicker/0.1");
-		
-		will cause the $quoter object to identify itself as
-		"MyTicker/0.1" in HTTP sessions.  Likewise, this lets
-		you set your proxy explicitly:
-
-			$quoter->user_agent->proxy('http',$MY_PROXY);
-		
-		Note that the UserAgent that Finance::Quote uses
-		automatically respects proxy environment variables
-		(such as "http_proxy") at creation time.
-
-		For more information on what you can and cannot do
-		here, check out the documentation for LWP::UserAgent.
-
-
-Rolling your own Finance::Quote module
-=======================================
-	As well as using the standard Finance::Quote modules, it's
-	also possible to write your own module that you can ask
-	Finance::Quote to use.  Writing such a module can be a tricky
-	task, and is beyond the scope of this article.
-
-	The Finance::Quote package does come with its own Hacker's Guide
-	explaining how to write a Finance::Quote module.  This can be
-	found with other documentation at
-	<http://finance-quote.sourceforge.net/documentation.html>
-	
-
-Example program -- Stock ticker
-===============================
-	
-	We'll finish off with an example of a useful, real-life program.
-	In this case it's a text-based stock ticker.  The code is
-	intentionally simple to display the features of Finance::Quote,
-	but it provides a very clear and useful display for stocks that
-	you may have your eye on.
-
-	[Example supplied in separate file]
@@ -3,12 +3,11 @@
 #    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
 #    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
 #    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
+#    Copyright (C) 2000, Paul Fenwick <pjf@Acpan.org>
 #    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
 #    Copyright (C) 2001, Rob Sessink <rob_ses@users.sourceforge.net>
 #    Copyright (C) 2003, Pawel Konieczny <konieczp@users.sourceforge.net>
 #    Copyright (C) 2004, Johan van Oostrum
-#    Copyright (C) 2009, Herman van Rink
 #
 #    This program is free software; you can redistribute it and/or modify
 #    it under the terms of the GNU General Public License as published by
@@ -33,31 +32,54 @@
 
 require 5.005;
 
-use strict;
+use strict; 
 
 package Finance::Quote::AEX;
 
-use vars qw( $AEX_URL);
+use vars qw($VERSION $AEX_URL);
+use vars qw($AEXOPT_URL $AEXOPT_FRAME_HREF $AEXOPT_SUBFRAME_URL $AEXFUT_URL $AEXOPT_FULL %AEXOPT_SUBFRAMES_CACHE $AEXOPT_USE_SUBFRAMES); 
 
 use LWP::UserAgent;
 use HTTP::Request::Common qw(POST);
 use HTML::TableExtract;
 use CGI;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.0';
 
 # URLs of where to obtain information
 
-my $AEX_URL = "http://www.euronext.com/search/download/trapridownloadpopup.jcsv?pricesearchresults=actif&filter=1&belongsToList=market_EURLS&mep=8626&lan=NL&resultsTitle=Amsterdam+-+Euronext&cha=1800&format=txt&formatDecimal=.&formatDate=dd/MM/yy";
+my $AEX_URL = 'http://www.aex.nl/scripts/marktinfo/koerszoek.asp'; 
+my $AEXOPT_URL = 'http://www.aex.nl/scripts/marktinfo/OptieKoersen.asp?taal=en';
+my $AEXOPT_FRAME_HREF = "/scripts/marktinfo/OptieFrame.asp";
+my $AEXOPT_SUBFRAME_URL = "http://www.aex.nl/scripts/marktinfo/ShowOptie.asp?taal=en";
+my $AEXFUT_URL = 'http://www.aex.nl/scripts/marktinfo/Futures.asp?taal=en';
+
+# Undocumented features:
+# 
+# $AEXOPT_FULL:
+# 1 - download and search all traded options for a given underlying
+# 0 - download and search only most active options (faster but some options are not visible)
+$AEXOPT_FULL = 1;
+#
+# %AEXOPT_SUBFRAMES_CACHE: Cache made global to allow advanced clients to flush it
+%AEXOPT_SUBFRAMES_CACHE = ();
+# Euronext reduces amount of information on AEX.nl; e.g. subframes may be disabled
+$AEXOPT_USE_SUBFRAMES = 0;
 
 sub methods { return (dutch       => \&aex,
-                      aex         => \&aex) }
+                      aex         => \&aex,
+                      aex_options => \&aex_options,
+                      aex_futures => \&aex_futures) } 
 
 {
-  my @labels = qw/name symbol price last date time p_change bid ask offer open high low close volume currency method exchange/;
-
-  sub labels { return (dutch       => \@labels,
-                       aex         => \@labels) }
+        my @labels = qw/name symbol price last date time p_change bid ask offer open high low close volume currency method exchange/;
+        my @opt_labels = qw/name price last date time bid ask open high low close volume oi trade_volume bid_time bid_volume ask_time ask_volume currency method exchange/;
+	my @fut_labels = qw/name price last date time change bid ask open high low close volume currency method exchange/;
+
+        sub labels { return (dutch       => \@labels,
+                             aex         => \@labels,
+                             aex_options => \@opt_labels,
+                             aex_futures => \@fut_labels); } 
 }
 
 # ==============================================================================
@@ -65,112 +87,479 @@ sub methods { return (dutch       => \&aex,
 # Stocks and indices
 
 sub aex {
-  my $quoter = shift;
-  my @symbols = @_;
-  return unless @symbols;
-
-  my (%info,$url,$reply,$te);
-  my ($row, $datarow, $matches);
-  my ($time);
-
-  $url = $AEX_URL;    		# base url
-
-  # Create a user agent object and HTTP headers
-  my $ua  = new LWP::UserAgent(agent => 'Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)');
-
-  # Compose POST request
-  my $request = new HTTP::Request("GET", $url);
-
-  $reply = $ua->request( $request );
-  #print Dumper $reply;
-  if ($reply->is_success) {
-
-    # Write retreived data to temp file for debugging
-    use POSIX;
-    my $filename = tmpnam();
-    open my $fw, ">", $filename or die "$filename: $!";
-    print $fw $reply->content;
-    close $fw;
-
-    # Open reply to read lins
-    open FP, "<", \$reply->content or die "Unable to read data: $!";
-
-    # Open temp file instead while debugging
-    #open FP, "<", $filename or die "Unable to read data: $!";
-
-    # Skip the first 4 lines, which are not CSV
-    my $dummy = <FP>;	# Typical content: Stocks
-    $dummy = <FP>;		# Typical content: Amsterdam - Euronext
-    $dummy = <FP>;		# Typical content:
-    $dummy = <FP>;		# Typical content: Instrument's name;ISIN;Euronext code;Market;Symbol;ICB Sector (Level 4);Handelsvaluta;Laatst;Aantal;D/D-1 (%);Datum-tijd (CET);Omzet;Totaal aantal aandelen;Capitalisation;Trading mode;Dag Open;Dag Hoog;Dag Hoog / Datum-tijd (CET);Dag Laag;Dag Laag / Datum-tijd (CET); 31-12/Change (%); 31-12/Hoog; 31-12/Hoog/Datum; 31-12/Laag; 31-12/Laag/Datum; 52 weken/Change (%); 52 weken/Hoog; 52 weken/Hoog/Datum; 52 weken/Laag; 52 weken/Laag/Datum;Suspended;Suspended / Datum-tijd (CET);Reserved;Reserved / Datum-tijd (CET)
-
-    while (my $line = <FP>) {
-      #print Dumper $line;
-      my @row_data = $quoter->parse_csv_semicolon($line);
-      #print Dumper \@row_data;
-      my $row = \@row_data;
-      #print Dumper $row;
-      next unless @row_data;
-
-      foreach my $symbol (@symbols) {
-
-        my $found = 0;
-
-        # Match Fund's name, ISIN or symbol
-        my $currentSymbol = 0;
-        foreach my $i (0,1,4) {
-            $currentSymbol = ( @$row[$i] eq $symbol ) if defined(@$row[$i]);
-            last if $currentSymbol;
+ my $quoter = shift;
+ my @symbols = @_;
+ return unless @symbols;
+   
+ my (%info,$url,$reply,$te);
+ my ($row, $datarow, $matches);
+ my ($time);
+
+ $url = $AEX_URL;    		# base url 
+
+# Create a user agent object and HTTP headers
+ my $ua  = new LWP::UserAgent(agent => 'Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)');
+
+ my $headers = new HTTP::Headers(
+    Accept => "text/html, text/plain, image/*",
+    Content_Type => "application/x-www-form-urlencoded");
+ 
+ foreach my $symbol (@symbols) {
+
+    # Compose form-data
+    my $q = new CGI( {zoek => "$symbol"} );
+    my $form_data = $q->query_string;
+
+    # Compose POST request
+    my $request = new HTTP::Request("POST", $url, $headers);
+    #printf $request . "\n";
+    $request->content( $form_data );
+
+    # Pass request to the user agent and get a response back
+    $reply = $ua->request( $request );
+
+    if ($reply->is_success) { 
+
+     # print STDOUT $reply->content,"\n";
+
+     # Define the headers of the table to be extracted from the received HTML page
+     $te = new HTML::TableExtract( headers => [qw(Fonds Current Change Time Bid Offer Volume High Low Open)]);
+
+     # Parse table
+     $te->parse($reply->content); 
+     
+     # Check for a page without tables
+     # This gets returned when a bad symbol name is given
+     unless ( $te->tables ) 
+     {
+       $info {$symbol,"success"} = 0;
+       $info {$symbol,"errormsg"} = "Fund name $symbol not found, bad symbol name";
+       next;
+     } 
+     
+     # extract table contents
+     my @rows; 
+     unless (@rows = $te->rows)
+     {
+       $info {$symbol,"success"} = 0;
+       $info {$symbol,"errormsg"} = "Parse error";
+       next;
+     }
+
+     # search for the fund within the table-rows (as ther might be other
+     # funds having the same fundname in their prefix)
+     my $found = 0;
+     my $i = 0;
+     while ($i < @rows ) {
+       my $a = lc($rows[$i][0]);	# convert to lowercase
+       my $b = lc($symbol);
+       $a =~ s/\s*//g;		# remove spaces
+       $b =~ s/\s*//g;
+       if ($a eq $b) {
+          $found = 1;
+          last
+       }
+       $i++;
+     }
+ 
+     unless ( $found ) 
+     {
+       $info {$symbol,"success"} = 0;
+       $info {$symbol,"errormsg"} = "Fund name $symbol not found";
+       next;
+     }
+
+#    print STDOUT "nr rows: ", $max;
+#    print STDOUT "$found,\n rows[", $i, "][0]: $rows[$i][0], symbol: $symbol\n";
+
+#    $info {$symbol, "success"} = 1;
+     $info {$symbol, "exchange"} = "Amsterdam Euronext eXchange";
+     $info {$symbol, "method"} = "aex";
+     $info {$symbol, "symbol"} = $symbol;
+     ($info {$symbol, "last"} = $rows[$i][1]) =~ s/\s*//g; # Remove spaces
+     ($info {$symbol, "bid"} = $rows[$i][4]) =~ s/\s*//g; 
+     ($info {$symbol, "offer"} = $rows[$i][5]) =~ s/\s*//g;
+     ($info {$symbol, "high"} = $rows[$i][7]) =~ s/\s*//g; 
+     ($info {$symbol, "low"} = $rows[$i][8]) =~ s/\s*//g;
+     ($info {$symbol, "open"} = $rows[$i][9]) =~ s/\s*//g;
+     ($info {$symbol, "close"} = $rows[$i][1]) =~ s/\s*//g;
+     ($info {$symbol, "p_change"} = $rows[$i][2]) =~ s/\s*//g;
+     ($info {$symbol, "volume"} = $rows[$i][6]) =~ s/\s*//g;
+
+# Split the date and time from one table entity 
+     my $dateTime = $rows[$i][3];
+
+# Check for "dd mmm yyyy hh:mm" date/time format like "01 Aug 2004 16:34" 
+     if ($dateTime =~ m/(\d{2}) \s ([a-z]{3}) \s (\d{4}) \s
+                        (\d{2}:\d{2})/xi ) { 
+       $quoter->store_date(\%info, $symbol, {month => $2, day => $1, year => $3});
+       $info {$symbol, "time"} = "$4";
+     }
+
+     $info {$symbol, "currency"} = "EUR";
+     $info {$symbol, "success"} = 1; 
+   } else {
+     $info {$symbol, "success"} = 0;
+     $info {$symbol, "errormsg"} = "Error retrieving $symbol ";
+#    $info {$symbol, "errormsg"} = $reply->message;
+   }
+ } 
+
+# print STDOUT("Resultaat:  $reply->message \n Fondsnaam: $symbol");
+
+ return %info if wantarray;
+ return \%info;
+} 
+
+
+########################################################################
+# Options
+
+# Input list should be a list of symbols in a form of
+# 'AEX C JAN 2004 300.00' (case-insensitive)
+# or just 'AEX' which fetches all options for the given underlying symbol
+#
+# There are two ways to get option data:
+# 1. All options from one page
+#    Advantages: just one http fetch per one underlying
+#    Disadvantages: no volume, no open interest, parsing takes long
+# 2. Each option data from a separate subframe
+#    Advantages: all data (volume, oi); quick parse
+#    Disadvantages: many fetches if many options requested; cannot be done as first;
+#    date label unavailable
+#
+# Especially the last disadvantage is important: to get the address of the subframe,
+# the main frame has to be fetched and parsed.
+#
+# The algorithm below uses the first possibility when all options for a given underlying
+# are requested, and the second, when individual options are requested (unles $AEXOPT_USE_SUBFRAMES is 0).
+# To speed up the second, a cache of urls of subframes is maintained
+
+sub aex_options {
+    my $quoter = shift;
+    my @symbols = @_;
+    my %info;                   # return hash
+    return unless @symbols;
+
+    # we allow ambiguous input: both underlyings and individual options
+    # so we need to collect a list of all underlyings needed for which
+    # main pages have to be fetched.  This is needed when:
+    # 1. Explicity underlying is requested;
+    # 2. Explicit option is not known in subframes cache
+    # 3. Usage of subframes is disabled
+    my @underlyings = grep { /^\w+$/ || !defined($AEXOPT_SUBFRAMES_CACHE{uc $_}) || !$AEXOPT_USE_SUBFRAMES } @symbols;
+
+    # Extract underlying names from this list
+    @underlyings = map { uc($_) =~ /^(\w+)/ } @underlyings;
+
+    # we remove the duplicates from @underlyings
+    { my %seen; @underlyings = grep { !$seen{$_}++ } @underlyings; }
+
+    # %lookup will allow quick check whether a given symbol is requested
+    my %lookup;
+    $lookup{uc $_} = $_ foreach (@symbols);
+
+    my $ua = $quoter->user_agent;
+    $ua->agent('Mozilla/5.0');          # otherwise AEX IIS breaks down
+
+    foreach my $underlying (@underlyings) {
+
+        my $req = HTTP::Request->new(GET => $AEXOPT_URL . "&a=" . $AEXOPT_FULL . "&Symbool=" . $underlying);
+        my $reply = $ua->request($req);
+
+        # get date in Dutch (dd mmm yyyy)
+        my ($date) = $reply->content =~ m[<OPTION\s+SELECTED>(.*?)</OPTION>]mi;
+
+        unless ($reply->is_success && $date) {
+            foreach (grep /^$underlying(\s+[CP]\b)?/i, @symbols) {
+                $info {$_, "success"} = 0;
+                $info {$_, "errormsg"} = "Error retrieving options for underlying $underlying";
+            }
+            next;
         }
-        if ( $currentSymbol ) {
-          $info {$symbol, "exchange"} = "Amsterdam Euronext eXchange";
-          $info {$symbol, "method"} = "aex";
-          $info {$symbol, "symbol"} = @$row[4];
-          ($info {$symbol, "last"} = @$row[7]) =~ s/\s*//g;
-          $info {$symbol, "bid"} = undef;
-          $info {$symbol, "offer"} = undef;
-          $info {$symbol, "low"} = @$row[18];
-          $info {$symbol, "close"} = undef;
-          $info {$symbol, "p_change"} = @$row[9];
-          ($info {$symbol, "high"} = @$row[16]) =~ s/\s*//g;
-          ($info {$symbol, "volume"} = @$row[8]) =~ s/\s*//g;
-
-          # Split the date and time from one table entity
-          my $dateTime = @$row[10];
-
-          # Check for "dd mmm yyyy hh:mm" date/time format like "01 Aug 2004 16:34"
-          if ($dateTime =~ m/(\d{2})\/(\d{2})\/(\d{2}) \s
-                             (\d{2}:\d{2})/xi ) {
-            $quoter->store_date(\%info, $symbol, {month => $2, day => $1, year => $3});
-          }
-
-          $info {$symbol, "currency"} = "EUR";
-          $info {$symbol, "success"} = 1;
+
+        cache_subframes( $underlying, $reply->content ) if $AEXOPT_USE_SUBFRAMES;
+
+        if ( defined($lookup{$underlying}) || !$AEXOPT_USE_SUBFRAMES ) {
+            # main page is parsed only when all options are requested
+            # (otherwise it has been fetched only to collect subframes hrefs)
+            # It is also parsed when usage of subframes is disabled
+
+            #print STDERR $reply->content,"\n";
+            my $te = new HTML::TableExtract( depth => 2, count => 0 );
+            $te->parse($reply->content);
+
+            my @options;   # list collecting all existing series
+
+            foreach my $row ($te->rows) {
+                my $series = uc $row->[9];
+
+                # skip column headings; we assume that AEX will not change the order
+                next if $series =~ /SERIES/; 
+
+                # normalize option name: convert YY to YYYY if needed
+                $series =~ s/^(\w+)\s(\d{2}\s.*)$/$1 20$2/;
+                # remove commas from strike prices
+                $series =~ tr/,//d;
+
+                local *parse_option = sub {
+                    my ($type, $pos) = @_;
+                    my $symbol = "$underlying $type $series";
+                    push  @options, $symbol;
+                    #print "   ", join(',', @$row), "\n";
+
+                    # use user's name for explicitly requested options
+                    $symbol = $lookup{$symbol} || $symbol;
+
+                    # explicitly requested options will be fetched from subframes later
+                    # so skipping them here
+                    $info {$symbol, "success"} = 1 if (!defined $lookup{$symbol} || !$AEXOPT_USE_SUBFRAMES);
+
+                    $info {$symbol, "exchange"} = "Euronext Amsterdam Derivative Markets";
+                    $info {$symbol, "method"} = "aex_options";
+                    $info {$symbol, "name"} = "$underlying $type $series";
+                    foreach my $label (qw/close open high low last time bid ask/) {
+                        ($info {$symbol, $label} = $row->[$pos++]) =~ tr/0-9.://cd; # Remove garbage
+                        undef $info {$symbol, $label} if $info {$symbol, $label} eq "";
+                    }
+		    $quoter->store_date(\%info, $symbol, {eurodate => $date});
+                    $info {$symbol, "currency"} = "EUR";
+                    $info {$symbol, "price"} = $info {$symbol, "last"};
+                };
+
+                parse_option("C", 1);
+                parse_option("P", 11);
+
+            } # foreach $row
+
+            # if the underlying is explicitly requested, "success" has to be reported properly
+            if ( $lookup{$underlying} ) {
+                if (@options) {
+                    $info {$lookup{$underlying}, "success"} = 1;
+                } else {
+                    $info {$lookup{$underlying}, "success"} = 0;
+                    $info {$lookup{$underlying}, "errormsg"} = "No options found for underlying $underlying";
+                }
+
+                # handy extension of the standard F::Q rules: list of all existing options series
+                # per underlying
+                $info { $lookup{$underlying}, "options"} = \@options;
+            }
+
+        } # if defined $lookup{$underlying}
+
+    } # foreach $undelying
+
+    # fetch explict options from subframes
+    foreach my $symbol (@symbols) {
+        if (!defined ($info {$symbol, "success"}) ) {
+
+            unless (defined $AEXOPT_SUBFRAMES_CACHE{uc $symbol} ) {
+                $info {$symbol, "success"} = 0;
+                $info {$symbol, "errormsg"} = "Option series not found";
+                next;
+            }
+
+            my ($underlying, $type, $series) = uc($symbol) =~ /^(\w+) ([CP]) (.*)/;
+
+            # we request always call and put together
+            my $req = HTTP::Request->new(GET => $AEXOPT_SUBFRAME_URL . 
+                "&C=" . $AEXOPT_SUBFRAMES_CACHE{"$underlying C $series"} .
+                "&P=" . $AEXOPT_SUBFRAMES_CACHE{"$underlying P $series"} );
+            my $reply = $ua->request($req);
+
+            unless ($reply->is_success) {
+                $info {$symbol, "success"} = 0;
+                $info {$symbol, "errormsg"} = "Error retrieving option $symbol";
+                next;
+            }
+
+            #print STDERR $reply->content,"\n";
+            my $te = new HTML::TableExtract( depth => 0, count => 0 );
+            $te->parse($reply->content);
+
+            local *parse_option = sub {
+                my ($type, $col, $symbol) = @_;
+
+                return if !defined $symbol;
+
+                $info {$symbol, "success"} = 1;
+                $info {$symbol, "exchange"} = "Amsterdam Euronext eXchange";
+                $info {$symbol, "method"} = "aex_options";
+                $info {$symbol, "name"} = "$underlying $type $series";
+                $info {$symbol, "currency"} = "EUR";
+
+                foreach my $row ($te->rows) {
+                    $_ = $row->[0];
+
+                    # standard labels
+                    $info {$symbol, 'close'} = $row->[$col]   if /^Vorig Slot/;
+                    $info {$symbol, 'open'}  = $row->[$col]   if /^OpenKoers/;
+                    $info {$symbol, 'high'}  = $row->[$col]   if /^HoogsteKoers/;
+                    $info {$symbol, 'low'}   = $row->[$col]   if /^LaagsteKoers/;
+                    $info {$symbol, 'last'}  = $row->[$col]   if /^LaatsteKoers/;
+                    $info {$symbol, 'time'}  = $row->[$col+1] if /^LaatsteKoers/;
+                    $info {$symbol, 'bid'}   = $row->[$col]   if /^BiedKoers/;
+                    $info {$symbol, 'ask'}   = $row->[$col]   if /^LaatKoers/;
+
+                    # additional labels
+                    $info {$symbol, 'volume'}       = $row->[$col+2] if /^Naam/;
+                    $info {$symbol, 'oi'}           = $row->[$col]   if /^Open Interest/;
+                    $info {$symbol, 'trade_volume'} = $row->[$col+2] if /^LaatsteKoers/;
+                    $info {$symbol, 'bid_time'}     = $row->[$col+1] if /^BiedKoers/;
+                    $info {$symbol, 'bid_volume'}   = $row->[$col+2] if /^BiedKoers/;
+                    $info {$symbol, 'ask_time'}     = $row->[$col+1] if /^LaatKoers/;
+                    $info {$symbol, 'ask_volume'}   = $row->[$col+2] if /^LaatKoers/;
+                }
+
+                # remove garbage
+                foreach my $label (qw/close open high low last time bid ask 
+                    volume oi trade_volume bid_time bid_volume ask_time ask_volume/)
+                {
+                    if (defined $info {$symbol, $label}) {
+                        $info {$symbol, $label} =~ tr/0-9.://cd;
+                        undef $info {$symbol, $label} if $info {$symbol, $label} eq "";
+                    }
+                }
+                $info {$symbol, "price"} = $info {$symbol, "last"};
+            };
+
+            parse_option("C", 1, $lookup{"$underlying C $series"});
+            parse_option("P", 4, $lookup{"$underlying P $series"});
         }
-      }
+
+    } # foreach $symbol
+
+    return wantarray? %info : \%info;
+}
+
+# cache_subframes: update $AEXOPT_SUBFRAMES_CACHE 
+# with the collected reference numbers for calls and puts
+#
+sub cache_subframes {
+    my $underlying = shift;
+    my @subframes = $_[0] =~ m[<A\s+HREF="$AEXOPT_FRAME_HREF.*?&c=(\d+)&p=(\d+)".*?>(.*?)</A>]sigo;
+
+    while (@subframes) {
+        # @subframes contains n*3 elements
+        my $callref = shift @subframes;
+        my $putref = shift @subframes;
+        my $series = uc shift @subframes;  # fromat like "Oct 07 1,000.00"
+
+        # normalize option name: convert YY to YYYY if needed
+        $series =~ s/^(\w+)\s(\d{2}\s.*)$/$1 20$2/;
+
+        # remove commas from strike prices
+        $series =~ tr/,//d;
+
+        $AEXOPT_SUBFRAMES_CACHE{"$underlying C $series"} = $callref;
+        $AEXOPT_SUBFRAMES_CACHE{"$underlying P $series"} = $putref;
     }
-  }
-
-  foreach my $symbol (@symbols) {
-    unless ( !defined($info {$symbol, "success"}) || $info {$symbol, "success"} == 1 )
-      {
-        $info {$symbol,"success"} = 0;
-        $info {$symbol,"errormsg"} = "Fund name $symbol not found";
-        next;
-      }
-  }
-
-  #print Dumper \%info;
-  return %info if wantarray;
-  return \%info;
 }
 
 
-1;
+
+########################################################################
+# Input list should be a list of symbols in a form of
+# 'FTI JAN 2004' (case-insensitive)
+# or just 'FTI' which fetches all futures series
+#
+
+sub aex_futures {
+    my $quoter = shift;
+    my @symbols = @_;
+    my %info;                   # return hash
+    return unless @symbols;
+
+    # we allow ambiguous input: both futures symbols and individual futures series
+    # so we need to collect a pure list of all futures needed
+    my @futures = map { uc($_) =~ /^(\w+)/ } @symbols;
+
+    # we remove the duplicates from @futures
+    { my %seen; @futures = grep { !$seen{$_}++ } @futures; }
+
+    # %lookup will allow quick check whether a given symbol is requested
+    my %lookup;
+    $lookup{uc $_} = $_ foreach (@symbols);
+
+    my $ua = $quoter->user_agent;
+    $ua->agent('Mozilla/5.0');          # otherwise AEX IIS breaks down
+
+    foreach my $future (@futures) {
+
+        my $req = HTTP::Request->new(GET => $AEXFUT_URL . "&symbool=" . $future);
+        #print STDERR $req->uri(),"\n";
+        my $reply = $ua->request($req);
+        #print STDERR $reply->content,"\n";
+        my ($date) = $reply->content =~ m[$future Futures at (.*?)<BR>]mi;
+
+        unless ($reply->is_success && $date) {
+            foreach (grep /^$future\b/i, @symbols) {
+                $info {$_, "success"} = 0;
+                $info {$_, "errormsg"} = "Error retrieving futures $future";
+            }
+            next;
+        }
+
+        my $te = new HTML::TableExtract(
+            headers => ['Stock','Current','Dif.','Date / Time','Bid','Ask','Volume','High','Low','Open']
+        );
+        $te->parse($reply->content);
+
+        my @all_futures;
+        foreach my $row ($te->rows) {
+            (my $series = uc $row->[0]) =~ s/\s+$//; # get rid of trailing spaces immediately
+
+            # normalize future series name: convert YY to YYYY if needed
+            $series =~ s/^(\w+)\s(\d{2})$/$1 20$2/;
+
+            my $symbol = $lookup{"$future $series"};
+            if ($lookup{$future} || $symbol) {
+                #print "   ", join(',', @$row), "\n";
+                $symbol ||= "$future $series";
+                push  @all_futures, $symbol;
+
+                $info {$symbol, "success"} = 1;
+                $info {$symbol, "exchange"} = "Euronext Amsterdam Derivative Markets";
+                $info {$symbol, "method"} = "aex_futures";
+                $info {$symbol, "name"} = "$future $series";
+                my $pos = 1;
+                foreach my $label (qw/last change time bid ask volume high low open/) {
+                    ($info {$symbol, $label} = $row->[$pos++]) =~ tr/-0-9.://cd; # Remove garbage
+                    undef $info {$symbol, $label} if $info {$symbol, $label} eq "";
+                }
+                $info {$symbol, "close"} = $info {$symbol, "last"} - ($info {$symbol, "change"} || 0);
+		$quoter->store_date(\%info, $symbol, {eurodate => $date});
+                $info {$symbol, "currency"} = "EUR";
+                $info {$symbol, "price"} = $info {$symbol, "last"};
+            }
+
+        }
+
+        # if all futures are explicitly requested, "success" has to be reported properly
+        if ($lookup{$future}) {
+            if (@all_futures) {
+                $info {$lookup{$future}, "success"} = 1;
+                # handy extension of the standard F::Q rules: list of all collected series
+                # per future symbol
+                $info { $lookup{$future}, "futures"} = \@all_futures;
+            } else {
+                $info {$lookup{$future}, "success"} = 0;
+                $info {$lookup{$future}, "errormsg"} = "Error retrieving futures $future";
+            }
+        }
+
+    } # foreach $future 
+
+    return wantarray? %info : \%info;
+}
+
+
+1; 
 
 =head1 NAME
 
-Finance::Quote::AEX Obtain quotes from Amsterdam Euronext eXchange
+Finance::Quote::AEX Obtain quotes from Amsterdam Euronext eXchange 
 
 =head1 SYNOPSIS
 
@@ -179,19 +568,28 @@ Finance::Quote::AEX Obtain quotes from Amsterdam Euronext eXchange
     $q = Finance::Quote->new;
 
     %info = Finance::Quote->fetch("aex","AAB 93-08 7.5");  # Only query AEX
-    %info = Finance::Quote->fetch("dutch","AAB 93-08 7.5"); # Failover to other sources OK
+    %info = Finance::Quote->fetch("dutch","AAB 93-08 7.5"); # Failover to other sources OK 
+
+    # Fetch specific option
+    %info = Finance::Quote->fetch("aex_options","PHI C OCT 2007 20.00");
+
+    # Fetch all options in PHI
+    %info = Finance::Quote->fetch("aex_options","PHI");
+
+    # Fetch future in AEX
+    %info = Finance::Quote->fetch("aex_futures","FTI OCT 2005");
 
 =head1 DESCRIPTION
 
 This module fetches information from the "Amsterdam Euronext
 eXchange AEX" http://www.aex.nl. Only local Dutch investment funds
-and all traded here options and futures are available.
+and all traded here options and futures are available. 
 
-This module is loaded by default on a Finance::Quote object. It's
+This module is loaded by default on a Finance::Quote object. It's 
 also possible to load it explicity by placing "AEX" in the argument
 list to Finance::Quote->new().
 
-Information obtained by this module may be covered by www.aex.nl
+Information obtained by this module may be covered by www.aex.nl 
 terms and conditions See http://www.aex.nl/ for details.
 
 =head2 Stocks And Indices
@@ -202,16 +600,79 @@ to have failover with future sources for Dutch stocks. Using the "aex"
 method will guarantee that your information only comes from the Euronext
 Amsterdam website.
 
-Note that options and futures are not supported by this module.
+=head2 Options
+
+To fetch stock or index options quotes, use the "aex_options" method.
+Specifying which option to fetch can be done in two ways: naming the
+underlying value, or naming a specific option.  In the first case, all
+tradable options for the given underlying will be returned.  In the second
+case, only the requested options will be returned.  When naming an option,
+use a string consisting of the following single-space-separated fields
+(case insensitive):
+
+    <underlying symbol>
+    <call (C) or put (P) letter>
+    <three-letter expiration month>
+    <four-digit expiration year>
+    <strike price, including decimal point>
+
+Example: "PHI C OCT 2007 20.00" is a call option in Philips, expiration
+month October 2007, strike price 20.00 euro.
+
+Since options series come and go (options expire, new option series start
+being traded), a special label 'options' returns a list of all options
+found (fetched) for a given underlying.  This label is only present for
+the underlyings (if requested).
+
+When fetching individual options, more labels are returned (see below),
+because in such case option data is fetched from a subframe. When this is
+not relevant, the following trade-off may be considered: when fetching
+options for a given underlying, all options are returned, what may take
+up to 30s for 300 options (e.g for AEX Index); when fetching individual
+options, it takes ca 0.5s per option (on Pentium 75Mhz).
+
+=head2 Futures
+
+To fetch futures quotes in stocks or indices, use the "aex_futures"
+method.  Specifying which option to fetch can be done in two ways,
+similarly to options: providing the futures symbol, or naming a specific
+futures series.  In the first case, all tradable futures series will
+be returned.  In the second case, only the requested futures will be
+returned.  When naming a specific futures series use a string consisting
+of the following single-space-separated fields (case insensitive):
+
+    <futures symbol>
+    <three-letter expiration month>
+    <four-digit expiration year>
+
+Example: "FTI OCT 2003" is a futures contract in AEX Index, expiration
+month October 2003.
+
+Similarly to options, a special label 'futures' returns a list of all futures
+found (fetched) for a given futures symbol.  This label is only present 
+for futures symbols requested, not for individual futures.
 
 =head1 LABELS RETURNED
 
 The following labels may be returned by Finance::Quote::AEX :
-name, last, date, p_change, bid, offer, open, high, low, close,
+name, last, date, p_change, bid, offer, open, high, low, close, 
 volume, currency, method, exchange, time.
 
+The following labels may be returned by Finance::Quote::AEX "aex_options"
+method: name, options, last, price (=last), date, time, bid, ask, open,
+high, low, close, currency, method, exchange.
+
+The following additional labels may be returned by "aex_options" when 
+fetching individual options: volume oi trade_volume bid_time bid_volume 
+ask_time ask_volume. In such case label date is not returned.
+
+The following labels may be returned by Finance::Quote::AEX "aex_futures"
+method: name, price, last, date, time, change, bid, ask, open, high, low,
+close, volume, currency, method, exchange.
+
 =head1 SEE ALSO
 
 Amsterdam Euronext eXchange, http://www.aex.nl
 
 =cut
+
@@ -28,22 +28,22 @@ use strict;
 
 package Finance::Quote::AIAHK;
 
-use vars qw( $AIAHK_URL);
+use vars qw($VERSION $AIAHK_URL);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION='0.1';
 $AIAHK_URL = 'http://www.aia.com.hk/daily/fund_mst_rightb.asp?cat=BR_AC';
 
 
 sub methods { return (aiahk => \&aiahk); }
-{
+{ 
 	my @labels = qw/name code date isodate price bid offer p_change_3m
 	    p_change_1y p_change_3y currency method exchange/;
 
-	sub labels { return (aiahk => \@labels); }
+	sub labels { return (aiahk => \@labels); } 
 }
 
 sub aiahk {
@@ -139,7 +139,7 @@ sub aiahk {
 
 =head1 NAME
 
-Finance::Quote::AIAHK Obtain quotes from American International Assurance
+Finance::Quote::AIA Obtain quotes from American International Assurance 
 
 =head1 SYNOPSIS
 
@@ -154,11 +154,11 @@ Finance::Quote::AIAHK Obtain quotes from American International Assurance
 This module fetches information from the American International
 Assurance http://www.aia.com.hk. All funds are available.
 
-This module is loaded by default on a Finance::Quote object. It's
+This module is loaded by default on a Finance::Quote object. It's 
 also possible to load it explicity by placing "AIAHK" in the argument
 list to Finance::Quote->new().
 
-Information obtained by this module may be covered by www.aia.com.hk
+Information obtained by this module may be covered by www.aia.com.hk 
 terms and conditions See http://www.aia.com.hk/ for details.
 
 =head1 LABELS RETURNED
@@ -24,13 +24,13 @@ use strict;
 
 package Finance::Quote::ASEGR;
 
-use vars qw( $ASEGR_URL);
+use vars qw($VERSION $ASEGR_URL);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION='0.1';
 
 my $ASEGR_URL = 'http://www.ase.gr/content/en/MarketData/Stocks/Prices/Share_SearchResults.asp?';
 
@@ -38,12 +38,12 @@ my $ASEGR_URL = 'http://www.ase.gr/content/en/MarketData/Stocks/Prices/Share_Sea
 sub methods { return ( greece => \&asegr,
 			asegr => \&asegr,
 			europe => \&asegr); }
-{
+{ 
 	my @labels = qw/name last date isodate p_change open high low close volume currency method exchange/;
 
 	sub labels { return (greece => \@labels,
 			     asegr => \@labels,
-			     europe => \@labels); }
+			     europe => \@labels); } 
 }
 
 sub asegr {
@@ -54,14 +54,14 @@ sub asegr {
 	my $ua = $quoter->user_agent();
 
 	$url=$ASEGR_URL;
-
+	
 	foreach my $stocks (@stocks)
 	{
 		$reply = $ua->request(GET $url.join('',"share=",$stocks));
 
-		if ($reply->is_success)
+		if ($reply->is_success) 
 		{
-
+			
 			$te= new HTML::TableExtract( headers =>
 			[("Date","Price","\%Change","Volume","Max","Min","Value","Trades","Open")]);
 
@@ -81,7 +81,7 @@ sub asegr {
 				$info {$stocks,"errormsg"} = "Parse error";
 				next;
 			}
-
+			
 			$info{$stocks, "success"}=1;
 			$info{$stocks, "exchange"}="Athens Stock Exchange";
 			$info{$stocks, "method"}="asegr";
@@ -90,7 +90,7 @@ sub asegr {
 			($info{$stocks, "close"}=$rows[1][1]) =~ s/\s*//g;
 			($info{$stocks, "p_change"}=$rows[0][2]) =~ s/\s*//g;
 			($info{$stocks, "volume"}=$rows[0][3]) =~ s/\s*//g;
-			($info{$stocks, "high"}=$rows[0][4]) =~ s/\s*//g;
+			($info{$stocks, "high"}=$rows[0][4]) =~ s/\s*//g; 
 			($info{$stocks, "low"}=$rows[0][5]) =~ s/\s*//g;
 			($info{$stocks, "nav"}=$rows[0][6]) =~ s/\s*//g;
 			($info{$stocks, "open"}=$rows[0][8]) =~ s/\s*//g;
@@ -103,7 +103,7 @@ sub asegr {
      			$info{$stocks, "success"}=0;
 			$info{$stocks, "errormsg"}="Error retreiving $stocks ";
    }
- }
+ } 
  return wantarray() ? %info : \%info;
  return \%info;
 }
@@ -120,14 +120,14 @@ Finance::Quote::ASEGR Obtain quotes from Athens Stock Exchange.
     $q = Finance::Quote->new;
 
     %info = Finance::Quote->fetch("asegr","minoa");  # Only query ASEGR
-    %info = Finance::Quote->fetch("greece","aaak"); # Failover to other sources OK.
+    %info = Finance::Quote->fetch("greece","aaak"); # Failover to other sources OK. 
 
 =head1 DESCRIPTION
 
 This module fetches information from the "Athens Stock Exchange",
-http://www.ase.gr. All stocks are available.
+http://www.ase.gr. All stocks are available. 
 
-This module is loaded by default on a Finance::Quote object. It's
+This module is loaded by default on a Finance::Quote object. It's 
 also possible to load it explicity by placing "ASEGR" in the argument
 list to Finance::Quote->new().
 
@@ -135,14 +135,14 @@ This module provides both the "asegr" and "greece" fetch methods.
 Please use the "greece" fetch method if you wish to have failover
 with future sources for Greek stocks. Using the "asegr" method
 will guarantee that your information only comes from the Athens Stock Exchange.
-
-Information obtained by this module may be covered by www.ase.gr
+ 
+Information obtained by this module may be covered by www.ase.gr 
 terms and conditions See http://www.ase.gr/ for details.
 
 =head1 LABELS RETURNED
 
 The following labels may be returned by Finance::Quote::ASEGR :
-name, last, date, p_change, open, high, low, close,
+name, last, date, p_change, open, high, low, close, 
 volume, currency, method, exchange.
 
 =head1 SEE ALSO
@@ -150,3 +150,5 @@ volume, currency, method, exchange.
 Athens Stock Exchange, http://www.ase.gr
 
 =cut
+
+	
@@ -6,7 +6,6 @@
 #    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
 #    Copyright (C) 2001, Leigh Wedding <leigh.wedding@telstra.com>
 #    Copyright (C) 2000-2004, Paul Fenwick <pjf@cpan.org>
-#    Copyright (C) 2014, Chris Good <chris.good@@ozemail.com.au>
 #
 #    This program is free software; you can redistribute it and/or modify
 #    it under the terms of the GNU General Public License as published by
@@ -38,13 +37,12 @@ package Finance::Quote::ASX;
 use HTTP::Request::Common;
 use LWP::UserAgent;
 use HTML::TableExtract;
-use Encode;
 
-use vars qw/$ASX_URL /;
+use vars qw/$ASX_URL $VERSION/;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = "1.05";
 
-$ASX_URL = 'http://www.asx.com.au/asx/markets/priceLookup.do?by=asxCodes&asxCodes=';
+$ASX_URL = 'http://www.asx.com.au/asx/markets/PriceResults.jsp?method=get&template=F1001&ASXCodes=';
 
 sub methods {return (australia => \&asx,asx => \&asx)}
 
@@ -61,120 +59,111 @@ sub methods {return (australia => \&asx,asx => \&asx)}
 #
 # Maintainer of this section is Paul Fenwick <pjf@cpan.org>
 # 5-May-2001 Updated by Leigh Wedding <leigh.wedding@telstra.com>
-# 24-Feb-2014 Updated by Chris Good <chris.good@@ozemail.com.au>
 
 sub asx {
 	my $quoter = shift;
-	my @all_stocks = @_;
-	return unless @all_stocks;
-	my @stocks;
+	my @stocks = @_;
+	return unless @stocks;
 	my %info;
 
 	my $ua = $quoter->user_agent;
 
-	# ASX webpage only handles up to 10 quote requests at once
-
-	while (@stocks = splice(@all_stocks, 0, 10)) {
-		my $response = $ua->request(GET $ASX_URL.join("%20",@stocks));
-		unless ($response->is_success) {
-			foreach my $stock (@stocks, @all_stocks) {
-				$info{$stock,"success"} = 0;
-				$info{$stock,"errormsg"} = "HTTP session failed";
-			}
-			return wantarray() ? %info : \%info;
+	my $response = $ua->request(GET $ASX_URL.join("%20",@stocks));
+	unless ($response->is_success) {
+		foreach my $stock (@stocks) {
+			$info{$stock,"success"} = 0;
+			$info{$stock,"errormsg"} = "HTTP session failed";
 		}
+		return wantarray() ? %info : \%info;
+	}
 
-		my $te = HTML::TableExtract->new(
-			automap => 0,
-			headers => ["Code", "Last", '\+/-', "Bid", "Offer",
+	my $te = HTML::TableExtract->new(
+		automap => 0,
+		headers => ["Code", "Last", '\+/-', "Bid", "Offer",
 		            "Open", "High", "Low", "Vol"]);
 
-		$te->parse(decode('utf-8',$response->content));
+	$te->parse($response->content);
 
-		# Extract table contents.
-		my @rows;
-		unless (($te->tables > 0) && ( @rows = $te->rows)) {
-			foreach my $stock (@stocks, @all_stocks) {
-				$info{$stock,"success"} = 0;
-				$info{$stock,"errormsg"} = "Failed to parse HTML table.";
-			}
-			return wantarray() ? %info : \%info;
+	# Extract table contents.
+	my @rows;
+	unless (($te->tables > 0) && ( @rows = $te->rows)) {
+		foreach my $stock (@stocks) {
+			$info{$stock,"success"} = 0;
+			$info{$stock,"errormsg"} = "Failed to parse HTML table.";
 		}
+		return wantarray() ? %info : \%info;
+	}
 
-		# Pack the resulting data into our structure.
-		foreach my $row (@rows) {
-			my $stock = shift(@$row);
-
-			# Skip any blank lines.
-			next unless $stock;
-
-			# Delete spaces and '*' which sometimes appears after the code.
-			# Also delete high bit characters.
-			$stock =~ tr/* \200-\377//d;
-
-			# Delete any whitespace characters
-			$stock =~ s/\s//g;
+	# Pack the resulting data into our structure.
+	foreach my $row (@rows) {
+		my $stock = shift(@$row);
 
-			$info{$stock,'symbol'} = $stock;
+		# Skip any blank lines.
+		next unless $stock;
 
-			foreach my $label (qw/last p_change bid offer open
-				      high low volume/) {
-				$info{$stock,$label} = shift(@$row);
+		# Delete spaces and '*' which sometimes appears after the code.
+		# Also delete high bit characters.
+		$stock =~ tr/* \200-\377//d;
 
-				# Again, get rid of nasty high-bit characters.
-				$info{$stock,$label} =~ tr/ \200-\377//d
-					unless ($label eq "name");
-			}
+		$info{$stock,'symbol'} = $stock;
 
-			# If that stock does not exist, it will have a empty
-			# string for all the fields.  The "last" price should
-			# always be defined (even if zero), if we see an empty
-			# string here then we know we've found a bogus stock.
+		foreach my $label (qw/last p_change bid offer open
+			      high low volume/) {
+			$info{$stock,$label} = shift(@$row);
 
-			if ($info{$stock,'last'} eq '') {
-				$info{$stock,'success'} = 0;
-				$info{$stock,'errormsg'}="Stock does not exist on ASX.";
-				next;
-			}
+			# Again, get rid of nasty high-bit characters.
+			$info{$stock,$label} =~ tr/ \200-\377//d 
+				unless ($label eq "name");
+		}
+		
+		# If that stock does not exist, it will have a empty
+		# string for all the fields.  The "last" price should
+		# always be defined (even if zero), if we see an empty
+		# string here then we know we've found a bogus stock.
+
+		if ($info{$stock,'last'} eq '') {
+			$info{$stock,'success'} = 0;
+			$info{$stock,'errormsg'}="Stock does not exist on ASX.";
+			next;
+		}
 
-			# Drop commas from volume.
-			$info{$stock,"volume"} =~ tr/,//d;
+		# Drop commas from volume.
+		$info{$stock,"volume"} =~ tr/,//d;
 
-			# The ASX returns zeros for a number of things if there
-			# has been no trading.  This not only looks silly, but
-			# can break things later.  "correct" zero'd data.
+		# The ASX returns zeros for a number of things if there
+		# has been no trading.  This not only looks silly, but
+		# can break things later.  "correct" zero'd data.
 
-			foreach my $label (qw/open high low/) {
-				if ($info{$stock,$label} == 0) {
-					$info{$stock,$label} = $info{$stock,"last"};
-				}
+		foreach my $label (qw/open high low/) {
+			if ($info{$stock,$label} == 0) {
+				$info{$stock,$label} = $info{$stock,"last"};
 			}
+		}
 
-			# We get a dollar plus/minus change, rather than a
-			# percentage change, so we convert this into a
-			# percentage change, as required.  We should never have
-			# zero opening price, but if we do warn about it.
-
-			if ($info{$stock,"open"} == 0) {
-				warn "Zero opening price in p_change calcuation for ".
-				     "stock $stock.  P_change set to zero.";
-				$info{$stock,"p_change"} = 0;
-			} else {
-				$info{$stock,"p_change"} = sprintf("%.2f",
-			                           ($info{$stock,"p_change"}*100)/
-					             $info{$stock,"open"});
-			}
+		# We get a dollar plus/minus change, rather than a
+		# percentage change, so we convert this into a
+		# percentage change, as required.  We should never have
+		# zero opening price, but if we do warn about it.
+
+		if ($info{$stock,"open"} == 0) {
+			warn "Zero opening price in p_change calcuation for ".
+			     "stock $stock.  P_change set to zero.";
+			$info{$stock,"p_change"} = 0;
+		} else {
+			$info{$stock,"p_change"} = sprintf("%.2f",
+		                           ($info{$stock,"p_change"}*100)/
+				             $info{$stock,"open"});
+		}
 
-			# Australian indexes all begin with X, so don't tag them
-			# as having currency info.
+		# Australian indexes all begin with X, so don't tag them
+		# as having currency info.
 
-			$info{$stock, "currency"} = "AUD" unless ($stock =~ /^X/);
+		$info{$stock, "currency"} = "AUD" unless ($stock =~ /^X/);
 
-			$info{$stock, "method"} = "asx";
-			$info{$stock, "exchange"} = "Australian Stock Exchange";
-			$info{$stock, "price"} = $info{$stock,"last"};
-			$info{$stock, "success"} = 1;
-		}
+		$info{$stock, "method"} = "asx";
+		$info{$stock, "exchange"} = "Australian Stock Exchange";
+		$info{$stock, "price"} = $info{$stock,"last"};
+		$info{$stock, "success"} = 1;
 	}
 
 	# All done.
@@ -21,7 +21,7 @@
 # This code derived from Padzensky's work on package Finance::YahooQuote,
 # but extends its capabilites to encompas a greater number of data sources.
 #
-#
+# 
 
 require 5.005;
 
@@ -29,20 +29,20 @@ use strict;
 
 package Finance::Quote::BMONesbittBurns;
 
-use vars qw( $BMO_URL);
+use vars qw($VERSION $BMO_URL); 
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '0.9';
 
 # URLs of where to obtain information
 my $BMO_URL = 'http://bmonesbittburns.com/QuickQuote/QuickQuote.asp?Symbol=';
 
-sub methods { return (bmonesbittburns => \&bmonesbittburns) }
+sub methods { return (bmonesbittburns => \&bmonesbittburns) } 
 sub labels  { return (bmonesbittburns => [qw/name last p_change bid offer open high low volume currency method exchange date isodate time/]) };
-
+			
 # ==============================================================================
 sub bmonesbittburns {
     my $quoter = shift;
@@ -51,30 +51,30 @@ sub bmonesbittburns {
 
     my($url, $reply, $te);
     my(%info);
-
+    
     my $ua = $quoter->user_agent; 	# user_agent
-    $url = $BMO_URL;    		    # base url
-
+    $url = $BMO_URL;    		    # base url 
+    
     foreach my $symbol (@symbols) {
-        $reply = $ua->request(GET $url.join('',$symbol));
-
-        if ($reply->is_success) {
-
+        $reply = $ua->request(GET $url.join('',$symbol)); 
+        
+        if ($reply->is_success) { 
+        
             #print STDERR $reply->content,"\n";
-
+            
             $te = new HTML::TableExtract( depth => 2);
 
             # parse table
-            $te->parse($reply->content);
-
+            $te->parse($reply->content); 
+            
             # check for a page without tables.
             # This gets returned when a bad symbol name is given.
             unless ( $te->tables )  {
                 $info {$symbol,"succes"} = 0;
                 $info {$symbol,"errormsg"} = "Fund name $symbol not found, bad symbol name";
                 next;
-            }
-
+            } 
+            
 	    if (0) {
 	      my ($table, $row);
 
@@ -112,18 +112,18 @@ sub bmonesbittburns {
             $info {$symbol, "success"} = 1;
             $info {$symbol, "exchange"} = "BMO Nesbitt Burns";
             $info {$symbol, "method"} = "bmonesbittburns";
-
+            
             ($info {$symbol, "last"}      = $rows[ 1][2]) =~ s/\s*//g; # Remove spaces
             ($info {$symbol, "p_change"}  = $rows[ 2][5]) =~ s/\s*//g;
             ($info {$symbol, "close"}     = $rows[ 3][5]) =~ s/\s*//g;
-            ($info {$symbol, "bid"}       = $rows[ 4][2]) =~ s/\s*//g;
+            ($info {$symbol, "bid"}       = $rows[ 4][2]) =~ s/\s*//g; 
             ($info {$symbol, "offer"}     = $rows[ 4][5]) =~ s/\s*//g;
             ($info {$symbol, "open"}      = $rows[ 6][2]) =~ s/\s*//g;
             ($info {$symbol, "volume"}    = $rows[ 6][5]) =~ s/\s*//g;
-            ($info {$symbol, "high"}      = $rows[ 7][2]) =~ s/\s*//g;
+            ($info {$symbol, "high"}      = $rows[ 7][2]) =~ s/\s*//g; 
             ($info {$symbol, "low"}       = $rows[ 7][5]) =~ s/\s*//g;
             if ($#rows >= 9) {
-                ($info {$symbol, "eps"}       = $rows[10][2]) =~ s/\s*//g;
+                ($info {$symbol, "eps"}       = $rows[10][2]) =~ s/\s*//g; 
                 ($info {$symbol, "pe"}        = $rows[10][5]) =~ s/\s*//g;
                 ($info {$symbol, "div_yield"} = $rows[12][5]) =~ s/\s*//g;
 
@@ -135,7 +135,7 @@ sub bmonesbittburns {
 	    # This site appears to provide either a date or a time but not both
             my($dt) = $rows[3][2];
             if ($dt =~ /:/) {
-                ($info {$symbol, "time"} = "$dt:00") =~ s/\s*//g;
+                ($info {$symbol, "time"} = "$dt:00") =~ s/\s*//g; 
 		$quoter->store_date(\%info, $symbol, {today => 1});
             }
             else {
@@ -151,11 +151,11 @@ sub bmonesbittburns {
             else {
                 $info {$symbol, "currency"} = "CAD";
             }
-            $info {$symbol, "success"} = 1;
+            $info {$symbol, "success"} = 1; 
 
             # Walk through our fields and remove high-ascii
 	    # characters which may have snuck in.
-
+	    
 	    foreach (@{labels()}) {
                 $info{$symbol,$_} =~ tr/\200-\377//d;
 	    }
@@ -168,9 +168,9 @@ sub bmonesbittburns {
 
     return %info if wantarray;
     return \%info;
-}
+} 
 
-1;
+1; 
 
 =head1 NAME
 
@@ -199,20 +199,21 @@ are supported:
   I    Index
   X    U.S Stocks (most exchanges)
 
-This module is loaded by default on a Finance::Quote object. It's
+This module is loaded by default on a Finance::Quote object. It's 
 also possible to load it explicity by placing "BMONesbittBurns" in the argument
 list to Finance::Quote->new().
 
-Information obtained by this module may be covered by BMO Nesbitt Burns
+Information obtained by this module may be covered by BMO Nesbitt Burns 
 terms and conditions. See http://bmonesbittburns.com/ for details.
 
 =head1 LABELS RETURNED
 
 The following labels may be returned by Finance::Quote::BMONesbittBurns :
-name, last, date, p_change, bid, offer, open, high, low,
+name, last, date, p_change, bid, offer, open, high, low,  
 volume, currency, method, exchange, time, date.
 
 =head1 SEE ALSO
 
 BMO Nesbitt-Burns  http://bmonesbittburns.com/QuickQuote/QuickQuote.asp
 =cut
+
@@ -1,183 +0,0 @@
-#!/usr/bin/perl -w
-#    This modules is based on the Finance::Quote::ASEGR module
-#
-#    The code has been modified by Andrei Cipu <strainu@strainu.ro> to be able to
-#    retrieve stock information from the Bucharest Exchange in Romania.
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-#    02111-1307, USA
-require 5.005;
-
-use strict;
-
-package Finance::Quote::BSERO;
-
-use vars qw( $BSERO_URL);
-
-use LWP::UserAgent;
-use HTTP::Request::Common;
-use HTML::TableExtract;
-
-our $VERSION = '1.37'; # VERSION
-
-my $BSERO_URL = 'http://www.bvb.ro/mobile/m_SecurityDetails.aspx?';
-
-
-sub methods { return ( romania => \&bsero,
-                       bsero => \&bsero,
-                       europe => \&bsero); }
-{
-  my @labels = qw/name last date isodate p_change open high low close volume currency method exchange/;
-
-  sub labels { return (romania => \@labels,
-                       bsero => \@labels,
-                       europe => \@labels); }
-}
-
-sub bsero {
-
-  my $quoter = shift;
-  my @stocks = @_;
-  my (%info,$reply,$url,$te,$ts,$row,@cells, $ce);
-  my($my_date,$my_last,$my_p_change,$my_volume,$my_high,$my_low,$my_open);
-  my $ua = $quoter->user_agent();
-
-  $url = $BSERO_URL;
-
-  foreach my $stocks (@stocks)
-    {
-      $reply = $ua->request(GET $url.join('',"s=",$stocks));
-
-      if ($reply->is_success)
-        {
-
-          $te = new HTML::TableExtract();
-
-          $te->parse($reply->content);
-
-          unless ( $te->tables)
-            {
-              $info {$stocks,"success"} = 0;
-              $info {$stocks,"errormsg"} = "Stock name $stocks not found";
-              next;
-            }
-
-          $ts = $te->first_table_found();
-
-          foreach $row ($ts->rows) {
-            @cells = @$row;
-
-            # The date is not a number, so we don't bother modifying it
-            if($cells[0] eq 'Data'){
-              $my_date = $cells[1];
-            }
-            #The rest of the data needs to be modified
-            else {
-              foreach $ce (@cells) {
-                next unless $ce;
-                $ce =~ s/\.//;    #remove thouthand separator
-                $ce =~ s/,/\./g; #replace european decimal separator with american ones
-              }
-
-              #go through each row and get the data
-              if($cells[0] eq 'Ultimul pret'){
-                $my_last = $cells[1];
-              }
-              if($cells[0] eq 'Var (%)'){
-                $my_p_change = $cells[1];
-              }
-              if($cells[0] eq 'Volum'){
-                $my_volume = $cells[1];
-              }
-              if($cells[0] eq 'Pret maxim'){
-                $my_high = $cells[1];
-              }
-              if($cells[0] eq 'Pret minim'){
-                $my_low = $cells[1];
-              }
-              if($cells[0] eq 'Pret deschidere'){
-                $my_open = $cells[1];
-              }
-            }
-          }
-
-          $info{$stocks, "success"}  =1;
-          $info{$stocks, "exchange"} ="Bucharest Stock Exchange";
-          $info{$stocks, "method"}   ="bsero";
-          $info{$stocks, "name"}     =$stocks;
-          $info{$stocks, "last"}     =$my_last;
-          $info{$stocks, "close"}    =$my_last;
-          $info{$stocks, "p_change"} =$my_p_change;
-          $info{$stocks, "volume"}   =$my_volume;
-          $info{$stocks, "high"}     =$my_high;
-          $info{$stocks, "low"}      =$my_low;
-          $info{$stocks, "open"}     =$my_open;
-
-          $quoter->store_date(\%info, $stocks, {eurodate => $my_date});
-
-          $info{$stocks,"currency"} = "RON";
-
-        } else {
-          $info{$stocks, "success"}=0;
-          $info{$stocks, "errormsg"}="Error retreiving $stocks ";
-        }
-    }
-  return wantarray() ? %info : \%info;
-  return \%info;
-}
-
-1;
-
-=head1 NAME
-
-Finance::Quote::BSERO Obtain quotes from Bucharest Stock Exchange.
-
-=head1 SYNOPSIS
-
-    use Finance::Quote;
-
-    $q = Finance::Quote->new;
-
-    %info = Finance::Quote->fetch("bsero","tlv");  # Only query BSERO
-    %info = Finance::Quote->fetch("romania","brd"); # Failover to other sources OK.
-
-=head1 DESCRIPTION
-
-This module fetches information from the "Bucharest Stock Exchange"
-(Bursa de Valori Bucuresti), http://www.bvb.ro. All stocks are available.
-
-This module is loaded by default on a Finance::Quote object. It's
-also possible to load it explicity by placing "BSERO" in the argument
-list to Finance::Quote->new().
-
-This module provides both the "bsero" and "romania" fetch methods.
-Please use the "romania" fetch method if you wish to have failover
-with future sources for Romanian stocks. Using the "bsero" method will
-guarantee that your information only comes from the Bucharest Stock Exchange.
-
-Information obtained by this module may be covered by www.bvb.go
-terms and conditions See http://www.bvb.ro/ for details.
-
-=head1 LABELS RETURNED
-
-The following labels may be returned by Finance::Quote::BSERO :
-name, last, date, p_change, open, high, low, close,
-volume, currency, method, exchange.
-
-=head1 SEE ALSO
-
-Bucharest Stock Exchange, http://www.bvb.ro
-
-=cut
@@ -3,13 +3,11 @@
 #    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
 #    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
 #    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
+#    Copyright (C) 2000, Paul Fenwick <pjf@Acpan.org>
 #    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
 #    Copyright (C) 2001, Rob Sessink <rob_ses@users.sourceforge.net>
 #    Copyright (C) 2005, Morten Cools <morten@cools.no>
 #    Copyright (C) 2006, Dominique Corbex <domcox@sourceforge.net>
-#    Copyright (C) 2008, Bernard Fuentes <bernard.fuentes@gmail.com>
-#    Copyright (C) 2009, Erik Colson <eco@ecocode.net>
 #
 #    This program is free software; you can redistribute it and/or modify
 #    it under the terms of the GNU General Public License as published by
@@ -33,18 +31,6 @@
 #
 # Changelog
 #
-# 2014-01-12  Arnaud Gardelein
-#
-#     *       changes on website
-#
-# 2009-04-12  Erik Colson
-#
-#     *       Major site change.
-#
-# 2008-11-09  Bernard Fuentes
-#
-#     *       changes on website
-#
 # 2006-12-26  Dominique Corbex <domcox@sourceforge.net>
 #
 #     * (1.4) changes on web site
@@ -52,271 +38,346 @@
 # 2006-09-02  Dominique Corbex <domcox@sourceforge.net>
 #
 #     * (1.3) changes on web site
-#
+# 
 # 2006-06-28  Dominique Corbex <domcox@sourceforge.net>
 #
-#     * (1.2) changes on web site
+#     * (1.2) changes on web site 
 #
 # 2006-02-22  Dominique Corbex <domcox@sourceforge.net>
 #
-#     * (1.0) iniial release
+#     * (1.0) iniial release 
 #
 
+
 require 5.005;
 
 use strict;
 
 package Finance::Quote::Bourso;
 
-use vars qw( $Bourso_URL);
+use vars qw($VERSION $Bourso_URL);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
-use HTML::TreeBuilder
-    ;    # Boursorama doesn't put data in table elements anymore but uses <div>
+use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
 
-my $Bourso_URL = 'http://www.boursorama.com/recherche/index.phtml';
+$VERSION='1.4';
+
+my $Bourso_URL = 'http://www.boursorama.com/recherche/recherche.phtml';
 
-sub methods {
-    return ( france => \&bourso,
-             bourso => \&bourso,
-             europe => \&bourso
-    );
-}
-{
-    my @labels =
-        qw/name last date isodate p_change open high low close volume currency method exchange/;
-
-    sub labels {
-        return ( france => \@labels,
-                 bourso => \@labels,
-                 europe => \@labels
-        );
-    }
-}
 
-sub bourso_to_number {
-    my $x = shift(@_);
-    $x =~ s/\s//g;    # remove spaces etc in number
-    return $x;
+sub methods { return ( france => \&bourso,
+			bourso => \&bourso,
+			europe => \&bourso); }
+{ 
+	my @labels = qw/name last date isodate p_change open high low close volume currency method exchange/;
+
+	sub labels { return (france => \@labels,
+			     bourso => \@labels,
+			     europe => \@labels); } 
 }
 
 sub bourso {
-    my $quoter = shift;
-    my @stocks = @_;
-    my ( %info, $reply, $url, $te, $ts, $row, $style );
-    my $ua = $quoter->user_agent();
-
-    $url = $Bourso_URL;
-
-    foreach my $stocks (@stocks) {
-        my $queryUrl =
-              $url
-            . join( '', "?q=", $stocks )
-            . "&search[type]=rapide&search[categorie]=STK&search[bourse]=country:33";
-        $reply = $ua->request( GET $queryUrl);
-
-        # print "URL=".$queryUrl."\n";
-
-        if ( $reply->is_success ) {
-
-            # print $reply->content;
-            $info{ $stocks, "success" } = 1;
-
-            my $tree = HTML::TreeBuilder->new_from_content( $reply->content );
-
-            # retrieve SYMBOL
-            my @symbolline = $tree->look_down( 'class', 'fv-isin ellipsis' );
-
-            unless (@symbolline) {
-                $info{ $stocks, "success" }  = 0;
-                $info{ $stocks, "errormsg" } = "Stock name $stocks not found";
-                next;
-            }
-
-            my $symbol = ( $symbolline[0]->content_list )[0];
-            ($symbol) = ( $symbol =~ m/(\w+)/ );
-            $info{ $stocks, "symbol" } = $symbol;
-
-            # retrieve NAME
-            my @nameline = $tree->look_down( 'class', 'fv-name' );
-
-            unless (@nameline) {
-                $info{ $stocks, "success" } = 0;
-                $info{ $stocks, "errormsg" } =
-                    "Stock name $stocks not retrievable";
-                next;
-            }
-
-            my $name = $nameline[0]->as_text;
-            $info{ $stocks, "name" } = $name;
-
-            # set method
-            $info{ $stocks, "method" } = "bourso";
-
-            #holds table data
-            my %tempinfo;
-
-            # retrieve other data
-            my $infoclass = ( $tree->look_down( 'class', 'fv-extras' ) )[0];
-            unless ($infoclass) {
-                my $opcvm =
-                    ( $tree->look_down( 'class', 'opcvm-partners block' ) )[0];
-                unless ($opcvm) {
-                    $info{ $stocks, "success" } = 0;
-                    $info{ $stocks, "errormsg" } =
-                        "$stocks retrieval not supported.";
-                    next;
-                }
-
-                # the stock is a delayed OPCVM
-
-                my $infoelem =
-                    ( $tree->look_down( 'id', 'quote-infos-page' ) )[0];
-                $infoelem =
-                    ( $infoelem->look_down( 'class', 'q-details span-1-2' ) )
-                    [0];
-
-                my @rows = $infoelem->look_down( '_tag', 'tr' );
-                foreach my $i ( 0 .. $#rows ) {
-                    my $row = $rows[$i];
-                    unless ( $row->attr('class') ) {
-                        next;
-                    }
-
-                    my @cells     = $row->look_down( '_tag', 'td' );
-                    my $keytext   = ( $cells[0] )->as_text;
-                    my $valuetext = ( $cells[2] )->as_text;
-
-                    $tempinfo{$keytext} = $valuetext;
-                }
-            }
-            else {
-                # regular stock
-
-                my $infoelem;
-                my $quote_infos_page =
-                    ( $tree->look_down( 'id', 'quote-infos-page' ) )[0];
-                $infoelem = ( $quote_infos_page->look_down(
-                                                   'class', 'q-details span-1-2'
-                              )
-                )[0];
-                $infoelem = ( $quote_infos_page->look_down( 'class', 'bd' ) )[0]
-                    if ( !defined $infoelem );    # needed for warrants
-
-                my @rows = $infoelem->look_down( '_tag', 'tr' );
-                foreach my $i ( 0 .. $#rows ) {
-                    my $row   = $rows[$i];
-                    my @cells = $row->look_down( '_tag', 'td' );
-                    my $j     = 0;
-                    if ( $cells[0]->attr('rowspan') ) {
-                        $j = 1;
-                    }
-                    if ( $cells[0]->attr('colspan') ) {
-                        next;
-                    }
-
-                    my $keytext   = ( $cells[$j] )->as_text;
-                    my $valuetext = ( $cells[ $j + 1 ] )->as_text;
-
-                    $tempinfo{$keytext} = $valuetext;
-                }
-            }
-
-            foreach my $key ( keys %tempinfo ) {
-
-                # print "$key -> $tempinfo{$key}\n";
-
-            ASSIGN: for ($key) {
-
-                    # OPCVM
-                    /Valeur liquidative/ && do {
-                        my ( $last, $currency ) =
-                            ( $tempinfo{$key}
-                            =~ m/(\d+(?:\s\d+)*(?:\.\d+)?)(?:\(c\))?(?:\s+(\w+))?/
-                            );
-                        $last = bourso_to_number($last);
-                        $info{ $stocks, "last" }     = $last;
-                        $info{ $stocks, "currency" } = $currency;
-                    };
-                    /Date/ && do {
-                        $info{ $stocks, "date" } = $tempinfo{$key};
-                        $quoter->store_date( \%info, $stocks,
-                                     { eurodate => $info{ $stocks, "date" } } );
-                    };
-                    /Variation Veille/ && do {
-                        $info{ $stocks, "p_change" } = $tempinfo{$key};
-                    };
-
-                    # REGULAR STOCK
-                    /Cours/ && do {
-                        my ( $last, $currency ) =
-                            ( $tempinfo{$key}
-                            =~ m/(\d+(?:\s\d+)*(?:\.\d+)?)(?:\(c\))?(?:\s+(\w+))?/
-                            );
-                        $last = bourso_to_number($last);
-                        $info{ $stocks, "last" } = $last;
-                        $info{ $stocks, "currency" } =
-                            $currency || "EUR";    # defaults to EUR
-                        my $exchange = $key;
-                        $exchange =~ s/.*Cours\s*(\w.*\w)\s*/$1/
-                            ;    # the exchange is in the $key here
-                        $info{ $stocks, "exchange" } = $exchange;
-                    };
-                    /Variation/ && do {
-                        $info{ $stocks, "p_change" } = $tempinfo{$key};
-                    };
-                    /Dernier .change/ && do {
-                        my ( $day, $month, $year ) =
-                            ( $tempinfo{$key} =~ m|(\d\d)/(\d\d)/(\d\d)| );
-                        $year += 2000;
-                        $info{ $stocks, "date" } = sprintf "%02d/%02d/%04d",
-                            $day, $month, $year;
-                        $quoter->store_date( \%info, $stocks,
-                                     { eurodate => $info{ $stocks, "date" } } );
-                    };
-                    /Volume/ && do {
-                        $info{ $stocks, "volume" } =
-                            bourso_to_number( $tempinfo{$key} );
-                    };
-                    /Ouverture/ && do {
-                        $info{ $stocks, "open" } =
-                            bourso_to_number( $tempinfo{$key} );
-                    };
-                    /Haut/ && do {
-                        $info{ $stocks, "high" } =
-                            bourso_to_number( $tempinfo{$key} );
-                    };
-                    /Bas/ && do {
-                        $info{ $stocks, "low" } =
-                            bourso_to_number( $tempinfo{$key} );
-                    };
-                    /Cl.ture veille/ && do {
-                        $info{ $stocks, "previous" } =
-                            bourso_to_number( $tempinfo{$key} );
-                    };
-                    /Valorisation/ && do {
-                        $info{ $stocks, "cap" } = $tempinfo{$key};
-                        $info{ $stocks, "cap" } =~ s/[A-Z\s]//g
-                            ; # remove spaces and 'M' (millions) and currency (when not EUR)
-                        $info{ $stocks, "cap" }
-                            =~ tr/,/./;    # point instead of comma
-                        $info{ $stocks, "cap" }
-                            *= 1000000;    # valorisation is in millions
-                    };
-                }
-            }
-            $tree->delete;
-        }
-        else {
-            $info{ $stocks, "success" }  = 0;
-            $info{ $stocks, "errormsg" } = "Error retreiving $stocks ";
-        }
-    }
-    return wantarray() ? %info : \%info;
-    return \%info;
+
+	my $quoter = shift;
+	my @stocks = @_;
+	my (%info,$reply,$url,$te,$ts,$row,$style);
+	my $ua = $quoter->user_agent();
+
+	$url=$Bourso_URL;
+	
+	foreach my $stocks (@stocks)
+	{
+		$reply = $ua->request(GET $url.join('',"?query=", $stocks));
+
+
+		if ($reply->is_success) 
+		{
+			# print $reply->content;
+
+			$te= new HTML::TableExtract( );
+
+			$te->parse($reply->content);
+
+			unless ( $te->tables)
+			{
+				$info {$stocks,"success"} = 0;
+				$info {$stocks,"errormsg"} = "Stock name $stocks not found";
+				next;
+			}
+
+
+			my @rows;
+			unless (@rows = $te->rows)
+			{
+				$info {$stocks,"success"} = 0;
+				$info {$stocks,"errormsg"} = "Parse error";
+				next;
+			}
+
+			# debug
+#			foreach $ts ($te->table_states) {
+#				print "Table (", join(',', $ts->coords), "):\n";
+#				foreach $row ($ts->rows) {
+#					print join(',', @$row), "\n";
+#				}
+#			}
+#
+
+			# Page style
+			foreach $ts ($te->table_state(3, 1)){
+				@rows=$ts->rows;
+				$style=$rows[0][0];
+			}
+
+			SWITCH: for ($style){
+				# style=stock
+			        /cours-action/ && do {
+					foreach $ts ($te->table_state(3, 2)){
+						@rows=$ts->rows;
+						$info{$stocks, "name"}=$rows[0][0];
+						}
+					foreach $ts ($te->table_state(4, 0)){
+						@rows=$ts->rows;
+						foreach $row ($ts->rows) {
+						ASSIGN:	for ( @$row[0] ){  
+								/Cours/ && do {
+									($info{$stocks, "last"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									$info{$stocks, "success"}=1;
+									$info{$stocks, "exchange"}="Euronext Paris";
+									$info{$stocks, "method"}="bourso";
+									$info{$stocks,"currency"}="EUR";
+									$quoter->store_date(\%info, $stocks, {today => 1});
+									# GnuCash
+									$info{$stocks, "symbol"}=$stocks;
+									last ASSIGN;
+								};
+								/Variation/ && do {
+									($info{$stocks, "p_change"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/Volume/ && do {
+									($info{$stocks, "volume"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/Ouverture/ && do {
+									($info{$stocks, "open"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/ Haut/ && do {
+									($info{$stocks, "high"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/ Bas/ && do {
+									($info{$stocks, "low"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/ veille/ && do {
+									($info{$stocks, "close"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/Valorisation/ && do {
+									my $nav;
+									$nav=@$row[2];
+									$nav =~ s/[^0-9.]*//g;
+									($info{$stocks, "cap"}=($nav * 1000000)) ;
+									last ASSIGN;
+								};
+							}
+						}
+					}
+					last SWITCH; 
+				};
+				# style=bond
+			        /cours-obligation/ && do { 
+					foreach $ts ($te->table_state(3, 2)){
+						@rows=$ts->rows;
+						$info{$stocks, "name"}=$rows[0][0];
+						}
+  					foreach $ts ($te->table_state(4, 0)){
+						@rows=$ts->rows;
+						foreach $row ($ts->rows) {
+						ASSIGN:	for ( @$row[0] ){
+
+								/Cours/ && do {
+									($info{$stocks, "last"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									$info{$stocks, "success"}=1;
+									$info{$stocks, "exchange"}="Euronext Paris";
+									$info{$stocks, "method"}="bourso";
+									$info{$stocks,"currency"}="EUR";
+									$quoter->store_date(\%info, $stocks, {today => 1});
+									# GnuCash
+									$info{$stocks, "symbol"}=$stocks;
+									last ASSIGN;
+								};
+								/Variation/ && do {
+									($info{$stocks, "p_change"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/Ouverture/ && do {
+									($info{$stocks, "open"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/Haut/ && do {
+									($info{$stocks, "high"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/ Bas/ && do {
+									($info{$stocks, "low"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+							}
+						}
+					}
+					last SWITCH; 
+				};
+				# style=fund
+			        /opcvm\/opcvm/ && do { 
+					my @words;
+ 					foreach $ts ($te->table_state(3, 2)){
+						@rows=$ts->rows;
+						$info{$stocks, "name"}=$rows[0][0];
+						}
+					foreach $ts ($te->table_state(4, 1)){
+						@rows=$ts->rows;
+						foreach $row ($ts->rows) {
+
+						ASSIGN:	for ( @$row[0] ) {
+
+								/Valeur liquidative/ && do {
+									($info{$stocks, "last"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									$info{$stocks, "success"}=1;
+									$info{$stocks, "exchange"}="Euronext Paris";
+									$info{$stocks, "method"}="bourso";
+									$info{$stocks,"currency"}="EUR";
+									$quoter->store_date(\%info, $stocks, {today => 1});
+									# GnuCash
+									$info{$stocks, "symbol"}=$stocks;
+									last ASSIGN;
+								};
+								/Variation Veille/ && do {
+									($info{$stocks, "p_change"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/Date/ && do {
+								        $quoter->store_date(\%info, $stocks, {eurodate => @$row[2]});
+									last ASSIGN;
+								};
+							}
+						} 
+					}
+					last SWITCH; 
+				};
+				# style=warrant
+				/cours-warrant/ && do{ 
+					foreach $ts ($te->table_state(3, 3)){
+						@rows=$ts->rows;
+						$info{$stocks, "name"}=$rows[0][0];
+						}
+ 					foreach $ts ($te->table_state(4, 0)){
+						@rows=$ts->rows;
+						foreach $row ($ts->rows) {
+
+						ASSIGN:	for ( @$row[0] ) {
+
+								/Cours/ && do {
+									($info{$stocks, "last"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									$info{$stocks, "success"}=1;
+									$info{$stocks, "exchange"}="Euronext Paris";
+									$info{$stocks, "method"}="bourso";
+									$info{$stocks,"currency"}="EUR";
+									$quoter->store_date(\%info, $stocks, {today => 1});
+									# GnuCash
+									$info{$stocks, "symbol"}=$stocks;
+									last ASSIGN;
+								};
+								/Variation/ && do {
+									($info{$stocks, "p_change"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/Ouverture/ && do {
+									($info{$stocks, "open"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/Haut/ && do {
+									($info{$stocks, "high"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/ Bas/ && do {
+									($info{$stocks, "low"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/Volume/ && do {
+									($info{$stocks, "volume"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+							}
+						}
+					} 
+					last SWITCH; 
+				};
+				# style=indice
+			        /cours-indice/ && do { 
+					foreach $ts ($te->table_state(3, 2)){
+						@rows=$ts->rows;
+						$info{$stocks, "name"}=$rows[0][0];
+						}
+					foreach $ts ($te->table_state(4, 0)){
+						@rows=$ts->rows;
+						foreach $row ($ts->rows) {
+						ASSIGN:	for ( @$row[0] ){  
+								/Cours/ && do {
+									($info{$stocks, "last"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									$info{$stocks, "success"}=1;
+									$info{$stocks, "exchange"}="Euronext Paris";
+									$info{$stocks, "method"}="bourso";
+									$info{$stocks,"currency"}="EUR";
+									$quoter->store_date(\%info, $stocks, {today => 1});
+									# GnuCash
+									$info{$stocks, "symbol"}=$stocks;
+									last ASSIGN;
+								};
+								/Variation/ && do {
+									($info{$stocks, "p_change"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/Volume/ && do {
+									($info{$stocks, "volume"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/Ouverture/ && do {
+									($info{$stocks, "open"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/ Haut/ && do {
+									($info{$stocks, "high"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+								/ Bas/ && do {
+									($info{$stocks, "low"}=@$row[2]) =~ s/[^0-9.-]*//g;
+									last ASSIGN;
+								};
+							}
+						}
+					}
+					last SWITCH; 
+				};
+			        {
+					$info {$stocks,"success"} = 0;
+					$info {$stocks,"errormsg"} = "Error retreiving $stocks ";
+				}
+			}
+
+
+		} 
+		else {
+     			$info{$stocks, "success"}=0;
+			$info{$stocks, "errormsg"}="Error retreiving $stocks ";
+   		}
+ 	} 
+ 	return wantarray() ? %info : \%info;
+ 	return \%info;
 }
 1;
 
@@ -331,14 +392,14 @@ Finance::Quote::Bourso Obtain quotes from Boursorama.
     $q = Finance::Quote->new;
 
     %info = Finance::Quote->fetch("bourso","ml");  # Only query Bourso
-    %info = Finance::Quote->fetch("france","af"); # Failover to other sources OK.
+    %info = Finance::Quote->fetch("france","af"); # Failover to other sources OK. 
 
 =head1 DESCRIPTION
 
 This module fetches information from the "Paris Stock Exchange",
-http://www.boursorama.com. All stocks are available.
+http://www.boursorama.com. All stocks are available. 
 
-This module is loaded by default on a Finance::Quote object. It's
+This module is loaded by default on a Finance::Quote object. It's 
 also possible to load it explicity by placing "bourso" in the argument
 list to Finance::Quote->new().
 
@@ -346,8 +407,8 @@ This module provides both the "bourso" and "france" fetch methods.
 Please use the "france" fetch method if you wish to have failover
 with future sources for French stocks. Using the "bourso" method
 will guarantee that your information only comes from the Paris Stock Exchange.
-
-Information obtained by this module may be covered by www.boursorama.com
+ 
+Information obtained by this module may be covered by www.boursorama.com 
 terms and conditions See http://www.boursorama.com/ for details.
 
 =head1 LABELS RETURNED
@@ -361,3 +422,5 @@ volume, currency, method, exchange, symbol.
 Boursorama (french web site), http://www.boursorama.com
 
 =cut
+
+	
@@ -1,172 +0,0 @@
-#!/usr/bin/perl -w
-#
-#    This modules is based on the AEX module. The code has been modified by
-#    Hiranya Samarasekera <hiranyas@gmail.com> to be able to retrieve stock
-#    information from the Colombo Stock Exchange (CSE) in Sri Lanka.
-#    ----------------------------------------------------------------------
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-#    02111-1307, USA
-#
-
-require 5.005;
-
-use strict;
-
-package Finance::Quote::CSE;
-
-use vars qw($CSE_URL);
-
-use LWP::UserAgent;
-use HTTP::Request::Common qw(POST);
-use HTML::TableExtract;
-use CGI;
-
-our $VERSION = '1.37'; # VERSION
-
-my $CSE_URL = "http://www.cse.lk/trade_summary_report.do?reportType=CSV";
-
-sub methods { return (cse       => \&cse) }
-
-{
-  my @labels = qw/ID SYMBOL NAME LAST_TRADE_QUANTITY TRADE_DATE PRICE SHAREVOLUME TRADEVOLUME TURNOVER HI_TRADE LO_TRADE CHANGE CHANGE_PERCENTAGE ISSUE_DATE CLOSING_PRICE PREVIOUS_CLOSE MARKET_CAP MARKET_CAP_PERCENTAGE OPEN currency method exchange/;
-
-  sub labels { return (cse       => \@labels) }
-}
-
-# Colombo Stock Exchange (CSE), Sri Lanka
-
-sub cse {
-  my $quoter = shift;
-  my @symbols = @_;
-  return unless @symbols;
-
-  my (%info,$url,$reply,$te);
-  my ($row, $datarow, $matches);
-  my ($time);
-
-  $url = $CSE_URL;    		# base url
-
-  # Create a user agent object and HTTP headers
-  my $ua  = new LWP::UserAgent(agent => 'Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)');
-
-  # Compose POST request
-  my $request = new HTTP::Request("GET", $url);
-
-  $reply = $ua->request( $request );
-
-  #print Dumper $reply;
-  if ($reply->is_success) {
-
-    # Write retreived data to temp file for debugging
-    use POSIX;
-    my $filename = tmpnam();
-    open my $fw, ">", $filename or die "$filename: $!";
-    print $fw $reply->content;
-    close $fw;
-
-    # Open reply to read lines
-    open FP, "<", \$reply->content or die "Unable to read data: $!";
-
-    # Open temp file instead while debugging
-    #open FP, "<", $filename or die "Unable to read data: $!";
-
-    while (my $line = <FP>) {
-      my @row_data = $quoter->parse_csv($line);
-      #print Dumper \@row_data;
-      my $row = \@row_data;
-      #print Dumper $row;
-      next unless @row_data;
-
-      foreach my $symbol (@symbols) {
-
-        my $found = 0;
-
-        # Match stock symbol (e.g. JKH.N0000, HNB.X0000)
-        if ( @$row[1] eq uc($symbol) ) {
-          $info {$symbol, "exchange"} = "Colombo Stock Exchange, Sri Lanka";
-          $info {$symbol, "method"} = "cse";
-          $info {$symbol, "symbol"} = @$row[1];
-          $info {$symbol, "name"} = @$row[2];
-          ($info {$symbol, "last"} = @$row[5]) =~ s/\s*//g;
-          $info {$symbol, "bid"} = undef;
-          $info {$symbol, "offer"} = undef;
-          $info {$symbol, "open"} = @$row[18];
-          $info {$symbol, "nav"} = undef;
-          $info {$symbol, "price"} = @$row[5];
-          $info {$symbol, "low"} = @$row[10];
-          $info {$symbol, "close"} = @$row[15];
-          $info {$symbol, "p_change"} = @$row[12];
-          ($info {$symbol, "high"} = @$row[9]) =~ s/\s*//g;
-          ($info {$symbol, "volume"} = @$row[6]) =~ s/,//g;;
-
-          $quoter->store_date(\%info, $symbol, {today => 1});
-
-          $info {$symbol, "currency"} = "LKR";
-          $info {$symbol, "success"} = 1;
-        }
-      }
-    }
-  }
-
-  foreach my $symbol (@symbols) {
-    unless ( !defined($info {$symbol, "success"}) || $info {$symbol, "success"} == 1 )
-      {
-        $info {$symbol,"success"} = 0;
-        $info {$symbol,"errormsg"} = "Fund name $symbol not found";
-        next;
-      }
-  }
-
-  #print Dumper \%info;
-  return %info if wantarray;
-  return \%info;
-}
-
-
-1;
-
-=head1 NAME
-
-Finance::Quote::CSE Obtain quotes from Colombo Stock Exchange in Sri Lanka
-
-=head1 SYNOPSIS
-
-    use Finance::Quote;
-
-    $q = Finance::Quote->new;
-	@stocks = ("JKH.N0000", "HPWR.N0000", "HNB.X0000");
-    %info = Finance::Quote->fetch("cse", @stocks);
-
-=head1 DESCRIPTION
-
-This module retrieves information from the Colombo Stock Exchange (CSE)
-in Sri Lanka http://www.cse.lk.
-
-This module is loaded by default on a Finance::Quote object. It's
-also possible to load it explicity by placing "cse" in the argument
-list to Finance::Quote->new().
-
-=head1 LABELS RETURNED
-
-The following labels may be returned by Finance::Quote::CSE :
-symbol, name, last, open, price, low, close, p_change,
-high, volume, exchange, method
-
-=head1 SEE ALSO
-
-Colombo Stock Exchange (CSE), Sri Lanka, http://www.cse.lk
-
-=cut
@@ -15,13 +15,13 @@ require 5.004;
 
 use strict;
 
-use vars qw( $FUNDLIB_URL $FUNDLIB_MAIN_URL);
+use vars qw($VERSION $FUNDLIB_URL $FUNDLIB_MAIN_URL);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '0.6';
 
 # URLs of where to obtain information.
 
@@ -46,7 +46,7 @@ sub fundlibrary   {
     my $quoter = shift;
     my @symbols = @_;
 
-    # Make sure symbols are requested
+    # Make sure symbols are requested  
     ##CAN exit more gracefully - add later##
 
     return unless @symbols;
@@ -72,13 +72,13 @@ sub fundlibrary   {
 
       # Check for a page without tables
       # This gets returned when a bad symbol name is given
-      unless ( $te->tables > 0 )
+      unless ( $te->tables > 0 ) 
       {
 	$fundquote {$mutual,"success"} = 0;
 	$fundquote {$mutual,"errormsg"} = "Fund name $mutual not found";
 	next;
-      }
-
+      } 
+     
       # Fund name
       $reply->content =~ m#<div\s+class="tSmallTitle">([^<]+)</div>#;
       $fundquote {$mutual, "name"} = $1;
@@ -173,3 +173,4 @@ Fundlibrary website - http://www.fundlibrary.com/
 Finance::Quote
 
 =cut
+
@@ -1,398 +0,0 @@
-#!/usr/bin/perl -w
-
-#  Citywire.pm
-#
-#  Obtains quotes for UK Unit Trusts from http://morningstar.co.uk/ - please
-#  refer to the end of this file for further information.
-#
-#  author: Martin Sadler (martinsadler@users.sourceforge.net)
-#
-#  version: 0.1 Initial version - 01 April 2013
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-#    02111-1307, USA
-#
-
-
-package Finance::Quote::Citywire;
-require 5.005;
-
-use strict;
-use warnings;
-
-# Set DEBUG => 0 for no debug messages, => 1 for first level, => 2 for 2nd level, etc.
-
-use constant DEBUG => 0;
-
-# URLs
-use vars qw($VERSION $CITYWIRE_NEXT_URL $CITYWIRE_LOOK_UP $CITYWIRE_MAIN_URL);
-
-use LWP::Simple;
-use LWP::UserAgent;
-use HTTP::Request::Common;
-use HTTP::Cookies;
-use HTML::TokeParser;
-# use Data::Dumper;
-
-our $VERSION = '1.37'; # VERSION
-
-$CITYWIRE_MAIN_URL   =   "http://citywire.co.uk";
-$CITYWIRE_LOOK_UP    =   "http://citywire.co.uk/money/search.aspx?phrase=";
-$CITYWIRE_NEXT_URL	=	"";
-
-# FIXME -
-
-sub methods { return (citywire => \&citywire_fund,
-		      			ukfunds => \&citywire_fund); }
-
-{
-    my @labels = qw/name currency last date time price nav source iso_date method net p_change success errormsg/;
-
-    sub labels { return (citywire => \@labels,
-			 				ukfunds => \@labels); }
-}
-
-#
-# =======================================================================
-
-sub citywire_fund  {
-    my $quoter = shift;
-    my @symbols = @_;
-
-    return unless @symbols;
-
-    my %fundquote;
-
-    my $ua = $quoter->user_agent;
-    my $cj = HTTP::Cookies->new();
-    $ua->cookie_jar( $cj );
-
-    foreach (@symbols)
-    {
-	    my $code = $_;
-
-	    my $code_type = "** Invalid **";
-	    if ($code =~ m/^[a-zA-Z]{2}[a-zA-Z0-9]{9}\d(.*)/ && !$1) { $code_type = "ISIN";  }
-	    elsif ($code =~ m/^[a-zA-Z0-9]{6}\d(.*)/ && !$1 )        { $code_type = "SEDOL"; }
-	    elsif ($code =~ m/^[a-zA-Z]{4,6}(.*)/ && !$1)            { $code_type = "MEXID"; }
-
-# current version can only use ISIN - report an error and exit if any other type
-
-        if ($code_type ne "ISIN")
-        {
-		    $fundquote {$code,"success"} = 0;
-		    $fundquote {$code,"errormsg"} = "Error - invalid symbol";
-		    next;
-        }
-
-	    $fundquote {$code,"success"} = 1; # ever the optimist....
-	    $fundquote {$code,"errormsg"} = "Success";
-
-# perform the look-up - if not found, return with error
-
-        my $webdoc  = $ua->get($CITYWIRE_LOOK_UP.$code);
-        if (!$webdoc->is_success)
-        {
-	        # serious error, report it and give up
-		    $fundquote {$code,"success"} = 0;
-		    $fundquote {$code,"errormsg"} =
-		        "Error - failed to retrieve fund data : HTTP Status = ",$webdoc->status_line;
-		    next;
-	    }
-	    $fundquote {$code, "symbol"} = $code;
-	    $fundquote {$code, "source"} = $CITYWIRE_MAIN_URL;
-
-DEBUG and print "\nTitle  = ",$webdoc->title,"\n";
-DEBUG and print "\nStatus = ",$webdoc->status_line, "\n";
-DEBUG > 1 and print "\nCookie Jar = : \n",Dumper($cj),"\n\n";
-
-# Find name and next url using TokeParser
-
-		my $htmlstream	=	HTML::TokeParser->new(\$webdoc->content);
-
-        my ($name, $nexturl);
-		while ( (my $tag = $htmlstream->get_tag('a')) && !$nexturl)
-		{
-			if ( $tag->[1]{'title'} )
-			{
-				if ( $tag->[1]{'title'} eq 'view Fact Sheet' )
-				{
-					$nexturl = $tag->[1]{'href'};
-					$name    = $htmlstream->get_trimmed_text('/a');
-				}
-			}
-		}
-
-DEBUG and print "\nNext URL = ",$nexturl,"\n";
-DEBUG and print "\bName     = ",$name,"\n";
-
-		if (!defined($name)) {
-			# not a serious error - don't report it ....
-#			$fundquote {$code,"success"} = 0;
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find fund name";
-			$name = "*** UNKNOWN ***";
-			# ... and continue
-		}
-		$fundquote {$code, "name"} = $name;	# set name
-
-		if (!defined($nexturl)) {
-	        # serious error, report it and give up
-		    $fundquote {$code,"success"} = 0;
-		    $fundquote {$code,"errormsg"} = "Error - failed to retrieve fund data";
-		    next;
-		}
-
-# modify $nexturl to remove html escape encoding for the Ampersand (&) character
-
-		$nexturl =~ s/&amp;/&/;
-
-# Now need to look-up next page using $next_url
-
-        $webdoc  = $ua->get($CITYWIRE_MAIN_URL.$nexturl);
-        if (!$webdoc->is_success)
-        {
-	        # serious error, report it and give up
-		    $fundquote {$code,"success"} = 0;
-		    $fundquote {$code,"errormsg"} =
-		        "Error - failed to retrieve fund data : HTTP Status = ",$webdoc->status_line;
-		    next;
-	    }
-
-DEBUG and print "\nTitle  = ",$webdoc->title,"\n";
-DEBUG and print "\nStatus = ",$webdoc->status_line, "\n";
-DEBUG > 1 and print "\nCookie Jar = : \n",Dumper($cj),"\n\n";
-
-# Find date, currency and price using TokeParser
-
-		my ($currency, $date, $price, $pchange);
-		$htmlstream	=	HTML::TokeParser->new(\$webdoc->content);
-
-		my $done = 0;
-		while ( (my $tag = $htmlstream->get_tag('div')) && !$done)
-		{
-			if ( $tag->[1]{'class'} )
-			{
-				if ( $tag->[1]{'class'} eq 'fundQuickInfo' )
-				{
-DEBUG and print "\nFound tag : ",$tag->[3],"\n";
-					$tag = $htmlstream->get_tag('h5');
-					my $text = $htmlstream->get_trimmed_text('/h5');
-DEBUG and print "\nFound tag : ",$tag->[3],$text,"</h5>\n";
-					if ( $text eq "LATEST PRICE" )
-					{
-						$tag = $htmlstream->get_tag('p');
-						$text = $htmlstream->get_trimmed_text('/p');
-DEBUG and print "\nFound tag : ",$tag->[3],$text,"</p>\n";
-						if ( $text =~ m[.*([0-9]{2}/[0-9]{2}/[0-9]{4})] )
-						{
-							$date = $1;
-						}
-					}
-					$tag = $htmlstream->get_tag('li');
-					$text = $htmlstream->get_trimmed_text('/li');
-DEBUG and print "\nFound tag : ",$tag->[3],$text,"</li>\n";
-DEBUG and print "\n\$text = ",$text,"\n";
-					if ( $tag->[1]{'class'} eq 'price currency' )
-					{
-						if ( $text =~ m[([\D]+)([0-9\.]+)] )
-						{
-							$price = $2;
-DEBUG and print "\n\$1 = ",$1,"\n";
-DEBUG and print "\n\$2 = ",$2,"\n";
-							if ( $1 eq "£" )
-							{
-								$currency = "GBP";
-							}
-							else
-							{
-								if( $1 =~ m[([A-Z]{3})] ) { $currency = $1; }
-							}
-						}
-					}
-					$tag = $htmlstream->get_tag('h5');
-					$text = $htmlstream->get_trimmed_text('/h5');
-DEBUG and print "\nFound tag : ",$tag->[3],$text,"</h5>\n";
-					if ( $text eq "CHANGE IN PRICE" )
-					{
-						$tag = $htmlstream->get_tag('li');
-						$text = $htmlstream->get_trimmed_text('/li');
-DEBUG and print "\nFound tag : ",$tag->[3],$text,"</li>\n";
-						if ( $tag->[1]{'class'} =~ m[^price ([a-z]*)] )
-						{
-							my $negate = $1;
-							if ( $text =~ m[([0-9\.]+)\%] )
-							{
-								$pchange = $1;
-							}
-							if ( $negate eq 'minus')
-							{
-								$pchange = 0 - $pchange;
-							}
-						}
-					}
-				}
-			}
-		}
-
-DEBUG and print "\n\%-age change = ",$pchange,"\n";
-		if (!defined($pchange)) {
-			# not a serious error - don't report it ....
-#			$fundquote {$code,"success"} = 0;
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find net or %-age change";
-			# set to (minus)zero
-            $pchange = -0.00;
-			# ... and continue
-		}
-		$fundquote {$code, "p_change"} = $pchange;	# set %-change
-
-DEBUG and print "\nDate = ",$date,"\n";
-		if (!defined($date)) {
-			# not a serious error - don't report it ....
-#			$fundquote {$code,"success"} = 0;
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find a date";
-			# use today's date
-            $quoter->store_date(\%fundquote, $code, {today => 1});
-			# ... and continue
-		}
-		else
-		{
-		    $quoter->store_date(\%fundquote, $code, {eurodate => $date});
-		}
-
-DEBUG and print "\nPrice = ",$price,"\n";
-		if (!defined($price)) {
-	    	# serious error, report it and give up
-			$fundquote {$code,"success"} = 0;
-			$fundquote {$code,"errormsg"} = "Error - failed to find a price";
-			next;
-		}
-
-DEBUG and print "\nCCY = ",$currency,"\n";
-		if (!defined($currency)) {
-	    	# serious error, report it and give up
-			$fundquote {$code,"success"} = 0;
-			$fundquote {$code,"errormsg"} = "Error - failed to find a currency";
-			next;
-		}
-
-		# defer setting currency and price until we've dealt with possible GBX currency...
-
-# Calculate net change - it's not included in the morningstar factsheets
-
-		my $net = ($price * $pchange) / 100 ;
-
-# deal with GBX pricing of UK unit trusts
-
-		if ($currency eq "GBX")
-		{
-			$currency = "GBP" ;
-			$price = $price / 100 ;
-            $net   = $net   / 100 ;
-		}
-
-		# now set prices and currency
-
-		$fundquote {$code, "price"} = $price;
-		$fundquote {$code, "last"} = $price;
-		$fundquote {$code, "nav"} = $price;
-		$fundquote {$code, "net"} = $net;
-		$fundquote {$code, "currency"} = $currency;
-
-# Set a dummy time as gnucash insists on having a valid format
-
-		my $time = "12:00";     # set to Midday if no time supplied ???
-                                # gnucash insists on having a valid-format
-
-		$fundquote {$code, "time"} = $time; # set time
-
-		$fundquote {$code, "method"} = "citywire";   # set method
-
-	}
-
-	return wantarray ? %fundquote : \%fundquote;
-}
-
-1;
-
-=head1 NAME
-
-Finance::Quote::citywire - Obtain UK Unit Trust quotes from morningstar.co.uk.
-
-=head1 SYNOPSIS
-
-    $q = Finance::Quote->new;
-
-    %info = Finance::Quote->fetch("citywire","<isin> ...");  # Only query morningstar.co.uk using ISINs
-    %info = Finance::Quote->fetch("ukfunds","<isin>|<sedol>|<mexid> ..."); # Failover to other sources
-
-=head1 DESCRIPTION
-
-This module fetches information from the Citywire Funds service,
-http://citywire.co.uk. There are many UK Unit Trusts and OEICs quoted,
-as well as many Offshore Funds and Exhange Traded Funds (ETFs). It converts
-any funds quoted in GBX (pence) to GBP, dividing the price by 100 in the
-process.
-
-Funds are identified by their ISIN code.
-
-This module is loaded by default on a Finance::Quote object. It's
-also possible to load it explicity by placing "citywire" in the argument
-list to Finance::Quote->new().
-
-Information obtained by this module may be covered by citywire.co.uk
-terms and conditions See http://citywire.co.uk for details.
-
-=head2 Stocks And Indices
-
-This module provides both the "citywire" and "ukfunds" fetch methods for
-fetching UK and Offshore Unit Trusts and OEICs prices and other information
-from funds.ft.com. Please use the "ukfunds" fetch method if you wish to have
-failover with future sources for UK and Offshore Unit Trusts and OEICs - the
-author has plans to develop Finance::Quote modules for other sources providing
-uk unit trust prices. Using the "citywire" method will guarantee
-that your information only comes from the citywire.co.uk website.
-
-=head1 LABELS RETURNED
-
-The following labels may be returned by Finance::Quote::Citywire :
-
-    name, currency, last, date, time, price, nav, source, method,
-    iso_date, net, p_change, success, errormsg.
-
-
-=head1 SEE ALSO
-
-
-
-
-=head1 AUTHOR
-
-Martin Sadler, E<lt>martinsadler@users.sourceforge.netE<gt>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright (C) 2010 by Martin Sadler
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself, either Perl version 5.10.1 or,
-at your option, any later version of Perl 5 you may have available.
-
-
-=cut
-
-__END__
@@ -1,170 +0,0 @@
-#
-#    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
-#    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
-#    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
-#    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
-#    Copyright (C) 2007, Stephan Ebelt <ste@users.sourceforge.net>
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-#    02111-1307, USA
-#
-#
-# This code initially derived from Padzensky's work on package
-# Finance::YahooQuote, but extends its capabilites to encompas a greater
-# number of data sources.
-#
-# This module (cominvest) derived from Finance::Quote::Fidelity because
-# it is technically very similar (they provide a list with all funds in
-# CSV format...).
-#
-#
-
-package Finance::Quote::Cominvest;
-require 5.005;
-
-use strict;
-use vars qw/$COMINVEST_URL /;
-
-use LWP::UserAgent;
-use HTTP::Request::Common;
-
-our $VERSION = '1.37'; # VERSION
-
-$COMINVEST_URL = ('http://www.cominvest.de/_applications/fonds_application/FondsInfos/FondsInfos_PreiseAktuell_CSVFile.asp?b2b=0&noindex=1&noindex=1&lang=49');
-
-sub methods {
-	return (
-		cominvest => \&cominvest,
-		adig      => \&cominvest
-	);
-}
-
-sub labels {
-	my @labels = qw/exchange name symbol bid ask date isodate yield price method p_change/;
-	return (
-		cominvest => \@labels,
-		adig      => \@labels
-	);
-}
-
-# ========================================================================
-# the cominvest routine gets quotes from "cominvest Asset Management GmbH"
-#
-sub cominvest {
-	my $quoter = shift;
-	my @symbols = @_;
-	return unless @symbols;
-	my(%info, @q, $sym, $k, $ua, $reply);
-
-	# Build a small hash of symbols people want, because it provides a
-	# quick and easy way to only return desired symbols.
-	my %symbolhash;
-	%symbolhash = map{$_, 1} @symbols;
-
-	# Cominvest serves colon separated values (sort of csv's)
-	$ua = $quoter->user_agent;
-	$reply = $ua->request(GET $COMINVEST_URL);
-
-	if($reply->is_success) {
-		foreach (split('\015?\012',$reply->content)) {
-			my @q = split(/;/) or next;
-
-			$sym = '';
-
-			# Skip symbols we didn't ask for.
-			next unless (
-				   (defined($symbolhash{$q[1]}) and $sym=$q[1])  # ISIN
-				or (defined($symbolhash{$q[2]}) and $sym=$q[2])  # WKN
-			);
-
-			# convert decimal separator to intl. format
-			foreach(@q) {
-				s/,/\./;
-			}
-
-			$info{$sym, 'exchange'}  = 'Cominvest';
-			$info{$sym, 'method'}    = 'cominvest';
-			$info{$sym, 'name'}      = $q[0];
-			$info{$sym, 'symbol'}    = $sym;
-			($info{$sym, 'p_change'} = $q[8]) =~ s/\%//;
-			$info{$sym, 'yield'}     = $q[9];
-			$info{$sym, 'price'}     = $q[7];
-			$info{$sym, 'bid'}       = $q[7];
-			$info{$sym, 'ask'}       = $q[6];
-			$info{$sym, 'currency'}  = $q[3];
-			$quoter->store_date(\%info, $sym, {eurodate => $q[5]});
-
-			$info{$sym, 'success'}   = 1;
-		}
-
-		# always return a status for all requested symbols
-		foreach my $s (@symbols) {
-			if( !$info{$s, 'success'} ) {
-				$info{$s, 'success'}  = 0;
-				$info{$s, 'errormsg'} = 'No data returned';
-			}
-		}
-
-	} else {
-		# set error on all symbols
-		foreach my $sym (@symbols) {
-			$info{$sym, 'success'}  = 0;
-			$info{$sym, 'errormsg'} = 'HTTP error: ' . $reply->status_line;
-		}
-	}
-
-	return wantarray() ? %info : \%info;
-}
-
-
-1;
-
-=head1 NAME
-
-Finance::Quote::Cominvest - Obtain information from cominvest, formerly known
-as Adig Investment.
-
-=head1 SYNOPSIS
-
-    use Finance::Quote;
-
-    $q = Finance::Quote->new;
-
-    %info = Finance::Quote->fetch('cominvest', '637256');
-    %info = Finance::Quote->fetch('adig', 'DE0006372568');
-
-=head1 DESCRIPTION
-
-This module obtains information from cominvest Asset Management
-http://www.cominvest-am.de/ - a german mutual fund company. It was formerly
-known as Adig Investments and thus an alias 'adig' is also provided.
-
-The name with which this module is called does not change its behavior. It may
-be asked for german WKNs or international ISINs.
-
-Information returned by this module is governed by the terms and conditions of
-cominvest Asset Management GmbH.
-
-=head1 LABELS RETURNED
-
-The following labels may be returned by Finance::Quote::Cominvest:
-exchange, name, bid, ask, date, yield, price, p_change.
-
-=head1 SEE ALSO
-
-cominvest Asset Management, http://www.cominvest-am.de/
-
-=cut
@@ -1,365 +0,0 @@
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-#    02111-1307, USA
-#
-package Finance::Quote::Currencies;
-use strict;
-use warnings;
-
-use base 'Exporter';
-use vars qw/@EXPORT_OK  $YAHOO_CURRENCY_CONV_URL/;
-
-@EXPORT_OK = qw( known_currencies fetch_live_currencies );
-our $VERSION = '1.37'; # VERSION
-
-use HTTP::Request::Common;
-use LWP::UserAgent;
-use HTML::Parser;
-use Encode;
-
-# This is the URL used to extract the currency list
-$YAHOO_CURRENCY_CONV_URL = 'http://uk.finance.yahoo.com/currency-converter';
-
-# =======================================================================
-# methods used by Finance::Quote to import public functions
-sub methods { return ( known_currencies      => \&known_currencies
-                     , fetch_live_currencies => \&fetch_live_currencies
-                     );
-}
-
-sub labels { return () };
-
-# =======================================================================
-# The current static currency list.
-# This list is generated using fetch_live_currencies
-my %currencies = ( ALL => { name => qq{Albanian Lek} }
-                 , DZD => { name => qq{Algerian Dinar} }
-                 , XAL => { name => qq{Aluminium Ounces} }
-                 , ARS => { name => qq{Argentine Peso} }
-                 , AWG => { name => qq{Aruba Florin} }
-                 , AUD => { name => qq{Australian Dollar} }
-                 , BSD => { name => qq{Bahamian Dollar} }
-                 , BHD => { name => qq{Bahraini Dinar} }
-                 , BDT => { name => qq{Bangladesh Taka} }
-                 , BBD => { name => qq{Barbados Dollar} }
-                 , BYR => { name => qq{Belarus Ruble} }
-                 , BZD => { name => qq{Belize Dollar} }
-                 , BMD => { name => qq{Bermuda Dollar} }
-                 , BTN => { name => qq{Bhutan Ngultrum} }
-                 , BOB => { name => qq{Bolivian Boliviano} }
-                 , BWP => { name => qq{Botswana Pula} }
-                 , BRL => { name => qq{Brazilian Real} }
-                 , GBP => { name => qq{British Pound} }
-                 , BND => { name => qq{Brunei Dollar} }
-                 , BGN => { name => qq{Bulgarian Lev} }
-                 , BIF => { name => qq{Burundi Franc} }
-                 , KHR => { name => qq{Cambodia Riel} }
-                 , CAD => { name => qq{Canadian Dollar} }
-                 , CVE => { name => qq{Cape Verde Escudo} }
-                 , KYD => { name => qq{Cayman Islands Dollar} }
-                 , XOF => { name => qq{CFA Franc (BCEAO)} }
-                 , XAF => { name => qq{CFA Franc (BEAC)} }
-                 , CLP => { name => qq{Chilean Peso} }
-                 , CNY => { name => qq{Chinese Yuan} }
-                 , COP => { name => qq{Colombian Peso} }
-                 , KMF => { name => qq{Comoros Franc} }
-                 , XCP => { name => qq{Copper Pounds} }
-                 , CRC => { name => qq{Costa Rica Colon} }
-                 , HRK => { name => qq{Croatian Kuna} }
-                 , CUP => { name => qq{Cuban Peso} }
-                 , CZK => { name => qq{Czech Koruna} }
-                 , DKK => { name => qq{Danish Krone} }
-                 , DJF => { name => qq{Dijibouti Franc} }
-                 , DOP => { name => qq{Dominican Peso} }
-                 , XCD => { name => qq{East Caribbean Dollar} }
-                 , ECS => { name => qq{Ecuador Sucre} }
-                 , EGP => { name => qq{Egyptian Pound} }
-                 , SVC => { name => qq{El Salvador Colon} }
-                 , ERN => { name => qq{Eritrea Nakfa} }
-                 , EEK => { name => qq{Estonian Kroon} }
-                 , ETB => { name => qq{Ethiopian Birr} }
-                 , EUR => { name => qq{Euro} }
-                 , FKP => { name => qq{Falkland Islands Pound} }
-                 , FJD => { name => qq{Fiji Dollar} }
-                 , GMD => { name => qq{Gambian Dalasi} }
-                 , GHC => { name => qq{Ghanian Cedi} }
-                 , GIP => { name => qq{Gibraltar Pound} }
-                 , XAU => { name => qq{Gold Ounces} }
-                 , GTQ => { name => qq{Guatemala Quetzal} }
-                 , GNF => { name => qq{Guinea Franc} }
-                 , GYD => { name => qq{Guyana Dollar} }
-                 , HTG => { name => qq{Haiti Gourde} }
-                 , HNL => { name => qq{Honduras Lempira} }
-                 , HKD => { name => qq{Hong Kong Dollar} }
-                 , HUF => { name => qq{Hungarian Forint} }
-                 , ISK => { name => qq{Iceland Krona} }
-                 , INR => { name => qq{Indian Rupee} }
-                 , IDR => { name => qq{Indonesian Rupiah} }
-                 , IRR => { name => qq{Iran Rial} }
-                 , IQD => { name => qq{Iraqi Dinar} }
-                 , ILS => { name => qq{Israeli Shekel} }
-                 , JMD => { name => qq{Jamaican Dollar} }
-                 , JPY => { name => qq{Japanese Yen} }
-                 , JOD => { name => qq{Jordanian Dinar} }
-                 , KZT => { name => qq{Kazakhstan Tenge} }
-                 , KES => { name => qq{Kenyan Shilling} }
-                 , KRW => { name => qq{South Korean Won} }
-                 , KWD => { name => qq{Kuwaiti Dinar} }
-                 , LAK => { name => qq{Lao Kip} }
-                 , LVL => { name => qq{Latvian Lat} }
-                 , LBP => { name => qq{Lebanese Pound} }
-                 , LSL => { name => qq{Lesotho Loti} }
-                 , LRD => { name => qq{Liberian Dollar} }
-                 , LYD => { name => qq{Libyan Dinar} }
-                 , LTL => { name => qq{Lithuanian Lita} }
-                 , MOP => { name => qq{Macau Pataca} }
-                 , MKD => { name => qq{Macedonian Denar} }
-                 , MWK => { name => qq{Malawi Kwacha} }
-                 , MYR => { name => qq{Malaysian Ringgit} }
-                 , MVR => { name => qq{Maldives Rufiyaa} }
-                 , MTL => { name => qq{Maltese Lira} }
-                 , MRO => { name => qq{Mauritania Ougulya} }
-                 , MUR => { name => qq{Mauritius Rupee} }
-                 , MXN => { name => qq{Mexican Peso} }
-                 , MDL => { name => qq{Moldovan Leu} }
-                 , MNT => { name => qq{Mongolian Tugrik} }
-                 , MAD => { name => qq{Moroccan Dirham} }
-                 , MMK => { name => qq{Myanmar Kyat} }
-                 , NAD => { name => qq{Namibian Dollar} }
-                 , NPR => { name => qq{Nepalese Rupee} }
-                 , ANG => { name => qq{Neth Antilles Guilder} }
-                 , TRY => { name => qq{Turkish Lira} }
-                 , NZD => { name => qq{New Zealand Dollar} }
-                 , NIO => { name => qq{Nicaragua Cordoba} }
-                 , NGN => { name => qq{Nigerian Naira} }
-                 , KPW => { name => qq{North Korean Won} }
-                 , NOK => { name => qq{Norwegian Krone} }
-                 , OMR => { name => qq{Omani Rial} }
-                 , XPF => { name => qq{Pacific Franc} }
-                 , PKR => { name => qq{Pakistani Rupee} }
-                 , XPD => { name => qq{Palladium Ounces} }
-                 , PAB => { name => qq{Panama Balboa} }
-                 , PGK => { name => qq{Papua New Guinea Kina} }
-                 , PYG => { name => qq{Paraguayan Guarani} }
-                 , PEN => { name => qq{Peruvian Nuevo Sol} }
-                 , PHP => { name => qq{Philippine Peso} }
-                 , XPT => { name => qq{Platinum Ounces} }
-                 , PLN => { name => qq{Polish Zloty} }
-                 , QAR => { name => qq{Qatar Rial} }
-                 , RON => { name => qq{Romanian New Leu} }
-                 , RUB => { name => qq{Russian Rouble} }
-                 , RWF => { name => qq{Rwanda Franc} }
-                 , WST => { name => qq{Samoa Tala} }
-                 , STD => { name => qq{Sao Tome Dobra} }
-                 , SAR => { name => qq{Saudi Arabian Riyal} }
-                 , SCR => { name => qq{Seychelles Rupee} }
-                 , SLL => { name => qq{Sierra Leone Leone} }
-                 , XAG => { name => qq{Silver Ounces} }
-                 , SGD => { name => qq{Singapore Dollar} }
-                 , SKK => { name => qq{Slovak Koruna} }
-                 , SIT => { name => qq{Slovenian Tolar} }
-                 , SBD => { name => qq{Solomon Islands Dollar} }
-                 , SOS => { name => qq{Somali Shilling} }
-                 , ZAR => { name => qq{South African Rand} }
-                 , LKR => { name => qq{Sri Lanka Rupee} }
-                 , SHP => { name => qq{St Helena Pound} }
-                 , SZL => { name => qq{Swaziland Lilageni} }
-                 , SEK => { name => qq{Swedish Krona} }
-                 , CHF => { name => qq{Swiss Franc} }
-                 , SYP => { name => qq{Syrian Pound} }
-                 , TWD => { name => qq{Taiwan Dollar} }
-                 , TZS => { name => qq{Tanzanian Shilling} }
-                 , THB => { name => qq{Thai Baht} }
-                 , TOP => { name => qq{Tonga Pa'ang} }
-                 , TTD => { name => qq{Trinidad & Tobago Dollar} }
-                 , TND => { name => qq{Tunisian Dinar} }
-                 , USD => { name => qq{United States Dollar} }
-                 , AED => { name => qq{UAE Dirham} }
-                 , UGX => { name => qq{Ugandan Shilling} }
-                 , UAH => { name => qq{Ukraine Hryvnia} }
-                 , UYU => { name => qq{Uruguayan New Peso} }
-                 , VUV => { name => qq{Vanuatu Vatu} }
-                 , VEF => { name => qq{Venezuelan Bolivar Fuerte}}
-                 , VND => { name => qq{Vietnam Dong} }
-                 , YER => { name => qq{Yemen Riyal} }
-                 , ZMK => { name => qq{Zambian Kwacha} }
-                 , ZWD => { name => qq{Zimbabwe dollar} }
-                 , SDG => { name => qq{Sudanese Pound} }
-                 );
-
-# =======================================================================
-# known_currencies (public function)
-#
-# This function returns the known currency list. This is based on the
-# cached currency list in this module. Use fetch_live_currencies for the
-# live list.
-sub known_currencies {
-  return \%currencies;
-}
-
-# =======================================================================
-# fetch_live_currencies (public function)
-#
-# This function retrieved the live currency list from the Yahoo Finance
-# website. This function should really only be used to test if the known
-# currency list in this module is out of date.
-sub fetch_live_currencies {
-  my $ua = LWP::UserAgent->new();
-  my $data = $ua->request(GET $YAHOO_CURRENCY_CONV_URL)->content;
-  my $p = HTML::Parser->new( start_h => [\&_start_handler, "tagname, attr"]
-                           , end_h   => [\&_end_handler, "tagname"]
-                           , text_h  => [\&_text_handler, "dtext"]
-                           );
-
-  # Avoid the "Parsing of undecoded UTF-8 will give garbage when decoding
-  # entities" warning by forcing utf mode and encoding to utf8
-  $p->utf8_mode(1);
-  $p->parse( Encode::encode_utf8($data) );
-
-  return _live_currencies();
-}
-
-# Store state variables in a closure
-{
-  # The currency hash
-  my %live_currencies = ();
-
-  # Keep track of being within a valid option tag (for text gathering)
-  my $in_currency_list = 0;
-  my $in_currency_option = 0;
-  my $currency_text = '';
-  my $currency_code = '';
-
-  # _start_handler (private function)
-  #
-  # This is a HTML::Parser start tag handler
-  sub _start_handler {
-    my ($tagname, $attr) = @_;
-
-    if ( lc $tagname eq 'select'
-         &&
-         exists $attr->{name} && lc $attr->{name} eq 'currency-1'
-       ) {
-      # Reset status
-      %live_currencies = ();
-
-      # We're in the list
-      $in_currency_list = 1;
-    }
-    elsif ( $in_currency_list == 1
-            &&
-            lc $tagname eq 'option'
-          ) {
-      $in_currency_option = 1;
-      $currency_code = $attr->{value};
-      $currency_text = '';
-    }
-  }
-
-  # _end_handler (private function)
-  #
-  # This is a HTML::Parser end tag handler
-  sub _end_handler {
-    my ($tagname) = @_;
-
-    if ( lc $tagname eq 'select'
-         &&
-         $in_currency_list == 1
-       ) {
-      # We're leaving the currency list
-      $in_currency_list = 0;
-    }
-    elsif ( $in_currency_list == 1
-            &&
-            $in_currency_option == 1
-            &&
-            lc $tagname eq 'option'
-          ) {
-      # We're leaving an option
-      # Build currency list item (strip code from name)
-      $currency_text =~ s/\s*\([A-Z]+\)\s*$//;
-      $live_currencies{$currency_code} = { name => $currency_text };
-      $in_currency_option = 0;
-    }
-  }
-
-  # _text_handler (private function)
-  #
-  # This is a HTML::Parser text handler
-  sub _text_handler {
-    my ($dtext) = @_;
-
-    if ( $in_currency_list == 1
-         &&
-         $in_currency_option == 1
-       ) {
-      $currency_text .= $dtext;
-    }
-  }
-
-  # _live_currencies (private function)
-  #
-  # Return data from within the closure
-  sub _live_currencies {
-    return \%live_currencies;
-  }
-}
-
-1;
-
-=head1 NAME
-
-Finance::Quote::Currencies - List of currencies from Yahoo Finance
-
-=head1 SYNOPSIS
-
-    use Finance::Quote::Currencies;
-
-    my $currencies = Finance::Quote::Currencies::known_currencies();
-
-    # Grab the latest from Yahoo
-    my $live_currencies = Finance::Quote::Currencies::fetch_live_currencies();
-
-=head1 DESCRIPTION
-
-This module provides a list of known currencies from Yahoo Currency Converter.
-
-The converter website includes a list of known currencies - this module includes
-a stored list
-
-=head1 LAST EXTRACT
-
-The currency list stored in this module was last copied from the live site:
-
-Sun Feb 15 18:01:12 GMT 2009
-
-=head1 LICENSE
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or (at
-your option) any later version.
-
-Currency information fetched through this module is bound by
-Yahoo!'s terms and conditons.
-
-=head1 AUTHORS
-
-  Bradley Dean <bjdean@bjdean.id.au>
-
-=head1 SEE ALSO
-
-Yahoo Currency Converter - http://uk.finance.yahoo.com/currency-converter
-
-=cut
@@ -3,7 +3,7 @@
 #    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
 #    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
 #    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
+#    Copyright (C) 2000, Paul Fenwick <pjf@Acpan.org>
 #    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
 #    Copyright (C) 2000, Volker Stuerzl <volker.stuerzl@gmx.de>
 #    Copyright (C) 2006, Klaus Dahlke <klaus.dahlke@gmx.de>
@@ -33,24 +33,23 @@
 
 package Finance::Quote::DWS;
 require 5.005;
-require LWP::Protocol::https;
+require Crypt::SSLeay;
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use HTML::TableExtract;
+use Data::Dumper;
 use LWP::Simple;
 use strict;
 use warnings;
 
-our $VERSION = '1.37'; # VERSION
 
-sub methods {
-	return(dwsfunds => \&dwsfunds);
-}
+use vars qw/$VERSION/;
 
-sub labels {
-	return(dwsfunds => [qw/exchange name date isodate price method/]);
-}
+$VERSION = '2.00';
+
+sub methods { return (dwsfunds => \&dwsfunds); }
+sub labels { return (dwsfunds => [qw/exchange name date isodate price method/]); }
 
 # =======================================================================
 # The dwsfunds routine gets quotes of DWS funds (Deutsche Bank Gruppe)
@@ -60,199 +59,111 @@ sub labels {
 #    ...
 #
 # This subroutine was written by Volker Stuerzl <volker.stuerzl@gmx.de>
-#
+# 
 # Version 2.0 as new webpage provides the data
 # 2006-03-19: Klaus Dahlke
 # Since DWS has changed its format and the data are not available via
 # csv-file download, the respective web-page is avaluated. There are
 # some limitations currently, especially with the name
+
+sub dwsfunds
+{
+  my $quoter = shift;
+  my @funds = @_;
+  return unless @funds;
+  my $ua = $quoter->user_agent;
+  my (%fundhash, @q, %info);
+  my ($html_string, $te, $ts, $row, @cells, $ce, @ce1, @ce2, @ce22, @ce4, $last, $wkn, $date, $name);
+
+  # create hash of all funds requested
+  foreach my $fund (@funds)
+  {
+    $fundhash{$fund} = 0;
+  }
+
+  # get page containing the tables with prices etc
+  my $DWS_URL = "https://www.deami.de/dps/ff/prices.aspx";
+  my $response = $ua->request(GET $DWS_URL);
+ if ($response->is_success)
+ {
+  $html_string =$response->content;
+	  #
+  $te = new HTML::TableExtract->new( depth => 3, count => 1 );
+  $te->parse($html_string);
+  $ts=$te->table_state(3,1); 
+  foreach $row ($ts->rows) {
+     @cells =@$row;
 #
-# 2007-01-19: Stephan Ebelt
-# - fixed thousands and decimal separator handling
-# - check symbol against ISIN as well
-# - populate the exchange field with the DWS subsidiary that actually
-#   runs the fund
-# - "improved" the name extraction (this fix is questionable, but does what I
-#   want for the moment...), falls back to the string length assumption
-#   from the last version if there is no match
-# - fixed indent
+# replace line breaks and change from German decimal seperator to intl. decimal seperator
 #
-# 2007-01-26: Stephan Ebelt
-# - fixed 'unitialized value' warnings
+     foreach $ce (@cells) {
+	next unless $ce;
+        $ce =~ s/\n/:/g;
+        $ce =~ s/,/\./g;
+     }
+
+# get fond name, the last 50 characters are either blanks or fond classification
+# 
+     @ce1=split(/:/, $cells[1]);
+     $name=substr($ce1[0],0,length($ce1[0])-50);
 #
-
-sub dwsfunds {
-	my $quoter = shift;
-	my @funds = @_;
-	return unless @funds;
-
-	my $ua = $quoter->user_agent;
-	my (%fundhash, @q, %info);
-	my (
-		$html_string, $te, $ts, $row, @cells, $ce, @ce1, @ce2, @ce22, @ce4, $last,
-		$wkn, $isin, $exchange, $date, $name, $type
-	);
-
-	# define DWS 'Fondsart' (engl: classifications) as used on the page
-	# - these strings are used to break down the real name later
-	# - hardcoding at its best... but not much choice in order to get more
-	#   correct results
-	my @dws_fund_classifications = (
-		'Versicherungsfonds',
-		'Aktienfonds',
-		'Gemischte Fonds',
-		'Mitarbeiterfonds',
-		'Rentenfonds',
-		'Geldmarktnahe Fonds',
-		'Dachfonds',
-		'Kursgewinn-orientierte Fonds',
-		'AS-Fonds',
-		'Spezialit.ten',                       # note the dot ;-)
-		'Geldmarktfonds',
-		'Trading Fonds',
-		'DVG Fonds',
-		'Wandelanleihen-/ Genussscheinfonds',
-		'n/a'
-	);
-
-	# create hash of all funds requested
-	foreach my $fund (@funds) {
-		$fundhash{$fund} = 0;
-	}
-
-	# get page containing the tables with prices etc
-	my $DWS_URL = "https://www.deami.de/dps/ff/prices.aspx";
-	my $response = $ua->request(GET $DWS_URL);
-
-	if ($response->is_success) {
-		$html_string =$response->content;
-
-		$te = new HTML::TableExtract->new( depth => 3, count => 1 );
-		$te->parse($html_string);
-		$ts=$te->table_state(3,1);
-	} else {
-		# retrieval error - flag an error and return right away
-		foreach my $fund (@funds) {
-			%info = _dwsfunds_error(@funds, 'HTTP error: ' . $response->status_line);
-			return wantarray() ? %info : \%info;
-		}
-
-		return wantarray() ? %info : \%info;
-	}
-
-	#
-	#  loop the table rows...
-	#
-	foreach $row ($ts->rows) {
-		@cells =@$row;
-
-		# replace line breaks
-		#
-		foreach $ce (@cells) {
-			next unless $ce;
-			$ce =~ s/\n/:/g;
-		}
-
-		# verify cell count
-		if( $#cells != 4 ) {
-			%info = _dwsfunds_error(@funds, "parse error: cells=$#cells, expected cells=4");
-			return wantarray() ? %info : \%info;
-		}
-
-		# get fond name and exchange
-		#
-		@ce1=split(/:/, $cells[1]);
-		$name     = $ce1[0];
-		$exchange = $ce1[1];
-
-
-		# get date and last price
-		#
-		@ce2=split(/:/, $cells[2]);
-		$date = $ce2[0];
-		$last = $ce2[2];
-
-		#
-		# wkn or isin is the source
-		#
-		@ce4=split(/:/, $cells[4]);
-		$wkn=$ce4[1];
-		$isin=$ce4[2];
-
-		# match the fund by symbol
-		foreach my $fund (@funds) {
-			if (  ($wkn eq $fund) or ($isin eq $fund) ) {
-
-				# attempt to separate the name-classification contruct
-				my $name_ok = 0;
-				foreach my $t (@dws_fund_classifications) {
-					if( $name =~ /$t/ ) {
-						$type = $t;
-
-						my @n = split(/$t/, $name);
-						$name = $n[0];
-						$name_ok = 1;
-
-						last();
-					}
-				}
-
-				if( ! $name_ok ) {
-					# fall back - the last 50 characters are either blanks or fond classification
-					$name = substr($name, 0, length($name)-50);
-					$info{$fund, "errormsg"} = "name-classification separation failed, guessing...";
-				}
-
-				# mangle last price (thousands/decimal separators, ...)
-				# - note the decimal separator is hardcoded to ',' (comma)
-				# - keep arbitrary precision and any eventually following unit (%, $, ...)
-				if( $last =~ /^(.*),(\d*.{1})$/ ) {
-					my @tmp = ( $1, $2 );
-					$tmp[0] =~ s/\.//g;
-					$last = join('.', @tmp);
-				}
-
-				# finaly, build up the result
-				$info{$fund,"exchange"} = $exchange;
-				$info{$fund,"symbol"}   = $fund;
-				$quoter->store_date(\%info, $fund, {eurodate => $date});
-				$info{$fund,"name"}     = $name;
-				$info{$fund,"last"}     = $last;
-				$info{$fund,"price"}    = $last;
-				$info{$fund,"method"}   = "dwsfunds";
-				$info{$fund,"currency"} = "EUR";
-				$info{$fund,"success"}  = 1;
-				$fundhash{$fund}        = 1;
-			}
-		}
-	}
-
-	# make sure a value is returned for every fund requested
-	foreach my $fund (keys %fundhash) {
-		if ($fundhash{$fund} == 0) {
-			$info{$fund, "success"}  = 0;
-			$info{$fund, "errormsg"} = 'No data returned';
-		}
-	}
-
-	return wantarray() ? %info : \%info;
+# extract the date from the page
+#
+     @ce2=split(/:/, $cells[2]);
+     $date = $ce2[0];
+#
+# get last price (return value) and remove additional thousand seperator
+#
+     $last=$ce2[2];
+     if ( $last =~ /\d\d.\d\d\d.\d\d/ ) {
+        $last =~ s/\.//;
+     }
+# 
+# wkn is the source
+#
+     @ce4=split(/:/, $cells[4]);
+     $wkn=$ce4[1]; 
+     foreach my $fund (@funds) {
+     if ( $wkn eq $fund ) {
+       $info{$fund,"exchange"} = "DWS";
+       $info{$fund,"symbol"} = $wkn;
+       $quoter->store_date(\%info, $fund, {eurodate => $date});
+       $info{$fund,"name"} = $name;
+       $info{$fund,"last"} = $last;
+       $info{$fund,"price"} = $last;
+       $info{$fund,"method"} = "dwsfunds";
+       $info{$fund,"currency"} = "EUR";
+       $info{$fund,"success"} = 1;
+       $fundhash{$fund} = 1;
+     }
+     }
+  }
+					   #
+
+    # check to make sure a value was returned for every fund requested
+     foreach my $fund (keys %fundhash)
+     {
+       if ($fundhash{$fund} == 0)
+       {
+         $info{$fund, "success"}  = 0;
+         $info{$fund, "errormsg"} = "No data returned";
+       }
+     }
 }
+else
+  {
+   foreach my $fund (@funds)
+   {
+    $info{$fund, "success"}  = 0;
+    $info{$fund, "errormsg"} = "HTTP error";
+    }
+    }
 
-# - populate %info with errormsg and status code set for all requested symbols
-# - return a hash ready to pass back to fetch()
-sub _dwsfunds_error {
-	my @symbols = shift;
-	my $msg     = shift;
-	my %info;
 
-	foreach my $s (@symbols) {
-		$info{$s, "success"}  = 0;
-		$info{$s, "errormsg"} = $msg;
-	}
-
-	return(%info);
+  return wantarray() ? %info : \%info;
 }
 
+
 1;
 
 =head1 NAME
@@ -265,12 +176,11 @@ Finance::Quote::DWS	- Obtain quotes from DWS (Deutsche Bank Gruppe).
 
     $q = Finance::Quote->new;
 
-    %fundinfo = $q->fetch("dwsfunds","847402", "DE0008474024", ...);
+    %fundinfo = $q->fetch("dwsfunds","847402");
 
 =head1 DESCRIPTION
 
-This module obtains information about DWS managed funds. Query it with
-German WKN and/or international ISIN symbols.
+This module obtains information about DWS managed funds.
 
 Information returned by this module is governed by DWS's terms
 and conditions.
@@ -20,9 +20,10 @@ package Finance::Quote::Deka;
 use strict;
 use HTML::TableExtract;
 
-require LWP::Protocol::https;
+require Crypt::SSLeay;
 
-our $VERSION = '1.37'; # VERSION
+use vars qw($VERSION);
+$VERSION = '0.3';
 my $DEKA_URL = "https://www.deka.de/dn/useCases/fundsearch/UCFundsSearch.shtml?ACTION_FIELD=quickSearch";
 
 sub methods {return (deka        => \&deka);}
@@ -69,7 +70,7 @@ sub deka
 #	  next if !defined $$row[0] || !defined $$row[1];
 #	  print "Row: ", join('|', @$row), "\n";
 #	}
-
+	
         foreach my $row ($ts->rows) {
 	  next if !defined $$row[0] || !defined $$row[1];
 	  $info{$stock,"name"} = $$row[0];
@@ -33,13 +33,13 @@ require 5.004;
 
 use strict;
 
-use vars qw( $FTPORTFOLIOS_URL $FTPORTFOLIOS_ALL);
+use vars qw($VERSION $FTPORTFOLIOS_URL $FTPORTFOLIOS_ALL);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.00';
 
 # URLs of where to obtain information.
 
@@ -50,7 +50,7 @@ sub methods { return (ftportfolios => \&ftportfolios, ftportfolios_direct => \&f
 
 {
         my @labels = qw/exchange method source name currency nav pop price/;
-
+	
 	sub labels { return (ftportfolios => \@labels,
 	                     ftportfolios_direct => \@labels); }
 }
@@ -61,20 +61,20 @@ sub ftportfolios
 {
     my $quoter = shift;
     my @symbols = @_;
-
+    
     return unless @symbols;
     my(@q,%aa,$ua,$url,$sym,$ts,$date,$price,$currency,$reply,$trust);
     my ($row, $datarow, $matches);
     my %curr_iso = ("\$" => "USD");
-
+    
     my %symbolhash;
     @symbolhash{@symbols} = map(1,@symbols);
-    #
+    # 
     for (@symbols) {
       my $te = new HTML::TableExtract( );
       $trust = $_;
       $url = "$FTPORTFOLIOS_URL";
-
+      
       # print STDERR "Retrieving \"$trust\" from $url\n";
       $ua = $quoter->user_agent;
 
@@ -83,9 +83,9 @@ sub ftportfolios
       push @{ $ua->requests_redirectable }, 'POST';
       $reply = $ua->request(POST $url, [searchfor => $trust]);
       return unless ($reply->is_success);
-
+      
       # print STDERR $reply->content,"\n";
-
+      
       $te->utf8_mode(1);
       $te->parse($reply->content);
 
@@ -1,394 +0,0 @@
-#!/usr/bin/perl -w
-
-#  ftfunds.pm
-#
-#  Obtains quotes for UK Unit Trusts from http://funds.ft.com/ - please
-#  refer to the end of this file for further information.
-#
-#  author: Martin Sadler (martinsadler@users.sourceforge.net)
-#
-#  Version 0.1 Initial version - 06 Sep 2010
-#
-#  Version 0.2 Better look-up  - 19 Sep 2010
-#
-#  Version 0.3 name changed to "ftfunds"
-#              (all lower case) and tidy-up - 31 Jan 2011
-#
-#  Version 0.4 Allows alphanumerics MEXIDs
-#              and back to "FTfunds"        - 28 Feb 2011
-#
-#  Version 1.0 Changed to work with the new
-#              format of funds.ft.com       - 14 Sep 2011
-#
-#  Version 2.0 Changed to work with the latest
-#              format of funds.ft.com		- 31 Mar 2013
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-#    02111-1307, USA
-#
-
-
-package Finance::Quote::FTfunds;
-require 5.005;
-
-use strict;
-use warnings;
-
-# Set DEBUG => 1 for no debug messages, => 1 for first level, => 2 for 2nd level, etc.
-
-use constant DEBUG => 0;
-
-# URLs
-use vars qw($VERSION $FTFUNDS_LOOK_UD $FTFUNDS_LOOK_LD $FTFUNDS_MAIN_URL);
-
-use LWP::UserAgent;
-use HTTP::Request::Common;
-use HTTP::Cookies;
-use HTML::TokeParser;
-# use Data::Dumper;
-
-our $VERSION = '1.37'; # VERSION
-
-$FTFUNDS_MAIN_URL   =   "http://funds.ft.com";
-$FTFUNDS_LOOK_LD    =   "http://funds.ft.com/UK/Tearsheet/Summary?s=";
-$FTFUNDS_LOOK_UD    =	"http://funds.ft.com/UnlistedTearsheet/Summary?s=";
-
-                        # this will work with ISIN codes only.
-
-# FIXME -
-
-sub methods { return (ftfunds => \&ftfunds_fund,
-		      ukfunds => \&ftfunds_fund); }
-
-{
-    my @labels = qw/name currency last date time price nav source iso_date method net p_change success errormsg/;
-
-    sub labels { return (ftfunds => \@labels,
-			 ukfunds => \@labels); }
-}
-
-#
-# =======================================================================
-
-sub ftfunds_fund  {
-    my $quoter = shift;
-    my @symbols = @_;
-
-    return unless @symbols;
-
-    my %fundquote;
-
-    my $ua = $quoter->user_agent;
-    my $cj = HTTP::Cookies->new();
-    $ua->cookie_jar( $cj );
-
-    foreach (@symbols)
-    {
-		my $code = $_;
-
-		my $code_type = "** Invalid **";
-		if ($code =~ m/^[a-zA-Z]{2}[a-zA-Z0-9]{9}\d(.*)/ && !$1) { $code_type = "ISIN";  }
-		elsif ($code =~ m/^[a-zA-Z0-9]{6}\d(.*)/ && !$1 )        { $code_type = "SEDOL"; }
-		elsif ($code =~ m/^[a-zA-Z0-9]{4,6}(.*)/ && !$1)         { $code_type = "MEXID"; }
-
-# current version can only use ISIN - report an error and exit if any other type
-
-		if ($code_type ne "ISIN")
-    	{
-			$fundquote {$code,"success"} = 0;
-			$fundquote {$code,"errormsg"} = "Error - invalid symbol";
-			next;
-    	}
-
-		$fundquote {$code,"success"} = 1; # ever the optimist....
-		$fundquote {$code,"errormsg"} = "Success";
-
-# perform the look-up - if not found, return with error
-
-# try listed funds first...
-
-		my $webdoc  = $ua->get($FTFUNDS_LOOK_LD.$code);
-    	if (!$webdoc->is_success)
-		{
-	        # serious error, report it and give up
-			$fundquote {$code,"success"} = 0;
-			$fundquote {$code,"errormsg"} =
-		       		"Error - failed to retrieve fund data : HTTP status = ".$webdoc->status_line;
-			next;
-		}
-
-DEBUG and print "\nTitle  = ",$webdoc->title,"\n";
-DEBUG and print "\nStatus = ",$webdoc->status_line, "\n";
-DEBUG > 1 and print "\nCookie Jar = : \n",Dumper($cj),"\n\n";
-
-		$fundquote {$code, "source"} = $FTFUNDS_LOOK_LD.$code;
-
-# if page contains "<h2>0 results</h2>" it's not found...
-# ... try unlisted funds...
-
-		if ($webdoc->content =~
-        m[<h2>(0 results)</h2>] )
-    	{
-DEBUG and print "\nTrying unlisted funds for ",$code," : ",$1,"\n";
-			$webdoc  = $ua->get($FTFUNDS_LOOK_UD.$code);
-			if (!$webdoc->is_success)
-        	{
-	        	# serious error, report it and give up
-				$fundquote {$code,"success"} = 0;
-				$fundquote {$code,"errormsg"} =
-		        		"Error - failed to retrieve fund data : HTTP status = ".$webdoc->status_line;
-				next;
-			}
-
-DEBUG and print "\nTitle  = ",$webdoc->title,"\n";
-DEBUG and print "\nStatus = ",$webdoc->status_line, "\n";
-DEBUG > 1 and print "\nCookie Jar = : \n",Dumper($cj),"\n\n";
-
-			$fundquote {$code, "source"} = $FTFUNDS_LOOK_UD.$code;
-		}
-
-		$fundquote {$code, "symbol"} = $code;
-
-# Find name by simple regexp
-
-        my $name;
-		if ($webdoc->content =~
-        m[<title>(.*) Summary - FT.com] )
-        {
-            $name = $1 ;
-        }
-		if (!defined($name)) {
-			# not a serious error - don't report it ....
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find fund name";
-			$name = "*** UNKNOWN ***";
-			# ... and continue
-		}
-		$fundquote {$code, "name"} = $name;	# set name
-
-# Find price
-		my $price;
-		if ($webdoc->content =~
-		m[<div class="contains wsodModuleContent"><table><tbody><tr><td class="text first">([\.\,0-9]*)</td>]  )
-        {
-			$price   = $1;
-        }
-		if (!defined($price)) {
-			# serious error, report it and give up
-			$fundquote {$code,"success"} = 0;
-			$fundquote {$code,"errormsg"} = "Error - failed to find a price";
-			next;
-		}
-		if ($price =~ m[([0-9]*),([\.0-9]*)])
-		{
-				$price	  = $1 * 1000 + $2;
-		}
-
-# Find net and percent-age change
-		my $net;
-		my $pchange;
-		if ($webdoc->content =~
-		m[<span class="(pos|neg) color ">([\.0-9]*) / ([\.0-9]*)%</span>] )
-        {
-            $net = $2 ;     # allow for alternates in match string
-            $pchange = $3;
-        }
-		if (!defined($net)) {
-			# not a serious error - don't report it ....
-#			$fundquote {$code,"success"} = 0;
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find a net change.";
-			$net = "-0.00";					# ???? is this OK ????
-			# ... and continue
-		}
-		if (!defined($pchange)) {
-			# not a serious error - don't report it ....
-#			$fundquote {$code,"success"} = 0;
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find a %-change";
-			$pchange = "-0.00";					# ???? is this OK ????
-			# ... and continue
-		}
-		if ($net =~ m[([0-9]*),([\.0-9]*)])
-		{
-			$net	  = $1 * 1000 + $2;
-		}
-		if ($pchange =~ m[([0-9]*),([\.0-9]*)])
-		{
-			$pchange	  = $1 * 1000 + $2;
-		}
-
-# Find the currency
-		my $currency;
-		if ($webdoc->content =~
-		m[($code):([A-Z]{3})]  )
-        {
-
-			$currency    = $2;
-        }
-
-		if (!defined($currency)) {
-			# serious error, report it and give up
-			$fundquote {$code,"success"} = 0;
-			$fundquote {$code,"errormsg"} = "Error - failed to find a currency";
-			next;
-		}
-
-# deal with GBX pricing of UK unit trusts
-
-		if ($currency eq "GBX")
-		{
-			$currency = "GBP" ;
-			$price = $price / 100 ;
-            $net   = $net   / 100 ;
-		}
-
-	# now set prices, net change and currency
-
-		$fundquote {$code, "price"} = $price;
-		$fundquote {$code, "last"} = $price;
-		$fundquote {$code, "nav"} = $price;
-        $fundquote {$code, "net"} = $net;
-		$fundquote {$code, "currency"} = $currency;
-		$fundquote {$code, "p_change"} = $pchange;	# set %-change
-
-# Find time
-
-# NB. version 2.0 - there is no time quoted on the current (31/3/2013) factsheet page for unit trusts
-# ... this code left in in case it is available in later revisions of the page
-
-		my $time;
-		if ($webdoc->content =~ m[......... some string that will identify the time ............] )
-        {
-            if ($1 =~ m[(\d\d:\d\d)] )  # strip any trailing text (Timezone, etc.)
-            {
-                $time = $1;
-            }
-        }
-		if (!defined($time)) {
-			# not a serious error - don't report it ....
-#			$fundquote {$code,"success"} = 0;
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find a time";
-			$time = "17:00";	# set to 17:00 if no time supplied ???
-                               	# gnucash insists on having a valid-format
-			# ... and continue
-		}
-
-		$fundquote {$code, "time"} = $time; # set time
-
-# Find date
-
-		my $date;
-		if ($webdoc->content =~
-		m[([A-Za-z]{3}) ([0-9]{2}) ([0-9]{4})] )
-        {
-        	$date = "$2/$1/$3" ;
-        }
-		if (!defined($date)) {
-			# not a serious error - don't report it ....
-#			$fundquote {$code,"success"} = 0;
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find a date";
-			# use today's date
-			$quoter->store_date(\%fundquote, $code, {today => 1});
-			# ... and continue
-		}
-		else
-		{
-			$quoter->store_date(\%fundquote, $code, {eurodate => $date});
-		}
-
-		$fundquote {$code, "method"} = "ftfunds";   # set method
-		sleep 1;									# go to sleep for a while to give the web-site a breather
-
-    }	# end of "foreach (@symbols)"
-
-	return wantarray ? %fundquote : \%fundquote;
-}
-
-1;
-
-=head1 NAME
-
-Finance::Quote::FTfunds - Obtain UK Unit Trust quotes from FT.com (Financial Times).
-
-=head1 SYNOPSIS
-
-    $q = Finance::Quote->new;
-
-    %info = Finance::Quote->fetch("ftfunds","<isin> ...");  # Only query FT.com using ISINs
-
-=head1 DESCRIPTION
-
-This module fetches information from the Financial Times Funds service,
-http://funds.ft.com. There are over 47,000 UK Unit Trusts and OEICs quoted,
-as well as many Offshore Funds and Exhange Traded Funds (ETFs). It converts
-any funds quoted in GBX (pence) to GBP, dividing the price by 100 in the
-process.
-
-Funds are identified by their ISIN code, a 12 character alphanumeric code.
-Although the web site also allows searching by fund name, this version of
-Finance::Quote::FTfunds only implements ISIN lookup. To determine the ISIN for
-funds of interest to you, visit the funds.ft.com site and use the flexible search
-facilities to identify the funds of interest. The factsheet display for any given
-fund displays the ISIN along with other useful information.
-
-This module is loaded by default on a Finance::Quote object. It's
-also possible to load it explicity by placing "ftfunds" in the argument
-list to Finance::Quote->new().
-
-Information obtained by this module may be covered by funds.ft.com
-terms and conditions See http://funds.ft.com/ and http://ft.com for details.
-
-=head2 Stocks And Indices
-
-This module provides both the "ftfunds" and "ukfunds" fetch methods for
-fetching UK and Offshore Unit Trusts and OEICs prices and other information
-from funds.ft.com. Please use the "ukfunds" fetch method if you wish to have
-failover with future sources for UK and Offshore Unit Trusts and OEICs - the
-author has plans to develop Finance::Quote modules for the London Stock Exchange
-and Morningstar unit trust services. Using the "ftfunds" method will guarantee
-that your information only comes from the funds.ft.com website.
-
-=head1 LABELS RETURNED
-
-The following labels may be returned by Finance::Quote::ftfunds :
-
-    name, currency, last, date, time, price, nav, source, method,
-    iso_date, net, p_change, success, errormsg.
-
-
-=head1 SEE ALSO
-
-Financial Times websites, http://ft.com and http://funds.ft.com
-
-
-=head1 AUTHOR
-
-Martin Sadler, E<lt>martinsadler@users.sourceforge.netE<gt>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright (C) 2010 by Martin Sadler
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself, either Perl version 5.10.1 or,
-at your option, any later version of Perl 5 you may have available.
-
-
-=cut
-
-__END__
@@ -31,12 +31,12 @@ package Finance::Quote::Fidelity;
 require 5.005;
 
 use strict;
-use vars qw/$FIDELITY_URL /;
+use vars qw/$FIDELITY_URL $VERSION/;
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.05';
 
 $FIDELITY_URL = ("http://activequote.fidelity.com/nav/fulllist.csv");
 
@@ -74,13 +74,13 @@ sub fidelity
     if ($reply->is_success) {
       foreach (split('\015?\012',$reply->content)) {
 	my @q = $quoter->parse_csv($_) or next;
-
+	
 	$sym = $q[2] or next;
 	$sym =~ s/^ +//;
-
+    
     	# Skip symbols we didn't ask for.
     	next unless (defined($symbolhash{$sym}));
-
+    
 	 $aa {$sym, "exchange"}	= "Fidelity";  # Fidelity
 	 $aa {$sym, "method"}  	= "fidelity_direct";
 	($aa {$sym, "name"}    	= $q[0]) =~ s/^\s+//;
@@ -17,7 +17,7 @@ use LWP::UserAgent;
 use HTTP::Request::Common;
 use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
+my $VERSION = '0.2';
 my $FINANCECANADA_MAINURL = ("http://finance.canada.com/");
 my $FINANCECANADA_URL = "http://stockgroup.canada.com/sn_overview.asp?symbol=T.";
 
@@ -31,7 +31,7 @@ sub labels {
     my @labels = qw/method source name symbol currency last date isodate nav price/;
     return (canada => \@labels,
             financecanada => \@labels);
-}
+}   
 
 
 
@@ -143,7 +143,7 @@ sub financecanada {
 	    }
 	    $info{$symbol, "day_range"} = $info{$symbol, "low"} . " - " . $info{$symbol, "high"}
 	    if (defined($info{$symbol, "high"}) && defined($info{$symbol, "low"}));
-
+	    
 	    if (defined($year_high) && defined($year_low)) {
 		$info{$symbol, "year_range"} = "$year_low - $year_high";
 	    }
@@ -170,7 +170,7 @@ finance.canada.com
 
     # Can failover to other methods
     %quotes = $q->fetch("canada", "stock_fund-code");
-
+    
     # Use this module only
     %quotes = $q->fetch("financecanada", "stock_fund-code");
 
@@ -202,3 +202,4 @@ Finance Canada.com website - http://finance.canada.com/
 Finance::Quote
 
 =cut
+
@@ -1,115 +0,0 @@
-# Finance::Quote Perl module to retrieve quotes from Finanzpartner.de
-#    Copyright (C) 2007  Jan Willamowius <jan@willamowius.de>
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-
-package Finance::Quote::Finanzpartner;
-
-use strict;
-use HTML::TableExtract;
-
-our $VERSION = '1.37'; # VERSION
-
-my $FINANZPARTNER_URL = "http://www.finanzpartner.de/fi/";
-
-sub methods {return (finanzpartner        => \&finanzpartner);}
-sub labels { return (finanzpartner=>[qw/name date price last method/]); } # TODO
-
-# Trim leading and tailing whitespaces (also non-breakable whitespaces)
-sub trim
-{
-	$_ = shift();
-	s/^\s*//;
-	s/\s*$//;
-	s/&nbsp;//g;
-	return $_;
-}
-
-# Convert number separators to US values
-sub convert_price {
-	$_ = shift;
-        tr/.,/,./ ;
-	return $_;
-}
-
-sub finanzpartner
-{
-	my $quoter = shift;     # The Finance::Quote object.
-	my @stocks = @_;
-	my $ua = $quoter->user_agent();
-	my %info;
-
-	foreach my $stock (@stocks) {
-		$ua->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)');
-		my $response = $ua->get($FINANZPARTNER_URL . $stock . '/');
-		$info{$stock,"success"} = 0;
-		if (!$response -> is_success()) {
-			$info{$stock,"errormsg"} = "HTTP failure";
-		} else {
-			my $te = new HTML::TableExtract(depth => 0, count => 2);
-			$te->parse($response->content);
-			my $table = $te->first_table_found;
-
-			if (trim($table->cell(1,0)) ne 'Fondsname:') {
-				$info{$stock,"errormsg"} = "Couldn't parse website";
-			} else {
-				$info{$stock,"name"} = $table->cell(1,1);
-				my $quote = $table->cell(6,1);
-				my @part = split(/\s/, $quote);
-				$info{$stock,"currency"} = $part[1];
-				$part[2] =~ s/\(//g;
-				$part[2] =~ s/\)//g;
-				$quoter->store_date(\%info, $stock, {eurodate => $part[2]});
-				$info{$stock,"price"} = convert_price(trim($part[0]));
-				$info{$stock,"last"} = $info{$stock,"price"};
-				$info{$stock,"success"} = 1;
-				$info{$stock,"method"} = "finanzpartner";
-				$info{$stock,"symbol"} = $stock;
-			}
-		}
-	}
-	return wantarray ? %info : \%info;
-}
-
-1;
-
-=head1 NAME
-
-Finance::Quote::Finanzpartner - Obtain quotes from Finanzpartner.de.
-
-=head1 SYNOPSIS
-
-    use Finance::Quote;
-
-    $q = Finance::Quote->new("Finanzpartner");
-
-    %info = $q->fetch("finanzpartner","LU0055732977");
-
-=head1 DESCRIPTION
-
-This module obtains quotes from Finanzpartner.de (http://www.finanzpartner.de) by WKN or ISIN.
-
-=head1 LABELS RETURNED
-
-The following labels may be returned by Finance::Quote::Finanzpartner:
-name, date, price, last, method.
-
-=head1 SEE ALSO
-
-Finanzpartner, http://www.finanzpartner.de/
-
-Finance::Quote;
-
-=cut
@@ -3,7 +3,7 @@
 #    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
 #    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
 #    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
+#    Copyright (C) 2000, Paul Fenwick <pjf@Acpan.org>
 #    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
 #    Copyright (C) 2001, Tobias Vancura <tvancura@altavista.net>
 #
@@ -38,9 +38,9 @@ use HTTP::Request::Common;
 use LWP::UserAgent;
 use Exporter;
 
-use vars qw/$FOOL_URL  @FIELDS $MAX_REQUEST_SIZE @ISA/;
+use vars qw/$FOOL_URL $VERSION @FIELDS $MAX_REQUEST_SIZE @ISA/;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = "0.1";
 
 $FOOL_URL = 'http://quote.fool.com/quotes.csv?symbols=';
 
@@ -87,7 +87,7 @@ sub fool {
 
 	# Okay, the data is here
         my $reply = $response->content;
-
+    
         my $i=0;
 	foreach (split('\x0D', $reply)) {
 	  if ( $i++ ) {    # the first line only contains info about
@@ -1,264 +0,0 @@
-#!/usr/bin/perl -w
-#
-#    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
-#    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
-#    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
-#    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
-#    Copyright (C) 2000, Volker Stuerzl <volker.stuerzl@gmx.de>
-#    Copyright (C) 2006, Klaus Dahlke <klaus.dahlke@gmx.de>
-#    Copyright (C) 2008, Stephan Ebelt <stephan.ebelt@gmx.de>
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-#    02111-1307, USA
-#
-# $Id: $
-
-package Finance::Quote::GoldMoney;
-require 5.005;
-
-use HTTP::Request::Common;
-use HTML::TableExtract;
-
-use strict;
-use warnings;
-
-our $VERSION = '1.37'; # VERSION
-
-sub methods {
-	return(goldmoney => \&goldmoney);
-}
-
-sub labels {
-	return(goldmoney => [qw/exchange name date isodate price method/]);
-}
-
-# goldmoney($quoter, @symbols)
-#
-# - get 'gold' and 'silver' spot rates from goldmoney.com
-# - error out properly (that is: ignore) all other symbols
-#
-sub goldmoney {
-	my $quoter = shift;
-	my @symbols = @_;
-	return unless @symbols;
-
-	my $ua = $quoter->user_agent;
-	my (%symbolhash, @q, %info);
-	my (
-		$html_string, $te, $table_gold, $table_silver, $table_platinum,
-		$gold_gg, $gold_oz, $silver_oz, $platinum_oz, $platinum_pg, $currency
-	);
-
-	my $_want_gold = 0;
-	my $_want_silver = 0;
-	my $_want_platinum = 0;
-
-	# - feed all requested symbols into %info (to be returned later)
-	# - set error state to false by default
-	# - see if a gold or silver rate is requested
-	foreach my $s (@symbols) {
-		$info{$s,'success'}  = 0;
-		$info{$s,'exchange'} = 'goldmoney.com';
-		$info{$s,'method'}   = 'goldmoney';
-		$info{$s,'symbol'}   = $s;
-
-		if($s eq 'gold') {
-			$_want_gold = 1;
-		} elsif($s eq 'silver') {
-			$_want_silver = 1;
-		} elsif($s eq 'platinum') {
-			$_want_platinum = 1;
-		} else {
-			$info{$s,'errormsg'} = "No data returned (note: this module only works for 'gold' and 'silver')";
-		}
-	}
-
-	# get the page
-	# - but only if we want either gold, silver or platinum (there is nothing else there)
-	if( $_want_gold or $_want_silver or $_want_platinum) {
-		my $GOLDMONEY_URL = "http://goldmoney.com";
-		my $response = $ua->request(GET $GOLDMONEY_URL);
-
-		if ($response->is_success) {
-			$html_string =$response->content;
-
-			# we want the 'Current Spot Rates' table
-			$te = new HTML::TableExtract->new( attribs=>{class=>'spot'}, subtables=>1);
-			$te->parse($html_string);
-			$table_gold=$te->table(3,0);
-			$table_silver=$te->table(3,1);
-			$table_platinum=$te->table(3,2);
-		} else {
-			# retrieval error - flag an error and return right away
-			foreach my $s (@symbols) {
-				%info = _goldmoney_error(@symbols, 'HTTP error: ' . $response->status_line);
-				return wantarray() ? %info : \%info;
-			}
-			return wantarray() ? %info : \%info;
-		}
-
-		# get list of currencies
-		# FIXME:
-		# - assume euro since the site change in 01/2009
-		# - currency is JavaScript()ed since then and therefore hard to parse, if you
-		#   know how please tell me
-		# - this assumption causes trouble when the module is used outside the
-		#   european region (F::Q considers every number it gets as EUR and converts it...)
-		$currency = 'EUR';
-
-		# get gold rate
-		#
-		if( $_want_gold ) {
-			$_ = $table_gold->cell(0,0);
-			if( /(\d*\.\d*).*\/gg/ ) {
-				$gold_gg = $1;
-			}
-
-			$_ = $table_gold->cell(0,0);
-			if( /(\d*\.\d*).*\/oz/ ) {
-				$gold_oz = $1;
-
-				# assemble final dataset
-				# - take "now" as date/time as the site is always current and does
-				#   not provide this explicitly - so there is a time-slip
-				$quoter->store_date(\%info, 'gold', {isodate => _goldmoney_time('isodate')});
-				$info{'gold','time'}     = _goldmoney_time('time');
-				$info{'gold','name'}     = 'Gold Spot';
-				$info{'gold','last'}     = $gold_oz;
-				$info{'gold','price'}    = $gold_oz;
-				$info{'gold','price_gg'} = $gold_gg;
-				$info{'gold','currency'} = $currency;
-				$info{'gold','success'}  = 1;
-			}
-		}
-
-		# get silver rate
-		#
-		if( $_want_silver ) {
-			$_ = $table_silver->cell(0,0);
-			if( /(\d*\.\d*).*\/oz/ ) {
-				$silver_oz = $1;
-
-				$quoter->store_date(\%info, 'silver', {isodate => _goldmoney_time('isodate')});
-				$info{'silver','time'}     = _goldmoney_time('time');
-				$info{'silver','name'}     = 'Silver Spot';
-				$info{'silver','last'}     = $silver_oz;
-				$info{'silver','price'}    = $silver_oz;
-				$info{'silver','currency'} = $currency;
-				$info{'silver','success'}  = 1;
-			}
-		}
-
-		# get platinum rate
-		#
-		if( $_want_platinum ) {
-			$_ = $table_platinum->cell(0,0);
-			if( /(\d*\.\d*).*\/pg/ ) {
-				$platinum_pg = $1;
-			}
-
-			$_ = $table_platinum->cell(0,0);
-			if( /(\d*\.\d*).*\/oz/ ) {
-				$platinum_oz = $1;
-
-				# assemble final dataset
-				# - take "now" as date/time as the site is always current and does
-				#   not provide this explicitly - so there is a time-slip
-				$quoter->store_date(\%info, 'platinum', {isodate => _goldmoney_time('isodate')});
-				$info{'platinum','time'}     = _goldmoney_time('time');
-				$info{'platinum','name'}     = 'Platinum Spot';
-				$info{'platinum','last'}     = $platinum_oz;
-				$info{'platinum','price'}    = $platinum_oz;
-				$info{'platinum','price_pg'} = $platinum_pg;
-				$info{'platinum','currency'} = $currency;
-				$info{'platinum','success'}  = 1;
-			}
-		}
-	}
-
-	return wantarray() ? %info : \%info;
-}
-
-# - populate %info with errormsg and status code set for all requested symbols
-# - return a hash ready to pass back to fetch()
-sub _goldmoney_error {
-	my @symbols = shift;
-	my $msg     = shift;
-	my %info;
-
-	foreach my $s (@symbols) {
-		$info{$s, "success"}  = 0;
-		$info{$s, "errormsg"} = $msg;
-	}
-
-	return(%info);
-}
-
-# - return current 'isodate' and 'time' string
-sub _goldmoney_time {
-	my $want = shift;
-	my @now = localtime();
-	my $str;
-
-	if($want eq 'isodate') {
-		$str = sprintf('%4d-%02d-%02d', $now[5]+1900, $now[4]+1, $now[3]);
-	} elsif($want eq 'time') {
-		$str = sprintf('%02d:%02d:%02d', $now[2], $now[1], $now[0]);
-	}
-
-	return($str);
-}
-
-1;
-
-=head1 NAME
-
-Finance::Quote::GoldMoney - obtain spot rates from GoldMoney.
-
-=head1 SYNOPSIS
-
-    use Finance::Quote;
-
-    $q = Finance::Quote->new;
-
-    %rates = $q->fetch('goldmoeny','gold', 'silver', 'platinum');
-
-=head1 DESCRIPTION
-
-This module obtains current spot rates for 'gold', 'silver' and
-'platinum' from Goldmoney (http://www.goldmoney.com). All other
-symbols are ignored.
-
-Information returned by this module is governed by Net Transactions
-Ltd.'s terms and conditions. This module is *not* affiliated with the
-company in any way. Use at your own risk.
-
-=head1 LABELS RETURNED
-
-The following labels are returned by Finance::Quote::GoldMoney:
-
-	- exchange
-	- name
-	- date, time
-	- price (per ounce), price_gg (per goldgram, gold only),
-      price_pg (per platinumgram, platinum only)
-    - currency
-
-=head1 SEE ALSO
-
-GoldMoney (Net Transactions Ltd.), http://www.goldmoney.com/
-
-=cut
@@ -39,9 +39,9 @@ use HTTP::Request::Common;
 use LWP::UserAgent;
 use HTML::TableExtract;
 
-use vars qw/$HEX_URL /;
+use vars qw/$HEX_URL $VERSION/;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = "1.0";
 
 $HEX_URL = 'http://omxgroup.is-teledata.com/html/securitypricelistequities.html?language=fi';
 
@@ -135,7 +135,7 @@ sub hex {
 
 		$info{$stock,'volume'} = $$row[9];
 		$info{$stock,'volume'} =~ tr/ \200-\377//d;
-
+		
 		# Use deciman point instead of comma.
 		foreach my $label (qw/last bid ask high low p_change/) {
 			$info{$stock,$label} =~ s/,/./;
@@ -1,249 +0,0 @@
-#!/usr/bin/perl -w
-#
-# HU.pm
-#
-# Version 0.3 - Fixed BAMOSZ website scraping and download stocks
-# directly from www.BET.hu
-# This version based on ZA.pm module
-#
-# Zoltan Levardy <zoltan at levardy dot org> 2008, 2009
-# Kristof Marussy <kris7topher at gmail dot com> 2014
-
-package Finance::Quote::HU;
-require 5.005;
-
-use strict;
-
-use LWP::UserAgent;
-use HTTP::Request::Common;
-use HTML::TableExtract;
-use Encode;
-
-our $VERSION = '1.37'; # VERSION
-
-my $BAMOSZ_MAINURL = "http://www.bamosz.hu/";
-my $BAMOSZ_URL = $BAMOSZ_MAINURL . "alapoldal?isin=";
-
-my $BSE_MAINURL = "http://www.bet.hu/";
-my $BSE_URL = $BSE_MAINURL . "topmenu/kereskedesi_adatok/product_search?isinquery=";
-
-sub methods {
-    return ( hufund  => \&bamosz,
-             bamosz  => \&bamosz,
-             hustock => \&bse,
-             bse     => \&bse,
-             bet     => \&bse,
-             hu      => \&hu,
-             hungary => \&hu
-    );
-}
-
-sub labels {
-    my @fundlabels =
-        qw/symbol method source name currency isin date isodate price last/;
-    my @stocklabels =
-        qw/symbol method source currency isin date isodate price open close
-           high low p_change last/;
-    my @alllabels = ( @stocklabels, "name" );
-    return ( hufund  => \@fundlabels,
-             bamosz  => \@fundlabels,
-             hustock => \@stocklabels,
-             bse     => \@stocklabels,
-             bet     => \@stocklabels,
-             hu      => \@alllabels,
-             hungary => \@alllabels
-    );
-}
-
-sub hu {
-    my $quoter  = shift;
-    my @symbols = @_;
-    my %info;
-
-    for my $symbol (@symbols) {
-        my %bse_info = bse( $quoter, $symbol );
-        if ( $bse_info{ $symbol, "success" } ) {
-            %info = ( %info, %bse_info );
-            next;
-        }
-
-        my %bamosz_info = bamosz( $quoter, $symbol );
-        if ( $bamosz_info{ $symbol, "success" } ) {
-            %info = ( %info, %bamosz_info );
-            next;
-        }
-
-        $info{ $symbol, "success" }  = 0;
-        $info{ $symbol, "errormsg" } = "Fetch from bse or bamosz failed";
-    }
-
-    return wantarray() ? %info : \%info;
-}
-
-sub bse {
-    my $quoter  = shift;
-    my @symbols = @_;
-    my %info;
-
-    my $ua = $quoter->user_agent;
-
-    for my $symbol (@symbols) {
-        $info{ $symbol, "method" }  = "bse";
-        $info{ $symbol, "source" }  = $BSE_MAINURL;
-        $info{ $symbol, "success" } = 0;
-
-        my $url      = $BSE_URL . $symbol;
-        my $response = $ua->request( GET $url);
-        unless ( $response->is_success ) {
-            $info{ $symbol, "errormsg" } = "Request error";
-            next;
-        }
-
-        my $te =
-            HTML::TableExtract->new( attribs => { class => "InsAdat_table" } );
-        $te->parse( decode_utf8( $response->content ) );
-        unless ( $te->first_table_found ) {
-            $info{ $symbol, "errormsg" } = "No InsAdat_table found";
-            next;
-        }
-
-        my @found;
-    TABLE_LOOP: for my $ts ( $te->tables ) {
-            for my $row ( $ts->rows ) {
-                my @trimmed_row = map { trim($_) } @$row;
-                if ( $symbol eq $trimmed_row[1] || $symbol eq $trimmed_row[2] )
-                {
-                    @found = @trimmed_row;
-                    last TABLE_LOOP;
-                }
-            }
-        }
-        unless (@found) {
-            $info{ $symbol, "errormsg" } = "No ticker or ISIN found";
-            next;
-        }
-
-        # I don't trade stocks, so I am unsure whether the data
-        # extracted here is sensible. Please do improve this if
-        # needed!
-        $info{ $symbol, "symbol" }   = $found[1];
-        $info{ $symbol, "isin" }     = $found[2];
-        $info{ $symbol, "price" }    = hu_decimal( $found[3] );
-        $info{ $symbol, "open" }     = hu_decimal( $found[8] );
-        $info{ $symbol, "close" }    = hu_decimal( $found[9] );
-        $info{ $symbol, "currency" } = $found[10];
-        $info{ $symbol, "low" }      = hu_decimal( $found[13] );
-        $info{ $symbol, "high" }     = hu_decimal( $found[14] );
-        $info{ $symbol, "p_change" } = hu_decimal( $found[16] );
-        $info{ $symbol, "last" }     = hu_decimal( $found[17] );
-        $quoter->store_date( \%info, $symbol, { isodate => $found[18] } );
-
-        $info{ $symbol, "success" } = 1;
-    }
-
-    return wantarray() ? %info : \%info;
-}
-
-sub bamosz {
-    my $quoter  = shift;
-    my @symbols = @_;
-    my %info;
-
-    my $ua = $quoter->user_agent;
-
-    for my $symbol (@symbols) {
-        $info{ $symbol, "method" }  = "bamosz";
-        $info{ $symbol, "source" }  = $BAMOSZ_MAINURL;
-        $info{ $symbol, "success" } = 0;
-
-        my $url      = $BAMOSZ_URL . $symbol;
-        my $response = $ua->request( GET $url);
-        unless ( $response->is_success ) {
-            $info{ $symbol, "errormsg" } = "Request error";
-            next;
-        }
-
-        my $te = HTML::TableExtract->new( attribs => { class => "dataTable" } );
-        $te->parse( decode_utf8( $response->content ) );
-        unless ( $te->first_table_found ) {
-            $info{ $symbol, "errormsg" } = "No dataTable found";
-            next;
-        }
-
-        my $ts = $te->table( 0, 0 );
-        $info{ $symbol, "name" } = $ts->cell( 0, 1 );
-        my $isin = $ts->cell( 2, 1 );
-        $info{ $symbol, "symbol" }   = $isin;
-        $info{ $symbol, "isin" }     = $isin;
-        $info{ $symbol, "currency" } = $ts->cell( 3, 1 );
-        my $price = hu_decimal( $ts->cell( 5, 1 ) );
-        $info{ $symbol, "price" } = $price;
-        $info{ $symbol, "last" }  = $price;
-        my $date = $ts->cell( 6, 1 );
-        $quoter->store_date( \%info, $symbol, { isodate => $date } );
-
-        $info{ $symbol, "success" } = 1;
-    }
-
-    return wantarray() ? %info : \%info;
-}
-
-sub trim {
-    my $s = shift;
-    if ($s) {
-        $s =~ s/^\s+//;
-        $s =~ s/\s+$//;
-        return $s;
-    }
-    else {
-        return '';
-    }
-}
-
-sub hu_decimal {
-    my $s = shift;
-    if ($s) {
-        $s =~ s/[^\d,-]//g;
-        $s =~ s/,/./;
-        return $s;
-    }
-    else {
-        return '';
-    }
-}
-
-1;
-
-=head1 NAME
-
-Finance::Quote::HU - Obtain Hungarian Securities from www.bet.hu
-and www.bamosz.hu
-
-=head1 SYNOPSIS
-
-    use Finance::Quote;
-    $q = Finance::Quote->new;
-    # Don't know anything about failover yet...
-
-=head1 DESCRIPTION
-
-This module obtains information about Hungarian Securities. Share
-fetched from www.bet.hu, while mutual funds retrieved from
-www.bamosz.hu. Stocks may be searched by either ticker or ISIN, while
-mutual funds may only be search be ISIN.
-
-=head1 LABELS RETURNED
-
-Information available may include the following labels:
-
-method source name symbol currency date last price low high open close
-p_change
-
-=head1 SEE ALSO
-
-Budapest Stock Exchange (BET) website - http://www.bet.hu
-BAMOSZ website - http://www.bamosz.hu/
-
-Finance::Quote
-
-=cut
@@ -3,28 +3,25 @@
 # Version 0.1 preliminary version using Cdnfundlibrary.pm v0.4 as an example
 
 package Finance::Quote::IndiaMutual;
-require 5.010;
+require 5.004;
 
 use strict;
 
-use vars qw( $AMFI_URL $AMFI_NAV_LIST $AMFI_MAIN_URL);
+use vars qw($VERSION $AMFI_URL $AMFI_NAV_LIST $AMFI_MAIN_URL);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use HTTP::Status;
 use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '0.1';
 
 # URLs of where to obtain information.
 
-$AMFI_MAIN_URL = ("http://www.amfiindia.com/");
-$AMFI_URL = ("http://portal.amfiindia.com/NAVReport.aspx?type=0");
-#$AMFI_URL = ("http://portal.amfiindia.com/spages/NAV0.txt"); #This page seems to do the job also. Keep for reference
-
-# amfinavlist.txt is a cache-file. keep it until updated on the website since this is a 1meg file.
-my $cachedir = $ENV{TMPDIR} // $ENV{TEMP} // '/tmp/';
-$AMFI_NAV_LIST = $cachedir."amfinavlist.txt";
+#$AMFI_MAIN_URL = ("http://localhost/");
+$AMFI_MAIN_URL = ("http://amfiindia.com/");
+$AMFI_URL = ("${AMFI_MAIN_URL}downloadnavopen.asp");
+$AMFI_NAV_LIST = "/tmp/amfinavlist.txt";
 
 sub methods { return (indiamutual => \&amfiindia,
 		      amfiindia => \&amfiindia); }
@@ -41,8 +38,8 @@ sub methods { return (indiamutual => \&amfiindia,
 sub amfiindia   {
     my $quoter = shift;
     my @symbols = @_;
-
-    # Make sure symbols are requested
+    
+    # Make sure symbols are requested  
     ##CAN exit more gracefully - add later##
 
     return unless @symbols;
@@ -69,42 +66,35 @@ sub amfiindia   {
 
     open NAV, $AMFI_NAV_LIST or die "Unexpected error in opening file: $!\n";
 
-    #Scheme Code;ISIN Div Payout/ ISIN Growth;ISIN Div Reinvestment;Scheme Name;Net Asset Value;Repurchase Price;Sale Price;Date
+    # Scheme Code;Scheme Name;Net Asset Value;Repurchase Price;Sale Price;Date
     while (<NAV>) {
 	next if !/\;/;
 	chomp;
 	s/\r//;
-        my ($symbol1, $symbol2, $symbol3, @data) = split /\s*\;\s*/;
-	$allquotes{$symbol1} = \@data;
-	if ($symbol2 ne "-") {
-	    $allquotes{$symbol2} = \@data;
-	}
-	if ($symbol3 ne "-") {
-	    $allquotes{$symbol3} = \@data;
-	}
+	my ($symbol, @data) = split /\;/;
+	$allquotes{$symbol} = \@data;
     }
     close(NAV);
 
     foreach my $symbol (@symbols) {
-        $fundquote{$symbol, "symbol"} = $symbol;
-        $fundquote{$symbol, "currency"} = "INR";
+	$fundquote{$symbol, "currency"} = "INR";
 	$fundquote{$symbol, "source"} = $AMFI_MAIN_URL;
 	$fundquote{$symbol, "link"} = $url;
 	$fundquote{$symbol, "method"} = "amfitable";
 
 	my $data = $allquotes{$symbol};
 	if ($data) {
-            $fundquote{$symbol, "name"} = $data->[0];
-            $fundquote{$symbol, "nav"} = $data->[1];
-            $fundquote{$symbol, "rprice"} = $data->[2];
-            $fundquote{$symbol, "sprice"} = $data->[3];
-            $quoter->store_date(\%fundquote, $symbol, {eurodate => $data->[4]});
-            $fundquote{$symbol, "success"} = 1;
+	    $fundquote{$symbol, "name"} = $data->[0];
+	    $fundquote{$symbol, "nav"} = $data->[1];
+	    $fundquote{$symbol, "rprice"} = $data->[2];
+	    $fundquote{$symbol, "sprice"} = $data->[3];
+	    $quoter->store_date(\%fundquote, $symbol, {eurodate => $data->[4]});
+	    $fundquote{$symbol, "success"} = 1;
 	} else {
 	    $fundquote{$symbol, "success"} = 0;
 	    $fundquote{$symbol, "errormsg"} = "Fund not found";
 	}
-    }
+    } 
 
     return wantarray ? %fundquote : \%fundquote;
 }
@@ -130,17 +120,19 @@ module only.
 
 =head1 DESCRIPTION
 
-This module obtains information about Indian Mutual Fund prices from the
+This module obtains information about Indian Mutual Fund prices from the 
 Association of Mutual Funds India website amfiindia.com.
 The information source "indiamutual" can be used
 if the source of prices is irrelevant, and "amfiindia" if you
 specifically want to use information downloaded from amfiindia.com.
 
-=head1 AMFIINDIA-CODE/ISIN
+=head1 AMFIINDIA-CODE
+
+In India a mutual fund does not have a unique global symbol identifier.
 
-In India, not all funds have an ISIN. However, they do have a scheme code.
-You can use those if you can't find the ISIN. See AMFI site for details.
-http://www.amfiindia.com/nav-history-download
+This module uses an id that represents the mutual fund on an id used by
+amfiindia.com.  You can the fund is from the AMFI web site 
+http://amfiindia.com/downloadnavopen.asp.
 
 =head1 LABELS RETURNED
 
@@ -151,14 +143,17 @@ label will be a url location for the NAV list table for all funds.
 
 =head1 NOTES
 
-AMFI provides a link to download a text file containing all the
-NAVs. This file is mirrored in a local file /tmp/amfinavlist.txt. The local
-mirror serves only as a cache and can be safely removed.
+amfiindia.com provides a link to download a text file containing all the 
+NAVs. This file is mirrored in a local file /tmp/amfinavlist.txt. The local 
+mirror serves only as a cache and can be safely removed. 
+
+Currently NAVs of Open-Ended funds are supported. 
 
 =head1 SEE ALSO
 
-AMFI india website - http://www.amfiindia.com/
+AMFI india website - http://amfiindia.com/
 
 Finance::Quote
 
 =cut
+
@@ -3,7 +3,7 @@
 #    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
 #    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
 #    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
+#    Copyright (C) 2000, Paul Fenwick <pjf@Acpan.org>
 #    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
 #    Copyright (C) 2001, Rob Sessink <rob_ses@users.sourceforge.net>
 #    Copyright (C) 2005, Morten Cools <morten@cools.no>
@@ -35,24 +35,24 @@ use strict;
 
 package Finance::Quote::LeRevenu;
 
-use vars qw( $LR_URL);
+use vars qw($VERSION $LR_URL);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION='1.3';
 
 my $LR_URL = 'http://bourse.lerevenu.com/recherchenom.hts';
 
 
 sub methods { return ( france => \&lerevenu,
 			lerevenu => \&lerevenu); }
-{
+{ 
 	my @labels = qw/name last date isodate p_change open high low close volume currency method exchange/;
 
 	sub labels { return (france => \@labels,
-			     lerevenu => \@labels); }
+			     lerevenu => \@labels); } 
 }
 
 sub lerevenu {
@@ -65,10 +65,10 @@ sub lerevenu {
 	foreach my $stocks (@stocks)
 	{
 		$url="$LR_URL?recherchenom=$stocks&p=20";
+	
+		$reply = $ua->request(GET $url);  
 
-		$reply = $ua->request(GET $url);
-
-		if ($reply->is_success)
+		if ($reply->is_success) 
 		{
 			# print STDERR $reply->content,"\n";
 
@@ -113,11 +113,11 @@ sub lerevenu {
 					foreach $ts ($te->table_state(5, 0)){
 						@rows=$ts->rows;
 						$info{$stocks, "name"}=$rows[0][0];
-						}
+						} 
 					foreach $ts ($te->table_state(8, 1)){
 						@rows=$ts->rows;
 						foreach $row ($ts->rows) {
-						ASSIGN:	for ( @$row[0] ) {
+						ASSIGN:	for ( @$row[0] ) {  
 								/Dernier/ && do {
 									($info{$stocks, "last"}=@$row[1]) =~ s/[^0-9.-]*//g;
 									($info{$stocks, "close"}=@$row[2]) =~ s/[^0-9.-]*//g;
@@ -157,7 +157,7 @@ sub lerevenu {
 					foreach $ts ($te->table_state(6, 5)){
 						@rows=$ts->rows;
 						foreach $row ($ts->rows) {
-						ASSIGN:	for ( @$row[0] ){
+						ASSIGN:	for ( @$row[0] ){  
 								/Isin/ && do {
 									# GnuCash
 									$info{$stocks, "symbol"}=@$row[1];
@@ -166,14 +166,14 @@ sub lerevenu {
 							}
 					    }
 					}
-					last SWITCH;
+					last SWITCH; 
 				};
 				# style=bond
 			       	/Obligations/ && do {
 					foreach $ts ($te->table_state(5, 0)){
 						@rows=$ts->rows;
 						$info{$stocks, "name"}=$rows[0][0];
-						}
+						}  
 					foreach $ts ($te->table_state(8, 0)){
 						@rows=$ts->rows;
 						foreach $row ($ts->rows) {
@@ -219,7 +219,7 @@ sub lerevenu {
 					foreach $ts ($te->table_state(8, 3)){
 						@rows=$ts->rows;
 						foreach $row ($ts->rows) {
-						ASSIGN:	for ( @$row[0] ){
+						ASSIGN:	for ( @$row[0] ){ 
 								/Isin/ && do {
 									# GnuCash
 									$info{$stocks, "symbol"}=@$row[1];
@@ -228,7 +228,7 @@ sub lerevenu {
 							}
 						}
 					}
-					last SWITCH;
+					last SWITCH; 
 				};
 				# style=fund
 			        /SICAVetFCP/ && do {
@@ -249,7 +249,7 @@ sub lerevenu {
 					foreach $ts ($te->table_state(9, 7)){
 						@rows=$ts->rows;
 						foreach $row ($ts->rows) {
-						ASSIGN:	for ( @$row[0] ){
+						ASSIGN:	for ( @$row[0] ){  
 								/Actif/ && do {
 									my $nav;
 									$nav=@$row[1];
@@ -263,7 +263,7 @@ sub lerevenu {
 					foreach $ts ($te->table_state(9, 9)){
 						@rows=$ts->rows;
 						foreach $row ($ts->rows) {
-						ASSIGN:	for ( @$row[0] ){
+						ASSIGN:	for ( @$row[0] ){  
 								/ISIN/ && do {
 									# GnuCash
 									($info{$stocks, "symbol"}=@$row[1]) =~ s/\s*//g;
@@ -272,18 +272,18 @@ sub lerevenu {
 							}
 						}
 					}
-					last SWITCH;
+					last SWITCH; 
 				};
 				# style=warrant
-				/Bons&Warrants/ && do {
+				/Bons&Warrants/ && do { 
 					foreach $ts ($te->table_state(5, 0)){
 						@rows=$ts->rows;
 						$info{$stocks, "name"}=$rows[0][0];
-						}
+						}  
  					foreach $ts ($te->table_state(7, 1)){
 						@rows=$ts->rows;
 						foreach $row ($ts->rows) {
-						ASSIGN:	for ( @$row[0] ){
+						ASSIGN:	for ( @$row[0] ){  
 								/Dernier/ && do {
 									($info{$stocks, "last"}=@$row[1]) =~ s/[^0-9.-]*//g;
 									($info{$stocks, "close"}=@$row[1]) =~ s/[^0-9.-]*//g;
@@ -322,7 +322,7 @@ sub lerevenu {
 					foreach $ts ($te->table_state(6, 8)){
 						@rows=$ts->rows;
 						foreach $row ($ts->rows) {
-						ASSIGN:	for ( @$row[0] ){
+						ASSIGN:	for ( @$row[0] ){  
 								/Isin/ && do {
 									# GnuCash
 									$info{$stocks, "symbol"}=@$row[1];
@@ -333,18 +333,18 @@ sub lerevenu {
 
 					    }
 					}
-					last SWITCH;
+					last SWITCH; 
 				};
 				# style=indice
-			        /Indices/ && do {
+			        /Indices/ && do {  
 					foreach $ts ($te->table_state(5, 0)){
 						@rows=$ts->rows;
 						$info{$stocks, "name"}=$rows[0][0];
-						}
+						}  
 					foreach $ts ($te->table_state(7, 1)){
 						@rows=$ts->rows;
 						foreach $row ($ts->rows) {
-						ASSIGN:	for ( @$row[0] ){
+						ASSIGN:	for ( @$row[0] ){  
 								/Dernier/ && do {
 									($info{$stocks, "last"}=@$row[1]) =~ s/[^0-9.-]*//g;
 									($info{$stocks, "close"}=@$row[1]) =~ s/[^0-9.-]*//g;
@@ -379,7 +379,7 @@ sub lerevenu {
 					foreach $ts ($te->table_state(7, 2)){
 						@rows=$ts->rows;
 						foreach $row ($ts->rows) {
-						ASSIGN:	for ( @$row[0] ){
+						ASSIGN:	for ( @$row[0] ){  
 								/Isin/ && do {
 									# GnuCash
 									$info{$stocks, "symbol"}=@$row[1];
@@ -389,7 +389,7 @@ sub lerevenu {
 						}
 					    }
 					}
-					last SWITCH;
+					last SWITCH; 
 				};
 			        {
 					$info {$stocks,"success"} = 0;
@@ -398,12 +398,12 @@ sub lerevenu {
 			}
 
 
-		}
+		} 
 		else {
      			$info{$stocks, "success"}=0;
 			$info{$stocks, "errormsg"}="Error retreiving $stocks ";
    		}
- 	}
+ 	} 
  	return wantarray() ? %info : \%info;
  	return \%info;
 }
@@ -420,14 +420,14 @@ Finance::Quote::LeRevenu Obtain quotes from http://bourse.lerevenu.com.
     $q = Finance::Quote->new;
 
     %info = Finance::Quote->fetch("LeRevenu","FR0000031122");  # Only query LeRevenu
-    %info = Finance::Quote->fetch("france","ml"); # Failover to other sources OK.
+    %info = Finance::Quote->fetch("france","ml"); # Failover to other sources OK. 
 
 =head1 DESCRIPTION
 
 This module fetches information from the "Paris Stock Exchange",
-http://bourse.lerevenu.com. All stocks are available.
+http://bourse.lerevenu.com. All stocks are available. 
 
-This module is loaded by default on a Finance::Quote object. It's
+This module is loaded by default on a Finance::Quote object. It's 
 also possible to load it explicity by placing "LeRevenu" in the argument
 list to Finance::Quote->new().
 
@@ -435,14 +435,14 @@ This module provides both the "lerevenu" and "france" fetch methods.
 Please use the "france" fetch method if you wish to have failover
 with future sources for French stocks. Using the "lerevenur" method
 will guarantee that your information only comes from the Paris Stock Exchange.
-
-Information obtained by this module may be covered by http://bourse.lerevenu.com
+ 
+Information obtained by this module may be covered by http://bourse.lerevenu.com 
 terms and conditions See http://bourse.lerevenu.com for details.
 
 =head1 LABELS RETURNED
 
 The following labels may be returned by Finance::Quote::LeRevenu :
-name, last, date, p_change, open, high, low, close,
+name, last, date, p_change, open, high, low, close, 
 volume, currency, method, exchange.
 
 =head1 SEE ALSO
@@ -450,3 +450,5 @@ volume, currency, method, exchange.
 Le Revenu, http://bourse.lerevenu.com
 
 =cut
+
+	
@@ -1,313 +0,0 @@
-#!/usr/bin/perl -w
-
-#  MStaruk.pm
-#
-#  Obtains quotes for UK Unit Trusts from http://morningstar.co.uk/ - please
-#  refer to the end of this file for further information.
-#
-#  author: Martin Sadler (martinsadler@users.sourceforge.net)
-#
-#  version: 0.1 Initial version - 01 April 2013
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-#    02111-1307, USA
-#
-
-
-package Finance::Quote::MStaruk;
-require 5.005;
-
-use strict;
-use warnings;
-
-# URLs
-use vars qw($VERSION $MSTARUK_NEXT_URL $MSTARUK_LOOK_UP $MSTARUK_MAIN_URL);
-
-use LWP::Simple;
-use LWP::UserAgent;
-use HTTP::Request::Common;
-use HTTP::Cookies;
-
-our $VERSION = '1.37'; # VERSION
-
-$MSTARUK_MAIN_URL   =   "http://www.morningstar.co.uk";
-$MSTARUK_LOOK_UP    =   "http://www.morningstar.co.uk/uk/funds/SecuritySearchResults.aspx?search=";
-$MSTARUK_NEXT_URL	=	"http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=";
-
-# FIXME -
-
-sub methods { return (mstaruk => \&mstaruk_fund,
-		      			ukfunds => \&mstaruk_fund); }
-
-{
-    my @labels = qw/name currency last date time price nav source iso_date method net p_change success errormsg/;
-
-    sub labels { return (mstaruk => \@labels,
-			 				ukfunds => \@labels); }
-}
-
-#
-# =======================================================================
-
-sub mstaruk_fund  {
-    my $quoter = shift;
-    my @symbols = @_;
-
-    return unless @symbols;
-
-    my %fundquote;
-
-    my $ua = $quoter->user_agent;
-    my $cj = HTTP::Cookies->new();
-    $ua->cookie_jar( $cj );
-
-    foreach (@symbols)
-    {
-	    my $code = $_;
-
-	    my $code_type = "** Invalid **";
-	    if ($code =~ m/^[a-zA-Z]{2}[a-zA-Z0-9]{9}\d(.*)/ && !$1) { $code_type = "ISIN";  }
-	    elsif ($code =~ m/^[a-zA-Z0-9]{6}\d(.*)/ && !$1 )        { $code_type = "SEDOL"; }
-	    elsif ($code =~ m/^[a-zA-Z]{4,6}(.*)/ && !$1)            { $code_type = "MEXID"; }
-
-# current version can only use ISIN - report an error and exit if any other type
-
-        if ($code_type ne "ISIN")
-        {
-		    $fundquote {$code,"success"} = 0;
-		    $fundquote {$code,"errormsg"} = "Error - invalid symbol";
-		    next;
-        }
-
-	    $fundquote {$code,"success"} = 1; # ever the optimist....
-	    $fundquote {$code,"errormsg"} = "Success";
-
-# perform the look-up - if not found, return with error
-
-        my $webdoc  = get($MSTARUK_LOOK_UP.$code);
-        if (!$webdoc)
-        {
-	        # serious error, report it and give up
-		    $fundquote {$code,"success"} = 0;
-		    $fundquote {$code,"errormsg"} =
-		        "Error - failed to retrieve fund data";
-		    next;
-	    }
-	    $fundquote {$code, "symbol"} = $code;
-	    $fundquote {$code, "source"} = $MSTARUK_MAIN_URL;
-
-# Find name by regexp
-
-        my ($name, $nexturl, $isin);
- 		if ($webdoc =~
-        m[<td class="msDataText searchLink"><a href="(.*?)">(.*?)</a></td><td class="msDataText searchIsin"><span>[a-zA-Z]{2}[a-zA-Z0-9]{9}\d(.*)</span></td>] )
-        {
-            $nexturl = $1;
-            $name = $2;
-            $isin = $3;
-        }
-
-		if (!defined($name)) {
-			# not a serious error - don't report it ....
-#			$fundquote {$code,"success"} = 0;
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find fund name";
-			$name = "*** UNKNOWN ***";
-			# ... and continue
-		}
-		$fundquote {$code, "name"} = $name;	# set name
-
-		if (!defined($nexturl)) {
-	        # serious error, report it and give up
-		    $fundquote {$code,"success"} = 0;
-		    $fundquote {$code,"errormsg"} =
-		        "Error - failed to retrieve fund data";
-		    next;
-		}
-
-# modify $nexturl to remove html escape encoding for the Ampersand (&) character
-
-		$nexturl =~ s/&amp;/&/;
-
-# Now need to look-up next page using $next_url
-
-        $webdoc  = get($MSTARUK_MAIN_URL.$nexturl);
-        if (!$webdoc)
-        {
-	        # serious error, report it and give up
-		    $fundquote {$code,"success"} = 0;
-		    $fundquote {$code,"errormsg"} =
-		        "Error - failed to retrieve fund data";
-		    next;
-	    }
-
-# Find date, currency and price all in one table row
-
-		my ($currency, $date, $price, $pchange);
-		if ($webdoc =~
-		m[<td class="line heading">ISIN</td>.*<span class="heading"><br />([0-9]{2}/[0-9]{2}/[0-9]{4})</span>.*([A-Z]{3}).([0-9\.]+).*>([0-9\.\-]+)] )
-        {
-
-            $date = $1;
-            $currency = $2;
-            $price = $3;
-            $pchange = $4;
-        }
-
-		if (!defined($pchange)) {
-			# not a serious error - don't report it ....
-#			$fundquote {$code,"success"} = 0;
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find net or %-age change";
-			# set to (minus)zero
-            $pchange = -0.00;
-			# ... and continue
-		}
-		$fundquote {$code, "p_change"} = $pchange;	# set %-change
-
-		if (!defined($date)) {
-			# not a serious error - don't report it ....
-#			$fundquote {$code,"success"} = 0;
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find a date";
-			# use today's date
-            $quoter->store_date(\%fundquote, $code, {today => 1});
-			# ... and continue
-		}
-		else
-		{
-		    $quoter->store_date(\%fundquote, $code, {eurodate => $date});
-		}
-
-		if (!defined($price)) {
-	    	# serious error, report it and give up
-			$fundquote {$code,"success"} = 0;
-			$fundquote {$code,"errormsg"} = "Error - failed to find a price";
-			next;
-		}
-
-		if (!defined($currency)) {
-	    	# serious error, report it and give up
-			$fundquote {$code,"success"} = 0;
-			$fundquote {$code,"errormsg"} = "Error - failed to find a currency";
-			next;
-		}
-
-		# defer setting currency and price until we've dealt with possible GBX currency...
-
-# Calculate net change - it's not included in the morningstar factsheets
-
-		my $net = ($price * $pchange) / 100 ;
-
-# deal with GBX pricing of UK unit trusts
-
-		if ($currency eq "GBX")
-		{
-			$currency = "GBP" ;
-			$price = $price / 100 ;
-            $net   = $net   / 100 ;
-		}
-
-		# now set prices and currency
-
-		$fundquote {$code, "price"} = $price;
-		$fundquote {$code, "last"} = $price;
-		$fundquote {$code, "nav"} = $price;
-		$fundquote {$code, "net"} = $net;
-		$fundquote {$code, "currency"} = $currency;
-
-# Set a dummy time as gnucash insists on having a valid format
-
-		my $time = "12:00";     # set to Midday if no time supplied ???
-                                # gnucash insists on having a valid-format
-
-		$fundquote {$code, "time"} = $time; # set time
-
-		$fundquote {$code, "method"} = "mstaruk";   # set method
-
-	}
-
-	return wantarray ? %fundquote : \%fundquote;
-}
-
-1;
-
-=head1 NAME
-
-Finance::Quote::mstaruk - Obtain UK Unit Trust quotes from morningstar.co.uk.
-
-=head1 SYNOPSIS
-
-    $q = Finance::Quote->new;
-
-    %info = Finance::Quote->fetch("mstaruk","<isin> ...");  # Only query morningstar.co.uk using ISINs
-    %info = Finance::Quote->fetch("ukfunds","<isin> ...");  # Failover to other sources
-
-=head1 DESCRIPTION
-
-This module fetches information from the MorningStar Funds service,
-http://morningstar.com/uk/. There are many UK Unit Trusts and OEICs quoted,
-as well as many Offshore Funds and Exhange Traded Funds (ETFs). It converts
-any funds quoted in GBX (pence) to GBP, dividing the price by 100 in the
-process.
-
-Funds are identified by their ISIN code.
-
-This module is loaded by default on a Finance::Quote object. It's
-also possible to load it explicity by placing "mstaruk" in the argument
-list to Finance::Quote->new().
-
-Information obtained by this module may be covered by funds.ft.com
-terms and conditions See http://morningstar.co.ukfor details.
-
-=head2 Stocks And Indices
-
-This module provides both the "mstaruk" and "ukfunds" fetch methods for
-fetching UK and Offshore Unit Trusts and OEICs prices and other information
-from funds.ft.com. Please use the "ukfunds" fetch method if you wish to have
-failover with future sources for UK and Offshore Unit Trusts and OEICs - the
-author has plans to develop Finance::Quote modules for other source providing
-unit trust prices. Using the "mstaruk" method will guarantee
-that your information only comes from the morningstar.co.uk website.
-
-=head1 LABELS RETURNED
-
-The following labels may be returned by Finance::Quote::mstaruk :
-
-    name, currency, last, date, time, price, nav, source, method,
-    iso_date, net, p_change, success, errormsg.
-
-
-=head1 SEE ALSO
-
-Morning Star websites, http://morningstar.co.uk
-
-
-=head1 AUTHOR
-
-Martin Sadler, E<lt>martinsadler@users.sourceforge.netE<gt>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright (C) 2010 by Martin Sadler
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself, either Perl version 5.10.1 or,
-at your option, any later version of Perl 5 you may have available.
-
-
-=cut
-
-__END__
@@ -3,7 +3,7 @@
 #    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
 #    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
 #    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
+#    Copyright (C) 2000, Paul Fenwick <pjf@Acpan.org>
 #    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
 #    Copyright (C) 2001, Leigh Wedding <leigh.wedding@telstra.com>
 #    Copyright (C) 2003, Ian Dall <ian@beware.dropbear.id.au>
@@ -39,9 +39,9 @@ use HTTP::Request::Common;
 use LWP::UserAgent;
 use HTML::TableExtract;
 
-use vars qw/$MANINV_URL /;
+use vars qw/$MANINV_URL $VERSION/;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = "0.1";
 
 $MANINV_URL = 'http://www.maninvestments.com.au/index.cfm?action=productprices&cat_id=5';
 $MANINV_URL = 'http://www.maninvestments.com.au/netassetvalues-print.cfm';
@@ -136,7 +136,7 @@ sub maninv {
 		       'OM-IP Strategic Ltd' => 'OMIPS',
 		       'OM-IP Strategic Series 2 Ltd' => 'OMIPS2S',
 		       'OM-IP Hedge Plus Ltd' => 'OMIPHP');
-
+	    
 
 	    # Delete spaces and '*' which sometimes appears after the code.
 	    # Also delete high bit characters.
@@ -147,7 +147,7 @@ sub maninv {
 	    $info{$stock, "currency"} = @$row[1];
 	    $quoter->store_date(\%info, $stock, {eurodate => @$row[3]});
 	    $info{$stock,'nav'} = @$row[4];
-	    $info{$stock,'nav'} =~ tr/ $\000-\037\200-\377//d;
+	    $info{$stock,'nav'} =~ tr/ $\000-\037\200-\377//d; 
 	    $info{$stock,'last'} = $info{$stock,'nav'};
 	    $info{$stock, "method"} = "maninv";
 	    $info{$stock, "exchange"} = "Man Investments Australia";
@@ -1,118 +0,0 @@
-package Finance::Quote::Morningstar;
-require 5.004;
-
-use strict;
-
-use vars qw( $MORNINGSTAR_SE_FUNDS_URL);
-
-use LWP::UserAgent;
-use HTTP::Request::Common;
-use HTML::TableExtract;
-
-our $VERSION = '1.37'; # VERSION
-$MORNINGSTAR_SE_FUNDS_URL = 'http://morningstar.se/funds/overview.asp?cid=';
-
-sub methods { return (morningstar => \&morningstar); }
-
-{
-  my @labels = qw/date isodate method source name currency price/;
-
-  sub labels { return (morningstar => \@labels); }
-}
-
-sub morningstar {
-  my $quoter  = shift;
-  my @symbols = @_;
-
-  return unless @symbols;
-  my ($ua, $reply, $url, %funds, $te, $table, $row, @value_currency, $name);
-
-  foreach my $symbol (@symbols) {
-    $name = $symbol;
-    $url = $MORNINGSTAR_SE_FUNDS_URL;
-    $url = $url . $name;
-    $ua    = $quoter->user_agent;
-    $reply = $ua->request(GET $url);
-    unless ($reply->is_success) {
-	  foreach my $symbol (@symbols) {
-        $funds{$symbol, "success"}  = 0;
-        $funds{$symbol, "errormsg"} = "HTTP failure";
-	  }
-	  return wantarray ? %funds : \%funds;
-    }
-
-    $te = new HTML::TableExtract();
-    $te->parse($reply->content);
-    #print "Tables: " . $te->tables_report() . "\n";
-    my $counter = 0;
-    my $dateset = 0;
-    for my $table ($te->tables()) {
-	  for my $row ($table->rows()) {
-        if (defined(@$row[0])) {
-		  if ('Senaste NAV' eq substr(@$row[0],0,11)) {
-            @value_currency = split(/ /, $$row[2]);
-            $funds{$name, 'method'}   = 'morningstar_funds';
-            $funds{$name, 'price'}    = $value_currency[0];
-            $funds{$name, 'currency'} = $value_currency[1];
-            $funds{$name, 'success'}  = 1;
-            $funds{$name, 'symbol'}  = $name;
-            $funds{$name, 'source'}   = 'Finance::Quote::Morningstar';
-            $funds{$name, 'name'}   = $name;
-            $funds{$name, 'p_change'} = "";  # p_change is not retrieved (yet?)
-		  }
-		  if ($counter == 7 && $dateset == 0) {
-            my $date = substr($$row[1],0,10);
-            $quoter->store_date(\%funds, $name, {isodate => $date});
-            $dateset = 1;
-		  }
-        }
-	  }
-	  $counter++;
-    }
-
-    # Check for undefined symbols
-    foreach my $symbol (@symbols) {
-	  unless ($funds{$symbol, 'success'}) {
-        $funds{$symbol, "success"}  = 0;
-        $funds{$symbol, "errormsg"} = "Fund name not found";
-	  }
-    }
-  }
-  return %funds if wantarray;
-  return \%funds;
-}
-
-1;
-
-=head1 NAME
-
-Finance::Quote::Morningstar - Obtain fund prices the Fredrik way
-
-=head1 SYNOPSIS
-
-    use Finance::Quote;
-
-    $q = Finance::Quote->new;
-
-    %fundinfo = $q->fetch("morningstar","fund name");
-
-=head1 DESCRIPTION
-
-This module obtains information about Fredrik fund prices from
-www.morningstar.se.
-
-=head1 FUND NAMES
-
-Use some smart fund name...
-
-=head1 LABELS RETURNED
-
-Information available from Fredrik funds may include the following labels:
-date method source name currency price. The prices are updated at the
-end of each bank day.
-
-=head1 SEE ALSO
-
-Perhaps morningstar?
-
-=cut
@@ -1,202 +0,0 @@
-#
-# Copyright (C) 2012, Christopher Hill
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-#
-# $Id: $
-#
-
-package Finance::Quote::MorningstarJP;
-require 5.006;
-
-use strict;
-use warnings;
-use base 'Exporter';
-use DateTime;
-
-use vars qw( $MORNINGSTAR_JP_URL);
-
-our @EXPORT_OK = qw(morningstarjp methods labels);
-our $VERSION = '1.37'; # VERSION
-
-# NAV information (basis price)
-$MORNINGSTAR_JP_URL =
-  ('http://www.morningstar.co.jp/FundData/DownloadStdYmd.do?fnc=');
-
-sub methods { return ( morningstarjp => \&morningstarjp ); }
-sub labels  { return ( morningstarjp => [qw/symbol date nav/] ); }
-
-sub morningstarjp
-{
-  my @symbols = @_;
-  my $quoter  = shift;
-
-  my (
-       $ua,    $response, %info,   $date,    $nav,   $year,
-       $month, $day,      $fmyear, $fmmonth, $fmday, @data
-  );
-
-  $ua = $quoter->user_agent;
-
-  # calculate beginning and end date
-  # Starting from 10 days prior (to cover any recent holiday gaps)
-
-  my $calcDay = DateTime->now();
-  $year  = $calcDay->year();
-  $month = $calcDay->month();
-  $day   = $calcDay->day();
-  $calcDay->subtract( days => 10 );
-  $fmyear  = $calcDay->year();
-  $fmmonth = $calcDay->month();
-  $fmday   = $calcDay->day();
-
-# Iterate over each symbol as site only permits query by single security
-  foreach my $symbol (@symbols)
-  {
-    # Query the server via a POST request
-    $response = $ua->post(
-      $MORNINGSTAR_JP_URL . $symbol,
-      [
-        selectStdYearFrom  => $fmyear,
-        selectStdMonthFrom => $fmmonth,
-        selectStdDayFrom   => $fmday,
-        selectStdYearTo    => $year,
-        selectStdMonthTo   => $month,
-        selectStdDayTo     => $day,
-        base => '0'  # 0 is daily, 1 is week ends (Friday), 2 is month ends only
-      ],
-    );
-
-    # Check response, CSV data is in an octet-stream
-    if (    $response->is_success
-         && $response->content_type eq 'application/octet-stream' )
-    {
-
-      # Parse...
-      # First row (in Shift-JIS) is fixed.  It means "date","basis price"
-      #   日付,基準価額
-      # Subsequent rows are in ascending chronological order
-      #   date(yyyymmdd),nav
-      #
-      # Split the data on CRLF or LF boundaries
-      @data = split( '\015?\012', $response->content );
-
-      # We only care about the final row as that has the most recent data
-      ( $date, $nav ) = $quoter->parse_csv( $data[-1] );
-
-      # Store the retrieved data into the hash
-      ( $year, $month, $day ) = ( $date =~ m/(\d{4})(\d{2})(\d{2})/ );
-      $quoter->store_date( \%info, $symbol,
-                           { year => $year, month => $month, day => $day } );
-      $info{ $symbol, 'currency' } = 'JPY';
-      $info{ $symbol, 'method' }   = 'MorningstarJP';
-      $info{ $symbol, 'name' }     = $symbol;
-      $info{ $symbol, 'nav' }      = $nav;
-      $info{ $symbol, 'success' }  = 1;
-      $info{ $symbol, 'symbol' }   = $symbol;
-    } elsif (    $response->is_success
-              && $response->content_type eq 'text/html' )
-    {
-
-      # HTML response that means POST was invalid and/or rejected.
-      $info{ $symbol, 'errormsg' } = 'Invalid search criteria';
-      $info{ $symbol, 'success' }  = 0;
-    } else
-    {
-
-      # Unknown error encountered.
-      $info{ $symbol, 'errormsg' } = 'Search unavailable';
-      $info{ $symbol, 'success' }  = 0;
-    }
-  }
-
-  return wantarray() ? %info : \%info;
-}
-
-1;
-
-__END__
-
-=head1 NAME
-
-Finance::Quote::MorningstarJP - Obtain price data from Morningstar (Japan).
-
-=head1 VERSION
-
-This documentation describes version 1.00 of MorningstarJP.pm, October 13, 2012.
-
-=head1 SYNOPSIS
-
-    use Finance::Quote;
-
-    $q = Finance::Quote->new;
-
-    %info = $q->fetch("morningstarjp", "2009100101");
-
-=head1 DESCRIPTION
-
-This module obtains information from Morningstar (Japan),
-L<http://www.morningstar.co.jp/>.
-
-Information returned by this module is governed by Morningstar
-(Japan)'s terms and conditions.
-
-=head1 FUND SYMBOLS
-
-Use the numeric symbol shown in the URL on the "SnapShot" page
-of the security of interest.
-
-e.g. For L<http://www.morningstar.co.jp/FundData/SnapShot.do?fnc=2009100101>,
-one would supply 2009100101 as the symbol argument on the fetch API call.
-
-=head1 LABELS RETURNED
-
-The following labels may be returned by Finance::Quote::MorningstarJP:
-symbol, date, nav.
-
-=head1 REQUIREMENTS
-
- Perl 5.006
- Date/Calc.pm
- Exporter.pm (included with Perl)
-
-=head1 ACKNOWLEDGEMENTS
-
-Inspired by other modules already present with Finance::Quote
-
-=head1 AUTHOR
-
-Christopher Hill
-
-=head1 LICENSE AND COPYRIGHT
-
-Copyright (C) 2012, Christopher Hill.
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-=head1 DISCLAIMER
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-=head1 SEE ALSO
-
-Morningstar (Japan), L<http://www.morningstar.co.jp/>
-
-=cut
@@ -1,273 +0,0 @@
-# Copyright (C) 2013, Sam Morris <sam@robots.org.uk>
-#
-# This program is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-package Finance::Quote::MtGox;
-
-use strict;
-use warnings;
-use HTTP::Request::Common;
-use JSON;
-use LWP::UserAgent;
-use POSIX;
-use URI::Escape;
-
-require 5.010;
-
-our $VERSION = '1.37'; # VERSION
-
-my @markets =
-    qw/USD EUR JPY CAD GBP CHF RUB AUD SEK DKK HKD PLN CNY SGD THB NZD NOK/;
-my @labels =
-    qw/ask bid currency date exchange last method source success symbol time
-       timezone/;
-
-sub methods {
-    my %result;
-    foreach my $market (@markets) {
-        my $lmarket = lc $market;
-        $result{"mtgox_$lmarket"} =
-            sub { unshift( @_, $market ); goto &mtgox; };
-        $result{"bitcoin_$lmarket"} =
-            sub { unshift( @_, $market ); goto &mtgox; };
-    }
-    return %result;
-}
-
-sub labels {
-    my %result;
-    foreach my $market (@markets) {
-        my $lmarket = lc $market;
-        $result{"mtgox_$lmarket"}   = \@labels;
-        $result{"bitcoin_$lmarket"} = \@labels;
-    }
-    return %result;
-}
-
-sub mtgox {
-    @_ = (@_);
-    my $market = shift // die "Missing market";
-    my $quoter = shift // die "Missing quoter";
-    my @symbols = (@_);
-
-    my %info;
-    foreach my $symbol (@symbols) {
-        if ( exists $info{ $symbol, "symbol" } ) {
-            next;
-        }
-
-        $info{ $symbol, "success" } = 0;
-        $info{ $symbol, "source" }  = "MtGox";
-        $info{ $symbol, "symbol" }  = $symbol;
-
-        if ( length $symbol > 10 ) {
-            $info{ $symbol, "errormsg" } = "Symbol too long";
-            next;
-        }
-
-        my $r =
-            $quoter->user_agent->request(
-               GET sprintf
-                   "https://data.mtgox.com/api/2/%s${market}/money/ticker_fast",
-               uri_escape $symbol);
-        if ( !$r->is_success ) {
-            $info{ $symbol, "errormsg" } = "HTTP failure";
-            next;
-        }
-        elsif ( $r->headers->content_type ne 'application/json' ) {
-            $info{ $symbol, 'errormsg' } = 'API failure: unparseable data';
-        }
-        my $ticker;
-        eval { $ticker = decode_json( $r->decoded_content ); };
-        if ($@) {
-            $info{ $symbol, 'errormsg' } = "API failure: parse error: $@";
-            next;
-        }
-
-        if ( $ticker->{"result"} ne "success" ) {
-            $info{ $symbol, "errormsg" } = "API failure";
-            next;
-        }
-
-        # last_all gives us the last trade in any currency, converted
-        # to the local currency
-        if ( $ticker->{"data"}{"last_all"}{"currency"} eq $market ) {
-            $info{ $symbol, "last" } = $ticker->{"data"}{"last_all"}{"value"};
-        }
-        if ( $ticker->{"data"}{"buy"}{"currency"} eq $market ) {
-            $info{ $symbol, "bid" } = $ticker->{"data"}{"buy"}{"value"};
-        }
-        if ( $ticker->{"data"}{"sell"}{"currency"} eq $market ) {
-            $info{ $symbol, "ask" } = $ticker->{"data"}{"sell"}{"value"};
-        }
-
-        # The ticker data not supply a timestamp. Fetch the latest
-        # trade data and use the date from that instead. To avoid a
-        # time-consuming transfer, only request trades from the last
-        # minute, falling back to requesting more and more, up to 24
-        # hours' worth.
-        foreach my $cutoff ( 60, 60 * 60, 6 * 60 * 60, 24 * 60 * 60 ) {
-            my $url = sprintf(
-                "https://data.mtgox.com/api/2/%s${market}/money/trades/fetch?since=%s",
-                uri_escape($symbol), 1000_000 * ( time - $cutoff ) );
-            my $r2 = $quoter->user_agent->request( GET $url);
-            if (   !$r2->is_success
-                 || $r2->headers->content_type ne 'application/json' )
-            {
-                last;
-            }
-
-            my $trades;
-            eval { $trades = decode_json( $r2->decoded_content ); };
-            last if $@;
-
-            if ( $trades->{"result"} ne "success" ) {
-                last;
-            }
-
-            # If there are no trades, try again. This is the only
-            # time we use next, as opposed to last.
-            my $last = $trades->{"data"}[-1];
-            if ( !$last ) {
-                next;
-            }
-
-            if (    $last->{"item"} ne $symbol
-                 || $last->{"price_currency"} ne $market )
-            {
-                last;
-            }
-
-            $info{ $symbol, "last" } = $last->{"price"};
-            my @ts = gmtime $last->{"date"};
-            $info{ $symbol, "date" } = strftime( "%m/%d/%y", @ts );
-            $info{ $symbol, "time" } = strftime( "%H:%M:%S", @ts );
-            $info{ $symbol, "timezone" } = "UTC";
-            last;
-        }
-
-        if (    $info{ $symbol, "last" }
-             || $info{ $symbol, "buy" }
-             || $info{ $symbol, "sell" } )
-        {
-            $info{ $symbol, "success" }  = 1;
-            $info{ $symbol, "currency" } = $market;
-            $info{ $symbol, "exchange" } = "Mt.Gox";
-            $info{ $symbol, "method" }   = sprintf( "mtgox_%s", lc $market );
-        }
-    }
-    return wantarray() ? %info : \%info;
-}
-
-1;
-
-=head1 NAME
-
-Finance::Quote::MtGox - Obtain information from Mt.Gox
-
-=head1 SYNOPSIS
-
-    use Finance::Quote;
-    $q = Finance::Quote->new;
-
-    %info = Finance::Quote->fetch("mtgox_usd", "BTC");
-    %info = Finance::Quote->fetch("mtgox_eur", "LTC");
-
-=head1 DESCRIPTION
-
-This module fetches information from Mt.Gox. The following symbols are
-currently known:
-
-=over
-
-=item BTC: Bitcoin
-
-=item LTC: Litecoin (market not yet operational)
-
-=item NMC: Namecoin (market not yet operational)
-
-=back
-
-The following methods provide prices directly from Mt.Gox, in each of the
-currency markets that they operate.
-
-=over
-
-=item mtgox_aud: Australian Dollar
-
-=item mtgox_cad: Canadian Dollar
-
-=item mtgox_chf: Swiss Franc
-
-=item mtgox_cny: Yuan Renminbi
-
-=item mtgox_dkk: Danish Krone
-
-=item mtgox_eur: Euro
-
-=item mtgox_gbp: Pound Sterling
-
-=item mtgox_hkd: Hong Kong Dollar
-
-=item mtgox_jpy: Yen
-
-=item mtgox_nok: Norweigan Krone
-
-=item mtgox_nzd: New Zealand Dollar
-
-=item mtgox_pln: Zloty
-
-=item mtgox_rub: Russian Ruble
-
-=item mtgox_sek: Swedish Kronor
-
-=item mtgox_sgd: Singapore Dollar
-
-=item mtgox_thb: Baht
-
-=item mtgox_usd: US Dollar
-
-=back
-
-In addition, "bitcoin_$market" methods are provided in case failover to other
-exchanges is desirable. These methods will return data for other digital
-currencies than Bitcoin; the currency for which data is retrieved is determined
-by the symbol name passed to the method.
-
-Mt.Gox operates a multi-currency market, where all offers across all markets
-are amalgamated into a common pool. Trades between markets are matched using
-the European Central Bank's daily exchange rate, plus a 2.5% fee included in
-the price.
-
-=head1 LABELS RETURNED
-
-=over
-
-=item ask: lowest asking price
-
-=item bid: highest offer price
-
-=item currency: currency of retrieved quote
-
-=item date, time: time of last trade
-
-=item exchange: always 'Mt.Gox'
-
-=item last: last trade price
-
-=item method: fetching method used
-
-=item timezone: always UTC
-
-=back
@@ -1,11 +1,11 @@
 #!/usr/bin/perl -w
 #
-#    Copyright (C) 2004, Michael Curtis
+#    Copyright (C) 2004, Michael Curtis 
 #    Modified from DWS.pm - its copyrights
 #    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
 #    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
 #    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
+#    Copyright (C) 2000, Paul Fenwick <pjf@Acpan.org>
 #    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
 #    Copyright (C) 2000, Volker Stuerzl <volker.stuerzl@gmx.de>
 #
@@ -37,7 +37,9 @@ use strict;
 use LWP::UserAgent;
 use HTTP::Request::Common;
 
-our $VERSION = '1.37'; # VERSION
+use vars qw/$VERSION/; 
+
+$VERSION = '1.00';
 
 sub methods { return (nz => \&nzx, nzx => \&nzx); }
 sub labels {
@@ -3,7 +3,7 @@
 #    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
 #    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
 #    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
+#    Copyright (C) 2000, Paul Fenwick <pjf@Acpan.org>
 #    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
 #    Copyright (C) 2001, Leigh Wedding <leigh.wedding@telstra.com>
 #    Copyright (C) 2003, Ian Dall <ian@beware.dropbear.id.au>
@@ -39,9 +39,9 @@ use HTTP::Request::Common;
 use LWP::UserAgent;
 use HTML::TableExtract;
 
-use vars qw/$PLATINUM_URL /;
+use vars qw/$PLATINUM_URL $VERSION/;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = "0.1";
 
 $PLATINUM_URL = 'http://www.platinum.com.au/Platinum_Trust_Unit_Prices.htm';
 
@@ -101,7 +101,7 @@ sub platinum {
 			   'Platinum Asia Fund' => 'PLA0004AU',
 			   'Platinum International Brands Fund' => 'PLA0100AU',
 			   'Platinum International Technology Fund' => 'PLA0101AU');
-
+			       
 		# Delete spaces and '*' which sometimes appears after the code.
 		# Also delete high bit characters.
 		$name =~ tr/ \000-\037\200-\377/ /s;
@@ -115,10 +115,10 @@ sub platinum {
 		foreach my $label (qw/date ask bid/) {
 			$info{$stock,$label} = shift(@$row);
 			# Again, get rid of nasty high-bit characters.
-			$info{$stock,$label} =~ tr/ \200-\377//d
+			$info{$stock,$label} =~ tr/ \200-\377//d 
 				unless ($label eq "name");
 		}
-
+		
 		$info{$stock,'last'} = $info{$stock,'bid'};
 
 		$quoter->store_date(\%info, $stock, {eurodate => $info{$stock,'date'}});
@@ -29,20 +29,19 @@ require 5.004;
 
 use strict;
 
-use vars qw( $SEB_FUNDS_URL);
+use vars qw($VERSION $SEB_FUNDS_URL);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
-use utf8;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.0';
 $SEB_FUNDS_URL = 'http://taz.vv.sebank.se/cgi-bin/pts3/pow/fmk/2100/Senaste_fondkurserna.TXT';
 
 sub methods { return (seb_funds => \&seb_funds); }
 
 {
   my @labels = qw/date isodate method source name currency price/;
-
+	
   sub labels { return (seb_funds => \@labels); }
 }
 
@@ -69,7 +68,6 @@ sub seb_funds {
     # Format:
     # 2003-08-11;SEB Aktiesparfond;5,605;387
     my ($date, $name, $price, $hmm) = split ';', $line;
-    utf8::encode($name);
     if (grep {$_ eq $name} @symbols) {
       $price =~ s/,/\./; # change decimal point from , to .
       $funds{$name, 'symbol'}   = $name;
@@ -1,66 +0,0 @@
-# SIX Swiss Exchange - Funds
-# (c) 2011 Stephan Walter <stephan@walter.name>
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-
-package Finance::Quote::SIXfunds;
-
-use HTTP::Request::Common;
-
-our $VERSION = '1.37'; # VERSION
-
-my $url = 'http://www.six-swiss-exchange.com/funds/security_info_en.html?id=';
-
-sub methods { return ( sixfunds => \&sixfunds ); }
-
-sub labels {
-    return ( sixfunds => [qw/name date time price last currency p_change/] );
-}
-
-sub sixfunds {
-    my $quoter  = shift;
-    my @symbols = @_;
-    return unless @symbols;
-    my ( $ua, $reply, %q );
-
-    foreach my $symbol (@symbols) {
-        $ua = $quoter->user_agent;
-        $q{ $symbol, 'success' } = 0;
-        $q{ $symbol, 'name' }    = $symbol;
-        $q{ $symbol, 'symbol' }  = $symbol;
-        $reply = $ua->request( GET( $url . $symbol ) );
-        if ( !$reply->is_success ) {
-            $q{ $symbol, 'errormsg' } = 'HTTP failure';
-        }
-        else {
-            if ( $reply->content
-                =~ />([A-Z]{3})&nbsp;<\/td><td.+?id="mop_ClosingPrice".+?>([0-9.]+)<\/td>/
-                )
-            {
-                $q{ $symbol, 'currency' } = $1;
-                $q{ $symbol, 'last' }     = $2;
-                $q{ $symbol, 'success' }  = 1;
-            }
-            if ( $reply->content
-                =~ /<td.+?id="mop_LastDate".+?>([0-3][0-9]\.[01][0-9]\.[0-9]{4})<\/td>/
-                )
-            {
-                $quoter->store_date( \%q, $symbol, { eurodate => $1 } );
-            }
-            if ( $reply->content
-                =~ /<td.+?id="mop_LastTime".+?>([0-2][0-9]:[0-5][0-9]:[0-5][0-9])<\/td>/
-                )
-            {
-                $q{ $symbol, 'time' } = $1;
-            }
-            if ( $reply->content
-                 =~ /<td.+?id="mop_ClosingDelta".+?>(-?[0-9.]+)%<\/td>/ )
-            {
-                $q{ $symbol, 'p_change' } = $1;
-            }
-        }
-    }
-    return wantarray ? %q : \%q;
-}
@@ -1,66 +0,0 @@
-# SIX Swiss Exchange - Shares
-# (c) 2011 Stephan Walter <stephan@walter.name>
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-
-package Finance::Quote::SIXshares;
-
-use HTTP::Request::Common;
-
-our $VERSION = '1.37'; # VERSION
-
-my $url = 'http://www.six-swiss-exchange.com/shares/security_info_en.html?id=';
-
-sub methods { return ( sixshares => \&sixshares ); }
-
-sub labels {
-    return ( sixshares => [qw/name date time price last currency p_change/] );
-}
-
-sub sixshares {
-    my $quoter  = shift;
-    my @symbols = @_;
-    return unless @symbols;
-    my ( $ua, $reply, %q );
-
-    foreach my $symbol (@symbols) {
-        $ua = $quoter->user_agent;
-        $q{ $symbol, 'success' } = 0;
-        $q{ $symbol, 'name' }    = $symbol;
-        $q{ $symbol, 'symbol' }  = $symbol;
-        $reply = $ua->request( GET( $url . $symbol ) );
-        if ( !$reply->is_success ) {
-            $q{ $symbol, 'errormsg' } = 'HTTP failure';
-        }
-        else {
-            if ( $reply->content
-                =~ />([A-Z]{3})&nbsp;<\/td><td.+?id="mop_ClosingPrice".+?>([0-9.]+)<\/td>/
-                )
-            {
-                $q{ $symbol, 'currency' } = $1;
-                $q{ $symbol, 'last' }     = $2;
-                $q{ $symbol, 'success' }  = 1;
-            }
-            if ( $reply->content
-                =~ /<td.+?id="mop_LastDate".+?>([0-3][0-9]\.[01][0-9]\.[0-9]{4})<\/td>/
-                )
-            {
-                $quoter->store_date( \%q, $symbol, { eurodate => $1 } );
-            }
-            if ( $reply->content
-                =~ /<td.+?id="mop_LastTime".+?>([0-2][0-9]:[0-5][0-9]:[0-5][0-9])<\/td>/
-                )
-            {
-                $q{ $symbol, 'time' } = $1;
-            }
-            if ( $reply->content
-                 =~ /<td.+?id="mop_ClosingDelta".+?>(-?[0-9.]+)%<\/td>/ )
-            {
-                $q{ $symbol, 'p_change' } = $1;
-            }
-        }
-    }
-    return wantarray ? %q : \%q;
-}
@@ -3,28 +3,11 @@
 #  StockHouseCanada.pm
 #
 #  author: Chris Carton (ctcarton@gmail.com)
-#
-#  Basic outline of this module was copied
+#  
+#  Basic outline of this module was copied 
 #  from Cdnfundlibrary.pm
-#
-#  Version 0.1 Initial version
-#  Version 0.2, 9April2008, Updated for changed stockhouse.com site. Doug Brown.
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-#    02111-1307, USA
-#
+#   
+#  Version 0.1 Initial version 
 
 
 package Finance::Quote::StockHouseCanada;
@@ -32,25 +15,24 @@ require 5.004;
 
 use strict;
 
-use vars qw( $STOCKHOUSE_LOOKUP_URL $STOCKHOUSE_URL $STOCKHOUSE_MAIN_URL);
+use vars qw($VERSION $STOCKHOUSE_URL $STOCKHOUSE_MAIN_URL);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '0.1';
 
-$STOCKHOUSE_LOOKUP_URL="http://www.stockhouse.com/mutualFunds/index.asp?asp=1&lang=&item=searchresult&country=CAN&by=symbol&searchtext=";
-$STOCKHOUSE_URL="http://www.stockhouse.com/MutualFunds/index.asp?item=snapshot&page=1&Lang=EN&fundkey=%s&source=Fundata&Symbol=%s&FundName=&CompanyName=&asp=1";
+$STOCKHOUSE_URL="http://www.stockhouse.ca/fund/index.asp?lang=EN&item=searchresult&by=symbol&searchtext=";
 $STOCKHOUSE_MAIN_URL=("http://www.stockhouse.ca");
 
 # FIXME - Add methods to lookup other commodities
 
-sub methods { return (stockhousecanada_fund => \&stockhouse_fund,
+sub methods { return (stockhousecanada_fund => \&stockhouse_fund, 
 		      canadamutual => \&stockhouse_fund); }
 
 {
-    my @labels = qw/name currency last date isodate price source/;
+    my @labels = qw/currency last date isodate price source/;
     sub labels { return (stockhousecanada_fund => \@labels,
 			 canadamutual => \@labels); }
 }
@@ -62,145 +44,107 @@ sub stockhouse_fund  {
     my $quoter = shift;
     my @symbols = @_;
 
-	#print "StockHouseCanada::stockhouse_fund called.\n";
-
     return unless @symbols;
 
     my %fundquote;
 
     my $ua = $quoter->user_agent;
-
-    foreach (@symbols)
-    {
+	
+    foreach (@symbols) {
+		
 		my $mutual = $_;
-
-		# First, we have to get the fund code
-		my $url = $STOCKHOUSE_LOOKUP_URL.$mutual;
+		my $url = $STOCKHOUSE_URL.$mutual;
 		my $reply = $ua->request(GET $url);
-		# Check the outcome of the response
-		if (!$reply->is_success) {
-			$fundquote {$mutual,"success"} = 0;
-			$fundquote {$mutual,"errormsg"} = "Error retrieving page: $reply->status_line.";
-			next;
-		}
-		unless ($reply->content =~ /fundkey%3D(\d*)/)
-		{
-			$fundquote {$mutual,"success"} = 0;
-			$fundquote {$mutual,"errormsg"} = "Error determining fund code for $mutual.";
-			next;
-		}
-		my $code = $1;
-		#print "Code for $mutual is $code.\n";
-
-		$url = sprintf($STOCKHOUSE_URL, ($code, $mutual));
-		# print "StockHouseCanada using URL $url \n";
-		$reply = $ua->request(GET $url);
-
-		$fundquote {$mutual, "symbol"} = $mutual;
-		$fundquote {$mutual, "source"} = $STOCKHOUSE_MAIN_URL;
-
-		# Check the outcome of the response
-		if (!$reply->is_success) {
-			$fundquote {$mutual,"success"} = 0;
-			$fundquote {$mutual,"errormsg"} = "Error retrieving page: $reply->status_line.";
-			next;
-		}
-
 		# print "Retrieving $url\n";
 
 		$fundquote {$mutual, "success"} = 0;
 
 		next unless ($reply->is_success);
 
-		######################################################
-		# debug
-
-		#my $tetest= new HTML::TableExtract( headers => [qw(NAVPS CURRENCY)] );
-		#$tetest->parse($reply->content);
-		#foreach my $tstest ($tetest->table_states) {
-		#    print "\n***\n*** Table (", join(',', $tstest->coords), "):\n***\n";
-		#    foreach my $rowtest ($tstest->rows) {
-		#	print join(',', @$rowtest), "\n***\n";
-		#    }
-		#}
-		#
 		# print $reply->content;
-		######################################################
-
-		# We're looking for these 3 things
-		my $nav;
-		my $currency;
-		my $navdate;
-                my $name;
-
-                # Find name by simple regexp
-                if ($reply->content =~ m/<td class=ft_h1>(.*) \($mutual\)<\/td>/ ) {
-                  $name = $1 ;
-                  #print ">>>$name<<<<\n";
-                }
-		$fundquote {$mutual, "name"} = $name;
-
-		# Find NAV and Currency via table header
-		my $te= new HTML::TableExtract( headers => [qw(NAVPS CURRENCY)] );
-		$te->parse($reply->content);
 
-		# There should only be one hit
-		foreach my $ts ($te->table_states)
-		{
-			foreach my $row ($ts->rows)
-			{
-				$nav = $$row[0];
-				$currency = $$row[1];
-			}
-			last;
-		}
-
-		# print "Nav = $nav, currency = $currency\n";
+		# Parse out the complete fund name.
 
-		if (!defined($nav))
+		# debug
+#		my $te2= new HTML::TableExtract(depth => 1);
+#		$te2->parse($reply->content);
+#		foreach my $ts ($te2->table_states) {
+#		    print "\n***\n*** Table (", join(',', $ts->coords), "):\n***\n";
+#		    foreach my $row ($ts->rows) {
+#			print join(',', @$row), "\n";
+#		    }
+#		}
+
+		# Search all tables of depth 1 looking for the fund name.
+		my $te= new HTML::TableExtract( depth => 1 );
+		$te->parse($reply->content);
+		unless ( $te->tables)
 		{
 			$fundquote {$mutual,"success"} = 0;
-			$fundquote {$mutual,"errormsg"} = "Error parsing NAV for $mutual.";
+			$fundquote {$mutual,"errormsg"} = "Fund name $mutual not found";
 			next;
 		}
-		$fundquote {$mutual, "last"} = $nav;
-		$fundquote {$mutual, "price"} = $nav;
-		$fundquote {$mutual, "nav"} = $nav;
 
-		if (!defined($currency))
+		unless ($te->rows)
 		{
 			$fundquote {$mutual,"success"} = 0;
-			$fundquote {$mutual,"errormsg"} = "Error parsing currency for $mutual.";
+			$fundquote {$mutual,"errormsg"} = "Error parsing fund name";
 			next;
 		}
-		$fundquote {$mutual, "currency"} = $currency;
 
-		# I can't find a good anchor for the date, so just look for the label
-		if ($reply->content =~ /As of&nbsp;&nbsp;(.*)&nbsp;/)
-		{
-			$navdate = $1;
+		foreach my $ts ($te->table_states) {
+			my ($a) = ($ts->rows);
+			next unless defined $$a[0];
+			$$a[0] =~ s/.([A-Za-z0-9() ]+).*/$1/;
+			next unless defined $1;
+			$fundquote {$mutual, "name"} = $1;
+			last;
 		}
 
-                # normalize $navdate to format mm/dd/yyyy by adding zeros where needed
-                $navdate =~ s|^(\d)/|0$1/| ; #month
-                $navdate =~ s|/(\d)/|/0$1/| ; #day
-		#print "Date = $navdate\n";
+		# Parse out the rest of the fund data.
+		
+		$te = HTML::TableExtract->new( headers => ["Quick Stats"],
+						  slice_columns => 0 );
 
-		if (!defined($navdate))
-		{
-			$fundquote {$mutual,"success"} = 0;
-			$fundquote {$mutual,"errormsg"} = "Error parsing date for $mutual.";
+		if (!$te) {
+			$fundquote {$mutual, "success"} = 0;
+			$fundquote {$mutual,"errormsg"} = "Error parsing fund data";
+			next;
+		}
+
+		$te->parse($reply->content);
+		
+		my ($ts) = $te->table_states;
+		if (!$ts) {
+			$fundquote {$mutual, "success"} = 0;
+			$fundquote {$mutual,"errormsg"} = "Error parsing fund data";
 			next;
 		}
-		$fundquote {$mutual, "date"} = $navdate;
-                ($fundquote {$mutual, "isodate"} = $navdate) =~ s|(\d+)/(\d+)/(\d+)|$3/$1/$2| ;
-                #print "isodate = $fundquote{$mutual,'isodate'}\n";
+
+		my($a, $b, $c, $d) = $ts->rows;
+
+		$$a[1] =~ s/.(.*)./$1/g; # remove some nbsp characters
+		$$d[4] =~ s/.(.*)./$1/g;
+
+		$fundquote {$mutual, "last"} = $$a[1];
+		$fundquote {$mutual, "price"} = $$a[1];
+		$fundquote {$mutual, "currency"} = $$d[4];
+
+		# Can't find the date anywhere in the returned info so
+		# we'll use the current date
+		$quoter->store_date(\%fundquote, $mutual, {today => 1});
+
+		$fundquote {$mutual, "symbol"} = $mutual;
+
+		$fundquote {$mutual, "source"} = $STOCKHOUSE_MAIN_URL;
 
 		$fundquote {$mutual, "success"} = 1;
 	}
 
 	return %fundquote if wantarray;
 	return \%fundquote;
+
 }
 
 1;
+
@@ -1,420 +0,0 @@
-#!/usr/bin/perl -w
-
-#  TNetuk.pm
-#
-#  Obtains quotes for UK Unit Trusts from http://trustnet.com/ - please
-#  refer to the end of this file for further information.
-#
-#  author: Martin Sadler (martinsadler@users.sourceforge.net)
-#
-#  version: 0.1 Initial version - 01 April 2013
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-#    02111-1307, USA
-#
-
-
-package Finance::Quote::TNetuk;
-require 5.005;
-
-use strict;
-use warnings;
-
-# Set DEBUG => 0 for no debug messages, => 1 for first level, => 2 for 2nd level, etc.
-
-use constant DEBUG => 0;
-
-# URLs
-use vars qw($VERSION $TNETUK_NEXT_URL $TNETUK_LOOK_UP $TNETUK_MAIN_URL);
-
-use LWP::Simple;
-use LWP::UserAgent;
-use HTTP::Request::Common;
-use HTTP::Cookies;
-use HTML::TokeParser;
-# use Data::Dumper;
-
-our $VERSION = '1.37'; # VERSION
-
-$TNETUK_MAIN_URL   =   "http://www.trustnet.com";
-$TNETUK_LOOK_UP    =   "http://www.trustnet.com/Tools/Search.aspx?keyword=";
-$TNETUK_NEXT_URL	=	"/Factsheets/Factsheet.aspx?fundcode=";
-
-# FIXME -
-
-sub methods { return (tnetuk => \&tnetuk_fund,
-		      			ukfunds => \&tnetuk_fund); }
-
-{
-    my @labels = qw/name currency last date time price nav source iso_date method net p_change success errormsg/;
-
-    sub labels { return (tnetuk => \@labels,
-			 				ukfunds => \@labels); }
-}
-
-#
-# =======================================================================
-
-sub tnetuk_fund  {
-    my $quoter = shift;
-    my @symbols = @_;
-
-    return unless @symbols;
-
-    my %fundquote;
-
-    my $ua = $quoter->user_agent;
-    my $cj = HTTP::Cookies->new();
-    $ua->cookie_jar( $cj );
-
-    foreach (@symbols)
-    {
-	    my $code = $_;
-
-	    my $code_type = "** Invalid **";
-	    if ($code =~ m/^[a-zA-Z]{2}[a-zA-Z0-9]{9}\d(.*)/ && !$1) { $code_type = "ISIN";  }
-	    elsif ($code =~ m/^[a-zA-Z0-9]{6}\d(.*)/ && !$1 )        { $code_type = "SEDOL"; }
-	    elsif ($code =~ m/^[a-zA-Z]{4,6}(.*)/ && !$1)            { $code_type = "MEXID"; }
-
-# current version can only use ISIN - report an error and exit if any other type
-
-        if ($code_type ne "ISIN")
-        {
-		    $fundquote {$code,"success"} = 0;
-		    $fundquote {$code,"errormsg"} = "Error - invalid symbol";
-		    next;
-        }
-
-	    $fundquote {$code,"success"} = 1; # ever the optimist....
-	    $fundquote {$code,"errormsg"} = "Success";
-
-# perform the look-up - if not found, return with error
-
-        my $webdoc  = $ua->get($TNETUK_LOOK_UP.$code);
-        if (!$webdoc->is_success)
-        {
-	        # serious error, report it and give up
-		    $fundquote {$code,"success"} = 0;
-		    $fundquote {$code,"errormsg"} =
-		        "Error - failed to retrieve fund data : HTTP Status = ",$webdoc->status_line;
-		    next;
-	    }
-	    $fundquote {$code, "symbol"} = $code;
-	    $fundquote {$code, "source"} = $TNETUK_MAIN_URL;
-
-DEBUG and print "\nTitle  = ",$webdoc->title,"\n";
-DEBUG and print "\nStatus = ",$webdoc->status_line, "\n";
-#DEBUG > 1 and print "\nCookie Jar = : \n",Dumper($cj),"\n\n";
-DEBUG > 1 and my $outfile = "tnetuk-p1-".$code.".txt";
-DEBUG > 1 and open (OUT,">$outfile");
-DEBUG > 1 and print OUT $webdoc->content;
-DEBUG > 1 and close(OUT);
-
-# Find name and next url using TokeParser
-
-		my $htmlstream	=	HTML::TokeParser->new(\$webdoc->content);
-
-		my $done = 0;
-        my ($tag, $name, $nexturl, $univ);
-		while ( ( $tag = $htmlstream->get_tag('a')) && !$nexturl )
-		{
-			if ( $tag->[1]{'href'} )
-			{
-DEBUG and print "\nTag-item 'href' = ",$tag->[1]{'href'},"\n";
-				if ( $tag->[1]{'href'} =~ m[^/Factsheets/Factsheet\.aspx.*univ=(.).*] )
-				{
-					$univ = $1;
-DEBUG and print "\nUniv = ",$univ,"\n";
-					$nexturl = $tag->[1]{'href'};
-					$name    = $htmlstream->get_trimmed_text('/a');
-				}
-			}
-		}
-
-DEBUG and print "\nNext URL = ",$nexturl,"\n";
-DEBUG and print "\bName     = ",$name,"\n";
-
-		if (!defined($name)) {
-			# not a serious error - don't report it ....
-#			$fundquote {$code,"success"} = 0;
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find fund name";
-			$name = "*** UNKNOWN ***";
-			# ... and continue
-		}
-		$fundquote {$code, "name"} = $name;	# set name
-
-		if (!defined($nexturl)) {
-	        # serious error, report it and give up
-		    $fundquote {$code,"success"} = 0;
-		    $fundquote {$code,"errormsg"} = "Error - failed to retrieve fund data";
-		    next;
-		}
-
-# need SEDOL to identify the correct line in the next web-page
-
-        my $sedol;
-        if ($code =~ m[^[a-zA-Z]{2}[0-9]{2}([a-zA-Z0-9]{7})\d])
-        {
-        	$sedol = $1;
-        }
-DEBUG and print "SEDOL for ",$code," = ",$sedol,"\n";
-
-# modify $nexturl to remove html escape encoding for the Ampersand (&) character
-
-		$nexturl =~ s/&amp;/&/;
-
-# Now need to look-up next page using $next_url
-
-        $webdoc  = $ua->get($TNETUK_MAIN_URL.$nexturl);
-        if (!$webdoc->is_success)
-        {
-	        # serious error, report it and give up
-		    $fundquote {$code,"success"} = 0;
-		    $fundquote {$code,"errormsg"} =
-		        "Error - failed to retrieve fund data : HTTP Status = ",$webdoc->status_line;
-		    next;
-	    }
-
-DEBUG and print "\nTitle  = ",$webdoc->title,"\n";
-DEBUG and print "\nStatus = ",$webdoc->status_line, "\n";
-#DEBUG > 1 and print "\nCookie Jar = : \n",Dumper($cj),"\n\n";
-DEBUG > 1 and $outfile = "tnetuk-p2-".$code.".txt";
-DEBUG > 1 and open (OUT,">$outfile");
-DEBUG > 1 and print OUT $webdoc->content;
-DEBUG > 1 and close(OUT);
-
-# Find date, currency and price using TokeParser
-
-		my ($currency, $date, $price, $pchange, $text, $match, $ucname);
-		$htmlstream	=	HTML::TokeParser->new(\$webdoc->content);
-
-		$match = 0;
-		while ( ( $tag = $htmlstream->get_tag('caption')) && !$done )
-		{
-DEBUG and print "\nFound tag : ",$tag->[3],$htmlstream->get_trimmed_text('/caption'),"</caption/>\n";
-			while ( ($tag = $htmlstream->get_tag('a')) && $tag->[1]{'href'} && !$match )
-			{
-DEBUG and print "\nTag-item 'href' = ",$tag->[1]{'href'},"\n";
-				if ( $tag->[1]{'href'} =~ m[.*/Factsheets/Factsheet\.aspx.*] )
-				{
-DEBUG and print "\nFound tag-item : ",$tag->[3],"\n";
-					$done = 0;
-					$ucname = $htmlstream->get_trimmed_text('/a');
-DEBUG and print "\nUpper-case name = ",$ucname,"\n";
-					while ( ($tag = $htmlstream->get_tag('td','/tr')) && !$done  )
-					{
-						if ( $tag->[0] eq '/tr' ) 									# end of table
-						{
-DEBUG and print "\nEnd of table reached... ";
-							$done = 1;
-							if ( !$match )
-							{
-DEBUG and print "no match found on SEDOL/Name\n";
-								$currency = $date = $price = undef;
-							}
-							else
-							{
-DEBUG and print "SEDOL/Name match found!\n";
-							}
-						}
-						else
-						{
-							$text = $htmlstream->get_trimmed_text('/td');
-							if ( $text =~ m[^([0-9\.]*) \(([a-zA-Z]{1,3})\)] ) 		# price
-							{
-								$price = $1;
-								if ( $2 eq 'p' ) { $currency = 'GBX'; }
-								else             { $currency = $2;    }
-DEBUG and print "\nCCY / Price = ",$currency," ",$price,"\n";
-							}
-							if ( $text =~ m[.*([0-9]{2}-[a-zA-Z]{3}-[0-9]{4})] )	# date
-							{
-								$date = $1;
-DEBUG and print "\nDate = ",$date,"\n";
-							}
-							if ( $text =~ m[^([a-zA-Z0-9]{7})] )					#sedol
-							{
-DEBUG and print "\nSEDOL = ",$text," : (",$sedol,")\n";
-								$text = uc($name);
-DEBUG and print "\nNames = ",$ucname," : (",$text,")\n";
-								if ( ($sedol eq $1) )					# matches on SEDOL
-								{
-									$match = 1;
-								}
-								else
-								{
-									if ($ucname eq $text)				# matches om name
-									{
-										$match = 1;
-										$fundquote {$code,"errormsg"} = "Warning - matched on name only";
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		if (!defined($pchange)) {
-			# not a serious error - don't report it ....
-#			$fundquote {$code,"success"} = 0;
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find net or %-age change";
-			# set to (minus)zero
-            $pchange = -0.00;
-			# ... and continue
-		}
-		$fundquote {$code, "p_change"} = $pchange;	# set %-change
-DEBUG and print "\n\%-age change = ",$pchange,"\n";
-
-DEBUG and print "\nDate = ",$date,"\n";
-		if (!defined($date)) {
-			# not a serious error - don't report it ....
-#			$fundquote {$code,"success"} = 0;
-			# ... but set a useful message ....
-			$fundquote {$code,"errormsg"} = "Warning - failed to find a date";
-			# use today's date
-            $quoter->store_date(\%fundquote, $code, {today => 1});
-			# ... and continue
-		}
-		else
-		{
-		    $quoter->store_date(\%fundquote, $code, {eurodate => $date});
-		}
-
-DEBUG and print "\nPrice = ",$price,"\n";
-		if (!defined($price)) {
-	    	# serious error, report it and give up
-			$fundquote {$code,"success"} = 0;
-			$fundquote {$code,"errormsg"} = "Error - failed to find a price";
-			next;
-		}
-
-DEBUG and print "\nCCY = ",$currency,"\n";
-		if (!defined($currency)) {
-	    	# serious error, report it and give up
-			$fundquote {$code,"success"} = 0;
-			$fundquote {$code,"errormsg"} = "Error - failed to find a currency";
-			next;
-		}
-
-		# defer setting currency and price until we've dealt with possible GBX currency...
-
-# Calculate net change - it's not included in the trustnet factsheets
-
-		my $net = ($price * $pchange) / 100 ;
-
-# deal with GBX pricing of UK unit trusts
-
-		if ($currency eq "GBX")
-		{
-			$currency = "GBP" ;
-			$price = $price / 100 ;
-            $net   = $net   / 100 ;
-		}
-
-		# now set prices and currency
-
-		$fundquote {$code, "price"} = $price;
-		$fundquote {$code, "last"} = $price;
-		$fundquote {$code, "nav"} = $price;
-		$fundquote {$code, "net"} = $net;
-		$fundquote {$code, "currency"} = $currency;
-
-# Set a dummy time as gnucash insists on having a valid format
-
-		my $time = "12:00";     # set to Midday if no time supplied ???
-                                # gnucash insists on having a valid-format
-
-		$fundquote {$code, "time"} = $time; # set time
-
-		$fundquote {$code, "method"} = "tnetuk";   # set method
-
-	}
-
-	return wantarray ? %fundquote : \%fundquote;
-}
-
-1;
-
-=head1 NAME
-
-Finance::Quote::tnetuk - Obtain UK Unit Trust quotes from trustnet.com.
-
-=head1 SYNOPSIS
-
-    $q = Finance::Quote->new;
-
-    %info = Finance::Quote->fetch("tnetuk","<isin> ...");  # Only query trustnet.com using ISINs
-    %info = Finance::Quote->fetch("ukfunds","<isin>|<sedol>|<mexid> ..."); # Failover to other sources
-
-=head1 DESCRIPTION
-
-This module fetches information from the Trustnet UK Funds service,
-http://trustnet.com. There are many UK Unit Trusts and OEICs quoted,
-as well as many Offshore Funds and Exhange Traded Funds (ETFs). It converts
-any funds quoted in GBX (pence) to GBP, dividing the price by 100 in the
-process.
-
-Funds are identified by their ISIN code.
-
-This module is loaded by default on a Finance::Quote object. It's
-also possible to load it explicity by placing "tnetuk" in the argument
-list to Finance::Quote->new().
-
-Information obtained by this module may be covered by tnetuk.com
-terms and conditions See http://trustnet.com for details.
-
-=head2 Stocks And Indices
-
-This module provides both the "tnetuk" and "ukfunds" fetch methods for
-fetching UK and Offshore Unit Trusts and OEICs prices and other information
-from funds.ft.com. Please use the "ukfunds" fetch method if you wish to have
-failover with future sources for UK and Offshore Unit Trusts and OEICs - the
-author has plans to develop Finance::Quote modules for other sources providing
-uk unit trust prices. Using the "tnetuk" method will guarantee
-that your information only comes from the trustnet.com website.
-
-=head1 LABELS RETURNED
-
-The following labels may be returned by Finance::Quote::TNetuk :
-
-    name, currency, last, date, time, price, nav, source, method,
-    iso_date, net, p_change, success, errormsg.
-
-
-=head1 SEE ALSO
-
-
-
-
-=head1 AUTHOR
-
-Martin Sadler, E<lt>martinsadler@users.sourceforge.netE<gt>
-
-=head1 COPYRIGHT AND LICENSE
-
-Copyright (C) 2010 by Martin Sadler
-
-This library is free software; you can redistribute it and/or modify
-it under the same terms as Perl itself, either Perl version 5.10.1 or,
-at your option, any later version of Perl 5 you may have available.
-
-
-=cut
-
-__END__
@@ -3,7 +3,7 @@
 #    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
 #    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
 #    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
+#    Copyright (C) 2000, Paul Fenwick <pjf@Acpan.org>
 #    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
 #    Copyright (C) 2001, Rob Sessink <rob_ses@users.sourceforge.net>
 #    Copyright (C) 2004, Frank Mori Hess <fmhess@users.sourceforge.net>
@@ -33,27 +33,24 @@ use strict;
 
 package Finance::Quote::TSP;
 
-use vars qw( $TSP_URL $TSP_MAIN_URL %TSP_FUND_COLUMNS %TSP_FUND_NAMES);
+use vars qw($VERSION $TSP_URL $TSP_MAIN_URL %TSP_FUND_COLUMNS %TSP_FUND_NAMES);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '0.2';
 
 # URLs of where to obtain information
 
-$TSP_URL = 'https://www.tsp.gov/investmentfunds/shareprice/sharePriceHistory.shtml';
+$TSP_URL = 'http://www.tsp.gov/rates/share-prices.html';
 $TSP_MAIN_URL=("http://www.tsp.gov");
 
-# ENHANCE-ME: The decade target funds like 2020 appear and disappear.
-# Better not to hard code them.
-#
 %TSP_FUND_COLUMNS = (
-    TSPL2050FUND => "L 2050",
     TSPL2040FUND => "L 2040",
     TSPL2030FUND => "L 2030",
     TSPL2020FUND => "L 2020",
+    TSPL2010FUND => "L 2010",
     TSPLINCOMEFUND => "L INCOME",
     TSPGFUND => "G FUND",
     TSPFFUND => "F FUND",
@@ -62,10 +59,10 @@ $TSP_MAIN_URL=("http://www.tsp.gov");
     TSPIFUND => "I FUND" );
 
 %TSP_FUND_NAMES = (
-    TSPL2050 => 'Lifecycle 2050 Fund',
     TSPL2040 => 'Lifecycle 2040 Fund',
     TSPL2030 => 'Lifecycle 2030 Fund',
     TSPL2020 => 'Lifecycle 2020 Fund',
+    TSPL2010 => 'Lifecycle 2010 Fund',
     TSPLINCOME => 'Lifecycle Income Fund',
     TSPGFUND => 'Government Securities Investment Fund',
     TSPFFUND => 'Fixed Income Index Investment Fund',
@@ -74,11 +71,11 @@ $TSP_MAIN_URL=("http://www.tsp.gov");
     TSPIFUND => 'International Stock Index Investment Fund' );
 
 sub methods { return (tsp => \&tsp) }
+ 
+{ 
+	my @labels = qw/name nav date isodate currency method/;
 
-{
-	my @labels = qw/name nav date isodate currency method last close/;
-
-	sub labels { return (tsp => \@labels); }
+	sub labels { return (tsp => \@labels); } 
 }
 
 # ==============================================================================
@@ -86,29 +83,26 @@ sub tsp {
 	my $quoter = shift;
 	my @symbols = @_;
 
-	# Make sure symbols are requested
+	# Make sure symbols are requested  
 	##CAN exit more gracefully - add later##
 
 	return unless @symbols;
 
 	# Local Variables
 	my(%info, %fundrows);
-	my($ua, $reply, $row, $te, $ts, $second_row);
+	my($ua, $reply, $row, $te);
 
 	$ua = $quoter->user_agent;
 	$reply = $ua->request(GET $TSP_URL);
 	return unless ($reply->is_success);
-	$te = new HTML::TableExtract( headers =>
+	$te = new HTML::TableExtract( headers => 
 		["Date", values %TSP_FUND_COLUMNS] );
 
 	$te->parse($reply->content);
 
 	# First row is newest data, older data follows, maybe there
-	# should be some way to get it (in addition to the second_row "close")
-        $ts = $te->first_table_found
-          || die 'TSP data table not recognised';
-        $row = $ts->row(0);
-	$second_row = $ts->row(1);
+	# should be some way to get it?
+	$row = ($te->rows())[0];
 
 	# Make a hash that maps the order the columns are in
 	for(my $i=1; my $key = each %TSP_FUND_COLUMNS ; $i++) {
@@ -138,7 +132,6 @@ sub tsp {
 		$info{$_, 'name'} = $TSP_FUND_NAMES{$tmp};
 		($info{$_, 'nav'} = $$row[$fundrows{$tmp}]) =~ s/[^0-9]*([0-9.,]+).*/$1/s;
 		$info{$_, 'last'} = $info{$_, 'nav'};
-		($info{$_, 'close'} = $second_row->[$fundrows{$tmp}]) =~ s/[^0-9]*([0-9.,]+).*/$1/s;
 		$quoter->store_date(\%info, $_, {usdate => $$row[0]});
 	    } else {
 		$info{$_, 'success'} = 0;
@@ -147,8 +140,8 @@ sub tsp {
 	}
 	return %info if wantarray;
 	return \%info;
-}
-1;
+} 
+1; 
 
 =head1 NAME
 
@@ -164,45 +157,17 @@ Finance::Quote::TSP Obtain fund prices for US Federal Government Thrift Savings
 
 =head1 DESCRIPTION
 
-This module fetches fund information from the "Thrift Savings Plan"
-
-    http://www.tsp.gov
-
-using its fund prices page
-
-    https://www.tsp.gov/investmentfunds/shareprice/sharePriceHistory.shtml
-
-The quote symbols are
-
-    C          common stock fund
-    F          fixed income fund
-    G          government securities fund
-    I          international stock fund
-    S          small cap stock fund
-    L2020      lifecycle fund year 2020
-    L2030      lifecycle fund year 2030
-    L2040      lifecycle fund year 2040
-    L2050      lifecycle fund year 2050
-    LINCOME    lifecycle income fund
+This module fetches fund information from the "Thrift Savings Plan" 
+homepage http://www.tsp.gov.
 
 =head1 LABELS RETURNED
 
 The following labels may be returned by Finance::Quote::TSP :
-
-    name        eg. "Common Stock Index Investment Fund"
-    date        latest date, eg. "21/02/10"
-    isodate     latest date, eg. "2010-02-21"
-    last        latest price, eg. "16.1053"
-    close       previous day's price
-    nav         same as "last"
-    currency    "USD"
-    method      "tsp"
-
-C<nav> is the same as C<last> since the funds are quoted at their net asset
-value.
+name nav date currency method
 
 =head1 SEE ALSO
 
 Thrift Savings Plan, http://www.tsp.gov
 
 =cut
+
@@ -1,217 +0,0 @@
-#!/usr/bin/perl -w
-#
-#    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
-#    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
-#    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
-#    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
-#    Copyright (C) 2001, Leigh Wedding <leigh.wedding@telstra.com>
-#    Copyright (C) 2006, Mika Laari <mika.laari@iki.fi>
-#    Copyright (C) 2008, Emmanuel Rodriguez <potyl@cpan.org>
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-#    02111-1307, USA
-#
-#
-# This code derived from the work of Mika Laari in the package
-# Finance::Quote::HEX.
-#
-# This code was developed as part of GnuCash <http://www.gnucash.org/>
-
-require 5.005;
-
-use strict;
-
-package Finance::Quote::TSX;
-
-use LWP::UserAgent;
-use HTML::TableExtract;
-use URI;
-use URI::QueryParam;
-
-our $VERSION = '1.37'; # VERSION
-
-# This URL is able to accept up to 10 symbols at a time
-my $TSX_URL = URI->new('http://cxa.marketwatch.com/tsx/en/market/getquote.aspx');
-
-# The number of symbols that can be fetched at a time per URL
-my $BATCH_SIZE = 10;
-
-my @LABELS = qw(name last net p_change volume exchange);
-
-
-sub methods {
-	return (
-		tsx    => \&tsx,
-		canada => \&tsx,
-	);
-}
-
-sub labels {
-	return (
-		tsx    => \@LABELS,
-		canada => \@LABELS,
-	);
-}
-
-
-# Toronto Stock Exchange (TSX)
-# The TSX provides free delayed quotes through their webpage.
-# This module is based on HEX.pm.
-#
-# Maintainer of this section is Emmanuel Rodriguez <potyl@cpan.org>.
-
-sub tsx {
-	my $quoter = shift;
-	my @symbols = @_;
-	return unless @symbols;
-
-	my %info = ();
-
-	# Fetch the stocks per batch
-	while (@symbols) {
-
-		# Get the next batch of symbols
-		my @batch = splice @symbols, 0, $BATCH_SIZE;
-
-		# Build the URL
-		my $url = $TSX_URL->clone;
-		$url->query_param(symb => join ',', @batch);
-
-		# Download the stock information
-		my $response = $quoter->user_agent->get($url);
-		unless ($response->is_success) {
-			foreach my $symbol (@batch) {
-				$info{$symbol, 'success'} = 0;
-				$info{$symbol, 'errormsg'} = "HTTP session failed";
-			}
-			next;
-		}
-
-		# Extract the stock information
-		extract_stock_data(\%info, $response->content);
-	}
-
-
-	# Make sure that all symbols where found
-	foreach my $symbol (@symbols) {
-		next if exists $info{$symbol, 'name'};
-		$info{$symbol, 'success'} = 0;
-		$info{$symbol, 'errormsg'} = "Symbol not found";
-	}
-
-	return wantarray() ? %info : \%info;
-}
-
-
-#
-# Extracts the stock data from an HTML page.
-#
-# Returns a list of symbol structs.
-#
-sub extract_stock_data {
-
-	my ($info, $content) = @_;
-
-	# The stocks are in <table class="data">
-	# NOTE: TSX returns extra symbols who's names are similar to the symbols that
-	#       are going to be fetched. This method will exclude such symbols.
-	my $parser = HTML::TableExtract->new(attribs => { class => 'data' } );
-	$parser->parse($content);
-
-	my ($table) = $parser->tables;
-	return unless defined $table;
-
-	my $is_header = 1;
-	foreach my $row ($table->rows) {
-
-		# Skip the header
-		if ($is_header) {
-			$is_header = 0;
-			next;
-		}
-
-		my $i = 0;
-		# The symbol is in the format 'BCE-T' (T is the exchange)
-		my $symbol = $row->[$i++];
-		if ($symbol =~ s/-(.)$//) {
-			$info->{$symbol, 'exchange'} = $1;
-		}
-
-
-		# Parse the other fields
-		$info->{$symbol, 'name'} = $row->[$i++];
-		$info->{$symbol, 'last'} = $row->[$i++];
-		# The change is in the format '-0.40 (-0.5%)' (positive numbers have no sign)
-		if ($row->[$i++] =~ /(-?\d+\.\d+) \s+ \((-?\d+\.\d+)%\)/x) {
-			$info->{$symbol, 'net'} = $1;
-			$info->{$symbol, 'p_change'} = $2;
-		}
-		$info->{$symbol, 'volume'} = $row->[$i++];
-
-
-		# Cleanup
-		$info->{$symbol, 'volume'} =~ s/,//g;
-
-		$info->{$symbol, 'method'} = 'tsx';
-		$info->{$symbol, 'success'} = 1;
-	}
-}
-
-
-1;
-
-=head1 NAME
-
-Finance::Quote::TSX	- Obtain quotes from the Toronto Stock Exchange.
-
-=head1 SYNOPSIS
-
-    use Finance::Quote;
-
-    $q = Finance::Quote->new;
-
-    %stockinfo = $q->fetch("tsx","NT-T");	  # Only query TSX.
-    %stockinfo = $q->fetch("canada","NT");  # Failover to other sources OK.
-
-=head1 DESCRIPTION
-
-This module obtains information from the Toronto Stock Exchange
-through the page http://www.TMXmoney.com/.
-
-This module is not loaded by default on a Finance::Quote object.
-It's possible to load it explicity by placing "TSX" in the argument
-list to Finance::Quote->new().
-
-This module provides both the "tsx" and "toronto" fetch methods.
-Please use the "canada" fetch method if you wish to have failover with other
-sources for Canadian stocks.  Using the "tsx" method will guarantee that your
-information only comes from the Toronto Stock Exchange.
-
-=head1 LABELS RETURNED
-
-The following labels are returned by Finance::Quote::TSX:
-name, last, net, p_change, volume and exchange.
-
-This module returns less information (labels) than other sources but it's able
-to retrieve them faster because each HTTP request performed can return up to 10
-stocks. Thus, if the labels provided by this module are sufficient for your
-application then you should give it a try.
-
-=head1 SEE ALSO
-
-Toronto Stock Exchange, http://www.TMXmoney.com/
-
-=cut
@@ -27,13 +27,13 @@ require 5.005;
 
 use strict;
 
-use vars qw( $TD_URL);
+use vars qw($VERSION $TD_URL);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use Carp;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.00';
 
 # URLs of where to obtain information.
 
@@ -111,7 +111,6 @@ sub tdefunds
             $sym = &tdefunds_create_symbol($sym);
 
 	    # $sym =~ tr/a-z/A-Z/;
-            $aa {$sym, "symbol"} = $sym;
 	    $aa {$sym, "exchange"} = "TD Waterhouse";  # TRP
 	    $aa {$sym, "method"} = "tdefunds";
 	    $aa {$sym, "name"} = $name;
@@ -154,12 +153,12 @@ Finance::Quote::Tdefunds	- Obtain quotes from TD Waterhouse Efunds
 =head1 DESCRIPTION
 
 This module obtains information about managed funds from TD
-Waterhouse Canada Efunds. All TD Waterhouse efunds are downloaded at once.
+Waterhouse Canada Efunds. All TD Waterhouse efunds are downloaded at once. 
 
 The symbols for each efund are the names of the efund with any
 unusal characters (not a letter, space or period) removed. For example;
 a fund called "TD US Index ($US)" would have the symbol
-"TD US Index US".
+"TD US Index US". 
 
 =head1 LABELS RETURNED
 
@@ -27,13 +27,13 @@ require 5.005;
 
 use strict;
 
-use vars qw( $TD_URL);
+use vars qw($VERSION $TD_URL);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use Carp;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.00';
 
 # URLs of where to obtain information.
 
@@ -153,12 +153,12 @@ Finance::Quote::Tdwaterhouse	- Obtain quotes from TD Waterhouse Canada
 =head1 DESCRIPTION
 
 This module obtains information about managed funds from TD
-Waterhouse Canada. All TD Waterhouse funds are downloaded at once.
+Waterhouse Canada. All TD Waterhouse funds are downloaded at once. 
 
 The symbols for each mutual fund are the names of the fund with any
 unusal characters (not a letter, space or period) removed. For example;
 a fund called "TD Health Sciences ($US)" would have the symbol
-"TD Health Sciences US".
+"TD Health Sciences US". 
 
 =head1 LABELS RETURNED
 
@@ -29,24 +29,22 @@
 
 package Finance::Quote::Tiaacref;
 require 5.005;
-require LWP::Protocol::https;
-require Mozilla::CA;
+require Crypt::SSLeay;
 
 use strict;
 
-use vars qw( $CREF_URL $TIAA_URL
-			%tiaacref_ids %tiaacref_locs %tiaacref_vals);
+use vars qw($VERSION $CREF_URL $TIAA_URL
+            %tiaacref_ids %tiaacref_locs %tiaacref_vals);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use Carp;
-use Encode;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.02';
 
 # URLs of where to obtain information.
 # This used to be different for the CREF and TIAA annuities, but this changed.
-$CREF_URL = ("https://www.tiaa-cref.org/public/tcfpi/Export/InvestmentDetails?Details=DailyPerformance");
+$CREF_URL = ("https://www3.tiaa-cref.org/ddata/DownloadData?");
 
 sub methods { return (tiaacref=>\&tiaacref); }
 
@@ -55,212 +53,53 @@ sub labels { return (tiaacref => [qw/method symbol exchange name date isodate na
 # =======================================================================
 # TIAA-CREF Annuities are not listed on any exchange, unlike their mutual funds
 # TIAA-CREF provides unit values via a cgi on their website. The cgi returns
-# a csv file in the format
+# a csv file in the format 
 #		bogus_symbol1,price1,date1
 #		bogus_symbol2,price2,date2
 #       ..etc.
 # where bogus_symbol takes on the following values for the various annuities:
 #
-# CREF Bond Market Account:	CREFbond	41081991
-# CREF Equity Index Account:	CREFequi	41082540
-# CREF Global Equities Account:	CREFglob	41081992
-# CREF Growth Account:	CREFgrow	41082544
-# CREF Inflation-Linked Bond Account:	CREFinfb	41088773
-# CREF Money Market Account:	CREFmony	41081993
-# CREF Social Choice Account:	CREFsoci	41081994
-# CREF Stock Account:	CREFstok	41081995
-# TIAA Real Estate Account:	TIAAreal	41091375
-# TIAA-CREF Bond Fund (Retirement):	TIDRX	4530828
-# TIAA-CREF Bond Index Fund (Retirement):	TBIRX	20739662
-# TIAA-CREF Bond Plus Fund (Retirement):	TCBRX	4530816
-# TIAA-CREF Emerging Markets Equity Fund (Retirement):	TEMSX	26176543
-# TIAA-CREF Emerging Markets Equity Index Fund (Retirement):	TEQSX	26176547
-# TIAA-CREF Equity Index Fund (Retirement):	TIQRX	4530786
-# TIAA-CREF Global Natural Resources Fund (Retirement):	TNRRX	39444919
-# TIAA-CREF Growth & Income Fund (Retirement):	TRGIX	312536
-# TIAA-CREF High Yield Fund (Retirement):	TIHRX	4530821
-# TIAA-CREF Inflation-Linked Bond Fund (Retirement):	TIKRX	4530829
-# TIAA-CREF International Equity Fund (Retirement):	TRERX	302323
-# TIAA-CREF International Equity Index Fund (Retirement):	TRIEX	300269
-# TIAA-CREF Large-Cap Growth Fund (Retirement):	TILRX	4530785
-# TIAA-CREF Large-Cap Growth Index Fund (Retirement):	TRIRX	299525
-# TIAA-CREF Large-Cap Value Fund (Retirement):	TRLCX	301332
-# TIAA-CREF Large-Cap Value Index Fund (Retirement):	TRCVX	304333
-# TIAA-CREF Lifecycle 2010 Fund (Retirement):	TCLEX	302817
-# TIAA-CREF Lifecycle 2015 Fund (Retirement):	TCLIX	302393
-# TIAA-CREF Lifecycle 2020 Fund (Retirement):	TCLTX	307774
-# TIAA-CREF Lifecycle 2025 Fund (Retirement):	TCLFX	313994
-# TIAA-CREF Lifecycle 2030 Fund (Retirement):	TCLNX	307240
-# TIAA-CREF Lifecycle 2035 Fund (Retirement):	TCLRX	309003
-# TIAA-CREF Lifecycle 2040 Fund (Retirement):	TCLOX	300959
-# TIAA-CREF Lifecycle 2045 Fund (Retirement):	TTFRX	9467597
-# TIAA-CREF Lifecycle 2050 Fund (Retirement):	TLFRX	9467596
-# TIAA-CREF Lifecycle 2055 Fund (Retirement):	TTRLX	34211330
-# TIAA-CREF Lifecycle Index 2010 Fund (Retirement):	TLTRX	21066482
-# TIAA-CREF Lifecycle Index 2015 Fund (Retirement):	TLGRX	21066496
-# TIAA-CREF Lifecycle Index 2020 Fund (Retirement):	TLWRX	21066479
-# TIAA-CREF Lifecycle Index 2025 Fund (Retirement):	TLQRX	21066485
-# TIAA-CREF Lifecycle Index 2030 Fund (Retirement):	TLHRX	21066435
-# TIAA-CREF Lifecycle Index 2035 Fund (Retirement):	TLYRX	21066475
-# TIAA-CREF Lifecycle Index 2040 Fund (Retirement):	TLZRX	21066473
-# TIAA-CREF Lifecycle Index 2045 Fund (Retirement):	TLMRX	21066488
-# TIAA-CREF Lifecycle Index 2050 Fund (Retirement):	TLLRX	21066490
-# TIAA-CREF Lifecycle Index 2055 Fund (Retirement):	TTIRX	34211328
-# TIAA-CREF Lifecycle Index Retirement Income Fund (Retirement):	TRCIX	21066468
-# TIAA-CREF Lifecycle Retirement Income Fund (Retirement):	TLIRX	9467594
-# TIAA-CREF Lifestyle Aggressive Growth Fund (Retirement):	TSARX	40508431
-# TIAA-CREF Lifestyle Conservative Fund (Retirement):	TSCTX	40508433
-# TIAA-CREF Lifestyle Growth Fund (Retirement):	TSGRX	40508437
-# TIAA-CREF Lifestyle Income Fund (Retirement):	TLSRX	40508427
-# TIAA-CREF Lifestyle Moderate Fund (Retirement):	TSMTX	40508460
-# TIAA-CREF Managed Allocation Fund (Retirement):	TITRX	4530825
-# TIAA-CREF Mid-Cap Growth Fund (Retirement):	TRGMX	305499
-# TIAA-CREF Mid-Cap Value Fund (Retirement):	TRVRX	315272
-# TIAA-CREF Money Market Fund (Retirement):	TIEXX	4530771
-# TIAA-CREF Real Estate Securities Fund (Retirement):	TRRSX	300081
-# TIAA-CREF S&P 500 Index Fund (Retirement):	TRSPX	306105
-# TIAA-CREF Short-Term Bond Fund (Retirement):	TISRX	4530818
-# TIAA-CREF Small-Cap Blend Index Fund (Retirement):	TRBIX	314644
-# TIAA-CREF Small-Cap Equity Fund (Retirement):	TRSEX	299968
-# TIAA-CREF Social Choice Equity Fund (Retirement):	TRSCX	300078
-# TIAA-CREF Bond Fund (Institutional):	TIBDX	307276
-# TIAA-CREF Bond Index Fund (Institutional):	TBIIX	20739664
-# TIAA-CREF Bond Plus Fund (Institutional):	TIBFX	4530820
-# TIAA-CREF Emerging Markets Equity Fund (Institutional):	TEMLX	26176540
-# TIAA-CREF Emerging Markets Equity Index Fund (Institutional):	TEQLX	26176544
-# TIAA-CREF Enhanced International Equity Index Fund (Institutional):	TFIIX	9467603
-# TIAA-CREF Enhanced Large-Cap Growth Index Fund (Institutional):	TLIIX	9467602
-# TIAA-CREF Enhanced Large-Cap Value Index Fund (Institutional):	TEVIX	9467606
-# TIAA-CREF Equity Index Fund (Institutional):	TIEIX	301718
-# TIAA-CREF Global Natural Resources Fund (Institutional):	TNRIX	39444916
-# TIAA-CREF Growth & Income Fund (Institutional):	TIGRX	314719
-# TIAA-CREF High Yield Fund (Institutional):	TIHYX	4530798
-# TIAA-CREF Inflation-Linked Bond Fund (Institutional):	TIILX	316693
-# TIAA-CREF International Equity Fund (Institutional):	TIIEX	305980
-# TIAA-CREF International Equity Index Fund (Institutional):	TCIEX	303673
-# TIAA-CREF Large-Cap Growth Fund (Institutional):	TILGX	4530800
-# TIAA-CREF Large-Cap Growth Index Fund (Institutional):	TILIX	297809
-# TIAA-CREF Large-Cap Value Fund (Institutional):	TRLIX	300692
-# TIAA-CREF Large-Cap Value Index Fund (Institutional):	TILVX	302308
-# TIAA-CREF Lifecycle 2010 Fund (Institutional):	TCTIX	4912376
-# TIAA-CREF Lifecycle 2015 Fund (Institutional):	TCNIX	4912355
-# TIAA-CREF Lifecycle 2020 Fund (Institutional):	TCWIX	4912377
-# TIAA-CREF Lifecycle 2025 Fund (Institutional):	TCYIX	4912384
-# TIAA-CREF Lifecycle 2030 Fund (Institutional):	TCRIX	4912364
-# TIAA-CREF Lifecycle 2035 Fund (Institutional):	TCIIX	4912375
-# TIAA-CREF Lifecycle 2040 Fund (Institutional):	TCOIX	4912387
-# TIAA-CREF Lifecycle 2045 Fund (Institutional):	TTFIX	9467607
-# TIAA-CREF Lifecycle 2050 Fund (Institutional):	TFTIX	9467601
-# TIAA-CREF Lifecycle 2055 Fund (Institutional):	TTRIX	34211329
-# TIAA-CREF Lifecycle Index 2010 Fund (Institutional):	TLTIX	21066484
-# TIAA-CREF Lifecycle Index 2015 Fund (Institutional):	TLFIX	21066498
-# TIAA-CREF Lifecycle Index 2020 Fund (Institutional):	TLWIX	21066480
-# TIAA-CREF Lifecycle Index 2025 Fund (Institutional):	TLQIX	21066486
-# TIAA-CREF Lifecycle Index 2030 Fund (Institutional):	TLHIX	21066495
-# TIAA-CREF Lifecycle Index 2035 Fund (Institutional):	TLYIX	21066477
-# TIAA-CREF Lifecycle Index 2040 Fund (Institutional):	TLZIX	21066474
-# TIAA-CREF Lifecycle Index 2045 Fund (Institutional):	TLXIX	21066478
-# TIAA-CREF Lifecycle Index 2050 Fund (Institutional):	TLLIX	21066492
-# TIAA-CREF Lifecycle Index 2055 Fund (Institutional):	TTIIX	34211326
-# TIAA-CREF Lifecycle Index Retirement Income Fund (Institutional):	TRILX	21066463
-# TIAA-CREF Lifecycle Retirement Income Fund (Institutional):	TLRIX	9467595
-# TIAA-CREF Lifestyle Aggressive Growth Fund (Institutional):	TSAIX	40508428
-# TIAA-CREF Lifestyle Conservative Fund (Institutional):	TCSIX	40508425
-# TIAA-CREF Lifestyle Growth Fund (Institutional):	TSGGX	40508434
-# TIAA-CREF Lifestyle Income Fund (Institutional):	TSITX	40508450
-# TIAA-CREF Lifestyle Moderate Fund (Institutional):	TSIMX	40508443
-# TIAA-CREF Managed Allocation Fund (Institutional):	TIMIX	4530787
-# TIAA-CREF Mid-Cap Growth Fund (Institutional):	TRPWX	297210
-# TIAA-CREF Mid-Cap Value Fund (Institutional):	TIMVX	316178
-# TIAA-CREF Money Market Fund (Institutional):	TCIXX	313650
-# TIAA-CREF Real Estate Securities Fund (Institutional):	TIREX	303475
-# TIAA-CREF S&P 500 Index Fund (Institutional):	TISPX	306658
-# TIAA-CREF Short-Term Bond Fund (Institutional):	TISIX	4530784
-# TIAA-CREF Small-Cap Blend Index Fund (Institutional):	TISBX	309018
-# TIAA-CREF Small-Cap Equity Fund (Institutional):	TISEX	301622
-# TIAA-CREF Social Choice Equity Fund (Institutional):	TISCX	301897
-# TIAA-CREF Tax-Exempt Bond Fund (Institutional):	TITIX	4530819
-# TIAA-CREF Bond Fund (Retail):	TIORX	4530794
-# TIAA-CREF Bond Index Fund (Retail):	TBILX	20739663
-# TIAA-CREF Bond Plus Fund (Retail):	TCBPX	4530788
-# TIAA-CREF Emerging Markets Equity Fund (Retail):	TEMRX	26176542
-# TIAA-CREF Emerging Markets Equity Index Fund (Retail):	TEQKX	26176545
-# TIAA-CREF Equity Index Fund (Retail):	TINRX	4530797
-# TIAA-CREF Global Natural Resources Fund (Retail):	TNRLX	39444917
-# TIAA-CREF Growth & Income Fund (Retail):	TIIRX	4530790
-# TIAA-CREF High Yield Fund (Retail):	TIYRX	4530830
-# TIAA-CREF Inflation-Linked Bond Fund (Retail):	TCILX	313727
-# TIAA-CREF International Equity Fund (Retail):	TIERX	4530827
-# TIAA-CREF Large-Cap Growth Fund (Retail):	TIRTX	4530791
-# TIAA-CREF Large-Cap Value Fund (Retail):	TCLCX	302696
-# TIAA-CREF Lifecycle Retirement Income Fund (Retail):	TLRRX	9467600
-# TIAA-CREF Lifestyle Aggressive Growth Fund (Retail):	TSALX	40508429
-# TIAA-CREF Lifestyle Conservative Fund (Retail):	TSCLX	40508432
-# TIAA-CREF Lifestyle Growth Fund (Retail):	TSGLX	40508435
-# TIAA-CREF Lifestyle Income Fund (Retail):	TSILX	40508438
-# TIAA-CREF Lifestyle Moderate Fund (Retail):	TSMLX	40508453
-# TIAA-CREF Managed Allocation Fund (Retail):	TIMRX	4530817
-# TIAA-CREF Mid-Cap Growth Fund (Retail):	TCMGX	305208
-# TIAA-CREF Mid-Cap Value Fund (Retail):	TCMVX	313995
-# TIAA-CREF Money Market Fund (Retail):	TIRXX	4530775
-# TIAA-CREF Real Estate Securities Fund (Retail):	TCREX	309567
-# TIAA-CREF Short-Term Bond Fund (Retail):	TCTRX	4530822
-# TIAA-CREF Small-Cap Equity Fund (Retail):	TCSEX	297477
-# TIAA-CREF Social Choice Equity Fund (Retail):	TICRX	4530792
-# TIAA-CREF Tax-Exempt Bond Fund (Retail):	TIXRX	4530793
-# TIAA-CREF Bond Fund (Premier):	TIDPX	21066506
-# TIAA-CREF Bond Index Fund (Premier):	TBIPX	21066534
-# TIAA-CREF Bond Plus Fund (Premier):	TBPPX	21066533
-# TIAA-CREF Emerging Markets Equity Fund (Premier):	TEMPX	26176541
-# TIAA-CREF Emerging Markets Equity Index Fund (Premier):	TEQPX	26176546
-# TIAA-CREF Equity Index Fund (Premier):	TCEPX	21066530
-# TIAA-CREF Global Natural Resources Fund (Premier):	TNRPX	39444918
-# TIAA-CREF Growth & Income Fund (Premier):	TRPGX	21066461
-# TIAA-CREF High Yield Fund (Premier):	TIHPX	21066501
-# TIAA-CREF Inflation-Linked Bond Fund (Premier):	TIKPX	21066500
-# TIAA-CREF International Equity Fund (Premier):	TREPX	21066466
-# TIAA-CREF International Equity Index Fund (Premier):	TRIPX	21066462
-# TIAA-CREF Large-Cap Growth Fund (Premier):	TILPX	21066499
-# TIAA-CREF Large-Cap Value Fund (Premier):	TRCPX	21066467
-# TIAA-CREF Lifecycle 2010 Fund (Premier):	TCTPX	21066521
-# TIAA-CREF Lifecycle 2015 Fund (Premier):	TCFPX	21066528
-# TIAA-CREF Lifecycle 2020 Fund (Premier):	TCWPX	21066518
-# TIAA-CREF Lifecycle 2025 Fund (Premier):	TCQPX	21066522
-# TIAA-CREF Lifecycle 2030 Fund (Premier):	TCHPX	21066527
-# TIAA-CREF Lifecycle 2035 Fund (Premier):	TCYPX	21066517
-# TIAA-CREF Lifecycle 2040 Fund (Premier):	TCZPX	21066516
-# TIAA-CREF Lifecycle 2045 Fund (Premier):	TTFPX	21066444
-# TIAA-CREF Lifecycle 2050 Fund (Premier):	TCLPX	21066526
-# TIAA-CREF Lifecycle 2055 Fund (Premier):	TTRPX	34211331
-# TIAA-CREF Lifecycle Index 2010 Fund (Premier):	TLTPX	21066483
-# TIAA-CREF Lifecycle Index 2015 Fund (Premier):	TLFPX	21066497
-# TIAA-CREF Lifecycle Index 2020 Fund (Premier):	TLWPX	21066434
-# TIAA-CREF Lifecycle Index 2025 Fund (Premier):	TLVPX	21066481
-# TIAA-CREF Lifecycle Index 2030 Fund (Premier):	TLHPX	21066494
-# TIAA-CREF Lifecycle Index 2035 Fund (Premier):	TLYPX	21066476
-# TIAA-CREF Lifecycle Index 2040 Fund (Premier):	TLPRX	21066487
-# TIAA-CREF Lifecycle Index 2045 Fund (Premier):	TLMPX	21066489
-# TIAA-CREF Lifecycle Index 2050 Fund (Premier):	TLLPX	21066491
-# TIAA-CREF Lifecycle Index 2055 Fund (Premier):	TTIPX	34211327
-# TIAA-CREF Lifecycle Index Retirement Income Fund (Premier):	TLIPX	21066493
-# TIAA-CREF Lifecycle Retirement Income Fund (Premier):	TPILX	21066470
-# TIAA-CREF Lifestyle Aggressive Growth Fund (Premier):	TSAPX	40508430
-# TIAA-CREF Lifestyle Conservative Fund (Premier):	TLSPX	40508426
-# TIAA-CREF Lifestyle Growth Fund (Premier):	TSGPX	40508436
-# TIAA-CREF Lifestyle Income Fund (Premier):	TSIPX	40508451
-# TIAA-CREF Lifestyle Moderate Fund (Premier):	TSMPX	40508456
-# TIAA-CREF Mid-Cap Growth Fund (Premier):	TRGPX	21066464
-# TIAA-CREF Mid-Cap Value Fund (Premier):	TRVPX	21066455
-# TIAA-CREF Money Market Fund (Premier):	TPPXX	21066469
-# TIAA-CREF Real Estate Securities Fund (Premier):	TRRPX	21066459
-# TIAA-CREF Short-Term Bond Fund (Premier):	TSTPX	21066445
-# TIAA-CREF Small-Cap Equity Fund (Premier):	TSRPX	21066446
-# TIAA-CREF Social Choice Equity Fund (Premier):	TRPSX	21066460
+# Stock: 				CREFstok
+# Money Market:				CREFmony
+# Equity Index:				CREFequi
+# Inf-Linked Bond:			CREFinfb
+# Bond Market:				CREFbond
+# Social Choice:			CREFsoci
+# Global Equities:			CREFglob
+# Growth:				CREFgrow
+# TIAA Real Estate:			TIAAreal
+# PA Stock Index:			TIAAsndx
+# PA Select Stock:			TLSIX
+# PA Select Growth Equity:		TLGEX
+# PA Select Growth Income:		TLGIX
+# PA Select Int'l Equity:		TLIEX
+# PA Select Social Choice:		TLSCX
+# PA Select Large Cap Value:		TLLCX
+# PA Select Small Cap Equity:		TLCEX
+# PA Select Real Estate:		TLREX
+
+# TIAA-CREF Money Market:		TIAXX
+# TIAA-CREF Bond Plus:			TIPBX
+# TIAA-CREF High-Yield Bond:		TCHYX
+# TIAA-CREF Inflation-Linked Bond:	TCILX
+# TIAA-CREF Short-Term Bond:		TCSTX
+# TIAA-CREF Tax-Exempt Bond:		TCTEX
+# TIAA-CREF Real Estate Securities:	TCREX
+# TIAA-CREF Equity Index:		TCEIX
+# TIAA-CREF Growth Equity:		TIGEX
+# TIAA-CREF Growth & Income:		TIGIX
+# TIAA-CREF International Equity:	TIINX
+# TIAA-CREF Large-Cap Value:		TCLCX
+# TIAA-CREF Mid-Cap Growth:		TCMGX
+# TIAA-CREF Mid-Cap Value:		TCMVX
+# TIAA-CREF Small-Cap Equity:		TCSEX
+# TIAA-CREF Social Choice Equity:	TCSCX
+# TIAA-CREF Managed Allocation:		TIMAX
+
 
 #
 # This subroutine was written by Brent Neal <brentn@users.sourceforge.net>
 # Modified to support new TIAA-CREF webpages by Kevin Foss <kfoss@maine.edu> and Brent Neal
-# Modified to support new 2012 TIAA-CREF webpages by Carl LaCombe <calcisme@gmail.com>
 
 #
 # TODO:
@@ -268,729 +107,236 @@ sub labels { return (tiaacref => [qw/method symbol exchange name date isodate na
 # The TIAA-CREF cgi allows you to specify the exact dates for which to retrieve
 # price data. That functionality could be worked into this subroutine.
 # Currently, we only grab the most recent price data.
-#
+# 
 
 sub tiaacref
 {
-	my $quoter = shift;
-	if (! %tiaacref_ids ) { #build a name hash for the annuities (once only)
-		$tiaacref_ids{"CREFbond"} = "CREF Bond Market Account";
-		$tiaacref_ids{"CREFequi"} = "CREF Equity Index Account";
-		$tiaacref_ids{"CREFglob"} = "CREF Global Equities Account";
-		$tiaacref_ids{"CREFgrow"} = "CREF Growth Account";
-		$tiaacref_ids{"CREFinfb"} = "CREF Inflation-Linked Bond Account";
-		$tiaacref_ids{"CREFmony"} = "CREF Money Market Account";
-		$tiaacref_ids{"CREFsoci"} = "CREF Social Choice Account";
-		$tiaacref_ids{"CREFstok"} = "CREF Stock Account";
-		$tiaacref_ids{"TIAAreal"} = "TIAA Real Estate Account";
-		$tiaacref_ids{"TIDRX"} = "TIAA-CREF Bond Fund (Retirement)";
-		$tiaacref_ids{"TBIRX"} = "TIAA-CREF Bond Index Fund (Retirement)";
-		$tiaacref_ids{"TCBRX"} = "TIAA-CREF Bond Plus Fund (Retirement)";
-		$tiaacref_ids{"TEMSX"} = "TIAA-CREF Emerging Markets Equity Fund (Retirement)";
-		$tiaacref_ids{"TEQSX"} = "TIAA-CREF Emerging Markets Equity Index Fund (Retirement)";
-		$tiaacref_ids{"TIQRX"} = "TIAA-CREF Equity Index Fund (Retirement)";
-		$tiaacref_ids{"TNRRX"} = "TIAA-CREF Global Natural Resources Fund (Retirement)";
-		$tiaacref_ids{"TRGIX"} = "TIAA-CREF Growth & Income Fund (Retirement)";
-		$tiaacref_ids{"TIHRX"} = "TIAA-CREF High Yield Fund (Retirement)";
-		$tiaacref_ids{"TIKRX"} = "TIAA-CREF Inflation-Linked Bond Fund (Retirement)";
-		$tiaacref_ids{"TRERX"} = "TIAA-CREF International Equity Fund (Retirement)";
-		$tiaacref_ids{"TRIEX"} = "TIAA-CREF International Equity Index Fund (Retirement)";
-		$tiaacref_ids{"TILRX"} = "TIAA-CREF Large-Cap Growth Fund (Retirement)";
-		$tiaacref_ids{"TRIRX"} = "TIAA-CREF Large-Cap Growth Index Fund (Retirement)";
-		$tiaacref_ids{"TRLCX"} = "TIAA-CREF Large-Cap Value Fund (Retirement)";
-		$tiaacref_ids{"TRCVX"} = "TIAA-CREF Large-Cap Value Index Fund (Retirement)";
-		$tiaacref_ids{"TCLEX"} = "TIAA-CREF Lifecycle 2010 Fund (Retirement)";
-		$tiaacref_ids{"TCLIX"} = "TIAA-CREF Lifecycle 2015 Fund (Retirement)";
-		$tiaacref_ids{"TCLTX"} = "TIAA-CREF Lifecycle 2020 Fund (Retirement)";
-		$tiaacref_ids{"TCLFX"} = "TIAA-CREF Lifecycle 2025 Fund (Retirement)";
-		$tiaacref_ids{"TCLNX"} = "TIAA-CREF Lifecycle 2030 Fund (Retirement)";
-		$tiaacref_ids{"TCLRX"} = "TIAA-CREF Lifecycle 2035 Fund (Retirement)";
-		$tiaacref_ids{"TCLOX"} = "TIAA-CREF Lifecycle 2040 Fund (Retirement)";
-		$tiaacref_ids{"TTFRX"} = "TIAA-CREF Lifecycle 2045 Fund (Retirement)";
-		$tiaacref_ids{"TLFRX"} = "TIAA-CREF Lifecycle 2050 Fund (Retirement)";
-		$tiaacref_ids{"TTRLX"} = "TIAA-CREF Lifecycle 2055 Fund (Retirement)";
-		$tiaacref_ids{"TLTRX"} = "TIAA-CREF Lifecycle Index 2010 Fund (Retirement)";
-		$tiaacref_ids{"TLGRX"} = "TIAA-CREF Lifecycle Index 2015 Fund (Retirement)";
-		$tiaacref_ids{"TLWRX"} = "TIAA-CREF Lifecycle Index 2020 Fund (Retirement)";
-		$tiaacref_ids{"TLQRX"} = "TIAA-CREF Lifecycle Index 2025 Fund (Retirement)";
-		$tiaacref_ids{"TLHRX"} = "TIAA-CREF Lifecycle Index 2030 Fund (Retirement)";
-		$tiaacref_ids{"TLYRX"} = "TIAA-CREF Lifecycle Index 2035 Fund (Retirement)";
-		$tiaacref_ids{"TLZRX"} = "TIAA-CREF Lifecycle Index 2040 Fund (Retirement)";
-		$tiaacref_ids{"TLMRX"} = "TIAA-CREF Lifecycle Index 2045 Fund (Retirement)";
-		$tiaacref_ids{"TLLRX"} = "TIAA-CREF Lifecycle Index 2050 Fund (Retirement)";
-		$tiaacref_ids{"TTIRX"} = "TIAA-CREF Lifecycle Index 2055 Fund (Retirement)";
-		$tiaacref_ids{"TRCIX"} = "TIAA-CREF Lifecycle Index Retirement Income Fund (Retirement)";
-		$tiaacref_ids{"TLIRX"} = "TIAA-CREF Lifecycle Retirement Income Fund (Retirement)";
-		$tiaacref_ids{"TSARX"} = "TIAA-CREF Lifestyle Aggressive Growth Fund (Retirement)";
-		$tiaacref_ids{"TSCTX"} = "TIAA-CREF Lifestyle Conservative Fund (Retirement)";
-		$tiaacref_ids{"TSGRX"} = "TIAA-CREF Lifestyle Growth Fund (Retirement)";
-		$tiaacref_ids{"TLSRX"} = "TIAA-CREF Lifestyle Income Fund (Retirement)";
-		$tiaacref_ids{"TSMTX"} = "TIAA-CREF Lifestyle Moderate Fund (Retirement)";
-		$tiaacref_ids{"TITRX"} = "TIAA-CREF Managed Allocation Fund (Retirement)";
-		$tiaacref_ids{"TRGMX"} = "TIAA-CREF Mid-Cap Growth Fund (Retirement)";
-		$tiaacref_ids{"TRVRX"} = "TIAA-CREF Mid-Cap Value Fund (Retirement)";
-		$tiaacref_ids{"TIEXX"} = "TIAA-CREF Money Market Fund (Retirement)";
-		$tiaacref_ids{"TRRSX"} = "TIAA-CREF Real Estate Securities Fund (Retirement)";
-		$tiaacref_ids{"TRSPX"} = "TIAA-CREF S&P 500 Index Fund (Retirement)";
-		$tiaacref_ids{"TISRX"} = "TIAA-CREF Short-Term Bond Fund (Retirement)";
-		$tiaacref_ids{"TRBIX"} = "TIAA-CREF Small-Cap Blend Index Fund (Retirement)";
-		$tiaacref_ids{"TRSEX"} = "TIAA-CREF Small-Cap Equity Fund (Retirement)";
-		$tiaacref_ids{"TRSCX"} = "TIAA-CREF Social Choice Equity Fund (Retirement)";
-		$tiaacref_ids{"TIBDX"} = "TIAA-CREF Bond Fund (Institutional)";
-		$tiaacref_ids{"TBIIX"} = "TIAA-CREF Bond Index Fund (Institutional)";
-		$tiaacref_ids{"TIBFX"} = "TIAA-CREF Bond Plus Fund (Institutional)";
-		$tiaacref_ids{"TEMLX"} = "TIAA-CREF Emerging Markets Equity Fund (Institutional)";
-		$tiaacref_ids{"TEQLX"} = "TIAA-CREF Emerging Markets Equity Index Fund (Institutional)";
-		$tiaacref_ids{"TFIIX"} = "TIAA-CREF Enhanced International Equity Index Fund (Institutional)";
-		$tiaacref_ids{"TLIIX"} = "TIAA-CREF Enhanced Large-Cap Growth Index Fund (Institutional)";
-		$tiaacref_ids{"TEVIX"} = "TIAA-CREF Enhanced Large-Cap Value Index Fund (Institutional)";
-		$tiaacref_ids{"TIEIX"} = "TIAA-CREF Equity Index Fund (Institutional)";
-		$tiaacref_ids{"TNRIX"} = "TIAA-CREF Global Natural Resources Fund (Institutional)";
-		$tiaacref_ids{"TIGRX"} = "TIAA-CREF Growth & Income Fund (Institutional)";
-		$tiaacref_ids{"TIHYX"} = "TIAA-CREF High Yield Fund (Institutional)";
-		$tiaacref_ids{"TIILX"} = "TIAA-CREF Inflation-Linked Bond Fund (Institutional)";
-		$tiaacref_ids{"TIIEX"} = "TIAA-CREF International Equity Fund (Institutional)";
-		$tiaacref_ids{"TCIEX"} = "TIAA-CREF International Equity Index Fund (Institutional)";
-		$tiaacref_ids{"TILGX"} = "TIAA-CREF Large-Cap Growth Fund (Institutional)";
-		$tiaacref_ids{"TILIX"} = "TIAA-CREF Large-Cap Growth Index Fund (Institutional)";
-		$tiaacref_ids{"TRLIX"} = "TIAA-CREF Large-Cap Value Fund (Institutional)";
-		$tiaacref_ids{"TILVX"} = "TIAA-CREF Large-Cap Value Index Fund (Institutional)";
-		$tiaacref_ids{"TCTIX"} = "TIAA-CREF Lifecycle 2010 Fund (Institutional)";
-		$tiaacref_ids{"TCNIX"} = "TIAA-CREF Lifecycle 2015 Fund (Institutional)";
-		$tiaacref_ids{"TCWIX"} = "TIAA-CREF Lifecycle 2020 Fund (Institutional)";
-		$tiaacref_ids{"TCYIX"} = "TIAA-CREF Lifecycle 2025 Fund (Institutional)";
-		$tiaacref_ids{"TCRIX"} = "TIAA-CREF Lifecycle 2030 Fund (Institutional)";
-		$tiaacref_ids{"TCIIX"} = "TIAA-CREF Lifecycle 2035 Fund (Institutional)";
-		$tiaacref_ids{"TCOIX"} = "TIAA-CREF Lifecycle 2040 Fund (Institutional)";
-		$tiaacref_ids{"TTFIX"} = "TIAA-CREF Lifecycle 2045 Fund (Institutional)";
-		$tiaacref_ids{"TFTIX"} = "TIAA-CREF Lifecycle 2050 Fund (Institutional)";
-		$tiaacref_ids{"TTRIX"} = "TIAA-CREF Lifecycle 2055 Fund (Institutional)";
-		$tiaacref_ids{"TLTIX"} = "TIAA-CREF Lifecycle Index 2010 Fund (Institutional)";
-		$tiaacref_ids{"TLFIX"} = "TIAA-CREF Lifecycle Index 2015 Fund (Institutional)";
-		$tiaacref_ids{"TLWIX"} = "TIAA-CREF Lifecycle Index 2020 Fund (Institutional)";
-		$tiaacref_ids{"TLQIX"} = "TIAA-CREF Lifecycle Index 2025 Fund (Institutional)";
-		$tiaacref_ids{"TLHIX"} = "TIAA-CREF Lifecycle Index 2030 Fund (Institutional)";
-		$tiaacref_ids{"TLYIX"} = "TIAA-CREF Lifecycle Index 2035 Fund (Institutional)";
-		$tiaacref_ids{"TLZIX"} = "TIAA-CREF Lifecycle Index 2040 Fund (Institutional)";
-		$tiaacref_ids{"TLXIX"} = "TIAA-CREF Lifecycle Index 2045 Fund (Institutional)";
-		$tiaacref_ids{"TLLIX"} = "TIAA-CREF Lifecycle Index 2050 Fund (Institutional)";
-		$tiaacref_ids{"TTIIX"} = "TIAA-CREF Lifecycle Index 2055 Fund (Institutional)";
-		$tiaacref_ids{"TRILX"} = "TIAA-CREF Lifecycle Index Retirement Income Fund (Institutional)";
-		$tiaacref_ids{"TLRIX"} = "TIAA-CREF Lifecycle Retirement Income Fund (Institutional)";
-		$tiaacref_ids{"TSAIX"} = "TIAA-CREF Lifestyle Aggressive Growth Fund (Institutional)";
-		$tiaacref_ids{"TCSIX"} = "TIAA-CREF Lifestyle Conservative Fund (Institutional)";
-		$tiaacref_ids{"TSGGX"} = "TIAA-CREF Lifestyle Growth Fund (Institutional)";
-		$tiaacref_ids{"TSITX"} = "TIAA-CREF Lifestyle Income Fund (Institutional)";
-		$tiaacref_ids{"TSIMX"} = "TIAA-CREF Lifestyle Moderate Fund (Institutional)";
-		$tiaacref_ids{"TIMIX"} = "TIAA-CREF Managed Allocation Fund (Institutional)";
-		$tiaacref_ids{"TRPWX"} = "TIAA-CREF Mid-Cap Growth Fund (Institutional)";
-		$tiaacref_ids{"TIMVX"} = "TIAA-CREF Mid-Cap Value Fund (Institutional)";
-		$tiaacref_ids{"TCIXX"} = "TIAA-CREF Money Market Fund (Institutional)";
-		$tiaacref_ids{"TIREX"} = "TIAA-CREF Real Estate Securities Fund (Institutional)";
-		$tiaacref_ids{"TISPX"} = "TIAA-CREF S&P 500 Index Fund (Institutional)";
-		$tiaacref_ids{"TISIX"} = "TIAA-CREF Short-Term Bond Fund (Institutional)";
-		$tiaacref_ids{"TISBX"} = "TIAA-CREF Small-Cap Blend Index Fund (Institutional)";
-		$tiaacref_ids{"TISEX"} = "TIAA-CREF Small-Cap Equity Fund (Institutional)";
-		$tiaacref_ids{"TISCX"} = "TIAA-CREF Social Choice Equity Fund (Institutional)";
-		$tiaacref_ids{"TITIX"} = "TIAA-CREF Tax-Exempt Bond Fund (Institutional)";
-		$tiaacref_ids{"TIORX"} = "TIAA-CREF Bond Fund (Retail)";
-		$tiaacref_ids{"TBILX"} = "TIAA-CREF Bond Index Fund (Retail)";
-		$tiaacref_ids{"TCBPX"} = "TIAA-CREF Bond Plus Fund (Retail)";
-		$tiaacref_ids{"TEMRX"} = "TIAA-CREF Emerging Markets Equity Fund (Retail)";
-		$tiaacref_ids{"TEQKX"} = "TIAA-CREF Emerging Markets Equity Index Fund (Retail)";
-		$tiaacref_ids{"TINRX"} = "TIAA-CREF Equity Index Fund (Retail)";
-		$tiaacref_ids{"TNRLX"} = "TIAA-CREF Global Natural Resources Fund (Retail)";
-		$tiaacref_ids{"TIIRX"} = "TIAA-CREF Growth & Income Fund (Retail)";
-		$tiaacref_ids{"TIYRX"} = "TIAA-CREF High Yield Fund (Retail)";
-		$tiaacref_ids{"TCILX"} = "TIAA-CREF Inflation-Linked Bond Fund (Retail)";
-		$tiaacref_ids{"TIERX"} = "TIAA-CREF International Equity Fund (Retail)";
-		$tiaacref_ids{"TIRTX"} = "TIAA-CREF Large-Cap Growth Fund (Retail)";
-		$tiaacref_ids{"TCLCX"} = "TIAA-CREF Large-Cap Value Fund (Retail)";
-		$tiaacref_ids{"TLRRX"} = "TIAA-CREF Lifecycle Retirement Income Fund (Retail)";
-		$tiaacref_ids{"TSALX"} = "TIAA-CREF Lifestyle Aggressive Growth Fund (Retail)";
-		$tiaacref_ids{"TSCLX"} = "TIAA-CREF Lifestyle Conservative Fund (Retail)";
-		$tiaacref_ids{"TSGLX"} = "TIAA-CREF Lifestyle Growth Fund (Retail)";
-		$tiaacref_ids{"TSILX"} = "TIAA-CREF Lifestyle Income Fund (Retail)";
-		$tiaacref_ids{"TSMLX"} = "TIAA-CREF Lifestyle Moderate Fund (Retail)";
-		$tiaacref_ids{"TIMRX"} = "TIAA-CREF Managed Allocation Fund (Retail)";
-		$tiaacref_ids{"TCMGX"} = "TIAA-CREF Mid-Cap Growth Fund (Retail)";
-		$tiaacref_ids{"TCMVX"} = "TIAA-CREF Mid-Cap Value Fund (Retail)";
-		$tiaacref_ids{"TIRXX"} = "TIAA-CREF Money Market Fund (Retail)";
-		$tiaacref_ids{"TCREX"} = "TIAA-CREF Real Estate Securities Fund (Retail)";
-		$tiaacref_ids{"TCTRX"} = "TIAA-CREF Short-Term Bond Fund (Retail)";
-		$tiaacref_ids{"TCSEX"} = "TIAA-CREF Small-Cap Equity Fund (Retail)";
-		$tiaacref_ids{"TICRX"} = "TIAA-CREF Social Choice Equity Fund (Retail)";
-		$tiaacref_ids{"TIXRX"} = "TIAA-CREF Tax-Exempt Bond Fund (Retail)";
-		$tiaacref_ids{"TIDPX"} = "TIAA-CREF Bond Fund (Premier)";
-		$tiaacref_ids{"TBIPX"} = "TIAA-CREF Bond Index Fund (Premier)";
-		$tiaacref_ids{"TBPPX"} = "TIAA-CREF Bond Plus Fund (Premier)";
-		$tiaacref_ids{"TEMPX"} = "TIAA-CREF Emerging Markets Equity Fund (Premier)";
-		$tiaacref_ids{"TEQPX"} = "TIAA-CREF Emerging Markets Equity Index Fund (Premier)";
-		$tiaacref_ids{"TCEPX"} = "TIAA-CREF Equity Index Fund (Premier)";
-		$tiaacref_ids{"TNRPX"} = "TIAA-CREF Global Natural Resources Fund (Premier)";
-		$tiaacref_ids{"TRPGX"} = "TIAA-CREF Growth & Income Fund (Premier)";
-		$tiaacref_ids{"TIHPX"} = "TIAA-CREF High Yield Fund (Premier)";
-		$tiaacref_ids{"TIKPX"} = "TIAA-CREF Inflation-Linked Bond Fund (Premier)";
-		$tiaacref_ids{"TREPX"} = "TIAA-CREF International Equity Fund (Premier)";
-		$tiaacref_ids{"TRIPX"} = "TIAA-CREF International Equity Index Fund (Premier)";
-		$tiaacref_ids{"TILPX"} = "TIAA-CREF Large-Cap Growth Fund (Premier)";
-		$tiaacref_ids{"TRCPX"} = "TIAA-CREF Large-Cap Value Fund (Premier)";
-		$tiaacref_ids{"TCTPX"} = "TIAA-CREF Lifecycle 2010 Fund (Premier)";
-		$tiaacref_ids{"TCFPX"} = "TIAA-CREF Lifecycle 2015 Fund (Premier)";
-		$tiaacref_ids{"TCWPX"} = "TIAA-CREF Lifecycle 2020 Fund (Premier)";
-		$tiaacref_ids{"TCQPX"} = "TIAA-CREF Lifecycle 2025 Fund (Premier)";
-		$tiaacref_ids{"TCHPX"} = "TIAA-CREF Lifecycle 2030 Fund (Premier)";
-		$tiaacref_ids{"TCYPX"} = "TIAA-CREF Lifecycle 2035 Fund (Premier)";
-		$tiaacref_ids{"TCZPX"} = "TIAA-CREF Lifecycle 2040 Fund (Premier)";
-		$tiaacref_ids{"TTFPX"} = "TIAA-CREF Lifecycle 2045 Fund (Premier)";
-		$tiaacref_ids{"TCLPX"} = "TIAA-CREF Lifecycle 2050 Fund (Premier)";
-		$tiaacref_ids{"TTRPX"} = "TIAA-CREF Lifecycle 2055 Fund (Premier)";
-		$tiaacref_ids{"TLTPX"} = "TIAA-CREF Lifecycle Index 2010 Fund (Premier)";
-		$tiaacref_ids{"TLFPX"} = "TIAA-CREF Lifecycle Index 2015 Fund (Premier)";
-		$tiaacref_ids{"TLWPX"} = "TIAA-CREF Lifecycle Index 2020 Fund (Premier)";
-		$tiaacref_ids{"TLVPX"} = "TIAA-CREF Lifecycle Index 2025 Fund (Premier)";
-		$tiaacref_ids{"TLHPX"} = "TIAA-CREF Lifecycle Index 2030 Fund (Premier)";
-		$tiaacref_ids{"TLYPX"} = "TIAA-CREF Lifecycle Index 2035 Fund (Premier)";
-		$tiaacref_ids{"TLPRX"} = "TIAA-CREF Lifecycle Index 2040 Fund (Premier)";
-		$tiaacref_ids{"TLMPX"} = "TIAA-CREF Lifecycle Index 2045 Fund (Premier)";
-		$tiaacref_ids{"TLLPX"} = "TIAA-CREF Lifecycle Index 2050 Fund (Premier)";
-		$tiaacref_ids{"TTIPX"} = "TIAA-CREF Lifecycle Index 2055 Fund (Premier)";
-		$tiaacref_ids{"TLIPX"} = "TIAA-CREF Lifecycle Index Retirement Income Fund (Premier)";
-		$tiaacref_ids{"TPILX"} = "TIAA-CREF Lifecycle Retirement Income Fund (Premier)";
-		$tiaacref_ids{"TSAPX"} = "TIAA-CREF Lifestyle Aggressive Growth Fund (Premier)";
-		$tiaacref_ids{"TLSPX"} = "TIAA-CREF Lifestyle Conservative Fund (Premier)";
-		$tiaacref_ids{"TSGPX"} = "TIAA-CREF Lifestyle Growth Fund (Premier)";
-		$tiaacref_ids{"TSIPX"} = "TIAA-CREF Lifestyle Income Fund (Premier)";
-		$tiaacref_ids{"TSMPX"} = "TIAA-CREF Lifestyle Moderate Fund (Premier)";
-		$tiaacref_ids{"TRGPX"} = "TIAA-CREF Mid-Cap Growth Fund (Premier)";
-		$tiaacref_ids{"TRVPX"} = "TIAA-CREF Mid-Cap Value Fund (Premier)";
-		$tiaacref_ids{"TPPXX"} = "TIAA-CREF Money Market Fund (Premier)";
-		$tiaacref_ids{"TRRPX"} = "TIAA-CREF Real Estate Securities Fund (Premier)";
-		$tiaacref_ids{"TSTPX"} = "TIAA-CREF Short-Term Bond Fund (Premier)";
-		$tiaacref_ids{"TSRPX"} = "TIAA-CREF Small-Cap Equity Fund (Premier)";
-		$tiaacref_ids{"TRPSX"} = "TIAA-CREF Social Choice Equity Fund (Premier)";
-	}
-
-	if (! %tiaacref_vals) {
-		$tiaacref_vals{"CREFbond"} = "41081991";
-		$tiaacref_vals{"CREFequi"} = "41082540";
-		$tiaacref_vals{"CREFglob"} = "41081992";
-		$tiaacref_vals{"CREFgrow"} = "41082544";
-		$tiaacref_vals{"CREFinfb"} = "41088773";
-		$tiaacref_vals{"CREFmony"} = "41081993";
-		$tiaacref_vals{"CREFsoci"} = "41081994";
-		$tiaacref_vals{"CREFstok"} = "41081995";
-		$tiaacref_vals{"TIAAreal"} = "41091375";
-		$tiaacref_vals{"TIDRX"} = "4530828";
-		$tiaacref_vals{"TBIRX"} = "20739662";
-		$tiaacref_vals{"TCBRX"} = "4530816";
-		$tiaacref_vals{"TEMSX"} = "26176543";
-		$tiaacref_vals{"TEQSX"} = "26176547";
-		$tiaacref_vals{"TIQRX"} = "4530786";
-		$tiaacref_vals{"TNRRX"} = "39444919";
-		$tiaacref_vals{"TRGIX"} = "312536";
-		$tiaacref_vals{"TIHRX"} = "4530821";
-		$tiaacref_vals{"TIKRX"} = "4530829";
-		$tiaacref_vals{"TRERX"} = "302323";
-		$tiaacref_vals{"TRIEX"} = "300269";
-		$tiaacref_vals{"TILRX"} = "4530785";
-		$tiaacref_vals{"TRIRX"} = "299525";
-		$tiaacref_vals{"TRLCX"} = "301332";
-		$tiaacref_vals{"TRCVX"} = "304333";
-		$tiaacref_vals{"TCLEX"} = "302817";
-		$tiaacref_vals{"TCLIX"} = "302393";
-		$tiaacref_vals{"TCLTX"} = "307774";
-		$tiaacref_vals{"TCLFX"} = "313994";
-		$tiaacref_vals{"TCLNX"} = "307240";
-		$tiaacref_vals{"TCLRX"} = "309003";
-		$tiaacref_vals{"TCLOX"} = "300959";
-		$tiaacref_vals{"TTFRX"} = "9467597";
-		$tiaacref_vals{"TLFRX"} = "9467596";
-		$tiaacref_vals{"TTRLX"} = "34211330";
-		$tiaacref_vals{"TLTRX"} = "21066482";
-		$tiaacref_vals{"TLGRX"} = "21066496";
-		$tiaacref_vals{"TLWRX"} = "21066479";
-		$tiaacref_vals{"TLQRX"} = "21066485";
-		$tiaacref_vals{"TLHRX"} = "21066435";
-		$tiaacref_vals{"TLYRX"} = "21066475";
-		$tiaacref_vals{"TLZRX"} = "21066473";
-		$tiaacref_vals{"TLMRX"} = "21066488";
-		$tiaacref_vals{"TLLRX"} = "21066490";
-		$tiaacref_vals{"TTIRX"} = "34211328";
-		$tiaacref_vals{"TRCIX"} = "21066468";
-		$tiaacref_vals{"TLIRX"} = "9467594";
-		$tiaacref_vals{"TSARX"} = "40508431";
-		$tiaacref_vals{"TSCTX"} = "40508433";
-		$tiaacref_vals{"TSGRX"} = "40508437";
-		$tiaacref_vals{"TLSRX"} = "40508427";
-		$tiaacref_vals{"TSMTX"} = "40508460";
-		$tiaacref_vals{"TITRX"} = "4530825";
-		$tiaacref_vals{"TRGMX"} = "305499";
-		$tiaacref_vals{"TRVRX"} = "315272";
-		$tiaacref_vals{"TIEXX"} = "4530771";
-		$tiaacref_vals{"TRRSX"} = "300081";
-		$tiaacref_vals{"TRSPX"} = "306105";
-		$tiaacref_vals{"TISRX"} = "4530818";
-		$tiaacref_vals{"TRBIX"} = "314644";
-		$tiaacref_vals{"TRSEX"} = "299968";
-		$tiaacref_vals{"TRSCX"} = "300078";
-		$tiaacref_vals{"TIBDX"} = "307276";
-		$tiaacref_vals{"TBIIX"} = "20739664";
-		$tiaacref_vals{"TIBFX"} = "4530820";
-		$tiaacref_vals{"TEMLX"} = "26176540";
-		$tiaacref_vals{"TEQLX"} = "26176544";
-		$tiaacref_vals{"TFIIX"} = "9467603";
-		$tiaacref_vals{"TLIIX"} = "9467602";
-		$tiaacref_vals{"TEVIX"} = "9467606";
-		$tiaacref_vals{"TIEIX"} = "301718";
-		$tiaacref_vals{"TNRIX"} = "39444916";
-		$tiaacref_vals{"TIGRX"} = "314719";
-		$tiaacref_vals{"TIHYX"} = "4530798";
-		$tiaacref_vals{"TIILX"} = "316693";
-		$tiaacref_vals{"TIIEX"} = "305980";
-		$tiaacref_vals{"TCIEX"} = "303673";
-		$tiaacref_vals{"TILGX"} = "4530800";
-		$tiaacref_vals{"TILIX"} = "297809";
-		$tiaacref_vals{"TRLIX"} = "300692";
-		$tiaacref_vals{"TILVX"} = "302308";
-		$tiaacref_vals{"TCTIX"} = "4912376";
-		$tiaacref_vals{"TCNIX"} = "4912355";
-		$tiaacref_vals{"TCWIX"} = "4912377";
-		$tiaacref_vals{"TCYIX"} = "4912384";
-		$tiaacref_vals{"TCRIX"} = "4912364";
-		$tiaacref_vals{"TCIIX"} = "4912375";
-		$tiaacref_vals{"TCOIX"} = "4912387";
-		$tiaacref_vals{"TTFIX"} = "9467607";
-		$tiaacref_vals{"TFTIX"} = "9467601";
-		$tiaacref_vals{"TTRIX"} = "34211329";
-		$tiaacref_vals{"TLTIX"} = "21066484";
-		$tiaacref_vals{"TLFIX"} = "21066498";
-		$tiaacref_vals{"TLWIX"} = "21066480";
-		$tiaacref_vals{"TLQIX"} = "21066486";
-		$tiaacref_vals{"TLHIX"} = "21066495";
-		$tiaacref_vals{"TLYIX"} = "21066477";
-		$tiaacref_vals{"TLZIX"} = "21066474";
-		$tiaacref_vals{"TLXIX"} = "21066478";
-		$tiaacref_vals{"TLLIX"} = "21066492";
-		$tiaacref_vals{"TTIIX"} = "34211326";
-		$tiaacref_vals{"TRILX"} = "21066463";
-		$tiaacref_vals{"TLRIX"} = "9467595";
-		$tiaacref_vals{"TSAIX"} = "40508428";
-		$tiaacref_vals{"TCSIX"} = "40508425";
-		$tiaacref_vals{"TSGGX"} = "40508434";
-		$tiaacref_vals{"TSITX"} = "40508450";
-		$tiaacref_vals{"TSIMX"} = "40508443";
-		$tiaacref_vals{"TIMIX"} = "4530787";
-		$tiaacref_vals{"TRPWX"} = "297210";
-		$tiaacref_vals{"TIMVX"} = "316178";
-		$tiaacref_vals{"TCIXX"} = "313650";
-		$tiaacref_vals{"TIREX"} = "303475";
-		$tiaacref_vals{"TISPX"} = "306658";
-		$tiaacref_vals{"TISIX"} = "4530784";
-		$tiaacref_vals{"TISBX"} = "309018";
-		$tiaacref_vals{"TISEX"} = "301622";
-		$tiaacref_vals{"TISCX"} = "301897";
-		$tiaacref_vals{"TITIX"} = "4530819";
-		$tiaacref_vals{"TIORX"} = "4530794";
-		$tiaacref_vals{"TBILX"} = "20739663";
-		$tiaacref_vals{"TCBPX"} = "4530788";
-		$tiaacref_vals{"TEMRX"} = "26176542";
-		$tiaacref_vals{"TEQKX"} = "26176545";
-		$tiaacref_vals{"TINRX"} = "4530797";
-		$tiaacref_vals{"TNRLX"} = "39444917";
-		$tiaacref_vals{"TIIRX"} = "4530790";
-		$tiaacref_vals{"TIYRX"} = "4530830";
-		$tiaacref_vals{"TCILX"} = "313727";
-		$tiaacref_vals{"TIERX"} = "4530827";
-		$tiaacref_vals{"TIRTX"} = "4530791";
-		$tiaacref_vals{"TCLCX"} = "302696";
-		$tiaacref_vals{"TLRRX"} = "9467600";
-		$tiaacref_vals{"TSALX"} = "40508429";
-		$tiaacref_vals{"TSCLX"} = "40508432";
-		$tiaacref_vals{"TSGLX"} = "40508435";
-		$tiaacref_vals{"TSILX"} = "40508438";
-		$tiaacref_vals{"TSMLX"} = "40508453";
-		$tiaacref_vals{"TIMRX"} = "4530817";
-		$tiaacref_vals{"TCMGX"} = "305208";
-		$tiaacref_vals{"TCMVX"} = "313995";
-		$tiaacref_vals{"TIRXX"} = "4530775";
-		$tiaacref_vals{"TCREX"} = "309567";
-		$tiaacref_vals{"TCTRX"} = "4530822";
-		$tiaacref_vals{"TCSEX"} = "297477";
-		$tiaacref_vals{"TICRX"} = "4530792";
-		$tiaacref_vals{"TIXRX"} = "4530793";
-		$tiaacref_vals{"TIDPX"} = "21066506";
-		$tiaacref_vals{"TBIPX"} = "21066534";
-		$tiaacref_vals{"TBPPX"} = "21066533";
-		$tiaacref_vals{"TEMPX"} = "26176541";
-		$tiaacref_vals{"TEQPX"} = "26176546";
-		$tiaacref_vals{"TCEPX"} = "21066530";
-		$tiaacref_vals{"TNRPX"} = "39444918";
-		$tiaacref_vals{"TRPGX"} = "21066461";
-		$tiaacref_vals{"TIHPX"} = "21066501";
-		$tiaacref_vals{"TIKPX"} = "21066500";
-		$tiaacref_vals{"TREPX"} = "21066466";
-		$tiaacref_vals{"TRIPX"} = "21066462";
-		$tiaacref_vals{"TILPX"} = "21066499";
-		$tiaacref_vals{"TRCPX"} = "21066467";
-		$tiaacref_vals{"TCTPX"} = "21066521";
-		$tiaacref_vals{"TCFPX"} = "21066528";
-		$tiaacref_vals{"TCWPX"} = "21066518";
-		$tiaacref_vals{"TCQPX"} = "21066522";
-		$tiaacref_vals{"TCHPX"} = "21066527";
-		$tiaacref_vals{"TCYPX"} = "21066517";
-		$tiaacref_vals{"TCZPX"} = "21066516";
-		$tiaacref_vals{"TTFPX"} = "21066444";
-		$tiaacref_vals{"TCLPX"} = "21066526";
-		$tiaacref_vals{"TTRPX"} = "34211331";
-		$tiaacref_vals{"TLTPX"} = "21066483";
-		$tiaacref_vals{"TLFPX"} = "21066497";
-		$tiaacref_vals{"TLWPX"} = "21066434";
-		$tiaacref_vals{"TLVPX"} = "21066481";
-		$tiaacref_vals{"TLHPX"} = "21066494";
-		$tiaacref_vals{"TLYPX"} = "21066476";
-		$tiaacref_vals{"TLPRX"} = "21066487";
-		$tiaacref_vals{"TLMPX"} = "21066489";
-		$tiaacref_vals{"TLLPX"} = "21066491";
-		$tiaacref_vals{"TTIPX"} = "34211327";
-		$tiaacref_vals{"TLIPX"} = "21066493";
-		$tiaacref_vals{"TPILX"} = "21066470";
-		$tiaacref_vals{"TSAPX"} = "40508430";
-		$tiaacref_vals{"TLSPX"} = "40508426";
-		$tiaacref_vals{"TSGPX"} = "40508436";
-		$tiaacref_vals{"TSIPX"} = "40508451";
-		$tiaacref_vals{"TSMPX"} = "40508456";
-		$tiaacref_vals{"TRGPX"} = "21066464";
-		$tiaacref_vals{"TRVPX"} = "21066455";
-		$tiaacref_vals{"TPPXX"} = "21066469";
-		$tiaacref_vals{"TRRPX"} = "21066459";
-		$tiaacref_vals{"TSTPX"} = "21066445";
-		$tiaacref_vals{"TSRPX"} = "21066446";
-		$tiaacref_vals{"TRPSX"} = "21066460";
-	}
-
-#The location doesn't matter anymore.
+    my $quoter = shift;
+    if (! %tiaacref_ids ) {  #build a name hash for the annuities (once only)
+    	$tiaacref_ids{"CREFstok"} = "CREF Stock";
+    	$tiaacref_ids{"CREFmony"} = "CREF Money Market";
+    	$tiaacref_ids{"CREFequi"} = "CREF Equity Index";
+    	$tiaacref_ids{"CREFinfb"} = "CREF Inflation-Linked Bond";
+    	$tiaacref_ids{"CREFbond"} = "CREF Bond Market";
+    	$tiaacref_ids{"CREFsoci"} = "CREF Social Choice";
+    	$tiaacref_ids{"CREFglob"} = "CREF Global Equities";
+    	$tiaacref_ids{"CREFgrow"} = "CREF Growth";
+    	$tiaacref_ids{"TIAAreal"} = "TIAA Real Estate";
+    	$tiaacref_ids{"TIAAsndx"} = "TIAA Teachers Personal Annuity Stock Index";
+        $tiaacref_ids{"TLSIX"} = "TIAA Personal Annuity Select Stock Index";
+        $tiaacref_ids{"TLGEX"} = "TIAA Personal Annuity Select Growth Equity";
+        $tiaacref_ids{"TLGIX"} = "TIAA Personal Annuity Select Growth & Income";
+        $tiaacref_ids{"TLIEX"} = "TIAA Personal Annuity Select International Equity";
+        $tiaacref_ids{"TLSCX"} = "TIAA Personal Annuity Select Social Choice Equity";
+        $tiaacref_ids{"TLLCX"} = "TIAA Personal Annuity Select Large Cap Value";
+        $tiaacref_ids{"TLCEX"} = "TIAA Personal Annuity Select Small Cap Equity";
+        $tiaacref_ids{"TLREX"} = "TIAA Personal Annuity Select Real Estate Securities";
+
+	# Money Market
+	$tiaacref_ids{"TIAXX"} = "TIAA-CREF Money Market";
+
+	# Bonds
+	$tiaacref_ids{"TIPBX"} = "TIAA-CREF Bond Plus";
+	$tiaacref_ids{"TCHYX"} = "TIAA-CREF High-Yield Bond";
+	$tiaacref_ids{"TCILX"} = "TIAA-CREF Inflation-Linked Bond";
+	$tiaacref_ids{"TCSTX"} = "TIAA-CREF Short-Term Bond";
+	$tiaacref_ids{"TCTEX"} = "TIAA-CREF Tax-Exempt Bond";
+
+	# Real Estate
+	$tiaacref_ids{"TCREX"} = "TIAA-CREF Real Estate Securities";
+
+	# Equities
+	$tiaacref_ids{"TCEIX"} = "TIAA-CREF Equity Index";
+	$tiaacref_ids{"TIGEX"} = "TIAA-CREF Growth Equity";
+	$tiaacref_ids{"TIGIX"} = "TIAA-CREF Growth & Income";
+	$tiaacref_ids{"TIINX"} = "TIAA-CREF International Equity";
+	$tiaacref_ids{"TCLCX"} = "TIAA-CREF Large-Cap Value";
+	$tiaacref_ids{"TCMGX"} = "TIAA-CREF Mid-Cap Growth";
+	$tiaacref_ids{"TCMVX"} = "TIAA-CREF Mid-Cap Value";
+	$tiaacref_ids{"TCSEX"} = "TIAA-CREF Small-Cap Equity";
+	$tiaacref_ids{"TCSCX"} = "TIAA-CREF Social Choice Equity";
+
+	$tiaacref_ids{"TIMAX"} = "TIAA-CREF Managed Allocation";
+    }
+    
+    if (! %tiaacref_vals) {
+        $tiaacref_vals{"CREFstok"} = "1001";
+	$tiaacref_vals{"CREFmony"} = "1008";
+	$tiaacref_vals{"CREFequi"} = "1004";
+	$tiaacref_vals{"CREFinfb"} = "1007";
+	$tiaacref_vals{"CREFbond"} = "1006";
+	$tiaacref_vals{"CREFsoci"} = "1005";
+	$tiaacref_vals{"CREFglob"} = "1002";
+	$tiaacref_vals{"CREFgrow"} = "1003";
+	$tiaacref_vals{"TIAAreal"} = "1009";
+	$tiaacref_vals{"TIAAsndx"} = "1010";
+	$tiaacref_vals{"TLSIX"}    = "1011";
+	$tiaacref_vals{"TLGEX"}    = "1012";
+	$tiaacref_vals{"TLGIX"}    = "1013";
+	$tiaacref_vals{"TLIEX"}    = "1014";
+	$tiaacref_vals{"TLSCX"}    = "1015";
+	$tiaacref_vals{"TLLCX"}    = "1016";
+	$tiaacref_vals{"TLCEX"}    = "1017";
+	$tiaacref_vals{"TLREX"}    = "1018";
+
+	$tiaacref_vals{"TIAXX"} = "76";
+
+        $tiaacref_vals{"TIPBX"} = "75";
+        $tiaacref_vals{"TCHYX"} = "82";
+        $tiaacref_vals{"TCILX"} = "90";
+        $tiaacref_vals{"TCSTX"} = "81";
+        $tiaacref_vals{"TCTEX"} = "80";
+
+        $tiaacref_vals{"TCREX"} = "89";
+
+        $tiaacref_vals{"TCEIX"} = "84";
+        $tiaacref_vals{"TIGEX"} = "72";
+        $tiaacref_vals{"TIGIX"} = "73";
+        $tiaacref_vals{"TIINX"} = "71";
+        $tiaacref_vals{"TCLCX"} = "85";
+        $tiaacref_vals{"TCMGX"} = "86";
+        $tiaacref_vals{"TCMVX"} = "87";
+        $tiaacref_vals{"TCSEX"} = "88";
+        $tiaacref_vals{"TCSCX"} = "83";
+
+        $tiaacref_vals{"TIMAX"} = "74";
+    }
+    
+#The location doesn't matter anymore. 
 #I'm leaving this data structure in place in case it changes again
 #FBN 23/JAN/04
-
-	if (! %tiaacref_locs) {
-		$tiaacref_locs{"CREFbond"} = 1;
-		$tiaacref_locs{"CREFequi"} = 1;
-		$tiaacref_locs{"CREFglob"} = 1;
-		$tiaacref_locs{"CREFgrow"} = 1;
-		$tiaacref_locs{"CREFinfb"} = 1;
-		$tiaacref_locs{"CREFmony"} = 1;
-		$tiaacref_locs{"CREFsoci"} = 1;
-		$tiaacref_locs{"CREFstok"} = 1;
-		$tiaacref_locs{"TIAAreal"} = 1;
-		$tiaacref_locs{"TIDRX"} = 1;
-		$tiaacref_locs{"TBIRX"} = 1;
-		$tiaacref_locs{"TCBRX"} = 1;
-		$tiaacref_locs{"TEMSX"} = 1;
-		$tiaacref_locs{"TEQSX"} = 1;
-		$tiaacref_locs{"TIQRX"} = 1;
-		$tiaacref_locs{"TNRRX"} = 1;
-		$tiaacref_locs{"TRGIX"} = 1;
-		$tiaacref_locs{"TIHRX"} = 1;
-		$tiaacref_locs{"TIKRX"} = 1;
-		$tiaacref_locs{"TRERX"} = 1;
-		$tiaacref_locs{"TRIEX"} = 1;
-		$tiaacref_locs{"TILRX"} = 1;
-		$tiaacref_locs{"TRIRX"} = 1;
-		$tiaacref_locs{"TRLCX"} = 1;
-		$tiaacref_locs{"TRCVX"} = 1;
-		$tiaacref_locs{"TCLEX"} = 1;
-		$tiaacref_locs{"TCLIX"} = 1;
-		$tiaacref_locs{"TCLTX"} = 1;
-		$tiaacref_locs{"TCLFX"} = 1;
-		$tiaacref_locs{"TCLNX"} = 1;
-		$tiaacref_locs{"TCLRX"} = 1;
-		$tiaacref_locs{"TCLOX"} = 1;
-		$tiaacref_locs{"TTFRX"} = 1;
-		$tiaacref_locs{"TLFRX"} = 1;
-		$tiaacref_locs{"TTRLX"} = 1;
-		$tiaacref_locs{"TLTRX"} = 1;
-		$tiaacref_locs{"TLGRX"} = 1;
-		$tiaacref_locs{"TLWRX"} = 1;
-		$tiaacref_locs{"TLQRX"} = 1;
-		$tiaacref_locs{"TLHRX"} = 1;
-		$tiaacref_locs{"TLYRX"} = 1;
-		$tiaacref_locs{"TLZRX"} = 1;
-		$tiaacref_locs{"TLMRX"} = 1;
-		$tiaacref_locs{"TLLRX"} = 1;
-		$tiaacref_locs{"TTIRX"} = 1;
-		$tiaacref_locs{"TRCIX"} = 1;
-		$tiaacref_locs{"TLIRX"} = 1;
-		$tiaacref_locs{"TSARX"} = 1;
-		$tiaacref_locs{"TSCTX"} = 1;
-		$tiaacref_locs{"TSGRX"} = 1;
-		$tiaacref_locs{"TLSRX"} = 1;
-		$tiaacref_locs{"TSMTX"} = 1;
-		$tiaacref_locs{"TITRX"} = 1;
-		$tiaacref_locs{"TRGMX"} = 1;
-		$tiaacref_locs{"TRVRX"} = 1;
-		$tiaacref_locs{"TIEXX"} = 1;
-		$tiaacref_locs{"TRRSX"} = 1;
-		$tiaacref_locs{"TRSPX"} = 1;
-		$tiaacref_locs{"TISRX"} = 1;
-		$tiaacref_locs{"TRBIX"} = 1;
-		$tiaacref_locs{"TRSEX"} = 1;
-		$tiaacref_locs{"TRSCX"} = 1;
-		$tiaacref_locs{"TIBDX"} = 1;
-		$tiaacref_locs{"TBIIX"} = 1;
-		$tiaacref_locs{"TIBFX"} = 1;
-		$tiaacref_locs{"TEMLX"} = 1;
-		$tiaacref_locs{"TEQLX"} = 1;
-		$tiaacref_locs{"TFIIX"} = 1;
-		$tiaacref_locs{"TLIIX"} = 1;
-		$tiaacref_locs{"TEVIX"} = 1;
-		$tiaacref_locs{"TIEIX"} = 1;
-		$tiaacref_locs{"TNRIX"} = 1;
-		$tiaacref_locs{"TIGRX"} = 1;
-		$tiaacref_locs{"TIHYX"} = 1;
-		$tiaacref_locs{"TIILX"} = 1;
-		$tiaacref_locs{"TIIEX"} = 1;
-		$tiaacref_locs{"TCIEX"} = 1;
-		$tiaacref_locs{"TILGX"} = 1;
-		$tiaacref_locs{"TILIX"} = 1;
-		$tiaacref_locs{"TRLIX"} = 1;
-		$tiaacref_locs{"TILVX"} = 1;
-		$tiaacref_locs{"TCTIX"} = 1;
-		$tiaacref_locs{"TCNIX"} = 1;
-		$tiaacref_locs{"TCWIX"} = 1;
-		$tiaacref_locs{"TCYIX"} = 1;
-		$tiaacref_locs{"TCRIX"} = 1;
-		$tiaacref_locs{"TCIIX"} = 1;
-		$tiaacref_locs{"TCOIX"} = 1;
-		$tiaacref_locs{"TTFIX"} = 1;
-		$tiaacref_locs{"TFTIX"} = 1;
-		$tiaacref_locs{"TTRIX"} = 1;
-		$tiaacref_locs{"TLTIX"} = 1;
-		$tiaacref_locs{"TLFIX"} = 1;
-		$tiaacref_locs{"TLWIX"} = 1;
-		$tiaacref_locs{"TLQIX"} = 1;
-		$tiaacref_locs{"TLHIX"} = 1;
-		$tiaacref_locs{"TLYIX"} = 1;
-		$tiaacref_locs{"TLZIX"} = 1;
-		$tiaacref_locs{"TLXIX"} = 1;
-		$tiaacref_locs{"TLLIX"} = 1;
-		$tiaacref_locs{"TTIIX"} = 1;
-		$tiaacref_locs{"TRILX"} = 1;
-		$tiaacref_locs{"TLRIX"} = 1;
-		$tiaacref_locs{"TSAIX"} = 1;
-		$tiaacref_locs{"TCSIX"} = 1;
-		$tiaacref_locs{"TSGGX"} = 1;
-		$tiaacref_locs{"TSITX"} = 1;
-		$tiaacref_locs{"TSIMX"} = 1;
-		$tiaacref_locs{"TIMIX"} = 1;
-		$tiaacref_locs{"TRPWX"} = 1;
-		$tiaacref_locs{"TIMVX"} = 1;
-		$tiaacref_locs{"TCIXX"} = 1;
-		$tiaacref_locs{"TIREX"} = 1;
-		$tiaacref_locs{"TISPX"} = 1;
-		$tiaacref_locs{"TISIX"} = 1;
-		$tiaacref_locs{"TISBX"} = 1;
-		$tiaacref_locs{"TISEX"} = 1;
-		$tiaacref_locs{"TISCX"} = 1;
-		$tiaacref_locs{"TITIX"} = 1;
-		$tiaacref_locs{"TIORX"} = 1;
-		$tiaacref_locs{"TBILX"} = 1;
-		$tiaacref_locs{"TCBPX"} = 1;
-		$tiaacref_locs{"TEMRX"} = 1;
-		$tiaacref_locs{"TEQKX"} = 1;
-		$tiaacref_locs{"TINRX"} = 1;
-		$tiaacref_locs{"TNRLX"} = 1;
-		$tiaacref_locs{"TIIRX"} = 1;
-		$tiaacref_locs{"TIYRX"} = 1;
-		$tiaacref_locs{"TCILX"} = 1;
-		$tiaacref_locs{"TIERX"} = 1;
-		$tiaacref_locs{"TIRTX"} = 1;
-		$tiaacref_locs{"TCLCX"} = 1;
-		$tiaacref_locs{"TLRRX"} = 1;
-		$tiaacref_locs{"TSALX"} = 1;
-		$tiaacref_locs{"TSCLX"} = 1;
-		$tiaacref_locs{"TSGLX"} = 1;
-		$tiaacref_locs{"TSILX"} = 1;
-		$tiaacref_locs{"TSMLX"} = 1;
-		$tiaacref_locs{"TIMRX"} = 1;
-		$tiaacref_locs{"TCMGX"} = 1;
-		$tiaacref_locs{"TCMVX"} = 1;
-		$tiaacref_locs{"TIRXX"} = 1;
-		$tiaacref_locs{"TCREX"} = 1;
-		$tiaacref_locs{"TCTRX"} = 1;
-		$tiaacref_locs{"TCSEX"} = 1;
-		$tiaacref_locs{"TICRX"} = 1;
-		$tiaacref_locs{"TIXRX"} = 1;
-		$tiaacref_locs{"TIDPX"} = 1;
-		$tiaacref_locs{"TBIPX"} = 1;
-		$tiaacref_locs{"TBPPX"} = 1;
-		$tiaacref_locs{"TEMPX"} = 1;
-		$tiaacref_locs{"TEQPX"} = 1;
-		$tiaacref_locs{"TCEPX"} = 1;
-		$tiaacref_locs{"TNRPX"} = 1;
-		$tiaacref_locs{"TRPGX"} = 1;
-		$tiaacref_locs{"TIHPX"} = 1;
-		$tiaacref_locs{"TIKPX"} = 1;
-		$tiaacref_locs{"TREPX"} = 1;
-		$tiaacref_locs{"TRIPX"} = 1;
-		$tiaacref_locs{"TILPX"} = 1;
-		$tiaacref_locs{"TRCPX"} = 1;
-		$tiaacref_locs{"TCTPX"} = 1;
-		$tiaacref_locs{"TCFPX"} = 1;
-		$tiaacref_locs{"TCWPX"} = 1;
-		$tiaacref_locs{"TCQPX"} = 1;
-		$tiaacref_locs{"TCHPX"} = 1;
-		$tiaacref_locs{"TCYPX"} = 1;
-		$tiaacref_locs{"TCZPX"} = 1;
-		$tiaacref_locs{"TTFPX"} = 1;
-		$tiaacref_locs{"TCLPX"} = 1;
-		$tiaacref_locs{"TTRPX"} = 1;
-		$tiaacref_locs{"TLTPX"} = 1;
-		$tiaacref_locs{"TLFPX"} = 1;
-		$tiaacref_locs{"TLWPX"} = 1;
-		$tiaacref_locs{"TLVPX"} = 1;
-		$tiaacref_locs{"TLHPX"} = 1;
-		$tiaacref_locs{"TLYPX"} = 1;
-		$tiaacref_locs{"TLPRX"} = 1;
-		$tiaacref_locs{"TLMPX"} = 1;
-		$tiaacref_locs{"TLLPX"} = 1;
-		$tiaacref_locs{"TTIPX"} = 1;
-		$tiaacref_locs{"TLIPX"} = 1;
-		$tiaacref_locs{"TPILX"} = 1;
-		$tiaacref_locs{"TSAPX"} = 1;
-		$tiaacref_locs{"TLSPX"} = 1;
-		$tiaacref_locs{"TSGPX"} = 1;
-		$tiaacref_locs{"TSIPX"} = 1;
-		$tiaacref_locs{"TSMPX"} = 1;
-		$tiaacref_locs{"TRGPX"} = 1;
-		$tiaacref_locs{"TRVPX"} = 1;
-		$tiaacref_locs{"TPPXX"} = 1;
-		$tiaacref_locs{"TRRPX"} = 1;
-		$tiaacref_locs{"TSTPX"} = 1;
-		$tiaacref_locs{"TSRPX"} = 1;
-		$tiaacref_locs{"TRPSX"} = 1;
-	}
-	my(@funds) = @_;
-	return unless @funds;
-	my(@line); #holds the return from parse_csv
-	my(%info);
-	my(%check); #holds success value if data returned
-	my($ua,$urlc,$urlt); #useragent and target urls
-	my($cntc,$cntt); #counters for each of the two url containers
-	my($reply,$qdata); #the reply from TIAA-CREF's cgi and a buffer for the data
-
-	$urlc = $CREF_URL;
-	$urlt = $TIAA_URL;
-
-#The new TIAA-CREF website asks for start and end dates. To guarantee data,
-#ask for 7 days of quotes, and only take the first (most recent) one.
-	my(@starttime, $startdate);
-	@starttime = localtime(time-7*86400);
-	$starttime[5] += 1900;
-	$starttime[4] += 1;
-	$startdate = $starttime[5] . "-" . $starttime[4] . "-" . $starttime[3];
-	my(@endtime, $enddate);
-	@endtime = localtime(time);
-	$endtime[5] += 1900;
-	$endtime[4] += 1;
-	$enddate = $endtime[5] . "-" . $endtime[4] . "-" . $endtime[3];
-
-	$urlc .= "&NavStart=" . $startdate . "&NavEnd=" . $enddate;
-
+    
+    if (! %tiaacref_locs) {
+        $tiaacref_locs{"CREFstok"} = 1;
+        $tiaacref_locs{"CREFmony"} = 1;
+        $tiaacref_locs{"CREFequi"} = 1;
+        $tiaacref_locs{"CREFinfb"} = 1;
+        $tiaacref_locs{"CREFbond"} = 1;
+        $tiaacref_locs{"CREFsoci"} = 1;
+        $tiaacref_locs{"CREFglob"} = 1;
+        $tiaacref_locs{"CREFgrow"} = 1;
+        $tiaacref_locs{"TIAAreal"} = 1;
+        $tiaacref_locs{"TIAAsndx"} = 1;
+        $tiaacref_locs{"TLSIX"}    = 1;
+        $tiaacref_locs{"TLGEX"}    = 1;
+        $tiaacref_locs{"TLGIX"}    = 1;
+        $tiaacref_locs{"TLIEX"}    = 1;
+        $tiaacref_locs{"TLSCX"}    = 1;
+        $tiaacref_locs{"TLLCX"}    = 1;
+        $tiaacref_locs{"TLCEX"}    = 1;
+        $tiaacref_locs{"TLREX"}    = 1;
+
+	$tiaacref_locs{"TIAXX"} = 1;
+
+        $tiaacref_locs{"TIPBX"} = 1;
+        $tiaacref_locs{"TCHYX"} = 1;
+        $tiaacref_locs{"TCILX"} = 1;
+        $tiaacref_locs{"TCSTX"} = 1;
+        $tiaacref_locs{"TCTEX"} = 1;
+
+        $tiaacref_locs{"TCREX"} = 1;
+
+        $tiaacref_locs{"TCEIX"} = 1;
+        $tiaacref_locs{"TIGEX"} = 1;
+        $tiaacref_locs{"TIGIX"} = 1;
+        $tiaacref_locs{"TIINX"} = 1;
+        $tiaacref_locs{"TCLCX"} = 1;
+        $tiaacref_locs{"TCMGX"} = 1;
+        $tiaacref_locs{"TCMVX"} = 1;
+        $tiaacref_locs{"TCSEX"} = 1;
+        $tiaacref_locs{"TCSCX"} = 1;
+
+        $tiaacref_locs{"TIMAX"} = 1;
+    }
+    my(@funds) = @_;
+    return unless @funds;
+    my(@line);		#holds the return from parse_csv
+    my(%info);
+    my(%check);		#holds success value if data returned	
+    my($ua,$urlc,$urlt);   #useragent and target urls
+    my($cntc,$cntt); #counters for each of the two url containers
+    my($reply,$qdata);		#the reply from TIAA-CREF's cgi and a buffer for the data
+
+#    $url = $TIAACREF_URL;
+    $urlc = $CREF_URL;
+    $urlt = $TIAA_URL;
 #Initialize counters for the two types of URL. If either counter is zero, then
 # that URL will not be retrieved. This is less technically clever than testing
 #the URL string itself with m/yes/, but its faster.
-	$cntc = 0;
-	$cntt = 0;
-	foreach my $fund (@funds) {
-		if ($tiaacref_ids{$fund}) {
-			if ($tiaacref_locs{$fund} == 1) {
-				$cntc++;
-				$urlc .= "&WSODIssues=" . $tiaacref_vals{$fund};
-			} else {
-				$urlt .= $fund . "=yes&";
-				$cntt++;
-			}
-			$check{$fund} = 0;
+    $cntc = 0;
+    $cntt = 0;
+    foreach my $fund (@funds) {
+	if ($tiaacref_ids{$fund}) {
+        	if ($tiaacref_locs{$fund} == 1) {
+			$cntc++;
+			$urlc .=  "f" . $cntc . "=" . $tiaacref_vals{$fund} . "&";
 		} else {
-			$info{$fund,"success"} = 0;
-			$info{$fund,"errormsg"} = "Bad symbol";
-		}
-	}
-	$urlc .= "&viewtype=CSV";
-	$urlt .= "selected=1";
-
-	$qdata ="";
-
-	$ua = $quoter->user_agent;
-	if ($cntc) {
-		$reply = $ua->request(GET $urlc);
-		if ($reply ->is_success) {
-			$qdata .= $reply->content;
+ 			$urlt .= $fund . "=yes&";
+			$cntt++;
 		}
+		$check{$fund} = 0;
+	} else {
+		$info{$fund,"success"} = 0;
+		$info{$fund,"errormsg"} = "Bad symbol";
 	}
-	if ($cntt) {
-		$reply = $ua->request(GET $urlt);
-		if ($reply ->is_success) {
-			$qdata .= $reply->content;
-		}
+    }
+    $urlc .=  "days=1";
+    $urlt .=  "selected=1";
+    $qdata ="";
+
+    $ua = $quoter->user_agent;
+    if ($cntc) {
+    	$reply = $ua->request(GET $urlc);
+        if ($reply ->is_success) {
+            $qdata .= $reply->content;
 	}
-
-	if (length($qdata)) {
-	    $qdata = Encode::decode('utf16le', $qdata);
-		foreach (split(/\012/,$qdata) ){
-			next unless m/.+,.+/;
-			s/[\r\n]+//g;
-			s/^ +//g;
-			s/ +$//g;
-#			@line = split(/,/,$_);
-			@line = $quoter->parse_csv($_);
-			if($line[0] eq "CREF Bond Market Account"){$line[0] = "CREFbond";}
-			if($line[0] eq "CREF Equity Index Account"){$line[0] = "CREFequi";}
-			if($line[0] eq "CREF Global Equities Account"){$line[0] = "CREFglob";}
-			if($line[0] eq "CREF Growth Account"){$line[0] = "CREFgrow";}
-			if($line[0] eq "CREF Inflation-Linked Bond Account"){$line[0] = "CREFinfb";}
-			if($line[0] eq "CREF Money Market Account"){$line[0] = "CREFmony";}
-			if($line[0] eq "CREF Social Choice Account"){$line[0] = "CREFsoci";}
-			if($line[0] eq "CREF Stock Account"){$line[0] = "CREFstok";}
-			if($line[0] eq "TIAA Real Estate Account"){$line[0] = "TIAAreal";}
-			if($check{$line[0]} == 1){next} #calcisme: this prevents getting more than the first of the quotes
-			if (exists $check{$line[0]}) { #did we ask for this data?
-				$info{$line[0],"symbol"} = $line[0]; #in case the caller needs this in the hash
-				$info{$line[0],"exchange"} = "TIAA-CREF";
-				$info{$line[0],"name"} = $tiaacref_ids{$line[0]};
-				$quoter->store_date(\%info, $line[0], {usdate => $line[2]});
-				$info{$line[0],"nav"} = $line[1];
-				$info{$line[0],"price"} = $info{$line[0],"nav"};
-				$info{$line[0],"success"} = 1; #this contains good data,
-												#beyond a reasonable doubt
-				$info{$line[0],"currency"} = "USD";
-				$info{$line[0],"method"} = "tiaacref";
-				$info{$line[0],"exchange"} = "TIAA-CREF";
-				$check{$line[0]} = 1;
-			} else {
-				$info{$line[0],"success"} = 0;
-				$info{$line[0],"errormsg"} = "Bad data returned";
-			}
-		}
-	} else {
-		foreach $_ (@funds) {
-			$info{$_,"success"} = 0;
-			$info{$_,"errormsg"} = "HTTP error";
-		} # foreach
-	} #if $length(qdata) else
-
-
-	#now check to make sure a value was returned for every symbol asked for
-	foreach my $k (keys %check) {
-		if ($check{$k} == 0) {
-			$info{$k,"success"} = 0;
-			$info{$k,"errormsg"} = "No data returned";
-		}
+    }
+    if ($cntt) {
+        $reply = $ua->request(GET $urlt);
+        if ($reply ->is_success) {
+            $qdata .= $reply->content;
 	}
-
-	return %info if wantarray;
-	return \%info;
+    }
+    if (length($qdata)) {
+       foreach (split('\012',$qdata) ){
+           @line = $quoter->parse_csv($_);
+           if (exists $check{$line[0]}) {   #did we ask for this data?
+		  $info{$line[0],"symbol"} = $line[0]; #in case the caller needs this in the hash
+         	  $info{$line[0],"exchange"} = "TIAA-CREF";
+         	  $info{$line[0],"name"} = $tiaacref_ids{$line[0]};
+		  $quoter->store_date(\%info, $line[0], {usdate => $line[2]});
+         	  $info{$line[0],"nav"} =  $line[1];	
+		  $info{$line[0],"price"} = $info{$line[0],"nav"};
+	 	  $info{$line[0],"success"} = 1; #this contains good data, 
+                                                 #beyond a reasonable doubt
+                  $info{$line[0],"currency"} = "USD";
+		  $info{$line[0],"method"} = "tiaacref";
+		  $info{$line[0],"exchange"} = "TIAA-CREF";
+	 	  $check{$line[0]} = 1;
+	  } else {
+	  	$info{$line[0],"success"} = 0;
+	  	$info{$line[0],"errormsg"} = "Bad data returned";
+	  }
+       }
+    } else {
+	foreach $_ (@funds) {
+		$info{$_,"success"} = 0;
+		$info{$_,"errormsg"} = "HTTP error";
+	} # foreach
+	
+    } #if $length(qdata) else
+    
+    
+    #now check to make sure a value was returned for every symbol asked for
+    foreach my $k (keys %check) {
+    	if ($check{$k} == 0) {
+    		$info{$k,"success"} = 0;
+    		$info{$k,"errormsg"} = "No data returned";
+    	}
+    }
+
+    return %info if wantarray;
+    return \%info;
 }
 
 1;
@@ -1013,201 +359,44 @@ This module obtains information about TIAA-CREF managed funds.
 
 The following symbols can be used:
 
-    CREF Bond Market Account:	CREFbond
-    CREF Equity Index Account:	CREFequi
-    CREF Global Equities Account:	CREFglob
-    CREF Growth Account:	CREFgrow
-    CREF Inflation-Linked Bond Account:	CREFinfb
-    CREF Money Market Account:	CREFmony
-    CREF Social Choice Account:	CREFsoci
-    CREF Stock Account:	CREFstok
-    TIAA Real Estate Account:	TIAAreal
-    TIAA-CREF Bond Fund (Retirement):	TIDRX
-    TIAA-CREF Bond Index Fund (Retirement):	TBIRX
-    TIAA-CREF Bond Plus Fund (Retirement):	TCBRX
-    TIAA-CREF Emerging Markets Equity Fund (Retirement):	TEMSX
-    TIAA-CREF Emerging Markets Equity Index Fund (Retirement):	TEQSX
-    TIAA-CREF Equity Index Fund (Retirement):	TIQRX
-    TIAA-CREF Global Natural Resources Fund (Retirement):	TNRRX
-    TIAA-CREF Growth & Income Fund (Retirement):	TRGIX
-    TIAA-CREF High Yield Fund (Retirement):	TIHRX
-    TIAA-CREF Inflation-Linked Bond Fund (Retirement):	TIKRX
-    TIAA-CREF International Equity Fund (Retirement):	TRERX
-    TIAA-CREF International Equity Index Fund (Retirement):	TRIEX
-    TIAA-CREF Large-Cap Growth Fund (Retirement):	TILRX
-    TIAA-CREF Large-Cap Growth Index Fund (Retirement):	TRIRX
-    TIAA-CREF Large-Cap Value Fund (Retirement):	TRLCX
-    TIAA-CREF Large-Cap Value Index Fund (Retirement):	TRCVX
-    TIAA-CREF Lifecycle 2010 Fund (Retirement):	TCLEX
-    TIAA-CREF Lifecycle 2015 Fund (Retirement):	TCLIX
-    TIAA-CREF Lifecycle 2020 Fund (Retirement):	TCLTX
-    TIAA-CREF Lifecycle 2025 Fund (Retirement):	TCLFX
-    TIAA-CREF Lifecycle 2030 Fund (Retirement):	TCLNX
-    TIAA-CREF Lifecycle 2035 Fund (Retirement):	TCLRX
-    TIAA-CREF Lifecycle 2040 Fund (Retirement):	TCLOX
-    TIAA-CREF Lifecycle 2045 Fund (Retirement):	TTFRX
-    TIAA-CREF Lifecycle 2050 Fund (Retirement):	TLFRX
-    TIAA-CREF Lifecycle 2055 Fund (Retirement):	TTRLX
-    TIAA-CREF Lifecycle Index 2010 Fund (Retirement):	TLTRX
-    TIAA-CREF Lifecycle Index 2015 Fund (Retirement):	TLGRX
-    TIAA-CREF Lifecycle Index 2020 Fund (Retirement):	TLWRX
-    TIAA-CREF Lifecycle Index 2025 Fund (Retirement):	TLQRX
-    TIAA-CREF Lifecycle Index 2030 Fund (Retirement):	TLHRX
-    TIAA-CREF Lifecycle Index 2035 Fund (Retirement):	TLYRX
-    TIAA-CREF Lifecycle Index 2040 Fund (Retirement):	TLZRX
-    TIAA-CREF Lifecycle Index 2045 Fund (Retirement):	TLMRX
-    TIAA-CREF Lifecycle Index 2050 Fund (Retirement):	TLLRX
-    TIAA-CREF Lifecycle Index 2055 Fund (Retirement):	TTIRX
-    TIAA-CREF Lifecycle Index Retirement Income Fund (Retirement):	TRCIX
-    TIAA-CREF Lifecycle Retirement Income Fund (Retirement):	TLIRX
-    TIAA-CREF Lifestyle Aggressive Growth Fund (Retirement):	TSARX
-    TIAA-CREF Lifestyle Conservative Fund (Retirement):	TSCTX
-    TIAA-CREF Lifestyle Growth Fund (Retirement):	TSGRX
-    TIAA-CREF Lifestyle Income Fund (Retirement):	TLSRX
-    TIAA-CREF Lifestyle Moderate Fund (Retirement):	TSMTX
-    TIAA-CREF Managed Allocation Fund (Retirement):	TITRX
-    TIAA-CREF Mid-Cap Growth Fund (Retirement):	TRGMX
-    TIAA-CREF Mid-Cap Value Fund (Retirement):	TRVRX
-    TIAA-CREF Money Market Fund (Retirement):	TIEXX
-    TIAA-CREF Real Estate Securities Fund (Retirement):	TRRSX
-    TIAA-CREF S&P 500 Index Fund (Retirement):	TRSPX
-    TIAA-CREF Short-Term Bond Fund (Retirement):	TISRX
-    TIAA-CREF Small-Cap Blend Index Fund (Retirement):	TRBIX
-    TIAA-CREF Small-Cap Equity Fund (Retirement):	TRSEX
-    TIAA-CREF Social Choice Equity Fund (Retirement):	TRSCX
-    TIAA-CREF Bond Fund (Institutional):	TIBDX
-    TIAA-CREF Bond Index Fund (Institutional):	TBIIX
-    TIAA-CREF Bond Plus Fund (Institutional):	TIBFX
-    TIAA-CREF Emerging Markets Equity Fund (Institutional):	TEMLX
-    TIAA-CREF Emerging Markets Equity Index Fund (Institutional):	TEQLX
-    TIAA-CREF Enhanced International Equity Index Fund (Institutional):	TFIIX
-    TIAA-CREF Enhanced Large-Cap Growth Index Fund (Institutional):	TLIIX
-    TIAA-CREF Enhanced Large-Cap Value Index Fund (Institutional):	TEVIX
-    TIAA-CREF Equity Index Fund (Institutional):	TIEIX
-    TIAA-CREF Global Natural Resources Fund (Institutional):	TNRIX
-    TIAA-CREF Growth & Income Fund (Institutional):	TIGRX
-    TIAA-CREF High Yield Fund (Institutional):	TIHYX
-    TIAA-CREF Inflation-Linked Bond Fund (Institutional):	TIILX
-    TIAA-CREF International Equity Fund (Institutional):	TIIEX
-    TIAA-CREF International Equity Index Fund (Institutional):	TCIEX
-    TIAA-CREF Large-Cap Growth Fund (Institutional):	TILGX
-    TIAA-CREF Large-Cap Growth Index Fund (Institutional):	TILIX
-    TIAA-CREF Large-Cap Value Fund (Institutional):	TRLIX
-    TIAA-CREF Large-Cap Value Index Fund (Institutional):	TILVX
-    TIAA-CREF Lifecycle 2010 Fund (Institutional):	TCTIX
-    TIAA-CREF Lifecycle 2015 Fund (Institutional):	TCNIX
-    TIAA-CREF Lifecycle 2020 Fund (Institutional):	TCWIX
-    TIAA-CREF Lifecycle 2025 Fund (Institutional):	TCYIX
-    TIAA-CREF Lifecycle 2030 Fund (Institutional):	TCRIX
-    TIAA-CREF Lifecycle 2035 Fund (Institutional):	TCIIX
-    TIAA-CREF Lifecycle 2040 Fund (Institutional):	TCOIX
-    TIAA-CREF Lifecycle 2045 Fund (Institutional):	TTFIX
-    TIAA-CREF Lifecycle 2050 Fund (Institutional):	TFTIX
-    TIAA-CREF Lifecycle 2055 Fund (Institutional):	TTRIX
-    TIAA-CREF Lifecycle Index 2010 Fund (Institutional):	TLTIX
-    TIAA-CREF Lifecycle Index 2015 Fund (Institutional):	TLFIX
-    TIAA-CREF Lifecycle Index 2020 Fund (Institutional):	TLWIX
-    TIAA-CREF Lifecycle Index 2025 Fund (Institutional):	TLQIX
-    TIAA-CREF Lifecycle Index 2030 Fund (Institutional):	TLHIX
-    TIAA-CREF Lifecycle Index 2035 Fund (Institutional):	TLYIX
-    TIAA-CREF Lifecycle Index 2040 Fund (Institutional):	TLZIX
-    TIAA-CREF Lifecycle Index 2045 Fund (Institutional):	TLXIX
-    TIAA-CREF Lifecycle Index 2050 Fund (Institutional):	TLLIX
-    TIAA-CREF Lifecycle Index 2055 Fund (Institutional):	TTIIX
-    TIAA-CREF Lifecycle Index Retirement Income Fund (Institutional):	TRILX
-    TIAA-CREF Lifecycle Retirement Income Fund (Institutional):	TLRIX
-    TIAA-CREF Lifestyle Aggressive Growth Fund (Institutional):	TSAIX
-    TIAA-CREF Lifestyle Conservative Fund (Institutional):	TCSIX
-    TIAA-CREF Lifestyle Growth Fund (Institutional):	TSGGX
-    TIAA-CREF Lifestyle Income Fund (Institutional):	TSITX
-    TIAA-CREF Lifestyle Moderate Fund (Institutional):	TSIMX
-    TIAA-CREF Managed Allocation Fund (Institutional):	TIMIX
-    TIAA-CREF Mid-Cap Growth Fund (Institutional):	TRPWX
-    TIAA-CREF Mid-Cap Value Fund (Institutional):	TIMVX
-    TIAA-CREF Money Market Fund (Institutional):	TCIXX
-    TIAA-CREF Real Estate Securities Fund (Institutional):	TIREX
-    TIAA-CREF S&P 500 Index Fund (Institutional):	TISPX
-    TIAA-CREF Short-Term Bond Fund (Institutional):	TISIX
-    TIAA-CREF Small-Cap Blend Index Fund (Institutional):	TISBX
-    TIAA-CREF Small-Cap Equity Fund (Institutional):	TISEX
-    TIAA-CREF Social Choice Equity Fund (Institutional):	TISCX
-    TIAA-CREF Tax-Exempt Bond Fund (Institutional):	TITIX
-    TIAA-CREF Bond Fund (Retail):	TIORX
-    TIAA-CREF Bond Index Fund (Retail):	TBILX
-    TIAA-CREF Bond Plus Fund (Retail):	TCBPX
-    TIAA-CREF Emerging Markets Equity Fund (Retail):	TEMRX
-    TIAA-CREF Emerging Markets Equity Index Fund (Retail):	TEQKX
-    TIAA-CREF Equity Index Fund (Retail):	TINRX
-    TIAA-CREF Global Natural Resources Fund (Retail):	TNRLX
-    TIAA-CREF Growth & Income Fund (Retail):	TIIRX
-    TIAA-CREF High Yield Fund (Retail):	TIYRX
-    TIAA-CREF Inflation-Linked Bond Fund (Retail):	TCILX
-    TIAA-CREF International Equity Fund (Retail):	TIERX
-    TIAA-CREF Large-Cap Growth Fund (Retail):	TIRTX
-    TIAA-CREF Large-Cap Value Fund (Retail):	TCLCX
-    TIAA-CREF Lifecycle Retirement Income Fund (Retail):	TLRRX
-    TIAA-CREF Lifestyle Aggressive Growth Fund (Retail):	TSALX
-    TIAA-CREF Lifestyle Conservative Fund (Retail):	TSCLX
-    TIAA-CREF Lifestyle Growth Fund (Retail):	TSGLX
-    TIAA-CREF Lifestyle Income Fund (Retail):	TSILX
-    TIAA-CREF Lifestyle Moderate Fund (Retail):	TSMLX
-    TIAA-CREF Managed Allocation Fund (Retail):	TIMRX
-    TIAA-CREF Mid-Cap Growth Fund (Retail):	TCMGX
-    TIAA-CREF Mid-Cap Value Fund (Retail):	TCMVX
-    TIAA-CREF Money Market Fund (Retail):	TIRXX
-    TIAA-CREF Real Estate Securities Fund (Retail):	TCREX
-    TIAA-CREF Short-Term Bond Fund (Retail):	TCTRX
-    TIAA-CREF Small-Cap Equity Fund (Retail):	TCSEX
-    TIAA-CREF Social Choice Equity Fund (Retail):	TICRX
-    TIAA-CREF Tax-Exempt Bond Fund (Retail):	TIXRX
-    TIAA-CREF Bond Fund (Premier):	TIDPX
-    TIAA-CREF Bond Index Fund (Premier):	TBIPX
-    TIAA-CREF Bond Plus Fund (Premier):	TBPPX
-    TIAA-CREF Emerging Markets Equity Fund (Premier):	TEMPX
-    TIAA-CREF Emerging Markets Equity Index Fund (Premier):	TEQPX
-    TIAA-CREF Equity Index Fund (Premier):	TCEPX
-    TIAA-CREF Global Natural Resources Fund (Premier):	TNRPX
-    TIAA-CREF Growth & Income Fund (Premier):	TRPGX
-    TIAA-CREF High Yield Fund (Premier):	TIHPX
-    TIAA-CREF Inflation-Linked Bond Fund (Premier):	TIKPX
-    TIAA-CREF International Equity Fund (Premier):	TREPX
-    TIAA-CREF International Equity Index Fund (Premier):	TRIPX
-    TIAA-CREF Large-Cap Growth Fund (Premier):	TILPX
-    TIAA-CREF Large-Cap Value Fund (Premier):	TRCPX
-    TIAA-CREF Lifecycle 2010 Fund (Premier):	TCTPX
-    TIAA-CREF Lifecycle 2015 Fund (Premier):	TCFPX
-    TIAA-CREF Lifecycle 2020 Fund (Premier):	TCWPX
-    TIAA-CREF Lifecycle 2025 Fund (Premier):	TCQPX
-    TIAA-CREF Lifecycle 2030 Fund (Premier):	TCHPX
-    TIAA-CREF Lifecycle 2035 Fund (Premier):	TCYPX
-    TIAA-CREF Lifecycle 2040 Fund (Premier):	TCZPX
-    TIAA-CREF Lifecycle 2045 Fund (Premier):	TTFPX
-    TIAA-CREF Lifecycle 2050 Fund (Premier):	TCLPX
-    TIAA-CREF Lifecycle 2055 Fund (Premier):	TTRPX
-    TIAA-CREF Lifecycle Index 2010 Fund (Premier):	TLTPX
-    TIAA-CREF Lifecycle Index 2015 Fund (Premier):	TLFPX
-    TIAA-CREF Lifecycle Index 2020 Fund (Premier):	TLWPX
-    TIAA-CREF Lifecycle Index 2025 Fund (Premier):	TLVPX
-    TIAA-CREF Lifecycle Index 2030 Fund (Premier):	TLHPX
-    TIAA-CREF Lifecycle Index 2035 Fund (Premier):	TLYPX
-    TIAA-CREF Lifecycle Index 2040 Fund (Premier):	TLPRX
-    TIAA-CREF Lifecycle Index 2045 Fund (Premier):	TLMPX
-    TIAA-CREF Lifecycle Index 2050 Fund (Premier):	TLLPX
-    TIAA-CREF Lifecycle Index 2055 Fund (Premier):	TTIPX
-    TIAA-CREF Lifecycle Index Retirement Income Fund (Premier):	TLIPX
-    TIAA-CREF Lifecycle Retirement Income Fund (Premier):	TPILX
-    TIAA-CREF Lifestyle Aggressive Growth Fund (Premier):	TSAPX
-    TIAA-CREF Lifestyle Conservative Fund (Premier):	TLSPX
-    TIAA-CREF Lifestyle Growth Fund (Premier):	TSGPX
-    TIAA-CREF Lifestyle Income Fund (Premier):	TSIPX
-    TIAA-CREF Lifestyle Moderate Fund (Premier):	TSMPX
-    TIAA-CREF Mid-Cap Growth Fund (Premier):	TRGPX
-    TIAA-CREF Mid-Cap Value Fund (Premier):	TRVPX
-    TIAA-CREF Money Market Fund (Premier):	TPPXX
-    TIAA-CREF Real Estate Securities Fund (Premier):	TRRPX
-    TIAA-CREF Short-Term Bond Fund (Premier):	TSTPX
-    TIAA-CREF Small-Cap Equity Fund (Premier):	TSRPX
-    TIAA-CREF Social Choice Equity Fund (Premier):	TRPSX
+    Stock: 				CREFstok
+    Money Market:			CREFmony
+    Equity Index:			CREFequi
+    Inf-Linked Bond:			CREFinfb
+    Bond Market:			CREFbond
+    Social Choice:			CREFsoci
+    Global Equities:			CREFglob
+    Growth:				CREFgrow
+    TIAA Real Estate:			TIAAreal
+
+    PA Stock Index:			TIAAsndx
+    PA Select Stock:			TLSIX
+    PA Select Growth Equity:		TLGEX
+    PA Select Growth Income:		TLGIX
+    PA Select Int'l Equity:		TLIEX
+    PA Select Social Choice:		TLSCX
+    PA Select Large Cap Value:		TLLCX
+    PA Select Small Cap Equity:		TLCEX
+    PA Select Real Estate:		TLREX
+
+    TIAA-CREF Money Market:             TIAXX
+    TIAA-CREF Bond Plus:                TIPBX
+    TIAA-CREF High-Yield Bond:          TCHYX
+    TIAA-CREF Inflation-Linked Bond:    TCILX
+    TIAA-CREF Short-Term Bond:          TCSTX
+    TIAA-CREF Tax-Exempt Bond:          TCTEX
+    TIAA-CREF Real Estate Securities:   TCREX
+    TIAA-CREF Equity Index:             TCEIX
+    TIAA-CREF Growth Equity:            TIGEX
+    TIAA-CREF Growth & Income:          TIGIX
+    TIAA-CREF International Equity:     TIINX
+    TIAA-CREF Large-Cap Value:          TCLCX
+    TIAA-CREF Mid-Cap Growth:           TCMGX
+    TIAA-CREF Mid-Cap Value:            TCMVX
+    TIAA-CREF Small-Cap Equity:         TCSEX
+    TIAA-CREF Social Choice Equity:     TCSCX
+    TIAA-CREF Managed Allocation:       TIMAX
+
 
 This module is loaded by default on a Finance::Quote object.  It's
 also possible to load it explicitly by passing "Tiaacref" in to the
@@ -32,13 +32,13 @@ require 5.005;
 
 use strict;
 
-use vars qw( $TROWEPRICE_URL);
+use vars qw($VERSION $TROWEPRICE_URL);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use Carp;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.00';
 
 # URLs of where to obtain information.
 
@@ -61,7 +61,7 @@ sub troweprice
     my $quoter = shift;
     my(@q,%aa,$ua,$url,$sym);
 
-    # for T Rowe Price,  we get them all.
+    # for T Rowe Price,  we get them all. 
     $url = $TROWEPRICE_URL;
     $ua = $quoter->user_agent;
     my $reply = $ua->request(GET $url);
@@ -76,7 +76,7 @@ sub troweprice
             $aa {$sym, "exchange"} = "T. Rowe Price";  # TRP
 	    $aa {$sym, "method"} = "troweprice";
             # ($aa {$sym, "name"} = $q[0]) =~ s/^ +//;
-            $aa {$sym, "name"} = $sym;  # no name supplied ...
+            $aa {$sym, "name"} = $sym;  # no name supplied ... 
             $aa {$sym, "nav"} = $q[1];
 	    $quoter->store_date(\%aa, $sym, {usdate => $q[2]});
 	    $aa {$sym, "price"} = $aa{$sym,"nav"};
@@ -33,13 +33,13 @@ require 5.004;
 
 use strict;
 
-use vars qw($TRUSTNET_URL $TRUSTNET_ALL);
+use vars qw($VERSION $TRUSTNET_URL $TRUSTNET_ALL);
 
 use LWP::UserAgent;
 use HTTP::Request::Common;
 use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.02';
 
 # URLs of where to obtain information.
 
@@ -51,8 +51,8 @@ sub methods { return (uk_unit_trusts => \&trustnet, trustnet => \&trustnet); }
 
 {
         my @labels = qw/exchange method source name currency bid ask yield price/;
-
-	sub labels { return (trustnet => \@labels,
+	
+	sub labels { return (trustnet => \@labels, 
 	                     uk_unit_trusts => \@labels); }
 }
 
@@ -62,15 +62,15 @@ sub trustnet
   {
     my $quoter = shift;
     my @symbols = @_;
-
+    
     return unless @symbols;
     my(@q,%aa,$ua,$url,$sym,$ts,$price,$currency,$reply,$trust,$trusto,$unittype,$suffix);
     my ($row, $datarow, $matches, $encoded);
-    my %curr_iso = (GBP => "GBP", "£" => "GBP", "\$" => "USD");
-
+    my %curr_iso = (GBP => "GBP", "£" => "GBP", "\$" => "USD");
+    
     my %symbolhash;
     @symbolhash{@symbols} = map(1,@symbols);
-    #
+    # 
     for (@symbols) {
       my $te = new HTML::TableExtract( headers => [("Fund Name", "Group Name", "Bid Price", "Offer Price", "Yield")]);
       $trust = $_;
@@ -93,12 +93,12 @@ sub trustnet
       $ua = $quoter->user_agent;
       $reply = $ua->request(GET $url);
       return unless ($reply->is_success);
-
+      
       # print STDERR $reply->content,"\n";
-
+      
       $te->parse($reply->content);
       $ts  = ($te->table_states)[0];
-
+      
       if( defined ($ts)) {
 	# check the trust name - first look for an exact match trimming trailing spaces
 	$matches = 0;
@@ -107,7 +107,7 @@ sub trustnet
 	    next if !defined($$row[1]);
 	  ($sym = $$row[0]) =~ s/^ +//;
 	  $sym =~ s/ +\xA0.+//;
-
+	  
 	  #  print "Checking <", $sym,  "> for <", $trusto, ">\n";
 	  if ($sym =~ /^$trusto$/i) {
 	    $matches++;
@@ -22,7 +22,6 @@ use HTTP::Request::Common;
 use HTML::TableExtract;
 use HTML::Parser;
 
-our $VERSION = '1.37'; # VERSION
 my $TREASURY_MAINURL = ("http://www.publicdebt.treas.gov/");
 my $TREASURY_URL = ($TREASURY_MAINURL."sav/");
 
@@ -207,3 +206,4 @@ Finance::Quote
 Stephen Langenhoven (langenhoven@users.sourceforge.net), see module ZA for further acknowledgements.
 
 =cut
+
@@ -3,7 +3,7 @@
 #    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
 #    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
 #    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
+#    Copyright (C) 2000, Paul Fenwick <pjf@Acpan.org>
 #    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
 #    Copyright (C) 2000, Volker Stuerzl <volker.stuerzl@gmx.de>
 #    Copyright (C) 2002, Rainer Dorsch <rainer.dorsch@informatik.uni-stuttgart.de>
@@ -38,7 +38,9 @@ use strict;
 use LWP::UserAgent;
 use HTTP::Request::Common;
 
-our $VERSION = '1.37'; # VERSION
+use vars qw/$VERSION/;
+
+$VERSION = '1.00';
 
 sub methods { return (unionfunds => \&unionfunds); }
 sub labels { return (unionfunds => [qw/exchange name date isodate price method/]); }
@@ -135,7 +137,7 @@ sub unionurl
 
 =head1 NAME
 
-Finance::Quote::Union	- Obtain quotes from UNION (Zurich Financial Services Group).
+Finance::Quote::UNION	- Obtain quotes from UNION (Zurich Financial Services Group).
 
 =head1 SYNOPSIS
 
@@ -162,3 +164,7 @@ exchange, name, date, price, last.
 UNION (Union Invest), http://www.union-invest.de/
 
 =cut
+
+
+
+
@@ -6,12 +6,12 @@
 #	it under the terms of the GNU General Public License as published by
 #	the Free Software Foundation; either version 2 of the License, or
 #	(at your option) any later version.
-#
+#	
 #	This program is distributed in the hope that it will be useful,
 #	but WITHOUT ANY WARRANTY; without even the implied warranty of
 #	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 #	GNU General Public License for more details.
-#
+#	
 #	You should have received a copy of the GNU General Public License
 #	along with this program; if not, write to the Free Software
 #	Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
@@ -29,9 +29,8 @@ use strict;
 use LWP::UserAgent;
 use HTTP::Headers;
 
-use vars qw/@ISA /;
+use vars qw/@ISA/;
 
-our $VERSION = '1.37'; # VERSION
 @ISA = qw/LWP::UserAgent/;
 
 # A very simple extension.  When we generate a LWP::UserAgent object,
@@ -3,12 +3,10 @@
 #    Copyright (C) 1998, Dj Padzensky <djpadz@padz.net>
 #    Copyright (C) 1998, 1999 Linas Vepstas <linas@linas.org>
 #    Copyright (C) 2000, Yannick LE NY <y-le-ny@ifrance.com>
-#    Copyright (C) 2000, Paul Fenwick <pjf@cpan.org>
+#    Copyright (C) 2000, Paul Fenwick <pjf@Acpan.org>
 #    Copyright (C) 2000, Brent Neal <brentn@users.sourceforge.net>
 #    Copyright (C) 2000, Volker Stuerzl <volker.stuerzl@gmx.de>
-#    Copyright (C) 2003,2005,2006 Jörg Sommer <joerg@alea.gnuu.de>
-#    Copyright (C) 2008 Martin Kompf (skaringa at users.sourceforge.net)
-#    Copyright (C) 2014, Erik Colson <ecocode@cpan.org>
+#    Copyright (C) 2003,2005,2006 Jörg Sommer <joerg@alea.gnuu.de>
 #
 #    This program is free software; you can redistribute it and/or modify
 #    it under the terms of the GNU General Public License as published by
@@ -31,6 +29,15 @@
 #
 # This code was developed as part of GnuCash <http://www.gnucash.org/>
 
+use HTML::TableExtract;
+@ISA = qw( HTML::TableExtract );
+
+sub start {
+  # Fool ourselves into translating <br> to "\n"
+  my $self = shift;
+  $self->text("\n") if $_[0] eq 'br';
+  $self->SUPER::start(@_);
+}
 # =============================================================
 
 package Finance::Quote::VWD;
@@ -39,26 +46,28 @@ require 5.005;
 use strict;
 use LWP::UserAgent;
 use HTTP::Request::Common;
-use HTML::TreeBuilder;
 use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
+# use vars qw/$VERSION $VWD_FUNDS_URL/;
 
-sub methods { return ( vwd => \&vwd ); }
+use vars qw/$VERSION/;
 
-sub labels {
-    return ( vwd => [ qw/currency date isodate name price last symbol time/ ] );
-}
+$VERSION = '1.01';
+
+sub methods { return (vwd => \&vwd); }
+sub labels { return (vwd => [qw/ask bid currency date isodate exchange last
+				name net p_change price symbol time year_range/]); }
 
 # =======================================================================
 # The vwd routine gets quotes of funds from the website of
 # vwd Vereinigte Wirtschaftsdienste GmbH.
 #
 # This subroutine was written by Volker Stuerzl <volker.stuerzl@gmx.de>
-# and adjusted to match the new vwd interface by Jörg Sommer
+# and adjusted to match the new vwd interface by Jörg Sommer
 
 # Trim leading and tailing whitespaces (also non-breakable whitespaces)
-sub trim {
+sub trim
+{
     $_ = shift();
     s/^\s*//;
     s/\s*$//;
@@ -70,7 +79,8 @@ sub trim {
 # and tailing &plusmn; (plus minus) and translate german separators into
 # english separators. Also removes the thousands separator in returned
 # values.
-sub trimtr {
+sub trimtr
+{
     $_ = shift();
     s/&nbsp;//g;
     s/&plusmn;//g;
@@ -81,143 +91,89 @@ sub trimtr {
     return $_;
 }
 
-sub vwd {
-    my $quoter = shift;
-    my $ua     = $quoter->user_agent();
-    my @funds  = @_;
-    return unless (@funds);
-    my %info;
-
-    # LOGGING - set to 1 to enable log file
-    my $logging = 0;
-    if ($logging) {
-        open( LOG, ">>/tmp/vwd.log" );
-    }
-
-    my $max_retry = 30;
-    foreach my $fund (@funds) {
-        $info{ $fund, "source" }   = "VWD";
-        $info{ $fund, "success" }  = 0;
-        $info{ $fund, "errormsg" } = "Parse error";
-
-        my $request =
-              "http://www.finanztreff.de/"
-            . "kurse_einzelkurs_suche.htn?suchbegriff="
-            . $fund;
-        if ($logging) {
-            print LOG "Request='$request'\n";
-        }
-        my $response = $ua->get($request);
-        if ( $response->is_success ) {
-            my $html = $response->decoded_content;
-
-            my $tree = HTML::TreeBuilder->new;
-            $tree->parse($html);
-
-            # all other info below <div class=contentBox>
-            my $content =
-                $tree->look_down( "_tag", "div", "class", "contentBox" );
-            next if not $content;
-
-            my $wpkurs =
-                $content->look_down( "_tag", "div", "class", qr/wpKurs/ );
-            next if not $wpkurs;
-
-            my $wpfacts =
-                $content->look_down( "_tag", "div", "class", qr/wpFacts/ );
-            next if not $wpfacts;
-
-            my $title = $wpkurs->find("h1");
-            $title->find("span")->delete_content;
-            $info{ $fund, "name" } = $title->as_trimmed_text;
-
-            my $te = new HTML::TableExtract( depth => 0, count => 0 );
-            $te->parse( $wpkurs->as_HTML );
-            my $table = $te->first_table_found;
-
-            # class val contains data. hopefully order and quantity won't change
-            my @wpfacts_vals = $wpfacts->look_down( "_tag", "span","class", qr/val/);
-            my $datum = $wpfacts_vals[1]->as_trimmed_text;
-
-            if ($logging) {
-                print LOG "datum: $datum\n";
-            }
-            if ( $datum =~ /([(0123]\d)\.([01]\d)\.(\d\d)/ ) {
-
-                # datum contains date
-                $quoter->store_date( \%info, $fund,
-                                     { day => $1, month => $2, year => $3 } );
-                $info{ $fund, "time" } = $quoter->isoTime("18:00");
-            }
-            elsif ( $datum =~ /([012]\d:[0-5]\d:[0-5]\d)/ ) {
-
-                #datum contains time
-                $quoter->store_date( \%info, $fund );
-                $info{ $fund, "time" } = $quoter->isoTime($1);
-            }
-            my $kurs = $table->cell( 0, 1 );
-            next if not $kurs;
-            $info{ $fund, "price" } = $info{ $fund, "last" } = trimtr($kurs);
-
-            # Currency (Währung)
-            my $whrg =
-                $tree->look_down( "_tag", "div", "class", "whrg" );
-            if ($whrg) {
-                my $whrgtext = $whrg->as_trimmed_text();
-                $whrgtext =~ s/.*hrung: // ;
-                $info{ $fund, "currency" } = $whrgtext;
-            }
-            else {
-                $info{ $fund, "currency" } = "EUR";
-            }
-
-            my $symbol = $wpfacts_vals[4]->as_trimmed_text;
-            $info{ $fund, "symbol" } = $symbol;
-
-            # fund ok
-            $info{ $fund, "success" }  = 1;
-            $info{ $fund, "errormsg" } = "";
-
-            # log
-            if ($logging) {
-                print LOG join( ':',
-                                $info{ $fund, "name" },
-                                $info{ $fund, "symbol" },
-                                $info{ $fund, "date" },
-                                $info{ $fund, "time" },
-                                $info{ $fund, "price" },
-                                $info{ $fund, "currency" } );
-                print LOG "\n";
-            }
-
-            $tree->delete;
-        }
-        else {
-            $info{ $fund, "success" }  = 0;
-            $info{ $fund, "errormsg" } = "HTTP error " . $response->status_line;
-            if ($logging) {
-                print LOG "ERROR $fund: " . $info{ $fund, "errormsg" } . "\n";
-            }
-            if ( $response->code == 503 && $max_retry-- > 0 ) {
-
-                # The server limits the number of request per time and client
-                sleep 5;
-                redo;
-            }
-        }
+sub vwd
+{
+  my $quoter = shift;
+  my $ua = $quoter->user_agent();
+  my @funds = @_;
+  return unless (@funds);
+  my %info;
+
+  foreach my $fund (@funds)
+  {
+    $info{$fund, "source"} = "VWD";
+    $info{$fund, "success"} = 0;
+    $info{$fund, "errormsg"} = "Parse error";
+
+    my $response = $ua->get("http://www.finanztreff.de/ftreff/".
+	"kurse_einzelkurs_uebersicht.htm?s=".$fund);
+    if ($response->is_success)
+    {
+      # parse only the part with the relevant informations; sometimes
+      # tables are inserted before which displace the table numbers and
+      # make parsing difficult. But there are marks in the source code and
+      # HTML::TableExtract as really tolerant with HTML.
+      my $html = $response->content;
+      my $offset = index($html, "<!-- Stammdaten -->");
+      if ($offset == -1) {
+	$info{$fund, "success"}  = 0;
+	$info{$fund, "errormsg"} = "Invalid symbol: $fund";
+	next;
+      }
+      my $len = rindex($html, "<!-- /Vergleich -->") - $offset;
+      if ($len > 0) {
+          $html = substr($html, $offset, $len);
+      } else {
+          $html = substr($html, $offset);
+      }
+
+      my $table = new HTML::TableExtract(decode=>0)->parse($html);
+
+      # we expect at least five tables: Stammdaten, Jahreschart,
+      # Kursdaten, "Ihre Kurseinschätzung", Vergleich
+      next if ( scalar($table->table_states) < 5);
+
+      # extract the contents of "Stammdaten"
+      my @rows = ($table->table_states)[0]->rows();
+      $info{$fund, "name"}     = trim( $rows[1][1] );
+      $info{$fund, "symbol"}   = trim( $rows[4][1] );
+      $info{$fund, "currency"} = trim( $rows[8][1] );
+
+      # extract the contents of "Jahreschart"
+      @rows = ($table->table_states)[1]->rows();
+      $quoter->store_date(\%info, $fund, {eurodate => $rows[0][1]});
+
+      # extract the contents of "Kursdaten"
+      @rows = ($table->table_states)[2]->rows();
+      $info{$fund, "exchange"} = trimtr( $rows[0][1] );
+      $info{$fund, "price"} = $info{$fund, "last"} = trimtr( $rows[1][1] );
+      $info{$fund, "net"} = trimtr( $rows[2][2] );
+      ($info{$fund, "time"}) = ($rows[1][0] =~ /(\d{1,2}:\d{1,2}:\d{1,2})/);
+      $info{$fund, "p_change"} = trimtr( $rows[1][2] );
+      $info{$fund, "year_range"} = trimtr($rows[8][1])." - ".trimtr($rows[8][2]);
+      $info{$fund, "bid"} = trimtr( $rows[4][1] );
+      $info{$fund, "ask"} = trimtr( $rows[5][1] );
+
+      # extract the contents of "Vergleich"
+      @rows = ($table->table_states)[4]->rows();
+      $info{$fund, "close"} = trimtr( $rows[1][1] );
+
+      $info{$fund, "success"}  = 1;
+      $info{$fund, "errormsg"} = "";
+    } else {
+      $info{$fund, "success"}  = 0;
+      $info{$fund, "errormsg"} = "HTTP error";
     }
+  }
 
-    if ($logging) {
-        close LOG;
-    }
-    return wantarray() ? %info : \%info;
+  return wantarray() ? %info : \%info;
 }
 
 1;
 
 =head1 NAME
 
-Finance::Quote::VWD  - Obtain quotes from vwd Vereinigte Wirtschaftsdienste GmbH.
+Finance::Quote::vwd	- Obtain quotes from vwd Vereinigte Wirtschaftsdienste GmbH.
 
 =head1 SYNOPSIS
 
@@ -239,7 +195,8 @@ and conditions.
 =head1 LABELS RETURNED
 
 The following labels may be returned by Finance::Quote::vwd:
-currency date isodate name price last symbol time.
+ask, bid, currency, date, isodate, exchange, last, name, net,
+p_change, price, symbol, time, year_range.
 
 =head1 SEE ALSO
 
@@ -36,13 +36,13 @@ use HTTP::Request::Common;
 use LWP::UserAgent;
 use Finance::Quote::Yahoo::Base qw/yahoo_request base_yahoo_labels/;
 
-use vars qw( $YAHOO_ASIA_URL);
+use vars qw($VERSION $YAHOO_ASIA_URL);
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.00';
 
 # URLs of where to obtain information.
 
-$YAHOO_ASIA_URL = ("http://download.finance.yahoo.com/d/quotes.csv");
+$YAHOO_ASIA_URL = ("http://sg.finance.yahoo.com/d/quotes.csv");
 
 sub methods {return (asia => \&yahoo_asia,yahoo_asia => \&yahoo_asia)};
 
@@ -33,13 +33,13 @@ use HTTP::Request::Common;
 use LWP::UserAgent;
 use Finance::Quote::Yahoo::Base qw/yahoo_request base_yahoo_labels/;
 
-use vars qw/ $YAHOO_AUSTRALIA_URL/;
+use vars qw/$VERSION $YAHOO_AUSTRALIA_URL/;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.00';
 
 # URLs of where to obtain information.
 
-$YAHOO_AUSTRALIA_URL = ("http://download.finance.yahoo.com/d/quotes.csv");
+$YAHOO_AUSTRALIA_URL = ("http://au.finance.yahoo.com/d/quotes.csv");
 
 sub methods {return (australia       => \&yahoo_australia,
 		     yahoo_australia => \&yahoo_australia)};
@@ -37,14 +37,14 @@ use LWP::UserAgent;
 use HTTP::Request::Common;
 use Exporter;
 
-use vars qw/ @FIELDS @FIELD_ENCODING $MAX_REQUEST_SIZE @ISA
+use vars qw/$VERSION @FIELDS @FIELD_ENCODING $MAX_REQUEST_SIZE @ISA
             @EXPORT @EXPORT_OK/;
 
 @ISA = qw/Exporter/;
 @EXPORT = qw//;
 @EXPORT_OK = qw/yahoo_request base_yahoo_labels/;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.03';
 
 # This is the maximum number of stocks we'll batch into one operation.
 # If this gets too big (>50 or thereabouts) things will break because
@@ -144,7 +144,7 @@ my %currency_tags = (
 # This function expects a Finance::Quote object, a base URL to use,
 # a refernece to a list of symbols to lookup.  If a fourth argument is
 # used then it will act as a suffix that needs to be appended to the stocks
-# in order to obtain the correct information.  This function relies upon
+# in order to obtain the correct information.  This function relies upon 
 # the fact that the various Yahoo's all work the same way.
 
 sub yahoo_request {
@@ -156,6 +156,8 @@ sub yahoo_request {
 
 	# The suffix is used to specify particular markets.
 	my $suffix = shift || "";
+	
+	my $uses_semicolon = shift || 0;
 
 	my %info;
 	my $ua = $quoter->user_agent;
@@ -173,7 +175,6 @@ sub yahoo_request {
 
 		my $url = $base_url . join("$suffix+",@symbols);
 		chop $url;	# Chop off the final +
-                print "DEBUG - GET: $url\n" if $ENV{"FQ_DEBUG"};
 		my $response = $ua->request(GET $url);
 		return unless $response->is_success;
 
@@ -182,7 +183,11 @@ sub yahoo_request {
 
 		foreach (split('\015?\012',$response->content)) {
 			my @q;
-                        @q = $quoter->parse_csv($_);
+			if ($uses_semicolon) {
+				@q = $quoter->parse_csv_semicolon($_);
+			} else {
+				@q = $quoter->parse_csv($_);
+			}
 			my $symbol = $q[0];
 			my ($exchange) = $symbol =~ m/\.([A-Z]+)/;
 
@@ -199,11 +204,6 @@ sub yahoo_request {
 				# retrieval, Yahoo will drop in an
 				# undefined field
 				next unless (defined $q[$i] && length $q[$i]);
-                                # remove trailing spaces added for
-                                # yahoo::europe quotes, since currency
-                                # is returned with a trailing white
-                                # space
-                                $q[$i] =~ s/\s*$// ;
 				$info{$symbol,$FIELDS[$i]} = $q[$i];
 			}
 
@@ -240,52 +240,11 @@ sub yahoo_request {
 				$info{$symbol, "high"} = $2;
 			}
 
-                        if (defined($info{$symbol,"time"})) {
-                          # uniform time output
-                          $info{$symbol,"time"} = $quoter->isoTime($info{$symbol,"time"});
-                        }
-
-                        # "cap" from Yahoo::USA sometimes has "B" for
-                        # billions suffix, eg. from "F" Ford -- expand that
-                        # to a plain number for ease of use
-                        if (defined($info{$symbol,"cap"})) {
-                          $info{$symbol,"cap"}
-                            = $quoter->B_to_billions ($info{$symbol,"cap"});
-                        }
-
-      # Convert prices (when needed). E.G. Some London sources
-      # return in pence. Yahoo denotes this with GBP vs GBp
-      # We'd like them to return in pounds (divide by 100).
-      if (defined($exchange)) {
-        if ((($exchange eq "L") &&
-             (($info{$symbol,"currency"} eq "GBp") ||
-              #Assume GBX also quoted in pence; if not remove next line
-              ($info{$symbol,"currency"} eq "GBX"))) ||
-            ($exchange eq "TA")) {
-          foreach my $field ($quoter->default_currency_fields) {
-            next unless ($info{$symbol,$field});
-            $info{$symbol,$field} =
-              $quoter->scale_field($info{$symbol,$field},0.01);
-          }
-        } ;
-        if (($exchange eq "L") && defined($info{$symbol,"year_range"})) {         # if a year range is returned for exchange=L
-          if ($info{$symbol,"year_range"}=~ m/([\d\.]+)\s*-\s*([\d\.]+)/) {       # take year low and high
-            my ($year_low,$year_high) = ($1,$2) ;
-            if ($info{$symbol,"close"} <= $year_low) {                            # sometimes year_range was expressed in .01 GBp
-              $info{$symbol,"year_range"} = ($year_low/100)." - ".($year_high/100) ;
-            }
-          }
-        }
-        # Other exchanges here as needed.
-      }
-
 			if (defined($info{$symbol,"currency"})) {
-        # Having converted London prices to GBP above we
-        # make upper-case and turn GBX to GBP.
+			  # Convert the currency to be all uppercase for
+			  # backward compatability.  Needed because Yahoo
+			  # returns GBP as GBp.  There may be others.
 			  $info{$symbol,"currency"} =~ tr/a-z/A-Z/;
-                          # yahoo started to return GBX instead of GBP
-                          # somewhere arround 9 oct 2008.
-                          $info{$symbol,"currency"} =~ s/GBX/GBP/;
 #			  printf "Currency %s specified by Yahoo\n", $info{$symbol,"currency"};
 			} else {
 			  # Determine the currency from the exchange name.
@@ -302,6 +261,20 @@ sub yahoo_request {
 			  $info{$symbol,"currency_set_by_fq"} = 1;
 			}
 
+			# Convert prices (when needed). E.G. London sources
+			# return in pence. We'd like them to return in pounds
+			# (divide by 100).
+			if (defined($exchange)) {
+			  if (($exchange eq "L"  && $info{$symbol,"currency"} eq "GBP") ||
+			      ($exchange eq "TA")) {
+			    foreach my $field ($quoter->default_currency_fields) {
+			      next unless ($info{$symbol,$field});
+			      $info{$symbol,$field} =
+				$quoter->scale_field($info{$symbol,$field},0.01);
+			    }
+			  }
+			  # Other exchanges here as needed.
+			}
 
 		} # End of processing each stock line.
 	} # End of lookup loop.
@@ -328,7 +301,6 @@ sub yahoo_request {
 	return \%info;
 }
 
-
 1;
 
 =head1 NAME
@@ -33,13 +33,13 @@ use HTTP::Request::Common;
 use LWP::UserAgent;
 use Finance::Quote::Yahoo::Base qw/yahoo_request base_yahoo_labels/;
 
-use vars qw/ $YAHOO_BRASIL_URL/;
+use vars qw/$VERSION $YAHOO_BRASIL_URL/;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.00';
 
 # URLs of where to obtain information.
 
-$YAHOO_BRASIL_URL = ("http://download.finance.yahoo.com/d/quotes.csv");
+$YAHOO_BRASIL_URL = ("http://br.finance.yahoo.com/d/quotes.csv");
 
 sub methods {return (brasil       => \&yahoo_brasil,
 		     yahoo_brasil => \&yahoo_brasil)};
@@ -58,7 +58,7 @@ sub yahoo_brasil
 	return unless @symbols;	# Nothing if no symbols.
 
 	# This does all the hard work.
-        my %info = yahoo_request($quoter,$YAHOO_BRASIL_URL,\@symbols,".SA");
+	my %info = yahoo_request($quoter,$YAHOO_BRASIL_URL,\@symbols,".SA", 0);
 
 	foreach my $symbol (@symbols) {
 		next unless $info{$symbol,"success"};
@@ -34,26 +34,13 @@ use HTTP::Request::Common;
 use LWP::UserAgent;
 use Finance::Quote::Yahoo::Base qw/yahoo_request base_yahoo_labels/;
 
-use vars qw( $YAHOO_EUROPE_URL);
+use vars qw($VERSION $YAHOO_EUROPE_URL);
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.03';
 
 # URLs of where to obtain information.
 
-$YAHOO_EUROPE_URL = ("http://download.finance.yahoo.com/d/quotes.csv");
-
-# Yahoo Europe switched date and time. sending t1d1 or d1t1
-# returns the same : Time followed by date. This is a short
-# bug fix until yahoo changes back again.
-#
-# Yahoo Europe doens't return values for r1 (div_date) and q (ex_div)
-# Another solution might be to change Base.pm FIELDS labels to this
-# string + div_date and ex_div. Code would be nicier, but this will
-# need more testing for other yahoo modules and can be done later.
-our @YH_EUROPE_FIELDS = qw/symbol name last net p_change volume bid ask
-                           close open day_range year_range eps pe div div_yield
-                           cap avg_vol currency time date ex_div div_date/;
-our @YH_FIELD_ENCODING = qw/s n l1 c1 p2 v b a p o m w e r d y j1 a2 c4 t1 d1 q r1/;
+$YAHOO_EUROPE_URL = ("http://uk.finance.yahoo.com/d/quotes.csv");
 
 sub methods {return (europe => \&yahoo_europe,yahoo_europe => \&yahoo_europe)};
 
@@ -71,11 +58,6 @@ sub yahoo_europe
 	my @symbols = @_;
 	return unless @symbols;	# Nothing if no symbols.
 
-        # localise the Base.FIELDS array. Perl restores the array at
-        # the end of this sub.
-        local @Finance::Quote::Yahoo::Base::FIELDS = @YH_EUROPE_FIELDS ;
-        local @Finance::Quote::Yahoo::Base::FIELD_ENCODING = @YH_FIELD_ENCODING ;
-
 	# This does all the hard work.
 	my %info = yahoo_request($quoter,$YAHOO_EUROPE_URL,\@symbols);
 
@@ -99,8 +81,8 @@ Finance::Quote::Yahoo::Europe - Fetch quotes from Yahoo Europe
     use Finance::Quote;
     $q = Finance::Quote->new;
 
-    %info = $q->fetch("europe","UG.PA"); # Failover to other methods ok.
-    %info = $q->fetch("yahoo_europe","UG.PA"); # Use this module only.
+    %info = $q->fetch("europe","12150.PA"); # Failover to other methods ok.
+    %info = $q->fetch("yahoo_europe","12150.PA"); # Use this module only.
 
 =head1 DESCRIPTION
 
@@ -112,7 +94,7 @@ one of the following:
 	BC - Barcelona
 	BE - Berlin
 	BI - Bilbao
-	BR - Brussels
+	BR - Breme
 	CO - Copenhagen
 	D  - Dusseldorf
 	F  - Frankfurt
@@ -142,20 +124,12 @@ Finance::Quote->new().
 Information obtained by this module may be covered by Yahoo's terms
 and conditions.  See http://finance.uk.yahoo.com/ for more details.
 
-=head1 SPECIFIC NOTES ON CERTAIN SYMBOLS
-
-Starting in November 2010, the Yahoo site didn't respond to ^DJI symbol
-retrieval. Use ^DJI.US instead.
-
 =head1 LABELS RETURNED
 
 This module returns all the standard labels (where available) provided
 by Yahoo.  See Finance::Quote::Yahoo::Base for a list of these.  The
 currency label is also returned.
 
-Note however that div_date and ex_div have been removed by yahoo
-europe site
-
 =head1 SEE ALSO
 
 Yahoo Europe, http://finance.uk.yahoo.com/
@@ -32,13 +32,13 @@ use HTTP::Request::Common;
 use LWP::UserAgent;
 use Finance::Quote::Yahoo::Base qw/yahoo_request base_yahoo_labels/;
 
-use vars qw/$YAHOO_NZ_URL/;
+use vars qw/$VERSION $YAHOO_NZ_URL/;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.00';
 
 # URLs of where to obtain information.
 
-$YAHOO_NZ_URL = ("http://download.finance.yahoo.com/d/quotes.csv");
+$YAHOO_NZ_URL = ("http://au.finance.yahoo.com/d/quotes.csv");
 
 sub methods {return (nz => \&yahoo_nz, yahoo_nz => \&yahoo_nz)};
 
@@ -73,7 +73,7 @@ sub yahoo_nz
 
 =head1 NAME
 
-Finance::Quote::Yahoo::NZ - Fetch nzn stock quotes via Yahoo.
+Finance::Quote::Yahoo::nz - Fetch nzn stock quotes via Yahoo.
 
 =head1 SYNOPSIS
 
@@ -35,13 +35,13 @@ use HTTP::Request::Common;
 use LWP::UserAgent;
 use Finance::Quote::Yahoo::Base qw/yahoo_request base_yahoo_labels/;
 
-use vars qw/$YAHOO_URL/;
+use vars qw/$VERSION $YAHOO_URL/;
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.00';
 
 # URLs of where to obtain information.
 
-$YAHOO_URL = ("http://download.finance.yahoo.com/d/quotes.csv");
+$YAHOO_URL = ("http://finance.yahoo.com/d");
 
 sub methods {return (canada   => \&yahoo,
                      usa      => \&yahoo,
@@ -1,185 +0,0 @@
-#!/usr/bin/perl -w
-#    This module is based on the Finance::Quote::BSERO module
-#    It was first called BOMSE but has been renamed to yahooJSON
-#    since it gets a lot of quotes besides Indian
-#
-#    The code has been modified by Abhijit K to
-#    retrieve stock information from Yahoo Finance through json calls
-#
-#    This program is free software; you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation; either version 2 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program; if not, write to the Free Software
-#    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-#    02111-1307, USA
-
-package Finance::Quote::YahooJSON;
-
-require 5.005;
-
-use strict;
-use JSON qw( decode_json );
-use vars qw($VERSION $YIND_URL_HEAD $YIND_URL_TAIL);
-use LWP::UserAgent;
-use HTTP::Request::Common;
-use HTML::TableExtract;
-use Time::Piece;
-
-our $VERSION = '1.37'; # VERSION
-
-my $YIND_URL_HEAD = 'http://finance.yahoo.com/webservice/v1/symbols/';
-my $YIND_URL_TAIL = '/quote?format=json';
-
-sub methods {
-    return ( yahoo_json => \&yahoo_json,
-    );
-}
-{
-    my @labels = qw/name last date isodate p_change open high low close
-        volume currency method exchange type/;
-
-    sub labels {
-        return ( yahoo_json => \@labels,
-        );
-    }
-}
-
-sub yahoo_json {
-
-    my $quoter = shift;
-    my @stocks = @_;
-    my ( %info, $reply, $url, $te, $ts, $row, @cells, $ce );
-    my ( $my_date, $my_last, $my_p_change, $my_volume, $my_high, $my_low,
-         $my_open );
-    my $ua = $quoter->user_agent();
-
-    foreach my $stocks (@stocks) {
-
-        $url   = $YIND_URL_HEAD . $stocks . $YIND_URL_TAIL;
-        $reply = $ua->request( GET $url);
-
-        my $code    = $reply->code;
-        my $desc    = HTTP::Status::status_message($code);
-        my $headers = $reply->headers_as_string;
-        my $body    = $reply->content;
-
-        #Response variables available:
-        #Response code: 			$code
-        #Response description: 	$desc
-        #HTTP Headers:				$headers
-        #Response body				$body
-
-        $info{ $stocks, "symbol" } = $stocks;
-
-        if ( $code == 200 ) {
-
-            #HTTP_Response succeeded - parse the data
-            my $json_data = JSON::decode_json $body;
-
-            #print ref($json_data);
-            #print "size of hash:  " . keys( $json_data ) . ".\n";
-
-            my $json_data_count = $json_data->{'list'}{'meta'}{'count'};
-
-            if ( $json_data_count != 1 ) {
-                $info{ $stocks, "success" } = 0;
-                $info{ $stocks, "errormsg" } =
-                    "Error retrieving quote for $stocks - no listing for this name found. Please check scrip name and the two letter extension (if any)";
-
-            }
-            else {
-
-                my $json_resources = $json_data->{'list'}{'resources'}[0];
-                my $json_response_type =
-                    $json_resources->{'resource'}{classname};
-
-                # TODO: Check if $json_response_type is "Quote"
-                # before attempting anything else
-                my $json_symbol =
-                    $json_resources->{'resource'}{'fields'}{'symbol_requested'}
-                    || $json_resources->{'resource'}{'fields'}{'symbol'};
-                my $json_volume =
-                    $json_resources->{'resource'}{'fields'}{'volume'};
-                my $json_timestamp =
-                    $json_resources->{'resource'}{'fields'}{'ts'};
-                my $json_name = $json_resources->{'resource'}{'fields'}{'name'};
-                my $json_type = $json_resources->{'resource'}{'fields'}{'type'};
-                my $json_price =
-                    $json_resources->{'resource'}{'fields'}{'price'};
-                my $json_utctime =
-                    $json_resources->{'resource'}{'fields'}{'utctime'};
-
-                $info{ $stocks, "success" } = 1;
-                $info{ $stocks, "exchange" } =
-                    "Sourced from Yahoo Finance (as JSON)";
-                $info{ $stocks, "method" } = "yahoo_json";
-                $info{ $stocks, "name" }   = $stocks . ' (' . $json_name . ')';
-                $info{ $stocks, "type" }   = $json_type;
-                $info{ $stocks, "last" }   = $json_price;
-                $info{ $stocks, "volume" }   = $json_volume;
-                $info{ $stocks, "isodate" } = ( $json_utctime =~ /dddd-dd-dd/ );
-
-                $my_date = localtime($json_timestamp)->strftime('%d.%m.%Y %T');
-                if ( $json_utctime =~ /(\d\d\d\d)-(\d\d)-(\d\d)/ ) {
-                    $my_date = $3.".".$2.".".$1.".";
-                }
-
-                $quoter->store_date( \%info, $stocks,
-                                     { eurodate => $my_date } );
-
-            }
-        }
-
-        #HTTP request fail
-        else {
-            $info{ $stocks, "success" } = 0;
-            $info{ $stocks, "errormsg" } =
-                "Error retrieving quote for $stocks. Attempt to fetch the URL $url resulted in HTTP response $code ($desc)";
-        }
-
-    }
-
-    return wantarray() ? %info : \%info;
-    return \%info;
-}
-
-1;
-
-=head1 NAME
-
-Finance::Quote::YahooJSON - Obtain quotes from Yahoo Finance through JSON call
-
-=head1 SYNOPSIS
-
-    use Finance::Quote;
-
-    $q = Finance::Quote->new;
-
-    %info = Finance::Quote->fetch("yahoo_json","SBIIN.NS");
-
-=head1 DESCRIPTION
-
-This module fetches information from Yahoo as JSON
-
-This module is loaded by default on a Finance::Quote object. It's
-also possible to load it explicity by placing "YahooJSON" in the argument
-list to Finance::Quote->new().
-
-This module provides the "yahoo_json" fetch method.
-
-=head1 LABELS RETURNED
-
-The following labels may be returned by Finance::Quote::YahooJSON :
-name, last, isodate, volume, method, exchange.
-
-=head1 SEE ALSO
-
-=cut
@@ -2,22 +2,13 @@
 #
 # ZA.pm
 #
-# 2013.05.01
-# Changes to table references to correct for new sharenet web page layout
-# Timothy Boyle
-
-# 2008.02.18
-# This version corrects the data downloaded by removing spaces and converting
-# cent values into Rand values – this ensures that the Price Editor in GNUCash
-# can import the data. The rest of the module and all the hard work
-# remains that of Stephen Langenhoven!
-# Rolf Endres
-#
-# 2005.07.19
-# Download of South African (ZA) stocks from sharenet
+# Version 0.1 - Download of South African (ZA) stocks from sharenet
 # This version based largely upon FinanceCanada.pm module [any errors
 # are my own of course ;-) ]
+#
 # Stephen Langenhoven
+# 2005.07.19
+
 
 package Finance::Quote::ZA;
 require 5.004;
@@ -28,26 +19,26 @@ use LWP::UserAgent;
 use HTTP::Request::Common;
 use HTML::TableExtract;
 
-our $VERSION = '1.37'; # VERSION
-
 my $SHARENET_MAINURL = ("http://www.sharenet.co.za/");
-my $SHARENET_URL     = ( $SHARENET_MAINURL . "jse/" );
+my $SHARENET_URL = ($SHARENET_MAINURL."jse/");
 
 sub methods {
-    return ( za => \&sharenet );
+    return (za => \&sharenet);
 }
 
+
 sub labels {
-    my @labels =
-        qw/method source name symbol currency last date isodate high low p_change/;
-    return ( sharenet => \@labels );
-}
+    my @labels = qw/method source name symbol currency last date isodate high low p_change/;
+    return (sharenet => \@labels);
+}   
+
 
 sub sharenet {
-    my $quoter  = shift;
+
+    my $quoter = shift;
     my @symbols = @_;
     my %info;
-    my ( $te, $ts, $row );
+    my ($te, $ts, $row);
     my @rows;
 
     return unless @symbols;
@@ -55,120 +46,79 @@ sub sharenet {
     my $ua = $quoter->user_agent;
 
     foreach my $symbol (@symbols) {
-        my $url = $SHARENET_URL . $symbol;
-
-        # print "[debug]: ", $url, "\n";
-        my $response = $ua->request( GET $url);
-
-        # print "[debug]: ", $response->content, "\n";
-
-        if ( !$response->is_success ) {
-            $info{ $symbol, "success" }  = 0;
-            $info{ $symbol, "errormsg" } = "Error contacting URL";
+        my $url = $SHARENET_URL.$symbol;
+        #print "[debug]: ", $url, "\n";
+        my $response = $ua->request(GET $url);
+        #print "[debug]: ", $response->content, "\n";
+
+        if (!$response->is_success) {
+            $info{$symbol, "success"} = 0;
+            $info{$symbol, "errormsg"} = "Error contacting URL";
             next;
         }
 
         $te = new HTML::TableExtract();
-        $te->parse( $response->content );
+        $te->parse($response->content);
+        #print "[debug]: (parsed HTML)",$te, "\n";
 
-        # print "[debug]: (parsed HTML)",$te, "\n";
+	unless ($te->first_table_found()) {
+	  #print STDERR  "no tables on this page\n";
+	  $info{$symbol, "success"}  = 0;
+	  $info{$symbol, "errormsg"} = "Parse error";
+	  next;
+	}
 
-        unless ( $te->first_table_found() ) {
+# Debug to dump all tables in HTML...
 
-            # print STDERR  "no tables on this page\n";
-            $info{ $symbol, "success" }  = 0;
-            $info{ $symbol, "errormsg" } = "Parse error";
-            next;
-        }
+#           print "\n \n \n \n[debug]: ++++ ==== ++++ ==== ++++ ==== ++++ ==== START OF TABLE DUMP ++++ ==== ++++ ==== ++++ ==== ++++ ==== \n \n \n \n";
+#
+#         foreach $ts ($te->table_states) {;
+#
+#           printf "\n \n \n \n[debug]: //// \\\\ //// \\\\ //// \\\\ //// \\\\ START OF TABLE %d,%d //// \\\\ //// \\\\ //// \\\\ //// \\\\ \n \n \n \n",
+#	     $ts->depth, $ts->count;
+#
+#           foreach $row ($ts->rows) {
+#             print "[debug]: ", $row->[0], " | ", $row->[1], " | ", $row->[2], " | ", $row->[3], "\n";
+#           }
+#         }
+#
+#           print "\n \n \n \n[debug]: ++++ ==== ++++ ==== ++++ ==== ++++ ==== END OF TABLE DUMP ++++ ==== ++++ ==== ++++ ==== ++++ ==== \n \n \n \n";
 
-        # Debug to dump all tables in HTML...
-
-        #   print "\n \n \n \n[debug]: ++++ ==== ++++ ==== ++++ ==== ++++ ==== START OF TABLE DUMP ++++ ==== ++++ ==== ++++ ==== ++++ ==== \n \n \n \n";
-        #
-        # foreach $ts ($te->table_states) {;
-        #
-        #   printf "\n \n \n \n[debug]: //// \\\\ //// \\\\ //// \\\\ //// \\\\ START OF TABLE %d,%d //// \\\\ //// \\\\ //// \\\\ //// \\\\ \n \n \n \n",
-        #    $ts->depth, $ts->count;
-        #
-        #  foreach $row ($ts->rows) {
-        #    print "[debug]: ", $row->[0], " | ", $row->[1], " | ", $row->[2], " | ", $row->[3], "\n";
-        #   }
-        # }
-        #
-        #   print "\n \n \n \n[debug]: ++++ ==== ++++ ==== ++++ ==== ++++ ==== END OF TABLE DUMP ++++ ==== ++++ ==== ++++ ==== ++++ ==== \n \n \n \n";
-
-        # GENERAL FIELDS
-        $info{ $symbol, "success" } = 1;
-        $info{ $symbol, "method" }  = "sharenet";
-
-        $info{ $symbol, "symbol" }   = $symbol;
-        $info{ $symbol, "currency" } = "ZAR";
-        $info{ $symbol, "source" }   = $SHARENET_MAINURL;
-
-        # NAME
-        $ts = $te->table_state( 2, 1 );    # new table reference
-        if ($ts) {
-            (@rows) = $ts->rows;
-            $info{ $symbol, "name" } = $rows[2][1];
-        }
 
-        $info{ $symbol, "name" } =~ tr/ //d;
-
-        # DATE AND CLOSING PRICE
-        $ts = $te->table_state( 3, 0 );   # change table for new sharenet layout
-
-        # print "[debug]: ", "got this far...", "\n";
-        # print "[debug]: (table_state)",$ts, "\n";
-        if ($ts) {
-            (@rows) = $ts->rows;
-
-            # date for last trade sale, high, low
-            # sharenet only gives the day and month. We could use today's date, but this would not
-            # be correct over weekends and public holidays (if it matters)
-            my $date =
-                substr( $rows[0][0], 16, 5 )
-                . "/";    #extract the day/month from the string and add /
-
-            # this does the same as above in a more robust fashion
-            #     my $date  = $rows[0][0]; # day/month plus time plus text
-            #     $date =~ s/[^0-9\/]//g; # remove most unwanted characters
-            #     $date =~ s/\d{4}$/\//; # remove last 4 digits = time and add / for the year
-
-            my $year =
-                ( localtime() )[5]
-                + 1900;    # extract year from system time vector
-            $date = $date . $year;    # add it to the day/month
-
-            # print $date, "\n"; # we now have the date of the trades as dd/mm/yyyy
-            $quoter->store_date( \%info, $symbol, { eurodate => $date } )
-                ;                     # gives eurodate and isodate symbols
-
-            # $quoter->store_date(\%info, $symbol, {today => 1}); # could use today's date
-            # last traded price
-            $info{ $symbol, "last" } = $rows[2][1];
-            $info{ $symbol, "last" } =~ tr/ //d;
-            $info{ $symbol, "last" } = 0.01 * $info{ $symbol, "last" };
-
-            # highest price today
-            $info{ $symbol, "high" } = $rows[16][1];
-            $info{ $symbol, "high" } =~ tr/ //d;
-            $info{ $symbol, "high" } = 0.01 * $info{ $symbol, "high" };
-
-            # lowest price today
-            $info{ $symbol, "low" } = $rows[18][1];
-            $info{ $symbol, "low" } =~ tr/ //d;
-            $info{ $symbol, "low" } = 0.01 * $info{ $symbol, "low" };
-
-            # percent change from previous close
-            $info{ $symbol, "p_change" } = $rows[10][1];
-            $info{ $symbol, "p_change" } =~ tr/ //d;
-
-            # actual net change from previous close
-            $info{ $symbol, "net" } = $rows[8][1];
-            $info{ $symbol, "net" } =~ tr/ //d;
+# GENERAL FIELDS
+	$info{$symbol, "success"} = 1;
+        $info{$symbol, "method"} = "sharenet";
 
+        $info{$symbol, "symbol"} = $symbol;
+        $info{$symbol, "currency"} = "ZAR";
+        $info{$symbol, "source"} = $SHARENET_MAINURL;
+
+# NAME
+        $ts = $te->table_state(2,1);
+        if($ts) {
+          (@rows) = $ts->rows;
+          $info{$symbol, "name"} = $rows[2][1];
         }
 
+# DATE AND CLOSING PRICE
+        $ts = $te->table_state(3,1);
+#         print "[debug]: ", "got this far...", "\n";
+#         print "[debug]: (table_state)",$ts, "\n";
+        if($ts) {
+          (@rows) = $ts->rows;
+
+#           foreach $row ($ts->rows) {
+#             print "[debug]: ", $row->[0], " | ", $row->[1], " | ", $row->[2], " | ", $row->[3], "\n";
+#           }
+
+	  $quoter->store_date(\%info, $symbol, {eurodate => $rows[0][0]});
+          $info{$symbol, "last"}  = $rows[1][1];
+          $info{$symbol, "high"}  = $rows[2][1];
+          $info{$symbol, "low"}   = $rows[3][1];
+	  $info{$symbol, "p_change"} = $rows[6][1];
+
+       }
+
     }
 
     return wantarray() ? %info : \%info;
@@ -207,3 +157,4 @@ Sharenet website - http://www.sharenet.co.za/
 Finance::Quote
 
 =cut
+
@@ -1,164 +0,0 @@
-#!/usr/bin/perl -w
-
-# This file is based purely on Stephen Langenhoven's original ZA.pm file.
-# In order to use this file, rather than using a stock code/number, the user
-# must look for the unit trust ID number in the path of the Equinox site that
-# profiles the relevant unit trust (or closest unit trust to). For instance,
-# http://www.equinox.co.za/unittrusts/funds/funddetails.asp?fundid=16200 is the
-# profile of the "Liberty Resources Fund (C)". As a result, the fundid to be used
-# to query that fund is 16200.
-# Rolf Endres
-# 2009.10.09
-
-package Finance::Quote::ZA_UnitTrusts;
-require 5.004;
-
-our $VERSION = '1.37'; # VERSION
-
-use strict;
-
-use LWP::UserAgent;
-use HTTP::Request::Common;
-use HTML::TableExtract;
-
-my $EQUINOX_MAINURL = ("http://www.equinox.co.za/");
-my $EQUINOX_URL =
-    ( $EQUINOX_MAINURL . "unittrusts/funds/funddetails.asp?fundid=" );
-
-sub methods {
-    return ( za_unittrusts => \&za_unittrusts );
-}
-
-sub labels {
-    my @labels =
-        qw/method source name symbol currency last date isodate high low p_change/;
-    return ( EQUINOX => \@labels );
-}
-
-sub za_unittrusts {
-
-    my $quoter  = shift;
-    my @symbols = @_;
-    my %info;
-    my ( $te, $ts, $row );
-    my @rows;
-
-    return unless @symbols;
-
-    my $ua = $quoter->user_agent;
-
-    foreach my $symbol (@symbols) {
-        my $url = $EQUINOX_URL . $symbol;
-
-        #print "[debug]: ", $url, "\n";
-        my $response = $ua->request( GET $url);
-
-        #print "[debug]: ", $response->content, "\n";
-
-        if ( !$response->is_success ) {
-            $info{ $symbol, "success" }  = 0;
-            $info{ $symbol, "errormsg" } = "Error contacting URL";
-            next;
-        }
-
-        $te = new HTML::TableExtract();
-
-        $te->parse( $response->content );
-
-        #print "[debug]: (parsed HTML)",$te, "\n";
-
-        unless ( $te->first_table_found() ) {
-
-            #print STDERR  "no tables on this page\n";
-            $info{ $symbol, "success" }  = 0;
-            $info{ $symbol, "errormsg" } = "Parse error";
-            next;
-        }
-
-        # GENERAL FIELDS
-        $info{ $symbol, "success" }  = 1;
-        $info{ $symbol, "method" }   = "Equinox";
-        $info{ $symbol, "symbol" }   = $symbol;
-        $info{ $symbol, "currency" } = "ZAR";
-        $info{ $symbol, "source" }   = $EQUINOX_MAINURL;
-
-        # NAME
-        $ts = $te->table_state( 0, 0 );
-        if ($ts) {
-            (@rows) = $ts->rows;
-            $info{ $symbol, "name" } = $rows[0][0];
-            $info{ $symbol, "name" } =~ s/Funds//;
-            $info{ $symbol, "name" } =~ s/Performances//;
-            $info{ $symbol, "name" } =~ s/Companies//;
-            $info{ $symbol, "name" } =~ s/Summary//;
-            $info{ $symbol, "name" } =~ s/Company//;
-            $info{ $symbol, "name" } =~ s/Management//;
-            $info{ $symbol, "name" } =~ s/A//;
-            $info{ $symbol, "name" } =~ s/Z//;
-            $info{ $symbol, "name" } =~ s/Risk//;
-            $info{ $symbol, "name" } =~ s/Funds//;
-            $info{ $symbol, "name" } =~ s/Sector//;
-            $info{ $symbol, "name" } =~ s/Funds//;
-            $info{ $symbol, "name" } =~ s/Domestic(.*)//s;
-            $info{ $symbol, "name" } =~ s/Foreign(.*)//s;
-            $info{ $symbol, "name" } =~ s/[^A-Za-z ()]//sg;
-            $info{ $symbol, "name" } =~ s/  //sg;
-            $info{ $symbol, "name" } =~ s/  //sg;
-            $info{ $symbol, "name" } =~ s/  //sg;
-            $info{ $symbol, "name" } =~ s/  //sg;
-
-        }
-
-        # LAST
-        $ts = $te->table_state( 1, 0 );
-        if ($ts) {
-            (@rows) = $ts->rows;
-            $info{ $symbol, "last" } = $rows[0][1];
-            $info{ $symbol, "last" } =~ tr/R //d;
-
-        }
-
-        # DATE
-        if ($ts) {
-            (@rows) = $ts->rows;
-
-            $quoter->store_date( \%info, $symbol, { eurodate => $rows[0][0] } );
-        }
-    }
-
-    return wantarray() ? %info : \%info;
-}
-
-1;
-
-=head1 NAME
-
-Finance::Quote::ZA_UnitTrusts - Obtain South African unit trust prices from
-www.equinox.co.za
-
-=head1 SYNOPSIS
-
-   use Finance::Quote;
-
-   $q = Finance::Quote->new;
-
-   # Don't know anything about failover yet...
-
-=head1 DESCRIPTION
-
-This module obtains information about South African Unit Trusts from
-www.equinox.co.za.
-
-=head1 LABELS RETURNED
-
-Information available from Equinox may include the following labels:
-
-method source name symbol currency date nav last price
-
-=head1 SEE ALSO
-
-Equinox website - http://www.equinox.co.za/
-
-Finance::Quote
-
-=cut
@@ -35,29 +35,22 @@ use Exporter ();
 use Carp;
 use Finance::Quote::UserAgent;
 use HTTP::Request::Common;
-use Encode;
-# use Data::Dumper;
+use HTML::TableExtract;
 
 use vars qw/@ISA @EXPORT @EXPORT_OK @EXPORT_TAGS
-            $TIMEOUT %MODULES %METHODS $AUTOLOAD
-            $YAHOO_CURRENCY_URL $USE_EXPERIMENTAL_UA/;
-
-# Call on the Yahoo API:
-#  - "f=l1" should return a single value - the "Last Trade (Price Only)"
-#  - "s=" the value of s should be "<FROM><TO>=X"
-#         where <FROM> and <TO> are currencies
-# Excample: http://finance.yahoo.com/d/quotes.csv?f=l1&s=AUDGBP=X
-# Documentation can be found here:
-#     http://code.google.com/p/yahoo-finance-managed/wiki/csvQuotesDownload
-$YAHOO_CURRENCY_URL = "http://finance.yahoo.com/d/quotes.csv?e=.csv&f=l1&s=";
+            $VERSION $TIMEOUT %MODULES %METHODS $AUTOLOAD
+	    $YAHOO_CURRENCY_URL $USE_EXPERIMENTAL_UA/;
+
+$YAHOO_CURRENCY_URL = "http://uk.finance.yahoo.com/currency/convert?amt=1&submit=Convert&";
+# If the above URL ever fails, try rewriting this module to use the URL below.
+# $YAHOO_CURRENCY_URL = "http://uk.finance.yahoo.com/q?s=USDCAD%3DX";
 
 @ISA    = qw/Exporter/;
 @EXPORT = ();
-@EXPORT_OK = qw/yahoo yahoo_europe fidelity troweprice asx tiaacref
-                currency_lookup/;
+@EXPORT_OK = qw/yahoo yahoo_europe fidelity troweprice asx tiaacref/;
 @EXPORT_TAGS = ( all => [@EXPORT_OK]);
 
-our $VERSION = '1.37'; # VERSION
+$VERSION = '1.13';
 
 $USE_EXPERIMENTAL_UA = 0;
 
@@ -65,30 +58,30 @@ $USE_EXPERIMENTAL_UA = 0;
 # call methods that objects export without having to go through fetch.
 
 sub AUTOLOAD {
-  my $method = $AUTOLOAD;
-  $method =~ s/.*:://;
-
-  # Force the dummy object (and hence default methods) to be loaded.
-  _dummy();
-
-  # If the method we want is in %METHODS, then set up an appropriate
-  # subroutine for it next time.
-
-  if (exists($METHODS{$method})) {
-    eval qq[sub $method {
-      my \$this;
-      if (ref \$_[0]) {
-        \$this = shift;
-      }
-      \$this ||= _dummy();
-      \$this->fetch("$method",\@_);
-     }];
-    carp $@ if $@;
-    no strict 'refs'; # So we can use &$method
-    return &$method(@_);
-  }
-
-  carp "$AUTOLOAD does not refer to a known method.";
+	my $method = $AUTOLOAD;
+	$method =~ s/.*:://;
+
+	# Force the dummy object (and hence default methods) to be loaded.
+	_dummy();
+
+	# If the method we want is in %METHODS, then set up an appropriate
+	# subroutine for it next time.
+
+	if (exists($METHODS{$method})) {
+		eval qq[sub $method {
+			my \$this;
+			if (ref \$_[0]) {
+				\$this = shift;
+			}
+			\$this ||= _dummy();
+			\$this->fetch("$method",\@_); 
+		}];
+		carp $@ if $@;
+		no strict 'refs';	# So we can use &$method
+		return &$method(@_);
+	}
+
+	carp "$AUTOLOAD does not refer to a known method.";
 }
 
 # _load_module (private class method)
@@ -96,51 +89,51 @@ sub AUTOLOAD {
 # use.
 
 sub _load_modules {
-  my $class = shift;
-  my $baseclass = ref $class || $class;
-
-  my @modules = @_;
-
-  # Go to each module and use them.  Also record what methods
-  # they support and enter them into the %METHODS hash.
-
-  foreach my $module (@modules) {
-    my $modpath = "${baseclass}::${module}";
-    unless (defined($MODULES{$modpath})) {
-
-      # Have to use an eval here because perl doesn't
-      # like to use strings.
-      eval "use $modpath;";
-      carp $@ if $@;
-      $MODULES{$modpath} = 1;
-
-      # Methodhash will continue method-name, function ref
-      # pairs.
-      my %methodhash = $modpath->methods;
-      my %labelhash = $modpath->labels;
-
-      # Find the labels that we can do currency conversion
-      # on.
-
-      my $curr_fields_func = $modpath->can("currency_fields")
-            || \&default_currency_fields;
-
-      my @currency_fields = &$curr_fields_func;
-
-      # @currency_fields may contain duplicates.
-      # This following chunk of code removes them.
-
-      my %seen;
-      @currency_fields=grep {!$seen{$_}++} @currency_fields;
-
-      foreach my $method (keys %methodhash) {
-        push (@{$METHODS{$method}},
-          { function => $methodhash{$method},
-            labels   => $labelhash{$method},
-            currency_fields => \@currency_fields});
-      }
-    }
-  }
+	my $class = shift;
+	my $baseclass = ref $class || $class;
+
+	my @modules = @_;
+
+	# Go to each module and use them.  Also record what methods
+	# they support and enter them into the %METHODS hash.
+
+	foreach my $module (@modules) {
+		my $modpath = "${baseclass}::${module}";
+		unless (defined($MODULES{$modpath})) {
+
+			# Have to use an eval here because perl doesn't
+			# like to use strings.
+			eval "use $modpath;";
+			carp $@ if $@;
+			$MODULES{$modpath} = 1;
+
+			# Methodhash will continue method-name, function ref
+			# pairs.
+			my %methodhash = $modpath->methods;
+			my %labelhash = $modpath->labels;
+
+			# Find the labels that we can do currency conversion
+			# on.
+
+			my $curr_fields_func = $modpath->can("currency_fields")
+						|| \&default_currency_fields;
+			
+			my @currency_fields = &$curr_fields_func;
+
+			# @currency_fields may contain duplicates.
+			# This following chunk of code removes them.
+
+			my %seen;
+			@currency_fields=grep {!$seen{$_}++} @currency_fields;
+
+			foreach my $method (keys %methodhash) {
+				push (@{$METHODS{$method}},
+					{ function => $methodhash{$method},
+					  labels   => $labelhash{$method},
+					  currency_fields => \@currency_fields});
+			}
+		}
+	}
 }
 
 # =======================================================================
@@ -151,45 +144,43 @@ sub _load_modules {
 # loads a default set of methods.
 
 sub new {
-  my $self = shift;
-  my $class = ref($self) || $self;
-
-  my $this = {};
-  bless $this, $class;
-
-  my @modules = ();
-  my @reqmodules = ();  # Requested modules.
-
-  # If there's no argument list, but we have the appropriate
-  # environment variable set, we'll use that instead.
-  if ($ENV{FQ_LOAD_QUOTELET} and !@_) {
-    @reqmodules = split(' ',$ENV{FQ_LOAD_QUOTELET});
-  } else {
-    @reqmodules = @_;
-  }
-
-  # If we get an empty new(), or one starting with -defaults,
-  # then load up the default methods.
-  if (!@reqmodules or $reqmodules[0] eq "-defaults") {
-    shift(@reqmodules) if (@reqmodules);
-    # Default modules
-    @modules = qw/AEX AIAHK ASEGR ASX BMONesbittBurns BSERO Bourso
-            Cdnfundlibrary Citywire CSE Currencies Deka DWS FTPortfolios Fidelity
-            FinanceCanada Fool FTfunds HU GoldMoney HEX IndiaMutual LeRevenu
-            ManInvestments Morningstar MorningstarJP MStaruk MtGox NZX Platinum
-            SEB SIXfunds SIXshares StockHouseCanada TSP TSX Tdefunds
-            Tdwaterhouse Tiaacref TNetuk Troweprice Trustnet Union USFedBonds
-            VWD ZA Cominvest Finanzpartner YahooJSON Yahoo::Asia
-            Yahoo::Australia Yahoo::Brasil Yahoo::Europe Yahoo::NZ
-            Yahoo::USA ZA_UnitTrusts/; }
-
-  $this->_load_modules(@modules,@reqmodules);
-
-  $this->{TIMEOUT} = $TIMEOUT if defined($TIMEOUT);
-  $this->{FAILOVER} = 1;
-  $this->{REQUIRED} = [];
-
-  return $this;
+	my $self = shift;
+	my $class = ref($self) || $self;
+
+	my $this = {};
+	bless $this, $class;
+
+	my @modules = ();
+	my @reqmodules = ();	# Requested modules.
+
+	# If there's no argument list, but we have the appropriate
+	# environment variable set, we'll use that instead.
+	if ($ENV{FQ_LOAD_QUOTELET} and !@_) {
+		@reqmodules = split(' ',$ENV{FQ_LOAD_QUOTELET});
+	} else {
+		@reqmodules = @_;
+	}
+
+	# If we get an empty new(), or one starting with -defaults,
+	# then load up the default methods.
+	if (!@reqmodules or $reqmodules[0] eq "-defaults") {
+		shift(@reqmodules) if (@reqmodules);
+		# Default modules
+		@modules = qw/AEX AIAHK ASEGR ASX BMONesbittBurns Bourso Cdnfundlibrary Deka
+			      DWS FTPortfolios Fidelity FinanceCanada Fool HEX IndiaMutual
+			      LeRevenu ManInvestments NZX Platinum SEB StockHouseCanada
+			      TSP Tdefunds Tdwaterhouse Tiaacref Troweprice Trustnet Union
+			      USFedBonds VWD ZA
+			      Yahoo::Asia Yahoo::Australia Yahoo::Brasil
+			      Yahoo::Europe Yahoo::NZ Yahoo::USA/; }
+
+	$this->_load_modules(@modules,@reqmodules);
+
+	$this->{TIMEOUT} = $TIMEOUT if defined($TIMEOUT);
+	$this->{FAILOVER} = 1;
+	$this->{REQUIRED} = [];
+
+	return $this;
 }
 
 # =======================================================================
@@ -198,10 +189,10 @@ sub new {
 # _dummy returns a Finance::Quote object.  I'd really rather not have
 # this, but to maintain backwards compatibility we hold on to it.
 {
-  my $dummy_obj;
-  sub _dummy {
-    return $dummy_obj ||= Finance::Quote->new;
-  }
+	my $dummy_obj;
+	sub _dummy {
+		return $dummy_obj ||= Finance::Quote->new;
+	}
 }
 
 # =======================================================================
@@ -214,7 +205,7 @@ sub new {
 #        $sourceref = $quoter->sources();
 
 sub sources {
-  return(wantarray ? keys %METHODS : [keys %METHODS]);
+	return(wantarray ? keys %METHODS : [keys %METHODS]);
 }
 
 
@@ -224,137 +215,47 @@ sub sources {
 # currency allows the conversion of one currency to another.
 #
 # Usage: $quoter->currency("USD","AUD");
-#  $quoter->currency("15.95 USD","AUD");
+#	 $quoter->currency("15.95 USD","AUD");
 #
 # undef is returned upon error.
 
 sub currency {
-  my $this = shift if (ref($_[0]));
-  $this ||= _dummy();
-
-  my ($from, $to) = @_;
-  return undef unless ($from and $to);
-
-  $from =~ s/^\s*(\d*\.?\d*)\s*//;
-  my $amount = $1 || 1;
+	my $this = shift if (ref($_[0]));
+	$this ||= _dummy();
 
-  # Don't know if these have to be in upper case, but it's
-  # better to be safe than sorry.
-  $to = uc($to);
-  $from = uc($from);
+	my ($from, $to) = @_;
+	return undef unless ($from and $to);
 
-  return $amount if ($from eq $to); # Trivial case.
+	$from =~ s/^\s*(\d*\.?\d*)\s*//;
+	my $amount = $1 || 1;
 
-  my $ua = $this->user_agent;
+	# Don't know if these have to be in upper case, but it's
+	# better to be safe than sorry.
+	$to = uc($to);
+	$from = uc($from);
 
-  # The response should be a single value (the exchange rate)
-  my $data = $ua->request(GET "${YAHOO_CURRENCY_URL}${from}${to}=X")->content;
-  my $exchange_rate = $data;
+	return $amount if ($from eq $to);	# Trivial case.
 
-  $exchange_rate =~ s/,// ; # solve a bug when conversion rate
-                            # involves thousands. yahoo inserts
-                            # a comma when thousands occur
+	my $ua = $this->user_agent;
 
-  {
-    local $^W = 0;  # Avoid undef warnings.
+	my $data = $ua->request(GET "${YAHOO_CURRENCY_URL}from=$from&to=$to")->content;
+	my $te = HTML::TableExtract->new( headers => ['Symbol', 'Bid', 'Ask'] );
+	$te->parse($data);
 
-    # We force this to a number to avoid situations where
-    # we may have extra cruft, or no amount.
-    return undef unless ($exchange_rate+0);
-  }
-
-if ( $exchange_rate < 0.001 ) {
-    # exchange_rate is too little. we'll get more accuracy by using
-    # the inverse rate and inverse it
-    my $inverse_rate = $this->currency( $to, $from );
-    {
-        local $^W = 0;
-        return undef unless ( $exchange_rate + 0 );
-    }
-    $exchange_rate = int( 100000000 / $inverse_rate + .5 ) / 100000000;
-}
+	# Make sure there's a table to parse.
+	return undef unless ($te->tables);
 
-  return ($exchange_rate * $amount);
-}
-
-# =======================================================================
-# currency_lookup (public object method)
-#
-# search for available currency codes
-#
-# Usage: $quoter->currency_lookup({ name => qr/australia/i });
-#  $quoter->currency_lookup( code => 'EU' );
-#  $quoter->currency_lookup( name => 'Euro', code => qr/eu/i );
-#  $quoter->currency_lookup();
-#
-# If more than one lookup parameter is given all must match for
-# a currency to match.
-#
-# undef is returned upon error.
+	my $row = ($te->rows())[0];
+	my ($exchange_rate) = $$row[1];
 
-sub currency_lookup {
-  my $this = shift if (ref $_[0]);
-  $this ||= _dummy();
-
-  # Validate parameters
-  my %valid_params = map { $_ => 1 } qw( name code );
-  my %params = @_;
-  my $param_errors = 0;
-  for my $key ( keys %params ) {
-    if ( ! exists $valid_params{$key} ) {
-      warn "Invalid parameter: ${key}";
-      $param_errors++;
-    }
-  }
-  return undef if $param_errors > 0;
-
-  # Retrieve known currencies
-  my $known_currencies = Finance::Quote::Currencies::known_currencies();
-
-  # Return currencies based on parameters
-  my $returned_currencies = {};
-  if ( scalar keys %params == 0 ) {
-    $returned_currencies = $known_currencies;
-  }
-  else {
-    for my $code ( keys %{$known_currencies} ) {
-      # Make sure all parameters match
-      my $matched = 0;
-      if ( exists $params{name}
-           &&
-           _smart_compare( $known_currencies->{$code}->{name}, $params{name} )
-         ) {
-        $matched++;
-      }
-      if ( exists $params{code}
-           &&
-           _smart_compare( $code, $params{code} )
-         ) {
-        $matched++;
-      }
-      if ( $matched == scalar keys %params ) {
-        $returned_currencies->{$code} = $known_currencies->{$code}
-      }
-    }
-  }
-  return $returned_currencies;
-}
+	{
+		local $^W = 0;	# Avoid undef warnings.
 
-# _smart_compare (private method function)
-#
-# This function compares values where the method depends on the
-# type of the second parameter.
-#  regex  : compare as regex
-#  scalar : test for substring match
-sub _smart_compare {
-  my ($val1, $val2) = @_;
-
-  if ( ref $val2 eq 'Regexp' ) {
-    return $val1 =~ $val2;
-  }
-  else {
-    return index($val1, $val2) > -1
-  }
+		# We force this to a number to avoid situations where
+		# we may have extra cruft, or no amount.
+		return undef unless ($exchange_rate+0);
+	}
+	return ($exchange_rate * $amount);
 }
 
 # =======================================================================
@@ -372,14 +273,14 @@ sub _smart_compare {
 # know what you are doing.
 
 sub set_currency {
-  my $this = shift if (ref $_[0]);
-  $this ||= _dummy();
-
-  unless (defined($_[0])) {
-    delete $this->{"currency"};
-  } else {
-    $this->{"currency"} = $_[0];
-  }
+	my $this = shift if (ref $_[0]);
+	$this ||= _dummy();
+
+	unless (defined($_[0])) {
+		delete $this->{"currency"};
+	} else {
+		$this->{"currency"} = $_[0];
+	}
 }
 
 # default_currency_fields (public method)
@@ -389,8 +290,8 @@ sub set_currency {
 # function then that list will be used instead.
 
 sub default_currency_fields {
-  return qw/last high low net bid ask close open day_range year_range
-            eps div cap nav price/;
+	return qw/last high low net bid ask close open day_range year_range
+	          eps div cap nav price/;
 }
 
 # _convert (private object method)
@@ -401,61 +302,61 @@ sub default_currency_fields {
 # that conversion should apply to.
 
 {
-  my %conversion;   # Conversion lookup table.
-
-  sub _convert {
-    my $this = shift;
-    my $info = shift;
-    my $stocks = shift;
-    my $convert_fields = shift;
-    my $new_currency = $this->{"currency"};
-
-    # Skip all this unless they actually want conversion.
-    return unless $new_currency;
-
-    foreach my $stock (@$stocks) {
-      my $currency;
-
-      # Skip stocks that don't have a currency.
-      next unless ($currency = $info->{$stock,"currency"});
-
-      # Skip if it's already in the same currency.
-      next if ($currency eq $new_currency);
-
-      # Lookup the currency conversion if we haven't
-      # already.
-      unless (exists $conversion{$currency,$new_currency}) {
-        $conversion{$currency,$new_currency} =
-          $this->currency($currency,$new_currency);
-      }
-
-      # Make sure we have a reasonable currency conversion.
-      # If we don't, mark the stock as bad.
-      unless ($conversion{$currency,$new_currency}) {
-        $info->{$stock,"success"} = 0;
-        $info->{$stock,"errormsg"} =
-          "Currency conversion failed.";
-        next;
-      }
-
-      # Okay, we have clean data.  Convert it.  Ideally
-      # we'd like to just *= entire fields, but
-      # unfortunately some things (like ranges,
-      # capitalisation, etc) don't take well to that.
-      # Hence we pull out any numbers we see, convert
-      # them, and stick them back in.  That's pretty
-      # yucky, but it works.
-
-      foreach my $field (@$convert_fields) {
-        next unless (defined $info->{$stock,$field});
-
-        $info->{$stock,$field} = $this->scale_field($info->{$stock,$field},$conversion{$currency,$new_currency});
-      }
-
-      # Set the new currency.
-      $info->{$stock,"currency"} = $new_currency;
-    }
-  }
+	my %conversion;		# Conversion lookup table.
+
+	sub _convert {
+		my $this = shift;
+		my $info = shift;
+		my $stocks = shift;
+		my $convert_fields = shift;
+		my $new_currency = $this->{"currency"};
+
+		# Skip all this unless they actually want conversion.
+		return unless $new_currency;
+
+		foreach my $stock (@$stocks) {
+			my $currency;
+
+			# Skip stocks that don't have a currency.
+			next unless ($currency = $info->{$stock,"currency"});
+
+			# Skip if it's already in the same currency.
+			next if ($currency eq $new_currency);
+
+			# Lookup the currency conversion if we haven't
+			# already.
+			unless (exists $conversion{$currency,$new_currency}) {
+				$conversion{$currency,$new_currency} =
+					$this->currency($currency,$new_currency);
+			}
+
+			# Make sure we have a reasonable currency conversion.
+			# If we don't, mark the stock as bad.
+			unless ($conversion{$currency,$new_currency}) {
+				$info->{$stock,"success"} = 0;
+				$info->{$stock,"errormsg"} =
+					"Currency conversion failed.";
+				next;
+			}
+
+			# Okay, we have clean data.  Convert it.  Ideally
+			# we'd like to just *= entire fields, but
+			# unfortunately some things (like ranges,
+			# capitalisation, etc) don't take well to that.
+			# Hence we pull out any numbers we see, convert
+			# them, and stick them back in.  That's pretty
+			# yucky, but it works.
+
+			foreach my $field (@$convert_fields) {
+				next unless (defined $info->{$stock,$field});
+
+				$info->{$stock,$field} = $this->scale_field($info->{$stock,$field},$conversion{$currency,$new_currency});
+			}
+
+			# Set the new currency.
+			$info->{$stock,"currency"} = $new_currency;
+		}
+	}
 }
 
 # =======================================================================
@@ -466,16 +367,16 @@ sub default_currency_fields {
 # it by.  For example, scale_field("1023","0.01") would return "10.23".
 
 sub scale_field {
-  shift if ref $_[0]; # Shift off the object, if there is one.
+	shift if ref $_[0];	# Shift off the object, if there is one.
 
-  my ($field, $scale) = @_;
-  my @chunks = split(/([^0-9.])/,$field);
+	my ($field, $scale) = @_;
+	my @chunks = split(/([^0-9.])/,$field);
 
-  for (my $i=0; $i < @chunks; $i++) {
-    next unless $chunks[$i] =~ /\d/;
-    $chunks[$i] *= $scale;
-  }
-  return join("",@chunks);
+	for (my $i=0; $i < @chunks; $i++) {
+		next unless $chunks[$i] =~ /\d/;
+		$chunks[$i] *= $scale;
+	}
+	return join("",@chunks);
 }
 
 
@@ -486,14 +387,14 @@ sub scale_field {
 # for all new objects that will be created.
 
 sub timeout {
-  if (@_ == 1 or !ref($_[0])) { # Direct or class call.
-    return $TIMEOUT = $_[0];
-  }
-
-  # Otherwise we were called through an object.  Yay.
-  # Set the timeout in this object only.
-  my $this = shift;
-  return $this->{TIMEOUT} = shift;
+	if (@_ == 1 or !ref($_[0])) {	# Direct or class call.
+		return $TIMEOUT = $_[0];
+	}
+	
+	# Otherwise we were called through an object.  Yay.
+	# Set the timeout in this object only.
+	my $this = shift;
+	return $this->{TIMEOUT} = shift;
 }
 
 # =======================================================================
@@ -502,10 +403,10 @@ sub timeout {
 # This sets/gets whether or not it's acceptable to use failover techniques.
 
 sub failover {
-  my $this = shift;
-  my $value = shift;
+	my $this = shift;
+	my $value = shift;
         return $this->{FAILOVER} = $value if (defined($value));
-  return $this->{FAILOVER};
+	return $this->{FAILOVER};
 }
 
 # =======================================================================
@@ -521,10 +422,10 @@ sub failover {
 # This method always succeeds.
 
 sub require_labels {
-  my $this = shift;
-  my @labels = @_;
-  $this->{REQUIRED} = \@labels;
-  return;
+	my $this = shift;
+	my @labels = @_;
+	$this->{REQUIRED} = \@labels;
+	return;
 }
 
 # _require_test (private object method)
@@ -535,15 +436,15 @@ sub require_labels {
 # This function could probably be made more efficient.
 
 sub _require_test {
-  my $this = shift;
-  my %available;
-  @available{@_} = ();  # Ooooh, hash-slice.  :)
-  my @required = @{$this->{REQUIRED}};
-  return 1 unless @required;
-  for (my $i = 0; $i < @required; $i++) {
-    return 0 unless exists $available{$required[$i]};
-  }
-  return 1;
+	my $this = shift;
+	my %available;
+	@available{@_} = ();	# Ooooh, hash-slice.  :)
+	my @required = @{$this->{REQUIRED}};
+	return 1 unless @required;
+	for (my $i = 0; $i < @required; $i++) {
+		return 0 unless exists $available{$required[$i]};
+	}
+	return 1;
 }
 
 # =======================================================================
@@ -553,45 +454,45 @@ sub _require_test {
 # fetch.  It's a nicer interface for when you have a list of stocks with
 # different sources which you wish to deal with.
 sub fetch {
-  my $this = shift if ref ($_[0]);
-
-  $this ||= _dummy();
-
-  my $method = lc(shift);
-  my @stocks = @_;
-
-  unless (exists $METHODS{$method}) {
-    carp "Undefined fetch-method $method passed to ".
-         "Finance::Quote::fetch";
-    return;
-  }
-
-  # Failover code.  This steps through all availabe methods while
-  # we still have failed stocks to look-up.  This loop only
-  # runs a single time unless FAILOVER is defined.
-
-  my %returnhash = ();
-
-  foreach my $methodinfo (@{$METHODS{$method}}) {
-    my $funcref = $methodinfo->{"function"};
-    next unless $this->_require_test(@{$methodinfo->{"labels"}});
-    my @failed_stocks = ();
-    %returnhash = (%returnhash,&$funcref($this,@stocks));
-
-    foreach my $stock (@stocks) {
-      push(@failed_stocks,$stock)
-        unless ($returnhash{$stock,"success"});
-    }
-
-    $this->_convert(\%returnhash,\@stocks,
-                    $methodinfo->{"currency_fields"});
-
-    last unless $this->{FAILOVER};
-    last unless @failed_stocks;
-    @stocks = @failed_stocks;
-  }
-
-  return wantarray() ? %returnhash : \%returnhash;
+	my $this = shift if ref ($_[0]);
+	
+	$this ||= _dummy();
+	
+	my $method = lc(shift);
+	my @stocks = @_;
+
+	unless (exists $METHODS{$method}) {
+		carp "Undefined fetch-method $method passed to ".
+		     "Finance::Quote::fetch";
+		return;
+	}
+
+	# Failover code.  This steps through all availabe methods while
+	# we still have failed stocks to look-up.  This loop only
+	# runs a single time unless FAILOVER is defined.
+
+	my %returnhash = ();
+
+	foreach my $methodinfo (@{$METHODS{$method}}) {
+		my $funcref = $methodinfo->{"function"};
+		next unless $this->_require_test(@{$methodinfo->{"labels"}});
+		my @failed_stocks = ();
+		%returnhash = (%returnhash,&$funcref($this,@stocks));
+
+		foreach my $stock (@stocks) {
+			push(@failed_stocks,$stock)
+				unless ($returnhash{$stock,"success"});
+		}
+
+		$this->_convert(\%returnhash,\@stocks,
+		                $methodinfo->{"currency_fields"});
+
+		last unless $this->{FAILOVER};
+		last unless @failed_stocks;
+		@stocks = @failed_stocks;
+	}
+
+	return wantarray() ? %returnhash : \%returnhash;
 }
 
 # =======================================================================
@@ -605,24 +506,24 @@ sub fetch {
 # user-agent settings.
 
 sub user_agent {
-  my $this = shift;
+	my $this = shift;
 
-  return $this->{UserAgent} if $this->{UserAgent};
+	return $this->{UserAgent} if $this->{UserAgent};
 
-  my $ua;
+	my $ua;
 
-  if ($USE_EXPERIMENTAL_UA) {
-    $ua = Finance::Quote::UserAgent->new;
-  } else {
-    $ua = LWP::UserAgent->new;
-  }
+	if ($USE_EXPERIMENTAL_UA) {
+		$ua = Finance::Quote::UserAgent->new;
+	} else {
+		$ua = LWP::UserAgent->new;
+	}
 
-  $ua->timeout($this->{TIMEOUT}) if defined($this->{TIMEOUT});
-  $ua->env_proxy;
+	$ua->timeout($this->{TIMEOUT}) if defined($this->{TIMEOUT});
+	$ua->env_proxy;
 
-  $this->{UserAgent} = $ua;
+	$this->{UserAgent} = $ua;
 
-  return $ua;
+	return $ua;
 }
 
 # =======================================================================
@@ -632,7 +533,7 @@ sub user_agent {
 #
 sub parse_csv
 {
-    shift if (ref $_[0]); # Shift off the object if we have one.
+    shift if (ref $_[0]);	# Shift off the object if we have one.
     my $text = shift;      # record containing comma-separated values
     my @new  = ();
 
@@ -655,7 +556,7 @@ sub parse_csv
 #
 sub parse_csv_semicolon
 {
-    shift if (ref $_[0]); # Shift off the object if we have one.
+    shift if (ref $_[0]);	# Shift off the object if we have one.
     my $text = shift;      # record containing comma-separated values
     my @new  = ();
 
@@ -680,17 +581,17 @@ sub parse_csv_semicolon
 # also in the ISO date format (yyyy-mm-dd).  This function expects to
 # be called with the arguments:
 #
-# (inforef, symbol_name, data_hash)
+#	(inforef, symbol_name, data_hash)
 #
 # The components of date hash can be any of:
 #
-# usdate   - A date in mm/dd/yy or mm/dd/yyyy
-# eurodate - A date in dd/mm/yy or dd/mm/yyyy
-# isodate  - A date in yy-mm-dd or yyyy-mm-dd
-# year   - The year in yyyy
-# month  - The month in mm or mmm format (i.e. 07 or Jul)
-# day  - The day
-# today  - A flag to indicate todays date should be used.
+#	usdate	 - A date in mm/dd/yy or mm/dd/yyyy
+#	eurodate - A date in dd/mm/yy or dd/mm/yyyy
+#	isodate	 - A date in yy-mm-dd or yyyy-mm-dd
+#	year	 - The year in yyyy
+#	month	 - The month in mm or mmm format (i.e. 07 or Jul)
+#	day	 - The day
+#	today	 - A flag to indicate todays date should be used.
 #
 # The separator for the *date forms is ignored.  It can be any
 # non-alphanumeric character.  Any combination of year, month, and day
@@ -706,7 +607,7 @@ sub store_date
 
     my ($year, $month, $day, $this_month, $year_specified);
     my %mnames = (jan => 1, feb => 2, mar => 3, apr => 4, may => 5, jun => 6,
-      jul => 7, aug => 8, sep => 9, oct =>10, nov =>11, dec =>12);
+		  jul => 7, aug => 8, sep => 9, oct =>10, nov =>11, dec =>12);
 
 #    printf "In store_date\n";
 #    print "inforef $inforef\n";
@@ -760,76 +661,6 @@ sub store_date
     $inforef->{$symbol, "isodate"} = sprintf "%04d-%02d-%02d", $year, $month, $day;
 }
 
-sub isoTime {
-  my ($self,$timeString) = @_ ;
-  $timeString =~ tr/ //d ;
-  $timeString = uc $timeString ;
-  my $retTime = "00:00"; # return zero time if unparsable input
-  if ($timeString=~m/^(\d+)[\.:UH](\d+)(AM|PM)?/) {
-    my ($hours,$mins)= ($1-0,$2-0) ;
-    $hours-=12 if ($hours==12);
-    $hours+=12 if ($3 && ($3 eq "PM")) ;
-    if ($hours>=0 && $hours<=23 && $mins>=0 && $mins<=59 ) {
-      $retTime = sprintf ("%02d:%02d", $hours, $mins) ;
-    }
-  }
-  return $retTime;
-}
-
-
-# If $str ends with a B like "20B" or "1.6B" then expand it as billions like
-# "20000000000" or "1600000000".
-#
-# This is done with string manipulations so floating-point rounding doesn't
-# produce spurious digits for values like "1.6" which aren't exactly
-# representable in binary.
-#
-# Is "B" for billions the only abbreviation from Yahoo?
-# Could extend and rename this if there's also millions or thousands.
-#
-# For reference, if the value was just for use within perl then simply
-# substituting to exponential "1.5e9" might work.  But expanding to full
-# digits seems a better idea as the value is likely to be printed directly
-# as a string.
-sub B_to_billions {
-
-  my ($self,$str) = @_;
-  ### B_to_billions(): $str
-  if ($str =~ s/B$//i) {
-    $str = $self->decimal_shiftup ($str, 9);
-  }
-  return $str;
-}
-
-# $str is a number like "123" or "123.45"
-# return it with the decimal point moved $shift places to the right
-# must have $shift>=1
-# eg. decimal_shiftup("123",3)    -> "123000"
-#     decimal_shiftup("123.45",1) -> "1234.5"
-#     decimal_shiftup("0.25",1)   -> "2.5"
-#
-sub decimal_shiftup {
-  my ($self, $str, $shift) = @_;
-
-  # delete decimal point and set $after to count of chars after decimal.
-  # Leading "0" as in "0.25" is deleted too giving "25" so as not to end up
-  # with something that might look like leading 0 for octal.
-  my $after = ($str =~ s/(?:^0)?\.(.*)/$1/ ? length($1) : 0);
-
-  $shift -= $after;
-  # now $str is an integer and $shift is relative to the end of $str
-
-  if ($shift >= 0) {
-    # moving right, eg. "1234" becomes "12334000"
-    return $str . ('0' x $shift);  # extra zeros appended
-  } else {
-    # negative means left, eg. "12345" becomes "12.345"
-    # no need to prepend zeros since demanding initial $shift>=1
-    substr ($str, $shift,0, '.');  # new '.' at shifted spot from end
-    return $str;
-  }
-}
-
 # Dummy destroy function to avoid AUTOLOAD catching it.
 sub DESTROY { return; }
 
@@ -853,7 +684,7 @@ Finance::Quote - Get stock and mutual fund quotes from various exchanges
 
    $q->require_labels(qw/price date high low volume/);
 
-   $q->failover(1); # Set failover support (on by default).
+   $q->failover(1);	# Set failover support (on by default).
 
    %quotes  = $q->fetch("nasdaq",@stocks);
    $hashref = $q->fetch("nyse",@stocks);
@@ -863,7 +694,7 @@ Finance::Quote - Get stock and mutual fund quotes from various exchanges
 This module gets stock quotes from various internet sources, including
 Yahoo! Finance, Fidelity Investments, and the Australian Stock Exchange.
 There are two methods of using this module -- a functional interface
-that is deprecated, and an object-orientated method that provides
+that is depreciated, and an object-orientated method that provides
 greater flexibility and stability.
 
 With the exception of straight currency exchange rates, all information
@@ -885,8 +716,8 @@ for a given stock, you can specify that using require_labels().
 
     name         Company or Mutual Fund Name
     last         Last Price
-    high         Highest trade today
-    low          Lowest trade today
+    high	 Highest trade today
+    low		 Lowest trade today
     date         Last Trade Date  (MM/DD/YY format)
     time         Last Trade Time
     net          Net Change
@@ -905,71 +736,18 @@ for a given stock, you can specify that using require_labels().
     div          Dividend per Share
     div_yield    Dividend Yield
     cap          Market Capitalization
-    ex_div       Ex-Dividend Date.
+    ex_div	 Ex-Dividend Date.
     nav          Net Asset Value
     yield        Yield (usually 30 day avg)
-    exchange     The exchange the information was obtained from.
-    success      Did the stock successfully return information? (true/false)
-    errormsg     If success is false, this field may contain the reason why.
-    method       The module (as could be passed to fetch) which found this
-                 information.
-    type         The type of equity returned
+    exchange	 The exchange the information was obtained from.
+    success	 Did the stock successfully return information? (true/false)
+    errormsg	 If success is false, this field may contain the reason why.
+    method	 The module (as could be passed to fetch) which found
+		 this information.
 
 If all stock lookups fail (possibly because of a failed connection) then
 the empty list may be returned, or undef in a scalar context.
 
-=head1 INSTALLATION
-
-To install this module, run the following commands:
-
-    perl Makefile.PL
-    make
-    make test
-    make install
-
-For more detailed instructions, please see the INSTALL file.
-
-=head1 SUPPORT AND DOCUMENTATION
-
-After installing, you can find documentation for this module with the
-perldoc command.
-
-    perldoc Finance::Quote
-
-You can also look for information at:
-
-=over
-
-=item RT, CPAN's request tracker
-
-http://rt.cpan.org/NoAuth/Bugs.html?Dist=Finance-Quote
-
-=item AnnoCPAN, Annotated CPAN documentation
-
-http://annocpan.org/dist/Finance-Quote
-
-=item CPAN Ratings
-
-http://cpanratings.perl.org/d/Finance-Quote
-
-=item Search CPAN
-
-http://search.cpan.org/dist/Finance-Quote
-
-=item The Finance::Quote home page
-
-http://finance-quote.sourceforge.net/
-
-=item The Finance::YahooQuote home page
-
-http://www.padz.net/~djpadz/YahooQuote/
-
-=item The GnuCash home page
-
-http://www.gnucash.org/
-
-=back
-
 =head1 AVAILABLE METHODS
 
 =head2 NEW
@@ -1011,19 +789,19 @@ Fetch takes an exchange as its first argument.  The second and remaining
 arguments are treated as stock-names.  In the standard Finance::Quote
 distribution, the following exchanges are recognised:
 
-    australia   Australan Stock Exchange
-    dwsfunds    Deutsche Bank Gruppe funds
-    fidelity    Fidelity Investments
-    tiaacref    TIAA-CREF
-    troweprice    T. Rowe Price
-    europe    European Markets
-    canada    Canadian Markets
-    usa     USA Markets
-    nyse    New York Stock Exchange
-    nasdaq    NASDAQ
-    uk_unit_trusts  UK Unit Trusts
-    vanguard    Vanguard Investments
-    vwd     Vereinigte Wirtschaftsdienste GmbH
+    australia		Australan Stock Exchange
+    dwsfunds		Deutsche Bank Gruppe funds
+    fidelity		Fidelity Investments
+    tiaacref		TIAA-CREF
+    troweprice		T. Rowe Price
+    europe		European Markets
+    canada		Canadian Markets
+    usa			USA Markets
+    nyse		New York Stock Exchange
+    nasdaq		NASDAQ
+    uk_unit_trusts	UK Unit Trusts
+    vanguard		Vanguard Investments
+    vwd			Vereinigte Wirtschaftsdienste GmbH
 
 When called in an array context, a hash is returned.  In a scalar
 context, a reference to a hash will be returned.  The structure
@@ -1045,27 +823,6 @@ The sources method returns a list of sources that have currently been loaded and
 can be passed to the fetch method.  If you're providing a user with a list of
 sources to choose from, then it is recommended that you use this method.
 
-=head2 CURRENCY_LOOKUP
-
-    $currencies_by_name = $q->currency_lookup( name => 'Australian' );
-    $currencies_by_code = $q->currency_lookup( code => qr/^b/i      );
-    $currencies_by_both = $q->currency_lookup( name => qr/pound/i
-                                             , code => 'GB'         );
-
-The currency_lookup method provides a search against the known currencies. The
-list of currencies is based on the available currencies in the Yahoo Currency
-Converter (the list is stored within the module as the list should be fairly
-static).
-
-The lookup can be done by currency name (ie "Australian Dollar"), by
-code (ie "AUD") or both. You can pass either a scalar or regular expression
-as a search value - scalar values are matched by substring while regular
-expressions are matched as-is (no changes are made to the expression).
-
-See L<Finance::Quote::Currencies::fetch_live_currencies> (and the
-C<t/currencies.t> test file) for a way to make sure that the stored
-currency list is up to date.
-
 =head2 CURRENCY
 
     $conversion_rate = $q->currency("USD","AUD");
@@ -1084,7 +841,7 @@ See Finance::Quote::Yahoo for more information.
 
 =head2 SET_CURRENCY
 
-    $q->set_currency("FRF");  # Get results in French Francs.
+    $q->set_currency("FRF");	# Get results in French Francs.
 
 The set_currency method can be used to request that all information be
 returned in the specified currency.  Note that this increases the
@@ -1100,8 +857,8 @@ conversion is bound by Yahoo!'s terms and conditions.
 
 =head2 FAILOVER
 
-    $q->failover(1);  # Set automatic failover support.
-    $q->failover(0);  # Disable failover support.
+    $q->failover(1);	# Set automatic failover support.
+    $q->failover(0);	# Disable failover support.
 
 The failover method takes a single argument which either sets (if
 true) or unsets (if false) automatic failover support.  If automatic
@@ -1123,7 +880,7 @@ Finance::Quote and its helpers use.  Normally this would not
 be useful to an application, however it is possible to modify
 the user-agent directly using this method:
 
-    $q->user_agent->timeout(10);  # Set the timeout directly.
+    $q->user_agent->timeout(10);	# Set the timeout directly.
 
 
 =head2 SCALE_FIELD
@@ -1137,13 +894,6 @@ new Finance::Quote modules where you may retrieve information in a
 non-ISO4217 unit (such as cents) and would like to scale it to a more
 useful unit (like dollars).
 
-=head2 ISOTIME
-
-    $q->isoTime("11:39PM");    # returns "23:39"
-    $q->isoTime("9:10 AM");    # returns "09:10"
-
-This function will return a isoformatted time
-
 =head1 ENVIRONMENT
 
 Finance::Quote respects all environment that your installed
@@ -1162,7 +912,7 @@ more flexible $hash{$stock}{$label} style format.
 There is no way to override the default behaviour to cache currency
 conversion rates.
 
-=head1 COPYRIGHT & LICENSE
+=head1 COPYRIGHT
 
  Copyright 1998, Dj Padzensky
  Copyright 1998, 1999 Linas Vepstas
@@ -1175,7 +925,6 @@ conversion rates.
  Copyright 2001 Leigh Wedding (ASX updates)
  Copyright 2001 Tobias Vancura (Fool support)
  Copyright 2001 James Treacy (TD Waterhouse support)
- Copyright 2008 Erik Colson (isoTime)
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -1190,19 +939,17 @@ module.  Please refer to the sub-modules for further information.
 
 =head1 AUTHORS
 
-  Dj Padzensky <djpadz@padz.net>, PadzNet, Inc.
-  Linas Vepstas <linas@linas.org>
-  Yannick LE NY <y-le-ny@ifrance.com>
-  Paul Fenwick <pjf@cpan.org>
-  Brent Neal <brentn@users.sourceforge.net>
-  Volker Stuerzl <volker.stuerzl@gmx.de>
-  Keith Refson <Keith.Refson#earth.ox.ac.uk>
-  Rob Sessink <rob_ses@users.sourceforge.net>
-  Leigh Wedding <leigh.wedding@telstra.com>
-  Tobias Vancura <tvancura@altavista.net>
-  James Treacy <treacy@debian.org>
-  Bradley Dean <bjdean@bjdean.id.au>
-  Erik Colson <eco@ecocode.net>
+  Dj Padzensky (C<djpadz@padz.net>), PadzNet, Inc.
+  Linas Vepstas (C<linas@linas.org>)
+  Yannick LE NY (C<y-le-ny@ifrance.com>)
+  Paul Fenwick (C<pjf@schools.net.au>)
+  Brent Neal (C<brentn@users.sourceforge.net>)
+  Volker Stuerzl (C<volker.stuerzl@gmx.de>)
+  Keith Refson (C<Keith.Refson#earth.ox.ac.uk>)
+  Rob Sessink (C<rob_ses@users.sourceforge.net>)
+  Leigh Wedding (C<leigh.wedding@telstra.com>)
+  Tobias Vancura (C<tvancura@altavista.net>)
+  James Treacy (C<treacy@debian.org>)
 
 The Finance::Quote home page can be found at
 http://finance-quote.sourceforge.net/
@@ -1,88 +0,0 @@
-#!/usr/bin/perl -w
-
-# Test to see if Finance::Quote can at least be loaded and used.
-
-use strict;
-use Test::More;
-
-plan tests => 19;
-
-use Finance::Quote;
-ok(1, "Finance::Quote loaded");
-
-my $quote = Finance::Quote->new();
-
-ok($quote, "quote object created");
-
-
-# Get Today's date
-my ($month, $day, $year2) = (localtime())[4,3,5];
-$month++;
-my $year4 += $year2 + 1900;	# 2007
-my $year4m += $year2 + 1900 - 1;# 2006
-$year2 -= 100;			# 05
-my $isotoday = sprintf("%04d-%02d-%02d", $year4, $month, $day);
-my $ustoday  = sprintf("%02d/%02d/%04d", $month, $day, $year4);
-
-# Test date functions
-my %info;
-$quote->store_date(\%info, "test", {today => 1});
-ok($info{"test","isodate"} eq $isotoday,"test->isodate is today");
-ok($info{"test","date"} eq $ustoday,"test->date is today");
-
-# Test various permutions of an ISO Date as input
-%info = ();
-$quote->store_date(\%info, "test", {isodate => "2004-12-31"});
-ok($info{"test","date"} eq "12/31/2004", "ISO date permutation 1");
-%info = ();
-$quote->store_date(\%info, "test", {isodate => "2004 Dec 31"});
-ok($info{"test","date"} eq "12/31/2004","ISO date permutation 2");
-%info = ();
-$quote->store_date(\%info, "test", {isodate => "2004 December 31"});
-ok($info{"test","date"} eq "12/31/2004","ISO date permutation 3");
-
-# Test various permutions of an US Date as input
-%info = ();
-$quote->store_date(\%info, "test", {usdate => "12/31/2004"});
-ok($info{"test","isodate"} eq "2004-12-31","US date permutation 1");
-%info = ();
-$quote->store_date(\%info, "test", {usdate => "Dec 31, 2004"});
-ok($info{"test","isodate"} eq "2004-12-31","US date permutation 2");
-%info = ();
-$quote->store_date(\%info, "test", {usdate => "December 31 2004"});
-ok($info{"test","isodate"} eq "2004-12-31","US date permutation 3");
-
-# Test various permutions of an European Date as input
-%info = ();
-$quote->store_date(\%info, "test", {eurodate => "31/12/2004"});
-ok($info{"test","isodate"} eq "2004-12-31","EUR date permutation 1" );
-%info = ();
-$quote->store_date(\%info, "test", {eurodate => "31 December 2004"});
-ok($info{"test","isodate"} eq "2004-12-31","EUR date permutation 2");
-%info = ();
-$quote->store_date(\%info, "test", {eurodate => "31 Dec, 2004"});
-ok($info{"test","isodate"} eq "2004-12-31","EUR date permutation 3");
-
-# Try some other permutions.  A recent change to the date handling
-# code changes the behavior if a year is not explicitly provided.  Now
-# it will look at the month and decide if the date is in the current
-# year or is from the previous year.  This code still has to handle
-# being executed on 12/31, thus the dual tests for each date.
-%info = ();
-$quote->store_date(\%info, "test", {day=>"31", month=>"12"});
-ok($info{"test","date"} eq "12/31/$year4" ||
-   $info{"test","date"} eq "12/31/$year4m","test year 1");
-ok($info{"test","isodate"} eq "$year4-12-31" ||
-   $info{"test","isodate"} eq "$year4m-12-31","test year 2");
-%info = ();
-$quote->store_date(\%info, "test", {day=>"31", month=>"December"});
-ok($info{"test","date"} eq "12/31/$year4" ||
-   $info{"test","date"} eq "12/31/$year4m","test year 3");
-ok($info{"test","isodate"} eq "$year4-12-31" ||
-   $info{"test","isodate"} eq "$year4m-12-31","test year 4");
-%info = ();
-$quote->store_date(\%info, "test", {day=>"31", month=>"December", year => $year2});
-ok($info{"test","date"} eq "12/31/$year4" ||
-   $info{"test","date"} eq "12/31/$year4m","test year 5");
-ok($info{"test","isodate"} eq "$year4-12-31" ||
-   $info{"test","isodate"} eq "$year4m-12-31","test year 6");
@@ -1,11 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-
-if (not $ENV{TEST_AUTHOR}) {
-    plan( skip_all => 'Author test.  Set $ENV{TEST_AUTHOR} to true to run.');
-}
-
-eval "use Test::Pod 1.00";  ## no critic
-plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
-all_pod_files_ok();
@@ -1,12 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-
-use Test::More;
-
-if (not $ENV{TEST_AUTHOR}) {
-    plan( skip_all => 'Author test.  Set $ENV{TEST_AUTHOR} to true to run.');
-}
-
-eval "use Test::Pod::Coverage 1.00";
-plan skip_all => "Test::Pod::Coverage 1.00 required for testing POD" if $@;
-all_pod_coverage_ok();
@@ -1,11 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-
-use Test::More;
-
-if (not $ENV{TEST_AUTHOR}) {
-    plan( skip_all => 'Author test.  Set $ENV{TEST_AUTHOR} to true to run.');
-}
-
-eval { require Test::Kwalitee; Test::Kwalitee->import() };
-plan( skip_all => 'Test::Kwalitee not installed; skipping' ) if $@;
@@ -1,17 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use File::Spec;
-
-if (not $ENV{TEST_AUTHOR}) {
-    plan( skip_all => 'Author test.  Set $ENV{TEST_AUTHOR} to true to run.');
-}
-
-eval { require Test::Perl::Critic; };
-
-if ($@) {
-    plan( skip_all => 'Test::Perl::Critic required for test.');
-}
-
-Test::Perl::Critic->import();
-all_critic_ok();
@@ -1,20 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{TEST_AUTHOR}) {
-    plan( skip_all => 'Author test.  Set $ENV{TEST_AUTHOR} to true to run.');
-}
-
-plan tests => 1;
-
-# F::Q doesn't load all its code until we actually create
-# an object.
-
-my $fq = Finance::Quote->new;
-
-# Sometimes Data::Dumper gets left in code by accident.  Make sure
-# we haven't done so.
-
-ok(! exists $INC{'Data/Dumper.pm'}, "Data::Dumper should not be loaded");
@@ -1,45 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 13;
-
-# Test AEX functions.
-
-my $quoter = Finance::Quote->new();
-
-my %quotes = $quoter->aex("AH");
-ok(%quotes);
-
-# Check that some values are defined.
-ok($quotes{"AH","success"});
-ok($quotes{"AH","last"} > 0);
-ok($quotes{"AH","date"});
-ok($quotes{"AH","volume"} > 0);
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-ok(substr($quotes{"AH","isodate"},0,4) == $year ||
-   substr($quotes{"AH","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"AH","date"},6,4) == $year ||
-   substr($quotes{"AH","date"},6,4) == $lastyear);
-
-# Exercise the fetch function 
-%quotes = $quoter->fetch("aex","AMG");
-ok(%quotes);
-ok($quotes{"AMG","success"});
-ok($quotes{"AMG","last"} > 0);
-
-# Check fetching on based on ISIN 
-%quotes = $quoter->aex("NL0000009165");  # NL0000009165 ==  Heineken == HEIA
-ok(%quotes);
-ok($quotes{"NL0000009165","success"});
-
-# Check that a bogus fund returns no-success.
-%quotes = $quoter->aex("BOGUS");
-ok( ! $quotes{"BOGUS","success"});
@@ -1,47 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 30;
-
-# Test Aia functions.
-
-my $q      = Finance::Quote->new();
-
-# my stocks = stock, fund, warrant, bond, indice
-my @stocks = ("ABD-AUS.EQ", "AIG-EUSC.U", "FID-JP.ADV", "SCH-HKEQ");
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->fetch("aiahk", @stocks);
-ok(%quotes);
-
-TODO: {
-  local $TODO="To be debugged";
-
-  # Check that the name, last, currency and date are defined for all of the stocks.
-  foreach my $stock (@stocks) {
-    ok($quotes{$stock,"success"});
-    ok($quotes{$stock,"bid"} > 0);
-    ok($quotes{$stock,"offer"} > 0);
-    ok(length($quotes{$stock,"name"}));
-    ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
-         substr($quotes{$stock,"isodate"},0,4) == $lastyear);
-    ok(substr($quotes{$stock,"date"},6,4) == $year ||
-         substr($quotes{$stock,"date"},6,4) == $lastyear);
-  }
-  ok($quotes{"ABD-AUS.EQ", "currency"} eq "AUD");
-  ok($quotes{"AIG-EUSC.U", "currency"} eq "EUR");
-  ok($quotes{"FID-JP.ADV", "currency"} eq "JPY");
-  ok($quotes{"SCH-HKEQ", "currency"}   eq "HKD");
-}
-
-# Check that a bogus stock returns no-success.
-%quotes = $q->fetch("aiahk", "BOGUS");
-ok(! $quotes{"BOGUS","success"});
@@ -1,48 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 13;
-
-# Test ASEGR functions.
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->asegr("ALPHA","ELTON");
-ok(%quotes);
-
-# Check the last values are defined.  These are the most used and most
-# reliable indicators of success.
-ok($quotes{"ALPHA","last"} > 0);
-ok($quotes{"ALPHA","success"});
-ok(substr($quotes{"ALPHA","date"},6,4) == $year ||
-   substr($quotes{"ALPHA","date"},6,4) == $lastyear);
-ok($quotes{"ELTON","success"});
-ok($quotes{"ELTON","last"} > 0);
-ok(substr($quotes{"ELTON","date"},6,4) == $year ||
-   substr($quotes{"ELTON","date"},6,4) == $lastyear);
-
-# Exercise the fetch function a little.
-%quotes = $q->fetch("asegr","IKONA");
-ok(%quotes);
-ok($quotes{"IKONA","last"} > 0);
-ok($quotes{"IKONA","success"} > 0);
-
-# Check that we're getting currency information.
-ok($quotes{"IKONA", "currency"} eq "EUR");
-
-# Check we're not getting bogus percentage signs.
-$quotes{"IKONA","p_change"} ||= "";	# Avoid warning if undefined.
-ok($quotes{"IKONA","p_change"} !~ /%/);
-
-# Check that looking up a bogus stock returns failure:
-%quotes = $q->asegr("BOGUS");
-ok(! $quotes{"BOGUS","success"});
-
@@ -1,67 +0,0 @@
-#!/usr/bin/perl -w
-
-# 16-Feb-2014 Change RZR (delisted in 2012) to BOQ.
-# 28-Feb-2014 Add tests with 11 stocks at once. plan tests 11 -> 34.
-
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 34;
-
-# Test ASX functions.
-
-my $q      = Finance::Quote->new();
-
-$q->timeout(120);	# ASX is broken regularly, so timeouts are good.
-
-my %quotes = $q->asx("WES","BHP");
-ok( %quotes, "Data returned for call to asx" );
-
-# Check the last values are defined.  These are the most used and most
-# reliable indicators of success.
-ok( $quotes{"WES","success"}, "WES query was successful" );
-cmp_ok( $quotes{"WES","last"}, '>', 0
-      , "Last price for WES was > 0" );
-ok( $quotes{"BHP","success"}, "BHP query was successful" );
-cmp_ok( $quotes{"BHP","last"}, '>', 0
-      , "Last price for BHP was > 0" );
-
-# Exercise the fetch function a little.
-%quotes = $q->fetch("asx","BOQ");
-ok( %quotes, "Data returned for call to fetch" );
-ok( $quotes{"BOQ","success"}, "BOQ query was successful" );
-cmp_ok( $quotes{"BOQ","last"}, '>', 0
-      , "Last price for BOQ was > 0" );
-
-# Check that we're getting currency information.
-cmp_ok( $quotes{"BOQ", "currency"}, "eq", "AUD"
-      , "Currency of BOQ is AUD" );
-
-# Check we're not getting bogus percentage signs.
-unlike( $quotes{"BOQ","p_change"}
-      , qr/%/
-      , "No percentage sign in p_change value" );
-
-# Check that looking up a bogus stock returns failure:
-%quotes = $q->asx("BOG");
-ok( ! $quotes{"BOG","success"}, "asx call for invalid stock BOG returns failure");
-
-# Check 11 stocks at once to test batching of price enquiries into groups of 10
-my @stocks = qw/AMP ANZ BHP BOQ BEN CSR IAG NAB TLS WBC WES/;
-
-%quotes = $q->asx(@stocks);
-ok( %quotes, "Data returned for call to asx" );
-
-# Check the last values are defined.  These are the most used and most
-# reliable indicators of success.
-
-foreach my $stock (@stocks) {
-	ok( $quotes{$stock, "success"}, $stock . " query was successful" );
-	cmp_ok( $quotes{$stock,"last"}, '>', 0
-	      , "Last price for " . $stock . " was > 0" );
-}
@@ -1,52 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 23;
-
-# Test bmonesbittburns functions.
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my @stocks = ("NT,T", "BBD.A,T","MFC598,MF");
-my %quotes = $q->bmonesbittburns(@stocks);
-ok(%quotes);
-
-# Check that last and date are defined as our tests.
-foreach my $stock (@stocks) {
-    ok($quotes{$stock,"last"} > 0);
-    ok($quotes{$stock,"success"});
-    ok($quotes{$stock,"currency"} eq "CAD");
-    ok(length($quotes{$stock,"date"}) > 0);
-    ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
-       substr($quotes{$stock,"isodate"},0,4) == $lastyear);
-    ok(substr($quotes{$stock,"date"},6,4) == $year ||
-       substr($quotes{$stock,"date"},6,4) == $lastyear);
-}
-
-# Exercise the fetch function
-%quotes = $q->fetch("bmonesbittburns", "NT,X");
-ok(%quotes);
-ok($quotes{"NT,X","success"});
-ok($quotes{"NT,X","last"} > 0);
-
-# Check that a bogus fund returns no-success.
-%quotes = $q->bmonesbittburns("BOGUS");
-ok( ! $quotes{"BOGUS","success"});
-
-# Fetching an empty stock does result in an error, and yes
-# this is bad.  But fetching an empty stock isn't normal
-# behaviour.
-
-# %quotes = $q->fetch("bmonesbittburns", "");
-# ok( %quotes);
-# ok( ! $quotes{"NT,X","success"});
-# ok( ! $quotes{"NT,X","last"} > 0);
-
@@ -1,87 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if ( not $ENV{ONLINE_TEST} ) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 65;
-
-# Test Bourso functions.
-
-my $q = Finance::Quote->new();
-
-# my stocks = stock, fund, warrant, bond, indice
-my @stocks = ( "FR0000441677",    # Fund
-               "AF",              # Stock, EUR, Nyse Euronext
-               "MSFT",            # Stock, USD, NASDAQ
-               "SOLB",            # Stock, EUR, BRUXELLES
-               "CNP",             # Stock, EUR, Nyse Euronext
-               "FR0010371401",    # Bond
-               "FR0010707414",    # Warrant
-               "FR0003500008",    # Index
-);
-
-# Bourso tests need to cover all the possible cases:
-#
-#    Name		What		Test Case
-#
-#    cours-action	Stock		AF
-#    cours-obligation	Bond		FR0010371401
-#    opcvm/opcvm	Fund		FR0000441677
-#    cours-warrant	Warrant		FR0010707414
-#    cours-indice	Index		FR0003500008
-
-my $year     = ( localtime() )[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes;
-
-#my %quotes = $q->fetch("bourso", @stocks);
-#ok(%quotes);
-
-# Check that the name, last, currency and date are defined for all of the stocks.
-foreach my $stock (@stocks) {
-    eval {
-        %quotes = $q->fetch( "bourso", $stock );
-        ok( %quotes, "$stock \%quotes defined" );
-
-        my $last = $quotes{ $stock, "last" };
-        ok( $last > 0, "$stock last ($last) > 0" );
-        ok( length( $quotes{ $stock, "name" } ),   "$stock name is defined" );
-        ok( length( $quotes{ $stock, "symbol" } ), "$stock symbol is defined" );
-        ok( $quotes{ $stock, "success" }, "$stock returned success" );
-        ok(    # indexes are quoted in percents
-            ( $stock eq "FR0003500008" )
-                || (    ( $stock eq "MSFT" )
-                     && ( $quotes{ $stock, "currency" } eq "USD" ) )
-                || ( $quotes{ $stock, "currency" } eq "EUR" ),
-            "Index is quoted in percents"
-        );
-
-    SKIP:
-        {
-            skip "date is not defined for warrants", 2
-                if ( $stock eq "FR0010707414" );
-            ok( substr( $quotes{ $stock, "isodate" }, 0, 4 ) == $year
-                    || substr( $quotes{ $stock, "isodate" }, 0, 4 )
-                    == $lastyear,
-                "$stock isodate defined"
-            );
-            ok( substr( $quotes{ $stock, "date" }, 6, 4 ) == $year
-                    || substr( $quotes{ $stock, "date" }, 6, 4 ) == $lastyear,
-                "$stock date defined"
-            );
-        }
-    };
-    if ($@) {
-        print STDERR "Error fetching stock ", $stock, "\n", $@;
-        ok( !1 );
-    }
-}
-
-# Check that a bogus stock returns no-success.
-%quotes = $q->fetch( "bourso", "BOGUS" );
-ok( !$quotes{ "BOGUS", "success" }, "BOGUS failed correctly" );
@@ -1,48 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 26;
-
-# Test BSERO functions.
-
-my $q      = Finance::Quote->new();
-my @stocks = ("TLV", "BRD", "SNP");
-
-my %regexps = (
-	TLV  => qr/\bTLV\b/,
-	BRD => qr/\bBRD\b/,
-	SNP => qr/\bSNP\b/,
-);
-
-
-my %quotes = $q->fetch("bsero", @stocks);
-ok(%quotes);
-
-foreach my $stock (@stocks) {
-
-	my $name = $quotes{$stock, "name"};
-	print "#Testing $stock: $name\n";
-
-	my $regexp = $regexps{$stock};
-	ok($name =~ /$regexp/i);
-
-	ok($quotes{$stock, "exchange"} eq 'Bucharest Stock Exchange');
-	ok($quotes{$stock, "method"} eq 'bsero');
-
-	ok($quotes{$stock, "last"} > 0);
-	ok($quotes{$stock, "open"} =~ /^-?\d+\.\d+$/);
-	ok($quotes{$stock, "p_change"} =~ /^-?\d+\.\d+$/);
-	ok($quotes{$stock, "success"});
-	ok($quotes{$stock, "volume"} >= 0);
-}
-
-
-# Check that a bogus stock returns no-success.
-%quotes = $q->fetch("tsx", "BOGUS");
-ok(! $quotes{"BOGUS","success"});
@@ -1,35 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 8;
-
-# Test Canadian Fund Library functions.
-
-my $q      = Finance::Quote->new();
-
-my %quotes = $q->fundlibrary("19001","00000");
-ok(%quotes);
-
-# Check the last values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"19001","last"} > 0);
-ok($quotes{"19001","success"});
-ok($quotes{"19001", "currency"} eq "CAD");
-ok(length($quotes{"19001","date"}) > 0);
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-ok(substr($quotes{"19001","isodate"},0,4) == $year ||
-   substr($quotes{"19001","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"19001","date"},6,4) == $year ||
-   substr($quotes{"19001","date"},6,4) == $lastyear);
-
-# Check that bogus stocks return failure:
-
-ok(! $quotes{"00000","success"});
@@ -1,32 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 8;
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->citywire("GB0003865390","GB0003865176","GB0033696674","BOGUS");
-ok(%quotes);
-
-# Check the last values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"GB0003865390","last"} > 0);
-ok($quotes{"GB0003865390","success"});
-
-ok($quotes{"GB0003865176","last"} > 0);
-ok($quotes{"GB0003865176","success"});
-
-ok($quotes{"GB0033696674","last"} > 0);
-ok($quotes{"GB0033696674","success"});
-
-# Check that bogus stocks return failure:
-
-ok(! $quotes{"BOGUS","success"});
@@ -1,35 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 9;
-
-# Test Cominvest functions.
-
-my $q      = Finance::Quote->new("Cominvest");
-
-my %quotes = $q->fetch("cominvest","DE0008471178","BOGUS");
-ok(%quotes);
-
-# Check that the price and date values are defined.
-ok($quotes{"DE0008471178","success"});
-ok($quotes{"DE0008471178","price"} > 0);
-ok(length($quotes{"DE0008471178","date"}) > 0);
-ok($quotes{"DE0008471178","currency"});
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-ok((substr($quotes{"DE0008471178","isodate"},0,4) == $year) ||
-   (substr($quotes{"DE0008471178","isodate"},0,4) == $lastyear));
-ok((substr($quotes{"DE0008471178","date"},6,4) == $year) ||
-   (substr($quotes{"DE0008471178","date"},6,4) == $lastyear));
-
-# Check that a bogus fund returns no-success and has a error message
-ok(! $quotes{"BOGUS","success"});
-ok($quotes{"BOGUS","errormsg"});
-
@@ -1,39 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 12;
-
-# Test CSE functions.
-
-my $quoter = Finance::Quote->new();
-
-my %quotes = $quoter->cse("JKH.N0000");
-ok(%quotes);
-
-# Check that some values are defined.
-ok($quotes{"JKH.N0000","success"},"success");
-ok($quotes{"JKH.N0000","last"} > 0,"last > 0");
-ok($quotes{"JKH.N0000","volume"} > 0,"volume > 0");
-TODO: {
-    local $TODO = "No 'open' returned when market closed ?" ;
-    ok($quotes{"JKH.N0000","open"},"open is defined");
-}
-ok($quotes{"JKH.N0000","high"},"high is defined");
-ok($quotes{"JKH.N0000","low"},"low is defined");
-ok($quotes{"JKH.N0000","close"},"close is defined");
-
-# Exercise the fetch function
-%quotes = $quoter->fetch("cse", "JKH.N0000");
-ok(%quotes);
-ok($quotes{"JKH.N0000","success"});
-ok($quotes{"JKH.N0000","last"} > 0);
-
-# Check that a bogus fund returns no-success.
-%quotes = $quoter->cse("BOGUS");
-ok( ! $quotes{"BOGUS","success"});
@@ -1,20 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote::Currencies;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 1;
-
-my $known_currencies
-  = eval { Finance::Quote::Currencies::known_currencies() };
-my $live_currencies
-  = eval { Finance::Quote::Currencies::fetch_live_currencies() };
-
-is_deeply( $known_currencies
-         , $live_currencies
-         , "Stored currency list is up to date with live currency list"
-         );
@@ -1,52 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 11;
-
-# Test currency conversion, both explicit requests and automatic
-# conversion.
-
-my $q      = Finance::Quote->new();
-
-# Explicit conversion...
-ok($q->currency("USD","AUD"));			# Test 1
-ok($q->currency("EUR","JPY"));			# Test 2
-ok(! defined($q->currency("XXX","YYY")));	# Test 3
-
-# test for thousands : GBP -> IQD. This should be > 1000
-ok($q->currency("GBP","IQD")>1000) ;            # Test 4
-
-# Test 5
-ok(($q->currency("10 AUD","AUD")) == (10 * ($q->currency("AUD","AUD"))));
-
-# Euros into French Francs are fixed at a conversion rate of
-# 1:6.559576 .  We can use this knowledge to test that a stock is
-# converting correctly.
-
-# Test 6
-my %baseinfo = $q->fetch("yahoo_europe","UG.PA");
-ok($baseinfo{"UG.PA","success"});
-
-$q->set_currency("AUD");	# All new requests in Aussie Dollars.
-
-my %info = $q->fetch("yahoo_europe","UG.PA");
-ok($info{"UG.PA","success"});		# Test 7
-ok($info{"UG.PA","currency"} eq "AUD");	# Test 8
-ok($info{"UG.PA","price"} > 0);		# Test 9
-
-# Check if inverse is working ok
-ok(check_inverse("EUR","RUB"),"Inverse is calculated correctly: multiplication should be 1");
-ok(check_inverse("CZK","USD"),"Inverse is calculated correctly: multiplication should be 1");
-
-sub check_inverse {
-    my ($cur1,$cur2)=@_;
-    my $a = $q->currency($cur1,$cur2);
-    my $b = $q->currency($cur2,$cur1);
-    return $a*$b;
-}
@@ -1,56 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More tests => 12;
-use Finance::Quote;
-
-# Test overall currency lookup
-my $currencies = Finance::Quote::currency_lookup();
-
-my %test_currencies = ( AUD => "Australian Dollar"
-                      , EUR => "Euro"
-                      , CAD => "Canadian Dollar"
-                      );
-
-while ( my ($code, $name) = each %test_currencies ) {
-  ok( exists $currencies->{$code}, "Expected currency code (${code}) exists" );
-  is( $currencies->{$code}->{name}
-    , $name
-    , "Expected currency name (${name}) for code (${code})"
-    );
-}
-
-# Test selective currency lookup
-$currencies = Finance::Quote::currency_lookup( name => qr/pound/i );
-
-# Test multiple lookup parameters
-$currencies = Finance::Quote::currency_lookup( name => "Australia"
-                                             , code => qr/AU/ );
-ok( exists $currencies->{AUD}
-  , "Expected currency code (AUD) exists for matching multiple params" );
-cmp_ok( scalar keys %{$currencies}, '==', 1
-      , "Only one currency returned for matching multiple params"
-      );
-
-$currencies = Finance::Quote::currency_lookup( name => "Euro"
-                                             , code => "AUD" );
-cmp_ok( scalar keys %{$currencies}, '==', 0
-      , "Expected zero-response for non-matching multiple params"
-      );
-
-# Test non-matching currency lookup
-$currencies = Finance::Quote::currency_lookup( name => qr/rubbish_value/i );
-is( ref $currencies
-  , 'HASH'
-  , 'Hash-ref returned for non-matching lookup'
-  );
-cmp_ok( scalar keys %{$currencies}
-      , '==', 0
-      , "Empty hashref returned for non-matching lookup"
-      );
-
-# Test that an error returns undef
-$currencies = Finance::Quote::currency_lookup( invalid_param => 1 );
-is( $currencies
-  , undef
-  , "Error results in undef response"
-  );
@@ -1,42 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 13;
-
-
-# Test deka functions.
-
-my $q      = Finance::Quote->new("Deka");
-
-$q->timeout(60);		# Deka appears to be hanging today.
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-my @stocks = ("DE0008474511","LU0051755006");
-my %quotes = $q->deka(@stocks, "BOGUS");
-ok(%quotes);
-
-TODO: {
-  local $TODO="To be debugged";
-  # Check that the last and date values are defined.
-  foreach my $stock (@stocks) {
-    ok($quotes{$stock,"success"});
-    ok($quotes{$stock,"last"} > 0);
-    ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
-         substr($quotes{$stock,"isodate"},0,4) == $lastyear);
-    ok(substr($quotes{$stock,"date"},6,4) == $year ||
-         substr($quotes{$stock,"date"},6,4) == $lastyear);
-  }
-  ok($quotes{"DE0008474511","currency"} eq "EUR");
-  ok($quotes{"LU0051755006","currency"} eq "USD");
-}
-
-# Check that a bogus fund returns no-success.
-ok($quotes{"BOGUS","success"} == 0);
-ok($quotes{"BOGUS","errormsg"} eq "Couldn't parse deka website");
@@ -1,33 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 8;
-
-# Test DWS functions.
-
-my $q      = Finance::Quote->new("DWS");
-
-my %quotes = $q->fetch("dwsfunds","847402","BOGUS");
-ok(%quotes);
-
-# Check that the last and date values are defined.
-ok($quotes{"847402","success"});
-ok($quotes{"847402","last"} > 0);
-ok(length($quotes{"847402","date"}) > 0);
-ok($quotes{"847402","currency"} eq "EUR");
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-ok((substr($quotes{"847402","isodate"},0,4) == $year) ||
-   (substr($quotes{"847402","isodate"},0,4) == $lastyear));
-ok((substr($quotes{"847402","date"},6,4) == $year) ||
-   (substr($quotes{"847402","date"},6,4) == $lastyear));
-
-# Check that a bogus fund returns no-success.
-ok(! $quotes{"BOGUS","success"});
@@ -1,44 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 25;
-
-# Test Fidelity functions.
-
-my $q      = Finance::Quote->new();
-my @funds = qw/FGRIX FNMIX FASGX/;
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->fidelity_direct(@funds);
-ok(%quotes);
-
-# Check that the name and nav are defined for all of the funds.
-foreach my $fund (@funds) {
-	ok($quotes{$fund,"nav"} > 0);
-	ok(length($quotes{$fund,"name"}));
-	ok($quotes{$fund,"success"});
-        ok($quotes{$fund, "currency"} eq "USD");
-	ok(substr($quotes{$fund,"isodate"},0,4) == $year ||
-	   substr($quotes{$fund,"isodate"},0,4) == $lastyear);
-	ok(substr($quotes{$fund,"date"},6,4) == $year ||
-	   substr($quotes{$fund,"date"},6,4) == $lastyear);
-}
-
-# Some funds have yields instead of navs.  Check one of them too.
-%quotes = $q->fidelity_direct("FSLXX");
-ok(%quotes);
-ok(length($quotes{"FSLXX","name"}));
-ok($quotes{"FSLXX","yield"} > 0);
-ok($quotes{"FSLXX","success"});
-ok($quotes{"FSLXX", "currency"} eq "USD");
-
-# Check that a bogus fund returns no-success.
-%quotes = $q->fidelity_direct("BOGUS");
-ok(! $quotes{"BOGUS","success"});
@@ -1,36 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 26;
-
-# Test Finance Canada functions.
-
-my $q      = Finance::Quote->new();
-my @stocks = ("NT","XIU","UUU", "PCA");
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->fetch("financecanada", @stocks);
-ok(%quotes);
-
-# Check that the name and nav are defined for all of the stocks.
-foreach my $stock (@stocks) {
-	ok($quotes{$stock,"price"} > 0);
-	ok(length($quotes{$stock,"name"}));
-	ok($quotes{$stock,"success"});
-        ok($quotes{$stock, "currency"} eq "CAD");
-	ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
-	   substr($quotes{$stock,"isodate"},0,4) == $lastyear);
-	ok(substr($quotes{$stock,"date"},6,4) == $year ||
-	   substr($quotes{$stock,"date"},6,4) == $lastyear);
-}
-
-# Check that a bogus stock returns no-success.
-%quotes = $q->fetch("financecanada", "BOGUS");
-ok(! $quotes{"BOGUS","success"});
@@ -1,33 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 8;
-
-# Test finanzpartner functions.
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-my $q      = Finance::Quote->new("Finanzpartner");
-
-my %quotes = $q->finanzpartner("LU0055732977","BOGUS");
-ok(%quotes);
-
-# Check that the last and date values are defined.
-ok($quotes{"LU0055732977","success"});
-ok($quotes{"LU0055732977","last"} > 0);
-ok(length($quotes{"LU0055732977","date"}) > 0);
-ok(substr($quotes{"LU0055732977","isodate"},0,4) == $year ||
-   substr($quotes{"LU0055732977","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"LU0055732977","date"},6,4) == $year ||
-   substr($quotes{"LU0055732977","date"},6,4) == $lastyear);
-ok($quotes{"LU0055732977","currency"} eq "USD");
-
-# Check that a bogus fund returns non-success.
-ok($quotes{"BOGUS","success"} == 0);
-
@@ -1,32 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 8;
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->ftfunds("GB0031835118","GB0030880255","GB0003865176","BOGUS");
-ok(%quotes);
-
-# Check the last values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"GB0031835118","last"} > 0);
-ok($quotes{"GB0031835118","success"});
-
-ok($quotes{"GB0030880255","last"} > 0);
-ok($quotes{"GB0030880255","success"});
-
-ok($quotes{"GB0003865176","last"} > 0);
-ok($quotes{"GB0003865176","success"});
-
-# Check that bogus stocks return failure:
-
-ok(! $quotes{"BOGUS","success"});
@@ -1,40 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 18;
-
-# Test FTPortfolios functions.
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my @stocks = ("FKYMRX", "FAEDEX");
-my %quotes = $q->ftportfolios(@stocks, "BOGUS");
-ok(%quotes);
-
-TODO: {
-  local $TODO="To be debugged";
-  # Check that last and date are defined as our tests.
-  foreach my $stock (@stocks) {
-    ok($quotes{$stock,"pop"} > 0);
-    ok($quotes{$stock,"nav"} > 0);
-    ok($quotes{$stock,"price"} > 0);
-    ok($quotes{$stock,"success"});
-    ok($quotes{$stock,"currency"} eq "USD");
-    ok(length($quotes{$stock,"date"}) > 0);
-    ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
-         substr($quotes{$stock,"isodate"},0,4) == $lastyear);
-    ok(substr($quotes{$stock,"date"},6,4) == $year ||
-         substr($quotes{$stock,"date"},6,4) == $lastyear);
-  }
-}
-
-# Check that a bogus fund returns no-success.
-ok( ! $quotes{"BOGUS","success"});
@@ -1,47 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 23;
-
-# Test GoldMoney functions.
-my $q      = Finance::Quote->new("GoldMoney");
-$q->set_currency('EUR');
-my %quotes = $q->fetch("goldmoney","gold", "silver", "platinum", "BOGUS");
-ok(%quotes);
-
-# Check that sound information is returned for gold, silver and platinum.
-ok($quotes{"gold","success"}, 'gold price lookup');
-ok($quotes{"gold","last"} > 0);
-ok($quotes{"gold","currency"} eq "EUR");
-ok(length($quotes{"gold","date"}) > 0);
-ok(length($quotes{"gold","time"}) > 0);
-
-ok($quotes{"silver","success"}, 'silver price lookup');
-ok($quotes{"silver","last"} > 0);
-ok($quotes{"silver","currency"} eq "EUR");
-ok(length($quotes{"silver","date"}) > 0);
-ok(length($quotes{"silver","time"}) > 0);
-
-ok($quotes{"platinum","success"}, 'platinum price lookup');
-ok($quotes{"platinum","last"} > 0);
-ok($quotes{"platinum","currency"} eq "EUR");
-ok(length($quotes{"platinum","date"}) > 0);
-ok(length($quotes{"platinum","time"}) > 0);
-
-my $year = (localtime())[5] + 1900;
-ok((substr($quotes{"gold","isodate"},0,4) == $year));
-ok((substr($quotes{"gold","date"},6,4) == $year));
-ok((substr($quotes{"silver","isodate"},0,4) == $year));
-ok((substr($quotes{"silver","date"},6,4) == $year));
-ok((substr($quotes{"platinum","isodate"},0,4) == $year));
-ok((substr($quotes{"platinum","date"},6,4) == $year));
-
-# Check that a bogus symbol returns no-success.
-ok(! $quotes{"BOGUS","success"});
-
@@ -1,36 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 14;
-
-# Test HEX functions.
-
-my $q      = Finance::Quote->new();
-my @stocks = ("NOK1V", "RTRKS");
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->fetch("hex", @stocks);
-ok(%quotes);
-
-# Check that the name and nav are defined for all of the stocks.
-foreach my $stock (@stocks) {
-	ok($quotes{$stock,"price"} > 0);
-	ok(length($quotes{$stock,"name"}));
-	ok($quotes{$stock,"success"});
-        ok($quotes{$stock, "currency"} eq "EUR");
-	ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
-	   substr($quotes{$stock,"isodate"},0,4) == $lastyear);
-	ok(substr($quotes{$stock,"date"},6,4) == $year ||
-	   substr($quotes{$stock,"date"},6,4) == $lastyear);
-}
-
-# Check that a bogus stock returns no-success.
-%quotes = $q->fetch("hex", "BOGUS");
-ok(! $quotes{"BOGUS","success"});
@@ -1,67 +0,0 @@
-#!/usr/bin/perl -w
-#
-# HU.pm
-#
-# Version 0.1 - test of Hungarian (HU) F::Q
-# This version based on za.t module
-#
-# Zoltan Levardy <zoltan at levardy dot org>
-# 2009
-
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if ( not $ENV{ONLINE_TEST} ) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 21;
-
-# Test za functions.
-
-my $q        = Finance::Quote->new("HU");
-my $year     = ( localtime() )[5] + 1900;
-my $lastyear = $year - 1;
-
-#getting quotes for shares by ticker (OTP,ANY,RABA),
-# shares by ISIN (ticker: MTELEKOM: HU0000073507, MOL: HU0000068952)
-# and for funds by ISIN (HU0000702709,HU0000706437)
-# and finally an incorrect ticker/isin is ZOL, must fail.
-my %quotes = $q->hu( "OTP", "HU0000068952", "HU0000702709", "ZOL" )
-    ; #,"ANY","RABA","HU0000073507","HU0000068952","HU0000702709","HU0000706437","ZOL");
-ok(%quotes);
-
-# Check that the last and date values are defined.
-ok( $quotes{ "OTP", "success" } );
-ok( $quotes{ "OTP", "last" } > 0 );
-ok( length( $quotes{ "OTP", "date" } ) > 0 );
-ok(    substr( $quotes{ "OTP", "isodate" }, 0, 4 ) == $year
-    || substr( $quotes{ "OTP", "isodate" }, 0, 4 ) == $lastyear );
-ok(    substr( $quotes{ "OTP", "date" }, 6, 4 ) == $year
-    || substr( $quotes{ "OTP", "date" }, 6, 4 ) == $lastyear );
-ok( $quotes{ "OTP", "currency" } eq "HUF" );
-
-# MTELEKOM: HU0000073507
-ok( $quotes{ "HU0000068952", "success" } );
-ok( $quotes{ "HU0000068952", "last" } > 0 );
-ok( length( $quotes{ "HU0000068952", "date" } ) > 0 );
-ok(    substr( $quotes{ "HU0000068952", "isodate" }, 0, 4 ) == $year
-    || substr( $quotes{ "HU0000068952", "isodate" }, 0, 4 ) == $lastyear );
-ok(    substr( $quotes{ "HU0000068952", "date" }, 6, 4 ) == $year
-    || substr( $quotes{ "HU0000068952", "date" }, 6, 4 ) == $lastyear );
-ok( $quotes{ "HU0000068952", "currency" } eq "HUF" );
-
-# Fund: Budapest II, isin: HU0000702709
-ok( $quotes{ "HU0000702709", "success" } );
-ok( $quotes{ "HU0000702709", "last" } > 0 );
-ok( length( $quotes{ "HU0000702709", "date" } ) > 0 );
-ok(    substr( $quotes{ "HU0000702709", "isodate" }, 0, 4 ) == $year
-    || substr( $quotes{ "HU0000702709", "isodate" }, 0, 4 ) == $lastyear );
-ok(    substr( $quotes{ "HU0000702709", "date" }, 6, 4 ) == $year
-    || substr( $quotes{ "HU0000702709", "date" }, 6, 4 ) == $lastyear );
-ok( $quotes{ "HU0000702709", "currency" } eq "HUF" );
-
-# Check that a ZOL fund returns no-success.
-ok( !$quotes{ "ZOL", "success" } );
-ok( $quotes{ "ZOL",  "errormsg" } eq "Fetch from bse or bamosz failed" );
@@ -1,37 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 50;
-
-# Test Fidelity functions.
-
-my $q      = Finance::Quote->new();
-my @funds = ("102676", "103131", "101599", "102732", "100151",
-	     "INF194K01W88", "INF090I01FN7", "INF082J01127");
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->fetch("indiamutual", @funds);
-ok(%quotes);
-
-# Check that the name and nav are defined for all of the funds.
-foreach my $fund (@funds) {
-	ok($quotes{$fund,"nav"} > 0);
-	ok(length($quotes{$fund,"name"}));
-	ok($quotes{$fund,"success"});
-        ok($quotes{$fund, "currency"} eq "INR");
-	ok(substr($quotes{$fund,"isodate"},0,4) == $year ||
-	   substr($quotes{$fund,"isodate"},0,4) == $lastyear);
-	ok(substr($quotes{$fund,"date"},6,4) == $year ||
-	   substr($quotes{$fund,"date"},6,4) == $lastyear);
-}
-
-# Check that a bogus fund returns no-success.
-%quotes = $q->fetch("indiamutual", "BOGUS");
-ok(! $quotes{"BOGUS","success"});
@@ -1,50 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 32;
-
-# Test LeRevenu functions.
-
-my $q      = Finance::Quote->new();
-
-# my stocks = stock, fund, warrant, bond, indice
-my @stocks = ("AF","FR0000441677","FR0010324475","FR0010112052","FR0003500008");
-
-# LeRevenu tests need to cover all the possible cases:
-#
-#    Name		What		Test Case
-#
-#    Actions		Stock		AF
-#    Obligations	Bond		FR0010112052
-#    SICAVetFCP		Fund		FR0000441677
-#    Bons&Warrants	Warrant		FR0010324475
-#    Indices		Index		FR0003500008
-
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->fetch("lerevenu", @stocks);
-ok(%quotes);
-
-# Check that the name, last, currency and date are defined for all of the stocks.
-foreach my $stock (@stocks) {
-	ok($quotes{$stock,"last"} > 0);
-	ok(length($quotes{$stock,"name"}));
-	ok($quotes{$stock,"success"});
-        ok($quotes{$stock, "currency"} eq "EUR");
-	ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
-	   substr($quotes{$stock,"isodate"},0,4) == $lastyear);
-	ok(substr($quotes{$stock,"date"},6,4) == $year ||
-	   substr($quotes{$stock,"date"},6,4) == $lastyear);
-}
-
-# Check that a bogus stock returns no-success.
-%quotes = $q->fetch("lerevenu", "BOGUS");
-ok(! $quotes{"BOGUS","success"});
@@ -1,39 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 8;
-
-# Test ManInvestments functions.
-
-my $q      = Finance::Quote->new();
-
-my %quotes = $q->maninv("OMIP220","BOGUS");
-
-TODO: {
-  local $TODO="To be debugged";
-
-  ok(%quotes);
-
-  # Check the nav values are defined.  These are the most
-  #  used and most reliable indicators of success.
-  ok($quotes{"OMIP220","last"} > 0);
-  ok(length($quotes{"OMIP220","name"}) > 0);
-  ok($quotes{"OMIP220","success"});
-  ok($quotes{"OMIP220", "currency"} eq "AUD");
-
-  my $year = (localtime())[5] + 1900;
-  my $lastyear = $year - 1;
-  ok((substr($quotes{"OMIP220","isodate"},0,4) == $year) ||
-       (substr($quotes{"OMIP220","isodate"},0,4) == $lastyear));
-  ok((substr($quotes{"OMIP220","date"},6,4) == $year) ||
-       (substr($quotes{"OMIP220","date"},6,4) == $lastyear));
-}
-
-# Check that a bogus stock returns no-success.
-ok(! $quotes{"BOGUS","success"});
@@ -1,40 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 9;
-
-# Test Morningstar functions.
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my @stocks = ("F0GBR069L2","BOGUS");
-
-my %quotes = $q->fetch("morningstar",@stocks);
-ok(%quotes);
-
-# Check the nav values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"F0GBR069L2","price"} > 0);
-ok(length($quotes{"F0GBR069L2","name"}) > 0);
-ok($quotes{"F0GBR069L2","success"});
-ok($quotes{"F0GBR069L2", "currency"} eq "USD");
-ok(substr($quotes{"F0GBR069L2","isodate"},0,4) == $year ||
-   substr($quotes{"F0GBR069L2","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"F0GBR069L2","date"},6,4) == $year ||
-   substr($quotes{"F0GBR069L2","date"},6,4) == $lastyear);
-
-# Make sure we don't have spurious % signs.
-
-ok($quotes{"F0GBR069L2","p_change"} !~ /%/);
-
-# Check that a bogus stock returns no-success.
-ok(! $quotes{"BOGUS","success"});
-
@@ -1,52 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use DateTime;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 9 * 2;
-
-# Find out today
-my $calcDay = DateTime->now();
-my $year  = $calcDay->year();
-my $month = $calcDay->month();
-my $day   = $calcDay->day();
-
-# Test Morningstar JP functions.
-
-my $q = Finance::Quote->new();
-my @funds = ( "2009100101", "2002013108" );
-
-my %info = $q->morningstarjp(@funds);
-ok(%info);
-
-# Check that the symbol/name, date, currency and nav defined for all of the funds.
-foreach my $fund (@funds)
-{
-
-  # NAV date should be within 10 days of today, but we will allow +- 1 day
-  # on top of that for running tests outside of Asia/Tokyo timezone
-  my $fndyear  = substr( $info{ $fund, "isodate" }, 0, 4 );
-  my $fndmonth = substr( $info{ $fund, "isodate" }, 5, 2 );
-  my $fndday   = substr( $info{ $fund, "isodate" }, 8, 2 );
-
-  my $fnd = DateTime->new(year=>$fndyear,month=>$fndmonth,day=>$fndday);
-  my $deltadays = $calcDay->subtract_datetime($fnd)->in_units('days');
-
-  cmp_ok( $deltadays,'<=', 11, 'not more than 11 days before today' );
-  cmp_ok( $deltadays,'>=', -1, 'not more than 1 day in the future' );
-
-  cmp_ok( $info{ $fund, 'currency' }, 'eq', 'JPY',           'currency' );
-  cmp_ok( $info{ $fund, 'method' },   'eq', 'MorningstarJP', 'method' );
-  cmp_ok( $info{ $fund, 'name' },     'eq', $fund,           'name' );
-  cmp_ok( $info{ $fund, "nav" },      '>',  0,               'nav' );
-  ok( $info{ $fund, "success" }, 'success' );
-  cmp_ok( $info{ $fund, 'symbol' }, 'eq', $fund, 'symbol' );
-}
-
-# Check that a bogus symbol returns no-success.
-ok( !$info{ "BOGUS", "success" } );
@@ -1,32 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 8;
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->mstaruk("GB0031835118","GB0030880032","GB0004842737","BOGUS");
-ok(%quotes);
-
-# Check the last values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"GB0031835118","last"} > 0);
-ok($quotes{"GB0031835118","success"});
-
-ok($quotes{"GB0030880032","last"} > 0);
-ok($quotes{"GB0030880032","success"});
-
-ok($quotes{"GB0004842737","last"} > 0);
-ok($quotes{"GB0004842737","success"});
-
-# Check that bogus stocks return failure:
-
-ok(! $quotes{"BOGUS","success"});
@@ -1,61 +0,0 @@
-#!/usr/bin/perl -w
-
-# Copyright (C) 2013, Sam Morris <sam@robots.org.uk>
-#
-# This program is free software; you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
-#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-# details.
-#
-# You should have received a copy of the GNU General Public License along with
-# this program.  If not, see <http://www.gnu.org/licenses/>.
-
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-my @methods = qw/mtgox bitcoin/;
-my @markets =
-    qw/USD EUR JPY CAD GBP CHF RUB AUD SEK DKK HKD PLN CNY SGD THB NZD NOK/;
-
-plan tests => 48;
-
-my $q = Finance::Quote->new;
-
-for my $method (@methods) {
-    for my $market (@markets) {
-        cmp_ok( sprintf( "%s_%s", $method, lc $market ), '~~', $q->sources );
-    }
-}
-
-SKIP: {
-    skip 'Set $ENV{ONLINE_TEST} to run these tests', 14
-        unless $ENV{ONLINE_TEST};
-
-    my %data = $q->fetch( "mtgox_eur", "BTC", "xyz", "thisisfartoolong" );
-    ok(%data);
-    is( $data{ "xyz", "success" },  0 );
-    is( $data{ "xyz", "errormsg" }, "HTTP failure" );
-
-    is( $data{ "thisisfartoolong", "success" },  0 );
-    is( $data{ "thisisfartoolong", "errormsg" }, "Symbol too long" );
-
-    is( $data{ "BTC", "success" }, 1 );
-    is( $data{ "BTC", "symbol" },  "BTC" );
-    like( $data{ "BTC", "last" }, '/^[\d]+\.?[\d]*$/' );
-    cmp_ok( $data{ "BTC", "bid" }, "<", $data{ "BTC", "ask" } );
-    like( $data{ "BTC", "date" }, '/^\d{1,2}\/\d{1,2}\/\d{1,2}$/' );
-    like( $data{ "BTC", "time" }, '/^\d{1,2}:\d{1,2}:\d{1,2}$/' );
-    is( $data{ "BTC", "method" },   "mtgox_eur" );
-    is( $data{ "BTC", "exchange" }, "Mt.Gox" );
-    is( $data{ "BTC", "timezone" }, "UTC" );
-}
@@ -1,37 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 8;
-
-# Test Yahoo_europe functions.
-
-my $q      = Finance::Quote->new();
-
-my %quotes = $q->nzx("TPW","BOGUS");
-ok(%quotes);
-
-# Check the nav values are defined.  These are the most
-#  used and most reliable indicators of success.
-TODO: {
-  local $TODO="To be debugged";
-  ok($quotes{"TPW","price"} > 0);
-  ok(length($quotes{"TPW","name"}) > 0);
-  ok($quotes{"TPW","success"});
-  ok($quotes{"TPW", "currency"} eq "NZD");
-
-  my $year = (localtime())[5] + 1900;
-  my $lastyear = $year - 1;
-  ok(substr($quotes{"TPW","isodate"},0,4) == $year ||
-       substr($quotes{"TPW","isodate"},0,4) == $lastyear);
-  ok(substr($quotes{"TPW","date"},6,4) == $year ||
-       substr($quotes{"TPW","date"},6,4) == $lastyear);
-}
-
-# Check that a bogus stock returns no-success.
-ok(! $quotes{"BOGUS","success"});
@@ -1,34 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 8;
-
-# Test Platinum functions.
-
-my $q      = Finance::Quote->new();
-
-my %quotes = $q->platinum("PLA0001AU","BOGUS");
-ok(%quotes);
-
-# Check the nav values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"PLA0001AU","last"} > 0);
-ok(length($quotes{"PLA0001AU","name"}) > 0);
-ok($quotes{"PLA0001AU","success"});
-ok($quotes{"PLA0001AU", "currency"} eq "AUD");
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-ok(substr($quotes{"PLA0001AU","isodate"},0,4) == $year ||
-   substr($quotes{"PLA0001AU","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"PLA0001AU","date"},6,4) == $year ||
-   substr($quotes{"PLA0001AU","date"},6,4) == $lastyear);
-
-# Check that a bogus stock returns no-success.
-ok(! $quotes{"BOGUS","success"});
@@ -1,53 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-plan tests => 28;
-
-my $q      = Finance::Quote->new();
-
-# test isoTime function
-ok($q->isoTime("11:39PM") eq "23:39") ;
-ok($q->isoTime("9:10 AM") eq "09:10") ;
-ok($q->isoTime("1.32") eq "01:32") ;
-ok($q->isoTime("1u32") eq "01:32") ;
-ok($q->isoTime("19h2") eq "19:02") ;
-ok($q->isoTime("10:62") eq "00:00" ) ;
-ok($q->isoTime("8:05am") eq "08:05" ) ;
-ok($q->isoTime("4:00pm") eq "16:00" ) ;
-ok($q->isoTime("0:59PM") eq "12:59" ) ;
-ok($q->isoTime("12:00pm") eq "12:00" ) ;
-ok($q->isoTime("12:10pm") eq "12:10" ) ; # yahoo might return 12:XXPM !
-
-
-# decimal_shiftup()
-
-is($q->decimal_shiftup('1',1),   '10');
-is($q->decimal_shiftup('1',2),   '100');
-
-is($q->decimal_shiftup('1.',1),   '10');
-is($q->decimal_shiftup('1.',2),   '100');
-
-is($q->decimal_shiftup('1.5',1), '15');
-is($q->decimal_shiftup('1.5',2), '150');
-is($q->decimal_shiftup('1.5',3), '1500');
-
-is($q->decimal_shiftup('56',1), '560');
-is($q->decimal_shiftup('56',2), '5600');
-
-is($q->decimal_shiftup('56.00',-1), '5.600'); # we want to keep precision
-is($q->decimal_shiftup('56.00',1), '560.0');
-
-is($q->decimal_shiftup('1.2345678901234',3),
-   '1234.5678901234');
-is($q->decimal_shiftup('0.12345678',1),
-   '1.2345678');
-is($q->decimal_shiftup('0.00001',1),
-   '0.0001');
-
-# _B_to_billions()
-
-is($q->B_to_billions('1B'),   '1000000000');
-is($q->B_to_billions('1.5B'), '1500000000');
-is($q->B_to_billions('1.23456789876B'), '1234567898.76');
@@ -1,14 +0,0 @@
-#!perl
-
-BEGIN {
-  unless ($ENV{RELEASE_TESTING}) {
-    require Test::More;
-    Test::More::plan(skip_all => 'these tests are for release candidate testing');
-  }
-}
-
-# This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests.
-use Test::More;
-use Test::Pod 1.41;
-
-all_pod_files_ok();
@@ -1,34 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 8;
-
-# Test Yahoo_europe functions.
-
-my $q      = Finance::Quote->new();
-
-my %quotes = $q->seb_funds("SEB Cancerfonden","BOGUS");
-ok(%quotes);
-
-# Check the nav values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"SEB Cancerfonden","price"} > 0);
-ok(length($quotes{"SEB Cancerfonden","name"}) > 0);
-ok($quotes{"SEB Cancerfonden","success"});
-ok($quotes{"SEB Cancerfonden", "currency"} eq "SEK");
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-ok(substr($quotes{"SEB Cancerfonden","isodate"},0,4) == $year ||
-   substr($quotes{"SEB Cancerfonden","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"SEB Cancerfonden","date"},6,4) == $year ||
-   substr($quotes{"SEB Cancerfonden","date"},6,4) == $lastyear);
-
-# Check that a bogus stock returns no-success.
-ok(! $quotes{"BOGUS","success"});
@@ -1,36 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if ( not $ENV{ONLINE_TEST} ) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 9;
-
-# Test SIXshares functions.
-
-my $q        = Finance::Quote->new();
-my $year     = ( localtime() )[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->sixfunds( 'CSSMI', 'BOGUS' );
-ok(%quotes);
-
-# Check the nav values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok( $quotes{ 'CSSMI', 'last' } > 0 );
-ok( length( $quotes{ 'CSSMI', 'name' } ) > 0 );
-ok( $quotes{ 'CSSMI', 'success' } );
-ok( $quotes{ 'CSSMI', 'currency' } eq 'CHF' );
-ok(    substr( $quotes{ 'CSSMI', 'isodate' }, 0, 4 ) == $year
-    || substr( $quotes{ 'CSSMI', 'isodate' }, 0, 4 ) == $lastyear );
-ok(    substr( $quotes{ 'CSSMI', 'date' }, 6, 4 ) == $year
-    || substr( $quotes{ 'CSSMI', 'date' }, 6, 4 ) == $lastyear );
-
-# Make sure we don't have spurious % signs.
-ok( $quotes{ 'CSSMI', 'p_change' } !~ /%/ );
-
-# Check that a bogus stock returns no-success.
-ok( !$quotes{ 'BOGUS', 'success' } );
@@ -1,36 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if ( not $ENV{ONLINE_TEST} ) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 9;
-
-# Test SIXshares functions.
-
-my $q        = Finance::Quote->new();
-my $year     = ( localtime() )[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->sixshares( 'NESN', 'BOGUS' );
-ok(%quotes);
-
-# Check the nav values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok( $quotes{ 'NESN', 'last' } > 0 );
-ok( length( $quotes{ 'NESN', 'name' } ) > 0 );
-ok( $quotes{ 'NESN', 'success' } );
-ok( $quotes{ 'NESN', 'currency' } eq 'CHF' );
-ok(    substr( $quotes{ 'NESN', 'isodate' }, 0, 4 ) == $year
-    || substr( $quotes{ 'NESN', 'isodate' }, 0, 4 ) == $lastyear );
-ok(    substr( $quotes{ 'NESN', 'date' }, 6, 4 ) == $year
-    || substr( $quotes{ 'NESN', 'date' }, 6, 4 ) == $lastyear );
-
-# Make sure we don't have spurious % signs.
-ok( $quotes{ 'NESN', 'p_change' } !~ /%/ );
-
-# Check that a bogus stock returns no-success.
-ok( !$quotes{ 'BOGUS', 'success' } );
@@ -1,41 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 20;
-
-# Test Stock House Canada functions.
-
-my $q      = Finance::Quote->new();
-my @stocks = ("CIB497", "TDB227", "FID342");
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->fetch("stockhousecanada_fund", @stocks);
-ok(%quotes);
-
-# Check that the name and nav are defined for all of the stocks.
-foreach my $stock (@stocks) {
-#  print "----------->PRICE: ".$quotes{$stock,"price"}."\n";
-	ok($quotes{$stock,"price"} > 0);
-#  print "----------->NAME: ".$quotes{$stock,"name"}."\n";
-	ok(length($quotes{$stock,"name"}));
-	ok($quotes{$stock,"success"});
-	ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
-	   substr($quotes{$stock,"isodate"},0,4) == $lastyear);
-	ok(substr($quotes{$stock,"date"},6,4) == $year ||
-	   substr($quotes{$stock,"date"},6,4) == $lastyear);
-}
-
-ok($quotes{"CIB497", "currency"} eq "CAD");
-ok($quotes{"TDB227", "currency"} eq "USD");
-ok($quotes{"FID342", "currency"} eq "USD");
-
-# Check that a bogus stock returns no-success.
-%quotes = $q->fetch("stockhousecanada_fund", "BOGUS");
-ok(! $quotes{"BOGUS","success"});
@@ -1,25 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 5;
-
-my $q = Finance::Quote->new;
-ok($q);
-
-my %quotes = $q->tdefunds("TD Canadian Index");
-
-ok(%quotes);
-ok($quotes{"TD Canadian Index", "nav"});
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-ok(substr($quotes{"TD Canadian Index","isodate"},0,4) == $year ||
-   substr($quotes{"TD Canadian Index","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"TD Canadian Index","date"},6,4) == $year ||
-   substr($quotes{"TD Canadian Index","date"},6,4) == $lastyear);
@@ -1,39 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 12;
-
-# Test TD Waterhouse functions.
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my @stocks = ("TD U.S. MidCap Growth US", "TD Canadian Bond Index");
-
-my %quotes = $q->tdwaterhouse(@stocks, "BOGUS");
-ok(%quotes);
-
-# Check the last values are defined.  These are the most
-#  used and most reliable indicators of success.
-foreach my $stock (@stocks) {
-    ok($quotes{$stock,"last"} > 0);
-    ok($quotes{$stock,"success"});
-    ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
-       substr($quotes{$stock,"isodate"},0,4) == $lastyear);
-    ok(substr($quotes{$stock,"date"},6,4) == $year ||
-       substr($quotes{$stock,"date"},6,4) == $lastyear);
-}
-
-ok($quotes{"TD U.S. MidCap Growth US", "currency"} eq "USD");
-ok($quotes{"TD Canadian Bond Index", "currency"} eq "CAD");
-
-# Check that bogus stocks return failure:
-
-ok(! $quotes{"BOGUS","success"});
@@ -1,61 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 27;
-
-# Test TIAA-CREF functions.
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->tiaacref("CREFmony","TIAAreal","TLSRX","TCMVX","TLGRX","BOGOname","CREFbond");
-ok(%quotes);
-
-ok($quotes{"CREFmony","nav"} > 0);
-ok($quotes{"CREFmony", "currency"} eq "USD");
-ok(length($quotes{"CREFmony","date"}) > 0);
-ok(substr($quotes{"CREFmony","isodate"},0,4) == $year ||
-   substr($quotes{"CREFmony","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"CREFmony","date"},6,4) == $year ||
-   substr($quotes{"CREFmony","date"},6,4) == $lastyear);
-
-ok($quotes{"TIAAreal","nav"} > 0);
-ok(length($quotes{"TIAAreal","date"}) > 0);
-ok(substr($quotes{"TIAAreal","isodate"},0,4) == $year ||
-   substr($quotes{"TIAAreal","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"TIAAreal","date"},6,4) == $year ||
-   substr($quotes{"TIAAreal","date"},6,4) == $lastyear);
-
-ok($quotes{"TLSRX","success"} > 0);
-ok($quotes{"TLSRX","nav"} > 0);
-ok(length($quotes{"TLSRX","date"}) > 0);
-ok(substr($quotes{"TLSRX","isodate"},0,4) == $year ||
-   substr($quotes{"TLSRX","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"TLSRX","date"},6,4) == $year ||
-   substr($quotes{"TLSRX","date"},6,4) == $lastyear);
-
-ok($quotes{"TCMVX","success"} > 0);
-ok($quotes{"TCMVX","nav"} > 0);
-ok(length($quotes{"TCMVX","date"}) > 0);
-ok(substr($quotes{"TCMVX","isodate"},0,4) == $year ||
-   substr($quotes{"TCMVX","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"TCMVX","date"},6,4) == $year ||
-   substr($quotes{"TCMVX","date"},6,4) == $lastyear);
-
-ok($quotes{"TLGRX","success"} > 0);
-
-ok($quotes{"BOGOname","success"} == 0);
-ok($quotes{"BOGOname","errormsg"} eq "Bad symbol");
-
-ok($quotes{"CREFbond","success"} > 0);
-ok($quotes{"CREFbond","nav"} > 0);
-ok($quotes{"CREFbond", "currency"} eq "USD");
-ok(substr($quotes{"CREFbond","date"},6,4) == $year ||
-   substr($quotes{"CREFbond","date"},6,4) == $lastyear);
@@ -1,32 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 8;
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->tnetuk("GB0031835118","GB0030880032","LU0116926998","BOGUS");
-ok(%quotes);
-
-# Check the last values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"GB0031835118","last"} > 0);
-ok($quotes{"GB0031835118","success"});
-
-ok($quotes{"GB0030880032","last"} > 0);
-ok($quotes{"GB0030880032","success"});
-
-ok($quotes{"LU0116926998","last"} > 0);
-ok($quotes{"LU0116926998","success"});
-
-# Check that bogus stocks return failure:
-
-ok(! $quotes{"BOGUS","success"});
@@ -1,43 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 13;
-
-# Test troweprice functions.
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->troweprice;
-ok(%quotes);
-
-# Check that nav and date are defined as our tests.
-ok($quotes{"PRFDX","nav"} > 0);
-ok($quotes{"PRFDX","success"});
-ok($quotes{"PRFDX","currency"} eq "USD");
-ok(length($quotes{"PRFDX","date"}) > 0);
-ok(substr($quotes{"PRFDX","isodate"},0,4) == $year ||
-   substr($quotes{"PRFDX","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"PRFDX","date"},6,4) == $year ||
-   substr($quotes{"PRFDX","date"},6,4) == $lastyear);
-
-
-ok($quotes{"PRIDX","success"});
-ok($quotes{"PRIDX","nav"} > 0);
-ok(length($quotes{"PRIDX","date"}) > 0);
-ok(substr($quotes{"PRIDX","isodate"},0,4) == $year ||
-   substr($quotes{"PRIDX","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"PRIDX","date"},6,4) == $year ||
-   substr($quotes{"PRIDX","date"},6,4) == $lastyear);
-
-# Check a bogus fund returns no-success
-
-%quotes = $q->troweprice("BOGUS");
-ok(! $quotes{"BOGUS","success"});
@@ -1,40 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 12;
-
-# Test trustnet functions.
-
-my $q = Finance::Quote->new();
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my @stocks = ("ABBEY NATIONAL INTERNATIONAL","MARLBOROUGH INTERNATIONAL EQUITY");
-
-my %quotes = $q->fetch("trustnet",@stocks);
-
-ok(%quotes);
-
-# For each of our stocks, check to make sure we got back some
-# useful information.
-
-foreach my $stock (@stocks) {
-  ok($quotes{$stock,"success"});
-  ok($quotes{$stock,"price"});
-  ok($quotes{$stock,"date"});
-  ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
-       substr($quotes{$stock,"isodate"},0,4) == $lastyear);
-  ok(substr($quotes{$stock,"date"},6,4) == $year ||
-       substr($quotes{$stock,"date"},6,4) == $lastyear);
-}
-
-# Test that a bogus stock gets no success.
-
-%quotes = $q->fetch("trustnet","BOGUS");
-ok(! $quotes{"BOGUS","success"});
@@ -1,56 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 22;
-
-# Test TSP functions.
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-my $quoter = Finance::Quote->new();
-
-my %quotes = $quoter->tsp("c","s","TSPgfund","BOGUS","l2040fund");
-ok(%quotes);
-
-# Check that some values are defined.
-ok($quotes{"c","success"});
-ok($quotes{"c","nav"} > 0);
-ok($quotes{"l2040fund","date"});
-ok(substr($quotes{"l2040fund","isodate"},0,4) == $year ||
-   substr($quotes{"l2040fund","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"l2040fund","date"},6,4) == $year ||
-   substr($quotes{"l2040fund","date"},6,4) == $lastyear);
-ok($quotes{"s","currency"});
-ok($quotes{"s","name"});
-ok($quotes{"TSPgfund","success"});
-ok($quotes{"TSPgfund","nav"} > 0);
-ok($quotes{"TSPgfund","date"});
-ok(substr($quotes{"TSPgfund","isodate"},0,4) == $year ||
-   substr($quotes{"TSPgfund","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"TSPgfund","date"},6,4) == $year ||
-   substr($quotes{"TSPgfund","date"},6,4) == $lastyear);
-
-# Check that some values are undefined.
-ok( !defined($quotes{"c","exchange"}) );
-
-# Check that a bogus fund returns no-success.
-ok( ! $quotes{"BOGUS","success"});
-
-# Exercise the fetch function 
-%quotes = $quoter->fetch("tsp","g","f","i","tsplincomefund");
-ok(%quotes);
-ok($quotes{"g","success"});
-ok($quotes{"f","nav"} > 0);
-ok($quotes{"i","date"});
-ok(substr($quotes{"i","isodate"},0,4) == $year ||
-   substr($quotes{"i","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"i","date"},6,4) == $year ||
-   substr($quotes{"i","date"},6,4) == $lastyear);
-ok($quotes{"tsplincomefund","nav"} > 0);
-
@@ -1,49 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Data::Dumper;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 26 ;
-
-# Test TSX functions.
-
-my $q      = Finance::Quote->new();
-my @stocks = ("NT", "BCE", "AER");
-
-my %regexps = (
-	NT  => qr/\bNortel\b/,
-	BCE => qr/\b(BCE|Bell)\b/,
-	AER => qr/\bAeroplan\b/,
-);
-
-
-my %quotes = $q->fetch("tsx", @stocks);
-ok(%quotes);
-
-foreach my $stock (@stocks) {
-
-	my $name = $quotes{$stock, "name"};
-	print "#Testing $stock: $name\n";
-
-	my $regexp = $regexps{$stock};
-	ok($name =~ /$regexp/i);
-
-	ok($quotes{$stock, "exchange"} eq 'T');
-	ok($quotes{$stock, "method"} eq 'tsx');
-
-	ok($quotes{$stock, "last"} > 0);
-	ok($quotes{$stock, "net"} =~ /^-?\d+\.\d+$/);
-	ok($quotes{$stock, "p_change"} =~ /^-?\d+\.\d+$/);
-	ok($quotes{$stock, "success"});
-	ok($quotes{$stock, "volume"} >= 0);
-}
-
-
-# Check that a bogus stock returns no-success.
-%quotes = $q->fetch("tsx", "BOGUS");
-ok(! $quotes{"BOGUS","success"});
@@ -1,32 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 8;
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->ukfunds("GB0031835118","GB0030880032","LU0116926998","BOGUS");
-ok(%quotes);
-
-# Check the last values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"GB0031835118","last"} > 0);
-ok($quotes{"GB0031835118","success"});
-
-ok($quotes{"GB0030880032","last"} > 0);
-ok($quotes{"GB0030880032","success"});
-
-ok($quotes{"LU0116926998","last"} > 0);
-ok($quotes{"LU0116926998","success"});
-
-# Check that bogus stocks return failure:
-
-ok(! $quotes{"BOGUS","success"});
@@ -1,35 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 7;
-
-# Test TD Waterhouse functions.
-
-my $q      = Finance::Quote->new();
-
-my %quotes = $q->unionfunds("975792","12345");
-ok(%quotes);
-
-# Check the last values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"975792","last"} > 0);
-ok($quotes{"975792","success"});
-ok($quotes{"975792", "currency"} eq "EUR");
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-ok(substr($quotes{"975792","isodate"},0,4) eq $year ||
-   substr($quotes{"975792","isodate"},0,4) eq $lastyear);
-ok(substr($quotes{"975792","date"},6,4) eq $year ||
-   substr($quotes{"975792","date"},6,4) eq $lastyear);
-
-
-# Check that bogus stocks return failure:
-
-ok(! $quotes{"12345","success"});
@@ -1,63 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 19;
-
-# Test usfedbonds functions.
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-my $q      = Finance::Quote->new("USFedBonds");
-
-#my %quotes = $q->usfedbonds("E197001.200606");
-my %quotes = $q->usfedbonds("E197001.200606","E194112.200610","E194101.200610","E194001.200610","BOGUS");
-ok(%quotes);
-
-TODO: {
-  local $TODO="To be debugged";
-
-  # Check that the last and date values are defined.
-  ok($quotes{"E197001.200606","success"});
-  ok($quotes{"E197001.200606","price"} > 0);
-  ok(length($quotes{"E197001.200606","date"}) > 0);
-  ok(substr($quotes{"E197001.200606","isodate"},0,4) eq $year ||
-       substr($quotes{"E197001.200606","isodate"},0,4) eq $lastyear);
-  ok(substr($quotes{"E197001.200606","date"},6,4) eq $year ||
-       substr($quotes{"E197001.200606","date"},6,4) eq $lastyear);
-  ok($quotes{"E197001.200606","currency"} eq "USD");
-
-  ok($quotes{"E194112.200610","success"});
-  ok($quotes{"E194112.200610","price"} > 0);
-  ok(length($quotes{"E194112.200610","date"}) > 0);
-  ok(substr($quotes{"E194112.200610","isodate"},0,4) eq $year ||
-       substr($quotes{"E194112.200610","isodate"},0,4) eq $lastyear);
-  ok(substr($quotes{"E194112.200610","date"},6,4) eq $year ||
-       substr($quotes{"E194112.200610","date"},6,4) eq $lastyear);
-  ok($quotes{"E194112.200610","currency"} eq "USD");
-}
-
-# Check that a non-existent price returns no-success.
-ok($quotes{"E194101.200610","success"} == 0);
-
-TODO: {
-  local $TODO="To be debugged";
-  ok($quotes{"E194101.200610","errormsg"} eq "No value found");
-}
-
-# Check that a non-existent price returns no-success.
-ok($quotes{"E194001.200610","success"} == 0);
-
-TODO: {
-  local $TODO="To be debugged";
-  ok($quotes{"E194001.200610","errormsg"} eq "Date not found");
-}
-
-# Check that a bogus fund returns no-success.
-ok($quotes{"BOGUS","success"} == 0);
-ok($quotes{"BOGUS","errormsg"} eq "Parse error");
@@ -1,36 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 26;
-
-# Test Vanguard functions.
-
-my $q      = Finance::Quote->new();
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-my @funds = qw/VBINX VIVAX VWINX VFIIX/;
-
-my %quotes = $q->vanguard(@funds);
-ok(%quotes);
-
-# Check that the name and last are defined for all of the funds.
-foreach my $fund (@funds) {
-	ok($quotes{$fund,"last"} > 0);
-	ok(length($quotes{$fund,"name"}));
-	ok($quotes{$fund,"success"});
-        ok($quotes{$fund, "currency"} eq "USD");
-	ok(substr($quotes{$fund,"isodate"},0,4) == $year ||
-	   substr($quotes{$fund,"isodate"},0,4) == $lastyear);
-	ok(substr($quotes{$fund,"date"},6,4) == $year ||
-	   substr($quotes{$fund,"date"},6,4) == $lastyear);
-}
-
-# Make sure we're not getting spurious percentage signs.
-
-ok($quotes{"VBINX","p_change"} !~ /%/);
@@ -1,53 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 1 + 3 * 6 + 2;
-
-# Test vwd functions.
-
-my $year = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-my $q      = Finance::Quote->new("VWD");
-
-my %quotes = $q->vwd("847402","LU0309191491","971675","BOGUS");
-ok(%quotes);
-
-# Check that the last and date values are defined.
-ok($quotes{"847402","success"});
-ok($quotes{"847402","last"} > 0);
-ok(length($quotes{"847402","date"}) > 0);
-ok(substr($quotes{"847402","isodate"},0,4) == $year ||
-   substr($quotes{"847402","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"847402","date"},6,4) == $year ||
-   substr($quotes{"847402","date"},6,4) == $lastyear);
-ok($quotes{"847402","currency"} eq "EUR");
-
-# Check that the last and date values are defined.
-ok($quotes{"LU0309191491","success"});
-ok($quotes{"LU0309191491","last"} > 0);
-ok(length($quotes{"LU0309191491","date"}) > 0);
-ok(substr($quotes{"LU0309191491","isodate"},0,4) == $year ||
-   substr($quotes{"LU0309191491","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"LU0309191491","date"},6,4) == $year ||
-   substr($quotes{"LU0309191491","date"},6,4) == $lastyear);
-ok($quotes{"LU0309191491","currency"} eq "EUR");
-
-# Check that the last and date values are defined. stock 971675
-ok($quotes{"971675","success"});
-ok($quotes{"971675","last"} > 0);
-ok(length($quotes{"971675","date"}) > 0);
-ok(substr($quotes{"971675","isodate"},0,4) == $year ||
-   substr($quotes{"971675","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"971675","date"},6,4) == $year ||
-   substr($quotes{"971675","date"},6,4) == $lastyear);
-ok($quotes{"971675","currency"} eq "DKK","Currency for 971675 (".$quotes{"971675","currency"}.") = DKK");
-
-# Check that a bogus fund returns no-success.
-ok($quotes{"BOGUS","success"} == 0);
-ok($quotes{"BOGUS","errormsg"} eq "Parse error"); # invalid symbols not detected anymore
@@ -1,42 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 11;
-
-# Test Yahoo functions.
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->yahoo("IBM","CSCO","BOGUS");
-ok(%quotes);
-
-# Check the last values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"IBM","last"} > 0);
-ok($quotes{"IBM","success"});
-ok($quotes{"IBM", "currency"} eq "USD");
-ok(($quotes{"IBM", "currency"} eq "USD") &&
-   !defined($quotes{"IBM","currency_set_by_fq"}));
-ok(substr($quotes{"IBM","isodate"},0,4) == $year ||
-   substr($quotes{"IBM","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"IBM","date"},6,4) == $year ||
-   substr($quotes{"IBM","date"},6,4) == $lastyear);
-
-ok($quotes{"CSCO","last"} > 0);
-ok($quotes{"CSCO","success"});
-
-# Make sure there are no spurious % signs.
-
-ok($quotes{"CSCO","p_change"} !~ /%/);
-
-# Check that bogus stocks return failure:
-
-ok(! $quotes{"BOGUS","success"});
@@ -1,37 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 9;
-
-# Test Yahoo_europe functions.
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->asia("C76.SI","BOGUS.SI");
-ok(%quotes);
-
-# Check the nav values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"C76.SI","last"} > 0);
-ok(length($quotes{"C76.SI","name"}) > 0);
-ok($quotes{"C76.SI","success"});
-ok($quotes{"C76.SI", "currency"} eq "SGD");
-ok(substr($quotes{"C76.SI","isodate"},0,4) == $year ||
-   substr($quotes{"C76.SI","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"C76.SI","date"},6,4) == $year ||
-   substr($quotes{"C76.SI","date"},6,4) == $lastyear);
-
-# Make sure we don't have spurious % signs.
-
-ok($quotes{"C76.SI","p_change"} !~ /%/);
-
-# Check that a bogus stock returns no-success.
-ok(! $quotes{"BOGUS.SI","success"});
@@ -1,46 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 13;
-
-# Test Yahoo_europe functions.
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->yahoo_australia("BHP","BOGUS");
-ok(%quotes);
-
-# Check the nav values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"BHP","last"} > 0);
-ok(length($quotes{"BHP","name"}) > 0);
-ok($quotes{"BHP","success"});
-ok($quotes{"BHP", "currency"} eq "AUD");
-ok(substr($quotes{"BHP","isodate"},0,4) == $year ||
-   substr($quotes{"BHP","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"BHP","date"},6,4) == $year ||
-   substr($quotes{"BHP","date"},6,4) == $lastyear);
-
-# Make sure we don't have spurious % signs.
-
-ok($quotes{"BHP","p_change"} !~ /%/);
-
-TODO: {
-    local $TODO = "Get quotes when '.AX' suffix is added";
-    my %suffix_quotes = $q->yahoo_australia("BHP.AX");
-    ok(%suffix_quotes);
-    ok($suffix_quotes{"BHP.AX","last"} == $quotes{"BHP","last"});
-    ok($suffix_quotes{"BHP.AX","name"} eq $quotes{"BHP","name"});
-    ok($suffix_quotes{"BHP.AX","success"});
-}
-
-# Check that a bogus stock returns no-success.
-ok(! $quotes{"BOGUS","success"});
@@ -1,40 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 23;
-
-# Test Yahoo_europe functions.
-
-my $q      = Finance::Quote->new();
-my @stocks = ("PDGR3","PETR4","BAZA3");
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->fetch("yahoo_brasil", @stocks);
-ok(%quotes);
-
-# Check the nav values are defined.  These are the most
-#  used and most reliable indicators of success.
-foreach my $stock (@stocks) {
-    ok($quotes{$stock,"success"});
-    ok($quotes{$stock,"last"} > 0);
-    ok(length($quotes{$stock,"name"}) > 0);
-    ok($quotes{$stock, "currency"} eq "BRL");
-    ok((substr($quotes{$stock,"isodate"},0,4) == $year) ||
-       (substr($quotes{$stock,"isodate"},0,4) == $lastyear));
-    ok((substr($quotes{$stock,"date"},6,4) == $year) ||
-       (substr($quotes{$stock,"date"},6,4) == $lastyear));
-
-    # Make sure we don't have spurious % signs.
-    ok($quotes{$stock,"p_change"} !~ /%/);
-}
-
-# Check that a bogus stock returns no-success.
-%quotes = $q->yahoo_brasil("BOGUS");
-ok(! $quotes{"BOGUS","success"});
@@ -1,105 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 34;
-
-# Test Yahoo_europe functions.
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->yahoo_europe("UG.PA","BOGUS.L");
-ok(%quotes);
-
-# Check the nav values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"UG.PA","last"} > 0);
-ok(length($quotes{"UG.PA","name"}) > 0);
-ok($quotes{"UG.PA","success"});
-ok($quotes{"UG.PA", "currency"} eq "EUR");
-ok(substr($quotes{"UG.PA","isodate"},0,4) == $year ||
-   substr($quotes{"UG.PA","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"UG.PA","date"},6,4) == $year ||
-   substr($quotes{"UG.PA","date"},6,4) == $lastyear);
-
-# Make sure we don't have spurious % signs.
-
-ok($quotes{"UG.PA","p_change"} !~ /%/);
-
-# Check that a bogus stock returns no-success.
-ok(! $quotes{"BOGUS","success"});
-
-# London stocks can be returned in a variety of currencies
-
-my %londonquotes = $q->fetch("yahoo_europe","RDSB.L");
-ok($londonquotes{"RDSB.L","success"});
-ok($londonquotes{"RDSB.L","currency"} eq "GBP");
-ok(($londonquotes{"RDSB.L","currency"} eq "GBP") &&
-   !defined($londonquotes{"RDSB.L","currency_set_by_fq"}));
-
-%londonquotes = $q->fetch("yahoo_europe","CCR.L");
-ok($londonquotes{"CCR.L","success"});
-ok($londonquotes{"CCR.L","currency"} eq "EUR");
-ok(($londonquotes{"CCR.L","currency"} eq "EUR") &&
-   !defined($londonquotes{"CCR.L","currency_set_by_fq"}));
-
-# Copenhangen stocks should be returned in Danisk Krone (DKK).
-
-my %copenhagenquotes = $q->fetch("yahoo_europe","TDC.CO");
-ok($copenhagenquotes{"TDC.CO","success"});
-ok($copenhagenquotes{"TDC.CO","currency"} eq "DKK");
-ok(($copenhagenquotes{"TDC.CO","currency"} eq "DKK") &&
-   !defined($copenhagenquotes{"TDC.CO","currency_set_by_fq"}));
-
-# Two stocks from the German XETRA.  One in EUR and one in USD.
-
-my %xetraquotes = $q->fetch("yahoo_europe","DBK.DE", "ERM.DE");
-ok($xetraquotes{"DBK.DE","success"});
-ok($xetraquotes{"DBK.DE","currency"} eq "EUR");
-ok(($xetraquotes{"DBK.DE","currency"} eq "EUR") &&
-   !defined($xetraquotes{"DBK.DE","currency_set_by_fq"}));
-
-# a stock from the Belgium Euronext market.
-
-my %belgiumquotes = $q->fetch("yahoo_europe","SOLB.BR");
-ok($belgiumquotes{"SOLB.BR","success"});
-ok($belgiumquotes{"SOLB.BR","currency"} eq "EUR");
-ok(($belgiumquotes{"SOLB.BR","currency"} eq "EUR") &&
-   !defined($belgiumquotes{"SOLB.BR","currency_set_by_fq"}));
-ok($belgiumquotes{"SOLB.BR","last"}>=50); # this expected trades around 60-200 EUR
-ok($belgiumquotes{"SOLB.BR","last"}<=200);
-
-# Check if close is between year_range for LTI.L (expressed in GBp) for checking if conversion is correct
-my %ltiquotes = $q->fetch("yahoo_europe","LTI.L");
-ok($ltiquotes{"LTI.L","success"});
-my ($min,$max) = (50,50000); # change this if quotes are not supposed to be in this range anymore
-if ($ltiquotes{"LTI.L","year_range"}=~ m/([\d\.]+)\s*-\s*([\d\.]+)/) {
-  my ($year_low,$year_high) = ($1,$2) ;
-  ok (($year_low >= $min) && ($year_high <= $max));
-  # print "$year_low - $year_high\n";
-}
-ok (($ltiquotes{"LTI.L","close"} >= $min) && ($ltiquotes{"LTI.L","close"} <= $max));
-
-# check that A0GFY7.SG returns correctly the currency (reported by GnuCash user)
-%xetraquotes = $q->fetch("yahoo_europe","A0GFY7.SG");
-ok($xetraquotes{"A0GFY7.SG","success"});
-ok($xetraquotes{"A0GFY7.SG","currency"} eq "EUR");
-ok(($xetraquotes{"A0GFY7.SG","currency"} eq "EUR") &&
-   !defined($xetraquotes{"A0GFY7.SG","currency_set_by_fq"}));
-
-TODO: {
-    # Yahoo does not provide retrieval of ^DJI.US quotes since it lost
-    # license for it. ^DJI can only be viewed on the html page anymore. We
-    # need to write a HTML page scraper for this case
-    local $TODO = "^DJI not returned by yahoo anymore.";
-    %xetraquotes = $q->fetch("yahoo_europe","%40%5EDJI.US");
-    ok($xetraquotes{"^DJI","success"});
-    ok($xetraquotes{"^DJI","currency"} eq "USD");
-}
@@ -1,37 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 9;
-
-# Test Yahoo_nz functions.
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->yahoo_nz("AIA","BOGUS");
-ok(%quotes);
-
-# Check the nav values are defined.  These are the most
-#  used and most reliable indicators of success.
-ok($quotes{"AIA","last"} > 0);
-ok(length($quotes{"AIA","name"}) > 0);
-ok($quotes{"AIA","success"});
-ok($quotes{"AIA", "currency"} eq "NZD");
-ok(substr($quotes{"AIA","isodate"},0,4) == $year ||
-   substr($quotes{"AIA","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"AIA","date"},6,4) == $year ||
-   substr($quotes{"AIA","date"},6,4) == $lastyear);
-
-# Make sure we don't have spurious % signs.
-
-ok($quotes{"AIA","p_change"} !~ /%/);
-
-# Check that a bogus stock returns no-success.
-ok(! $quotes{"BOGUS","success"});
@@ -1,62 +0,0 @@
-#!/usr/bin/perl -w
-
-# A test script to check for working of the YahooJSON module.
-
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 43;
-
-my $q = Finance::Quote->new();
-
-#List of stocks to fetch. Feel free to change this during testing
-my @stocks =
-    ( "SUZLON.BO", "RECLTD.NS", "AMZN", "SOLB.BR", "^DJI", "BEL20.BR" );
-
-my %quotes = $q->fetch( "yahoo_json", @stocks );
-ok( %quotes, "Data returned" );
-
-foreach my $stock (@stocks) {
-
-    my $name = $quotes{ $stock, "name" };
-    ok( $quotes{ $stock, "success" }, "Retrieved $stock" );
-    if ( !$quotes{ $stock, "success" } ) {
-        my $errmsg = $quotes{ $stock, "errormsg" };
-        warn "Error Message:\n$errmsg\n";
-    }
-    else {
-        ok( $name, "Name is defined : $name" );
-        my $exchange = $quotes{ $stock, "exchange" };
-        ok( $exchange eq 'Sourced from Yahoo Finance (as JSON)',
-            "correctly retrieved through YahooJSON" );
-
-        my $fetch_method = $quotes{ $stock, "method" };
-        ok( $fetch_method eq 'yahoo_json', "fetch_method is yahoo_json" );
-
-        my $last = $quotes{ $stock, "last" };
-        ok( $last > 0, "Last $last > 0" );
-
-        my $volume = $quotes{ $stock, "volume" };
-        ok( $volume > 0, "Volume $volume > 0" ) if ( $stock ne "BEL20.BR" );
-
-        my $type = $quotes{ $stock, "type" };
-        ok( $type, "Symbol type $type" );
-
-        #TODO: Add a test to raise a warning if the quote is excessively old
-        my $isodate = $quotes{ $stock, "isodate" };
-
-        # print "ISOdate: $isodate ";
-        my $date = $quotes{ $stock, "date" };
-
-        # print "Date: $date ";
-    }
-}
-
-# Check that a bogus stock returns no-success.
-%quotes = $q->fetch( "yahoo_json", "BOGUS" );
-ok( !$quotes{ "BOGUS", "success" }, "BOGUS failed" );
@@ -1,44 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 17;
-
-# Test za functions.
-
-my $q      = Finance::Quote->new("ZA");
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->za("AGL","AMS","BOGUS");
-ok(%quotes);
-
-# Check that the last and date values are defined.
-ok($quotes{"AGL","success"});
-ok($quotes{"AGL","last"} > 0);
-ok($quotes{"AGL","high"} > 0);
-ok($quotes{"AGL","low"} > 0);
-ok(length($quotes{"AGL","date"}) > 0);
-ok(substr($quotes{"AGL","isodate"},0,4) == $year ||
-   substr($quotes{"AGL","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"AGL","date"},6,4) == $year ||
-   substr($quotes{"AGL","date"},6,4) == $lastyear);
-ok($quotes{"AGL","currency"} eq "ZAR");
-
-ok($quotes{"AMS","success"});
-ok($quotes{"AMS","last"} > 0);
-ok(length($quotes{"AMS","date"}) > 0);
-ok(substr($quotes{"AMS","isodate"},0,4) == $year ||
-   substr($quotes{"AMS","isodate"},0,4) == $lastyear);
-ok(substr($quotes{"AMS","date"},6,4) == $year ||
-   substr($quotes{"AMS","date"},6,4) == $lastyear);
-ok($quotes{"AMS","currency"} eq "ZAR");
-
-# Check that a bogus fund returns no-success.
-ok($quotes{"BOGUS","success"} == 0);
-ok($quotes{"BOGUS","errormsg"} eq "Parse error");
@@ -1,43 +0,0 @@
-#!/usr/bin/perl -w
-use strict;
-use Test::More;
-use Finance::Quote;
-
-if (not $ENV{ONLINE_TEST}) {
-    plan skip_all => 'Set $ENV{ONLINE_TEST} to run this test';
-}
-
-plan tests => 10;
-
-# Test za_unittrusts functions.
-
-my $q      = Finance::Quote->new();
-my $year   = (localtime())[5] + 1900;
-my $lastyear = $year - 1;
-
-my %quotes = $q->za_unittrusts("15740");
-ok(%quotes);
-
-# Check the last values are defined.  These are the most used and most
-# reliable indicators of success.
-ok($quotes{"15740","last"} > 0);
-ok($quotes{"15740","success"});
-ok(substr($quotes{"15740","date"},6,4) == $year ||
-   substr($quotes{"15740","date"},6,4) == $lastyear);
-
-# Exercise the fetch function a little.
-%quotes = $q->fetch("za_unittrusts","15740");
-ok(%quotes);
-ok($quotes{"15740","last"} > 0);
-ok($quotes{"15740","success"} > 0);
-
-# Check that we're getting currency information.
-ok($quotes{"15740", "currency"} eq "ZAR");
-
-# Check we're not getting bogus percentage signs.
-$quotes{"15740","p_change"} ||= "";	# Avoid warning if undefined.
-ok($quotes{"15740","p_change"} !~ /%/);
-
-# Check that looking up a bogus stock returns failure:
-%quotes = $q->za_unittrusts("BOGUS");
-ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,89 @@
+#!/usr/bin/perl -w
+
+# Test to see if Finance::Quote can at least be loaded and used.
+# This file gets a capital name so it will be run before any other
+# test.
+
+use strict;
+use Test;
+BEGIN {plan tests => 19};
+
+use Finance::Quote;
+ok(1);			# Yup.  It loaded okay.  Good.  :)
+
+my $quote = Finance::Quote->new();
+
+ok($quote);	# Did we get an object okay?
+
+
+# Get Today's date
+my ($month, $day, $year2) = (localtime())[4,3,5];
+$month++;
+my $year4 += $year2 + 1900;	# 2007
+my $year4m += $year2 + 1900 - 1;# 2006
+$year2 -= 100;			# 05
+my $isotoday = sprintf("%04d-%02d-%02d", $year4, $month, $day);
+my $ustoday  = sprintf("%02d/%02d/%04d", $month, $day, $year4);
+
+# Test date functions
+my %info;
+$quote->store_date(\%info, "test", {today => 1});
+ok($info{"test","isodate"} eq $isotoday);
+ok($info{"test","date"} eq $ustoday);
+
+# Test various permutions of an ISO Date as input
+%info = ();
+$quote->store_date(\%info, "test", {isodate => "2004-12-31"});
+ok($info{"test","date"} eq "12/31/2004");
+%info = ();
+$quote->store_date(\%info, "test", {isodate => "2004 Dec 31"});
+ok($info{"test","date"} eq "12/31/2004");
+%info = ();
+$quote->store_date(\%info, "test", {isodate => "2004 December 31"});
+ok($info{"test","date"} eq "12/31/2004");
+
+# Test various permutions of an US Date as input
+%info = ();
+$quote->store_date(\%info, "test", {usdate => "12/31/2004"});
+ok($info{"test","isodate"} eq "2004-12-31");
+%info = ();
+$quote->store_date(\%info, "test", {usdate => "Dec 31, 2004"});
+ok($info{"test","isodate"} eq "2004-12-31");
+%info = ();
+$quote->store_date(\%info, "test", {usdate => "December 31 2004"});
+ok($info{"test","isodate"} eq "2004-12-31");
+
+# Test various permutions of an European Date as input
+%info = ();
+$quote->store_date(\%info, "test", {eurodate => "31/12/2004"});
+ok($info{"test","isodate"} eq "2004-12-31");
+%info = ();
+$quote->store_date(\%info, "test", {eurodate => "31 December 2004"});
+ok($info{"test","isodate"} eq "2004-12-31");
+%info = ();
+$quote->store_date(\%info, "test", {eurodate => "31 Dec, 2004"});
+ok($info{"test","isodate"} eq "2004-12-31");
+
+# Try some other permutions.  A recent change to the date handling
+# code changes the behavior if a year is not explicitly provided.  Now
+# it will look at the month and decide if the date is in the current
+# year or is from the previous year.  This code still has to handle
+# being executed on 12/31, thus the dual tests for each date.
+%info = ();
+$quote->store_date(\%info, "test", {day=>"31", month=>"12"});
+ok($info{"test","date"} eq "12/31/$year4" ||
+   $info{"test","date"} eq "12/31/$year4m");
+ok($info{"test","isodate"} eq "$year4-12-31" ||
+   $info{"test","isodate"} eq "$year4m-12-31");
+%info = ();
+$quote->store_date(\%info, "test", {day=>"31", month=>"December"});
+ok($info{"test","date"} eq "12/31/$year4" ||
+   $info{"test","date"} eq "12/31/$year4m");
+ok($info{"test","isodate"} eq "$year4-12-31" ||
+   $info{"test","isodate"} eq "$year4m-12-31");
+%info = ();
+$quote->store_date(\%info, "test", {day=>"31", month=>"December", year => $year2});
+ok($info{"test","date"} eq "12/31/$year4" ||
+   $info{"test","date"} eq "12/31/$year4m");
+ok($info{"test","isodate"} eq "$year4-12-31" ||
+   $info{"test","isodate"} eq "$year4m-12-31");
@@ -0,0 +1,61 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 23};
+
+use Finance::Quote;
+
+# Test AEX functions.
+
+my $quoter = Finance::Quote->new();
+
+my %quotes = $quoter->aex("AAB A NEDERLANDCRT");
+ok(%quotes);
+
+# Check that some values are defined.
+ok($quotes{"AAB A NEDERLANDCRT","success"});
+ok($quotes{"AAB A NEDERLANDCRT","last"} > 0);
+ok($quotes{"AAB A NEDERLANDCRT","date"});
+ok($quotes{"AAB A NEDERLANDCRT","volume"} > 0);
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+ok(substr($quotes{"AAB A NEDERLANDCRT","isodate"},0,4) == $year ||
+   substr($quotes{"AAB A NEDERLANDCRT","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"AAB A NEDERLANDCRT","date"},6,4) == $year ||
+   substr($quotes{"AAB A NEDERLANDCRT","date"},6,4) == $lastyear);
+
+# Exercise the fetch function 
+%quotes = $quoter->fetch("aex","AAB AEX Click Perp.");
+ok(%quotes);
+ok($quotes{"AAB AEX Click Perp.","success"});
+ok($quotes{"AAB AEX Click Perp.","last"} > 0);
+
+# Test options fetching
+# the following tests will fail after Dec 2009:-(
+%quotes = $quoter->fetch("aex_options", "aex c dec 2009 400.00", "phi");
+ok(%quotes);
+
+ok($quotes{"aex c dec 2009 400.00","success"});
+ok($quotes{"aex c dec 2009 400.00","close"} > 0);
+#ok($quotes{"aex c dec 2009 400.00","bid"});	# May or may not exist
+#ok($quotes{"aex c dec 2009 400.00","ask"});	# May or may not exist
+
+ok($quotes{"phi","success"});
+ok($quotes{"phi","options"});
+ok($quotes{ $quotes{"phi","options"}->[0],"close"});
+ok($quotes{ $quotes{"phi","options"}->[0],"date"});
+
+# Test futures fetching
+%quotes = $quoter->fetch("aex_futures", "fti");
+ok(%quotes);
+
+# Check that some values are defined.
+ok($quotes{"fti","success"});
+ok($quotes{"fti","futures"});
+ok($quotes{ $quotes{"fti","futures"}->[0],"last"} > 0);
+ok($quotes{ $quotes{"fti","futures"}->[0],"date"});
+
+# Check that a bogus fund returns no-success.
+%quotes = $quoter->aex("BOGUS");
+ok( ! $quotes{"BOGUS","success"});
@@ -0,0 +1,39 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 30};
+
+use Finance::Quote;
+
+# Test Aia functions.
+
+my $q      = Finance::Quote->new();
+
+# my stocks = stock, fund, warrant, bond, indice
+my @stocks = ("ABD-AUS.EQ", "AIG-EUSC.U", "FID-JP.ADV", "SCH-HKEQ");
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->fetch("aiahk", @stocks);
+ok(%quotes);
+
+# Check that the name, last, currency and date are defined for all of the stocks.
+foreach my $stock (@stocks) {
+	ok($quotes{$stock,"success"});
+	ok($quotes{$stock,"bid"} > 0);
+	ok($quotes{$stock,"offer"} > 0);
+	ok(length($quotes{$stock,"name"}));
+	ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
+	   substr($quotes{$stock,"isodate"},0,4) == $lastyear);
+	ok(substr($quotes{$stock,"date"},6,4) == $year ||
+	   substr($quotes{$stock,"date"},6,4) == $lastyear);
+}
+ok($quotes{"ABD-AUS.EQ", "currency"} eq "AUD");
+ok($quotes{"AIG-EUSC.U", "currency"} eq "EUR");
+ok($quotes{"FID-JP.ADV", "currency"} eq "JPY");
+ok($quotes{"SCH-HKEQ", "currency"}   eq "HKD");
+
+# Check that a bogus stock returns no-success.
+%quotes = $q->fetch("aiahk", "BOGUS");
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,44 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 13};
+
+use Finance::Quote;
+
+# Test ASEGR functions.
+
+my $q      = Finance::Quote->new();
+my $year   = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->asegr("ALPHA","ELTON");
+ok(%quotes);
+
+# Check the last values are defined.  These are the most used and most
+# reliable indicators of success.
+ok($quotes{"ALPHA","last"} > 0);
+ok($quotes{"ALPHA","success"});
+ok(substr($quotes{"ALPHA","date"},6,4) == $year ||
+   substr($quotes{"ALPHA","date"},6,4) == $lastyear);
+ok($quotes{"ELTON","success"});
+ok($quotes{"ELTON","last"} > 0);
+ok(substr($quotes{"ELTON","date"},6,4) == $year ||
+   substr($quotes{"ELTON","date"},6,4) == $lastyear);
+
+# Exercise the fetch function a little.
+%quotes = $q->fetch("asegr","IKONA");
+ok(%quotes);
+ok($quotes{"IKONA","last"} > 0);
+ok($quotes{"IKONA","success"} > 0);
+
+# Check that we're getting currency information.
+ok($quotes{"IKONA", "currency"} eq "EUR");
+
+# Check we're not getting bogus percentage signs.
+$quotes{"IKONA","p_change"} ||= "";	# Avoid warning if undefined.
+ok($quotes{"IKONA","p_change"} !~ /%/);
+
+# Check that looking up a bogus stock returns failure:
+%quotes = $q->asegr("BOGUS");
+ok(! $quotes{"BOGUS","success"});
+
@@ -0,0 +1,40 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 11};
+
+use Finance::Quote;
+
+# Test ASX functions.
+
+my $q      = Finance::Quote->new();
+
+$q->timeout(120);	# ASX is broken regularly, so timeouts are good.
+
+my %quotes = $q->asx("CGJ","BHP");
+ok(%quotes);
+
+# Check the last values are defined.  These are the most used and most
+# reliable indicators of success.
+ok($quotes{"CGJ","last"} > 0);
+ok($quotes{"CGJ","success"});
+ok($quotes{"BHP","last"} > 0);
+ok($quotes{"BHP","success"});
+
+# Exercise the fetch function a little.
+%quotes = $q->fetch("asx","ITE");
+ok(%quotes);
+ok($quotes{"ITE","last"} > 0);
+ok($quotes{"ITE","success"} > 0);
+
+# Check that we're getting currency information.
+ok($quotes{"ITE", "currency"} eq "AUD");
+
+# Check we're not getting bogus percentage signs.
+$quotes{"ITE","p_change"} ||= "";	# Avoid warning if undefined.
+ok($quotes{"ITE","p_change"} !~ /%/);
+
+# Check that looking up a bogus stock returns failure:
+%quotes = $q->asx("BOG");
+ok(! $quotes{"BOG","success"});
+
@@ -0,0 +1,48 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 23};
+
+use Finance::Quote;
+
+# Test bmonesbittburns functions.
+
+my $q      = Finance::Quote->new();
+my $year   = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my @stocks = ("NT,T", "BBD.A,T","MFC598,MF");
+my %quotes = $q->bmonesbittburns(@stocks);
+ok(%quotes);
+
+# Check that last and date are defined as our tests.
+foreach my $stock (@stocks) {
+    ok($quotes{$stock,"last"} > 0);
+    ok($quotes{$stock,"success"});
+    ok($quotes{$stock,"currency"} eq "CAD");
+    ok(length($quotes{$stock,"date"}) > 0);
+    ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
+       substr($quotes{$stock,"isodate"},0,4) == $lastyear);
+    ok(substr($quotes{$stock,"date"},6,4) == $year ||
+       substr($quotes{$stock,"date"},6,4) == $lastyear);
+}
+
+# Exercise the fetch function
+%quotes = $q->fetch("bmonesbittburns", "NT,X");
+ok(%quotes);
+ok($quotes{"NT,X","success"});
+ok($quotes{"NT,X","last"} > 0);
+
+# Check that a bogus fund returns no-success.
+%quotes = $q->bmonesbittburns("BOGUS");
+ok( ! $quotes{"BOGUS","success"});
+
+# Fetching an empty stock does result in an error, and yes
+# this is bad.  But fetching an empty stock isn't normal
+# behaviour.
+
+# %quotes = $q->fetch("bmonesbittburns", "");
+# ok( %quotes);
+# ok( ! $quotes{"NT,X","success"});
+# ok( ! $quotes{"NT,X","last"} > 0);
+
@@ -0,0 +1,45 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 32};
+
+use Finance::Quote;
+
+# Test Bourso functions.
+
+my $q      = Finance::Quote->new();
+
+# my stocks = stock, fund, warrant, bond, indice
+my @stocks = ("AF","FR0000441677","FR0010324475","FR0010112052","FR0003500008");
+
+# Bourso tests need to cover all the possible cases:
+#
+#    Name		What		Test Case
+#
+#    cours-action	Stock		AF
+#    cours-obligation	Bond		FR0010112052
+#    opcvm/opcvm	Fund		FR0000441677
+#    cours-warrant	Warrant		FR0010324475
+#    cours-indice	Index		FR0003500008
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->fetch("bourso", @stocks);
+ok(%quotes);
+
+# Check that the name, last, currency and date are defined for all of the stocks.
+foreach my $stock (@stocks) {
+	ok($quotes{$stock,"last"} > 0);
+	ok(length($quotes{$stock,"name"}));
+	ok($quotes{$stock,"success"});
+        ok($quotes{$stock, "currency"} eq "EUR");
+	ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
+	   substr($quotes{$stock,"isodate"},0,4) == $lastyear);
+	ok(substr($quotes{$stock,"date"},6,4) == $year ||
+	   substr($quotes{$stock,"date"},6,4) == $lastyear);
+}
+
+# Check that a bogus stock returns no-success.
+%quotes = $q->fetch("bourso", "BOGUS");
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,31 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 8};
+
+use Finance::Quote;
+
+# Test Canadian Fund Library functions.
+
+my $q      = Finance::Quote->new();
+
+my %quotes = $q->fundlibrary("19001","00000");
+ok(%quotes);
+
+# Check the last values are defined.  These are the most
+#  used and most reliable indicators of success.
+ok($quotes{"19001","last"} > 0);
+ok($quotes{"19001","success"});
+ok($quotes{"19001", "currency"} eq "CAD");
+ok(length($quotes{"19001","date"}) > 0);
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+ok(substr($quotes{"19001","isodate"},0,4) == $year ||
+   substr($quotes{"19001","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"19001","date"},6,4) == $year ||
+   substr($quotes{"19001","date"},6,4) == $lastyear);
+
+# Check that bogus stocks return failure:
+
+ok(! $quotes{"00000","success"});
@@ -0,0 +1,34 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 8};
+
+use Finance::Quote;
+
+# Test currency conversion, both explicit requests and automatic
+# conversion.
+
+my $q      = Finance::Quote->new();
+
+# Explicit conversion...
+ok($q->currency("USD","AUD"));			# Test 1
+ok($q->currency("EUR","JPY"));			# Test 2
+ok(! defined($q->currency("XXX","YYY")));	# Test 3
+
+# Test 4
+ok(($q->currency("10 AUD","AUD")) == (10 * ($q->currency("AUD","AUD"))));
+
+# Euros into French Francs are fixed at a conversion rate of
+# 1:6.559576 .  We can use this knowledge to test that a stock is
+# converting correctly.
+
+# Test 5
+my %baseinfo = $q->fetch("europe","12150.PA");
+ok($baseinfo{"12150.PA","success"});
+
+$q->set_currency("AUD");	# All new requests in Aussie Dollars.
+
+my %info = $q->fetch("europe","12150.PA");
+ok($info{"12150.PA","success"});		# Test 6
+ok($info{"12150.PA","currency"} eq "AUD");	# Test 7
+ok($info{"12150.PA","price"} > 0);		# Test 8
@@ -0,0 +1,34 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 13};
+
+use Finance::Quote;
+
+# Test deka functions.
+
+my $q      = Finance::Quote->new("Deka");
+
+$q->timeout(60);		# Deka appears to be hanging today.
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+my @stocks = ("DE0008474511","LU0051755006");
+my %quotes = $q->deka(@stocks, "BOGUS");
+ok(%quotes);
+
+# Check that the last and date values are defined.
+foreach my $stock (@stocks) {
+    ok($quotes{$stock,"success"});
+    ok($quotes{$stock,"last"} > 0);
+    ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
+       substr($quotes{$stock,"isodate"},0,4) == $lastyear);
+    ok(substr($quotes{$stock,"date"},6,4) == $year ||
+       substr($quotes{$stock,"date"},6,4) == $lastyear);
+}
+ok($quotes{"DE0008474511","currency"} eq "EUR");
+ok($quotes{"LU0051755006","currency"} eq "USD");
+
+# Check that a bogus fund returns no-success.
+ok($quotes{"BOGUS","success"} == 0);
+ok($quotes{"BOGUS","errormsg"} eq "Couldn't parse deka website");
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 8};
+
+use Finance::Quote;
+
+# Test DWS functions.
+
+my $q      = Finance::Quote->new("DWS");
+
+my %quotes = $q->fetch("dwsfunds","847402","BOGUS");
+ok(%quotes);
+
+# Check that the last and date values are defined.
+ok($quotes{"847402","success"});
+ok($quotes{"847402","last"} > 0);
+ok(length($quotes{"847402","date"}) > 0);
+ok($quotes{"847402","currency"} eq "EUR");
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+ok((substr($quotes{"847402","isodate"},0,4) == $year) ||
+   (substr($quotes{"847402","isodate"},0,4) == $lastyear));
+ok((substr($quotes{"847402","date"},6,4) == $year) ||
+   (substr($quotes{"847402","date"},6,4) == $lastyear));
+
+# Check that a bogus fund returns no-success.
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,40 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 25};
+
+use Finance::Quote;
+
+# Test Fidelity functions.
+
+my $q      = Finance::Quote->new();
+my @funds = qw/FGRIX FNMIX FASGX/;
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->fidelity_direct(@funds);
+ok(%quotes);
+
+# Check that the name and nav are defined for all of the funds.
+foreach my $fund (@funds) {
+	ok($quotes{$fund,"nav"} > 0);
+	ok(length($quotes{$fund,"name"}));
+	ok($quotes{$fund,"success"});
+        ok($quotes{$fund, "currency"} eq "USD");
+	ok(substr($quotes{$fund,"isodate"},0,4) == $year ||
+	   substr($quotes{$fund,"isodate"},0,4) == $lastyear);
+	ok(substr($quotes{$fund,"date"},6,4) == $year ||
+	   substr($quotes{$fund,"date"},6,4) == $lastyear);
+}
+
+# Some funds have yields instead of navs.  Check one of them too.
+%quotes = $q->fidelity_direct("FSLXX");
+ok(%quotes);
+ok(length($quotes{"FSLXX","name"}));
+ok($quotes{"FSLXX","yield"} > 0);
+ok($quotes{"FSLXX","success"});
+ok($quotes{"FSLXX", "currency"} eq "USD");
+
+# Check that a bogus fund returns no-success.
+%quotes = $q->fidelity_direct("BOGUS");
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,32 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 14};
+
+use Finance::Quote;
+
+# Test Finance Canada functions.
+
+my $q      = Finance::Quote->new();
+my @stocks = ("CLG", "PCA");
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->fetch("financecanada", @stocks);
+ok(%quotes);
+
+# Check that the name and nav are defined for all of the stocks.
+foreach my $stock (@stocks) {
+	ok($quotes{$stock,"price"} > 0);
+	ok(length($quotes{$stock,"name"}));
+	ok($quotes{$stock,"success"});
+        ok($quotes{$stock, "currency"} eq "CAD");
+	ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
+	   substr($quotes{$stock,"isodate"},0,4) == $lastyear);
+	ok(substr($quotes{$stock,"date"},6,4) == $year ||
+	   substr($quotes{$stock,"date"},6,4) == $lastyear);
+}
+
+# Check that a bogus stock returns no-success.
+%quotes = $q->fetch("financecanada", "BOGUS");
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,33 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 18};
+
+use Finance::Quote;
+
+# Test FTPortfolios functions.
+
+my $q      = Finance::Quote->new();
+my $year   = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my @stocks = ("FKYMRX", "FAEDEX");
+my %quotes = $q->ftportfolios(@stocks, "BOGUS");
+ok(%quotes);
+
+# Check that last and date are defined as our tests.
+foreach my $stock (@stocks) {
+    ok($quotes{$stock,"pop"} > 0);
+    ok($quotes{$stock,"nav"} > 0);
+    ok($quotes{$stock,"price"} > 0);
+    ok($quotes{$stock,"success"});
+    ok($quotes{$stock,"currency"} eq "USD");
+    ok(length($quotes{$stock,"date"}) > 0);
+    ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
+       substr($quotes{$stock,"isodate"},0,4) == $lastyear);
+    ok(substr($quotes{$stock,"date"},6,4) == $year ||
+       substr($quotes{$stock,"date"},6,4) == $lastyear);
+}
+
+# Check that a bogus fund returns no-success.
+ok( ! $quotes{"BOGUS","success"});
@@ -0,0 +1,32 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 14};
+
+use Finance::Quote;
+
+# Test HEX functions.
+
+my $q      = Finance::Quote->new();
+my @stocks = ("NOK1V", "RTRKS");
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->fetch("hex", @stocks);
+ok(%quotes);
+
+# Check that the name and nav are defined for all of the stocks.
+foreach my $stock (@stocks) {
+	ok($quotes{$stock,"price"} > 0);
+	ok(length($quotes{$stock,"name"}));
+	ok($quotes{$stock,"success"});
+        ok($quotes{$stock, "currency"} eq "EUR");
+	ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
+	   substr($quotes{$stock,"isodate"},0,4) == $lastyear);
+	ok(substr($quotes{$stock,"date"},6,4) == $year ||
+	   substr($quotes{$stock,"date"},6,4) == $lastyear);
+}
+
+# Check that a bogus stock returns no-success.
+%quotes = $q->fetch("hex", "BOGUS");
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,33 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 44};
+
+use Finance::Quote;
+
+# Test Fidelity functions.
+
+my $q      = Finance::Quote->new();
+my @funds = ("102620", "103134", "101599", "102734", "100151",
+	     "102849", "101560");
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->fetch("indiamutual", @funds);
+ok(%quotes);
+
+# Check that the name and nav are defined for all of the funds.
+foreach my $fund (@funds) {
+	ok($quotes{$fund,"nav"} > 0);
+	ok(length($quotes{$fund,"name"}));
+	ok($quotes{$fund,"success"});
+        ok($quotes{$fund, "currency"} eq "INR");
+	ok(substr($quotes{$fund,"isodate"},0,4) == $year ||
+	   substr($quotes{$fund,"isodate"},0,4) == $lastyear);
+	ok(substr($quotes{$fund,"date"},6,4) == $year ||
+	   substr($quotes{$fund,"date"},6,4) == $lastyear);
+}
+
+# Check that a bogus fund returns no-success.
+%quotes = $q->fetch("indiamutual", "BOGUS");
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,46 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 32};
+
+use Finance::Quote;
+
+# Test LeRevenu functions.
+
+my $q      = Finance::Quote->new();
+
+# my stocks = stock, fund, warrant, bond, indice
+my @stocks = ("AF","FR0000441677","FR0010324475","FR0010112052","FR0003999036");
+
+# LeRevenu tests need to cover all the possible cases:
+#
+#    Name		What		Test Case
+#
+#    Actions		Stock		AF
+#    Obligations	Bond		FR0010112052
+#    SICAVetFCP		Fund		FR0000441677
+#    Bons&Warrants	Warrant		FR0010324475
+#    Indices		Index		FR0003999036
+
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->fetch("lerevenu", @stocks);
+ok(%quotes);
+
+# Check that the name, last, currency and date are defined for all of the stocks.
+foreach my $stock (@stocks) {
+	ok($quotes{$stock,"last"} > 0);
+	ok(length($quotes{$stock,"name"}));
+	ok($quotes{$stock,"success"});
+        ok($quotes{$stock, "currency"} eq "EUR");
+	ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
+	   substr($quotes{$stock,"isodate"},0,4) == $lastyear);
+	ok(substr($quotes{$stock,"date"},6,4) == $year ||
+	   substr($quotes{$stock,"date"},6,4) == $lastyear);
+}
+
+# Check that a bogus stock returns no-success.
+%quotes = $q->fetch("lerevenu", "BOGUS");
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,31 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+use Data::Dumper;
+BEGIN {plan tests => 8};
+
+use Finance::Quote;
+
+# Test ManInvestments functions.
+
+my $q      = Finance::Quote->new();
+
+my %quotes = $q->maninv("OMIP220","BOGUS");
+ok(%quotes);
+
+# Check the nav values are defined.  These are the most
+#  used and most reliable indicators of success.
+ok($quotes{"OMIP220","last"} > 0);
+ok(length($quotes{"OMIP220","name"}) > 0);
+ok($quotes{"OMIP220","success"});
+ok($quotes{"OMIP220", "currency"} eq "AUD");
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+ok((substr($quotes{"OMIP220","isodate"},0,4) == $year) ||
+   (substr($quotes{"OMIP220","isodate"},0,4) == $lastyear));
+ok((substr($quotes{"OMIP220","date"},6,4) == $year) ||
+   (substr($quotes{"OMIP220","date"},6,4) == $lastyear));
+
+# Check that a bogus stock returns no-success.
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,31 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+use Data::Dumper;
+BEGIN {plan tests => 8};
+
+use Finance::Quote;
+
+# Test Yahoo_europe functions.
+
+my $q      = Finance::Quote->new();
+
+my %quotes = $q->nzx("TPW","BOGUS");
+ok(%quotes);
+
+# Check the nav values are defined.  These are the most
+#  used and most reliable indicators of success.
+ok($quotes{"TPW","price"} > 0);
+ok(length($quotes{"TPW","name"}) > 0);
+ok($quotes{"TPW","success"});
+ok($quotes{"TPW", "currency"} eq "NZD");
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+ok(substr($quotes{"TPW","isodate"},0,4) == $year ||
+   substr($quotes{"TPW","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"TPW","date"},6,4) == $year ||
+   substr($quotes{"TPW","date"},6,4) == $lastyear);
+
+# Check that a bogus stock returns no-success.
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,31 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+use Data::Dumper;
+BEGIN {plan tests => 8};
+
+use Finance::Quote;
+
+# Test Platinum functions.
+
+my $q      = Finance::Quote->new();
+
+my %quotes = $q->platinum("PLA0001AU","BOGUS");
+ok(%quotes);
+
+# Check the nav values are defined.  These are the most
+#  used and most reliable indicators of success.
+ok($quotes{"PLA0001AU","last"} > 0);
+ok(length($quotes{"PLA0001AU","name"}) > 0);
+ok($quotes{"PLA0001AU","success"});
+ok($quotes{"PLA0001AU", "currency"} eq "AUD");
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+ok(substr($quotes{"PLA0001AU","isodate"},0,4) == $year ||
+   substr($quotes{"PLA0001AU","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"PLA0001AU","date"},6,4) == $year ||
+   substr($quotes{"PLA0001AU","date"},6,4) == $lastyear);
+
+# Check that a bogus stock returns no-success.
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,31 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+use Data::Dumper;
+BEGIN {plan tests => 8};
+
+use Finance::Quote;
+
+# Test Yahoo_europe functions.
+
+my $q      = Finance::Quote->new();
+
+my %quotes = $q->seb_funds("SEB Cancerfonden","BOGUS");
+ok(%quotes);
+
+# Check the nav values are defined.  These are the most
+#  used and most reliable indicators of success.
+ok($quotes{"SEB Cancerfonden","price"} > 0);
+ok(length($quotes{"SEB Cancerfonden","name"}) > 0);
+ok($quotes{"SEB Cancerfonden","success"});
+ok($quotes{"SEB Cancerfonden", "currency"} eq "SEK");
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+ok(substr($quotes{"SEB Cancerfonden","isodate"},0,4) == $year ||
+   substr($quotes{"SEB Cancerfonden","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"SEB Cancerfonden","date"},6,4) == $year ||
+   substr($quotes{"SEB Cancerfonden","date"},6,4) == $lastyear);
+
+# Check that a bogus stock returns no-success.
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,35 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 20};
+
+use Finance::Quote;
+
+# Test Stock House Canada functions.
+
+my $q      = Finance::Quote->new();
+my @stocks = ("CIB497", "TDB227", "FID342");
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->fetch("stockhousecanada_fund", @stocks);
+ok(%quotes);
+
+# Check that the name and nav are defined for all of the stocks.
+foreach my $stock (@stocks) {
+	ok($quotes{$stock,"price"} > 0);
+	ok(length($quotes{$stock,"name"}));
+	ok($quotes{$stock,"success"});
+	ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
+	   substr($quotes{$stock,"isodate"},0,4) == $lastyear);
+	ok(substr($quotes{$stock,"date"},6,4) == $year ||
+	   substr($quotes{$stock,"date"},6,4) == $lastyear);
+}
+
+ok($quotes{"CIB497", "currency"} eq "CAD");
+ok($quotes{"TDB227", "currency"} eq "USD");
+ok($quotes{"FID342", "currency"} eq "USD");
+
+# Check that a bogus stock returns no-success.
+%quotes = $q->fetch("stockhousecanada_fund", "BOGUS");
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,21 @@
+#!/usr/bin/perl -w
+use Test;
+use Finance::Quote;
+use strict;
+
+BEGIN { plan tests => 5 }
+
+my $q = Finance::Quote->new;
+ok($q);
+
+my %quotes = $q->tdefunds("TD Canadian Index");
+
+ok(%quotes);
+ok($quotes{"TD Canadian Index", "nav"});
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+ok(substr($quotes{"TD Canadian Index","isodate"},0,4) == $year ||
+   substr($quotes{"TD Canadian Index","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"TD Canadian Index","date"},6,4) == $year ||
+   substr($quotes{"TD Canadian Index","date"},6,4) == $lastyear);
@@ -0,0 +1,35 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 12};
+
+use Finance::Quote;
+
+# Test TD Waterhouse functions.
+
+my $q      = Finance::Quote->new();
+my $year   = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my @stocks = ("TD U.S. MidCap Growth US", "TD Canadian Bond Index");
+
+my %quotes = $q->tdwaterhouse(@stocks, "BOGUS");
+ok(%quotes);
+
+# Check the last values are defined.  These are the most
+#  used and most reliable indicators of success.
+foreach my $stock (@stocks) {
+    ok($quotes{$stock,"last"} > 0);
+    ok($quotes{$stock,"success"});
+    ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
+       substr($quotes{$stock,"isodate"},0,4) == $lastyear);
+    ok(substr($quotes{$stock,"date"},6,4) == $year ||
+       substr($quotes{$stock,"date"},6,4) == $lastyear);
+}
+
+ok($quotes{"TD U.S. MidCap Growth US", "currency"} eq "USD");
+ok($quotes{"TD Canadian Bond Index", "currency"} eq "CAD");
+
+# Check that bogus stocks return failure:
+
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 23};
+
+use Finance::Quote;
+
+# Test TIAA-CREF functions.
+
+my $q      = Finance::Quote->new();
+my $year   = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->tiaacref("CREFmony","TIAAreal","TLSIX","TCMVX","TLGIX","BOGOname");
+ok(%quotes);
+
+ok($quotes{"CREFmony","nav"} > 0);
+ok($quotes{"CREFmony", "currency"} eq "USD");
+ok(length($quotes{"CREFmony","date"}) > 0);
+ok(substr($quotes{"CREFmony","isodate"},0,4) == $year ||
+   substr($quotes{"CREFmony","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"CREFmony","date"},6,4) == $year ||
+   substr($quotes{"CREFmony","date"},6,4) == $lastyear);
+
+ok($quotes{"TIAAreal","nav"} > 0);
+ok(length($quotes{"TIAAreal","date"}) > 0);
+ok(substr($quotes{"TIAAreal","isodate"},0,4) == $year ||
+   substr($quotes{"TIAAreal","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"TIAAreal","date"},6,4) == $year ||
+   substr($quotes{"TIAAreal","date"},6,4) == $lastyear);
+
+ok($quotes{"TLSIX","success"} > 0);
+ok($quotes{"TLSIX","nav"} > 0); 
+ok(length($quotes{"TLSIX","date"}) > 0);
+ok(substr($quotes{"TLSIX","isodate"},0,4) == $year ||
+   substr($quotes{"TLSIX","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"TLSIX","date"},6,4) == $year ||
+   substr($quotes{"TLSIX","date"},6,4) == $lastyear);
+
+ok($quotes{"TCMVX","success"} > 0);
+ok($quotes{"TCMVX","nav"} > 0); 
+ok(length($quotes{"TCMVX","date"}) > 0);
+ok(substr($quotes{"TCMVX","isodate"},0,4) == $year ||
+   substr($quotes{"TCMVX","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"TCMVX","date"},6,4) == $year ||
+   substr($quotes{"TCMVX","date"},6,4) == $lastyear);
+
+ok($quotes{"TLGIX","success"} > 0);
+
+ok($quotes{"BOGOname","success"} == 0);
+ok($quotes{"BOGOname","errormsg"} eq "Bad symbol");
+
@@ -0,0 +1,39 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 13};
+
+use Finance::Quote;
+
+# Test troweprice functions.
+
+my $q      = Finance::Quote->new();
+my $year   = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->troweprice;
+ok(%quotes);
+
+# Check that nav and date are defined as our tests.
+ok($quotes{"PRFDX","nav"} > 0);
+ok($quotes{"PRFDX","success"});
+ok($quotes{"PRFDX","currency"} eq "USD");
+ok(length($quotes{"PRFDX","date"}) > 0);
+ok(substr($quotes{"PRFDX","isodate"},0,4) == $year ||
+   substr($quotes{"PRFDX","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"PRFDX","date"},6,4) == $year ||
+   substr($quotes{"PRFDX","date"},6,4) == $lastyear);
+
+
+ok($quotes{"PRIDX","success"});
+ok($quotes{"PRIDX","nav"} > 0);
+ok(length($quotes{"PRIDX","date"}) > 0);
+ok(substr($quotes{"PRIDX","isodate"},0,4) == $year ||
+   substr($quotes{"PRIDX","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"PRIDX","date"},6,4) == $year ||
+   substr($quotes{"PRIDX","date"},6,4) == $lastyear);
+
+# Check a bogus fund returns no-success
+
+%quotes = $q->troweprice("BOGUS");
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,37 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+
+BEGIN {plan tests => 12};
+
+use Finance::Quote;
+
+# Test trustnet functions.
+
+my $q = Finance::Quote->new();
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my @stocks = ("ABBEY NATIONAL INTERNATIONAL","MARLBOROUGH INTERNATIONAL EQUITY");
+
+my %quotes = $q->fetch("trustnet",@stocks);
+
+ok(%quotes);
+
+# For each of our stocks, check to make sure we got back some
+# useful information.
+
+foreach my $stock (@stocks) {
+	ok($quotes{$stock,"success"});
+	ok($quotes{$stock,"price"});
+	ok($quotes{$stock,"date"});
+	ok(substr($quotes{$stock,"isodate"},0,4) == $year ||
+	   substr($quotes{$stock,"isodate"},0,4) == $lastyear);
+	ok(substr($quotes{$stock,"date"},6,4) == $year ||
+	   substr($quotes{$stock,"date"},6,4) == $lastyear);
+}
+
+# Test that a bogus stock gets no success.
+
+%quotes = $q->fetch("trustnet","BOGUS");
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 22};
+
+use Finance::Quote;
+
+# Test TSP functions.
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+my $quoter = Finance::Quote->new();
+
+my %quotes = $quoter->tsp("c","s","TSPgfund","BOGUS","l2040fund");
+ok(%quotes);
+
+# Check that some values are defined.
+ok($quotes{"c","success"});
+ok($quotes{"c","nav"} > 0);
+ok($quotes{"l2040fund","date"});
+ok(substr($quotes{"l2040fund","isodate"},0,4) == $year ||
+   substr($quotes{"l2040fund","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"l2040fund","date"},6,4) == $year ||
+   substr($quotes{"l2040fund","date"},6,4) == $lastyear);
+ok($quotes{"s","currency"});
+ok($quotes{"s","name"});
+ok($quotes{"TSPgfund","success"});
+ok($quotes{"TSPgfund","nav"} > 0);
+ok($quotes{"TSPgfund","date"});
+ok(substr($quotes{"TSPgfund","isodate"},0,4) == $year ||
+   substr($quotes{"TSPgfund","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"TSPgfund","date"},6,4) == $year ||
+   substr($quotes{"TSPgfund","date"},6,4) == $lastyear);
+
+# Check that some values are undefined.
+ok( !defined($quotes{"c","exchange"}) );
+
+# Check that a bogus fund returns no-success.
+ok( ! $quotes{"BOGUS","success"});
+
+# Exercise the fetch function 
+%quotes = $quoter->fetch("tsp","g","f","i","tsplincomefund");
+ok(%quotes);
+ok($quotes{"g","success"});
+ok($quotes{"f","nav"} > 0);
+ok($quotes{"i","date"});
+ok(substr($quotes{"i","isodate"},0,4) == $year ||
+   substr($quotes{"i","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"i","date"},6,4) == $year ||
+   substr($quotes{"i","date"},6,4) == $lastyear);
+ok($quotes{"tsplincomefund","nav"} > 0);
+
@@ -0,0 +1,31 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 7};
+
+use Finance::Quote;
+
+# Test TD Waterhouse functions.
+
+my $q      = Finance::Quote->new();
+
+my %quotes = $q->unionfunds("975792","12345");
+ok(%quotes);
+
+# Check the last values are defined.  These are the most
+#  used and most reliable indicators of success.
+ok($quotes{"975792","last"} > 0);
+ok($quotes{"975792","success"});
+ok($quotes{"975792", "currency"} eq "EUR");
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+ok(substr($quotes{"975792","isodate"},0,4) eq $year ||
+   substr($quotes{"975792","isodate"},0,4) eq $lastyear);
+ok(substr($quotes{"975792","date"},6,4) eq $year ||
+   substr($quotes{"975792","date"},6,4) eq $lastyear);
+
+
+# Check that bogus stocks return failure:
+
+ok(! $quotes{"12345","success"});
@@ -0,0 +1,47 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 19};
+
+use Finance::Quote;
+
+# Test usfedbonds functions.
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+my $q      = Finance::Quote->new("USFedBonds");
+
+#my %quotes = $q->usfedbonds("E197001.200606");
+my %quotes = $q->usfedbonds("E197001.200606","E194112.200610","E194101.200610","E194001.200610","BOGUS");
+ok(%quotes);
+
+# Check that the last and date values are defined.
+ok($quotes{"E197001.200606","success"});
+ok($quotes{"E197001.200606","price"} > 0);
+ok(length($quotes{"E197001.200606","date"}) > 0);
+ok(substr($quotes{"E197001.200606","isodate"},0,4) eq $year ||
+   substr($quotes{"E197001.200606","isodate"},0,4) eq $lastyear);
+ok(substr($quotes{"E197001.200606","date"},6,4) eq $year ||
+   substr($quotes{"E197001.200606","date"},6,4) eq $lastyear);
+ok($quotes{"E197001.200606","currency"} eq "USD");
+
+ok($quotes{"E194112.200610","success"});
+ok($quotes{"E194112.200610","price"} > 0);
+ok(length($quotes{"E194112.200610","date"}) > 0);
+ok(substr($quotes{"E194112.200610","isodate"},0,4) eq $year ||
+   substr($quotes{"E194112.200610","isodate"},0,4) eq $lastyear);
+ok(substr($quotes{"E194112.200610","date"},6,4) eq $year ||
+   substr($quotes{"E194112.200610","date"},6,4) eq $lastyear);
+ok($quotes{"E194112.200610","currency"} eq "USD");
+
+# Check that a non-existent price returns no-success.
+ok($quotes{"E194101.200610","success"} == 0);
+ok($quotes{"E194101.200610","errormsg"} eq "No value found");
+
+# Check that a non-existent price returns no-success.
+ok($quotes{"E194001.200610","success"} == 0);
+ok($quotes{"E194001.200610","errormsg"} eq "Date not found");
+
+# Check that a bogus fund returns no-success.
+ok($quotes{"BOGUS","success"} == 0);
+ok($quotes{"BOGUS","errormsg"} eq "Parse error");
@@ -0,0 +1,32 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 26};
+
+use Finance::Quote;
+
+# Test Vanguard functions.
+
+my $q      = Finance::Quote->new();
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+my @funds = qw/VBINX VIVAX VWINX VFIIX/;
+
+my %quotes = $q->vanguard(@funds);
+ok(%quotes);
+
+# Check that the name and last are defined for all of the funds.
+foreach my $fund (@funds) {
+	ok($quotes{$fund,"last"} > 0);
+	ok(length($quotes{$fund,"name"}));
+	ok($quotes{$fund,"success"});
+        ok($quotes{$fund, "currency"} eq "USD");
+	ok(substr($quotes{$fund,"isodate"},0,4) == $year ||
+	   substr($quotes{$fund,"isodate"},0,4) == $lastyear);
+	ok(substr($quotes{$fund,"date"},6,4) == $year ||
+	   substr($quotes{$fund,"date"},6,4) == $lastyear);
+}
+
+# Make sure we're not getting spurious percentage signs.
+
+ok($quotes{"VBINX","p_change"} !~ /%/);
@@ -0,0 +1,29 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 9};
+
+use Finance::Quote;
+
+# Test vwd functions.
+
+my $year = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+my $q      = Finance::Quote->new("VWD");
+
+my %quotes = $q->vwd("847402","BOGUS");
+ok(%quotes);
+
+# Check that the last and date values are defined.
+ok($quotes{"847402","success"});
+ok($quotes{"847402","last"} > 0);
+ok(length($quotes{"847402","date"}) > 0);
+ok(substr($quotes{"847402","isodate"},0,4) == $year ||
+   substr($quotes{"847402","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"847402","date"},6,4) == $year ||
+   substr($quotes{"847402","date"},6,4) == $lastyear);
+ok($quotes{"847402","currency"} eq "EUR");
+
+# Check that a bogus fund returns no-success.
+ok($quotes{"BOGUS","success"} == 0);
+ok($quotes{"BOGUS","errormsg"} eq "Invalid symbol: BOGUS");
@@ -0,0 +1,38 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 11};
+
+use Finance::Quote;
+
+# Test Yahoo functions.
+
+my $q      = Finance::Quote->new();
+my $year   = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->yahoo("IBM","CSCO","BOGUS");
+ok(%quotes);
+
+# Check the last values are defined.  These are the most
+#  used and most reliable indicators of success.
+ok($quotes{"IBM","last"} > 0);
+ok($quotes{"IBM","success"});
+ok($quotes{"IBM", "currency"} eq "USD");
+ok(($quotes{"IBM", "currency"} eq "USD") &&
+   !defined($quotes{"IBM","currency_set_by_fq"}));
+ok(substr($quotes{"IBM","isodate"},0,4) == $year ||
+   substr($quotes{"IBM","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"IBM","date"},6,4) == $year ||
+   substr($quotes{"IBM","date"},6,4) == $lastyear);
+
+ok($quotes{"CSCO","last"} > 0);
+ok($quotes{"CSCO","success"});
+
+# Make sure there are no spurious % signs.
+
+ok($quotes{"CSCO","p_change"} !~ /%/);
+
+# Check that bogus stocks return failure:
+
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,34 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+use Data::Dumper;
+BEGIN {plan tests => 9};
+
+use Finance::Quote;
+
+# Test Yahoo_europe functions.
+
+my $q      = Finance::Quote->new();
+my $year   = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->asia("C76.SI","BOGUS.SI");
+ok(%quotes);
+
+# Check the nav values are defined.  These are the most
+#  used and most reliable indicators of success.
+ok($quotes{"C76.SI","last"} > 0);
+ok(length($quotes{"C76.SI","name"}) > 0);
+ok($quotes{"C76.SI","success"});
+ok($quotes{"C76.SI", "currency"} eq "SGD");
+ok(substr($quotes{"C76.SI","isodate"},0,4) == $year ||
+   substr($quotes{"C76.SI","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"C76.SI","date"},6,4) == $year ||
+   substr($quotes{"C76.SI","date"},6,4) == $lastyear);
+
+# Make sure we don't have spurious % signs.
+
+ok($quotes{"C76.SI","p_change"} !~ /%/);
+
+# Check that a bogus stock returns no-success.
+ok(! $quotes{"BOGUS.SI","success"});
@@ -0,0 +1,34 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+use Data::Dumper;
+BEGIN {plan tests => 9};
+
+use Finance::Quote;
+
+# Test Yahoo_europe functions.
+
+my $q      = Finance::Quote->new();
+my $year   = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->yahoo_australia("BHP","BOGUS");
+ok(%quotes);
+
+# Check the nav values are defined.  These are the most
+#  used and most reliable indicators of success.
+ok($quotes{"BHP","last"} > 0);
+ok(length($quotes{"BHP","name"}) > 0);
+ok($quotes{"BHP","success"});
+ok($quotes{"BHP", "currency"} eq "AUD");
+ok(substr($quotes{"BHP","isodate"},0,4) == $year ||
+   substr($quotes{"BHP","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"BHP","date"},6,4) == $year ||
+   substr($quotes{"BHP","date"},6,4) == $lastyear);
+
+# Make sure we don't have spurious % signs.
+
+ok($quotes{"BHP","p_change"} !~ /%/);
+
+# Check that a bogus stock returns no-success.
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,37 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+use Data::Dumper;
+BEGIN {plan tests => 16};
+
+use Finance::Quote;
+
+# Test Yahoo_europe functions.
+
+my $q      = Finance::Quote->new();
+my @stocks = ("BRGE1","BAZA3");
+my $year   = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->fetch("yahoo_brasil", @stocks);
+ok(%quotes);
+
+# Check the nav values are defined.  These are the most
+#  used and most reliable indicators of success.
+foreach my $stock (@stocks) {
+    ok($quotes{$stock,"success"});
+    ok($quotes{$stock,"last"} > 0);
+    ok(length($quotes{$stock,"name"}) > 0);
+    ok($quotes{$stock, "currency"} eq "BRL");
+    ok((substr($quotes{$stock,"isodate"},0,4) == $year) ||
+       (substr($quotes{$stock,"isodate"},0,4) == $lastyear));
+    ok((substr($quotes{$stock,"date"},6,4) == $year) ||
+       (substr($quotes{$stock,"date"},6,4) == $lastyear));
+
+    # Make sure we don't have spurious % signs.
+    ok($quotes{$stock,"p_change"} !~ /%/);
+}
+
+# Check that a bogus stock returns no-success.
+%quotes = $q->yahoo_brasil("BOGUS");
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,66 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+use Data::Dumper;
+BEGIN {plan tests => 21};
+
+use Finance::Quote;
+
+# Test Yahoo_europe functions.
+
+my $q      = Finance::Quote->new();
+my $year   = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->yahoo_europe("12150.PA","BOGUS.L");
+ok(%quotes);
+
+# Check the nav values are defined.  These are the most
+#  used and most reliable indicators of success.
+ok($quotes{"12150.PA","last"} > 0);
+ok(length($quotes{"12150.PA","name"}) > 0);
+ok($quotes{"12150.PA","success"});
+ok($quotes{"12150.PA", "currency"} eq "EUR");
+ok(substr($quotes{"12150.PA","isodate"},0,4) == $year ||
+   substr($quotes{"12150.PA","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"12150.PA","date"},6,4) == $year ||
+   substr($quotes{"12150.PA","date"},6,4) == $lastyear);
+
+# Make sure we don't have spurious % signs.
+
+ok($quotes{"12150.PA","p_change"} !~ /%/);
+
+# Check that a bogus stock returns no-success.
+ok(! $quotes{"BOGUS","success"});
+
+# London stocks can be returned in a variety of currencies
+
+my %londonquotes = $q->fetch("yahoo_europe","BAY.L");
+ok($londonquotes{"BAY.L","success"});
+ok($londonquotes{"BAY.L","currency"} eq "GBP");
+ok(($londonquotes{"BAY.L","currency"} eq "GBP") &&
+   !defined($londonquotes{"BAY.L","currency_set_by_fq"}));
+
+%londonquotes = $q->fetch("yahoo_europe","CCR.L");
+ok($londonquotes{"CCR.L","success"});
+ok($londonquotes{"CCR.L","currency"} eq "EUR");
+ok(($londonquotes{"CCR.L","currency"} eq "EUR") &&
+   !defined($londonquotes{"CCR.L","currency_set_by_fq"}));
+
+# Copenhangen stocks should be returned in Danisk Krone (DKK).
+
+my %copenhagenquotes = $q->fetch("yahoo_europe","TDC.CO");
+ok($copenhagenquotes{"TDC.CO","success"});
+ok($copenhagenquotes{"TDC.CO","currency"} eq "DKK");
+ok(($copenhagenquotes{"TDC.CO","currency"} eq "DKK") &&
+   !defined($copenhagenquotes{"TDC.CO","currency_set_by_fq"}));
+
+# Two stocks from the German XETRA.  One in EUR and one in USD.
+
+my %xetraquotes = $q->fetch("yahoo_europe","DBK.DE", "ERM.DE");
+ok($xetraquotes{"DBK.DE","success"});
+ok($xetraquotes{"DBK.DE","currency"} eq "EUR");
+ok(($xetraquotes{"DBK.DE","currency"} eq "EUR") &&
+   !defined($xetraquotes{"DBK.DE","currency_set_by_fq"}));
+
+
@@ -0,0 +1,34 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+use Data::Dumper;
+BEGIN {plan tests => 9};
+
+use Finance::Quote;
+
+# Test Yahoo_nz functions.
+
+my $q      = Finance::Quote->new();
+my $year   = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->yahoo_nz("AIA","BOGUS");
+ok(%quotes);
+
+# Check the nav values are defined.  These are the most
+#  used and most reliable indicators of success.
+ok($quotes{"AIA","last"} > 0);
+ok(length($quotes{"AIA","name"}) > 0);
+ok($quotes{"AIA","success"});
+ok($quotes{"AIA", "currency"} eq "NZD");
+ok(substr($quotes{"AIA","isodate"},0,4) == $year ||
+   substr($quotes{"AIA","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"AIA","date"},6,4) == $year ||
+   substr($quotes{"AIA","date"},6,4) == $lastyear);
+
+# Make sure we don't have spurious % signs.
+
+ok($quotes{"AIA","p_change"} !~ /%/);
+
+# Check that a bogus stock returns no-success.
+ok(! $quotes{"BOGUS","success"});
@@ -0,0 +1,38 @@
+#!/usr/bin/perl -w
+use strict;
+use Test;
+BEGIN {plan tests => 15};
+
+use Finance::Quote;
+
+# Test za functions.
+
+my $q      = Finance::Quote->new("ZA");
+my $year   = (localtime())[5] + 1900;
+my $lastyear = $year - 1;
+
+my %quotes = $q->za("AGL","AMS","BOGUS");
+ok(%quotes);
+
+# Check that the last and date values are defined.
+ok($quotes{"AGL","success"});
+ok($quotes{"AGL","last"} > 0);
+ok(length($quotes{"AGL","date"}) > 0);
+ok(substr($quotes{"AGL","isodate"},0,4) == $year ||
+   substr($quotes{"AGL","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"AGL","date"},6,4) == $year ||
+   substr($quotes{"AGL","date"},6,4) == $lastyear);
+ok($quotes{"AGL","currency"} eq "ZAR");
+
+ok($quotes{"AMS","success"});
+ok($quotes{"AMS","last"} > 0);
+ok(length($quotes{"AMS","date"}) > 0);
+ok(substr($quotes{"AMS","isodate"},0,4) == $year ||
+   substr($quotes{"AMS","isodate"},0,4) == $lastyear);
+ok(substr($quotes{"AMS","date"},6,4) == $year ||
+   substr($quotes{"AMS","date"},6,4) == $lastyear);
+ok($quotes{"AMS","currency"} eq "ZAR");
+
+# Check that a bogus fund returns no-success.
+ok($quotes{"BOGUS","success"} == 0);
+ok($quotes{"BOGUS","errormsg"} eq "Parse error");