summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AUTHORS16
-rw-r--r--LICENSE22
-rw-r--r--MANIFEST.in2
-rw-r--r--PKG-INFO93
-rw-r--r--README71
-rw-r--r--ofxparse.egg-info/PKG-INFO93
-rw-r--r--ofxparse.egg-info/SOURCES.txt36
-rw-r--r--ofxparse.egg-info/dependency_links.txt1
-rw-r--r--ofxparse.egg-info/entry_points.txt2
-rw-r--r--ofxparse.egg-info/requires.txt2
-rw-r--r--ofxparse.egg-info/top_level.txt1
-rw-r--r--ofxparse.egg-info/zip-safe1
-rw-r--r--ofxparse/__init__.py5
-rw-r--r--ofxparse/mcc.py981
-rw-r--r--ofxparse/ofxparse.py851
-rw-r--r--ofxparse/ofxutil.py262
-rw-r--r--setup.cfg8
-rw-r--r--setup.py66
-rw-r--r--tests/__init__.py0
-rw-r--r--tests/fixtures/account_listing_aggregation.ofx51
-rw-r--r--tests/fixtures/bank_medium.ofx18
-rw-r--r--tests/fixtures/bank_small.ofx11
-rw-r--r--tests/fixtures/checking.ofx83
-rw-r--r--tests/fixtures/fail_nice/date_missing.ofx65
-rw-r--r--tests/fixtures/fail_nice/decimal_error.ofx51
-rw-r--r--tests/fixtures/fail_nice/empty_balance.ofx48
-rw-r--r--tests/fixtures/fidelity.ofx11
-rw-r--r--tests/fixtures/investment_medium.ofx119
-rw-r--r--tests/fixtures/multiple_accounts.ofx61
-rw-r--r--tests/fixtures/multiple_accounts2.ofx61
-rw-r--r--tests/fixtures/signon_fail.ofx11
-rw-r--r--tests/fixtures/signon_success.ofx11
-rw-r--r--tests/fixtures/signon_success_no_message.ofx11
-rw-r--r--tests/fixtures/vanguard.ofx11
-rw-r--r--tests/support.py9
-rw-r--r--tests/test_parse.py623
-rw-r--r--tests/test_write.py17
37 files changed, 3785 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..7e58dca
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,16 @@
+Developers:
+Jerry Seutter <jerry.seutter@gmail.com>
+
+Contributors:
+Wes Devauld
+Leonardo Santagada
+Eric Moritz
+James Addison
+Matt Haggard
+Richart T Guy
+Alex Chiang
+Matt Haggard
+Andre Smolik
+greggles@github
+mikeivanov@github
+danc86@github
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..5fce5b4
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2009 Jerry Seutter
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 0000000..2a99925
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,2 @@
+include LICENSE AUTHORS
+recursive-include tests *.py *.ofx
diff --git a/PKG-INFO b/PKG-INFO
new file mode 100644
index 0000000..83be6d8
--- /dev/null
+++ b/PKG-INFO
@@ -0,0 +1,93 @@
+Metadata-Version: 1.1
+Name: ofxparse
+Version: 0.14
+Summary: Tools for working with the OFX (Open Financial Exchange) file format
+Home-page: http://sites.google.com/site/ofxparse
+Author: Jerry Seutter
+Author-email: jseutter.ofxparse@gmail.com
+License: MIT License
+Description: ofxparse
+ ========
+
+ ofxparse is a parser for Open Financial Exchange (.ofx) format files. OFX
+ files are available from almost any online banking site, so they work well
+ if you want to pull together your finances from multiple sources. Online
+ trading accounts also provide account statements in OFX files.
+
+ There are three different types of OFX files, called BankAccount,
+ CreditAccount and InvestmentAccount files. This library has been tested with
+ real-world samples of all three types. If you find a file that does not work
+ with this library, please consider contributing the file so ofxparse can be
+ improved. See the Help! section below for directions on how to do this.
+
+ Example Usage
+ =============
+
+ Here's a sample program::
+
+ from ofxparse import OfxParser
+
+ ofx = OfxParser.parse(file('file.ofx'))
+ ofx.accounts # An account with information
+ ofx.account.number # The account number
+ ofx.account.routing_number # The transit id (sometimes called branch number)
+ ofx.account.statement # Account information for a period of time
+ ofx.account.statement.start_date # The start date of the transactions
+ ofx.account.statement.end_date # The end date of the transactions
+ ofx.account.statement.transactions # A list of account activities
+ ofx.account.statement.balance # The money in the account as of the statement date
+ ofx.account.statement.available_balance # The money available from the account as of the statement date
+
+ Help!
+ =====
+
+ Sample .ofx files are very useful. If you want to help us out, please edit
+ all identifying information from the file and then email it to jseutter dot
+ ofxparse at gmail dot com.
+
+ Development
+ ===========
+
+ Prerequisites::
+ (Ubuntu) sudo apt-get install python-beautifulsoup python-nose python-coverage-test-runner
+ (pip) pip install BeautifulSoup nose coverage
+
+ Tests::
+ Simply running the "nose" command should run the tests. If you don't have nose
+ installed, the following might also work:
+
+ python -m unittest tests.test_parse
+
+ Test Coverage Report::
+
+ coverage run -m unittest tests.test_parse
+ coverage html
+ firefox htmlcov/index.html
+
+
+ Homepage
+ ========
+ http://sites.google.com/site/ofxparse
+
+ License
+ =======
+
+ ofxparse is released under an MIT license. See the LICENSE file for the actual
+ license text. The basic idea is that if you can use Python to do what you are
+ doing, you can also use this library.
+
+
+
+Keywords: ofx,Open Financial Exchange,file formats
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: Natural Language :: English
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Utilities
+Classifier: License :: OSI Approved :: MIT License
diff --git a/README b/README
new file mode 100644
index 0000000..c112ec0
--- /dev/null
+++ b/README
@@ -0,0 +1,71 @@
+ofxparse
+========
+
+ofxparse is a parser for Open Financial Exchange (.ofx) format files. OFX
+files are available from almost any online banking site, so they work well
+if you want to pull together your finances from multiple sources. Online
+trading accounts also provide account statements in OFX files.
+
+There are three different types of OFX files, called BankAccount,
+CreditAccount and InvestmentAccount files. This library has been tested with
+real-world samples of all three types. If you find a file that does not work
+with this library, please consider contributing the file so ofxparse can be
+improved. See the Help! section below for directions on how to do this.
+
+Example Usage
+=============
+
+Here's a sample program::
+
+ from ofxparse import OfxParser
+
+ ofx = OfxParser.parse(file('file.ofx'))
+ ofx.accounts # An account with information
+ ofx.account.number # The account number
+ ofx.account.routing_number # The transit id (sometimes called branch number)
+ ofx.account.statement # Account information for a period of time
+ ofx.account.statement.start_date # The start date of the transactions
+ ofx.account.statement.end_date # The end date of the transactions
+ ofx.account.statement.transactions # A list of account activities
+ ofx.account.statement.balance # The money in the account as of the statement date
+ ofx.account.statement.available_balance # The money available from the account as of the statement date
+
+Help!
+=====
+
+Sample .ofx files are very useful. If you want to help us out, please edit
+all identifying information from the file and then email it to jseutter dot
+ofxparse at gmail dot com.
+
+Development
+===========
+
+Prerequisites::
+(Ubuntu) sudo apt-get install python-beautifulsoup python-nose python-coverage-test-runner
+(pip) pip install BeautifulSoup nose coverage
+
+Tests::
+Simply running the "nose" command should run the tests. If you don't have nose
+installed, the following might also work:
+
+ python -m unittest tests.test_parse
+
+Test Coverage Report::
+
+ coverage run -m unittest tests.test_parse
+ coverage html
+ firefox htmlcov/index.html
+
+
+Homepage
+========
+http://sites.google.com/site/ofxparse
+
+License
+=======
+
+ofxparse is released under an MIT license. See the LICENSE file for the actual
+license text. The basic idea is that if you can use Python to do what you are
+doing, you can also use this library.
+
+
diff --git a/ofxparse.egg-info/PKG-INFO b/ofxparse.egg-info/PKG-INFO
new file mode 100644
index 0000000..83be6d8
--- /dev/null
+++ b/ofxparse.egg-info/PKG-INFO
@@ -0,0 +1,93 @@
+Metadata-Version: 1.1
+Name: ofxparse
+Version: 0.14
+Summary: Tools for working with the OFX (Open Financial Exchange) file format
+Home-page: http://sites.google.com/site/ofxparse
+Author: Jerry Seutter
+Author-email: jseutter.ofxparse@gmail.com
+License: MIT License
+Description: ofxparse
+ ========
+
+ ofxparse is a parser for Open Financial Exchange (.ofx) format files. OFX
+ files are available from almost any online banking site, so they work well
+ if you want to pull together your finances from multiple sources. Online
+ trading accounts also provide account statements in OFX files.
+
+ There are three different types of OFX files, called BankAccount,
+ CreditAccount and InvestmentAccount files. This library has been tested with
+ real-world samples of all three types. If you find a file that does not work
+ with this library, please consider contributing the file so ofxparse can be
+ improved. See the Help! section below for directions on how to do this.
+
+ Example Usage
+ =============
+
+ Here's a sample program::
+
+ from ofxparse import OfxParser
+
+ ofx = OfxParser.parse(file('file.ofx'))
+ ofx.accounts # An account with information
+ ofx.account.number # The account number
+ ofx.account.routing_number # The transit id (sometimes called branch number)
+ ofx.account.statement # Account information for a period of time
+ ofx.account.statement.start_date # The start date of the transactions
+ ofx.account.statement.end_date # The end date of the transactions
+ ofx.account.statement.transactions # A list of account activities
+ ofx.account.statement.balance # The money in the account as of the statement date
+ ofx.account.statement.available_balance # The money available from the account as of the statement date
+
+ Help!
+ =====
+
+ Sample .ofx files are very useful. If you want to help us out, please edit
+ all identifying information from the file and then email it to jseutter dot
+ ofxparse at gmail dot com.
+
+ Development
+ ===========
+
+ Prerequisites::
+ (Ubuntu) sudo apt-get install python-beautifulsoup python-nose python-coverage-test-runner
+ (pip) pip install BeautifulSoup nose coverage
+
+ Tests::
+ Simply running the "nose" command should run the tests. If you don't have nose
+ installed, the following might also work:
+
+ python -m unittest tests.test_parse
+
+ Test Coverage Report::
+
+ coverage run -m unittest tests.test_parse
+ coverage html
+ firefox htmlcov/index.html
+
+
+ Homepage
+ ========
+ http://sites.google.com/site/ofxparse
+
+ License
+ =======
+
+ ofxparse is released under an MIT license. See the LICENSE file for the actual
+ license text. The basic idea is that if you can use Python to do what you are
+ doing, you can also use this library.
+
+
+
+Keywords: ofx,Open Financial Exchange,file formats
+Platform: UNKNOWN
+Classifier: Development Status :: 4 - Beta
+Classifier: Intended Audience :: Developers
+Classifier: Natural Language :: English
+Classifier: Operating System :: OS Independent
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: Utilities
+Classifier: License :: OSI Approved :: MIT License
diff --git a/ofxparse.egg-info/SOURCES.txt b/ofxparse.egg-info/SOURCES.txt
new file mode 100644
index 0000000..6cff2c7
--- /dev/null
+++ b/ofxparse.egg-info/SOURCES.txt
@@ -0,0 +1,36 @@
+AUTHORS
+LICENSE
+MANIFEST.in
+README
+setup.cfg
+setup.py
+ofxparse/__init__.py
+ofxparse/mcc.py
+ofxparse/ofxparse.py
+ofxparse/ofxutil.py
+ofxparse.egg-info/PKG-INFO
+ofxparse.egg-info/SOURCES.txt
+ofxparse.egg-info/dependency_links.txt
+ofxparse.egg-info/entry_points.txt
+ofxparse.egg-info/requires.txt
+ofxparse.egg-info/top_level.txt
+ofxparse.egg-info/zip-safe
+tests/__init__.py
+tests/support.py
+tests/test_parse.py
+tests/test_write.py
+tests/fixtures/account_listing_aggregation.ofx
+tests/fixtures/bank_medium.ofx
+tests/fixtures/bank_small.ofx
+tests/fixtures/checking.ofx
+tests/fixtures/fidelity.ofx
+tests/fixtures/investment_medium.ofx
+tests/fixtures/multiple_accounts.ofx
+tests/fixtures/multiple_accounts2.ofx
+tests/fixtures/signon_fail.ofx
+tests/fixtures/signon_success.ofx
+tests/fixtures/signon_success_no_message.ofx
+tests/fixtures/vanguard.ofx
+tests/fixtures/fail_nice/date_missing.ofx
+tests/fixtures/fail_nice/decimal_error.ofx
+tests/fixtures/fail_nice/empty_balance.ofx \ No newline at end of file
diff --git a/ofxparse.egg-info/dependency_links.txt b/ofxparse.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ofxparse.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/ofxparse.egg-info/entry_points.txt b/ofxparse.egg-info/entry_points.txt
new file mode 100644
index 0000000..b0dac65
--- /dev/null
+++ b/ofxparse.egg-info/entry_points.txt
@@ -0,0 +1,2 @@
+
+ \ No newline at end of file
diff --git a/ofxparse.egg-info/requires.txt b/ofxparse.egg-info/requires.txt
new file mode 100644
index 0000000..d33d9e5
--- /dev/null
+++ b/ofxparse.egg-info/requires.txt
@@ -0,0 +1,2 @@
+beautifulsoup4
+six \ No newline at end of file
diff --git a/ofxparse.egg-info/top_level.txt b/ofxparse.egg-info/top_level.txt
new file mode 100644
index 0000000..ae82238
--- /dev/null
+++ b/ofxparse.egg-info/top_level.txt
@@ -0,0 +1 @@
+ofxparse
diff --git a/ofxparse.egg-info/zip-safe b/ofxparse.egg-info/zip-safe
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/ofxparse.egg-info/zip-safe
@@ -0,0 +1 @@
+
diff --git a/ofxparse/__init__.py b/ofxparse/__init__.py
new file mode 100644
index 0000000..f1fb25b
--- /dev/null
+++ b/ofxparse/__init__.py
@@ -0,0 +1,5 @@
+from __future__ import absolute_import
+
+from .ofxparse import OfxParser, AccountType, Account, Statement, Transaction
+
+__version__ = '0.14'
diff --git a/ofxparse/mcc.py b/ofxparse/mcc.py
new file mode 100644
index 0000000..4eff74c
--- /dev/null
+++ b/ofxparse/mcc.py
@@ -0,0 +1,981 @@
+# MCC: Merchant Category Codes from
+# * https://github.com/greggles/mcc-codes
+
+
+codes={
+ '0':{'combined description':'none', 'USDA description':'none','IRS Description':'none', 'Reportable under 6041/6041A and Authority for Exception':'no'},
+ '742':{'combined description':'Veterinary Services', 'USDA description':'Veterinary Services','IRS Description':'Veterinary Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '763':{'combined description':'Agricultural Co-operatives', 'USDA description':'Agricultural Co-operatives','IRS Description':'Agricultural Cooperative', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '780':{'combined description':'Horticultural Services, Landscaping Services', 'USDA description':'Horticultural Services','IRS Description':'Landscaping Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '1520':{'combined description':'General Contractors-Residential and Commercial', 'USDA description':'General Contractors-Residential and Commercial','IRS Description':'General Contractors', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '1711':{'combined description':'Air Conditioning Contractors & Sales and Installation, Heating Contractors & Sales, Service, Installation', 'USDA description':'Air Conditioning Contractors & Sales and Installation','IRS Description':'Heating, Plumbing, A/C', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '1731':{'combined description':'Electrical Contractors', 'USDA description':'Electrical Contractors','IRS Description':'Electrical Contractors', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '1740':{'combined description':'Insulation & Contractors, Masonry, Stonework Contractors, Plastering Contractors, Stonework and Masonry Contractors, Tile Settings Contractors', 'USDA description':'Insulation & Contractors','IRS Description':'Masonry, Stonework, and Plaster', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '1750':{'combined description':'Carpentry Contractors', 'USDA description':'Carpentry Contractors','IRS Description':'Carpentry Contractors', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '1761':{'combined description':'Roofing & Contractors, Sheet Metal Work & Contractors, Siding & Contractors', 'USDA description':'Roofing - Contractors','IRS Description':'Roofing/Siding, Sheet Metal', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '1771':{'combined description':'Contractors & Concrete Work', 'USDA description':'Contractors & Concrete Work','IRS Description':'Concrete Work Contractors', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '1799':{'combined description':'Contractors & Special Trade, Not Elsewhere Classified', 'USDA description':'Contractors & Special Trade, Not Elsewhere Classified','IRS Description':'Special Trade Contractors', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '2741':{'combined description':'Miscellaneous Publishing and Printing', 'USDA description':'Miscellaneous Publishing and Printing','IRS Description':'Miscellaneous Publishing and Printing', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '2791':{'combined description':'Typesetting, Plate Making, & Related Services', 'USDA description':'Typesetting, Plate Making, & Related Services','IRS Description':'Typesetting, Plate Making, and Related Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '2842':{'combined description':'Specialty Cleaning, Polishing, and Sanitation Preparations', 'USDA description':'Specialty Cleaning, Polishing, and Sanitation Preparations','IRS Description':'Specialty Cleaning', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3000':{'combined description':'UNITED AIRLINES', 'USDA description':'UNITED AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3001':{'combined description':'AMERICAN AIRLINES', 'USDA description':'AMERICAN AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3002':{'combined description':'PAN AMERICAN - PAN AM', 'USDA description':'PAN AMERICAN','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3003':{'combined description':'EURO-FLY', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3004':{'combined description':'TRANS WORLD AIRLINES', 'USDA description':'TRANS WORLD AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3005':{'combined description':'BRITSH AIRWAYS - BRITISH A', 'USDA description':'BRITISH AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3006':{'combined description':'JAPAN AIR LINES', 'USDA description':'JAPAN AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3007':{'combined description':'AIR FRANCE', 'USDA description':'AIR FRANCE','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3008':{'combined description':'LUFTHANSA', 'USDA description':'LUFTHANSA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3009':{'combined description':'AIR CANADA - AIR CAN', 'USDA description':'AIR CANADA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3010':{'combined description':'KLM', 'USDA description':'KLM (ROYAL DUTCH AIRLINES)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3011':{'combined description':'AEROFLOT', 'USDA description':'AEORFLOT','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3012':{'combined description':'QANTAS AIR', 'USDA description':'QUANTAS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3013':{'combined description':'ALITALIA', 'USDA description':'ALITALIA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3014':{'combined description':'SAUDI ARABIAN AIRLINES', 'USDA description':'SAUDIA ARABIAN AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3015':{'combined description':'SWISS INTERNATIONAL AIR LINES-SWISS AIR', 'USDA description':'SWISSAIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3016':{'combined description':'SCANDINAVIAN AIRLINE SYSTEM (SAS)', 'USDA description':'SAS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3017':{'combined description':'SOUTH AFRICAN AIRWAYS', 'USDA description':'SOUTH AFRICAN AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3018':{'combined description':'VARIG AIR (BRAZIL)', 'USDA description':'VARIG (BRAZIL)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3019':{'combined description':'GERMANWINGS--GRMNWGAIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3020':{'combined description':'AIR INDIA', 'USDA description':'AIR-INDIA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3021':{'combined description':'AIR ALGERIE', 'USDA description':'AIR ALGERIE','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3022':{'combined description':'PHILIPPINE AIRLINES', 'USDA description':'PHILIPPINE AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3023':{'combined description':'MEXICANA', 'USDA description':'MEXICANA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3024':{'combined description':'PAKISTAN INTERNATIONAL', 'USDA description':'PAKISTAN INTERNATIONAL','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3025':{'combined description':'AIR NEW ZEALAND LTD. INTERNATIONAL', 'USDA description':'AIR NEW ZEALAND','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3026':{'combined description':'EMIRATES AIRLINES', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3027':{'combined description':'UNION DE TRANSPORTS AERIENS (UTA/INTERAI', 'USDA description':'UTA/INTERAIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3028':{'combined description':'AIR MALTA', 'USDA description':'AIR MALTA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3029':{'combined description':'SN BRUSSELS AIRLINES - SNBRU AIR', 'USDA description':'SABENA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3030':{'combined description':'AEROLINEAS ARGENTINAS', 'USDA description':'AEROLINEAS ARGENTINAS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3031':{'combined description':'OLYMPIC AIRWAYS', 'USDA description':'OLYMPIC AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3032':{'combined description':'EL AL', 'USDA description':'EL AL','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3033':{'combined description':'ANSETT AIRLINES', 'USDA description':'ANSETT AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3034':{'combined description':'TRANS AUSTRALIAN AIRWAYS (TAA)', 'USDA description':'AUSTRAINLIAN AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3035':{'combined description':'TAP AIRLINE (PORTUGAL)', 'USDA description':'TAP (PORTUGAL)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3036':{'combined description':'VASP AIR (BRAZIL)', 'USDA description':'VASP (BRAZIL)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3037':{'combined description':'EGYPTAIR', 'USDA description':'EGYPTAIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3038':{'combined description':'KUWAIT AIRWAYS', 'USDA description':'KUWAIT AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3039':{'combined description':'AVIANCA', 'USDA description':'AVIANCA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3040':{'combined description':'GULF AIR (BAHRAIN)', 'USDA description':'GULF AIR (BAHRAIN)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3041':{'combined description':'BALKAN-BULGARIAN AIRLINES', 'USDA description':'BALKAN-BULGARIAN AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3042':{'combined description':'FINNAIR', 'USDA description':'FINNAIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3043':{'combined description':'AER LINGUS', 'USDA description':'AER LINGUS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3044':{'combined description':'AIR LANKA', 'USDA description':'AIR LANKA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3045':{'combined description':'NIGERIA AIRWAYS', 'USDA description':'NIGERIA AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3046':{'combined description':'CRUZEIRO DO SUL AIR (BRAZIL)', 'USDA description':'CRUZEIRO DO SUL (BRAZIJ)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3047':{'combined description':'THY AIRLINE (TURKEY)', 'USDA description':'THY (TURKEY)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3048':{'combined description':'AIRMARO', 'USDA description':'ROYAL AIR MAROC','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3049':{'combined description':'TUNIS AIR', 'USDA description':'TUNIS AIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3050':{'combined description':'ICELANDAIR', 'USDA description':'ICELANDAIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3051':{'combined description':'AUSTRIAN AIRLINES', 'USDA description':'AUSTRIAN AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3052':{'combined description':'LAN AIRLINES-LANAIR', 'USDA description':'LANCHILE','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3053':{'combined description':'AVIACO AIR (SPAIN)', 'USDA description':'AVIACO (SPAIN)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3054':{'combined description':'LADECO AIR (CHILE)', 'USDA description':'LADECO (CHILE)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3055':{'combined description':'LAB AIRLINE (BOLIVIA)', 'USDA description':'LAB (BOLIVIA)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3056':{'combined description':'QUEBECAIRE', 'USDA description':'QUEBECAIRE','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3057':{'combined description':'EAST/WEST AIRLINES (AUSTRALIA)', 'USDA description':'EASTWEST AIRLINES (AUSTRALIA)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3058':{'combined description':'DELTA', 'USDA description':'DELTA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3059':{'combined description':'DBA AIRLINES - DBA AIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3060':{'combined description':'NORTHWEST AIRLINES', 'USDA description':'NORTHWEST','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3061':{'combined description':'CONTINENTAL', 'USDA description':'CONTINENTAL','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3062':{'combined description':'HAPAG-LLOYD EXPRESS - HLX', 'USDA description':'WESTERN','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3063':{'combined description':'US AIRWAYS', 'USDA description':'US AIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3064':{'combined description':'ADRIA AIRWAYS', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3065':{'combined description':'AIRINTER', 'USDA description':'AIRINTER','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3066':{'combined description':'SOUTHWEST AIRLINES', 'USDA description':'SOUTHWEST','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3067':{'combined description':'VANGUARD AIRLINES', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3068':{'combined description':'AIR ASTANA-AIRSTANA', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3069':{'combined description':'AIR EUROPE', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3070':{'combined description':'PACIFIC SOUTHWEST AIRLINE', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3071':{'combined description':'AIR BRITISH COLUMBIA', 'USDA description':'AIR BRITISH COLUBIA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3072':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3073':{'combined description':'AIR CAL', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3074':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3075':{'combined description':'SINGAPORE AIRLINES', 'USDA description':'SINGAPORE AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3076':{'combined description':'AEROMEXICO', 'USDA description':'AEROMEXICO','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3077':{'combined description':'THAI AIRWAYS', 'USDA description':'THAI AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3078':{'combined description':'CHINA AIRLINES', 'USDA description':'CHINA AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3079':{'combined description':'JETSTAR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3080':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3081':{'combined description':'NORDAIR', 'USDA description':'NORDAIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3082':{'combined description':'KOREAN AIRLINES', 'USDA description':'KOREAN AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3083':{'combined description':'AIR AFRIQUE - AIR AFRIQ', 'USDA description':'AIR AFRIGUE','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3084':{'combined description':'EVA AIRLINES', 'USDA description':'EVA AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3085':{'combined description':'MIDWEST EXPRESS AIRLINES - MIDWEST', 'USDA description':'MIDWEST EXPRESS AIRLINES, INC.','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3086':{'combined description':'CARNIVAL AIRLINES', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3087':{'combined description':'METRO AIRLINES', 'USDA description':'METRO AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3088':{'combined description':'CROATIA AIR - CROATIA', 'USDA description':'CROATIA AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3089':{'combined description':'TRANSAERO', 'USDA description':'TRANSAERO','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3090':{'combined description':'UNI AIRWAYS', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3091':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3092':{'combined description':'MIDWAY AIRLINES', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3093':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3094':{'combined description':'ZAMBIA AIRWAYS', 'USDA description':'ZAMBIA AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3095':{'combined description':'WARDAIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3096':{'combined description':'AIR ZIMBABWE', 'USDA description':'AIR ZIMBABWE','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3097':{'combined description':'SPANAIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3098':{'combined description':'ASIANA AIRLINES - ASIANA', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3099':{'combined description':'CATHAY PACIFIC', 'USDA description':'CATHAY PACIFIC','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3100':{'combined description':'MALAYSIAN AIRLINE SYSTEM', 'USDA description':'MALAYSIAN AIRLINE SYSTEM','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3101':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3102':{'combined description':'IBERIA', 'USDA description':'IBERIA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3103':{'combined description':'GARUDA AIR (INDONESIA)', 'USDA description':'GARUDA (INDONESIA)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3104':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3105':{'combined description':'PIEDMONT', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3106':{'combined description':'BRAATHENS AIR S.A.F.E. (NORWAY)', 'USDA description':'BRAATHENS S.A.F.E. (NORWAY)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3107':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3108':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3109':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3110':{'combined description':'WINGS AIRWAYS', 'USDA description':'WINGS AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3111':{'combined description':'BRITISH MIDLAND', 'USDA description':'BRITISH MIDLAND','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3112':{'combined description':'WINDWARD ISLAND', 'USDA description':'WINDWARD ISLAND','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3113':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3114':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3115':{'combined description':'TOWER AIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3116':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3117':{'combined description':'VENEZOLANA INTERNATIONAL DE AVIACION (VI', 'USDA description':'VIASA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3118':{'combined description':'VALLEY AIRLINES', 'USDA description':'VALLEY AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3119':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3120':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3121':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3122':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3123':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3124':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3125':{'combined description':'TAN AIRLINES', 'USDA description':'TAN','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3126':{'combined description':'TALAIR', 'USDA description':'TALAIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3127':{'combined description':'TACA INTERNATIONAL', 'USDA description':'TACA INTERNATIONAL','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3128':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3129':{'combined description':'SURINAM AIRWAYS', 'USDA description':'SURINAM AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3130':{'combined description':'SUNWORLD INTERNATIONAL AIR', 'USDA description':'SUN WORLD INTERNATIONAL','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3131':{'combined description':'VLM AIRLINES', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3132':{'combined description':'FRONTIER AIRLINES - FRONTIER', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3133':{'combined description':'SUNBELT AIRLINES', 'USDA description':'SUNBELT AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3134':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3135':{'combined description':'SUDAN AIRWAYS', 'USDA description':'SUDAN AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3136':{'combined description':'QATAR AIRWAYS', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3137':{'combined description':'SINGLETION AIR', 'USDA description':'SINGLETON','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3138':{'combined description':'SIMMONS AIRLINES', 'USDA description':'SIMMONS AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3139':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3140':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3141':{'combined description':'SEAIR ALASKA', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3142':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3143':{'combined description':'SCENIC AIRLINES', 'USDA description':'SCENIC AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3144':{'combined description':'VIRGIN ATLANTIC', 'USDA description':'VIRGIN ATLANTIC','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3145':{'combined description':'SAN JUAN AIRLINES', 'USDA description':'SAN JUAN AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3146':{'combined description':'LUXAIR', 'USDA description':'LUXAIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3147':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3148':{'combined description':'AIR LITTORAL, S.A.', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3149':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3150':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3151':{'combined description':'AIR ZAIRE', 'USDA description':'AIR ZAIRE','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3152':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3153':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3154':{'combined description':'PRINCEVILLE', 'USDA description':'PRINCEVILLE','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3155':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3156':{'combined description':'GO FLY, LTD.', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3157':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3158':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3159':{'combined description':'PROVINCETOWN-BOSTON AIRWAYS (PBA) AIRLIN', 'USDA description':'PBA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3160':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3161':{'combined description':'ALL NIPON AIRWAYS', 'USDA description':'ALL NIPPON AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3162':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3163':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3164':{'combined description':'NORONTAIR', 'USDA description':'NORONTAIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3165':{'combined description':'NEW YORK HELICOPTER', 'USDA description':'NEW YORK HELICOPTER','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3166':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3167':{'combined description':'AERO CONTINENTE - AERO CONT', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3168':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3169':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3170':{'combined description':'MOUNT COOK', 'USDA description':'NOUNT COOK','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3171':{'combined description':'CANADIAN AIRLINES INTERNATIONAL', 'USDA description':'CANADIAN AIRLINES INTERNATIONAL','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3172':{'combined description':'NATIONAIR', 'USDA description':'NATIONAIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3173':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3174':{'combined description':'JETBLUE AIRLINES', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3175':{'combined description':'MIDDLE EAST AIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3176':{'combined description':'METROFLIGHT AIRLINES', 'USDA description':'METROFLIGHT AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3177':{'combined description':'AIRTRAN AIRWAYS - AIRTRAN A', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3178':{'combined description':'MESA AIR', 'USDA description':'MESA AIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3179':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3180':{'combined description':'WESTJETAIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3181':{'combined description':'MALEV AIR', 'USDA description':'MALEV','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3182':{'combined description':'LOT (POLISH AIRLINES)', 'USDA description':'LOT (POLAND)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3183':{'combined description':'OMANAIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3184':{'combined description':'LIAT', 'USDA description':'LIAT','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3185':{'combined description':'LINEA AEROPOSTAL VENEZOLANA (LAV)', 'USDA description':'LAV (VENEZUELA)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3186':{'combined description':'LINEAS AEREAS PARAGUAYAS (LAP)', 'USDA description':'LAP (PARAGUAY)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3187':{'combined description':'LACSA AIR (COSTA RICA)', 'USDA description':'LACSA (COSTA RICA)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3188':{'combined description':'VIRGINEXPAIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3189':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3190':{'combined description':'JUGOSLAV AIR', 'USDA description':'JUGOSLAV AIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3191':{'combined description':'ISLAND AIRLINES', 'USDA description':'ISLAND AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3192':{'combined description':'IRAN AIR', 'USDA description':'IRAN AIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3193':{'combined description':'INDIAN AIRLINES', 'USDA description':'INDIAN AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3194':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3195':{'combined description':'HOLIDAY AIRLINES', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3196':{'combined description':'HAWAIIAN AIR', 'USDA description':'HAWAIIAN AIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3197':{'combined description':'HAVASU AIRLINES', 'USDA description':'HAVASU AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3198':{'combined description':'HARBOR AIRLINES', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3199':{'combined description':'SERVICIOS AEREOS MILITARES', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3200':{'combined description':'GUYANA AIRWAYS', 'USDA description':'FUYANA AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3201':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3202':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3203':{'combined description':'GOLDEN PACIFIC AIR', 'USDA description':'GOLDEN PACIFIC AIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3204':{'combined description':'FREEDOM AIRLINES', 'USDA description':'FREEDOM AIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3205':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3206':{'combined description':'CHINA EASTERN AIRLINES - CHINAEAST', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3207':{'combined description':'EMPRESA ECUATORIANA', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3208':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3209':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3210':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3211':{'combined description':'NORWEGIAN AIR SHUTTLE - NORWEGIAN', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3212':{'combined description':'DOMINICANA DE AVIACION', 'USDA description':'DOMINICANA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3213':{'combined description':'MALMO AVIATION', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3214':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3215':{'combined description':'DAN AIR SERVICES', 'USDA description':'DAN AIR SERVICES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3216':{'combined description':'CUMBERLAND AIRLINES', 'USDA description':'CUMBERLAND AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3217':{'combined description':'CESKOSLOVENSKE AEROLINIE (CSA)', 'USDA description':'CSA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3218':{'combined description':'CROWN AIR', 'USDA description':'CROWN AIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3219':{'combined description':'COMPANIA PANAMENA DE AVIACION (COPA)', 'USDA description':'COPA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3220':{'combined description':'COMPANIA FAUCETT', 'USDA description':'COMPANIA FAUCETT','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3221':{'combined description':'TRANSPORTES AEROS MILITARES ECUATORIANOS', 'USDA description':'TRANSPORTES AEROS MILITARES ECCUATORANOS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3222':{'combined description':'COMMAND AIRWAYS', 'USDA description':'COMMAND AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3223':{'combined description':'COMAIR', 'USDA description':'COMAIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3224':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3225':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3226':{'combined description':'SKYWAYS AIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3227':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3228':{'combined description':'CAYMAN AIRWAYS', 'USDA description':'CAYMAN AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3229':{'combined description':'SAETA (SOCIEDAD ECUATORIANOS DE TRANSPOR', 'USDA description':'SAETA SOCIAEDAD ECUATORIANOS DE TRANSPORTES AEREOS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3230':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3231':{'combined description':'SAHSA (SERVICIO AERO DE HONDURAS)', 'USDA description':'SASHA SERVICIO AERO DE HONDURAS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3232':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3233':{'combined description':'CAPITOL AIR', 'USDA description':'CAPITOL AIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3234':{'combined description':'CARIBBEAN AIRLINES', 'USDA description':'BWIA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3235':{'combined description':'BROCKWAY AIR', 'USDA description':'BROKWAY AIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3236':{'combined description':'AIR ARABIA', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3237':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3238':{'combined description':'BEMIDJI AVIATION', 'USDA description':'BEMIDJI AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3239':{'combined description':'BAR HARBOR AIRLINES', 'USDA description':'BAR HARBOR AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3240':{'combined description':'BAHAMASAIR', 'USDA description':'BAHAMASAIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3241':{'combined description':'AVIATECA AIR (GUATEMALA)', 'USDA description':'AVIATECA (GUATEMALA)','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3242':{'combined description':'CARIBBEAN AIRLINES--CARIBBEAN', 'USDA description':'AVENSA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3243':{'combined description':'AUSTRIAN AIR SERVICE', 'USDA description':'AUSTRIAN AIR SERVICE','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3244':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3245':{'combined description':'EASYJET AIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3246':{'combined description':'RYANAIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3247':{'combined description':'GOL AIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3248':{'combined description':'TAM AIR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3249':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3250':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3251':{'combined description':'ALOHA AIR', 'USDA description':'ALOHA AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3252':{'combined description':'ANTILEAN AIRLINES (ALM)', 'USDA description':'ALM','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3253':{'combined description':'AMERICA WEST', 'USDA description':'AMERICA WEST','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3254':{'combined description':'U.S. AIR SHUTTLE', 'USDA description':'TRUMP AIRLINE','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3255':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3256':{'combined description':'ALASKA AIRLINES INC.', 'USDA description':'ALASKA AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3257':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3258':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3259':{'combined description':'AMERICAN TRANS AIR', 'USDA description':'AMERICAN TRANS AIR','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3260':{'combined description':'SPIRIT AIRLINES', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3261':{'combined description':'AIR CHINA', 'USDA description':'AIR CHINA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3262':{'combined description':'RENO AIR', 'USDA description':'RENO AIR, INC.','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3263':{'combined description':'AERO SERVICIO CARABOBO - ASERCA', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3264':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3265':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3266':{'combined description':'AIR SEYCHELLES', 'USDA description':'AIR SEYCHELLES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3267':{'combined description':'AIR PANAMA INTERNATIONAL', 'USDA description':'AIR PANAMA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3268':{'combined description':'AIR PACIFIC', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3269':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3270':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3271':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3272':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3273':{'combined description':'RICA HOTELS', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3274':{'combined description':'INTER NOR HOTELS', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3275':{'combined description':'AIR NEVADA', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3276':{'combined description':'AIR MIDWEST', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3277':{'combined description':'AIR MADAGASCAR', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3278':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3279':{'combined description':'AIR LA', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3280':{'combined description':'AIR JAMAICA', 'USDA description':'AIR JAMAICA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3281':{'combined description':'AIR DJIBOUTI', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3282':{'combined description':'AIR DJIBOUTI', 'USDA description':'AIR DJIBOUTI','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3283':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3284':{'combined description':'AERO VIRGIN ISLANDS', 'USDA description':'AERO VIRGIN ISLANDS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3285':{'combined description':'AERO PERU', 'USDA description':'AERO PERU','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3286':{'combined description':'AERO NICARAGUENSIS', 'USDA description':'AEROLINEAS NICARAGUENSIS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3287':{'combined description':'AERO COACH AVIATION', 'USDA description':'AERO COACH AVAIATION','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3288':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3289':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3290':{'combined description':'airlines', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3291':{'combined description':'ARIANA AFGHAN', 'USDA description':'ARIANA AFGHAN','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3292':{'combined description':'CYPRUS AIRWAYS', 'USDA description':'CYPRUS AIRWAYS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3293':{'combined description':'EQUATORIANA', 'USDA description':'ECUATORIANA','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3294':{'combined description':'ETHIOPIAN AIRLINES', 'USDA description':'ETHIOPIAN AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3295':{'combined description':'KENYA AIRWAYS', 'USDA description':'KENYA AIRLINES','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3296':{'combined description':'AIR BERLIN - AIRBERLIN', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3297':{'combined description':'TAROM ROMANIAN AIR TRANSPORT', 'USDA description':'','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3298':{'combined description':'AIR MAURITIUS', 'USDA description':'AIR MAURITIUS','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3299':{'combined description':'WIDEROE\'S FLYVESELSKAP', 'USDA description':'WIDERO\'S FLYVESELSKAP','IRS Description':'Airlines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3351':{'combined description':'AFFILIATED AUTO RENTAL', 'USDA description':'AFFILIATED AUTO RENTAL','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3352':{'combined description':'AMERICAN INTL RENT-A-CAR', 'USDA description':'AMERICAN INTL RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3353':{'combined description':'BROOKS RENT-A-CAR', 'USDA description':'BROOKS RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3354':{'combined description':'ACTION AUTO RENTAL', 'USDA description':'ACTION AUTO RENTAL','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3355':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3356':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3357':{'combined description':'HERTZ RENT-A-CAR', 'USDA description':'HERTZ RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3358':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3359':{'combined description':'PAYLESS CAR RENTAL', 'USDA description':'PAYLESS CAR RENTAL','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3360':{'combined description':'SNAPPY CAR RENTAL', 'USDA description':'SNAPPY CAR RENTAL','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3361':{'combined description':'AIRWAYS RENT-A-CAR', 'USDA description':'AIRWAYS RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3362':{'combined description':'ALTRA AUTO RENTAL', 'USDA description':'ALTRA AUTO RENTAL','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3363':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3364':{'combined description':'AGENCY RENT-A-CAR', 'USDA description':'AGENCY RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3365':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3366':{'combined description':'BUDGET RENT-A-CAR', 'USDA description':'BUDGET RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3367':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3368':{'combined description':'HOLIDAY RENT-A-WRECK', 'USDA description':'HOLIDAY RENT-A-WRECK','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3369':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3370':{'combined description':'RENT-A-WRECK', 'USDA description':'RENT-A-WRECK','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3371':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3372':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3373':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3374':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3375':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3376':{'combined description':'AJAX RENT-A-CAR', 'USDA description':'AJAX RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3377':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3378':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3379':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3380':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3381':{'combined description':'EUROP CAR', 'USDA description':'EUROP CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3382':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3383':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3384':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3385':{'combined description':'TROPICAL RENT-A-CAR', 'USDA description':'TROPICAL RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3386':{'combined description':'SHOWCASE RENTAL CARS', 'USDA description':'SHOWCASE RENTAL CARS','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3387':{'combined description':'ALAMO RENT-A-CAR', 'USDA description':'ALAMO RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3388':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3389':{'combined description':'AVIS RENT-A-CAR', 'USDA description':'AVIS RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3390':{'combined description':'DOLLAR RENT-A-CAR', 'USDA description':'DOLLAR RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3391':{'combined description':'EUROPE BY CAR', 'USDA description':'EUROPE BY CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3392':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3393':{'combined description':'NATIONAL CAR RENTAL', 'USDA description':'NATIONAL CAR RENTAL','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3394':{'combined description':'KEMWELL GROUP RENT-A-CAR', 'USDA description':'KEMWELL GROUP RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3395':{'combined description':'THRIFTY RENT-A-CAR', 'USDA description':'THRIFTY RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3396':{'combined description':'TILDEN TENT-A-CAR', 'USDA description':'TILDEN TENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3397':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3398':{'combined description':'ECONO-CAR RENT-A-CAR', 'USDA description':'ECONO-CAR RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3399':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3400':{'combined description':'AUTO HOST COST CAR RENTALS', 'USDA description':'AUTO HOST COST CAR RENTALS','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3401':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3402':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3403':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3404':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3405':{'combined description':'ENTERPRISE RENT-A-CAR', 'USDA description':'ENTERPRISE RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3406':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3407':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3408':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3409':{'combined description':'GENERAL RENT-A-CAR', 'USDA description':'GENERAL RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3410':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3411':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3412':{'combined description':'A-1 RENT-A-CAR', 'USDA description':'A-1 RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3413':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3414':{'combined description':'GODFREY NATL RENT-A-CAR', 'USDA description':'GODFREY NATL RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3415':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3416':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3417':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3418':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3419':{'combined description':'ALPHA RENT-A-CAR', 'USDA description':'ALPHA RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3420':{'combined description':'ANSA INTL RENT-A-CAR', 'USDA description':'ANSA INTL RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3421':{'combined description':'ALLSTAE RENT-A-CAR', 'USDA description':'ALLSTAE RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3422':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3423':{'combined description':'AVCAR RENT-A-CAR', 'USDA description':'AVCAR RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3424':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3425':{'combined description':'AUTOMATE RENT-A-CAR', 'USDA description':'AUTOMATE RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3426':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3427':{'combined description':'AVON RENT-A-CAR', 'USDA description':'AVON RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3428':{'combined description':'CAREY RENT-A-CAR', 'USDA description':'CAREY RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3429':{'combined description':'INSURANCE RENT-A-CAR', 'USDA description':'INSURANCE RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3430':{'combined description':'MAJOR RENT-A-CAR', 'USDA description':'MAJOR RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3431':{'combined description':'REPLACEMENT RENT-A-CAR', 'USDA description':'REPLACEMENT RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3432':{'combined description':'RESERVE RENT-A-CAR', 'USDA description':'RESERVE RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3433':{'combined description':'UGLY DUCKLING RENT-A-CAR', 'USDA description':'UGLY DUCKLING RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3434':{'combined description':'USA RENT-A-CAR', 'USDA description':'USA RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3435':{'combined description':'VALUE RENT-A-CAR', 'USDA description':'VALUE RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3436':{'combined description':'AUTOHANSA RENT-A-CAR', 'USDA description':'AUTOHANSA RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3437':{'combined description':'CITE RENT-A-CAR', 'USDA description':'CITE RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3438':{'combined description':'INTERENT RENT-A-CAR', 'USDA description':'INTERENT RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3439':{'combined description':'MILLEVILLE RENT-A-CAR', 'USDA description':'MILLEVILLE RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3440':{'combined description':'VIA ROUTE RENT-A-CAR', 'USDA description':'VIA ROUTE RENT-A-CAR','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3441':{'combined description':'Car Rental', 'USDA description':'','IRS Description':'Car Rental', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3501':{'combined description':'HOLIDAY INNS, HOLIDAY INN EXPRESS', 'USDA description':'HOLIDAY INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3502':{'combined description':'BEST WESTERN HOTELS', 'USDA description':'BEST WESTERN HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3503':{'combined description':'SHERATON HOTELS', 'USDA description':'SHERATON HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3504':{'combined description':'HILTON HOTELS', 'USDA description':'HILTON HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3505':{'combined description':'FORTE HOTELS', 'USDA description':'FORTE HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3506':{'combined description':'GOLDEN TULIP HOTELS', 'USDA description':'GOLDEN TULIP HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3507':{'combined description':'FRIENDSHIP INNS', 'USDA description':'FRIENDSHIP INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3508':{'combined description':'QUALITY INNS, QUALITY SUITES', 'USDA description':'QUALITY INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3509':{'combined description':'MARRIOTT HOTELS', 'USDA description':'MARRIOTT HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3510':{'combined description':'DAYS INN, DAYSTOP', 'USDA description':'DAYS INN','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3511':{'combined description':'ARABELLA HOTELS', 'USDA description':'ARABELLA HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3512':{'combined description':'INTER-CONTINENTAL HOTELS', 'USDA description':'INTER-CONTINENTAL HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3513':{'combined description':'WESTIN HOTELS', 'USDA description':'WESTIN HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3514':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3515':{'combined description':'RODEWAY INNS', 'USDA description':'RODEWAY INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3516':{'combined description':'LA QUINTA MOTOR INNS', 'USDA description':'LA QUINTA MOTOR INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3517':{'combined description':'AMERICANA HOTELS', 'USDA description':'AMERICANA HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3518':{'combined description':'SOL HOTELS', 'USDA description':'SOL HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3519':{'combined description':'PULLMAN INTERNATIONAL HOTELS', 'USDA description':'PULLMAN INTERNATIONAL HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3520':{'combined description':'MERIDIEN HOTELS', 'USDA description':'MERIDIEN HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3521':{'combined description':'CREST HOTELS (see FORTE HOTELS)', 'USDA description':'CREST HOTELS (see FORTE HOTELS)','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3522':{'combined description':'TOKYO HOTEL', 'USDA description':'TOKYO HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3523':{'combined description':'PENNSULA HOTEL', 'USDA description':'PENNSULA HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3524':{'combined description':'WELCOMGROUP HOTELS', 'USDA description':'WELCOMGROUP HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3525':{'combined description':'DUNFEY HOTELS', 'USDA description':'DUNFEY HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3526':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3527':{'combined description':'DOWNTOWNER-PASSPORT HOTEL', 'USDA description':'DOWNTOWNER-PASSPORT HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3528':{'combined description':'RED LION HOTELS, RED LION INNS', 'USDA description':'RED LION HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3529':{'combined description':'CP HOTELS', 'USDA description':'CP HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3530':{'combined description':'RENAISSANCE HOTELS, STOUFFER HOTELS', 'USDA description':'RENAISSANCE HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3531':{'combined description':'ASTIR HOTELS', 'USDA description':'ASTIR HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3532':{'combined description':'SUN ROUTE HOTELS', 'USDA description':'SUN ROUTE HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3533':{'combined description':'HOTEL IBIS', 'USDA description':'HOTEL IBIS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3534':{'combined description':'SOUTHERN PACIFIC HOTELS', 'USDA description':'SOUTHERN PACIFIC HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3535':{'combined description':'HILTON INTERNATIONAL', 'USDA description':'HILTON INTERNATIONAL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3536':{'combined description':'AMFAC HOTELS', 'USDA description':'AMFAC HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3537':{'combined description':'ANA HOTEL', 'USDA description':'ANA HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3538':{'combined description':'CONCORDE HOTELS', 'USDA description':'CONCORDE HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3539':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3540':{'combined description':'IBEROTEL HOTELS', 'USDA description':'IBEROTEL HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3541':{'combined description':'HOTEL OKURA', 'USDA description':'HOTEL OKURA','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3542':{'combined description':'ROYAL HOTELS', 'USDA description':'ROYAL HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3543':{'combined description':'FOUR SEASONS HOTELS', 'USDA description':'FOUR SEASONS HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3544':{'combined description':'CIGA HOTELS', 'USDA description':'CIGA HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3545':{'combined description':'SHANGRI-LA INTERNATIONAL', 'USDA description':'SHANGRI-LA INTERNATIONAL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3546':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3547':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3548':{'combined description':'HOTELES MELIA', 'USDA description':'HOTELES MELIA','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3549':{'combined description':'AUBERGE DES GOVERNEURS', 'USDA description':'AUBERGE DES GOVERNEURS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3550':{'combined description':'REGAL 8 INNS', 'USDA description':'REGAL 8 INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3551':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3552':{'combined description':'COAST HOTELS', 'USDA description':'COAST HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3553':{'combined description':'PARK INNS INTERNATIONAL', 'USDA description':'PARK INNS INTERNATIONAL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3554':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3555':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3556':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3557':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3558':{'combined description':'JOLLY HOTELS', 'USDA description':'JOLLY HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3559':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3560':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3561':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3562':{'combined description':'COMFORT INNS', 'USDA description':'COMFORT INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3563':{'combined description':'JOURNEY\'S END MOTLS', 'USDA description':'JOURNEY\'S END MOTLS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3564':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3565':{'combined description':'RELAX INNS', 'USDA description':'RELAX INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3566':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3567':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3568':{'combined description':'LADBROKE HOTELS', 'USDA description':'LADBROKE HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3569':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3570':{'combined description':'FORUM HOTELS', 'USDA description':'FORUM HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3571':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3572':{'combined description':'MIYAKO HOTELS', 'USDA description':'MIYAKO HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3573':{'combined description':'SANDMAN HOTELS', 'USDA description':'SANDMAN HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3574':{'combined description':'VENTURE INNS', 'USDA description':'VENTURE INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3575':{'combined description':'VAGABOND HOTELS', 'USDA description':'VAGABOND HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3576':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3577':{'combined description':'MANDARIN ORIENTAL HOTEL', 'USDA description':'MANDARIN ORIENTAL HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3578':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3579':{'combined description':'HOTEL MERCURE', 'USDA description':'HOTEL MERCURE','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3580':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3581':{'combined description':'DELTA HOTEL', 'USDA description':'DELTA HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3582':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3583':{'combined description':'SAS HOTELS', 'USDA description':'SAS HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3584':{'combined description':'PRINCESS HOTELS INTERNATIONAL', 'USDA description':'PRINCESS HOTELS INTERNATIONAL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3585':{'combined description':'HUNGAR HOTELS', 'USDA description':'HUNGAR HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3586':{'combined description':'SOKOS HOTELS', 'USDA description':'SOKOS HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3587':{'combined description':'DORAL HOTELS', 'USDA description':'DORAL HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3588':{'combined description':'HELMSLEY HOTELS', 'USDA description':'HELMSLEY HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3589':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3590':{'combined description':'FAIRMONT HOTELS', 'USDA description':'FAIRMONT HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3591':{'combined description':'SONESTA HOTELS', 'USDA description':'SONESTA HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3592':{'combined description':'OMNI HOTELS', 'USDA description':'OMNI HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3593':{'combined description':'CUNARD HOTELS', 'USDA description':'CUNARD HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3594':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3595':{'combined description':'HOSPITALITY INTERNATIONAL', 'USDA description':'HOSPITALITY INTERNATIONAL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3596':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3597':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3598':{'combined description':'REGENT INTERNATIONAL HOTELS', 'USDA description':'REGENT INTERNATIONAL HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3599':{'combined description':'PANNONIA HOTELS', 'USDA description':'PANNONIA HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3600':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3601':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3602':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3603':{'combined description':'NOAH\'S HOTELS', 'USDA description':'NOAH\'S HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3604':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3605':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3606':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3607':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3608':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3609':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3610':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3611':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3612':{'combined description':'MOVENPICK HOTELS', 'USDA description':'MOVENPICK HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3613':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3614':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3615':{'combined description':'TRAVELODGE', 'USDA description':'TRAVELODGE','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3616':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3617':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3618':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3619':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3620':{'combined description':'TELFORD INTERNATIONAL', 'USDA description':'TELFORD INTERNATIONAL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3621':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3622':{'combined description':'MERLIN HOTELS', 'USDA description':'MERLIN HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3623':{'combined description':'DORINT HOTELS', 'USDA description':'DORINT HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3624':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3625':{'combined description':'HOTLE UNIVERSALE', 'USDA description':'HOTLE UNIVERSALE','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3626':{'combined description':'PRINCE HOTELS', 'USDA description':'PRINCE HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3627':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3628':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3629':{'combined description':'DAN HOTELS', 'USDA description':'DAN HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3630':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3631':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3632':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3633':{'combined description':'RANK HOTELS', 'USDA description':'RANK HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3634':{'combined description':'SWISSOTEL', 'USDA description':'SWISSOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3635':{'combined description':'RESO HOTELS', 'USDA description':'RESO HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3636':{'combined description':'SAROVA HOTELS', 'USDA description':'SAROVA HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3637':{'combined description':'RAMADA INNS, RAMADA LIMITED', 'USDA description':'RAMADA INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3638':{'combined description':'HO JO INN, HOWARD JOHNSON', 'USDA description':'HO JO INN','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3639':{'combined description':'MOUNT CHARLOTTE THISTLE', 'USDA description':'MOUNT CHARLOTTE THISTLE','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3640':{'combined description':'HYATT HOTEL', 'USDA description':'HYATT HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3641':{'combined description':'SOFITEL HOTELS', 'USDA description':'SOFITEL HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3642':{'combined description':'NOVOTEL HOTELS', 'USDA description':'NOVOTEL HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3643':{'combined description':'STEIGENBERGER HOTELS', 'USDA description':'STEIGENBERGER HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3644':{'combined description':'ECONO LODGES', 'USDA description':'ECONO LODGES','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3645':{'combined description':'QUEENS MOAT HOUSES', 'USDA description':'QUEENS MOAT HOUSES','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3646':{'combined description':'SWALLOW HOTELS', 'USDA description':'SWALLOW HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3647':{'combined description':'HUSA HOTELS', 'USDA description':'HUSA HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3648':{'combined description':'DE VERE HOTELS', 'USDA description':'DE VERE HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3649':{'combined description':'RADISSON HOTELS', 'USDA description':'RADISSON HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3650':{'combined description':'RED ROOK INNS', 'USDA description':'RED ROOK INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3651':{'combined description':'IMPERIAL LONDON HOTEL', 'USDA description':'IMPERIAL LONDON HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3652':{'combined description':'EMBASSY HOTELS', 'USDA description':'EMBASSY HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3653':{'combined description':'PENTA HOTELS', 'USDA description':'PENTA HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3654':{'combined description':'LOEWS HOTELS', 'USDA description':'LOEWS HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3655':{'combined description':'SCANDIC HOTELS', 'USDA description':'SCANDIC HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3656':{'combined description':'SARA HOTELS', 'USDA description':'SARA HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3657':{'combined description':'OBEROI HOTELS', 'USDA description':'OBEROI HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3658':{'combined description':'OTANI HOTELS', 'USDA description':'OTANI HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3659':{'combined description':'TAJ HOTELS INTERNATIONAL', 'USDA description':'TAJ HOTELS INTERNATIONAL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3660':{'combined description':'KNIGHTS INNS', 'USDA description':'KNIGHTS INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3661':{'combined description':'METROPOLE HOTELS', 'USDA description':'METROPOLE HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3662':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3663':{'combined description':'HOTELES EL PRESIDENTS', 'USDA description':'HOTELES EL PRESIDENTS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3664':{'combined description':'FLAG INN', 'USDA description':'FLAG INN','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3665':{'combined description':'HAMPTON INNS', 'USDA description':'HAMPTON INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3666':{'combined description':'STAKIS HOTELS', 'USDA description':'STAKIS HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3667':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3668':{'combined description':'MARITIM HOTELS', 'USDA description':'MARITIM HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3669':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3670':{'combined description':'ARCARD HOTELS', 'USDA description':'ARCARD HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3671':{'combined description':'ARCTIA HOTELS', 'USDA description':'ARCTIA HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3672':{'combined description':'CAMPANIEL HOTELS', 'USDA description':'CAMPANIEL HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3673':{'combined description':'IBUSZ HOTELS', 'USDA description':'IBUSZ HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3674':{'combined description':'RANTASIPI HOTELS', 'USDA description':'RANTASIPI HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3675':{'combined description':'INTERHOTEL CEDOK', 'USDA description':'INTERHOTEL CEDOK','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3676':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3677':{'combined description':'CLIMAT DE FRANCE HOTELS', 'USDA description':'CLIMAT DE FRANCE HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3678':{'combined description':'CUMULUS HOTELS', 'USDA description':'CUMULUS HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3679':{'combined description':'DANUBIUS HOTEL', 'USDA description':'DANUBIUS HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3680':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3681':{'combined description':'ADAMS MARK HOTELS', 'USDA description':'ADAMS MARK HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3682':{'combined description':'ALLSTAR INNS', 'USDA description':'ALLSTAR INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3683':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3684':{'combined description':'BUDGET HOST INNS', 'USDA description':'BUDGET HOST INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3685':{'combined description':'BUDGETEL HOTELS', 'USDA description':'BUDGETEL HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3686':{'combined description':'SUISSE CHALETS', 'USDA description':'SUISSE CHALETS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3687':{'combined description':'CLARION HOTELS', 'USDA description':'CLARION HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3688':{'combined description':'COMPRI HOTELS', 'USDA description':'COMPRI HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3689':{'combined description':'CONSORT HOTELS', 'USDA description':'CONSORT HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3690':{'combined description':'COURTYARD BY MARRIOTT', 'USDA description':'COURTYARD BY MARRIOTT','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3691':{'combined description':'DILLION INNS', 'USDA description':'DILLION INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3692':{'combined description':'DOUBLETREE HOTELS', 'USDA description':'DOUBLETREE HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3693':{'combined description':'DRURY INNS', 'USDA description':'DRURY INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3694':{'combined description':'ECONOMY INNS OF AMERICA', 'USDA description':'ECONOMY INNS OF AMERICA','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3695':{'combined description':'EMBASSY SUITES', 'USDA description':'EMBASSY SUITES','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3696':{'combined description':'EXEL INNS', 'USDA description':'EXEL INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3697':{'combined description':'FARFIELD HOTELS', 'USDA description':'FARFIELD HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3698':{'combined description':'HARLEY HOTELS', 'USDA description':'HARLEY HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3699':{'combined description':'MIDWAY MOTOR LODGE', 'USDA description':'MIDWAY MOTOR LODGE','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3700':{'combined description':'MOTEL 6', 'USDA description':'MOTEL 6','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3701':{'combined description':'GUEST QUARTERS (Formally PICKETT SUITE HOTELS)', 'USDA description':'GUEST QUARTERS (Formally PICKETT SUITE HOTELS)','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3702':{'combined description':'THE REGISTRY HOTELS', 'USDA description':'THE REGISTRY HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3703':{'combined description':'RESIDENCE INNS', 'USDA description':'RESIDENCE INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3704':{'combined description':'ROYCE HOTELS', 'USDA description':'ROYCE HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3705':{'combined description':'SANDMAN INNS', 'USDA description':'SANDMAN INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3706':{'combined description':'SHILO INNS', 'USDA description':'SHILO INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3707':{'combined description':'SHONEY\'S INNS', 'USDA description':'SHONEY\'S INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3708':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3709':{'combined description':'SUPER8 MOTELS', 'USDA description':'SUPER8 MOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3710':{'combined description':'THE RITZ CARLTON HOTELS', 'USDA description':'THE RITZ CARLTON HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3711':{'combined description':'FLAG INNS (AUSRALIA)', 'USDA description':'FLAG INNS (AUSRALIA)','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3712':{'combined description':'GOLDEN CHAIN HOTEL', 'USDA description':'GOLDEN CHAIN HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3713':{'combined description':'QUALITY PACIFIC HOTEL', 'USDA description':'QUALITY PACIFIC HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3714':{'combined description':'FOUR SEASONS HOTEL (AUSTRALIA)', 'USDA description':'FOUR SEASONS HOTEL (AUSTRALIA)','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3715':{'combined description':'FARIFIELD INN', 'USDA description':'FARIFIELD INN','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3716':{'combined description':'CARLTON HOTELS', 'USDA description':'CARLTON HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3717':{'combined description':'CITY LODGE HOTELS', 'USDA description':'CITY LODGE HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3718':{'combined description':'KAROS HOTELS', 'USDA description':'KAROS HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3719':{'combined description':'PROTEA HOTELS', 'USDA description':'PROTEA HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3720':{'combined description':'SOUTHERN SUN HOTELS', 'USDA description':'SOUTHERN SUN HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3721':{'combined description':'HILTON CONRAD', 'USDA description':'HILTON CONRAD','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3722':{'combined description':'WYNDHAM HOTEL AND RESORTS', 'USDA description':'WYNDHAM HOTEL AND RESORTS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3723':{'combined description':'RICA HOTELS', 'USDA description':'RICA HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3724':{'combined description':'INER NOR HOTELS', 'USDA description':'INER NOR HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3725':{'combined description':'SEAINES PLANATION', 'USDA description':'SEAINES PLANATION','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3726':{'combined description':'RIO SUITES', 'USDA description':'RIO SUITES','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3727':{'combined description':'BROADMOOR HOTEL', 'USDA description':'BROADMOOR HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3728':{'combined description':'BALLY\'S HOTEL AND CASINO', 'USDA description':'BALLY\'S HOTEL AND CASINO','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3729':{'combined description':'JOHN ASCUAGA\'S NUGGET', 'USDA description':'JOHN ASCUAGA\'S NUGGET','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3730':{'combined description':'MGM GRAND HOTEL', 'USDA description':'MGM GRAND HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3731':{'combined description':'HARRAH\'S HOTELS AND CASINOS', 'USDA description':'HARRAH\'S HOTELS AND CASINOS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3732':{'combined description':'OPRYLAND HOTEL', 'USDA description':'OPRYLAND HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3733':{'combined description':'BOCA RATON RESORT', 'USDA description':'BOCA RATON RESORT','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3734':{'combined description':'HARVEY/BRISTOL HOTELS', 'USDA description':'HARVEY/BRISTOL HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3735':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3736':{'combined description':'COLORADO BELLE/EDGEWATER RESORT', 'USDA description':'COLORADO BELLE/EDGEWATER RESORT','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3737':{'combined description':'RIVIERA HOTEL AND CASINO', 'USDA description':'RIVIERA HOTEL AND CASINO','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3738':{'combined description':'TROPICANA RESORT AND CASINO', 'USDA description':'TROPICANA RESORT AND CASINO','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3739':{'combined description':'WOODSIDE HOTELS AND RESORTS', 'USDA description':'WOODSIDE HOTELS AND RESORTS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3740':{'combined description':'TOWNPLACE SUITES', 'USDA description':'TOWNPLACE SUITES','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3741':{'combined description':'MILLENIUM BROADWAY HOTEL', 'USDA description':'MILLENIUM BROADWAY HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3742':{'combined description':'CLUB MED', 'USDA description':'CLUB MED','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3743':{'combined description':'BILTMORE HOTEL AND SUITES', 'USDA description':'BILTMORE HOTEL AND SUITES','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3744':{'combined description':'CAREFREE RESORTS', 'USDA description':'CAREFREE RESORTS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3745':{'combined description':'ST. REGIS HOTEL', 'USDA description':'ST. REGIS HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3746':{'combined description':'THE ELIOT HOTEL', 'USDA description':'THE ELIOT HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3747':{'combined description':'CLUBCORP/CLUB RESORTS', 'USDA description':'CLUBCORP/CLUB RESORTS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3748':{'combined description':'WELESLEY INNS', 'USDA description':'WELESLEY INNS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3749':{'combined description':'THE BEVERLY HILLS HOTEL', 'USDA description':'THE BEVERLY HILLS HOTEL','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3750':{'combined description':'CROWNE PLAZA HOTELS', 'USDA description':'CROWNE PLAZA HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3751':{'combined description':'HOMEWOOD SUITES', 'USDA description':'HOMEWOOD SUITES','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3752':{'combined description':'PEABODY HOTELS', 'USDA description':'PEABODY HOTELS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3753':{'combined description':'GREENBRIAH RESORTS', 'USDA description':'GREENBRIAH RESORTS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3754':{'combined description':'AMELIA ISLAND PLANATION', 'USDA description':'AMELIA ISLAND PLANATION','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3755':{'combined description':'THE HOMESTEAD', 'USDA description':'THE HOMESTEAD','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3756':{'combined description':'SOUTH SEAS RESORTS', 'USDA description':'SOUTH SEAS RESORTS','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3757':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3758':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3759':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3760':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3761':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3762':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3763':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3764':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3765':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3766':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3767':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3768':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3769':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3770':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3771':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3772':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3773':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3774':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3775':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3776':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3777':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3778':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3779':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3780':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3781':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3782':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3783':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3784':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3785':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3786':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3787':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3788':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3789':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3790':{'combined description':'Hotels/Motels/Inns/Resorts', 'USDA description':'','IRS Description':'Hotels/Motels/Inns/Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '3835':{'combined description':'* MASTERS ECONOMY INNS', 'USDA description':'* MASTERS ECONOMY INNS','IRS Description':'', 'Reportable under 6041/6041A and Authority for Exception':''},
+ '4011':{'combined description':'Railroads', 'USDA description':'','IRS Description':'Railroads', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '4111':{'combined description':'Local/Suburban Commuter Passenger Transportation & Railroads, Feries, Local Water Transportation.', 'USDA description':'Local/Suburban Commuter Passenger Transportation & Railroads, Feries, Local Water Transportation.','IRS Description':'Commuter Transport, Ferries', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4112':{'combined description':'Passenger Railways', 'USDA description':'Passenger Railways','IRS Description':'Passenger Railways', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4119':{'combined description':'Ambulance Services', 'USDA description':'Ambulance Services','IRS Description':'Ambulance Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4121':{'combined description':'Taxicabs and Limousines', 'USDA description':'Taxicabs and Limousines','IRS Description':'Taxicabs/Limousines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4131':{'combined description':'Bus Lines, Including Charters, Tour Buses', 'USDA description':'Bus Lines, Including Charters, Tour Buses','IRS Description':'Bus Lines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4214':{'combined description':'Motor Freight Carriers, Moving and Storage Companies, Trucking & Local/Long Distance, Delivery Services & Local', 'USDA description':'Motor Freight Carriers','IRS Description':'Motor Freight Carriers and Trucking - Local and Long Distance, Moving and Storage Companies, and Local Delivery Services ', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '4215':{'combined description':'Courier Services & Air or Ground, Freight forwarders', 'USDA description':'Courier Services & Air or Ground','IRS Description':'Courier Services ', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4225':{'combined description':'Public warehousing, Storage', 'USDA description':'Warehousing, Public','IRS Description':'Public Warehousing and Storage - Farm Products, Refrigerated Goods, Household Goods, and Storage ', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '4411':{'combined description':'Cruise and Steamship Lines', 'USDA description':'Cruise Lines','IRS Description':'Cruise Lines', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4457':{'combined description':'Boat Rentals and Leases', 'USDA description':'Boat Rentals and Leases','IRS Description':'Boat Rentals and Leases', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4468':{'combined description':'Marinas, Marine Service, and Supplies', 'USDA description':'Marinas, Marine Service, and Supplies','IRS Description':'Marinas, Service and Supplies', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4511':{'combined description':'Airlines, Air Carriers ( not listed elsewhere)', 'USDA description':'Airlines, Air Carriers ( not listed elsewhere)','IRS Description':'Airlines, Air Carriers', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4582':{'combined description':'Airports, Airport Terminals, Flying Fields', 'USDA description':'Airports, Airport Terminals','IRS Description':'Airports, Flying Fields', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4722':{'combined description':'Travel Agencies and Tour Operations', 'USDA description':'Travel Agencies and Tour Operations','IRS Description':'Travel Agencies, Tour Operators', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4723':{'combined description':'Package Tour Operators (For use in Germany only)', 'USDA description':'Package Tour Operators (For use in Germany only)','IRS Description':'TUI Travel - Germany', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4784':{'combined description':'Toll and Bridge Fees', 'USDA description':'Toll and Bridge Fees','IRS Description':'Tolls/Bridge Fees', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '4789':{'combined description':'Transportation Services, Not elsewhere classified)', 'USDA description':'Transportation Services, Not elsewhere classified)','IRS Description':'Transportation Services (Not Elsewhere Classified)', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '4812':{'combined description':'Telecommunications Equipment including telephone sales', 'USDA description':'Telecommunications Equipment including telephone sales','IRS Description':'Telecommunication Equipment and Telephone Sales', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '4814':{'combined description':'Fax services, Telecommunication Services', 'USDA description':'Fax services','IRS Description':'Telecommunication Services', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '4815':{'combined description':'VisaPhone', 'USDA description':'VisaPhone','IRS Description':'', 'Reportable under 6041/6041A and Authority for Exception':''},
+ '4816':{'combined description':'Computer Network Services', 'USDA description':'','IRS Description':'Computer Network Services', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '4821':{'combined description':'Telegraph services', 'USDA description':'Telegraph services','IRS Description':'Telegraph Services', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '4829':{'combined description':'Money Orders & Wire Transfer', 'USDA description':'Money Orders & Wire Transfer','IRS Description':'Wires, Money Orders', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '4899':{'combined description':'Cable and other pay television (previously Cable Services)', 'USDA description':'Cable and other pay television (previously Cable Services)','IRS Description':'Cable, Satellite, and Other Pay Television and Radio', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '4900':{'combined description':'Electric, Gas, Sanitary and Water Utilities', 'USDA description':'Electric, Gas, Sanitary and Water Utilities','IRS Description':'Utilities ', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5013':{'combined description':'Motor vehicle supplies and new parts', 'USDA description':'Motor vehicle supplies and new parts','IRS Description':'Motor Vehicle Supplies and New Parts', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5021':{'combined description':'Office and Commercial Furniture', 'USDA description':'Office and Commercial Furniture','IRS Description':'Office and Commercial Furniture', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5039':{'combined description':'Construction Materials, Not Elsewhere Classified', 'USDA description':'Construction Materials, Not Elsewhere Classified','IRS Description':'Construction Materials (Not Elsewhere Classified)', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5044':{'combined description':'Office, Photographic, Photocopy, and Microfilm Equipment', 'USDA description':'Office, Photographic, Photocopy, and Microfilm Equipment','IRS Description':'Photographic, Photocopy, Microfilm Equipment, and Supplies', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5045':{'combined description':'Computers, Computer Peripheral Equipment, Software', 'USDA description':'Computers, Computer Peripheral Equipment, Software','IRS Description':'Computers, Peripherals, and Software', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5046':{'combined description':'Commercial Equipment, Not Elsewhere Classified', 'USDA description':'Commercial Equipment, Not Elsewhere Classified','IRS Description':'Commercial Equipment (Not Elsewhere Classified)', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5047':{'combined description':'Medical, Dental Ophthalmic, Hospital Equipment and Supplies', 'USDA description':'Medical, Dental Ophthalmic, Hospital Equipment and Supplies','IRS Description':'Medical, Dental, Ophthalmic, and Hospital Equipment and Supplies', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5051':{'combined description':'Metal Service Centers and Offices', 'USDA description':'Metal Service Centers and Offices','IRS Description':'Metal Service Centers', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5065':{'combined description':'Electrical Parts and Equipment', 'USDA description':'Electrical Parts and Equipment','IRS Description':'Electrical Parts and Equipment', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5072':{'combined description':'Hardware Equipment and Supplies', 'USDA description':'Hardware Equipment and Supplies','IRS Description':'Hardware, Equipment, and Supplies', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5074':{'combined description':'Plumbing and Heating Equipment and Supplies', 'USDA description':'Plumbing and Heating Equipment and Supplies','IRS Description':'Plumbing, Heating Equipment, and Supplies', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5085':{'combined description':'Industrial Supplies, Not Elsewhere Classified', 'USDA description':'Industrial Supplies, Not Elsewhere Classified','IRS Description':'Industrial Supplies (Not Elsewhere Classified)', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5094':{'combined description':'Precious Stones and Metals, Watches and Jewelry', 'USDA description':'Precious Stones and Metals, Watches and Jewelry','IRS Description':'Precious Stones and Metals, Watches and Jewelry', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5099':{'combined description':'Durable Goods, Not Elsewhere Classified', 'USDA description':'Durable Goods, Not Elsewhere Classified','IRS Description':'Durable Goods (Not Elsewhere Classified)', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5111':{'combined description':'Stationery, Office Supplies, Printing, and Writing Paper', 'USDA description':'Stationery, Office Supplies, Printing, and Writing Paper','IRS Description':'Stationary, Office Supplies, Printing and Writing Paper', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5122':{'combined description':'Drugs, Drug Proprietors, and Druggist\'s Sundries', 'USDA description':'Drugs, Drug Proprietors, and Druggist\'s Sundries','IRS Description':'Drugs, Drug Proprietaries, and Druggist Sundries', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5131':{'combined description':'Piece Goods, Notions, and Other Dry Goods', 'USDA description':'Piece Goods, Notions, and Other Dry Goods','IRS Description':'Piece Goods, Notions, and Other Dry Goods', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5137':{'combined description':'Men\'s Women\'s and Children\'s Uniforms and Commercial Clothing', 'USDA description':'Men\'s Women\'s and Children\'s Uniforms and Commercial Clothing','IRS Description':'Uniforms, Commercial Clothing', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5139':{'combined description':'Commercial Footwear', 'USDA description':'Commercial Footwear','IRS Description':'Commercial Footwear', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5169':{'combined description':'Chemicals and Allied Products, Not Elsewhere Classified', 'USDA description':'Chemicals and Allied Products, Not Elsewhere Classified','IRS Description':'Chemicals and Allied Products (Not Elsewhere Classified)', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5172':{'combined description':'Petroleum and Petroleum Products', 'USDA description':'Petroleum and Petroleum Products','IRS Description':'Petroleum and Petroleum Products', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5192':{'combined description':'Books, Periodicals, and Newspapers', 'USDA description':'Books, Periodicals, and Newspapers','IRS Description':'Books, Periodicals, and Newspapers', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5193':{'combined description':'Florists\' Supplies, Nursery Stock and Flowers', 'USDA description':'Florists\' Supplies, Nursery Stock and Flowers','IRS Description':'Florists Supplies, Nursery Stock, and Flowers', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5198':{'combined description':'Paints, Varnishes, and Supplies', 'USDA description':'Paints, Varnishes, and Supplies','IRS Description':'Paints, Varnishes, and Supplies', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5199':{'combined description':'Non-durable Goods, Not Elsewhere Classified', 'USDA description':'Non-durable Goods, Not Elsewhere Classified','IRS Description':'Nondurable Goods (Not Elsewhere Classified)', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5200':{'combined description':'Home Supply Warehouse Stores', 'USDA description':'Home Supply Warehouse Stores','IRS Description':'Home Supply Warehouse Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5211':{'combined description':'Lumber and Building Materials Stores', 'USDA description':'Lumber and Building Materials Stores','IRS Description':'Lumber, Building Materials Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5231':{'combined description':'Glass, Paint, and Wallpaper Stores', 'USDA description':'Wallpaper Stores','IRS Description':'Glass, Paint, and Wallpaper Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5251':{'combined description':'Hardware Stores', 'USDA description':'Hardware Stores','IRS Description':'Hardware Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5261':{'combined description':'Nurseries & Lawn and Garden Supply Store', 'USDA description':'Nurseries & Lawn and Garden Supply Store','IRS Description':'Nurseries, Lawn and Garden Supply Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5271':{'combined description':'Mobile Home Dealers', 'USDA description':'Mobile Home Dealers','IRS Description':'Mobile Home Dealers', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5300':{'combined description':'Wholesale Clubs', 'USDA description':'Wholesale Clubs','IRS Description':'Wholesale Clubs', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5309':{'combined description':'Duty Free Store', 'USDA description':'Duty Free Store','IRS Description':'Duty Free Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5310':{'combined description':'Discount Stores', 'USDA description':'Discount Stores','IRS Description':'Discount Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5311':{'combined description':'Department Stores', 'USDA description':'Department Stores','IRS Description':'Department Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5331':{'combined description':'Variety Stores', 'USDA description':'Variety Stores','IRS Description':'Variety Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5399':{'combined description':'Misc. General Merchandise', 'USDA description':'Misc. General Merchandise','IRS Description':'Miscellaneous General Merchandise', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5411':{'combined description':'Grocery Stores, Supermarkets', 'USDA description':'Grocery Stores','IRS Description':'Grocery Stores, Supermarkets', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5422':{'combined description':'Meat Provisioners & Freezer and Locker', 'USDA description':'Meat Provisioners & Freezer and Locker','IRS Description':'Freezer and Locker Meat Provisioners', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5441':{'combined description':'Candy, Nut, and Confectionery Stores', 'USDA description':'Candy Stores','IRS Description':'Candy, Nut, and Confectionery Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5451':{'combined description':'Dairy Products Stores', 'USDA description':'Dairy Products Stores','IRS Description':'Dairy Products Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5462':{'combined description':'Bakeries', 'USDA description':'Bakeries','IRS Description':'Bakeries', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5499':{'combined description':'Misc. Food Stores & Convenience Stores and Specialty Markets', 'USDA description':'Misc. Food Stores & Convenience Stores and Specialty Markets','IRS Description':'Miscellaneous Food Stores - Convenience Stores and Specialty Markets', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5511':{'combined description':'Car and Truck Dealers (New and Used) Sales, Service, Repairs, Parts, and Leasing', 'USDA description':'Car and Truck Dealers (New and Used) Sales, Service, Repairs, Parts, and Leasing','IRS Description':'Car and Truck Dealers (New & Used) Sales, Service, Repairs Parts and Leasing ', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5521':{'combined description':'Automobile and Truck Dealers (Used Only)', 'USDA description':'Automobile and Truck Dealers (Used Only)','IRS Description':'Car and Truck Dealers (Used Only) Sales, Service, Repairs Parts and Leasing ', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5531':{'combined description':'Automobile Supply Stores', 'USDA description':'Automobile Supply Stores','IRS Description':'Auto and Home Supply Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5532':{'combined description':'Automotive Tire Stores', 'USDA description':'Automotive Tire Stores','IRS Description':'Automotive Tire Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5533':{'combined description':'Automotive Parts, Accessories Stores', 'USDA description':'Automotive Parts, Accessories Stores','IRS Description':'Automotive Parts and Accessories Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5541':{'combined description':'Service Stations ( with or without ancillary services)', 'USDA description':'Service Stations ( with or without ancillary services)','IRS Description':'Service Stations ', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5542':{'combined description':'Automated Fuel Dispensers', 'USDA description':'Automated Fuel Dispensers','IRS Description':'Automated Fuel Dispensers', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5551':{'combined description':'Boat Dealers', 'USDA description':'Boat Dealers','IRS Description':'Boat Dealers', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5561':{'combined description':'Recreational and Utility Trailers, Camp Dealers', 'USDA description':'Recreational and Utility Trailers, Camp Dealers','IRS Description':'Motorcycle Shops, Dealers', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5571':{'combined description':'Motorcycle Dealers', 'USDA description':'Motorcycle Dealers','IRS Description':'Motorcycle Shops and Dealers', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5592':{'combined description':'Motor Home Dealers', 'USDA description':'Motor Home Dealers','IRS Description':'Motor Homes Dealers', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5598':{'combined description':'Snowmobile Dealers', 'USDA description':'Snowmobile Dealers','IRS Description':'Snowmobile Dealers', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5599':{'combined description':'Miscellaneous Auto Dealers ', 'USDA description':'','IRS Description':'Miscellaneous Auto Dealers ', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5611':{'combined description':'Men\'s and Boy\'s Clothing and Accessories Stores', 'USDA description':'Men\'s and Boy\'s Clothing and Accessories Stores','IRS Description':'Men\'s and Boy\'s Clothing and Accessories Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5621':{'combined description':'Women\'s Ready-to-Wear Stores', 'USDA description':'Women\'s Ready-to-Wear Stores','IRS Description':'Women\'s Ready-To-Wear Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5631':{'combined description':'Women\'s Accessory and Specialty Shops', 'USDA description':'Women\'s Accessory and Specialty Shops','IRS Description':'Women\'s Accessory and Specialty Shops', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5641':{'combined description':'Children\'s and Infant\'s Wear Stores', 'USDA description':'Children\'s and Infant\'s Wear Stores','IRS Description':'Children\'s and Infant\'s Wear Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5651':{'combined description':'Family Clothing Stores', 'USDA description':'Family Clothing Stores','IRS Description':'Family Clothing Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5655':{'combined description':'Sports Apparel, Riding Apparel Stores', 'USDA description':'Sports Apparel, Riding Apparel Stores','IRS Description':'Sports and Riding Apparel Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5661':{'combined description':'Shoe Stores', 'USDA description':'Shoe Stores','IRS Description':'Shoe Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5681':{'combined description':'Furriers and Fur Shops', 'USDA description':'Furriers and Fur Shops','IRS Description':'Furriers and Fur Shops', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5691':{'combined description':'Men\'s and Women\'s Clothing Stores', 'USDA description':'Men\'s and Women\'s Clothing Stores','IRS Description':'Men\'s, Women\'s Clothing Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5697':{'combined description':'Tailors, Seamstress, Mending, and Alterations', 'USDA description':'Tailors, Seamstress, Mending, and Alterations','IRS Description':'Tailors, Alterations', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '5698':{'combined description':'Wig and Toupee Stores', 'USDA description':'Wig and Toupee Stores','IRS Description':'Wig and Toupee Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5699':{'combined description':'Miscellaneous Apparel and Accessory Shops', 'USDA description':'Miscellaneous Apparel and Accessory Shops','IRS Description':'Miscellaneous Apparel and Accessory Shops', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5712':{'combined description':'Furniture, Home Furnishings, and Equipment Stores, ExceptAppliances', 'USDA description':'Furniture, Home Furnishings, and Equipment Stores, ExceptAppliances','IRS Description':'Furniture, Home Furnishings, and Equipment Stores, Except Appliances', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5713':{'combined description':'Floor Covering Stores', 'USDA description':'Floor Covering Stores','IRS Description':'Floor Covering Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5714':{'combined description':'Drapery, Window Covering and Upholstery Stores', 'USDA description':'Drapery, Window Covering and Upholstery Stores','IRS Description':'Drapery, Window Covering, and Upholstery Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5718':{'combined description':'Fireplace, Fireplace Screens, and Accessories Stores', 'USDA description':'Fireplace, Fireplace Screens, and Accessories Stores','IRS Description':'Fireplace, Fireplace Screens, and Accessories Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5719':{'combined description':'Miscellaneous Home Furnishing Specialty Stores', 'USDA description':'Miscellaneous Home Furnishing Specialty Stores','IRS Description':'Miscellaneous Home Furnishing Specialty Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5722':{'combined description':'Household Appliance Stores', 'USDA description':'Household Appliance Stores','IRS Description':'Household Appliance Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5732':{'combined description':'Electronic Sales', 'USDA description':'Electronic Sales','IRS Description':'Electronics Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5733':{'combined description':'Music Stores, Musical Instruments, Piano Sheet Music', 'USDA description':'Music Stores, Musical Instruments, Piano Sheet Music','IRS Description':'Music Stores-Musical Instruments, Pianos, and Sheet Music', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5734':{'combined description':'Computer Software Stores', 'USDA description':'Computer Software Stores','IRS Description':'Computer Software Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5735':{'combined description':'Record Shops', 'USDA description':'Record Shops','IRS Description':'Record Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5811':{'combined description':'Caterers', 'USDA description':'Caterers','IRS Description':'Caterers', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '5812':{'combined description':'Eating places and Restaurants', 'USDA description':'Eating places and Restaurants','IRS Description':'Eating Places, Restaurants', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5813':{'combined description':'Drinking Places (Alcoholic Beverages), Bars, Taverns, Cocktail lounges, Nightclubs and Discotheques', 'USDA description':'Drinking Places (Alcoholic Beverages), Bars, Taverns, Cocktail lounges, Nightclubs and Discotheques','IRS Description':'Drinking Places', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5814':{'combined description':'Fast Food Restaurants', 'USDA description':'Fast Food Restaurants','IRS Description':'Fast Food Restaurants', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5832':{'combined description':'Antique Shops & Sales, Repairs, and Restoration Services', 'USDA description':'Antique Shops & Sales, Repairs, and Restoration Services','IRS Description':'', 'Reportable under 6041/6041A and Authority for Exception':''},
+ '5912':{'combined description':'Drug Stores and Pharmacies', 'USDA description':'Drug Stores and Pharmacies','IRS Description':'Drug Stores and Pharmacies', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5921':{'combined description':'Package Stores & Beer, Wine, and Liquor', 'USDA description':'Package Stores & Beer, Wine, and Liquor','IRS Description':'Package Stores-Beer, Wine, and Liquor', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5931':{'combined description':'Used Merchandise and Secondhand Stores', 'USDA description':'Used Merchandise and Secondhand Stores','IRS Description':'Used Merchandise and Secondhand Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5932':{'combined description':'Antique Shops', 'USDA description':'','IRS Description':'Antique Shops', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5933':{'combined description':'Pawn Shops and Salvage Yards', 'USDA description':'Pawn Shops and Salvage Yards','IRS Description':'Pawn Shops', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5935':{'combined description':'Wrecking and Salvage Yards', 'USDA description':'Wrecking and Salvage Yards','IRS Description':'Wrecking and Salvage Yards', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '5937':{'combined description':'Antique Reproductions', 'USDA description':'Antique Reproductions','IRS Description':'Antique Reproductions', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5940':{'combined description':'Bicycle Shops & Sales and Service', 'USDA description':'Bicycle Shops & Sales and Service','IRS Description':'Bicycle Shops', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5941':{'combined description':'Sporting Goods Stores', 'USDA description':'Sporting Goods Stores','IRS Description':'Sporting Goods Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5942':{'combined description':'Book Stores', 'USDA description':'Book Stores','IRS Description':'Book Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5943':{'combined description':'Stationery Stores, Office and School Supply Stores', 'USDA description':'Stationery Stores, Office and School Supply Stores','IRS Description':'Stationery Stores, Office, and School Supply Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5944':{'combined description':'Watch, Clock, Jewelry, and Silverware Stores', 'USDA description':'Watch, Clock, Jewelry, and Silverware Stores','IRS Description':'Jewelry Stores, Watches, Clocks, and Silverware Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5945':{'combined description':'Hobby, Toy, and Game Shops', 'USDA description':'Hobby, Toy, and Game Shops','IRS Description':'Hobby, Toy, and Game Shops', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5946':{'combined description':'Camera and Photographic Supply Stores', 'USDA description':'Camera and Photographic Supply Stores','IRS Description':'Camera and Photographic Supply Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5947':{'combined description':'Card Shops, Gift, Novelty, and Souvenir Shops', 'USDA description':'Card Shops, Gift, Novelty, and Souvenir Shops','IRS Description':'Gift, Card, Novelty, and Souvenir Shops', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5948':{'combined description':'Leather Foods Stores', 'USDA description':'Leather Foods Stores','IRS Description':'Luggage and Leather Goods Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5949':{'combined description':'Sewing, Needle, Fabric, and Price Goods Stores', 'USDA description':'Sewing, Needle, Fabric, and Price Goods Stores','IRS Description':'Sewing, Needlework, Fabric, and Piece Goods Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5950':{'combined description':'Glassware/Crystal Stores', 'USDA description':'Glassware/Crystal Stores','IRS Description':'Glassware, Crystal Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5960':{'combined description':'Direct Marketing- Insurance Service', 'USDA description':'Direct Marketing- Insurance Service','IRS Description':'Direct Marketing - Insurance Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '5961':{'combined description':'Mail Order Houses Including Catalog Order Stores, Book/Record Clubs (No longer permitted for U.S. original presentments)', 'USDA description':'Mail Order Houses Including Catalog Order Stores, Book/Record Clubs (No longer permitted for U.S. original presentments)','IRS Description':'', 'Reportable under 6041/6041A and Authority for Exception':''},
+ '5962':{'combined description':'Direct Marketing & Travel Related Arrangements Services', 'USDA description':'Direct Marketing & Travel Related Arrangements Services','IRS Description':'Direct Marketing - Travel', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '5963':{'combined description':'Door-to-Door Sales', 'USDA description':'Door-to-Door Sales','IRS Description':'Door-To-Door Sales', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5964':{'combined description':'Direct Marketing & Catalog Merchant', 'USDA description':'Direct Marketing & Catalog Merchant','IRS Description':'Direct Marketing - Catalog Merchant', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5965':{'combined description':'Direct Marketing & Catalog and Catalog and Retail Merchant', 'USDA description':'Direct Marketing & Catalog and Catalog and Retail Merchant','IRS Description':'Direct Marketing - Combination Catalog and Retail Merchant', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5966':{'combined description':'Direct Marketing- Outbound Telemarketing Merchant', 'USDA description':'Direct Marketing- Outbound Telemarketing Merchant','IRS Description':'Direct Marketing - Outbound Tele', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5967':{'combined description':'Direct Marketing & Inbound Teleservices Merchant', 'USDA description':'Direct Marketing & Inbound Teleservices Merchant','IRS Description':'Direct Marketing - Inbound Tele', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5968':{'combined description':'Direct Marketing & Continuity/Subscription Merchant', 'USDA description':'Direct Marketing & Continuity/Subscription Merchant','IRS Description':'Direct Marketing - Subscription', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5969':{'combined description':'Direct Marketing & Not Elsewhere Classified', 'USDA description':'Direct Marketing & Not Elsewhere Classified','IRS Description':'Direct Marketing - Other ', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5970':{'combined description':'Artist\'s Supply and Craft Shops', 'USDA description':'Artist\'s Supply and Craft Shops','IRS Description':'Artist\'s Supply and Craft Shops', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5971':{'combined description':'Art Dealers and Galleries', 'USDA description':'Art Dealers and Galleries','IRS Description':'Art Dealers and Galleries', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5972':{'combined description':'Stamp and Coin Stores & Philatelic and Numismatic Supplies', 'USDA description':'Stamp and Coin Stores & Philatelic and Numismatic Supplies','IRS Description':'Stamp and Coin Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5973':{'combined description':'Religious Goods Stores', 'USDA description':'Religious Goods Stores','IRS Description':'Religious Goods Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5975':{'combined description':'Hearing Aids & Sales, Service, and Supply Stores', 'USDA description':'Hearing Aids & Sales, Service, and Supply Stores','IRS Description':'Hearing Aids Sales and Supplies', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5976':{'combined description':'Orthopedic Goods Prosthetic Devices', 'USDA description':'Orthopedic Goods Prosthetic Devices','IRS Description':'Orthopedic Goods - Prosthetic Devices', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5977':{'combined description':'Cosmetic Stores', 'USDA description':'Cosmetic Stores','IRS Description':'Cosmetic Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5978':{'combined description':'Typewriter Stores & Sales, Rental, Service', 'USDA description':'Typewriter Stores & Sales, Rental, Service','IRS Description':'Typewriter Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5983':{'combined description':'Fuel & Fuel Oil, Wood, Coal, Liquefied Petroleum', 'USDA description':'Fuel & Fuel Oil, Wood, Coal, Liquefied Petroleum','IRS Description':'Fuel Dealers (Non Automotive)', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5992':{'combined description':'Florists', 'USDA description':'Florists','IRS Description':'Florists', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5993':{'combined description':'Cigar Stores and Stands', 'USDA description':'Cigar Stores and Stands','IRS Description':'Cigar Stores and Stands', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5994':{'combined description':'News Dealers and Newsstands', 'USDA description':'News Dealers and Newsstands','IRS Description':'News Dealers and Newsstands', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5995':{'combined description':'Pet Shops, Pet Foods, and Supplies Stores', 'USDA description':'Pet Shops, Pet Foods, and Supplies Stores','IRS Description':'Pet Shops, Pet Food, and Supplies', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5996':{'combined description':'Swimming Pools & Sales, Service, and Supplies', 'USDA description':'Swimming Pools & Sales, Service, and Supplies','IRS Description':'Swimming Pools Sales', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5997':{'combined description':'Electric Razor Stores & Sales and Service', 'USDA description':'Electric Razor Stores & Sales and Service','IRS Description':'Electric Razor Stores', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5998':{'combined description':'Tent and Awning Shops', 'USDA description':'Tent and Awning Shops','IRS Description':'Tent and Awning Shops', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '5999':{'combined description':'Miscellaneous and Specialty Retail Stores', 'USDA description':'Miscellaneous and Specialty Retail Stores','IRS Description':'Miscellaneous Specialty Retail', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '6010':{'combined description':'Financial Institutions & Manual Cash Disbursements', 'USDA description':'Financial Institutions & Manual Cash Disbursements','IRS Description':'Manual Cash Disburse', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '6011':{'combined description':'Financial Institutions & Manual Cash Disbursements', 'USDA description':'Financial Institutions & Manual Cash Disbursements','IRS Description':'Automated Cash Disburse', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '6012':{'combined description':'Financial Institutions & Merchandise and Services', 'USDA description':'Financial Institutions & Merchandise and Services','IRS Description':'Financial Institutions', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '6051':{'combined description':'Non-Financial Institutions & Foreign Currency, Money Orders (not wire transfer) and Travelers Cheques', 'USDA description':'Non-Financial Institutions & Foreign Currency, Money Orders (not wire transfer) and Travelers Cheques','IRS Description':'Non-FI, Money Orders', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '6211':{'combined description':'Security Brokers/Dealers', 'USDA description':'Security Brokers/Dealers','IRS Description':'Security Brokers/Dealers', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '6300':{'combined description':'Insurance Sales, Underwriting, and Premiums', 'USDA description':'Insurance Sales, Underwriting, and Premiums','IRS Description':'Insurance Underwriting, Premiums', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '6381':{'combined description':'Insurance Premiums, (no longer valid for first presentment work)', 'USDA description':'Insurance Premiums, (no longer valid for first presentment work)','IRS Description':'', 'Reportable under 6041/6041A and Authority for Exception':''},
+ '6399':{'combined description':'Insurance, Not Elsewhere Classified ( no longer valid forfirst presentment work)', 'USDA description':'Insurance, Not Elsewhere Classified ( no longer valid forfirst presentment work)','IRS Description':'Insurance - Default', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '6513':{'combined description':'Real Estate Agents and Managers - Rentals', 'USDA description':'','IRS Description':'Real Estate Agents and Managers - Rentals', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7011':{'combined description':'Lodging & Hotels, Motels, Resorts, Central Reservation Services (not elsewhere classified)', 'USDA description':'Lodging & Hotels, Motels, Resorts, Central Reservation Services (not elsewhere classified)','IRS Description':'Hotels, Motels, and Resorts', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7012':{'combined description':'Timeshares', 'USDA description':'Timeshares','IRS Description':'Timeshares', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7032':{'combined description':'Sporting and Recreational Camps', 'USDA description':'Sporting and Recreational Camps','IRS Description':'Sporting/Recreation Camps', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7033':{'combined description':'Trailer Parks and Camp Grounds', 'USDA description':'Trailer Parks and Camp Grounds','IRS Description':'Trailer Parks, Campgrounds', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7210':{'combined description':'Laundry, Cleaning, and Garment Services', 'USDA description':'Laundry, Cleaning, and Garment Services','IRS Description':'Laundry, Cleaning Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7211':{'combined description':'Laundry & Family and Commercial', 'USDA description':'Laundry & Family and Commercial','IRS Description':'Laundries ', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7216':{'combined description':'Dry Cleaners', 'USDA description':'Dry Cleaners','IRS Description':'Dry Cleaners', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7217':{'combined description':'Carpet and Upholstery Cleaning', 'USDA description':'Carpet and Upholstery Cleaning','IRS Description':'Carpet/Upholstery Cleaning', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7221':{'combined description':'Photographic Studios', 'USDA description':'Photographic Studios','IRS Description':'Photographic Studios', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7230':{'combined description':'Barber and Beauty Shops', 'USDA description':'Barber and Beauty Shops','IRS Description':'Barber and Beauty Shops', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7251':{'combined description':'Shop Repair Shops and Shoe Shine Parlors, and Hat Cleaning Shops', 'USDA description':'Shop Repair Shops and Shoe Shine Parlors, and Hat Cleaning Shops','IRS Description':'Shoe Repair/Hat Cleaning', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7261':{'combined description':'Funeral Service and Crematories', 'USDA description':'Funeral Service and Crematories','IRS Description':'Funeral Services, Crematories', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7273':{'combined description':'Dating and Escort Services', 'USDA description':'Dating and Escort Services','IRS Description':'Dating/Escort Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7276':{'combined description':'Tax Preparation Service', 'USDA description':'Tax Preparation Service','IRS Description':'Tax Preparation Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7277':{'combined description':'Counseling Service & Debt, Marriage, Personal', 'USDA description':'Counseling Service & Debt, Marriage, Personal','IRS Description':'Counseling Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7278':{'combined description':'Buying/Shopping Services, Clubs', 'USDA description':'Buying/Shopping Services, Clubs','IRS Description':'Buying/Shopping Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7296':{'combined description':'Clothing Rental & Costumes, Formal Wear, Uniforms', 'USDA description':'Clothing Rental & Costumes, Formal Wear, Uniforms','IRS Description':'Clothing Rental ', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7297':{'combined description':'Massage Parlors', 'USDA description':'Massage Parlors','IRS Description':'Massage Parlors', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7298':{'combined description':'Health and Beauty Shops', 'USDA description':'Health and Beauty Shops','IRS Description':'Health and Beauty Spas', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7299':{'combined description':'Miscellaneous Personal Services ( not elsewhere classifies)', 'USDA description':'Miscellaneous Personal Services ( not elsewhere classifies)','IRS Description':'Miscellaneous General Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7311':{'combined description':'Advertising Services', 'USDA description':'Advertising Services','IRS Description':'Advertising Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7321':{'combined description':'Consumer Credit Reporting Agencies', 'USDA description':'Consumer Credit Reporting Agencies','IRS Description':'Credit Reporting Agencies', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7332':{'combined description':'Blueprinting and Photocopying Services', 'USDA description':'Blueprinting and Photocopying Services','IRS Description':'', 'Reportable under 6041/6041A and Authority for Exception':''},
+ '7333':{'combined description':'Commercial Photography, Art and Graphics', 'USDA description':'Commercial Photography, Art and Graphics','IRS Description':'Commercial Photography, Art and Graphics', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7338':{'combined description':'Quick Copy, Reproduction and Blueprinting Services', 'USDA description':'Quick Copy, Reproduction and Blueprinting Services','IRS Description':'Quick Copy, Repro, and Blueprint', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7339':{'combined description':'Stenographic and Secretarial Support Services', 'USDA description':'Stenographic and Secretarial Support Services','IRS Description':'Secretarial Support Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7342':{'combined description':'Exterminating and Disinfecting Services', 'USDA description':'Exterminating and Disinfecting Services','IRS Description':'Exterminating Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7349':{'combined description':'Cleaning and Maintenance, Janitorial Services', 'USDA description':'Cleaning and Maintenance, Janitorial Services','IRS Description':'Cleaning and Maintenance', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7361':{'combined description':'Employment Agencies, Temporary Help Services', 'USDA description':'Employment Agencies, Temporary Help Services','IRS Description':'Employment/Temp Agencies', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7372':{'combined description':'Computer Programming, Integrated Systems Design and Data Processing Services', 'USDA description':'Computer Programming, Integrated Systems Design and Data Processing Services','IRS Description':'Computer Programming', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7375':{'combined description':'Information Retrieval Services', 'USDA description':'Information Retrieval Services','IRS Description':'Information Retrieval Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7379':{'combined description':'Computer Maintenance and Repair Services, Not Elsewhere Classified', 'USDA description':'Computer Maintenance and Repair Services, Not Elsewhere Classified','IRS Description':'Computer Repair', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7392':{'combined description':'Management, Consulting, and Public Relations Services', 'USDA description':'Management, Consulting, and Public Relations Services','IRS Description':'Consulting, Public Relations', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7393':{'combined description':'Protective and Security Services & Including Armored Carsand Guard Dogs', 'USDA description':'Protective and Security Services & Including Armored Carsand Guard Dogs','IRS Description':'Detective Agencies', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7394':{'combined description':'Equipment Rental and Leasing Services, Tool Rental, Furniture Rental, and Appliance Rental', 'USDA description':'Equipment Rental and Leasing Services, Tool Rental, Furniture Rental, and Appliance Rental','IRS Description':'Equipment Rental ', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7395':{'combined description':'Photofinishing Laboratories, Photo Developing', 'USDA description':'Photofinishing Laboratories, Photo Developing','IRS Description':'Photo Developing', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7399':{'combined description':'Business Services, Not Elsewhere Classified', 'USDA description':'Business Services, Not Elsewhere Classified','IRS Description':'Miscellaneous Business Services ', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7511':{'combined description':'Truck Stop', 'USDA description':'','IRS Description':'Truck Stop', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7512':{'combined description':'Car Rental Companies ( Not Listed Below)', 'USDA description':'Car Rental Companies ( Not Listed Below)','IRS Description':'Car Rental Agencies', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7513':{'combined description':'Truck and Utility Trailer Rentals', 'USDA description':'Truck and Utility Trailer Rentals','IRS Description':'Truck/Utility Trailer Rentals', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7519':{'combined description':'Motor Home and Recreational Vehicle Rentals', 'USDA description':'Motor Home and Recreational Vehicle Rentals','IRS Description':'Recreational Vehicle Rentals', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7523':{'combined description':'Automobile Parking Lots and Garages', 'USDA description':'Automobile Parking Lots and Garages','IRS Description':'Parking Lots, Garages', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7531':{'combined description':'Automotive Body Repair Shops', 'USDA description':'Automotive Body Repair Shops','IRS Description':'Auto Body Repair Shops', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7534':{'combined description':'Tire Re-treading and Repair Shops', 'USDA description':'Tire Re-treading and Repair Shops','IRS Description':'Tire Retreading and Repair', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7535':{'combined description':'Paint Shops & Automotive', 'USDA description':'Paint Shops & Automotive','IRS Description':'Auto Paint Shops', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7538':{'combined description':'Automotive Service Shops', 'USDA description':'Automotive Service Shops','IRS Description':'Auto Service Shops', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7542':{'combined description':'Car Washes', 'USDA description':'Car Washes','IRS Description':'Car Washes', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7549':{'combined description':'Towing Services', 'USDA description':'Towing Services','IRS Description':'Towing Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7622':{'combined description':'Radio Repair Shops', 'USDA description':'Radio Repair Shops','IRS Description':'Electronics Repair Shops', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7623':{'combined description':'Air Conditioning and Refrigeration Repair Shops', 'USDA description':'Air Conditioning and Refrigeration Repair Shops','IRS Description':'A/C, Refrigeration Repair', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7629':{'combined description':'Electrical And Small Appliance Repair Shops', 'USDA description':'Electrical And Small Appliance Repair Shops','IRS Description':'Small Appliance Repair', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7631':{'combined description':'Watch, Clock, and Jewelry Repair', 'USDA description':'Watch, Clock, and Jewelry Repair','IRS Description':'Watch/Jewelry Repair', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7641':{'combined description':'Furniture, Furniture Repair, and Furniture Refinishing', 'USDA description':'Furniture, Furniture Repair, and Furniture Refinishing','IRS Description':'Furniture Repair, Refinishing', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7692':{'combined description':'Welding Repair', 'USDA description':'Welding Repair','IRS Description':'Welding Repair', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7699':{'combined description':'Repair Shops and Related Services &Miscellaneous', 'USDA description':'Repair Shops and Related Services &Miscellaneous','IRS Description':'Miscellaneous Repair Shops', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7829':{'combined description':'Motion Pictures and Video Tape Production and Distribution', 'USDA description':'Motion Pictures and Video Tape Production and Distribution','IRS Description':'Picture/Video Production', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7832':{'combined description':'Motion Picture Theaters', 'USDA description':'Motion Picture Theaters','IRS Description':'Motion Picture Theaters', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7841':{'combined description':'Video Tape Rental Stores', 'USDA description':'Video Tape Rental Stores','IRS Description':'Video Tape Rental Stores', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7911':{'combined description':'Dance Halls, Studios and Schools', 'USDA description':'Dance Halls, Studios and Schools','IRS Description':'Dance Hall, Studios, Schools', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7922':{'combined description':'Theatrical Producers (Except Motion Pictures), Ticket Agencies', 'USDA description':'Theatrical Producers (Except Motion Pictures), Ticket Agencies','IRS Description':'Theatrical Ticket Agencies', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7929':{'combined description':'Bands, Orchestras, and Miscellaneous Entertainers (Not Elsewhere Classified)', 'USDA description':'Bands, Orchestras, and Miscellaneous Entertainers (Not Elsewhere Classified)','IRS Description':'Bands, Orchestras', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7932':{'combined description':'Billiard and Pool Establishments', 'USDA description':'Billiard and Pool Establishments','IRS Description':'Billiard/Pool Establishments', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7933':{'combined description':'Bowling Alleys', 'USDA description':'Bowling Alleys','IRS Description':'Bowling Alleys', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7941':{'combined description':'Commercial Sports, Athletic Fields, Professional Sport Clubs, and Sport Promoters', 'USDA description':'Commercial Sports, Athletic Fields, Professional Sport Clubs, and Sport Promoters','IRS Description':'Sports Clubs/Fields', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7991':{'combined description':'Tourist Attractions and Exhibits', 'USDA description':'Tourist Attractions and Exhibits','IRS Description':'Tourist Attractions and Exhibits', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7992':{'combined description':'Golf Courses & Public', 'USDA description':'Golf Courses & Public','IRS Description':'Golf Courses - Public', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7993':{'combined description':'Video Amusement Game Supplies', 'USDA description':'Video Amusement Game Supplies','IRS Description':'Video Amusement Game Supplies', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '7994':{'combined description':'Video Game Arcades/Establishments', 'USDA description':'Video Game Arcades/Establishments','IRS Description':'Video Game Arcades', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7995':{'combined description':'Betting (including Lottery Tickets, Casino Gaming Chips, Off-track Betting and Wagers)', 'USDA description':'Betting (including Lottery Tickets, Casino Gaming Chips, Off-track Betting and Wagers)','IRS Description':'Betting/Casino Gambling', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7996':{'combined description':'Amusement Parks, Carnivals, Circuses, Fortune Tellers', 'USDA description':'Amusement Parks, Carnivals, Circuses, Fortune Tellers','IRS Description':'Amusement Parks/Carnivals', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7997':{'combined description':'Membership Clubs (Sports, Recreation, Athletic), Country Clubs, and Private Golf Courses', 'USDA description':'Membership Clubs (Sports, Recreation, Athletic), Country Clubs, and Private Golf Courses','IRS Description':'Country Clubs', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7998':{'combined description':'Aquariums, Sea-aquariums, Dolphinariums', 'USDA description':'Aquariums, Sea-aquariums, Dolphinariums','IRS Description':'Aquariums', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '7999':{'combined description':'Recreation Services (Not Elsewhere Classified)', 'USDA description':'Recreation Services (Not Elsewhere Classified)','IRS Description':'Miscellaneous Recreation Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8011':{'combined description':'Doctors and Physicians (Not Elsewhere Classified)', 'USDA description':'Doctors and Physicians (Not Elsewhere Classified)','IRS Description':'Doctors', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8021':{'combined description':'Dentists and Orthodontists', 'USDA description':'Dentists and Orthodontists','IRS Description':'Dentists, Orthodontists', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8031':{'combined description':'Osteopaths', 'USDA description':'Osteopaths','IRS Description':'Osteopaths', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8041':{'combined description':'Chiropractors', 'USDA description':'Chiropractors','IRS Description':'Chiropractors', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8042':{'combined description':'Optometrists and Ophthalmologists', 'USDA description':'Optometrists and Ophthalmologists','IRS Description':'Optometrists, Ophthalmologist', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8043':{'combined description':'Opticians, Opticians Goods and Eyeglasses', 'USDA description':'Opticians, Opticians Goods and Eyeglasses','IRS Description':'Opticians, Eyeglasses', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8044':{'combined description':'Opticians, Optical Goods, and Eyeglasses (no longer validfor first presentments)', 'USDA description':'Opticians, Optical Goods, and Eyeglasses (no longer validfor first presentments)','IRS Description':'', 'Reportable under 6041/6041A and Authority for Exception':''},
+ '8049':{'combined description':'Podiatrists and Chiropodists', 'USDA description':'Podiatrists and Chiropodists','IRS Description':'Chiropodists, Podiatrists', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8050':{'combined description':'Nursing and Personal Care Facilities', 'USDA description':'Nursing and Personal Care Facilities','IRS Description':'Nursing/Personal Care ', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8062':{'combined description':'Hospitals', 'USDA description':'Hospitals','IRS Description':'Hospitals', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8071':{'combined description':'Medical and Dental Laboratories', 'USDA description':'Medical and Dental Laboratories','IRS Description':'Medical and Dental Labs', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8099':{'combined description':'Medical Services and Health Practitioners (Not Elsewhere Classified)', 'USDA description':'Medical Services and Health Practitioners (Not Elsewhere Classified)','IRS Description':'Medical Services ', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8111':{'combined description':'Legal Services and Attorneys', 'USDA description':'Legal Services and Attorneys','IRS Description':'Legal Services, Attorneys', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8211':{'combined description':'Elementary and Secondary Schools', 'USDA description':'Elementary and Secondary Schools','IRS Description':'Elementary, Secondary Schools', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(2)'},
+ '8220':{'combined description':'Colleges, Junior Colleges, Universities, and ProfessionalSchools', 'USDA description':'Colleges, Junior Colleges, Universities, and ProfessionalSchools','IRS Description':'Colleges, Universities', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(2)'},
+ '8241':{'combined description':'Correspondence Schools', 'USDA description':'Correspondence Schools','IRS Description':'Correspondence Schools', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(2)'},
+ '8244':{'combined description':'Business and Secretarial Schools', 'USDA description':'Business and Secretarial Schools','IRS Description':'Business/Secretarial Schools', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(2)'},
+ '8249':{'combined description':'Vocational Schools and Trade Schools', 'USDA description':'Vocational Schools and Trade Schools','IRS Description':'Vocational/Trade Schools', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(2)'},
+ '8299':{'combined description':'Schools and Educational Services ( Not Elsewhere Classified)', 'USDA description':'Schools and Educational Services ( Not Elsewhere Classified)','IRS Description':'Educational Services ', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8351':{'combined description':'Child Care Services', 'USDA description':'Child Care Services','IRS Description':'Child Care Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8398':{'combined description':'Charitable and Social Service Organizations', 'USDA description':'Charitable and Social Service Organizations','IRS Description':'Charitable and Social Service Organizations - Fundraising', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(2)'},
+ '8641':{'combined description':'Civic, Fraternal, and Social Associations', 'USDA description':'Civic, Fraternal, and Social Associations','IRS Description':'Civic, Social, Fraternal Associations', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(2)'},
+ '8651':{'combined description':'Political Organizations', 'USDA description':'Political Organizations','IRS Description':'Political Organizations', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8661':{'combined description':'Religious Organizations', 'USDA description':'Religious Organizations','IRS Description':'Religious Organizations', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(2)'},
+ '8675':{'combined description':'Automobile Associations', 'USDA description':'Automobile Associations','IRS Description':'Automobile Associations', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8699':{'combined description':'Membership Organizations ( Not Elsewhere Classified)', 'USDA description':'Membership Organizations ( Not Elsewhere Classified)','IRS Description':'Membership Organizations', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8734':{'combined description':'Testing Laboratories ( non-medical)', 'USDA description':'Testing Laboratories ( non-medical)','IRS Description':'Testing Laboratories', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8911':{'combined description':'Architectural & Engineering and Surveying Services', 'USDA description':'Architectural & Engineering and Surveying Services','IRS Description':'Architectural/Surveying Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8931':{'combined description':'Accounting, Auditing, and Bookkeeping Services', 'USDA description':'Accounting, Auditing, and Bookkeeping Services','IRS Description':'Accounting/Bookkeeping Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '8999':{'combined description':'Professional Services ( Not Elsewhere Defined)', 'USDA description':'Professional Services ( Not Elsewhere Defined)','IRS Description':'Professional Services', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '9211':{'combined description':'Court Costs, including Alimony and Child Support', 'USDA description':'Court Costs, including Alimony and Child Support','IRS Description':'Court Costs, Including Alimony and Child Support - Courts of Law', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(4)'},
+ '9222':{'combined description':'Fines', 'USDA description':'Fines','IRS Description':'Fines - Government Administrative Entities', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(4)'},
+ '9223':{'combined description':'Bail and Bond Payments', 'USDA description':'Bail and Bond Payments','IRS Description':'Bail and Bond Payments (payment to the surety for the bond, not the actual bond paid to the government agency) ', 'Reportable under 6041/6041A and Authority for Exception':'Yes'},
+ '9311':{'combined description':'Tax Payments', 'USDA description':'Tax Payments','IRS Description':'Tax Payments - Government Agencies', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(4)'},
+ '9399':{'combined description':'Government Services ( Not Elsewhere Classified)', 'USDA description':'Government Services ( Not Elsewhere Classified)','IRS Description':'Government Services (Not Elsewhere Classified)', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(4)'},
+ '9402':{'combined description':'Postal Services & Government Only', 'USDA description':'Postal Services & Government Only','IRS Description':'Postal Services - Government Only', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(3)'},
+ '9405':{'combined description':'Intra & Government Transactions', 'USDA description':'Intra & Government Transactions','IRS Description':'U.S. Federal Government Agencies or Departments', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(p)(3)'},
+ '9700':{'combined description':'Automated Referral Service ( For Visa Only)', 'USDA description':'Automated Referral Service ( For Visa Only)','IRS Description':'', 'Reportable under 6041/6041A and Authority for Exception under 6041/6041A and Authority for Exception':''},
+ '9701':{'combined description':'Visa Credential Service ( For Visa Only)', 'USDA description':'Visa Credential Service ( For Visa Only)','IRS Description':'', 'Reportable under 6041/6041A and Authority for Exception':''},
+ '9702':{'combined description':'GCAS Emergency Services ( For Visa Only)', 'USDA description':'GCAS Emergency Services ( For Visa Only)','IRS Description':'', 'Reportable under 6041/6041A and Authority for Exception':''},
+ '9950':{'combined description':'Intra & Company Purchases ( For Visa Only)', 'USDA description':'Intra & Company Purchases ( For Visa Only)','IRS Description':'Intra-Company Purchases', 'Reportable under 6041/6041A and Authority for Exception':'No1.6041-3(c)'},
+ '9999':{'combined description':'MCC Invalid', 'USDA description':'MCC Invalid','IRS Description':'MCC Invalid', 'Reportable under 6041/6041A and Authority for Exception':'no'},
+}
diff --git a/ofxparse/ofxparse.py b/ofxparse/ofxparse.py
new file mode 100644
index 0000000..a66df88
--- /dev/null
+++ b/ofxparse/ofxparse.py
@@ -0,0 +1,851 @@
+from __future__ import absolute_import, with_statement
+
+import sys
+import decimal
+import datetime
+import codecs
+import re
+import collections
+import contextlib
+
+try:
+ from StringIO import StringIO
+except ImportError:
+ from io import StringIO
+
+import six
+
+if 'OrderedDict' in dir(collections):
+ odict = collections
+else:
+ import ordereddict as odict
+
+from . import mcc
+
+def soup_maker(fh):
+ try:
+ from bs4 import BeautifulSoup
+ return BeautifulSoup(fh)
+ except ImportError:
+ from BeautifulSoup import BeautifulStoneSoup
+ return BeautifulStoneSoup(fh)
+
+
+def try_decode(string, encoding):
+ if hasattr(string, 'decode'):
+ string = string.decode(encoding)
+ return string
+
+def is_iterable(candidate):
+ if sys.version_info < (2,6):
+ return hasattr(candidate, 'next')
+ return isinstance(candidate, collections.Iterable)
+
+@contextlib.contextmanager
+def save_pos(fh):
+ """
+ Save the position of the file handle, seek to the beginning, and
+ then restore the position.
+ """
+ orig_pos = fh.tell()
+ fh.seek(0)
+ try:
+ yield fh
+ finally:
+ fh.seek(orig_pos)
+
+class OfxFile(object):
+ def __init__(self, fh):
+ """
+ fh should be a seekable file-like byte stream object
+ """
+ self.headers = odict.OrderedDict()
+ self.fh = fh
+
+ if not is_iterable(self.fh):
+ return
+ if not hasattr(self.fh, "seek"):
+ return # fh is not a file object, we're doomed.
+
+ with save_pos(self.fh):
+ self.read_headers()
+ self.handle_encoding()
+ self.replace_NONE_headers()
+
+ def read_headers(self):
+ head_data = self.fh.read(1024 * 10)
+ head_data = head_data[:head_data.find(six.b('<'))]
+
+ for line in re.split(six.b('\r?\n?'), head_data):
+ # Newline?
+ if line.strip() == six.b(""):
+ break
+
+ header, value = line.split(six.b(":"))
+ header, value = header.strip().upper(), value.strip()
+
+ self.headers[header] = value
+
+ def handle_encoding(self):
+ """
+ Decode the headers and wrap self.fh in a decoder such that it
+ subsequently returns only text.
+ """
+ # decode the headers using ascii
+ ascii_headers = odict.OrderedDict(
+ (
+ key.decode('ascii', 'replace'),
+ value.decode('ascii', 'replace'),
+ )
+ for key, value in six.iteritems(self.headers)
+ )
+
+ enc_type = ascii_headers.get('ENCODING')
+
+ if not enc_type:
+ # no encoding specified, use the ascii-decoded headers
+ self.headers = ascii_headers
+ # decode the body as ascii as well
+ self.fh = codecs.lookup('ascii').streamreader(self.fh)
+ return
+
+ if enc_type == "USASCII":
+ cp = ascii_headers.get("CHARSET", "1252")
+ encoding = "cp%s" % (cp, )
+
+ elif enc_type in ("UNICODE", "UTF-8"):
+ encoding = "utf-8"
+
+ codec = codecs.lookup(encoding)
+
+ self.fh = codec.streamreader(self.fh)
+
+ # Decode the headers using the encoding
+ self.headers = odict.OrderedDict(
+ (key.decode(encoding), value.decode(encoding))
+ for key, value in six.iteritems(self.headers)
+ )
+
+ def replace_NONE_headers(self):
+ """
+ Any headers that indicate 'none' should be replaced with Python
+ None values
+ """
+ for header in self.headers:
+ if self.headers[header].upper() == 'NONE':
+ self.headers[header] = None
+
+
+class OfxPreprocessedFile(OfxFile):
+ def __init__(self, fh):
+ super(OfxPreprocessedFile,self).__init__(fh)
+
+ if self.fh is None:
+ return
+
+ ofx_string = self.fh.read()
+
+ # find all closing tags as hints
+ closing_tags = [ t.upper() for t in re.findall(r'(?i)</([a-z0-9_\.]+)>', ofx_string) ]
+
+ # close all tags that don't have closing tags and
+ # leave all other data intact
+ last_open_tag = None
+ tokens = re.split(r'(?i)(</?[a-z0-9_\.]+>)', ofx_string)
+ new_fh = StringIO()
+ for idx,token in enumerate(tokens):
+ is_closing_tag = token.startswith('</')
+ is_processing_tag = token.startswith('<?')
+ is_cdata = token.startswith('<!')
+ is_tag = token.startswith('<') and not is_cdata
+ is_open_tag = is_tag and not is_closing_tag and not is_processing_tag
+ if is_tag:
+ if last_open_tag is not None:
+ new_fh.write("</%s>" % last_open_tag)
+ last_open_tag = None
+ if is_open_tag:
+ tag_name = re.findall(r'(?i)<([a-z0-9_\.]+)>', token)[0]
+ if tag_name.upper() not in closing_tags:
+ last_open_tag = tag_name
+ new_fh.write(token)
+ new_fh.seek(0)
+ self.fh = new_fh
+
+
+class Ofx(object):
+ def __str__(self):
+ return ""
+# headers = "\r\n".join(":".join(el if el else "NONE" for el in item) for item in six.iteritems(self.headers))
+# headers += "\r\n\r\n"
+#
+# return headers + str(self.signon)
+
+
+class AccountType(object):
+ (Unknown, Bank, CreditCard, Investment) = range(0, 4)
+
+
+class Account(object):
+ def __init__(self):
+ self.statement = None
+ self.account_id = ''
+ self.routing_number = ''
+ self.branch_id = ''
+ self.account_type = ''
+ self.institution = None
+ self.type = AccountType.Unknown
+ # Used for error tracking
+ self.warnings = []
+
+ @property
+ def number(self):
+ # For backwards compatibility. Remove in version 1.0.
+ return self.account_id
+
+
+class InvestmentAccount(Account):
+ def __init__(self):
+ super(InvestmentAccount, self).__init__()
+ self.brokerid = ''
+
+
+class Security:
+ def __init__(self, uniqueid, name, ticker, memo):
+ self.uniqueid = uniqueid
+ self.name = name
+ self.ticker = ticker
+ self.memo = memo
+
+class Signon:
+ def __init__(self, code, severity, message):
+ self.code = code
+ self.severity = severity
+ self.message = message
+ if int(code) == 0:
+ self.success = True
+ else:
+ self.success = False
+
+ def __str__(self):
+ ret = "\t<SIGNONMSGSRSV1>\r\n" + "\t\t<SONRS>\r\n" + "\t\t\t<STATUS>\r\n"
+ ret += "\t\t\t\t<CODE>%s\r\n" % self.code
+ ret += "\t\t\t\t<SEVERITY>%s\r\n" % self.severity
+ if self.message:
+ ret += "\t\t\t\t<MESSAGE>%s\r\n" % self.message
+ ret += "\t\t\t</STATUS>\r\n" + "\t\t</SONRS>\r\n" + "\t</SIGNONMSGSRSV1>\r\n"
+ return ret
+
+class Statement(object):
+ def __init__(self):
+ self.start_date = ''
+ self.end_date = ''
+ self.currency = ''
+ self.transactions = []
+ # Error tracking:
+ self.discarded_entries = []
+ self.warnings = []
+
+
+class InvestmentStatement(object):
+ def __init__(self):
+ self.positions = []
+ self.transactions = []
+ # Error tracking:
+ self.discarded_entries = []
+ self.warnings = []
+
+
+class Transaction(object):
+ def __init__(self):
+ self.payee = ''
+ self.type = ''
+ self.date = None
+ self.amount = None
+ self.id = ''
+ self.memo = ''
+ self.sic = None
+ self.mcc = ''
+ self.checknum = ''
+
+ def __repr__(self):
+ return "<Transaction units=" + str(self.amount) + ">"
+
+
+class InvestmentTransaction(object):
+ (Unknown, BuyMF, SellMF, Reinvest, BuyStock, SellStock) = [x for x in range(-1, 5)]
+ def __init__(self, type):
+ try:
+ self.type = ['buymf', 'sellmf', 'reinvest', 'buystock', 'sellstock'].index(type.lower())
+ except ValueError:
+ self.type = InvestmentTransaction.Unknown
+ self.tradeDate = None
+ self.settleDate = None
+ self.security = ''
+ self.units = decimal.Decimal(0)
+ self.unit_price = decimal.Decimal(0)
+
+ def __repr__(self):
+ return "<InvestmentTransaction type=" + str(self.type) + ", units=" + str(self.units) + ">"
+
+
+class Position(object):
+ def __init__(self):
+ self.security = ''
+ self.units = decimal.Decimal(0)
+ self.unit_price = decimal.Decimal(0)
+
+
+class Institution(object):
+ def __init__(self):
+ self.organization = ''
+ self.fid = ''
+
+
+class OfxParserException(Exception):
+ pass
+
+
+class OfxParser(object):
+ @classmethod
+ def parse(cls_, file_handle, fail_fast=True):
+ '''
+ parse is the main entry point for an OfxParser. It takes a file
+ handle and an optional log_errors flag.
+
+ If fail_fast is True, the parser will fail on any errors.
+ If fail_fast is False, the parser will log poor statements in the
+ statement class and continue to run. Note: the library does not
+ guarantee that no exceptions will be raised to the caller, only
+ that statements will include bad transactions (which are marked).
+
+ '''
+ cls_.fail_fast = fail_fast
+
+ if isinstance(file_handle, type('')):
+ raise RuntimeError(six.u("parse() takes in a file handle, not a string"))
+
+ ofx_obj = Ofx()
+
+ # Store the headers
+ ofx_file = OfxPreprocessedFile(file_handle)
+ ofx_obj.headers = ofx_file.headers
+ ofx_obj.accounts = []
+ ofx_obj.signon = None
+
+ ofx = soup_maker(ofx_file.fh)
+ if len(ofx.contents) == 0:
+ raise OfxParserException('The ofx file is empty!')
+
+ sonrs_ofx = ofx.find('sonrs')
+ if sonrs_ofx:
+ ofx_obj.signon = cls_.parseSonrs(sonrs_ofx)
+
+ stmtrs_ofx = ofx.findAll('stmtrs')
+ if stmtrs_ofx:
+ ofx_obj.accounts += cls_.parseStmtrs(stmtrs_ofx, AccountType.Bank)
+
+ ccstmtrs_ofx = ofx.findAll('ccstmtrs')
+ if ccstmtrs_ofx:
+ ofx_obj.accounts += cls_.parseStmtrs(
+ ccstmtrs_ofx, AccountType.CreditCard)
+
+ invstmtrs_ofx = ofx.findAll('invstmtrs')
+ if invstmtrs_ofx:
+ ofx_obj.accounts += cls_.parseInvstmtrs(invstmtrs_ofx)
+ seclist_ofx = ofx.find('seclist')
+ if seclist_ofx:
+ ofx_obj.security_list = cls_.parseSeclist(seclist_ofx)
+ else:
+ ofx_obj.security_list = None
+
+ acctinfors_ofx = ofx.find('acctinfors')
+ if acctinfors_ofx:
+ ofx_obj.accounts += cls_.parseAcctinfors(acctinfors_ofx, ofx)
+
+ fi_ofx = ofx.find('fi')
+ if fi_ofx:
+ for account in ofx_obj.accounts:
+ account.institution = cls_.parseOrg(fi_ofx)
+
+ if ofx_obj.accounts:
+ ofx_obj.account = ofx_obj.accounts[0]
+
+ return ofx_obj
+
+ @classmethod
+ def parseOfxDateTime(cls_, ofxDateTime):
+ # dateAsString looks something like 20101106160000.00[-5:EST]
+ # for 6 Nov 2010 4pm UTC-5 aka EST
+
+ # Some places (e.g. Newfoundland) have non-integer offsets.
+ res = re.search("\[(?P<tz>[-+]?\d+\.?\d*)\:\w*\]$", ofxDateTime)
+ if res:
+ tz = float(res.group('tz'))
+ else:
+ tz = 0
+
+ timeZoneOffset = datetime.timedelta(hours=tz)
+
+ try:
+ local_date = datetime.datetime.strptime(
+ ofxDateTime[:14], '%Y%m%d%H%M%S'
+ )
+ return local_date - timeZoneOffset
+ except:
+ return datetime.datetime.strptime(
+ ofxDateTime[:8], '%Y%m%d') - timeZoneOffset
+
+ @classmethod
+ def parseAcctinfors(cls_, acctinfors_ofx, ofx):
+ all_accounts = []
+ for i in acctinfors_ofx.findAll('acctinfo'):
+ accounts = []
+ if i.find('invacctinfo'):
+ accounts += cls_.parseInvstmtrs([i])
+ elif i.find('ccacctinfo'):
+ accounts += cls_.parseStmtrs([i], AccountType.CreditCard)
+ elif i.find('bankacctinfo'):
+ accounts += cls_.parseStmtrs([i], AccountType.Bank)
+ else:
+ continue
+
+ fi_ofx = ofx.find('fi')
+ if fi_ofx:
+ for account in ofx_obj.accounts:
+ account.institution = cls_.parseOrg(fi_ofx)
+
+ desc = i.find('desc')
+ if hasattr(desc, 'contents'):
+ for account in accounts:
+ account.desc = desc.contents[0].strip()
+ all_accounts += accounts
+ return all_accounts
+
+ @classmethod
+ def parseInvstmtrs(cls_, invstmtrs_list):
+ ret = []
+ for invstmtrs_ofx in invstmtrs_list:
+ account = InvestmentAccount()
+ acctid_tag = invstmtrs_ofx.find('acctid')
+ if (hasattr(acctid_tag, 'contents')):
+ try:
+ account.account_id = acctid_tag.contents[0].strip()
+ except IndexError:
+ account.warnings.append(
+ six.u("Empty acctid tag for %s") % invstmtrs_ofx)
+ if cls_.fail_fast:
+ raise
+
+ brokerid_tag = invstmtrs_ofx.find('brokerid')
+ if (hasattr(brokerid_tag, 'contents')):
+ try:
+ account.brokerid = brokerid_tag.contents[0].strip()
+ except IndexError:
+ account.warnings.append(
+ six.u("Empty brokerid tag for %s") % invstmtrs_ofx)
+ if cls_.fail_fast:
+ raise
+
+ account.type = AccountType.Investment
+
+ if (invstmtrs_ofx):
+ account.statement = cls_.parseInvestmentStatement(
+ invstmtrs_ofx)
+ ret.append(account)
+ return ret
+
+ @classmethod
+ def parseSeclist(cls_, seclist_ofx):
+ securityList = []
+ for secinfo_ofx in seclist_ofx.findAll('secinfo'):
+ uniqueid_tag = secinfo_ofx.find('uniqueid')
+ name_tag = secinfo_ofx.find('secname')
+ ticker_tag = secinfo_ofx.find('ticker')
+ memo_tag = secinfo_ofx.find('memo')
+ if uniqueid_tag and name_tag and ticker_tag:
+ try:
+ memo = memo_tag.contents[0].strip()
+ except AttributeError:
+ # memo can be empty
+ memo = None
+ securityList.append(
+ Security(uniqueid_tag.contents[0].strip(),
+ name_tag.contents[0].strip(),
+ ticker_tag.contents[0].strip(),
+ memo))
+ return securityList
+
+ @classmethod
+ def parseInvestmentPosition(cls_, ofx):
+ position = Position()
+ tag = ofx.find('uniqueid')
+ if (hasattr(tag, 'contents')):
+ position.security = tag.contents[0].strip()
+ tag = ofx.find('units')
+ if (hasattr(tag, 'contents')):
+ position.units = decimal.Decimal(tag.contents[0].strip())
+ tag = ofx.find('unitprice')
+ if (hasattr(tag, 'contents')):
+ position.unit_price = decimal.Decimal(tag.contents[0].strip())
+ tag = ofx.find('dtpriceasof')
+ if (hasattr(tag, 'contents')):
+ try:
+ position.date = cls_.parseOfxDateTime(tag.contents[0].strip())
+ except ValueError:
+ raise
+ return position
+
+ @classmethod
+ def parseInvestmentTransaction(cls_, ofx):
+ transaction = InvestmentTransaction(ofx.name)
+ tag = ofx.find('fitid')
+ if (hasattr(tag, 'contents')):
+ transaction.id = tag.contents[0].strip()
+ tag = ofx.find('memo')
+ if (hasattr(tag, 'contents')):
+ transaction.memo = tag.contents[0].strip()
+ tag = ofx.find('dttrade')
+ if (hasattr(tag, 'contents')):
+ try:
+ transaction.tradeDate = cls_.parseOfxDateTime(
+ tag.contents[0].strip())
+ except ValueError:
+ raise
+ tag = ofx.find('dtsettle')
+ if (hasattr(tag, 'contents')):
+ try:
+ transaction.settleDate = cls_.parseOfxDateTime(
+ tag.contents[0].strip())
+ except ValueError:
+ raise
+ tag = ofx.find('uniqueid')
+ if (hasattr(tag, 'contents')):
+ transaction.security = tag.contents[0].strip()
+ tag = ofx.find('units')
+ if (hasattr(tag, 'contents')):
+ transaction.units = decimal.Decimal(tag.contents[0].strip())
+ tag = ofx.find('unitprice')
+ if (hasattr(tag, 'contents')):
+ transaction.unit_price = decimal.Decimal(tag.contents[0].strip())
+ return transaction
+
+ @classmethod
+ def parseInvestmentStatement(cls_, invstmtrs_ofx):
+ statement = InvestmentStatement()
+ currency_tag = invstmtrs_ofx.find('curdef')
+ if hasattr(currency_tag, "contents"):
+ statement.currency = currency_tag.contents[0].strip().lower()
+ invtranlist_ofx = invstmtrs_ofx.find('invtranlist')
+ if (invtranlist_ofx is not None):
+ tag = invtranlist_ofx.find('dtstart')
+ if (hasattr(tag, 'contents')):
+ try:
+ statement.start_date = cls_.parseOfxDateTime(
+ tag.contents[0].strip())
+ except IndexError:
+ statement.warnings.append(six.u('Empty start date.'))
+ if cls_.fail_fast:
+ raise
+ except ValueError:
+ e = sys.exc_info()[1]
+ statement.warnings.append(six.u('Invalid start date: %s') % e)
+ if cls_.fail_fast:
+ raise
+
+ tag = invtranlist_ofx.find('dtend')
+ if (hasattr(tag, 'contents')):
+ try:
+ statement.end_date = cls_.parseOfxDateTime(
+ tag.contents[0].strip())
+ except IndexError:
+ statement.warnings.append(six.u('Empty end date.'))
+ except ValueError:
+ e = sys.exc_info()[1]
+ statement.warnings.append(six.u('Invalid end date: %s') % e)
+ if cls_.fail_fast:
+ raise
+
+ for transaction_type in ['posmf', 'posstock', 'posopt']:
+ try:
+ for investment_ofx in invstmtrs_ofx.findAll(transaction_type):
+ statement.positions.append(
+ cls_.parseInvestmentPosition(investment_ofx))
+ except (ValueError, IndexError, decimal.InvalidOperation,
+ TypeError):
+ e = sys.exc_info()[1]
+ if cls_.fail_fast:
+ raise
+ statement.discarded_entries.append(
+ {six.u('error'): six.u("Error parsing positions: ") + str(e),
+ six.u('content'): investment_ofx}
+ )
+
+ for transaction_type in ['buymf', 'sellmf', 'reinvest', 'buystock',
+ 'sellstock', 'buyopt', 'sellopt']:
+ try:
+ for investment_ofx in invstmtrs_ofx.findAll(transaction_type):
+ statement.transactions.append(
+ cls_.parseInvestmentTransaction(investment_ofx))
+ except (ValueError, IndexError, decimal.InvalidOperation):
+ e = sys.exc_info()[1]
+ if cls_.fail_fast:
+ raise
+ statement.discarded_entries.append(
+ {six.u('error'): transaction_type + ": " + str(e),
+ six.u('content'): investment_ofx}
+ )
+
+ return statement
+
+ @classmethod
+ def parseOrg(cls_, fi_ofx):
+ institution = Institution()
+ org = fi_ofx.find('org')
+ if hasattr(org, 'contents'):
+ institution.organization = org.contents[0].strip()
+
+ fid = fi_ofx.find('fid')
+ if hasattr(fid, 'contents'):
+ institution.fid = fid.contents[0].strip()
+
+ return institution
+
+ @classmethod
+ def parseSonrs(cls_, sonrs):
+
+ code = int(sonrs.find('code').contents[0].strip())
+ severity = sonrs.find('severity').contents[0].strip()
+ try:
+ message = sonrs.find('message').contents[0].strip()
+ except:
+ message = ''
+
+ return Signon(code,severity,message)
+
+ @classmethod
+ def parseStmtrs(cls_, stmtrs_list, accountType):
+ ''' Parse the <STMTRS> tags and return a list of Accounts object. '''
+ ret = []
+ for stmtrs_ofx in stmtrs_list:
+ account = Account()
+ acctid_tag = stmtrs_ofx.find('acctid')
+ if hasattr(acctid_tag, 'contents'):
+ account.account_id = acctid_tag.contents[0].strip()
+ bankid_tag = stmtrs_ofx.find('bankid')
+ if hasattr(bankid_tag, 'contents'):
+ account.routing_number = bankid_tag.contents[0].strip()
+ branchid_tag = stmtrs_ofx.find('branchid')
+ if hasattr(branchid_tag, 'contents'):
+ account.branch_id = branchid_tag.contents[0].strip()
+ type_tag = stmtrs_ofx.find('accttype')
+ if hasattr(type_tag, 'contents'):
+ account.account_type = type_tag.contents[0].strip()
+ account.type = accountType
+
+ if stmtrs_ofx:
+ account.statement = cls_.parseStatement(stmtrs_ofx)
+ ret.append(account)
+ return ret
+
+ @classmethod
+ def parseStatement(cls_, stmt_ofx):
+ '''
+ Parse a statement in ofx-land and return a Statement object.
+ '''
+ statement = Statement()
+ dtstart_tag = stmt_ofx.find('dtstart')
+ if hasattr(dtstart_tag, "contents"):
+ try:
+ statement.start_date = cls_.parseOfxDateTime(
+ dtstart_tag.contents[0].strip())
+ except IndexError:
+ statement.warnings.append(
+ six.u("Statement start date was empty for %s") % stmt_ofx)
+ if cls_.fail_fast:
+ raise
+ except ValueError:
+ statement.warnings.append(
+ six.u("Statement start date was not allowed for %s") % stmt_ofx)
+ if cls_.fail_fast:
+ raise
+
+ dtend_tag = stmt_ofx.find('dtend')
+ if hasattr(dtend_tag, "contents"):
+ try:
+ statement.end_date = cls_.parseOfxDateTime(
+ dtend_tag.contents[0].strip())
+ except IndexError:
+ statement.warnings.append(
+ six.u("Statement start date was empty for %s") % stmt_ofx)
+ if cls_.fail_fast:
+ raise
+ except ValueError:
+ ve = sys.exc_info()[1]
+ msg = six.u("Statement start date was not formatted "
+ "correctly for %s")
+ statement.warnings.append(msg % stmt_ofx)
+ if cls_.fail_fast:
+ raise
+ except TypeError:
+ statement.warnings.append(
+ six.u("Statement start date was not allowed for %s") % stmt_ofx)
+ if cls_.fail_fast:
+ raise
+
+ currency_tag = stmt_ofx.find('curdef')
+ if hasattr(currency_tag, "contents"):
+ try:
+ statement.currency = currency_tag.contents[0].strip().lower()
+ except IndexError:
+ statement.warnings.append(
+ six.u("Currency definition was empty for %s") % stmt_ofx)
+ if cls_.fail_fast:
+ raise
+
+ ledger_bal_tag = stmt_ofx.find('ledgerbal')
+ if hasattr(ledger_bal_tag, "contents"):
+ balamt_tag = ledger_bal_tag.find('balamt')
+ if hasattr(balamt_tag, "contents"):
+ try:
+ statement.balance = decimal.Decimal(
+ balamt_tag.contents[0].strip())
+ except (IndexError, decimal.InvalidOperation):
+ ex = sys.exc_info()[1]
+ statement.warnings.append(
+ six.u("Ledger balance amount was empty for %s") % stmt_ofx)
+ if cls_.fail_fast:
+ raise OfxParserException("Empty ledger balance")
+
+ avail_bal_tag = stmt_ofx.find('availbal')
+ if hasattr(avail_bal_tag, "contents"):
+ balamt_tag = avail_bal_tag.find('balamt')
+ if hasattr(balamt_tag, "contents"):
+ try:
+ statement.available_balance = decimal.Decimal(
+ balamt_tag.contents[0].strip())
+ except (IndexError, decimal.InvalidOperation):
+ ex = sys.exc_info()[1]
+ msg = six.u("Available balance amount was empty for %s")
+ statement.warnings.append(msg % stmt_ofx)
+ if cls_.fail_fast:
+ raise OfxParserException("Empty available balance")
+
+ for transaction_ofx in stmt_ofx.findAll('stmttrn'):
+ try:
+ statement.transactions.append(
+ cls_.parseTransaction(transaction_ofx))
+ except OfxParserException:
+ ofxError = sys.exc_info()[1]
+ statement.discarded_entries.append(
+ {'error': str(ofxError), 'content': transaction_ofx})
+ if cls_.fail_fast:
+ raise
+
+ return statement
+
+ @classmethod
+ def parseTransaction(cls_, txn_ofx):
+ '''
+ Parse a transaction in ofx-land and return a Transaction object.
+ '''
+ transaction = Transaction()
+
+ type_tag = txn_ofx.find('trntype')
+ if hasattr(type_tag, 'contents'):
+ try:
+ transaction.type = type_tag.contents[0].lower().strip()
+ except IndexError:
+ raise OfxParserException(six.u("Empty transaction type"))
+ except TypeError:
+ raise OfxParserException(
+ six.u("No Transaction type (a required field)"))
+
+ name_tag = txn_ofx.find('name')
+ if hasattr(name_tag, "contents"):
+ try:
+ transaction.payee = name_tag.contents[0].strip()
+ except IndexError:
+ raise OfxParserException(six.u("Empty transaction name"))
+ except TypeError:
+ raise OfxParserException(
+ six.u("No Transaction name (a required field)"))
+
+ memo_tag = txn_ofx.find('memo')
+ if hasattr(memo_tag, "contents"):
+ try:
+ transaction.memo = memo_tag.contents[0].strip()
+ except IndexError:
+ # Memo can be empty.
+ pass
+ except TypeError:
+ pass
+
+ amt_tag = txn_ofx.find('trnamt')
+ if hasattr(amt_tag, "contents"):
+ try:
+ transaction.amount = decimal.Decimal(
+ amt_tag.contents[0].strip())
+ except IndexError:
+ raise OfxParserException("Invalid Transaction Date")
+ except decimal.InvalidOperation:
+ raise OfxParserException(
+ six.u("Invalid Transaction Amount: '%s'") % amt_tag.contents[0])
+ except TypeError:
+ raise OfxParserException(
+ six.u("No Transaction Amount (a required field)"))
+ else:
+ raise OfxParserException(
+ six.u("Missing Transaction Amount (a required field)"))
+
+ date_tag = txn_ofx.find('dtposted')
+ if hasattr(date_tag, "contents"):
+ try:
+ transaction.date = cls_.parseOfxDateTime(
+ date_tag.contents[0].strip())
+ except IndexError:
+ raise OfxParserException("Invalid Transaction Date")
+ except ValueError:
+ ve = sys.exc_info()[1]
+ raise OfxParserException(str(ve))
+ except TypeError:
+ raise OfxParserException(
+ six.u("No Transaction Date (a required field)"))
+ else:
+ raise OfxParserException(
+ six.u("Missing Transaction Date (a required field)"))
+
+ id_tag = txn_ofx.find('fitid')
+ if hasattr(id_tag, "contents"):
+ try:
+ transaction.id = id_tag.contents[0].strip()
+ except IndexError:
+ raise OfxParserException(six.u("Empty FIT id (a required field)"))
+ except TypeError:
+ raise OfxParserException(six.u("No FIT id (a required field)"))
+ else:
+ raise OfxParserException(six.u("Missing FIT id (a required field)"))
+
+ sic_tag = txn_ofx.find('sic')
+ if hasattr(sic_tag, 'contents'):
+ try:
+ transaction.sic = sic_tag.contents[0].strip()
+ except IndexError:
+ raise OfxParserException(six.u("Empty transaction Standard Industry Code (SIC)"))
+
+ if transaction.sic is not None and transaction.sic in mcc.codes:
+ try:
+ transaction.mcc = mcc.codes.get(transaction.sic, '').get('combined description')
+ except IndexError:
+ raise OfxParserException(six.u("Empty transaction Merchant Category Code (MCC)"))
+ except AttributeError:
+ if cls._fail_fast:
+ raise
+
+ checknum_tag = txn_ofx.find('checknum')
+ if hasattr(checknum_tag, 'contents'):
+ try:
+ transaction.checknum = checknum_tag.contents[0].strip()
+ except IndexError:
+ raise OfxParserException(six.u("Empty Check (or other reference) number"))
+
+ return transaction
diff --git a/ofxparse/ofxutil.py b/ofxparse/ofxutil.py
new file mode 100644
index 0000000..17c2f36
--- /dev/null
+++ b/ofxparse/ofxutil.py
@@ -0,0 +1,262 @@
+from __future__ import absolute_import, with_statement
+
+import os
+import copy
+import collections
+import xml.etree.ElementTree as ET
+
+if 'OrderedDict' in dir(collections):
+ odict = collections
+else:
+ import ordereddict as odict
+
+import six
+
+class InvalidOFXStructureException(Exception):
+ pass
+
+class OfxData(object):
+ def __init__(self, tag):
+ self.nodes = odict.OrderedDict()
+ self.tag = tag
+ self.data = ""
+
+ def add_tag(self, name):
+ name = name.lower()
+ if name not in self.nodes:
+ self.nodes[name] = OfxData(name.upper())
+ return self.nodes[name]
+ elif not isinstance(self.nodes[name], list):
+ self.nodes[name] = [self.nodes[name], OfxData(name.upper())]
+ else:
+ self.nodes[name].append(OfxData(name.upper()))
+ return self.nodes[name][-1]
+
+ def del_tag(self, name):
+ name = name.lower()
+ if name in self.nodes:
+ del self.nodes[name]
+
+ def __setattr__(self, name, value):
+ if name in self.__dict__ or name in ['nodes', 'tag', 'data', 'headers', 'xml']:
+ self.__dict__[name] = value
+ else:
+ self.del_tag(name)
+ if isinstance(value, list):
+ for val in value:
+ tag = self.add_tag(name)
+ tag.nodes = val.nodes
+ tag.data = val.data
+ elif isinstance(value, OfxData):
+ tag = self.add_tag(name)
+ tag.nodes = value.nodes
+ tag.data = value.data
+ else:
+ tag = self.add_tag(name)
+ tag.data = str(value)
+
+ def __getattr__(self, name):
+ if name in self.__dict__:
+ return self.__dict__[name]
+ elif name in self.__dict__['nodes']:
+ return self.__dict__['nodes'][name]
+ else:
+ tag = self.add_tag(name)
+ return tag
+
+ def __delattr__(self, name):
+ if name in self.__dict__:
+ del self.__dict__[name]
+ elif name in self.__dict__['nodes']:
+ del self.__dict__['nodes'][name]
+ else:
+ raise AttributeError
+
+ def __getitem__(self, name):
+ item_list = []
+ self.find(name, item_list)
+ return item_list
+
+ def find(self, name, item_list):
+ for n, child in six.iteritems(self.nodes):
+ if isinstance(child, OfxData):
+ if child.tag.lower() == name:
+ item_list.append(child)
+ child.find(name, item_list)
+ else:
+ for grandchild in child:
+ if grandchild.tag.lower() == name:
+ item_list.append(grandchild)
+ grandchild.find(name, item_list)
+
+ def __iter__(self):
+ for k, v in six.iteritems(self.nodes):
+ yield v
+
+ def __contains__(self, item):
+ return item in self.nodes
+
+ def __len__(self):
+ return len(self.nodes)
+
+ def __str__(self):
+ return os.linesep.join("\t" * line[1] + line[0] for line in self.format())
+
+ def format(self):
+ if self.data or not self.nodes:
+ if self.tag.upper() == "OFX":
+ return [["<%s>%s</%s>" % (self.tag, self.data if self.data else "", self.tag), 0]]
+ return [["<%s>%s" % (self.tag, self.data), 0]]
+ else:
+ ret = [["<%s>" % self.tag, -1]]
+ for name, child in six.iteritems(self.nodes):
+ if isinstance(child, OfxData):
+ ret.extend(child.format())
+ else:
+ for grandchild in child:
+ ret.extend(grandchild.format())
+ ret.append(["</%s>" % self.tag, -1])
+
+ for item in ret:
+ item[1] += 1
+
+ return ret
+
+
+class OfxUtil(OfxData):
+ def __init__(self, ofx_data=None):
+ super(OfxUtil, self).__init__('OFX')
+ self.headers = odict.OrderedDict()
+ self.xml = ""
+ if ofx_data:
+ if isinstance(ofx_data, six.string_types) and not ofx_data.lower().endswith('.ofx'):
+ self.parse(ofx_data)
+ else:
+ self.parse(open(ofx_data).read() if isinstance(ofx_data, six.string_types) else ofx_data.read())
+
+ def parse(self, ofx):
+ try:
+ for line in ofx.splitlines():
+ if line.strip() == "":
+ break
+ header, value = line.split(":")
+ self.headers[header] = value
+ except ValueError:
+ pass
+ except:
+ raise
+ finally:
+ if "OFXHEADER" not in self.headers:
+ self.headers["OFXHEADER"] = "100"
+ if "VERSION" not in self.headers:
+ self.headers["VERSION"] = "102"
+ if "SECURITY" not in self.headers:
+ self.headers["SECURITY"] = "NONE"
+ if "OLDFILEUID" not in self.headers:
+ self.headers["OLDFILEUID"] = "NONE"
+ if "NEWFILEUID" not in self.headers:
+ self.headers["NEWFILEUID"] = "NONE"
+
+ try:
+ tags = ofx.split("<")
+ if len(tags) > 1:
+ tags = ["<" + t.strip() for t in tags[1:]]
+
+ heirarchy = []
+ can_open = True
+
+ for i, tag in enumerate(tags):
+ gt = tag.index(">")
+ if tag[1] != "/":
+ #Is an opening tag
+ if not can_open:
+ tags[i - 1] = tags[i - 1] + "</" + heirarchy.pop() + ">"
+ can_open = True
+ tag_name = tag[1:gt].split()[0]
+ heirarchy.append(tag_name)
+ if len(tag) > gt + 1:
+ can_open = False
+ else:
+ #Is a closing tag
+ tag_name = tag[2:gt].split()[0]
+ if tag_name not in heirarchy:
+ #Close tag with no matching open, so delete it
+ tags[i] = tag[gt + 1:]
+ else:
+ #Close tag with matching open, but other open tags that need to be closed first
+ while(tag_name != heirarchy[-1]):
+ tags[i - 1] = tags[i - 1] + "</" + heirarchy.pop() + ">"
+ can_open = True
+ heirarchy.pop()
+
+ self.xml = ET.fromstringlist(tags)
+ self.load_from_xml(self, self.xml)
+ except:
+ raise InvalidOFXStructureException
+
+ def load_from_xml(self, ofx, xml):
+ ofx.data = xml.text
+ for child in xml:
+ tag = ofx.add_tag(child.tag)
+ self.load_from_xml(tag, child)
+
+ def reload_xml(self):
+ super(OfxUtil, self).__init__('OFX')
+ self.load_from_xml(self, self.xml)
+
+ def write(self, output_file):
+ with open(output_file, 'wb') as f:
+ f.write(str(self))
+
+ def __str__(self):
+ ret = os.linesep.join(":".join(line) for line in six.iteritems(self.headers)) + os.linesep * 2
+ ret += super(OfxUtil, self).__str__()
+ return ret
+
+if __name__ == "__main__":
+ here = os.path.dirname(__file__)
+ fixtures = os.path.join(here, '../tests/fixtures/')
+ ofx = OfxUtil(fixtures + 'checking.ofx')
+# ofx = OfxUtil(fixtures + 'fidelity.ofx')
+
+
+ #Manipulate OFX file via XML library
+# for transaction in ofx.xml.iter('STMTTRN'):
+# transaction.find('NAME').text = transaction.find('MEMO').text
+# transaction.remove(transaction.find('MEMO'))
+# ofx.reload_xml()
+
+
+ #Manipulate OFX file via object tree built from XML
+# for transaction in ofx.bankmsgsrsv1.stmttrnrs.stmtrs.banktranlist.stmttrn:
+# transaction.name = transaction.memo
+# del transaction.memo
+# transaction.notes = "Acknowledged"
+
+ #Modified sytnax for object tree data manipulation
+ #I'm using the __getitem__ method like the xml.iter method from ElementTree, as a recursive search
+ for transaction in ofx['stmttrn']:
+ transaction.name = transaction.memo
+ del transaction.memo
+ transaction.notes = "Acknowledged"
+
+# for bal in ofx['bal']:
+# print(bal)
+
+# ofx.test = "First assignment operation"
+# ofx.test = "Second assignment operation"
+#
+ print(ofx)
+
+ #Write OFX data to output file
+# ofx.write('out.ofx')
+
+# for file_name in os.listdir(fixtures):
+# if os.path.isfile(fixtures + file_name):
+# print "Attempting to parse", file_name
+# ofx = OfxParser('fixtures/' + file_name)
+#
+# file_parts = file_name.split(".")
+# file_parts.insert(1, 'v2')
+# with open('fixtures/' + ".".join(file_parts), 'wb') as f:
+# f.write(str(ofx))
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 0000000..d9d658a
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,8 @@
+[egg_info]
+tag_svn_revision = 0
+tag_build =
+tag_date = 0
+
+[aliases]
+release = register sdist bdist_egg upload
+
diff --git a/setup.py b/setup.py
new file mode 100644
index 0000000..8450a12
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,66 @@
+import re
+import sys
+
+from setuptools import setup, find_packages
+
+# Read the version from __init__ to avoid importing ofxparse while installing.
+# This lets the install work when the user does not have BeautifulSoup
+# installed.
+VERSION = re.search(r"__version__ = '(.*?)'",
+ open("ofxparse/__init__.py").read()).group(1)
+
+# Use BeautifulSoup 3 on Python 2.5 and earlier and BeautifulSoup 4 otherwise
+if sys.version_info < (2,6):
+ REQUIRES = [
+ "beautifulSoup>=3.0",
+ ]
+else:
+ REQUIRES = [
+ "beautifulsoup4"
+ ]
+
+if sys.version_info < (2,7):
+ REQUIRES.extend([
+ "ordereddict>=1.1",
+ ])
+
+REQUIRES.extend([
+ 'six',
+])
+
+setup_params = dict(
+ name='ofxparse',
+ version=VERSION,
+ description=("Tools for working with the OFX (Open Financial Exchange)"
+ " file format"),
+ long_description=open("./README", "r").read(),
+ # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
+ classifiers=[
+ "Development Status :: 4 - Beta",
+ "Intended Audience :: Developers",
+ "Natural Language :: English",
+ "Operating System :: OS Independent",
+ "Programming Language :: Python :: 2.5",
+ "Programming Language :: Python :: 2.6",
+ "Programming Language :: Python :: 2.7",
+ "Programming Language :: Python :: 3",
+ "Topic :: Software Development :: Libraries :: Python Modules",
+ "Topic :: Utilities",
+ "License :: OSI Approved :: MIT License",
+ ],
+ keywords='ofx, Open Financial Exchange, file formats',
+ author='Jerry Seutter',
+ author_email='jseutter.ofxparse@gmail.com',
+ url='http://sites.google.com/site/ofxparse',
+ license='MIT License',
+ packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
+ include_package_data=True,
+ zip_safe=True,
+ install_requires=REQUIRES,
+ entry_points="""
+ """,
+ test_suite='tests',
+ )
+
+if __name__ == '__main__':
+ setup(**setup_params)
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/__init__.py
diff --git a/tests/fixtures/account_listing_aggregation.ofx b/tests/fixtures/account_listing_aggregation.ofx
new file mode 100644
index 0000000..5ecf241
--- /dev/null
+++ b/tests/fixtures/account_listing_aggregation.ofx
@@ -0,0 +1,51 @@
+OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:85230611d6fc414fa391a8c2425f8e9e
+
+<OFX>
+<SIGNONMSGSRSV1>
+<SONRS>
+<STATUS><CODE>0<SEVERITY>INFO<MESSAGE>Success</STATUS>
+<DTSERVER>20120814060142<LANGUAGE>ENG
+<FI><ORG>USAA<FID>24591</FI>
+</SONRS>
+</SIGNONMSGSRSV1>
+<SIGNUPMSGSRSV1>
+<ACCTINFOTRNRS>
+<TRNUID>09ca62d0198049388252f0a547bae86a<STATUS>
+<CODE>0<SEVERITY>INFO<MESSAGE>Success</STATUS>
+<CLTCOOKIE>4<ACCTINFORS>
+<DTACCTUP>20120814120000<ACCTINFO>
+<DESC>USAA SAVINGS<BANKACCTINFO>
+<BANKACCTFROM>
+<BANKID>314074269<ACCTID>0000000001<ACCTTYPE>SAVINGS</BANKACCTFROM>
+<SUPTXDL>Y<XFERSRC>N<XFERDEST>N<SVCSTATUS>ACTIVE</BANKACCTINFO>
+</ACCTINFO>
+<ACCTINFO>
+<DESC>FOUR STAR CHECKING<BANKACCTINFO>
+<BANKACCTFROM>
+<BANKID>314074269<ACCTID>0000000002<ACCTTYPE>CHECKING</BANKACCTFROM>
+<SUPTXDL>Y<XFERSRC>N<XFERDEST>N<SVCSTATUS>ACTIVE</BANKACCTINFO>
+</ACCTINFO>
+<ACCTINFO>
+<DESC>LINE OF CREDIT<BANKACCTINFO>
+<BANKACCTFROM>
+<BANKID>314074269<ACCTID>00000000000003<ACCTTYPE>CREDITLINE</BANKACCTFROM>
+<SUPTXDL>Y<XFERSRC>N<XFERDEST>N<SVCSTATUS>ACTIVE</BANKACCTINFO>
+</ACCTINFO>
+<ACCTINFO>
+<DESC>MY CREDIT CARD<CCACCTINFO>
+<CCACCTFROM>
+<ACCTID>4111111111111111</CCACCTFROM>
+<SUPTXDL>Y<XFERSRC>N<XFERDEST>N<SVCSTATUS>ACTIVE</CCACCTINFO>
+</ACCTINFO>
+</ACCTINFORS>
+</ACCTINFOTRNRS>
+</SIGNUPMSGSRSV1>
+</OFX>
diff --git a/tests/fixtures/bank_medium.ofx b/tests/fixtures/bank_medium.ofx
new file mode 100644
index 0000000..08c71c3
--- /dev/null
+++ b/tests/fixtures/bank_medium.ofx
@@ -0,0 +1,18 @@
+OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+
+<OFX><SIGNONMSGSRSV1><SONRS><STATUS><CODE>0<SEVERITY>INFO<MESSAGE>OK</STATUS><DTSERVER>20090523122017<LANGUAGE>ENG<DTPROFUP>20090523122017<DTACCTUP>20090523122017<INTU.BID>00024</SONRS></SIGNONMSGSRSV1>
+<BANKMSGSRSV1><STMTTRNRS><TRNUID>20090523122017<STATUS><CODE>0<SEVERITY>INFO<MESSAGE>OK</STATUS>
+<STMTRS><CURDEF>CAD<BANKACCTFROM><BANKID>160000100<BRANCHID>00<ACCTID>12300 000012345678<ACCTTYPE>CHECKING</BANKACCTFROM>
+<BANKTRANLIST><DTSTART>20090401<DTEND>20090523122017
+<STMTTRN><TRNTYPE>POS<DTPOSTED>20090401122017.000[-5:EST]<TRNAMT>-6.60<FITID>0000123456782009040100001<NAME>MCDONALD'S #112<MEMO>POS MERCHANDISE;MCDONALD'S #112</STMTTRN>
+<STMTTRN><TRNTYPE>CHECK<DTPOSTED>20090402122017.000[-5:EST]<TRNAMT>-316.67<FITID>0000123456782009040200004<CHECKNUM>0<NAME>Joe's Bald Hairstyles<MEMO>MISCELLANEOUS PAYMENTS;Joe's Bald Hairstyles</STMTTRN>
+<STMTTRN><TRNTYPE>POS<DTPOSTED>20090403122017.000[-5:EST]<TRNAMT>-22.00<FITID>0000123456782009040300005<NAME>CONNIE'S HAIR D<MEMO>POS MERCHANDISE;CONNIE'S HAIR D</STMTTRN>
+</BANKTRANLIST><LEDGERBAL><BALAMT>382.34<DTASOF>20090523122017</LEDGERBAL><AVAILBAL><BALAMT>682.34<DTASOF>20090523122017</AVAILBAL></STMTRS></STMTTRNRS></BANKMSGSRSV1></OFX>
diff --git a/tests/fixtures/bank_small.ofx b/tests/fixtures/bank_small.ofx
new file mode 100644
index 0000000..3040f8f
--- /dev/null
+++ b/tests/fixtures/bank_small.ofx
@@ -0,0 +1,11 @@
+OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+
+<OFX></OFX>
diff --git a/tests/fixtures/checking.ofx b/tests/fixtures/checking.ofx
new file mode 100644
index 0000000..6c32904
--- /dev/null
+++ b/tests/fixtures/checking.ofx
@@ -0,0 +1,83 @@
+OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+
+<OFX>
+ <SIGNONMSGSRSV1>
+ <SONRS>
+ <STATUS>
+ <CODE>0
+ <SEVERITY>INFO
+ </STATUS>
+ <DTSERVER>20130525225731.258
+ <LANGUAGE>ENG
+ <DTPROFUP>20050531060000.000
+ <FI>
+ <ORG>FAKE
+ <FID>1101
+ </FI>
+ <INTU.BID>51123
+ <INTU.USERID>9774652
+ </SONRS>
+ </SIGNONMSGSRSV1>
+ <BANKMSGSRSV1>
+ <STMTTRNRS>
+ <TRNUID>0
+ <STATUS>
+ <CODE>0
+ <SEVERITY>INFO
+ </STATUS>
+ <STMTRS>
+ <CURDEF>USD
+ <BANKACCTFROM>
+ <BANKID>5472369148
+ <ACCTID>1452687~7
+ <ACCTTYPE>CHECKING
+ </BANKACCTFROM>
+ <BANKTRANLIST>
+ <DTSTART>20000101070000.000
+ <DTEND>20130525060000.000
+ <STMTTRN>
+ <TRNTYPE>CREDIT
+ <DTPOSTED>20110331120000.000
+ <TRNAMT>0.01
+ <FITID>0000486
+ <NAME>DIVIDEND EARNED FOR PERIOD OF 03
+ <MEMO>DIVIDEND EARNED FOR PERIOD OF 03/01/2011 THROUGH 03/31/2011 ANNUAL PERCENTAGE YIELD EARNED IS 0.05%
+ </STMTTRN>
+ <STMTTRN>
+ <TRNTYPE>DEBIT
+ <DTPOSTED>20110405120000.000
+ <TRNAMT>-34.51
+ <FITID>0000487
+ <NAME>AUTOMATIC WITHDRAWAL, ELECTRIC BILL
+ <MEMO>AUTOMATIC WITHDRAWAL, ELECTRIC BILL WEB(S )
+ </STMTTRN>
+ <STMTTRN>
+ <TRNTYPE>CHECK
+ <DTPOSTED>20110407120000.000
+ <TRNAMT>-25.00
+ <FITID>0000488
+ <CHECKNUM>319
+ <NAME>RETURNED CHECK FEE, CHECK # 319
+ <MEMO>RETURNED CHECK FEE, CHECK # 319 FOR $45.33 ON 04/07/11
+ </STMTTRN>
+ </BANKTRANLIST>
+ <LEDGERBAL>
+ <BALAMT>100.99
+ <DTASOF>20130525225731.258
+ </LEDGERBAL>
+ <AVAILBAL>
+ <BALAMT>75.99
+ <DTASOF>20130525225731.258
+ </AVAILBAL>
+ </STMTRS>
+ </STMTTRNRS>
+ </BANKMSGSRSV1>
+</OFX> \ No newline at end of file
diff --git a/tests/fixtures/fail_nice/date_missing.ofx b/tests/fixtures/fail_nice/date_missing.ofx
new file mode 100644
index 0000000..931f438
--- /dev/null
+++ b/tests/fixtures/fail_nice/date_missing.ofx
@@ -0,0 +1,65 @@
+
+
+<OFX>
+ <SIGNONMSGSRSV1>
+ <SONRS>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ </STATUS>
+ <DTSERVER>20110614</DTSERVER>
+ <LANGUAGE></LANGUAGE>
+ </SONRS>
+ </SIGNONMSGSRSV1>
+ <BANKMSGSRSV1>
+ <STMTTRNRS>
+ <TRNUID>1</TRNUID>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ </STATUS>
+ <STMTRS>
+ <CURDEF>USD</CURDEF>
+ <BANKACCTFROM>
+ <BANKID>123845030</BANKID>
+ <ACCTID>192639749</ACCTID>
+ <ACCTTYPE>CHECKING</ACCTTYPE>
+ </BANKACCTFROM>
+
+ <BANKTRANLIST>
+ <DTSTART>20110412</DTSTART>
+ <DTEND>20110614</DTEND>
+
+ <STMTTRN>
+ <TRNTYPE>OTHER</TRNTYPE>
+ <TRNAMT>-80.00</TRNAMT>
+ <FITID>184997056</FITID>
+ <NAME>TestFail1</NAME>
+ </STMTTRN>
+
+ <STMTTRN>
+ <TRNTYPE>OTHER</TRNTYPE>
+ <DTPOSTED></DTPOSTED>
+ <TRNAMT>200.00</TRNAMT>
+ <FITID>2000957249</FITID>
+ <NAME>TestFail2</NAME>
+ </STMTTRN>
+
+ <STMTTRN>
+ <TRNTYPE>OTHER</TRNTYPE>
+ <DTPOSTED>20120231</DTPOSTED>
+ <TRNAMT>200.00</TRNAMT>
+ <FITID>2000957249</FITID>
+ <NAME>TestFail2</NAME>
+ </STMTTRN>
+
+ </BANKTRANLIST>
+
+ <LEDGERBAL>
+ <BALAMT>0</BALAMT>
+ <DTASOF>20110614</DTASOF>
+ </LEDGERBAL>
+ </STMTRS>
+ </STMTTRNRS>
+ </BANKMSGSRSV1>
+</OFX>
diff --git a/tests/fixtures/fail_nice/decimal_error.ofx b/tests/fixtures/fail_nice/decimal_error.ofx
new file mode 100644
index 0000000..4389f6c
--- /dev/null
+++ b/tests/fixtures/fail_nice/decimal_error.ofx
@@ -0,0 +1,51 @@
+
+
+<OFX>
+ <SIGNONMSGSRSV1>
+ <SONRS>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ </STATUS>
+ <DTSERVER>20110614</DTSERVER>
+ <LANGUAGE></LANGUAGE>
+ </SONRS>
+ </SIGNONMSGSRSV1>
+ <BANKMSGSRSV1>
+ <STMTTRNRS>
+ <TRNUID>1</TRNUID>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ </STATUS>
+ <STMTRS>
+ <CURDEF>CAD
+ <BANKACCTFROM>
+ <BANKID>123845030</BANKID>
+ <ACCTID>192639749</ACCTID>
+ <ACCTTYPE>CHECKING</ACCTTYPE>
+ </BANKACCTFROM>
+
+ <BANKTRANLIST>
+ <DTSTART>20110412</DTSTART>
+ <DTEND>20110614</DTEND>
+
+
+ <STMTTRN>
+ <TRNTYPE>OTHER</TRNTYPE>
+ <DTPOSTED>201120000000</DTPOSTED>
+ <TRNAMT>$120</TRNAMT>
+ <FITID>2000957249</FITID>
+ <NAME>Fail1</NAME>
+ </STMTTRN>
+
+ </BANKTRANLIST>
+
+ <LEDGERBAL>
+ <BALAMT>0</BALAMT>
+ <DTASOF>20110614</DTASOF>
+ </LEDGERBAL>
+ </STMTRS>
+ </STMTTRNRS>
+ </BANKMSGSRSV1>
+</OFX>
diff --git a/tests/fixtures/fail_nice/empty_balance.ofx b/tests/fixtures/fail_nice/empty_balance.ofx
new file mode 100644
index 0000000..bf76b48
--- /dev/null
+++ b/tests/fixtures/fail_nice/empty_balance.ofx
@@ -0,0 +1,48 @@
+<OFX>
+ <SIGNONMSGSRSV1>
+ <SONRS>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ </STATUS>
+ <DTSERVER>20110614</DTSERVER>
+ <LANGUAGE></LANGUAGE>
+ </SONRS>
+ </SIGNONMSGSRSV1>
+ <BANKMSGSRSV1>
+ <STMTTRNRS>
+ <TRNUID>1</TRNUID>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ </STATUS>
+ <STMTRS>
+ <CURDEF>CAD
+ <BANKACCTFROM>
+ <BANKID>123845030</BANKID>
+ <ACCTID>192639749</ACCTID>
+ <ACCTTYPE>CHECKING</ACCTTYPE>
+ </BANKACCTFROM>
+ <BANKTRANLIST>
+ <DTSTART>20110412</DTSTART>
+ <DTEND>20110614</DTEND>
+ <STMTTRN>
+ <TRNTYPE>OTHER</TRNTYPE>
+ <DTPOSTED>20110308020000</DTPOSTED>
+ <TRNAMT>120</TRNAMT>
+ <FITID>2000957249</FITID>
+ <NAME>Foobar</NAME>
+ </STMTTRN>
+ </BANKTRANLIST>
+ <LEDGERBAL>
+ <BALAMT> </BALAMT>
+ <DTASOF>20110614</DTASOF>
+ </LEDGERBAL>
+ <AVAILBAL>
+ <BALAMT></BALAMT>
+ <DTASOF>20110614</DTASOF>
+ </AVAILBAL>
+ </STMTRS>
+ </STMTTRNRS>
+ </BANKMSGSRSV1>
+</OFX>
diff --git a/tests/fixtures/fidelity.ofx b/tests/fixtures/fidelity.ofx
new file mode 100644
index 0000000..de8e580
--- /dev/null
+++ b/tests/fixtures/fidelity.ofx
@@ -0,0 +1,11 @@
+OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0
+
+<OFX><SIGNONMSGSRSV1><SONRS><STATUS><CODE>0<SEVERITY>INFO<MESSAGE>SUCCESS</STATUS><DTSERVER>20120908190849.317[-4:EDT]<LANGUAGE>ENG<FI><ORG>fidelity.com<FID>7776</FI></SONRS></SIGNONMSGSRSV1><INVSTMTMSGSRSV1><INVSTMTTRNRS><TRNUID>a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0<STATUS><CODE>0<SEVERITY>INFO<MESSAGE>SUCCESS</STATUS><INVSTMTRS><DTASOF>20120908033034.000[-4:EDT]<CURDEF>USD<INVACCTFROM><BROKERID>fidelity.com<ACCTID>01234567890</INVACCTFROM><INVTRANLIST><DTSTART>20120710000000.000[-4:EDT]<DTEND>20120908190849.555[-4:EDT]<BUYSTOCK><INVBUY><INVTRAN><FITID>0123456789020201120120720<DTTRADE>20120720000000.000[-4:EDT]<MEMO>YOU BOUGHT</INVTRAN><SECID><UNIQUEID>458140100<UNIQUEIDTYPE>CUSIP</SECID><UNITS>+0000000000100.00000<UNITPRICE>000000025.635000000<COMMISSION>+00000000000007.9500<FEES>+00000000000000.0000<TOTAL>-00000000002571.4500<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY><SUBACCTSEC>CASH<SUBACCTFUND>CASH</INVBUY><BUYTYPE>BUY </BUYSTOCK><BUYSTOCK><INVBUY><INVTRAN><FITID>0123456789020901120120727<DTTRADE>20120727000000.000[-4:EDT]<MEMO>YOU BOUGHT</INVTRAN><SECID><UNIQUEID>G7945E105<UNIQUEIDTYPE>CUSIP</SECID><UNITS>+0000000000128.00000<UNITPRICE>000000039.390900000<COMMISSION>+00000000000007.9500<FEES>+00000000000000.0000<TOTAL>-00000000005049.9900<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY><SUBACCTSEC>CASH<SUBACCTFUND>CASH</INVBUY><BUYTYPE>BUY </BUYSTOCK><BUYSTOCK><INVBUY><INVTRAN><FITID>0123456789020901220120727<DTTRADE>20120727000000.000[-4:EDT]<MEMO>YOU BOUGHT</INVTRAN><SECID><UNIQUEID>431571108<UNIQUEIDTYPE>CUSIP</SECID><UNITS>+0000000000115.00000<UNITPRICE>000000017.250000000<COMMISSION>+00000000000007.9500<FEES>+00000000000000.0000<TOTAL>-00000000001991.7000<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY><SUBACCTSEC>CASH<SUBACCTFUND>CASH</INVBUY><BUYTYPE>BUY </BUYSTOCK><BUYSTOCK><INVBUY><INVTRAN><FITID>0123456789021301120120731<DTTRADE>20120731000000.000[-4:EDT]<MEMO>YOU BOUGHT</INVTRAN><SECID><UNIQUEID>19421R200<UNIQUEIDTYPE>CUSIP</SECID><UNITS>+0000000000069.00000<UNITPRICE>000000014.469900000<COMMISSION>+00000000000007.9500<FEES>+00000000000000.0000<TOTAL>-00000000001006.3700<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY><SUBACCTSEC>CASH<SUBACCTFUND>CASH</INVBUY><BUYTYPE>BUY </BUYSTOCK><BUYSTOCK><INVBUY><INVTRAN><FITID>0123456789021301620120731<DTTRADE>20120731000000.000[-4:EDT]<MEMO>YOU BOUGHT</INVTRAN><SECID><UNIQUEID>98417P105<UNIQUEIDTYPE>CUSIP</SECID><UNITS>+0000000000386.00000<UNITPRICE>000000002.588700000<COMMISSION>+00000000000007.9500<FEES>+00000000000000.0000<TOTAL>-00000000001007.1900<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY><SUBACCTSEC>CASH<SUBACCTFUND>CASH</INVBUY><BUYTYPE>BUY </BUYSTOCK><BUYSTOCK><INVBUY><INVTRAN><FITID>0123456789023501220120820<DTTRADE>20120820000000.000[-4:EDT]<MEMO>REINVESTMENT</INVTRAN><SECID><UNIQUEID>98417P105<UNIQUEIDTYPE>CUSIP</SECID><UNITS>+0000000000004.90900<UNITPRICE>000000002.947400000<COMMISSION>+00000000000000.0000<FEES>+00000000000000.0000<TOTAL>-00000000000014.4700<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY><SUBACCTSEC>CASH<SUBACCTFUND>CASH</INVBUY><BUYTYPE>BUY </BUYSTOCK><BUYSTOCK><INVBUY><INVTRAN><FITID>0123456789024401120120831<DTTRADE>20120831000000.000[-4:EDT]<MEMO>REINVESTMENT</INVTRAN><SECID><UNIQUEID>19421R200<UNIQUEIDTYPE>CUSIP</SECID><UNITS>+0000000000001.57300<UNITPRICE>000000014.257000000<COMMISSION>+00000000000000.0000<FEES>+00000000000000.0000<TOTAL>-00000000000022.4300<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY><SUBACCTSEC>CASH<SUBACCTFUND>CASH</INVBUY><BUYTYPE>BUY </BUYSTOCK><BUYSTOCK><INVBUY><INVTRAN><FITID>0123456789024801120120901<DTTRADE>20120901000000.000[-4:EDT]<MEMO>REINVESTMENT</INVTRAN><SECID><UNIQUEID>458140100<UNIQUEIDTYPE>CUSIP</SECID><UNITS>+0000000000000.91100<UNITPRICE>000000024.705500000<COMMISSION>+00000000000000.0000<FEES>+00000000000000.0000<TOTAL>-00000000000022.5000<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY><SUBACCTSEC>CASH<SUBACCTFUND>CASH</INVBUY><BUYTYPE>BUY </BUYSTOCK><INCOME> <INVTRAN><FITID>0123456789021301520120731<DTTRADE>20120731000000.000[-4:EDT]<MEMO>DIVIDEND RECEIVED</INVTRAN><SECID><UNIQUEID>78462F103<UNIQUEIDTYPE>CUSIP</SECID><INCOMETYPE>DIV<TOTAL>+00000000000005.5300<SUBACCTSEC>CASH<SUBACCTFUND>CASH<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY> </INCOME><INCOME> <INVTRAN><FITID>0123456789023501320120820<DTTRADE>20120820000000.000[-4:EDT]<MEMO>DIVIDEND RECEIVED</INVTRAN><SECID><UNIQUEID>98417P105<UNIQUEIDTYPE>CUSIP</SECID><INCOMETYPE>DIV<TOTAL>+00000000000015.4400<SUBACCTSEC>CASH<SUBACCTFUND>CASH<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY> </INCOME><INCOME> <INVTRAN><FITID>0123456789024401220120831<DTTRADE>20120831000000.000[-4:EDT]<MEMO>DIVIDEND RECEIVED</INVTRAN><SECID><UNIQUEID>19421R200<UNIQUEIDTYPE>CUSIP</SECID><INCOMETYPE>DIV<TOTAL>+00000000000022.4300<SUBACCTSEC>CASH<SUBACCTFUND>CASH<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY> </INCOME><INCOME> <INVTRAN><FITID>0123456789024801220120901<DTTRADE>20120901000000.000[-4:EDT]<MEMO>DIVIDEND RECEIVED</INVTRAN><SECID><UNIQUEID>458140100<UNIQUEIDTYPE>CUSIP</SECID><INCOMETYPE>DIV<TOTAL>+00000000000022.5000<SUBACCTSEC>CASH<SUBACCTFUND>CASH<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY> </INCOME><SELLSTOCK><INVSELL><INVTRAN><FITID>0123456789020901320120727<DTTRADE>20120727000000.000[-4:EDT]<MEMO>YOU SOLD</INVTRAN><SECID><UNIQUEID>78462F103<UNIQUEIDTYPE>CUSIP</SECID><UNITS>-0000000000008.00000<UNITPRICE>000000137.160000000<COMMISSION>+00000000000007.9500<FEES>+00000000000000.0000<TOTAL>+00000000001089.3000<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY><SUBACCTSEC>CASH<SUBACCTFUND>CASH</INVSELL><SELLTYPE>SELL </SELLSTOCK><SELLSTOCK><INVSELL><INVTRAN><FITID>0123456789021401420120801<DTTRADE>20120801000000.000[-4:EDT]<MEMO>IN LIEU OF FRX SHARE</INVTRAN><SECID><UNIQUEID>78462F103<UNIQUEIDTYPE>CUSIP</SECID><UNITS>-0000000000000.03500<UNITPRICE>000000137.142857143<COMMISSION>+00000000000000.0000<FEES>+00000000000000.0000<TOTAL>+00000000000004.8000<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY><SUBACCTSEC>CASH<SUBACCTFUND>CASH</INVSELL><SELLTYPE>SELL </SELLSTOCK><INVBANKTRAN> <STMTTRN><TRNTYPE>DEP<DTPOSTED>20120731000000.000[-4:EDT]<TRNAMT>+00000000000000.2400<FITID>0123456789021301320120731<NAME>INTEREST EARNED<MEMO>INTEREST EARNED<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY> </STMTTRN><SUBACCTFUND>CASH </INVBANKTRAN><INVBANKTRAN> <STMTTRN><TRNTYPE>OTHER<DTPOSTED>20120820000000.000[-4:EDT]<TRNAMT>-00000000000000.9700<FITID>0123456789023501120120820<NAME>LATE SETTLEMENT FEE<MEMO>LATE SETTLEMENT FEE<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY> </STMTTRN><SUBACCTFUND>CASH </INVBANKTRAN><INVBANKTRAN> <STMTTRN><TRNTYPE>DEP<DTPOSTED>20120831000000.000[-4:EDT]<TRNAMT>+00000000000000.1600<FITID>0123456789024401420120831<NAME>INTEREST EARNED<MEMO>INTEREST EARNED<CURRENCY><CURRATE>1.00<CURSYM>USD</CURRENCY> </STMTTRN><SUBACCTFUND>CASH </INVBANKTRAN></INVTRANLIST><INVPOSLIST><POSSTOCK><INVPOS><SECID><UNIQUEID>G7945E105<UNIQUEIDTYPE>CUSIP</SECID><HELDINACCT>CASH<POSTYPE>LONG<UNITS>128.00000<UNITPRICE>40.8700000<MKTVAL>+00000005231.36<DTPRICEASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.0<CURSYM>USD</CURRENCY></INVPOS></POSSTOCK><POSSTOCK><INVPOS><SECID><UNIQUEID>19421R200<UNIQUEIDTYPE>CUSIP</SECID><HELDINACCT>CASH<POSTYPE>LONG<UNITS>70.57300<UNITPRICE>14.3200000<MKTVAL>+00000001010.60<DTPRICEASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.0<CURSYM>USD</CURRENCY></INVPOS></POSSTOCK><POSSTOCK><INVPOS><SECID><UNIQUEID>431571108<UNIQUEIDTYPE>CUSIP</SECID><HELDINACCT>CASH<POSTYPE>LONG<UNITS>115.00000<UNITPRICE>18.9300000<MKTVAL>+00000002176.95<DTPRICEASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.0<CURSYM>USD</CURRENCY></INVPOS></POSSTOCK><POSSTOCK><INVPOS><SECID><UNIQUEID>458140100<UNIQUEIDTYPE>CUSIP</SECID><HELDINACCT>CASH<POSTYPE>LONG<UNITS>100.91100<UNITPRICE>24.1900000<MKTVAL>+00000002441.03<DTPRICEASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.0<CURSYM>USD</CURRENCY></INVPOS></POSSTOCK><POSSTOCK><INVPOS><SECID><UNIQUEID>756577102<UNIQUEIDTYPE>CUSIP</SECID><HELDINACCT>CASH<POSTYPE>LONG<UNITS>50.00000<UNITPRICE>59.1500000<MKTVAL>+00000002957.50<DTPRICEASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.0<CURSYM>USD</CURRENCY></INVPOS></POSSTOCK><POSSTOCK><INVPOS><SECID><UNIQUEID>98417P105<UNIQUEIDTYPE>CUSIP</SECID><HELDINACCT>CASH<POSTYPE>LONG<UNITS>390.90900<UNITPRICE>2.8200000<MKTVAL>+00000001102.36<DTPRICEASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.0<CURSYM>USD</CURRENCY></INVPOS></POSSTOCK></INVPOSLIST><INVBAL><AVAILCASH>18073.98<MARGINBALANCE>+00000000000.00<SHORTBALANCE>+00000000000.00<BUYPOWER>+00000000000.00<BALLIST><BAL><NAME>Networth<DESC>The net market value of all long and short positions in the account<BALTYPE>DOLLAR<VALUE>32993.79<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Margin Equity<DESC>The margin market value less any margin debit balance<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Margin Equity Percentage<DESC>Margin equity / market value of long and short positions<BALTYPE>PERCENT<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Cash Debit Balance<DESC>Cash Debit Balance<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Total Money Markets<DESC>The total value of all money market positions in the cash account<BALTYPE>DOLLAR<VALUE>18073.98<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>House Surplus<DESC>Equity amount above house requirements<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>NYSE Surplus<DESC>Equity amount above exchange requirements<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Federal Surplus<DESC>Amount above federal requirements<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Buying Power - Equities<DESC>Amount of equities you can buy on margin without generating a margin call<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Buying Power - Municipal Bonds<DESC>Amount of municipal bonds you can buy on margin without generating a margin call<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Buying Power - Government Bonds<DESC>Amount of government bonds you can buy on margin without generating a margin cal<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Buying Power - Corporate Bonds<DESC>Amount you can buy of corporate bonds on margin with no margin call<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Option Market Value<DESC>The market value of all options in the account<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Option In The Money Amount<DESC>The in-the-money amount on covered options<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Cash Market value<DESC>Total value of all cash account positions<BALTYPE>DOLLAR<VALUE>14919.8<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Margin Market Value<DESC>Total value of positions in margin less in-the-money amount of covered options<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Short Market Value<DESC>Total value of short positions less in-the-money amount of covered put options<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL><BAL><NAME>Available to Borrow<DESC>Cash amount that can be borrowed without generating a margin call<BALTYPE>DOLLAR<VALUE>0.0<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD</CURRENCY></BAL></BALLIST></INVBAL></INVSTMTRS></INVSTMTTRNRS></INVSTMTMSGSRSV1><SECLISTMSGSRSV1><SECLIST><STOCKINFO><SECINFO><SECID><UNIQUEID>G7945E105<UNIQUEIDTYPE>CUSIP</SECID><SECNAME>SEADRILL LTD USD2<TICKER>SDRL<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD </CURRENCY></SECINFO><STOCKTYPE>COMMON<DTYIELDASOF>20120908033034.000[-4:EDT]</STOCKINFO><STOCKINFO><SECINFO><SECID><UNIQUEID>19421R200<UNIQUEIDTYPE>CUSIP</SECID><SECNAME>COLLECTORS UNIVERSE INC<TICKER>CLCT<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD </CURRENCY></SECINFO><STOCKTYPE>COMMON<DTYIELDASOF>20120908033034.000[-4:EDT]</STOCKINFO><STOCKINFO><SECINFO><SECID><UNIQUEID>431571108<UNIQUEIDTYPE>CUSIP</SECID><SECNAME>HILLENBRAND INC COM<TICKER>HI<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD </CURRENCY></SECINFO><STOCKTYPE>COMMON<DTYIELDASOF>20120908033034.000[-4:EDT]</STOCKINFO><STOCKINFO><SECINFO><SECID><UNIQUEID>458140100<UNIQUEIDTYPE>CUSIP</SECID><SECNAME>INTEL CORP<TICKER>INTC<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD </CURRENCY></SECINFO><STOCKTYPE>COMMON<DTYIELDASOF>20120908033034.000[-4:EDT]</STOCKINFO><STOCKINFO><SECINFO><SECID><UNIQUEID>756577102<UNIQUEIDTYPE>CUSIP</SECID><SECNAME>RED HAT INC<TICKER>RHT<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD </CURRENCY></SECINFO><STOCKTYPE>COMMON<DTYIELDASOF>20120908033034.000[-4:EDT]</STOCKINFO><STOCKINFO><SECINFO><SECID><UNIQUEID>98417P105<UNIQUEIDTYPE>CUSIP</SECID><SECNAME>XINYUAN REAL ESTATE ADR EACH REPR 2 ORD SHS<TICKER>XIN<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD </CURRENCY></SECINFO><STOCKTYPE>COMMON<DTYIELDASOF>20120908033034.000[-4:EDT]</STOCKINFO><STOCKINFO><SECINFO><SECID><UNIQUEID>78462F103<UNIQUEIDTYPE>CUSIP</SECID><SECNAME>SPDR S&amp;P 500 ETF TRUST UNIT SER 1 S&amp;P<TICKER>SPY<DTASOF>20120908033034.000[-4:EDT]<CURRENCY><CURRATE>1.000<CURSYM>USD </CURRENCY></SECINFO><STOCKTYPE>COMMON<DTYIELDASOF>20120908033034.000[-4:EDT]</STOCKINFO></SECLIST></SECLISTMSGSRSV1></OFX>
diff --git a/tests/fixtures/investment_medium.ofx b/tests/fixtures/investment_medium.ofx
new file mode 100644
index 0000000..87f6eba
--- /dev/null
+++ b/tests/fixtures/investment_medium.ofx
@@ -0,0 +1,119 @@
+OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+<OFX>
+ <SIGNONMSGSRSV1>
+ <SONRS>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ </STATUS>
+ <DTSERVER>20091217162416.000[-:EST]</DTSERVER>
+ <LANGUAGE>ENG</LANGUAGE>
+ <FI>
+ <ORG>REDACTEDINC-US</ORG>
+ <FID>1234</FID>
+ </FI>
+ </SONRS>
+ </SIGNONMSGSRSV1>
+ <INVSTMTMSGSRSV1>
+ <INVSTMTTRNRS>
+ <TRNUID>0</TRNUID>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ </STATUS>
+ <INVSTMTRS>
+ <DTASOF>20091215202000.000[-4:EST]</DTASOF>
+ <CURDEF>CAD</CURDEF>
+ <INVACCTFROM>
+ <BROKERID>404</BROKERID>
+ <ACCTID>ABC123</ACCTID>
+ </INVACCTFROM>
+ <INVTRANLIST>
+ <DTSTART>20091214202000.000[-5:EST]</DTSTART>
+ <DTEND>20091215202000.000[-5:EST]</DTEND>
+ <INVBANKTRAN>
+ <STMTTRN>
+ <TRNTYPE>DEBIT</TRNTYPE>
+ <DTPOSTED>20091215202000.000[-4:EST]</DTPOSTED>
+ <TRNAMT>-3.65</TRNAMT>
+ <FITID>20091215.U489357.e.USD.1510480481</FITID>
+ <MEMO>CASH TRADE: AUD.USD</MEMO>
+ <CURRENCY>
+ <CURRATE>1.06</CURRATE>
+ <CURSYM>USD</CURSYM>
+ </CURRENCY>
+ </STMTTRN>
+ <SUBACCTFUND>CASH</SUBACCTFUND>
+ </INVBANKTRAN>
+ <INVBANKTRAN>
+ <STMTTRN>
+ <TRNTYPE>CREDIT</TRNTYPE>
+ <DTPOSTED>20091215202000.000[-4:EST]</DTPOSTED>
+ <TRNAMT>3.35</TRNAMT>
+ <FITID>20091215.U489357.e.USD.1510982018</FITID>
+ <MEMO>CASH TRADE: AUD.USD</MEMO>
+ <CURRENCY>
+ <CURRATE>1.06</CURRATE>
+ <CURSYM>USD</CURSYM>
+ </CURRENCY>
+ </STMTTRN>
+ <SUBACCTFUND>CASH</SUBACCTFUND>
+ </INVBANKTRAN>
+ <INVBANKTRAN>
+ <STMTTRN>
+ <TRNTYPE>DEBIT</TRNTYPE>
+ <DTPOSTED>20091215202000.000[-4:EST]</DTPOSTED>
+ <TRNAMT>-3.65</TRNAMT>
+ <FITID>20091215.U489357.e.USD.1511863617</FITID>
+ <MEMO>CASH TRADE: AUD.USD</MEMO>
+ <CURRENCY>
+ <CURRATE>1.06</CURRATE>
+ <CURSYM>USD</CURSYM>
+ </CURRENCY>
+ </STMTTRN>
+ <SUBACCTFUND>CASH</SUBACCTFUND>
+ </INVBANKTRAN>
+ </INVTRANLIST>
+ <INVBAL>
+ <AVAILCASH>1.00</AVAILCASH>
+ <MARGINBALANCE>0</MARGINBALANCE>
+ <SHORTBALANCE>0</SHORTBALANCE>
+ <BALLIST>
+ <BAL>
+ <NAME>ENDING CASH</NAME>
+ <DESC>ENDING CASH BALANCE</DESC>
+ <BALTYPE>NUMBER</BALTYPE>
+ <VALUE>2.00</VALUE>
+ </BAL>
+ <BAL>
+ <NAME>STOCK VALUE</NAME>
+ <DESC>TOTAL EQUITY IN STOCKS</DESC>
+ <BALTYPE>NUMBER</BALTYPE>
+ <VALUE>0.00</VALUE>
+ </BAL>
+ <BAL>
+ <NAME>OPTION VALUE</NAME>
+ <DESC>TOTAL EQUITY IN OPTIONS</DESC>
+ <BALTYPE>NUMBER</BALTYPE>
+ <VALUE>0.00</VALUE>
+ </BAL>
+ <BAL>
+ <NAME>IBGROUPNOTES VALUE</NAME>
+ <DESC>TOTAL EQUITY IN IBGROUPNOTES</DESC>
+ <BALTYPE>NUMBER</BALTYPE>
+ <VALUE>0.00</VALUE>
+ </BAL>
+ </BALLIST>
+ </INVBAL>
+ </INVSTMTRS>
+ </INVSTMTTRNRS>
+ </INVSTMTMSGSRSV1>
+</OFX>
diff --git a/tests/fixtures/multiple_accounts.ofx b/tests/fixtures/multiple_accounts.ofx
new file mode 100644
index 0000000..853c788
--- /dev/null
+++ b/tests/fixtures/multiple_accounts.ofx
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?OFX OFXHEADER="200" VERSION="211" SECURITY="NONE" OLDFILEUID="NONE" NEWFILEUID="NONE"?>
+<OFX>
+ <SIGNONMSGSRSV1>
+ <SONRS>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ <MESSAGE>The operation succeeded.</MESSAGE>
+ </STATUS>
+ <DTSERVER>20120603203135.547[-7:PDT]</DTSERVER>
+ <LANGUAGE>ENG</LANGUAGE>
+ <FI>
+ <ORG>blah</ORG>
+ <FID>1000</FID>
+ </FI>
+ </SONRS>
+ </SIGNONMSGSRSV1>
+ <BANKMSGSRSV1>
+ <STMTTRNRS>
+ <TRNUID>1001</TRNUID>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ </STATUS>
+ <STMTRS>
+ <CURDEF>USD</CURDEF>
+ <BANKACCTFROM>
+ <BANKID>123</BANKID>
+ <BRANCHID>00</BRANCHID>
+ <ACCTID>9100</ACCTID>
+ <ACCTTYPE>CHECKING</ACCTTYPE>
+ </BANKACCTFROM>
+ <LEDGERBAL>
+ <BALAMT>111</BALAMT>
+ <DTASOF>20120603133220.000[-7:PDT]</DTASOF>
+ </LEDGERBAL>
+ </STMTRS>
+ </STMTTRNRS>
+ <STMTTRNRS>
+ <TRNUID>1002</TRNUID>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ </STATUS>
+ <STMTRS>
+ <CURDEF>USD</CURDEF>
+ <BANKACCTFROM>
+ <BANKID>123</BANKID>
+ <BRANCHID>00</BRANCHID>
+ <ACCTID>9200</ACCTID>
+ <ACCTTYPE>SAVINGS</ACCTTYPE>
+ </BANKACCTFROM>
+ <LEDGERBAL>
+ <BALAMT>222</BALAMT>
+ <DTASOF>20120603133220.000[-7:PDT]</DTASOF>
+ </LEDGERBAL>
+ </STMTRS>
+ </STMTTRNRS>
+ </BANKMSGSRSV1>
+</OFX>
diff --git a/tests/fixtures/multiple_accounts2.ofx b/tests/fixtures/multiple_accounts2.ofx
new file mode 100644
index 0000000..853c788
--- /dev/null
+++ b/tests/fixtures/multiple_accounts2.ofx
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?OFX OFXHEADER="200" VERSION="211" SECURITY="NONE" OLDFILEUID="NONE" NEWFILEUID="NONE"?>
+<OFX>
+ <SIGNONMSGSRSV1>
+ <SONRS>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ <MESSAGE>The operation succeeded.</MESSAGE>
+ </STATUS>
+ <DTSERVER>20120603203135.547[-7:PDT]</DTSERVER>
+ <LANGUAGE>ENG</LANGUAGE>
+ <FI>
+ <ORG>blah</ORG>
+ <FID>1000</FID>
+ </FI>
+ </SONRS>
+ </SIGNONMSGSRSV1>
+ <BANKMSGSRSV1>
+ <STMTTRNRS>
+ <TRNUID>1001</TRNUID>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ </STATUS>
+ <STMTRS>
+ <CURDEF>USD</CURDEF>
+ <BANKACCTFROM>
+ <BANKID>123</BANKID>
+ <BRANCHID>00</BRANCHID>
+ <ACCTID>9100</ACCTID>
+ <ACCTTYPE>CHECKING</ACCTTYPE>
+ </BANKACCTFROM>
+ <LEDGERBAL>
+ <BALAMT>111</BALAMT>
+ <DTASOF>20120603133220.000[-7:PDT]</DTASOF>
+ </LEDGERBAL>
+ </STMTRS>
+ </STMTTRNRS>
+ <STMTTRNRS>
+ <TRNUID>1002</TRNUID>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ </STATUS>
+ <STMTRS>
+ <CURDEF>USD</CURDEF>
+ <BANKACCTFROM>
+ <BANKID>123</BANKID>
+ <BRANCHID>00</BRANCHID>
+ <ACCTID>9200</ACCTID>
+ <ACCTTYPE>SAVINGS</ACCTTYPE>
+ </BANKACCTFROM>
+ <LEDGERBAL>
+ <BALAMT>222</BALAMT>
+ <DTASOF>20120603133220.000[-7:PDT]</DTASOF>
+ </LEDGERBAL>
+ </STMTRS>
+ </STMTTRNRS>
+ </BANKMSGSRSV1>
+</OFX>
diff --git a/tests/fixtures/signon_fail.ofx b/tests/fixtures/signon_fail.ofx
new file mode 100644
index 0000000..d55ef86
--- /dev/null
+++ b/tests/fixtures/signon_fail.ofx
@@ -0,0 +1,11 @@
+OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:0e1a88e56fc548a1ba2e83bce6323bb6
+
+<OFX><SIGNONMSGSRSV1><SONRS><STATUS><CODE>15500<SEVERITY>ERROR<MESSAGE>Your request could not be processed because you supplied an invalid identification code or your password was incorrect</STATUS><DTSERVER>20130325211209.350[-7:MST]<LANGUAGE>ENG<FI><ORG>AMEX<FID>3101</FI><START.TIME>20130325211209<ERROR.CODE>15500</SONRS></SIGNONMSGSRSV1></OFX>
diff --git a/tests/fixtures/signon_success.ofx b/tests/fixtures/signon_success.ofx
new file mode 100644
index 0000000..82f34a3
--- /dev/null
+++ b/tests/fixtures/signon_success.ofx
@@ -0,0 +1,11 @@
+OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:3bb6707632b64da196722ef312e6376d
+
+<OFX><SIGNONMSGSRSV1><SONRS><STATUS><CODE>0<SEVERITY>INFO<MESSAGE>Login successful</STATUS><DTSERVER>20130325211405.187[-7:MST]<LANGUAGE>ENG<FI><ORG>AMEX<FID>3101</FI><START.TIME>20130325211405<ORIGIN.ID>FMPWeb</SONRS></SIGNONMSGSRSV1></OFX>
diff --git a/tests/fixtures/signon_success_no_message.ofx b/tests/fixtures/signon_success_no_message.ofx
new file mode 100644
index 0000000..636bffa
--- /dev/null
+++ b/tests/fixtures/signon_success_no_message.ofx
@@ -0,0 +1,11 @@
+OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:3bb6707632b64da196722ef312e6376d
+
+<OFX><SIGNONMSGSRSV1><SONRS><STATUS><CODE>0<SEVERITY>INFO</STATUS><DTSERVER>20130325211405.187[-7:MST]<LANGUAGE>ENG<FI><ORG>AMEX<FID>3101</FI><START.TIME>20130325211405<ORIGIN.ID>FMPWeb</SONRS></SIGNONMSGSRSV1></OFX>
diff --git a/tests/fixtures/vanguard.ofx b/tests/fixtures/vanguard.ofx
new file mode 100644
index 0000000..47f42a0
--- /dev/null
+++ b/tests/fixtures/vanguard.ofx
@@ -0,0 +1,11 @@
+OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0
+
+<OFX><SIGNONMSGSRSV1><SONRS><STATUS><CODE>0<SEVERITY>INFO<MESSAGE>Successful Sign On</STATUS><DTSERVER>20110727001702[-5:EST]<LANGUAGE>ENG<DTPROFUP>20010918083000<FI><ORG>The Vanguard Group</FI></SONRS></SIGNONMSGSRSV1><INVSTMTMSGSRSV1><INVSTMTTRNRS><TRNUID>a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0<STATUS><CODE>0<SEVERITY>INFO</STATUS><CLTCOOKIE>4<INVSTMTRS><DTASOF>20110727<CURDEF>USD<INVACCTFROM><BROKERID>vanguard.com<ACCTID>01234567890</INVACCTFROM><INVTRANLIST><DTSTART>20110625160000.000[-5:EST]<DTEND>20110727160000.000[-5:EST]<SELLMF><INVSELL><INVTRAN><FITID>01234567890.0123.07152011.0<DTTRADE>20110715160000.000[-5:EST]<DTSETTLE>20110715160000.000[-5:EST]<MEMO>THIS IS A MEMO</INVTRAN><SECID><UNIQUEID>012345678<UNIQUEIDTYPE>CUSIP</SECID><UNITS>-42.123<UNITPRICE>100.00<TOTAL>4212.3<SUBACCTSEC>CASH<SUBACCTFUND>OTHER</INVSELL><SELLTYPE>SELL</SELLMF></INVTRANLIST><INVPOSLIST><POSMF><INVPOS><SECID><UNIQUEID>012345678<UNIQUEIDTYPE>CUSIP</SECID><HELDINACCT>OTHER<POSTYPE>LONG<UNITS>102.0<UNITPRICE>100.00<MKTVAL>10200.0<DTPRICEASOF>20110726160000.000[-5:EST]<MEMO>Price as of date based on closing price</INVPOS><REINVDIV>Y<REINVCG>Y</POSMF><POSMF><INVPOS><SECID><UNIQUEID>012345678<UNIQUEIDTYPE>CUSIP</SECID><HELDINACCT>OTHER<POSTYPE>LONG<UNITS>142.2<UNITPRICE>100.42<MKTVAL>14279.72<DTPRICEASOF>20110726160000.000[-5:EST]<MEMO>Price as of date based on closing price</INVPOS><REINVDIV>Y<REINVCG>Y</POSMF></INVPOSLIST></INVSTMTRS></INVSTMTTRNRS></INVSTMTMSGSRSV1><SECLISTMSGSRSV1><SECLIST><MFINFO><SECINFO><SECID><UNIQUEID>012345678<UNIQUEIDTYPE>CUSIP</SECID><SECNAME>Name of the security<TICKER>VFINX<FIID>0122<UNITPRICE>54.0<MEMO>Price as of date based on closing price</SECINFO><MFTYPE>OPENEND</MFINFO><MFINFO><SECINFO><SECID><UNIQUEID>012345678<UNIQUEIDTYPE>CUSIP</SECID><SECNAME>Name of share<TICKER>VFIAX<FIID>0123<UNITPRICE>123.45<MEMO>Price as of date based on closing price</SECINFO><MFTYPE>OPENEND</MFINFO></SECLIST></SECLISTMSGSRSV1></OFX> \ No newline at end of file
diff --git a/tests/support.py b/tests/support.py
new file mode 100644
index 0000000..fe381f5
--- /dev/null
+++ b/tests/support.py
@@ -0,0 +1,9 @@
+import os
+
+
+def open_file(filename):
+ ''' Load a file from the fixtures directory. '''
+ path = 'fixtures/' + filename
+ if ('tests' in os.listdir('.')):
+ path = 'tests/' + path
+ return open(path, mode='rb')
diff --git a/tests/test_parse.py b/tests/test_parse.py
new file mode 100644
index 0000000..35260ce
--- /dev/null
+++ b/tests/test_parse.py
@@ -0,0 +1,623 @@
+from __future__ import absolute_import
+
+from ofxparse.ofxparse import soup_maker
+from datetime import datetime, timedelta
+from decimal import Decimal
+from unittest import TestCase
+import sys
+sys.path.append('..')
+
+import six
+
+from .support import open_file
+from ofxparse import OfxParser, AccountType, Account, Statement, Transaction
+from ofxparse.ofxparse import OfxFile, OfxPreprocessedFile, OfxParserException
+
+class TestOfxPreprocessedFile(TestCase):
+
+ def testPreprocess(self):
+ fh = six.BytesIO(six.b("""OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+
+<OFX><DTASOF><![CDATA[></tricky]]><LEAVE ALONE><VAL.UE>a<VAL_UE>b<TE_ST></TE_ST><TE.ST></TE.ST><INVBAL><BALLIST><BAL><NAME>Net<DTASOF>2222</BAL><BAL><NAME>Gross<DTASOF>3333</BAL></BALLIST></INVBAL></OFX>
+"""))
+ expect = """OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+
+<OFX><DTASOF><![CDATA[></tricky]]><LEAVE ALONE></DTASOF><VAL.UE>a</VAL.UE><VAL_UE>b</VAL_UE><TE_ST></TE_ST><TE.ST></TE.ST><INVBAL><BALLIST><BAL><NAME>Net</NAME><DTASOF>2222</DTASOF></BAL><BAL><NAME>Gross</NAME><DTASOF>3333</DTASOF></BAL></BALLIST></INVBAL></OFX>
+"""
+ ofx_file = OfxPreprocessedFile(fh)
+ data = ofx_file.fh.read()
+ self.assertEqual(data,expect)
+
+ def testHeaders(self):
+ expect = {"OFXHEADER": six.u("100"),
+ "DATA": six.u("OFXSGML"),
+ "VERSION": six.u("102"),
+ "SECURITY": None,
+ "ENCODING": six.u("USASCII"),
+ "CHARSET": six.u("1252"),
+ "COMPRESSION": None,
+ "OLDFILEUID": None,
+ "NEWFILEUID": None,
+ }
+ ofx = OfxParser.parse(open_file('bank_medium.ofx'))
+ self.assertEquals(expect, ofx.headers)
+
+ def testUTF8(self):
+ fh = six.BytesIO(six.b("""OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:UNICODE
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+
+"""))
+ ofx_file = OfxPreprocessedFile(fh)
+ headers = ofx_file.headers
+ data = ofx_file.fh.read()
+
+ self.assertTrue(type(data) is six.text_type)
+ for key, value in six.iteritems(headers):
+ self.assertTrue(type(key) is six.text_type)
+ self.assertTrue(type(value) is not six.binary_type)
+
+ def testCP1252(self):
+ fh = six.BytesIO(six.b("""OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET: 1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+"""))
+ ofx_file = OfxPreprocessedFile(fh)
+ headers = ofx_file.headers
+ result = ofx_file.fh.read()
+
+ self.assertTrue(type(result) is six.text_type)
+ for key, value in six.iteritems(headers):
+ self.assertTrue(type(key) is six.text_type)
+ self.assertTrue(type(value) is not six.binary_type)
+
+ def testUTF8Japanese(self):
+ fh = six.BytesIO(six.b("""OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:UTF-8
+CHARSET:CSUNICODE
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+"""))
+ ofx_file = OfxPreprocessedFile(fh)
+ headers = ofx_file.headers
+ result = ofx_file.fh.read()
+
+ self.assertTrue(type(result) is six.text_type)
+ for key, value in six.iteritems(headers):
+ self.assertTrue(type(key) is six.text_type)
+ self.assertTrue(type(value) is not six.binary_type)
+
+ def testBrokenLineEndings(self):
+ fh = six.BytesIO(six.b("OFXHEADER:100\rDATA:OFXSGML\r"))
+ ofx_file = OfxPreprocessedFile(fh)
+ self.assertEquals(len(ofx_file.headers.keys()), 2)
+
+
+
+class TestOfxFile(TestCase):
+ def testHeaders(self):
+ expect = {"OFXHEADER": six.u("100"),
+ "DATA": six.u("OFXSGML"),
+ "VERSION": six.u("102"),
+ "SECURITY": None,
+ "ENCODING": six.u("USASCII"),
+ "CHARSET": six.u("1252"),
+ "COMPRESSION": None,
+ "OLDFILEUID": None,
+ "NEWFILEUID": None,
+ }
+ ofx = OfxParser.parse(open_file('bank_medium.ofx'))
+ self.assertEquals(expect, ofx.headers)
+
+ def testUTF8(self):
+ fh = six.BytesIO(six.b("""OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:UNICODE
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+
+"""))
+ ofx_file = OfxFile(fh)
+ headers = ofx_file.headers
+ data = ofx_file.fh.read()
+
+ self.assertTrue(type(data) is six.text_type)
+ for key, value in six.iteritems(headers):
+ self.assertTrue(type(key) is six.text_type)
+ self.assertTrue(type(value) is not six.binary_type)
+
+ def testCP1252(self):
+ fh = six.BytesIO(six.b("""OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET: 1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+"""))
+ ofx_file = OfxFile(fh)
+ headers = ofx_file.headers
+ result = ofx_file.fh.read()
+
+ self.assertTrue(type(result) is six.text_type)
+ for key, value in six.iteritems(headers):
+ self.assertTrue(type(key) is six.text_type)
+ self.assertTrue(type(value) is not six.binary_type)
+
+ def testUTF8Japanese(self):
+ fh = six.BytesIO(six.b("""OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:UTF-8
+CHARSET:CSUNICODE
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+"""))
+ ofx_file = OfxFile(fh)
+ headers = ofx_file.headers
+ result = ofx_file.fh.read()
+
+ self.assertTrue(type(result) is six.text_type)
+ for key, value in six.iteritems(headers):
+ self.assertTrue(type(key) is six.text_type)
+ self.assertTrue(type(value) is not six.binary_type)
+
+ def testBrokenLineEndings(self):
+ fh = six.BytesIO(six.b("OFXHEADER:100\rDATA:OFXSGML\r"))
+ ofx_file = OfxFile(fh)
+ self.assertEquals(len(ofx_file.headers.keys()), 2)
+
+
+class TestParse(TestCase):
+ def testEmptyFile(self):
+ fh = six.BytesIO(six.b(""))
+ self.assertRaises(OfxParserException, OfxParser.parse, fh)
+
+ def testThatParseWorksWithoutErrors(self):
+ OfxParser.parse(open_file('bank_medium.ofx'))
+
+ def testThatParseFailsIfNothingToParse(self):
+ self.assertRaises(TypeError, OfxParser.parse, None)
+
+ def testThatParseFailsIfAPathIsPassedIn(self):
+ # A file handle should be passed in, not the path.
+ self.assertRaises(RuntimeError, OfxParser.parse, '/foo/bar')
+
+ def testThatParseReturnsAResultWithABankAccount(self):
+ ofx = OfxParser.parse(open_file('bank_medium.ofx'))
+ self.assertTrue(ofx.account is not None)
+
+ def testEverything(self):
+ ofx = OfxParser.parse(open_file('bank_medium.ofx'))
+ self.assertEquals('12300 000012345678', ofx.account.number)
+ self.assertEquals('160000100', ofx.account.routing_number)
+ self.assertEquals('00', ofx.account.branch_id)
+ self.assertEquals('CHECKING', ofx.account.account_type)
+ self.assertEquals(Decimal('382.34'), ofx.account.statement.balance)
+ # Todo: support values in decimal or int form.
+ # self.assertEquals('15',
+ # ofx.bank_account.statement.balance_in_pennies)
+ self.assertEquals(
+ Decimal('682.34'), ofx.account.statement.available_balance)
+ self.assertEquals(
+ datetime(2009, 4, 1), ofx.account.statement.start_date)
+ self.assertEquals(
+ datetime(2009, 5, 23, 12, 20, 17), ofx.account.statement.end_date)
+
+ self.assertEquals(3, len(ofx.account.statement.transactions))
+
+ transaction = ofx.account.statement.transactions[0]
+ self.assertEquals("MCDONALD'S #112", transaction.payee)
+ self.assertEquals('pos', transaction.type)
+ self.assertEquals(Decimal('-6.60'), transaction.amount)
+ # Todo: support values in decimal or int form.
+ # self.assertEquals('15', transaction.amount_in_pennies)
+
+ def testMultipleAccounts(self):
+ ofx = OfxParser.parse(open_file('multiple_accounts2.ofx'))
+ self.assertEquals(2, len(ofx.accounts))
+ self.assertEquals('9100', ofx.accounts[0].number)
+ self.assertEquals('9200', ofx.accounts[1].number)
+ self.assertEquals('123', ofx.accounts[0].routing_number)
+ self.assertEquals('123', ofx.accounts[1].routing_number)
+ self.assertEquals('CHECKING', ofx.accounts[0].account_type)
+ self.assertEquals('SAVINGS', ofx.accounts[1].account_type)
+
+
+class TestStringToDate(TestCase):
+ ''' Test the string to date parser '''
+ def test_bad_format(self):
+ ''' A poorly formatted string should throw a ValueError '''
+
+ bad_string = 'abcdLOL!'
+ self.assertRaises(ValueError, OfxParser.parseOfxDateTime, bad_string)
+
+ bad_but_close_string = '881103'
+ self.assertRaises(ValueError, OfxParser.parseOfxDateTime, bad_string)
+
+ no_month_string = '19881301'
+ self.assertRaises(ValueError, OfxParser.parseOfxDateTime, bad_string)
+
+ def test_parses_correct_time(self):
+ '''Test whether it can parse correct time for some valid time fields'''
+ self.assertEquals(OfxParser.parseOfxDateTime('19881201'),
+ datetime(1988, 12, 1, 0, 0))
+ self.assertEquals(OfxParser.parseOfxDateTime('19881201230100'),
+ datetime(1988, 12, 1, 23, 1))
+ self.assertEquals(OfxParser.parseOfxDateTime('20120229230100'),
+ datetime(2012, 2, 29, 23, 1))
+
+ def test_parses_time_offset(self):
+ ''' Test that we handle GMT offset '''
+ self.assertEquals(OfxParser.parseOfxDateTime('20001201120000 [0:GMT]'),
+ datetime(2000, 12, 1, 12, 0))
+ self.assertEquals(OfxParser.parseOfxDateTime('19991201120000 [1:ITT]'),
+ datetime(1999, 12, 1, 11, 0))
+ self.assertEquals(
+ OfxParser.parseOfxDateTime('19881201230100 [-5:EST]'),
+ datetime(1988, 12, 2, 4, 1))
+ self.assertEquals(
+ OfxParser.parseOfxDateTime('20120229230100 [-6:CAT]'),
+ datetime(2012, 3, 1, 5, 1))
+ self.assertEquals(
+ OfxParser.parseOfxDateTime('20120412120000 [-5.5:XXX]'),
+ datetime(2012, 4, 12, 17, 30))
+ self.assertEquals(
+ OfxParser.parseOfxDateTime('20120412120000 [-5:XXX]'),
+ datetime(2012, 4, 12, 17))
+ self.assertEquals(
+ OfxParser.parseOfxDateTime('20120922230000 [+9:JST]'),
+ datetime(2012, 9, 22, 14, 0))
+
+
+class TestParseStmtrs(TestCase):
+ input = '''
+<STMTRS><CURDEF>CAD<BANKACCTFROM><BANKID>160000100<ACCTID>12300 000012345678<ACCTTYPE>CHECKING</BANKACCTFROM>
+<BANKTRANLIST><DTSTART>20090401<DTEND>20090523122017
+<STMTTRN><TRNTYPE>POS<DTPOSTED>20090401122017.000[-5:EST]<TRNAMT>-6.60<FITID>0000123456782009040100001<NAME>MCDONALD'S #112<MEMO>POS MERCHANDISE;MCDONALD'S #112</STMTTRN>
+</BANKTRANLIST><LEDGERBAL><BALAMT>382.34<DTASOF>20090523122017</LEDGERBAL><AVAILBAL><BALAMT>682.34<DTASOF>20090523122017</AVAILBAL></STMTRS>
+ '''
+
+ def testThatParseStmtrsReturnsAnAccount(self):
+ stmtrs = soup_maker(self.input)
+ account = OfxParser.parseStmtrs(
+ stmtrs.find('stmtrs'), AccountType.Bank)[0]
+ self.assertEquals('12300 000012345678', account.number)
+ self.assertEquals('160000100', account.routing_number)
+ self.assertEquals('CHECKING', account.account_type)
+
+ def testThatReturnedAccountAlsoHasAStatement(self):
+ stmtrs = soup_maker(self.input)
+ account = OfxParser.parseStmtrs(
+ stmtrs.find('stmtrs'), AccountType.Bank)[0]
+ self.assertTrue(hasattr(account, 'statement'))
+
+
+class TestAccount(TestCase):
+ def testThatANewAccountIsValid(self):
+ account = Account()
+ self.assertEquals('', account.number)
+ self.assertEquals('', account.routing_number)
+ self.assertEquals('', account.account_type)
+ self.assertEquals(None, account.statement)
+
+
+class TestParseStatement(TestCase):
+ def testThatParseStatementReturnsAStatement(self):
+ input = '''
+<STMTTRNRS>
+ <TRNUID>20090523122017
+ <STATUS>
+ <CODE>0
+ <SEVERITY>INFO
+ <MESSAGE>OK
+ </STATUS>
+ <STMTRS>
+ <CURDEF>CAD
+ <BANKACCTFROM>
+ <BANKID>160000100
+ <ACCTID>12300 000012345678
+ <ACCTTYPE>CHECKING
+ </BANKACCTFROM>
+ <BANKTRANLIST>
+ <DTSTART>20090401
+ <DTEND>20090523122017
+ <STMTTRN>
+ <TRNTYPE>POS
+ <DTPOSTED>20090401122017.000[-5:EST]
+ <TRNAMT>-6.60
+ <FITID>0000123456782009040100001
+ <NAME>MCDONALD'S #112
+ <MEMO>POS MERCHANDISE;MCDONALD'S #112
+ </STMTTRN>
+ </BANKTRANLIST>
+ <LEDGERBAL>
+ <BALAMT>382.34
+ <DTASOF>20090523122017
+ </LEDGERBAL>
+ <AVAILBAL>
+ <BALAMT>682.34
+ <DTASOF>20090523122017
+ </AVAILBAL>
+ </STMTRS>
+</STMTTRNRS>
+ '''
+ txn = soup_maker(input)
+ statement = OfxParser.parseStatement(txn.find('stmttrnrs'))
+ self.assertEquals(datetime(2009, 4, 1), statement.start_date)
+ self.assertEquals(
+ datetime(2009, 5, 23, 12, 20, 17), statement.end_date)
+ self.assertEquals(1, len(statement.transactions))
+ self.assertEquals(Decimal('382.34'), statement.balance)
+ self.assertEquals(Decimal('682.34'), statement.available_balance)
+
+
+class TestStatement(TestCase):
+ def testThatANewStatementIsValid(self):
+ statement = Statement()
+ self.assertEquals('', statement.start_date)
+ self.assertEquals('', statement.end_date)
+ self.assertEquals(0, len(statement.transactions))
+
+
+class TestParseTransaction(TestCase):
+ def testThatParseTransactionReturnsATransaction(self):
+ input = '''
+<STMTTRN>
+ <TRNTYPE>POS
+ <DTPOSTED>20090401122017.000[-5:EST]
+ <TRNAMT>-6.60
+ <FITID>0000123456782009040100001
+ <NAME>MCDONALD'S #112
+ <MEMO>POS MERCHANDISE;MCDONALD'S #112
+</STMTTRN>
+'''
+ txn = soup_maker(input)
+ transaction = OfxParser.parseTransaction(txn.find('stmttrn'))
+ self.assertEquals('pos', transaction.type)
+ self.assertEquals(datetime(
+ 2009, 4, 1, 12, 20, 17) - timedelta(hours=-5), transaction.date)
+ self.assertEquals(Decimal('-6.60'), transaction.amount)
+ self.assertEquals('0000123456782009040100001', transaction.id)
+ self.assertEquals("MCDONALD'S #112", transaction.payee)
+ self.assertEquals("POS MERCHANDISE;MCDONALD'S #112", transaction.memo)
+
+
+ def testThatParseTransactionWithFieldCheckNum(self):
+ input = '''
+<STMTTRN>
+ <TRNTYPE>DEP
+ <DTPOSTED>20130306
+ <TRNAMT>1000.00
+ <FITID>2013030601009100
+ <CHECKNUM>700
+ <MEMO>DEPOSITO ONLINE
+</STMTTRN>
+'''
+ txn = soup_maker(input)
+ transaction = OfxParser.parseTransaction(txn.find('stmttrn'))
+ self.assertEquals('700', transaction.checknum)
+
+class TestTransaction(TestCase):
+ def testThatAnEmptyTransactionIsValid(self):
+ t = Transaction()
+ self.assertEquals('', t.payee)
+ self.assertEquals('', t.type)
+ self.assertEquals(None, t.date)
+ self.assertEquals(None, t.amount)
+ self.assertEquals('', t.id)
+ self.assertEquals('', t.memo)
+ self.assertEquals('', t.checknum)
+
+
+class TestInvestmentAccount(TestCase):
+ sample = '''
+<?xml version="1.0" encoding="UTF-8" ?>
+<?OFX OFXHEADER="200" VERSION="200" SECURITY="NONE"
+ OLDFILEUID="NONE" NEWFILEUID="NONE" ?>
+<OFX>
+ <INVSTMTMSGSRSV1>
+ <INVSTMTTRNRS>
+ <TRNUID>38737714201101012011062420110624</TRNUID>
+ <STATUS>
+ <CODE>0</CODE>
+ <SEVERITY>INFO</SEVERITY>
+ </STATUS>
+ <INVSTMTRS>
+ </INVSTMTRS>
+ </INVSTMTTRNRS>
+ </INVSTMTMSGSRSV1>
+</OFX>
+'''
+
+ def testThatParseCanCreateAnInvestmentAccount(self):
+ OfxParser.parse(six.BytesIO(six.b(self.sample)))
+ # Success!
+
+
+
+class TestVanguardInvestmentStatement(TestCase):
+ def testForUnclosedTags(self):
+ ofx = OfxParser.parse(open_file('vanguard.ofx'))
+ self.assertTrue(hasattr(ofx, 'account'))
+ self.assertTrue(hasattr(ofx.account, 'statement'))
+ self.assertTrue(hasattr(ofx.account.statement, 'transactions'))
+ self.assertEquals(len(ofx.account.statement.transactions), 1)
+ self.assertEquals(ofx.account.statement.transactions[0].id,
+ '01234567890.0123.07152011.0')
+ self.assertEquals(ofx.account.statement.transactions[0]
+ .tradeDate, datetime(2011, 7, 15, 21))
+ self.assertEquals(ofx.account.statement.transactions[0]
+ .settleDate, datetime(2011, 7, 15, 21))
+ self.assertTrue(hasattr(ofx.account.statement, 'positions'))
+ self.assertEquals(len(ofx.account.statement.positions), 2)
+ self.assertEquals(
+ ofx.account.statement.positions[0].units, Decimal('102.0'))
+
+ def testSecurityListSuccess(self):
+ ofx = OfxParser.parse(open_file('vanguard.ofx'))
+ self.assertEquals(len(ofx.security_list), 2)
+
+
+class TestFidelityInvestmentStatement(TestCase):
+ def testForUnclosedTags(self):
+ ofx = OfxParser.parse(open_file('fidelity.ofx'))
+ self.assertTrue(hasattr(ofx.account.statement, 'positions'))
+ self.assertEquals(len(ofx.account.statement.positions), 6)
+ self.assertEquals(
+ ofx.account.statement.positions[0].units, Decimal('128.0'))
+
+ def testSecurityListSuccess(self):
+ ofx = OfxParser.parse(open_file('fidelity.ofx'))
+ self.assertEquals(len(ofx.security_list), 7)
+
+
+class TestAccountInfoAggregation(TestCase):
+ def testForFourAccounts(self):
+ ofx = OfxParser.parse(open_file('account_listing_aggregation.ofx'))
+ self.assertTrue(hasattr(ofx, 'accounts'))
+ self.assertEquals(len(ofx.accounts), 4)
+
+ # first account
+ account = ofx.accounts[0]
+ self.assertEquals(account.account_type, 'SAVINGS')
+ self.assertEquals(account.desc, 'USAA SAVINGS')
+ self.assertEquals(account.institution.organization, 'USAA')
+ self.assertEquals(account.number, '0000000001')
+ self.assertEquals(account.routing_number, '314074269')
+
+ # second
+ account = ofx.accounts[1]
+ self.assertEquals(account.account_type, 'CHECKING')
+ self.assertEquals(account.desc, 'FOUR STAR CHECKING')
+ self.assertEquals(account.institution.organization, 'USAA')
+ self.assertEquals(account.number, '0000000002')
+ self.assertEquals(account.routing_number, '314074269')
+
+ # third
+ account = ofx.accounts[2]
+ self.assertEquals(account.account_type, 'CREDITLINE')
+ self.assertEquals(account.desc, 'LINE OF CREDIT')
+ self.assertEquals(account.institution.organization, 'USAA')
+ self.assertEquals(account.number, '00000000000003')
+ self.assertEquals(account.routing_number, '314074269')
+
+ # fourth
+ account = ofx.accounts[3]
+ self.assertEquals(account.account_type, '')
+ self.assertEquals(account.desc, 'MY CREDIT CARD')
+ self.assertEquals(account.institution.organization, 'USAA')
+ self.assertEquals(account.number, '4111111111111111')
+
+
+class TestGracefulFailures(TestCase):
+ ''' Test that when fail_fast is False, failures are returned to the
+ caller as warnings and discarded entries in the Statement class.
+ '''
+ def testDateFieldMissing(self):
+ ''' The test file contains three transactions in a single
+ statement.
+
+ They fail due to:
+ 1) No date
+ 2) Empty date
+ 3) Invalid date
+ '''
+ ofx = OfxParser.parse(open_file('fail_nice/date_missing.ofx'), False)
+ self.assertEquals(len(ofx.account.statement.transactions), 0)
+ self.assertEquals(len(ofx.account.statement.discarded_entries), 3)
+ self.assertEquals(len(ofx.account.statement.warnings), 0)
+
+ # Test that it raises an error otherwise.
+ self.assertRaises(OfxParserException, OfxParser.parse,
+ open_file('fail_nice/date_missing.ofx'))
+
+ def testDecimalConversionError(self):
+ ''' The test file contains a transaction that has a poorly formatted
+ decimal number ($20). Test that we catch this.
+ '''
+ ofx = OfxParser.parse(open_file('fail_nice/decimal_error.ofx'), False)
+ self.assertEquals(len(ofx.account.statement.transactions), 0)
+ self.assertEquals(len(ofx.account.statement.discarded_entries), 1)
+
+ # Test that it raises an error otherwise.
+ self.assertRaises(OfxParserException, OfxParser.parse,
+ open_file('fail_nice/decimal_error.ofx'))
+
+ def testEmptyBalance(self):
+ ''' The test file contains empty or blank strings in the balance
+ fields. Fail nicely on those.
+ '''
+ ofx = OfxParser.parse(open_file('fail_nice/empty_balance.ofx'), False)
+ self.assertEquals(len(ofx.account.statement.transactions), 1)
+ self.assertEquals(len(ofx.account.statement.discarded_entries), 0)
+ self.assertFalse(hasattr(ofx.account.statement, 'balance'))
+ self.assertFalse(hasattr(ofx.account.statement, 'available_balance'))
+
+ # Test that it raises an error otherwise.
+ self.assertRaises(OfxParserException, OfxParser.parse,
+ open_file('fail_nice/empty_balance.ofx'))
+
+class TestParseSonrs(TestCase):
+
+ def testSuccess(self):
+ ofx = OfxParser.parse(open_file('signon_success.ofx'), True)
+ self.assertTrue(ofx.signon.success)
+ self.assertEquals(ofx.signon.code, 0)
+ self.assertEquals(ofx.signon.severity, 'INFO')
+ self.assertEquals(ofx.signon.message, 'Login successful')
+
+ ofx = OfxParser.parse(open_file('signon_success_no_message.ofx'), True)
+ self.assertTrue(ofx.signon.success)
+ self.assertEquals(ofx.signon.code, 0)
+ self.assertEquals(ofx.signon.severity, 'INFO')
+ self.assertEquals(ofx.signon.message, '')
+
+ def testFailure(self):
+ ofx = OfxParser.parse(open_file('signon_fail.ofx'), True)
+ self.assertFalse(ofx.signon.success)
+ self.assertEquals(ofx.signon.code, 15500)
+ self.assertEquals(ofx.signon.severity, 'ERROR')
+ self.assertEquals(ofx.signon.message, 'Your request could not be processed because you supplied an invalid identification code or your password was incorrect')
+
+if __name__ == "__main__":
+ import unittest
+ unittest.main()
diff --git a/tests/test_write.py b/tests/test_write.py
new file mode 100644
index 0000000..3366217
--- /dev/null
+++ b/tests/test_write.py
@@ -0,0 +1,17 @@
+from __future__ import absolute_import
+
+from ofxparse import OfxParser as op
+from unittest import TestCase
+import sys
+sys.path.append('..')
+from .support import open_file
+
+class TestOfxWrite(TestCase):
+ def test_write(self):
+ test_file = open_file('fidelity.ofx')
+ ofx_doc = op.parse(test_file)
+ self.assertEqual(str(ofx_doc), "")
+
+if __name__ == "__main__":
+ import unittest
+ unittest.main()