diff --git a/History.txt b/History.txt
new file mode 100644
index 0000000..f2e1e74
--- /dev/null
+++ b/History.txt
@@ -0,0 +1,4 @@
+== 1.0.0 / 2007-06-24
+
+* Initial release.
+
diff --git a/Manifest.txt b/Manifest.txt
new file mode 100644
index 0000000..bd2ee29
--- /dev/null
+++ b/Manifest.txt
@@ -0,0 +1,12 @@
+History.txt
+Manifest.txt
+README.txt
+Rakefile
+lib/class-extension.rb
+lib/ofx-parser.rb
+lib/ofx.rb
+lib/sic.rb
+test/fixtures/banking.ofx.sgml
+test/fixtures/creditcard.ofx.sgml
+test/fixtures/with_spaces.ofx.sgml
+test/test_ofx_parser.rb
\ No newline at end of file
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..0f0212f
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,103 @@
+== ofx-parser
+by Andrew A. Smith
+
+http://ofx-parser.rubyforge.org/
+http://rubyforge.org/projects/ofx-parser/
+
+== DESCRIPTION:
+
+ofx-parser is a ruby library to parse a realistic subset of the lengthy OFX 1.x specification.
+
+== FEATURES/PROBLEMS:
+
+* Reads OFX responses - i.e. those downloaded from financial institutions and
+ puts it into a usable object graph.
+* Supports the 3 main message sets: banking, credit card and investment
+ accounts, as well as the required 'sign on' set.
+* Knows about SIC codes - if your institution provides them.
+ See http://www.eeoc.gov/stats/jobpat/siccodes.html
+* Monetary amounts can be retrieved either as a raw string, or in pennies.
+* Supports OFX timestamps.
+
+== SYNOPSIS:
+
+Supports bank accounts:
+
+ require 'rubygems'
+ require 'ofx-parser'
+
+ ofx = OfxParser::OfxParser.parse(open("bank-statement.ofx"))
+
+ ofx.bank_account.number # => '103333333333'
+ ofx.bank_account.routing_number # => '033000033'
+ ofx.bank_account.balance # => '123.45'
+ ofx.bank_account.balance_in_pennies # => 12345
+
+ ofx.bank_account.statement.start_date # => DateTime
+ ofx.bank_account.statement.end_date # => DateTime
+
+ ofx.bank_account.statement.transactions.size # => 4
+
+ ofx.bank_account.statement.transactions.first.payee # => "FOO, INC."
+ ofx.bank_account.statement.transactions.first.type # => :DEBIT
+ ofx.bank_account.statement.transactions.first.amount # => '-11.11'
+ ofx.bank_account.statement.transactions.first.amount_in_pennies # => -1111
+
+Also supports credit cards...
+
+ ofx = OfxParser::OfxParser.parse(open("creditcard-statement.ofx"))
+
+ ofx.credit_card.remaining_credit # => '19000.0'
+ ofx.credit_card.remaining_credit_in_pennies # => '1900000'
+
+ ofx.credit_card.statement.start_date # => DateTime
+ ofx.credit_card.statement.end_date # => DateTime
+
+ ofx.credit_card.statement.transactions.size # => 10
+
+ ofx.credit_card.statement.transactions.first.type # => :DEBIT
+ ofx.credit_card.statement.transactions.first.amount # => '-19.17'
+ ofx.credit_card.statement.transactions.first.amount_in_pennies # => '-1917'
+ ofx.credit_card.statement.transactions.first.sic # => '7933'
+ ofx.credit_card.statement.transactions.first.sic_desc # => 'BOWLING CENTERS'
+ ofx.credit_card.statement.transactions.first.payee # => 'SUNSET BOWLING'
+
+Working on investment accounts...
+
+== REQUIREMENTS:
+
+* hpricot >= 0.6
+
+== INSTALL:
+
+* gem install ofx-parser
+
+== LICENSE:
+
+Copyright (c) 2007, Andrew A. Smith
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+* Neither the name of the copyright owner nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/Rakefile b/Rakefile
new file mode 100644
index 0000000..edafb8e
--- /dev/null
+++ b/Rakefile
@@ -0,0 +1,18 @@
+require 'rubygems'
+require 'hoe'
+$:.unshift(File.dirname(__FILE__) + "/lib")
+require 'ofx-parser'
+
+Hoe.new('ofx-parser', OfxParser::VERSION) do |p|
+ p.author = 'Andrew A. Smith'
+ p.email = 'andy@tinnedfruit.org'
+ p.rubyforge_name = 'ofx-parser'
+ p.summary = 'ofx-parser is a ruby library for parsing OFX 1.x data.'
+ p.description = p.paragraphs_of('README.txt', 2..5).join("\n\n")
+ p.url = 'http://ofx-parser.rubyforge.org/'
+ p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
+ p.remote_rdoc_dir = '' # Release to root
+ p.extra_deps << ["hpricot", ">= 0.6"]
+ p.need_zip = true
+ p.need_tar = false
+end
diff --git a/email.txt b/email.txt
new file mode 100644
index 0000000..5e3bd2b
--- /dev/null
+++ b/email.txt
@@ -0,0 +1,28 @@
+Subject: [ANN] ofx-parser 1.0.0 Released
+
+ofx-parser version 1.0.0 has been released!
+
+*
+
+## DESCRIPTION:
+
+ofx-parser is a ruby library to parse a realistic subset of the lengthy OFX 1.x specification.
+
+## FEATURES/PROBLEMS:
+
+* Reads OFX responses - i.e. those downloaded from financial institutions and
+ puts it into a usable object graph.
+* Supports the 3 main message sets: banking, credit card and investment
+ accounts, as well as the required 'sign on' set.
+* Knows about SIC codes - if your institution provides them.
+ See http://www.eeoc.gov/stats/jobpat/siccodes.html
+* Monetary amounts can be retrieved either as a raw string, or in pennies.
+* Supports OFX timestamps.
+
+Changes:
+
+## 1.0.0 / 2007-06-24
+
+* Initial release.
+
+*
diff --git a/lib/class-extension.rb b/lib/class-extension.rb
new file mode 100644
index 0000000..10ef9ed
--- /dev/null
+++ b/lib/class-extension.rb
@@ -0,0 +1,154 @@
+# = class_extension.rb
+#
+# == Copyright (c) 2006 Daniel Schierbeck
+#
+# Ruby License
+#
+# This module is free software. You may use, modify, and/or redistribute this
+# software under the same terms as Ruby.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+# == Special Thanks
+#
+# Thanks to Trans, Nobu and Ulysses for their original on this concept.
+#
+# == Authors and Contributors
+#
+# * Daniel Schierbeck
+# * Thomas Sawyer
+# * Nobu Nakada
+# * Ulysses
+
+# Author:: Daniel Schierbeck
+# Copyright:: Copyright (c) 2006 Daniel Schierbeck
+# License:: Ruby License
+
+#
+
+class Module #:nodoc: all
+
+ alias_method :append_features_without_class_extension, :append_features
+
+ # = class_extension
+ #
+ # Normally when including modules, class/module methods are not
+ # extended. To achieve this behavior requires some clever
+ # Ruby Karate. Instead class_extension provides an easy to use
+ # and clean solution. Simply place the extending class methods
+ # in a block of the special module method #class_extension.
+ #
+ # module Mix
+ # def inst_meth
+ # puts 'inst_meth'
+ # end
+ #
+ # class_extension do
+ # def class_meth
+ # "Class Method!"
+ # end
+ # end
+ # end
+ #
+ # class X
+ # include Mix
+ # end
+ #
+ # X.class_meth #=> "Class Method!"
+ #
+
+ def class_extension(&block)
+ @class_extension ||= Module.new do
+ def self.append_features(mod)
+ append_features_without_class_extension(mod)
+ end
+ end
+ @class_extension.module_eval(&block) if block_given?
+ @class_extension
+ end
+
+ private :class_extension
+
+ def append_features(mod)
+ append_features_without_class_extension(mod)
+ mod.extend(class_extension)
+ if mod.instance_of? Module
+ mod.__send__(:class_extension).__send__(:include, class_extension)
+ end
+ end
+
+end
+
+class Class #:nodoc: all
+ undef_method :class_extension
+end
+
+
+
+# _____ _
+# |_ _|__ ___| |_
+# | |/ _ \/ __| __|
+# | | __/\__ \ |_
+# |_|\___||___/\__|
+#
+
+=begin test
+
+ require 'test/unit'
+
+ class TC_ClassMethods < Test::Unit::TestCase
+
+ # fixture
+
+ module N
+ class_extension do
+ def n ; 43 ; end
+ def s ; self ; end
+ end
+ extend class_extension
+ end
+
+ class X
+ include N
+ def n ; 11 ; end
+ end
+
+ module K
+ include N
+ class_extension do
+ def n ; super + 1 ; end
+ end
+ end
+
+ class Z
+ include K
+ end
+
+ # tests
+
+ def test_01
+ assert_equal( 43, N.n )
+ assert_equal( N, N.s )
+ end
+ def test_02
+ assert_equal( 43, X.n )
+ assert_equal( X, X.s )
+ end
+ def test_03
+ assert_equal( 11, X.new.n )
+ end
+ def test_04
+ assert_equal( 43, K.n ) #notic the difference!
+ assert_equal( K, K.s )
+ end
+ def test_05
+ assert_equal( 44, Z.n )
+ assert_equal( Z, Z.s )
+ end
+
+ end
+
+=end
+
diff --git a/lib/ofx-parser.rb b/lib/ofx-parser.rb
new file mode 100644
index 0000000..f5787f7
--- /dev/null
+++ b/lib/ofx-parser.rb
@@ -0,0 +1,175 @@
+require 'hpricot'
+require 'time'
+require 'date'
+
+%w(class-extension ofx sic).each do |fn|
+ require File.dirname(__FILE__) + "/#{fn}"
+end
+
+module OfxParser
+ VERSION = '1.0.0'
+
+ class OfxParser
+
+ # Creates and returns an Ofx instance when given a well-formed OFX document,
+ # complete with the mandatory key:pair header.
+ def self.parse(ofx)
+ ofx = ofx.respond_to?(:read) ? ofx.read.to_s : ofx.to_s
+
+ return Ofx.new if ofx == ""
+
+ header, body = pre_process(ofx)
+
+ ofx_out = parse_body(body)
+ ofx_out.header = header
+ ofx_out
+ end
+
+ # Designed to make the main OFX body parsable. This means adding closing tags
+ # to the SGML to make it parsable by hpricot.
+ #
+ # Returns an array of 2 elements:
+ # * header as a hash,
+ # * body as an evily pre-processed string ready for parsing by hpricot.
+ def self.pre_process(ofx)
+ header, body = ofx.split(/\n\n/)
+
+ header = Hash[*header.split(/:|\n/)]
+
+ body.gsub!(/>\s+<')
+ body.gsub!(/\s+\s+/m, '>')
+ body.gsub!(/<(\w+?)>([^<]+)/m, '<\1>\2\1>')
+
+ [header, body]
+ end
+
+ # Takes an OFX datetime string of the format:
+ # * YYYYMMDDHHMMSS.XXX[gmt offset:tz name]
+ # * YYYYMMDD
+ # * YYYYMMDDHHMMSS
+ # * YYYYMMDDHHMMSS.XXX
+ #
+ # Returns a DateTime object. Milliseconds (XXX) are ignored.
+ def self.parse_datetime(date)
+ if /\A\s*
+ (\d{4})(\d{2})(\d{2}) ?# YYYYMMDD 1,2,3
+ (?:(\d{2})(\d{2})(\d{2}))? ?# HHMMSS - optional 4,5,6
+ (?:\.(\d{3}))? ?# .XXX - optional 7
+ (?:\[(-?\d+)\:\w{3}\])? ?# [-n:TZ] - optional 8,9
+ \s*\z/ix =~ date
+ year = $1.to_i
+ mon = $2.to_i
+ day = $3.to_i
+ hour = $4.to_i
+ min = $5.to_i
+ sec = $6.to_i
+ # DateTime does not support usecs.
+ # usec = 0
+ # usec = $7.to_f * 1000000 if $7
+ off = Rational($8.to_i, 24) # offset as a fraction of day. :|
+ DateTime.civil(year, mon, day, hour, min, sec, off)
+ end
+ end
+
+ private
+ def self.parse_body(body)
+ doc = Hpricot.XML(body)
+
+ ofx = Ofx.new
+
+ ofx.sign_on = build_signon((doc/"SIGNONMSGSRSV1/SONRS"))
+ ofx.bank_account = build_bank((doc/"BANKMSGSRSV1/STMTTRNRS")) unless (doc/"BANKMSGSRSV1").empty?
+ ofx.credit_card = build_credit((doc/"CREDITCARDMSGSRSV1/CCSTMTTRNRS")) unless (doc/"CREDITCARDMSGSRSV1").empty?
+ #build_investment((doc/"SIGNONMSGSRQV1"))
+
+ ofx
+ end
+
+ def self.build_signon(doc)
+ sign_on = SignOn.new
+ sign_on.status = build_status((doc/"STATUS"))
+ sign_on.date = parse_datetime((doc/"DTSERVER").inner_text)
+ sign_on.language = (doc/"LANGUAGE").inner_text
+
+ sign_on.institute = Institute.new
+ sign_on.institute.name = ((doc/"FI")/"ORG").inner_text
+ sign_on.institute.id = ((doc/"FI")/"FID").inner_text
+ sign_on
+ end
+
+ def self.build_bank(doc)
+ acct = BankAccount.new
+
+ acct.transaction_uid = (doc/"TRNUID").inner_text.strip
+ acct.number = (doc/"STMTRS/BANKACCTFROM/ACCTID").inner_text
+ acct.routing_number = (doc/"STMTRS/BANKACCTFROM/BANKID").inner_text
+ acct.type = (doc/"STMTRS/BANKACCTFROM/ACCTTYPE").inner_text.strip
+ acct.balance = (doc/"STMTRS/LEDGERBAL/BALAMT").inner_text
+ acct.balance_date = parse_datetime((doc/"STMTRS/LEDGERBAL/DTASOF").inner_text)
+
+ statement = Statement.new
+ statement.currency = (doc/"STMTRS/CURDEF").inner_text
+ statement.start_date = parse_datetime((doc/"STMTRS/BANKTRANLIST/DTSTART").inner_text)
+ statement.end_date = parse_datetime((doc/"STMTRS/BANKTRANLIST/DTEND").inner_text)
+ acct.statement = statement
+
+ statement.transactions = (doc/"STMTRS/BANKTRANLIST/STMTTRN").collect do |t|
+ build_transaction(t)
+ end
+
+ acct
+ end
+
+ def self.build_credit(doc)
+ acct = CreditAccount.new
+
+ acct.number = (doc/"CCSTMTRS/CCACCTFROM/ACCTID").inner_text
+ acct.transaction_uid = (doc/"TRNUID").inner_text.strip
+ acct.balance = (doc/"CCSTMTRS/LEDGERBAL/BALAMT").inner_text
+ acct.balance_date = parse_datetime((doc/"CCSTMTRS/LEDGERBAL/DTASOF").inner_text)
+ acct.remaining_credit = (doc/"CCSTMTRS/AVAILBAL/BALAMT").inner_text
+ acct.remaining_credit_date = parse_datetime((doc/"CCSTMTRS/AVAILBAL/DTASOF").inner_text)
+
+ statement = Statement.new
+ statement.currency = (doc/"CCSTMTRS/CURDEF").inner_text
+ statement.start_date = parse_datetime((doc/"CCSTMTRS/BANKTRANLIST/DTSTART").inner_text)
+ statement.end_date = parse_datetime((doc/"CCSTMTRS/BANKTRANLIST/DTEND").inner_text)
+ acct.statement = statement
+
+ statement.transactions = (doc/"CCSTMTRS/BANKTRANLIST/STMTTRN").collect do |t|
+ build_transaction(t)
+ end
+
+ acct
+ end
+
+ # for credit and bank transactions.
+ def self.build_transaction(t)
+ transaction = Transaction.new
+ transaction.type = (t/"TRNTYPE").inner_text
+ transaction.date = parse_datetime((t/"DTPOSTED").inner_text)
+ transaction.amount = (t/"TRNAMT").inner_text
+ transaction.fit_id = (t/"FITID").inner_text
+ transaction.payee = (t/"PAYEE").inner_text + (t/"NAME").inner_text
+ transaction.memo = (t/"MEMO").inner_text
+ transaction.sic = (t/"SIC").inner_text
+ transaction.check_number = (t/"CHECKNUM").inner_text if transaction.type == :CHECK
+ transaction
+ end
+
+
+ def self.build_investment(doc)
+
+ end
+
+ def self.build_status(doc)
+ status = Status.new
+ status.code = (doc/"CODE").inner_text
+ status.severity = (doc/"SEVERITY").inner_text
+ status.message = (doc/"MESSAGE").inner_text
+ status
+ end
+
+ end
+end
diff --git a/lib/ofx.rb b/lib/ofx.rb
new file mode 100644
index 0000000..94afc01
--- /dev/null
+++ b/lib/ofx.rb
@@ -0,0 +1,178 @@
+module OfxParser
+ module MonetarySupport
+
+ @@monies ||= []
+
+ class_extension do
+ def monetary_vars(*methods) #:nodoc:
+ @@monies += methods
+ end
+ end
+
+ # Returns pennies for a given string amount, i.e:
+ # '-123.45' => 12345
+ # '123' => 12300
+ def pennies_for(amount)
+ return nil if amount == ""
+ int, fraction = amount.scan(/\d+/)
+ i = (fraction.to_s.strip =~ /[1-9]/) ? "#{int}#{fraction[0,2]}".to_i : int.to_i * 100
+ amount =~ /^\s*-\s*\d+/ ? -i : i
+ end
+
+ def original_method(meth) #:nodoc:
+ meth.to_s.sub('_in_pennies','').to_sym rescue nil
+ end
+
+ def monetary_method_call?(meth) #:nodoc:
+ orig = original_method(meth)
+ @@monies.include?(orig) && meth.to_s == "#{orig}_in_pennies"
+ end
+
+ def method_missing(meth, *args) #:nodoc:
+ if (monetary_method_call?(meth))
+ pennies_for(send(original_method(meth)))
+ else
+ super
+ end
+ end
+
+ def respond_to?(meth) #:nodoc:
+ monetary_method_call?(meth) ? true : super
+ end
+
+ end
+
+ # This class is returned when a parse is successful.
+ # == General Notes
+ # * currency symbols are an iso4217 3-letter code
+ # * language is defined by iso639 3-letter code
+ class Ofx
+ attr_accessor :header, :sign_on, :bank_account, :credit_card, :investment
+
+ def accounts
+ accounts = []
+ [:bank_account, :credit_card, :investment].each do |method|
+ val = send(method)
+ accounts << val if val
+ end
+ accounts
+ end
+ end
+
+ class SignOn
+ attr_accessor :status, :date, :language, :institute
+ end
+
+ class Account
+ attr_accessor :number, :statement, :transaction_uid
+ end
+
+ class BankAccount < Account
+ TYPE = [:CHECKING, :SAVINGS, :MONEYMRKT, :CREDITLINE]
+ attr_accessor :routing_number, :type, :balance, :balance_date
+
+ include MonetarySupport
+ monetary_vars :balance
+
+ undef type
+ def type
+ @type.to_s.upcase.to_sym
+ end
+ end
+
+ class CreditAccount < Account
+ attr_accessor :remaining_credit, :remaining_credit_date, :balance, :balance_date
+
+ include MonetarySupport
+ monetary_vars :remaining_credit, :balance
+ end
+
+ class InvestmentAccount < Account
+ attr_accessor :broker_id, :positions, :margin_balance, :short_balance, :cash_balance
+
+ include MonetarySupport
+ monetary_vars :margin_balance, :short_balance, :cash_balance
+ end
+
+
+ class Statement
+ attr_accessor :currency, :transactions, :start_date, :end_date
+ end
+
+ class Transaction
+ attr_accessor :type, :date, :amount, :fit_id, :check_number, :sic, :memo, :payee
+
+ include MonetarySupport
+ monetary_vars :amount
+
+ TYPE = {
+ :CREDIT => "Generic credit",
+ :DEBIT => "Generic debit",
+ :INT => "Interest earned or paid ",
+ :DIV => "Dividend",
+ :FEE => "FI fee",
+ :SRVCHG => "Service charge",
+ :DEP => "Deposit",
+ :ATM => "ATM debit or credit",
+ :POS => "Point of sale debit or credit ",
+ :XFER => "Transfer",
+ :CHECK => "Check",
+ :PAYMENT => "Electronic payment",
+ :CASH => "Cash withdrawal",
+ :DIRECTDEP => "Direct deposit",
+ :DIRECTDEBIT => "Merchant initiated debit",
+ :REPEATPMT => "Repeating payment/standing order",
+ :OTHER => "Other"
+ }
+
+ def type_desc
+ TYPE[type]
+ end
+
+ undef type
+ def type
+ @type.to_s.strip.upcase.to_sym
+ end
+
+ undef sic
+ def sic
+ @sic == "" ? nil : @sic
+ end
+
+ def sic_desc
+ Sic::CODES[sic]
+ end
+ end
+
+ class Position
+ end
+
+ # Status of a sign on
+ class Status
+ attr_accessor :code, :severity, :message
+
+ CODES = {
+ '0' => 'Success',
+ '2000' => 'General error',
+ '15000' => 'Must change USERPASS',
+ '15500' => 'Signon invalid',
+ '15501' => 'Customer account already in use',
+ '15502' => 'USERPASS Lockout'
+ }
+
+ def code_desc
+ CODES[code]
+ end
+
+ undef code
+ def code
+ @code.to_s.strip
+ end
+
+ end
+
+ class Institute
+ attr_accessor :name, :id
+ end
+
+end
diff --git a/lib/sic.rb b/lib/sic.rb
new file mode 100644
index 0000000..5e320f4
--- /dev/null
+++ b/lib/sic.rb
@@ -0,0 +1,1457 @@
+module OfxParser
+
+ # The U.S. Equal Employment Opportunity Commission
+ # Standard Industrial Classification Code Descriptions
+ #
+ # From http://www.eeoc.gov/stats/jobpat/siccodes.html
+ module Sic
+
+ CODES = {
+ '3291' => "ABRASIVE PRODUCTS",
+ '6321' => "ACCIDENT AND HEALTH INSURANCE",
+ '8720' => "ACCOUNTING, AUDITING, & BOOKKEEPING",
+ '8721' => "ACCOUNTING, AUDITING, & BOOKKEEPING",
+ '2891' => "ADHESIVES AND SEALANTS",
+ '7322' => "ADJUSTMENT & COLLECTION SERVICES",
+ '7310' => "ADVERTISING",
+ '7311' => "ADVERTISING AGENCIES",
+ '7319' => "ADVERTISING, NEC",
+ '2870' => "AGRICULTURAL CHEMICALS",
+ '2879' => "AGRICULTURAL CHEMICALS, NEC",
+ '0200' => "AGRICULTURAL PRODUCTION^LIVESTOCK",
+ '0700' => "AGRICULTURAL SERVICES",
+ '3563' => "AIR AND GAS COMPRESSORS",
+ '4513' => "AIR COURIER SERVICES",
+ '4520' => "AIR TRANSPORTATION, NONSCHEDULED",
+ '4522' => "AIR TRANSPORTATION, NONSCHEDULED",
+ '4510' => "AIR TRANSPORTATION, SCHEDULED",
+ '4512' => "AIR TRANSPORTATION, SCHEDULED",
+ '3721' => "AIRCRAFT",
+ '3720' => "AIRCRAFT AND PARTS",
+ '3724' => "AIRCRAFT ENGINES AND ENGINE PARTS",
+ '3728' => "AIRCRAFT PARTS AND EQUIPMENT, NEC",
+ '4580' => "AIRPORTS, FLYING FIELDS, & SERVICES",
+ '4581' => "AIRPORTS, FLYING FIELDS, & SERVICES",
+ '2812' => "ALKALIES AND CHLORINE",
+ '3363' => "ALUMINUM DIE-CASTINGS",
+ '3354' => "ALUMINUM EXTRUDED PRODUCTS",
+ '3365' => "ALUMINUM FOUNDRIES",
+ '3355' => "ALUMINUM ROLLING AND DRAWING, NEC",
+ '3353' => "ALUMINUM SHEET, PLATE, AND FOIL",
+ '3483' => "AMMUNITION, EXC. FOR SMALL ARMS, NEC",
+ '7900' => "AMUSEMENT & RECREATION SERVICES",
+ '7999' => "AMUSEMENT AND RECREATION, NEC",
+ '7996' => "AMUSEMENT PARKS",
+ '3826' => "ANALYTICAL INSTRUMENTS",
+ '2077' => "ANIMAL AND MARINE FATS AND OILS",
+ '0273' => "ANIMAL AQUACULTURE",
+ '0750' => "ANIMAL SERVICES, EXCEPT VETERINARY",
+ '0270' => "ANIMAL SPECIALTIES",
+ '0279' => "ANIMAL SPECIALTIES, NEC",
+ '0752' => "ANIMAL SPECIALTY SERVICES",
+ '1230' => "ANTHRACITE MINING",
+ '1231' => "ANTHRACITE MINING",
+ '6513' => "APARTMENT BUILDING OPERATORS",
+ '2389' => "APPAREL AND ACCESSORIES, NEC",
+ '5600' => "APPAREL AND ACCESSORY STORES",
+ '2300' => "APPAREL AND OTHER TEXTILE PRODUCTS",
+ '2387' => "APPAREL BELTS",
+ '5130' => "APPAREL, PIECE GOODS, AND NOTIONS",
+ '3446' => "ARCHITECTURAL METAL WORK",
+ '8712' => "ARCHITECTURAL SERVICES",
+ '7694' => "ARMATURE REWINDING SHOPS",
+ '3292' => "ASBESTOS PRODUCTS",
+ '2952' => "ASPHALT FELTS AND COATINGS",
+ '2950' => "ASPHALT PAVING AND ROOFING MATERIALS",
+ '2951' => "ASPHALT PAVING MIXTURES AND BLOCKS",
+ '5530' => "AUTO AND HOME SUPPLY STORES",
+ '5531' => "AUTO AND HOME SUPPLY STORES",
+ '7533' => "AUTO EXHAUST SYSTEM REPAIR SHOPS",
+ '7500' => "AUTO REPAIR, SERVICES, AND PARKING",
+ '3581' => "AUTOMATIC VENDING MACHINES",
+ '7520' => "AUTOMOBILE PARKING",
+ '7521' => "AUTOMOBILE PARKING",
+ '5012' => "AUTOMOBILES AND OTHER MOTOR VEHICLES",
+ '2396' => "AUTOMOTIVE AND APPAREL TRIMMINGS",
+ '5500' => "AUTOMOTIVE DEALERS & SERVICE STATIONS",
+ '5590' => "AUTOMOTIVE DEALERS, NEC",
+ '5599' => "AUTOMOTIVE DEALERS, NEC",
+ '7536' => "AUTOMOTIVE GLASS REPLACEMENT SHOPS",
+ '7510' => "AUTOMOTIVE RENTALS, NO DRIVERS",
+ '7530' => "AUTOMOTIVE REPAIR SHOPS",
+ '7539' => "AUTOMOTIVE REPAIR SHOPS, NEC",
+ '7540' => "AUTOMOTIVE SERVICES, EXCEPT REPAIR",
+ '7549' => "AUTOMOTIVE SERVICES, NEC",
+ '3465' => "AUTOMOTIVE STAMPINGS",
+ '7537' => "AUTOMOTIVE TRANSMISSION REPAIR SHOPS",
+ '2673' => "BAGS: PLASTICS, LAMINATED, & COATED",
+ '2674' => "BAGS: UNCOATED PAPER & MULTIWALL",
+ '2050' => "BAKERY PRODUCTS",
+ '3562' => "BALL AND ROLLER BEARINGS",
+ '6712' => "BANK HOLDING COMPANIES",
+ '7240' => "BARBER SHOPS",
+ '7241' => "BARBER SHOPS",
+ '7230' => "BEAUTY SHOPS",
+ '7231' => "BEAUTY SHOPS",
+ '0211' => "BEEF CATTLE FEEDLOTS",
+ '0212' => "BEEF CATTLE, EXCEPT FEEDLOTS",
+ '5181' => "BEER AND ALE",
+ '5180' => "BEER, WINE, AND DISTILLED BEVERAGES",
+ '2063' => "BEET SUGAR",
+ '0171' => "BERRY CROPS",
+ '2080' => "BEVERAGES",
+ '2836' => "BIOLOGICAL PRODUCTS EXC. DIAGNOSTIC",
+ '1220' => "BITUMINOUS COAL AND LIGNITE MINING",
+ '1221' => "BITUMINOUS COAL AND LIGNITE^SURFACE",
+ '1222' => "BITUMINOUS COAL^UNDERGROUND",
+ '2780' => "BLANKBOOKS AND BOOKBINDING",
+ '2782' => "BLANKBOOKS AND LOOSELEAF BINDERS",
+ '3310' => "BLAST FURNACE AND BASIC STEEL PRODUCTS",
+ '3312' => "BLAST FURNACES AND STEEL MILLS",
+ '3564' => "BLOWERS AND FANS",
+ '3732' => "BOAT BUILDING AND REPAIRING",
+ '5550' => "BOAT DEALERS",
+ '5551' => "BOAT DEALERS",
+ '3452' => "BOLTS, NUTS, RIVETS, AND WASHERS",
+ '2732' => "BOOK PRINTING",
+ '2731' => "BOOK PUBLISHING",
+ '5942' => "BOOK STORES",
+ '2789' => "BOOKBINDING AND RELATED WORK",
+ '2730' => "BOOKS",
+ '5192' => "BOOKS, PERIODICALS, & NEWSPAPERS",
+ '8420' => "BOTANICAL AND ZOOLOGICAL GARDENS",
+ '8422' => "BOTANICAL AND ZOOLOGICAL GARDENS",
+ '2086' => "BOTTLED AND CANNED SOFT DRINKS",
+ '7930' => "BOWLING CENTERS",
+ '7933' => "BOWLING CENTERS",
+ '2342' => "BRAS, GIRDLES, AND ALLIED GARMENTS",
+ '2051' => "BREAD, CAKE, AND RELATED PRODUCTS",
+ '3251' => "BRICK AND STRUCTURAL CLAY TILE",
+ '5032' => "BRICK, STONE, & RELATED MATERIALS",
+ '1622' => "BRIDGE, TUNNEL, & ELEVATED HIGHWAY",
+ '2210' => "BROADWOVEN FABRIC MILLS, COTTON",
+ '2211' => "BROADWOVEN FABRIC MILLS, COTTON",
+ '2220' => "BROADWOVEN FABRIC MILLS, MANMADE",
+ '2221' => "BROADWOVEN FABRIC MILLS, MANMADE",
+ '2230' => "BROADWOVEN FABRIC MILLS, WOOL",
+ '2231' => "BROADWOVEN FABRIC MILLS, WOOL",
+ '0251' => "BROILER, FRYER, AND ROASTER CHICKENS",
+ '3991' => "BROOMS AND BRUSHES",
+ '7349' => "BUILDING MAINTENANCE SERVICES, NEC",
+ '5200' => "BUILDING MATERIALS & GARDEN SUPPLIES",
+ '3995' => "BURIAL CASKETS",
+ '4140' => "BUS CHARTER SERVICE",
+ '4142' => "BUS CHARTER SERVICE, EXCEPT LOCAL",
+ '4170' => "BUS TERMINAL AND SERVICE FACILITIES",
+ '4173' => "BUS TERMINAL AND SERVICE FACILITIES",
+ '8244' => "BUSINESS AND SECRETARIAL SCHOOLS",
+ '8610' => "BUSINESS ASSOCIATIONS",
+ '8611' => "BUSINESS ASSOCIATIONS",
+ '8748' => "BUSINESS CONSULTING, NEC",
+ '6150' => "BUSINESS CREDIT INSTITUTIONS",
+ '7300' => "BUSINESS SERVICES",
+ '7389' => "BUSINESS SERVICES, NEC",
+ '4840' => "CABLE AND OTHER PAY TV SERVICES",
+ '4841' => "CABLE AND OTHER PAY TV SERVICES",
+ '3578' => "CALCULATING AND ACCOUNTING EQUIPMENT",
+ '5946' => "CAMERA & PHOTOGRAPHIC SUPPLY STORES",
+ '7030' => "CAMPS AND RECREATIONAL VEHICLE PARKS",
+ '2064' => "CANDY & OTHER CONFECTIONERY PRODUCTS",
+ '5440' => "CANDY, NUT, AND CONFECTIONERY STORES",
+ '5441' => "CANDY, NUT, AND CONFECTIONERY STORES",
+ '2062' => "CANE SUGAR REFINING",
+ '2091' => "CANNED AND CURED FISH AND SEAFOODS",
+ '2033' => "CANNED FRUITS AND VEGETABLES",
+ '2032' => "CANNED SPECIALTIES",
+ '2394' => "CANVAS AND RELATED PRODUCTS",
+ '3624' => "CARBON AND GRAPHITE PRODUCTS",
+ '2895' => "CARBON BLACK",
+ '3955' => "CARBON PAPER AND INKED RIBBONS",
+ '3592' => "CARBURETORS, PISTONS, RINGS, VALVES",
+ '1750' => "CARPENTRY AND FLOOR WORK",
+ '1751' => "CARPENTRY WORK",
+ '7217' => "CARPET AND UPHOLSTERY CLEANING",
+ '2270' => "CARPETS AND RUGS",
+ '2273' => "CARPETS AND RUGS",
+ '7542' => "CARWASHES",
+ '0119' => "CASH GRAINS, NEC",
+ '5961' => "CATALOG AND MAIL-ORDER HOUSES",
+ '2823' => "CELLULOSIC MANMADE FIBERS",
+ '3240' => "CEMENT, HYDRAULIC",
+ '3241' => "CEMENT, HYDRAULIC",
+ '6553' => "CEMETERY SUBDIVIDERS AND DEVELOPERS",
+ '6010' => "CENTRAL RESERVE DEPOSITORY",
+ '6019' => "CENTRAL RESERVE DEPOSITORY, NEC",
+ '3253' => "CERAMIC WALL AND FLOOR TILE",
+ '2043' => "CEREAL BREAKFAST FOODS",
+ '2022' => "CHEESE, NATURAL AND PROCESSED",
+ '1470' => "CHEMICAL AND FERTILIZER MINERALS",
+ '1479' => "CHEMICAL AND FERTILIZER MINING, NEC",
+ '2899' => "CHEMICAL PREPARATIONS, NEC",
+ '5169' => "CHEMICALS & ALLIED PRODUCTS, NEC",
+ '2800' => "CHEMICALS AND ALLIED PRODUCTS",
+ '5160' => "CHEMICALS AND ALLIED PRODUCTS",
+ '2130' => "CHEWING AND SMOKING TOBACCO",
+ '2131' => "CHEWING AND SMOKING TOBACCO",
+ '2067' => "CHEWING GUM",
+ '0252' => "CHICKEN EGGS",
+ '8350' => "CHILD DAY CARE SERVICES",
+ '8351' => "CHILD DAY CARE SERVICES",
+ '5640' => "CHILDREN'S AND INFANTS' WEAR STORES",
+ '5641' => "CHILDREN'S AND INFANTS' WEAR STORES",
+ '2066' => "CHOCOLATE AND COCOA PRODUCTS",
+ '2110' => "CIGARETTES",
+ '2111' => "CIGARETTES",
+ '2120' => "CIGARS",
+ '2121' => "CIGARS",
+ '0174' => "CITRUS FRUITS",
+ '8640' => "CIVIC AND SOCIAL ASSOCIATIONS",
+ '8641' => "CIVIC AND SOCIAL ASSOCIATIONS",
+ '1459' => "CLAY AND RELATED MINERALS, NEC",
+ '3255' => "CLAY REFRACTORIES",
+ '1450' => "CLAY, CERAMIC, & REFRACTORY MINERALS",
+ '5052' => "COAL AND OTHER MINERALS AND ORES",
+ '1200' => "COAL MINING",
+ '1240' => "COAL MINING SERVICES",
+ '1241' => "COAL MINING SERVICES",
+ '2295' => "COATED FABRICS, NOT RUBBERIZED",
+ '7993' => "COIN-OPERATED AMUSEMENT DEVICES",
+ '7215' => "COIN-OPERATED LAUNDRIES AND CLEANING",
+ '3316' => "COLD FINISHING OF STEEL SHAPES",
+ '8220' => "COLLEGES AND UNIVERSITIES",
+ '8221' => "COLLEGES AND UNIVERSITIES",
+ '4939' => "COMBINATION UTILITIES, NEC",
+ '4930' => "COMBINATION UTILITY SERVICES",
+ '7336' => "COMMERCIAL ART AND GRAPHIC DESIGN",
+ '6020' => "COMMERCIAL BANKS",
+ '6029' => "COMMERCIAL BANKS, NEC",
+ '5046' => "COMMERCIAL EQUIPMENT, NEC",
+ '0910' => "COMMERCIAL FISHING",
+ '3582' => "COMMERCIAL LAUNDRY EQUIPMENT",
+ '3646' => "COMMERCIAL LIGHTING FIXTURES",
+ '8732' => "COMMERCIAL NONPHYSICAL RESEARCH",
+ '7335' => "COMMERCIAL PHOTOGRAPHY",
+ '8731' => "COMMERCIAL PHYSICAL RESEARCH",
+ '2750' => "COMMERCIAL PRINTING",
+ '2754' => "COMMERCIAL PRINTING, GRAVURE",
+ '2752' => "COMMERCIAL PRINTING, LITHOGRAPHIC",
+ '2759' => "COMMERCIAL PRINTING, NEC",
+ '7940' => "COMMERCIAL SPORTS",
+ '6220' => "COMMODITY CONTRACTS BROKERS, DEALERS",
+ '6221' => "COMMODITY CONTRACTS BROKERS, DEALERS",
+ '4800' => "COMMUNICATION",
+ '4890' => "COMMUNICATION SERVICES, NEC",
+ '4899' => "COMMUNICATION SERVICES, NEC",
+ '3660' => "COMMUNICATIONS EQUIPMENT",
+ '3669' => "COMMUNICATIONS EQUIPMENT, NEC",
+ '7370' => "COMPUTER AND DATA PROCESSING SERVICES",
+ '3570' => "COMPUTER AND OFFICE EQUIPMENT",
+ '5734' => "COMPUTER AND SOFTWARE STORES",
+ '7376' => "COMPUTER FACILITIES MANAGEMENT",
+ '7373' => "COMPUTER INTEGRATED SYSTEMS DESIGN",
+ '7378' => "COMPUTER MAINTENANCE & REPAIR",
+ '3577' => "COMPUTER PERIPHERAL EQUIPMENT, NEC",
+ '7371' => "COMPUTER PROGRAMMING SERVICES",
+ '7379' => "COMPUTER RELATED SERVICES, NEC",
+ '7377' => "COMPUTER RENTAL & LEASING",
+ '3572' => "COMPUTER STORAGE DEVICES",
+ '3575' => "COMPUTER TERMINALS",
+ '5045' => "COMPUTERS, PERIPHERALS & SOFTWARE",
+ '3271' => "CONCRETE BLOCK AND BRICK",
+ '3272' => "CONCRETE PRODUCTS, NEC",
+ '1770' => "CONCRETE WORK",
+ '1771' => "CONCRETE WORK",
+ '3270' => "CONCRETE, GYPSUM, AND PLASTER PRODUCTS",
+ '5145' => "CONFECTIONERY",
+ '5082' => "CONSTRUCTION AND MINING MACHINERY",
+ '3530' => "CONSTRUCTION AND RELATED MACHINERY",
+ '3531' => "CONSTRUCTION MACHINERY",
+ '5039' => "CONSTRUCTION MATERIALS, NEC",
+ '1442' => "CONSTRUCTION SAND AND GRAVEL",
+ '2679' => "CONVERTED PAPER PRODUCTS, NEC",
+ '3535' => "CONVEYORS AND CONVEYING EQUIPMENT",
+ '2052' => "COOKIES AND CRACKERS",
+ '3366' => "COPPER FOUNDRIES",
+ '1020' => "COPPER ORES",
+ '1021' => "COPPER ORES",
+ '3351' => "COPPER ROLLING AND DRAWING",
+ '2298' => "CORDAGE AND TWINE",
+ '0115' => "CORN",
+ '2653' => "CORRUGATED AND SOLID FIBER BOXES",
+ '3961' => "COSTUME JEWELRY",
+ '3960' => "COSTUME JEWELRY AND NOTIONS",
+ '0131' => "COTTON",
+ '0724' => "COTTON GINNING",
+ '2074' => "COTTONSEED OIL MILLS",
+ '4215' => "COURIER SERVICES, EXCEPT BY AIR",
+ '2021' => "CREAMERY BUTTER",
+ '7320' => "CREDIT REPORTING AND COLLECTION",
+ '7323' => "CREDIT REPORTING SERVICES",
+ '6060' => "CREDIT UNIONS",
+ '0722' => "CROP HARVESTING",
+ '0721' => "CROP PLANTING AND PROTECTING",
+ '0723' => "CROP PREPARATION SERVICES FOR MARKET",
+ '0720' => "CROP SERVICES",
+ '3466' => "CROWNS AND CLOSURES",
+ '1310' => "CRUDE PETROLEUM AND NATURAL GAS",
+ '1311' => "CRUDE PETROLEUM AND NATURAL GAS",
+ '4612' => "CRUDE PETROLEUM PIPELINES",
+ '1423' => "CRUSHED AND BROKEN GRANITE",
+ '1422' => "CRUSHED AND BROKEN LIMESTONE",
+ '1420' => "CRUSHED AND BROKEN STONE",
+ '1429' => "CRUSHED AND BROKEN STONE, NEC",
+ '3643' => "CURRENT-CARRYING WIRING DEVICES",
+ '2391' => "CURTAINS AND DRAPERIES",
+ '3087' => "CUSTOM COMPOUND PURCHASED RESINS",
+ '3280' => "CUT STONE AND STONE PRODUCTS",
+ '3281' => "CUT STONE AND STONE PRODUCTS",
+ '3421' => "CUTLERY",
+ '3420' => "CUTLERY, HANDTOOLS, AND HARDWARE",
+ '2865' => "CYCLIC CRUDES AND INTERMEDIATES",
+ '0240' => "DAIRY FARMS",
+ '0241' => "DAIRY FARMS",
+ '2020' => "DAIRY PRODUCTS",
+ '5450' => "DAIRY PRODUCTS STORES",
+ '5451' => "DAIRY PRODUCTS STORES",
+ '5143' => "DAIRY PRODUCTS, EXC. DRIED OR CANNED",
+ '7910' => "DANCE STUDIOS, SCHOOLS, AND HALLS",
+ '7911' => "DANCE STUDIOS, SCHOOLS, AND HALLS",
+ '7374' => "DATA PROCESSING AND PREPARATION",
+ '8243' => "DATA PROCESSING SCHOOLS",
+ '0175' => "DECIDUOUS TREE FRUITS",
+ '4420' => "DEEP SEA DOMESTIC TRANS. OF FREIGHT",
+ '4424' => "DEEP SEA DOMESTIC TRANS. OF FREIGHT",
+ '4410' => "DEEP SEA FOREIGN TRANS. OF FREIGHT",
+ '4412' => "DEEP SEA FOREIGN TRANS. OF FREIGHT",
+ '4481' => "DEEP SEA PASSENGER TRANS., EX. FERRY",
+ '2034' => "DEHYDRATED FRUITS, VEGETABLES, SOUPS",
+ '3843' => "DENTAL EQUIPMENT AND SUPPLIES",
+ '8072' => "DENTAL LABORATORIES",
+ '5310' => "DEPARTMENT STORES",
+ '5311' => "DEPARTMENT STORES",
+ '6000' => "DEPOSITORY INSTITUTIONS",
+ '7381' => "DETECTIVE & ARMORED CAR SERVICES",
+ '2835' => "DIAGNOSTIC SUBSTANCES",
+ '2675' => "DIE-CUT PAPER AND BOARD",
+ '1410' => "DIMENSION STONE",
+ '1411' => "DIMENSION STONE",
+ '7331' => "DIRECT MAIL ADVERTISING SERVICES",
+ '5963' => "DIRECT SELLING ESTABLISHMENTS",
+ '7342' => "DISINFECTING & PEST CONTROL SERVICES",
+ '2085' => "DISTILLED AND BLENDED LIQUORS",
+ '2047' => "DOG AND CAT FOOD",
+ '3942' => "DOLLS AND STUFFED TOYS",
+ '5714' => "DRAPERY AND UPHOLSTERY STORES",
+ '2591' => "DRAPERY HARDWARE & BLINDS & SHADES",
+ '1381' => "DRILLING OIL AND GAS WELLS",
+ '5813' => "DRINKING PLACES",
+ '7833' => "DRIVE-IN MOTION PICTURE THEATERS",
+ '5910' => "DRUG STORES AND PROPRIETARY STORES",
+ '5912' => "DRUG STORES AND PROPRIETARY STORES",
+ '2830' => "DRUGS",
+ '5120' => "DRUGS, PROPRIETARIES, AND SUNDRIES",
+ '5122' => "DRUGS, PROPRIETARIES, AND SUNDRIES",
+ '2023' => "DRY, CONDENSED, EVAPORATED PRODUCTS",
+ '7216' => "DRYCLEANING PLANTS, EXCEPT RUG",
+ '5099' => "DURABLE GOODS, NEC",
+ '6514' => "DWELLING OPERATORS, EXC. APARTMENTS",
+ '5800' => "EATING AND DRINKING PLACES",
+ '5810' => "EATING AND DRINKING PLACES",
+ '5812' => "EATING PLACES",
+ '2079' => "EDIBLE FATS AND OILS, NEC",
+ '8200' => "EDUCATIONAL SERVICES",
+ '6732' => "EDUCATIONAL, RELIGIOUS, ETC. TRUSTS",
+ '4931' => "ELECTRIC AND OTHER SERVICES COMBINED",
+ '3610' => "ELECTRIC DISTRIBUTION EQUIPMENT",
+ '3634' => "ELECTRIC HOUSEWARES AND FANS",
+ '3641' => "ELECTRIC LAMPS",
+ '3640' => "ELECTRIC LIGHTING AND WIRING EQUIPMENT",
+ '4910' => "ELECTRIC SERVICES",
+ '4911' => "ELECTRIC SERVICES",
+ '4900' => "ELECTRIC, GAS, AND SANITARY SERVICES",
+ '5063' => "ELECTRICAL APPARATUS AND EQUIPMENT",
+ '5064' => "ELECTRICAL APPLIANCES, TV & RADIOS",
+ '3699' => "ELECTRICAL EQUIPMENT & SUPPLIES, NEC",
+ '5060' => "ELECTRICAL GOODS",
+ '3620' => "ELECTRICAL INDUSTRIAL APPARATUS",
+ '3629' => "ELECTRICAL INDUSTRIAL APPARATUS, NEC",
+ '7620' => "ELECTRICAL REPAIR SHOPS",
+ '7629' => "ELECTRICAL REPAIR SHOPS, NEC",
+ '1730' => "ELECTRICAL WORK",
+ '1731' => "ELECTRICAL WORK",
+ '3845' => "ELECTROMEDICAL EQUIPMENT",
+ '3313' => "ELECTROMETALLURGICAL PRODUCTS",
+ '3671' => "ELECTRON TUBES",
+ '3600' => "ELECTRONIC & OTHER ELECTRIC EQUIPMENT",
+ '3675' => "ELECTRONIC CAPACITORS",
+ '3677' => "ELECTRONIC COILS AND TRANSFORMERS",
+ '3670' => "ELECTRONIC COMPONENTS AND ACCESSORIES",
+ '3679' => "ELECTRONIC COMPONENTS, NEC",
+ '3571' => "ELECTRONIC COMPUTERS",
+ '3678' => "ELECTRONIC CONNECTORS",
+ '5065' => "ELECTRONIC PARTS AND EQUIPMENT",
+ '3676' => "ELECTRONIC RESISTORS",
+ '8210' => "ELEMENTARY AND SECONDARY SCHOOLS",
+ '8211' => "ELEMENTARY AND SECONDARY SCHOOLS",
+ '3534' => "ELEVATORS AND MOVING STAIRWAYS",
+ '7361' => "EMPLOYMENT AGENCIES",
+ '3694' => "ENGINE ELECTRICAL EQUIPMENT",
+ '8710' => "ENGINEERING & ARCHITECTURAL SERVICES",
+ '8700' => "ENGINEERING & MANAGEMENT SERVICES",
+ '8711' => "ENGINEERING SERVICES",
+ '3510' => "ENGINES AND TURBINES",
+ '7929' => "ENTERTAINERS & ENTERTAINMENT GROUPS",
+ '2677' => "ENVELOPES",
+ '3822' => "ENVIRONMENTAL CONTROLS",
+ '7359' => "EQUIPMENT RENTAL & LEASING, NEC",
+ '1794' => "EXCAVATION WORK",
+ '2892' => "EXPLOSIVES",
+ '2381' => "FABRIC DRESS AND WORK GLOVES",
+ '3400' => "FABRICATED METAL PRODUCTS",
+ '3499' => "FABRICATED METAL PRODUCTS, NEC",
+ '3498' => "FABRICATED PIPE AND FITTINGS",
+ '3443' => "FABRICATED PLATE WORK (BOILER SHOPS)",
+ '3060' => "FABRICATED RUBBER PRODUCTS, NEC",
+ '3069' => "FABRICATED RUBBER PRODUCTS, NEC",
+ '3441' => "FABRICATED STRUCTURAL METAL",
+ '3440' => "FABRICATED STRUCTURAL METAL PRODUCTS",
+ '2399' => "FABRICATED TEXTILE PRODUCTS, NEC",
+ '8744' => "FACILITIES SUPPORT SERVICES",
+ '5650' => "FAMILY CLOTHING STORES",
+ '5651' => "FAMILY CLOTHING STORES",
+ '3520' => "FARM AND GARDEN MACHINERY",
+ '5083' => "FARM AND GARDEN MACHINERY",
+ '0760' => "FARM LABOR AND MANAGEMENT SERVICES",
+ '0761' => "FARM LABOR CONTRACTORS",
+ '3523' => "FARM MACHINERY AND EQUIPMENT",
+ '0762' => "FARM MANAGEMENT SERVICES",
+ '4221' => "FARM PRODUCT WAREHOUSING AND STORAGE",
+ '5191' => "FARM SUPPLIES",
+ '5150' => "FARM-PRODUCT RAW MATERIALS",
+ '5159' => "FARM-PRODUCT RAW MATERIALS, NEC",
+ '3965' => "FASTENERS, BUTTONS, NEEDLES, & PINS",
+ '2070' => "FATS AND OILS",
+ '6110' => "FEDERAL & FED.-SPONSORED CREDIT",
+ '6111' => "FEDERAL & FED.-SPONSORED CREDIT",
+ '6061' => "FEDERAL CREDIT UNIONS",
+ '6011' => "FEDERAL RESERVE BANKS",
+ '6035' => "FEDERAL SAVINGS INSTITUTIONS",
+ '4482' => "FERRIES",
+ '1060' => "FERROALLOY ORES, EXCEPT VANADIUM",
+ '1061' => "FERROALLOY ORES, EXCEPT VANADIUM",
+ '2875' => "FERTILIZERS, MIXING ONLY",
+ '2655' => "FIBER CANS, DRUMS & SIMILAR PRODUCTS",
+ '0130' => "FIELD CROPS, EXCEPT CASH GRAINS",
+ '0139' => "FIELD CROPS, EXCEPT CASH GRAINS, NEC",
+ '0912' => "FINFISH",
+ '2261' => "FINISHING PLANTS, COTTON",
+ '2262' => "FINISHING PLANTS, MANMADE",
+ '2269' => "FINISHING PLANTS, NEC",
+ '6330' => "FIRE, MARINE, AND CASUALTY INSURANCE",
+ '6331' => "FIRE, MARINE, AND CASUALTY INSURANCE",
+ '5146' => "FISH AND SEAFOODS",
+ '0920' => "FISH HATCHERIES AND PRESERVES",
+ '0921' => "FISH HATCHERIES AND PRESERVES",
+ '0900' => "FISHING, HUNTING, AND TRAPPING",
+ '3210' => "FLAT GLASS",
+ '3211' => "FLAT GLASS",
+ '2087' => "FLAVORING EXTRACTS AND SYRUPS, NEC",
+ '5713' => "FLOOR COVERING STORES",
+ '1752' => "FLOOR LAYING AND FLOOR WORK, NEC",
+ '5992' => "FLORISTS",
+ '2041' => "FLOUR AND OTHER GRAIN MILL PRODUCTS",
+ '5193' => "FLOWERS & FLORISTS' SUPPLIES",
+ '3824' => "FLUID METERS AND COUNTING DEVICES",
+ '2026' => "FLUID MILK",
+ '3593' => "FLUID POWER CYLINDERS & ACTUATORS",
+ '3594' => "FLUID POWER PUMPS AND MOTORS",
+ '3492' => "FLUID POWER VALVES & HOSE FITTINGS",
+ '2657' => "FOLDING PAPERBOARD BOXES",
+ '2000' => "FOOD AND KINDRED PRODUCTS",
+ '0182' => "FOOD CROPS GROWN UNDER COVER",
+ '2099' => "FOOD PREPARATIONS, NEC",
+ '3556' => "FOOD PRODUCTS MACHINERY",
+ '5400' => "FOOD STORES",
+ '5139' => "FOOTWEAR",
+ '3130' => "FOOTWEAR CUT STOCK",
+ '3131' => "FOOTWEAR CUT STOCK",
+ '3140' => "FOOTWEAR, EXCEPT RUBBER",
+ '3149' => "FOOTWEAR, EXCEPT RUBBER, NEC",
+ '6081' => "FOREIGN BANK & BRANCHES & AGENCIES",
+ '6080' => "FOREIGN BANK & BRANCHES + AGENCIES",
+ '6082' => "FOREIGN TRADE & INTERNATIONAL BANKS",
+ '0831' => "FOREST PRODUCTS",
+ '0831' => "FOREST PRODUCTS",
+ '0800' => "FORESTRY",
+ '0850' => "FORESTRY SERVICES",
+ '0851' => "FORESTRY SERVICES",
+ '4430' => "FREIGHT TRANS. ON THE GREAT LAKES",
+ '4432' => "FREIGHT TRANS. ON THE GREAT LAKES",
+ '4730' => "FREIGHT TRANSPORTATION ARRANGEMENT",
+ '4731' => "FREIGHT TRANSPORTATION ARRANGEMENT",
+ '5148' => "FRESH FRUITS AND VEGETABLES",
+ '2092' => "FRESH OR FROZEN PREPARED FISH",
+ '2053' => "FROZEN BAKERY PRODUCTS, EXCEPT BREAD",
+ '2037' => "FROZEN FRUITS AND VEGETABLES",
+ '2038' => "FROZEN SPECIALTIES, NEC",
+ '5430' => "FRUIT AND VEGETABLE MARKETS",
+ '5431' => "FRUIT AND VEGETABLE MARKETS",
+ '0170' => "FRUITS AND TREE NUTS",
+ '0179' => "FRUITS AND TREE NUTS, NEC",
+ '5980' => "FUEL DEALERS",
+ '5989' => "FUEL DEALERS, NEC",
+ '5983' => "FUEL OIL DEALERS",
+ '6090' => "FUNCTIONS CLOSELY RELATED TO BANKING",
+ '6099' => "FUNCTIONS RELATED TO DEPOSIT BANKING",
+ '7260' => "FUNERAL SERVICE AND CREMATORIES",
+ '7261' => "FUNERAL SERVICE AND CREMATORIES",
+ '2370' => "FUR GOODS",
+ '2371' => "FUR GOODS",
+ '0271' => "FUR-BEARING ANIMALS AND RABBITS",
+ '5021' => "FURNITURE",
+ '2500' => "FURNITURE AND FIXTURES",
+ '2599' => "FURNITURE AND FIXTURES, NEC",
+ '5020' => "FURNITURE AND HOMEFURNISHINGS",
+ '5700' => "FURNITURE AND HOMEFURNISHINGS STORES",
+ '5710' => "FURNITURE AND HOMEFURNISHINGS STORES",
+ '5712' => "FURNITURE STORES",
+ '3944' => "GAMES, TOYS, AND CHILDREN'S VEHICLES",
+ '7212' => "GARMENT PRESSING & CLEANERS' AGENTS",
+ '4932' => "GAS AND OTHER SERVICES COMBINED",
+ '4920' => "GAS PRODUCTION AND DISTRIBUTION",
+ '4925' => "GAS PRODUCTION AND/OR DISTRIBUTION",
+ '4923' => "GAS TRANSMISSION AND DISTRIBUTION",
+ '3053' => "GASKETS, PACKING AND SEALING DEVICES",
+ '5540' => "GASOLINE SERVICE STATIONS",
+ '5541' => "GASOLINE SERVICE STATIONS",
+ '7538' => "GENERAL AUTOMOTIVE REPAIR SHOPS",
+ '1500' => "GENERAL BUILDING CONTRACTORS",
+ '0290' => "GENERAL FARMS, PRIMARILY ANIMAL",
+ '0291' => "GENERAL FARMS, PRIMARILY ANIMAL",
+ '0190' => "GENERAL FARMS, PRIMARILY CROP",
+ '0191' => "GENERAL FARMS, PRIMARILY CROP",
+ '3560' => "GENERAL INDUSTRIAL MACHINERY",
+ '3569' => "GENERAL INDUSTRIAL MACHINERY, NEC",
+ '0219' => "GENERAL LIVESTOCK, NEC",
+ '8062' => "GENERAL MEDICAL & SURGICAL HOSPITALS",
+ '5300' => "GENERAL MERCHANDISE STORES",
+ '4225' => "GENERAL WAREHOUSING AND STORAGE",
+ '5947' => "GIFT, NOVELTY, AND SOUVENIR SHOPS",
+ '2361' => "GIRLS' & CHILDREN'S DRESSES, BLOUSES",
+ '2360' => "GIRLS' AND CHILDREN'S OUTERWEAR",
+ '2369' => "GIRLS' AND CHILDREN'S OUTERWEAR, NEC",
+ '3220' => "GLASS AND GLASSWARE, PRESSED OR BLOWN",
+ '1793' => "GLASS AND GLAZING WORK",
+ '3221' => "GLASS CONTAINERS",
+ '1040' => "GOLD AND SILVER ORES",
+ '1041' => "GOLD ORES",
+ '5153' => "GRAIN AND FIELD BEANS",
+ '2040' => "GRAIN MILL PRODUCTS",
+ '0172' => "GRAPES",
+ '3321' => "GRAY AND DUCTILE IRON FOUNDRIES",
+ '2770' => "GREETING CARDS",
+ '2771' => "GREETING CARDS",
+ '5140' => "GROCERIES AND RELATED PRODUCTS",
+ '5149' => "GROCERIES AND RELATED PRODUCTS, NEC",
+ '5141' => "GROCERIES, GENERAL LINE",
+ '5410' => "GROCERY STORES",
+ '5411' => "GROCERY STORES",
+ '3761' => "GUIDED MISSILES AND SPACE VEHICLES",
+ '3760' => "GUIDED MISSILES, SPACE VEHICLES, PARTS",
+ '2861' => "GUM AND WOOD CHEMICALS",
+ '3275' => "GYPSUM PRODUCTS",
+ '3423' => "HAND AND EDGE TOOLS, NEC",
+ '3170' => "HANDBAGS AND PERSONAL LEATHER GOODS",
+ '3996' => "HARD SURFACE FLOOR COVERINGS, NEC",
+ '5072' => "HARDWARE",
+ '5250' => "HARDWARE STORES",
+ '5251' => "HARDWARE STORES",
+ '3429' => "HARDWARE, NEC",
+ '5070' => "HARDWARE, PLUMBING & HEATING EQUIPMENT",
+ '2426' => "HARDWOOD DIMENSION & FLOORING MILLS",
+ '2435' => "HARDWOOD VENEER AND PLYWOOD",
+ '2350' => "HATS, CAPS, AND MILLINERY",
+ '2353' => "HATS, CAPS, AND MILLINERY",
+ '8090' => "HEALTH AND ALLIED SERVICES, NEC",
+ '8099' => "HEALTH AND ALLIED SERVICES, NEC",
+ '8000' => "HEALTH SERVICES",
+ '3433' => "HEATING EQUIPMENT, EXCEPT ELECTRIC",
+ '7353' => "HEAVY CONSTRUCTION EQUIPMENT RENTAL",
+ '1600' => "HEAVY CONSTRUCTION, EX. BUILDING",
+ '1620' => "HEAVY CONSTRUCTION, EXCEPT HIGHWAY",
+ '1629' => "HEAVY CONSTRUCTION, NEC",
+ '7363' => "HELP SUPPLY SERVICES",
+ '1610' => "HIGHWAY AND STREET CONSTRUCTION",
+ '1611' => "HIGHWAY AND STREET CONSTRUCTION",
+ '5945' => "HOBBY, TOY, AND GAME SHOPS",
+ '0213' => "HOGS",
+ '3536' => "HOISTS, CRANES, AND MONORAILS",
+ '6700' => "HOLDING AND OTHER INVESTMENT OFFICES",
+ '6719' => "HOLDING COMPANIES, NEC",
+ '6710' => "HOLDING OFFICES",
+ '8080' => "HOME HEALTH CARE SERVICES",
+ '8082' => "HOME HEALTH CARE SERVICES",
+ '5023' => "HOMEFURNISHINGS",
+ '0272' => "HORSES AND OTHER EQUINES",
+ '0180' => "HORTICULTURAL SPECIALTIES",
+ '3050' => "HOSE & BELTING & GASKETS & PACKING",
+ '2252' => "HOSIERY, NEC",
+ '6324' => "HOSPITAL AND MEDICAL SERVICE PLANS",
+ '8060' => "HOSPITALS",
+ '7010' => "HOTELS AND MOTELS",
+ '7011' => "HOTELS AND MOTELS",
+ '7000' => "HOTELS AND OTHER LODGING PLACES",
+ '3142' => "HOUSE SLIPPERS",
+ '2392' => "HOUSEFURNISHINGS, NEC",
+ '5720' => "HOUSEHOLD APPLIANCE STORES",
+ '5722' => "HOUSEHOLD APPLIANCE STORES",
+ '3630' => "HOUSEHOLD APPLIANCES",
+ '3639' => "HOUSEHOLD APPLIANCES, NEC",
+ '3650' => "HOUSEHOLD AUDIO AND VIDEO EQUIPMENT",
+ '3651' => "HOUSEHOLD AUDIO AND VIDEO EQUIPMENT",
+ '3631' => "HOUSEHOLD COOKING EQUIPMENT",
+ '2510' => "HOUSEHOLD FURNITURE",
+ '2519' => "HOUSEHOLD FURNITURE, NEC",
+ '3633' => "HOUSEHOLD LAUNDRY EQUIPMENT",
+ '3632' => "HOUSEHOLD REFRIGERATORS AND FREEZERS",
+ '3635' => "HOUSEHOLD VACUUM CLEANERS",
+ '0970' => "HUNTING, TRAPPING, GAME PROPAGATION",
+ '0971' => "HUNTING, TRAPPING, GAME PROPAGATION",
+ '2024' => "ICE CREAM AND FROZEN DESSERTS",
+ '8320' => "INDIVIDUAL AND FAMILY SERVICES",
+ '8322' => "INDIVIDUAL AND FAMILY SERVICES",
+ '5113' => "INDUSTRIAL & PERSONAL SERVICE PAPER",
+ '1541' => "INDUSTRIAL BUILDINGS AND WAREHOUSES",
+ '3567' => "INDUSTRIAL FURNACES AND OVENS",
+ '2813' => "INDUSTRIAL GASES",
+ '2810' => "INDUSTRIAL INORGANIC CHEMICALS",
+ '2819' => "INDUSTRIAL INORGANIC CHEMICALS, NEC",
+ '7218' => "INDUSTRIAL LAUNDERERS",
+ '3500' => "INDUSTRIAL MACHINERY AND EQUIPMENT",
+ '5084' => "INDUSTRIAL MACHINERY AND EQUIPMENT",
+ '3590' => "INDUSTRIAL MACHINERY, NEC",
+ '3599' => "INDUSTRIAL MACHINERY, NEC",
+ '2860' => "INDUSTRIAL ORGANIC CHEMICALS",
+ '2869' => "INDUSTRIAL ORGANIC CHEMICALS, NEC",
+ '3543' => "INDUSTRIAL PATTERNS",
+ '1446' => "INDUSTRIAL SAND",
+ '5085' => "INDUSTRIAL SUPPLIES",
+ '3537' => "INDUSTRIAL TRUCKS AND TRACTORS",
+ '3491' => "INDUSTRIAL VALVES",
+ '7375' => "INFORMATION RETRIEVAL SERVICES",
+ '2816' => "INORGANIC PIGMENTS",
+ '4785' => "INSPECTION & FIXED FACILITIES",
+ '1796' => "INSTALLING BUILDING EQUIPMENT, NEC",
+ '3800' => "INSTRUMENTS AND RELATED PRODUCTS",
+ '3825' => "INSTRUMENTS TO MEASURE ELECTRICITY",
+ '6400' => "INSURANCE AGENTS, BROKERS, & SERVICE",
+ '6410' => "INSURANCE AGENTS, BROKERS, & SERVICE",
+ '6411' => "INSURANCE AGENTS, BROKERS, & SERVICE",
+ '6300' => "INSURANCE CARRIERS",
+ '6390' => "INSURANCE CARRIERS, NEC",
+ '6399' => "INSURANCE CARRIERS, NEC",
+ '4131' => "INTERCITY & RURAL BUS TRANSPORTATION",
+ '4130' => "INTERCITY AND RURAL BUS TRANSPORTATION",
+ '8052' => "INTERMEDIATE CARE FACILITIES",
+ '3519' => "INTERNAL COMBUSTION ENGINES, NEC",
+ '6282' => "INVESTMENT ADVICE",
+ '6720' => "INVESTMENT OFFICES",
+ '6726' => "INVESTMENT OFFICES, NEC",
+ '6799' => "INVESTORS, NEC",
+ '0134' => "IRISH POTATOES",
+ '3462' => "IRON AND STEEL FORGINGS",
+ '3320' => "IRON AND STEEL FOUNDRIES",
+ '1010' => "IRON ORES",
+ '1011' => "IRON ORES",
+ '4970' => "IRRIGATION SYSTEMS",
+ '4971' => "IRRIGATION SYSTEMS",
+ '3915' => "JEWELERS' MATERIALS & LAPIDARY WORK",
+ '5094' => "JEWELRY & PRECIOUS STONES",
+ '5944' => "JEWELRY STORES",
+ '3911' => "JEWELRY, PRECIOUS METAL",
+ '3910' => "JEWELRY, SILVERWARE, AND PLATED WARE",
+ '8330' => "JOB TRAINING AND RELATED SERVICES",
+ '8331' => "JOB TRAINING AND RELATED SERVICES",
+ '8222' => "JUNIOR COLLEGES",
+ '1455' => "KAOLIN AND BALL CLAY",
+ '8092' => "KIDNEY DIALYSIS CENTERS",
+ '2253' => "KNIT OUTERWEAR MILLS",
+ '2254' => "KNIT UNDERWEAR MILLS",
+ '2250' => "KNITTING MILLS",
+ '2259' => "KNITTING MILLS, NEC",
+ '8630' => "LABOR ORGANIZATIONS",
+ '8631' => "LABOR ORGANIZATIONS",
+ '3821' => "LABORATORY APPARATUS AND FURNITURE",
+ '2258' => "LACE & WARP KNIT FABRIC MILLS",
+ '3083' => "LAMINATED PLASTICS PLATE & SHEET",
+ '0780' => "LANDSCAPE AND HORTICULTURAL SERVICES",
+ '0781' => "LANDSCAPE COUNSELING AND PLANNING",
+ '7219' => "LAUNDRY AND GARMENT SERVICES, NEC",
+ '7210' => "LAUNDRY, CLEANING, & GARMENT SERVICES",
+ '3524' => "LAWN AND GARDEN EQUIPMENT",
+ '0782' => "LAWN AND GARDEN SERVICES",
+ '1030' => "LEAD AND ZINC ORES",
+ '1031' => "LEAD AND ZINC ORES",
+ '3952' => "LEAD PENCILS AND ART GOODS",
+ '3100' => "LEATHER AND LEATHER PRODUCTS",
+ '2386' => "LEATHER AND SHEEP-LINED CLOTHING",
+ '3150' => "LEATHER GLOVES AND MITTENS",
+ '3151' => "LEATHER GLOVES AND MITTENS",
+ '3190' => "LEATHER GOODS, NEC",
+ '3199' => "LEATHER GOODS, NEC",
+ '3110' => "LEATHER TANNING AND FINISHING",
+ '3111' => "LEATHER TANNING AND FINISHING",
+ '8100' => "LEGAL SERVICES",
+ '8110' => "LEGAL SERVICES",
+ '8111' => "LEGAL SERVICES",
+ '8230' => "LIBRARIES",
+ '8231' => "LIBRARIES",
+ '6310' => "LIFE INSURANCE",
+ '6311' => "LIFE INSURANCE",
+ '3648' => "LIGHTING EQUIPMENT, NEC",
+ '3274' => "LIME",
+ '7213' => "LINEN SUPPLY",
+ '5984' => "LIQUEFIED PETROLEUM GAS DEALERS",
+ '5920' => "LIQUOR STORES",
+ '5921' => "LIQUOR STORES",
+ '5154' => "LIVESTOCK",
+ '0751' => "LIVESTOCK SERVICES, EXC. VETERINARY",
+ '0210' => "LIVESTOCK, EXCEPT DAIRY AND POULTRY",
+ '6163' => "LOAN BROKERS",
+ '4100' => "LOCAL AND INTERURBAN PASSENGER TRANSIT",
+ '4111' => "LOCAL AND SUBURBAN TRANSIT",
+ '4110' => "LOCAL AND SUBURBAN TRANSPORTATION",
+ '4141' => "LOCAL BUS CHARTER SERVICE",
+ '4119' => "LOCAL PASSENGER TRANSPORTATION, NEC",
+ '4214' => "LOCAL TRUCKING WITH STORAGE",
+ '4212' => "LOCAL TRUCKING, WITHOUT STORAGE",
+ '2410' => "LOGGING",
+ '2411' => "LOGGING",
+ '2992' => "LUBRICATING OILS AND GREASES",
+ '3160' => "LUGGAGE",
+ '3161' => "LUGGAGE",
+ '5948' => "LUGGAGE AND LEATHER GOODS STORES",
+ '5030' => "LUMBER AND CONSTRUCTION MATERIALS",
+ '5210' => "LUMBER AND OTHER BUILDING MATERIALS",
+ '5211' => "LUMBER AND OTHER BUILDING MATERIALS",
+ '2400' => "LUMBER AND WOOD PRODUCTS",
+ '5031' => "LUMBER, PLYWOOD, AND MILLWORK",
+ '2098' => "MACARONI AND SPAGHETTI",
+ '3545' => "MACHINE TOOL ACCESSORIES",
+ '3541' => "MACHINE TOOLS, METAL CUTTING TYPES",
+ '3542' => "MACHINE TOOLS, METAL FORMING TYPES",
+ '5080' => "MACHINERY, EQUIPMENT, AND SUPPLIES",
+ '3695' => "MAGNETIC AND OPTICAL RECORDING MEDIA",
+ '7330' => "MAILING, REPRODUCTION, STENOGRAPHIC",
+ '3322' => "MALLEABLE IRON FOUNDRIES",
+ '2083' => "MALT",
+ '2082' => "MALT BEVERAGES",
+ '8740' => "MANAGEMENT AND PUBLIC RELATIONS",
+ '8742' => "MANAGEMENT CONSULTING SERVICES",
+ '6722' => "MANAGEMENT INVESTMENT, OPEN-END",
+ '8741' => "MANAGEMENT SERVICES",
+ '2760' => "MANIFOLD BUSINESS FORMS",
+ '2761' => "MANIFOLD BUSINESS FORMS",
+ '2097' => "MANUFACTURED ICE",
+ '3999' => "MANUFACTURING INDUSTRIES, NEC",
+ '4493' => "MARINAS",
+ '4491' => "MARINE CARGO HANDLING",
+ '3953' => "MARKING DEVICES",
+ '1741' => "MASONRY AND OTHER STONEWORK",
+ '1740' => "MASONRY, STONEWORK, AND PLASTERING",
+ '2515' => "MATTRESSES AND BEDSPRINGS",
+ '3829' => "MEASURING & CONTROLLING DEVICES, NEC",
+ '3820' => "MEASURING AND CONTROLLING DEVICES",
+ '3586' => "MEASURING AND DISPENSING PUMPS",
+ '5420' => "MEAT AND FISH MARKETS",
+ '5421' => "MEAT AND FISH MARKETS",
+ '2011' => "MEAT PACKING PLANTS",
+ '2010' => "MEAT PRODUCTS",
+ '5147' => "MEATS AND MEAT PRODUCTS",
+ '3061' => "MECHANICAL RUBBER GOODS",
+ '8070' => "MEDICAL AND DENTAL LABORATORIES",
+ '5047' => "MEDICAL AND HOSPITAL EQUIPMENT",
+ '7352' => "MEDICAL EQUIPMENT RENTAL",
+ '3840' => "MEDICAL INSTRUMENTS AND SUPPLIES",
+ '8071' => "MEDICAL LABORATORIES",
+ '6320' => "MEDICAL SERVICE AND HEALTH INSURANCE",
+ '2833' => "MEDICINALS AND BOTANICALS",
+ '8600' => "MEMBERSHIP ORGANIZATIONS",
+ '8690' => "MEMBERSHIP ORGANIZATIONS, NEC",
+ '8699' => "MEMBERSHIP ORGANIZATIONS, NEC",
+ '7997' => "MEMBERSHIP SPORTS & RECREATION CLUBS",
+ '7040' => "MEMBERSHIP-BASIS ORGANIZATION HOTELS",
+ '7041' => "MEMBERSHIP-BASIS ORGANIZATION HOTELS",
+ '5610' => "MEN'S & BOYS' CLOTHING STORES",
+ '5611' => "MEN'S & BOYS' CLOTHING STORES",
+ '2322' => "MEN'S & BOYS' UNDERWEAR + NIGHTWEAR",
+ '5136' => "MEN'S AND BOYS' CLOTHING",
+ '2329' => "MEN'S AND BOYS' CLOTHING, NEC",
+ '2320' => "MEN'S AND BOYS' FURNISHINGS",
+ '2323' => "MEN'S AND BOYS' NECKWEAR",
+ '2321' => "MEN'S AND BOYS' SHIRTS",
+ '2310' => "MEN'S AND BOYS' SUITS AND COATS",
+ '2311' => "MEN'S AND BOYS' SUITS AND COATS",
+ '2325' => "MEN'S AND BOYS' TROUSERS AND SLACKS",
+ '2326' => "MEN'S AND BOYS' WORK CLOTHING",
+ '3143' => "MEN'S FOOTWEAR, EXCEPT ATHLETIC",
+ '5962' => "MERCHANDISING MACHINE OPERATORS",
+ '3412' => "METAL BARRELS, DRUMS, AND PAILS",
+ '3411' => "METAL CANS",
+ '3410' => "METAL CANS AND SHIPPING CONTAINERS",
+ '3479' => "METAL COATING AND ALLIED SERVICES",
+ '3442' => "METAL DOORS, SASH, AND TRIM",
+ '3497' => "METAL FOIL AND LEAF",
+ '3460' => "METAL FORGINGS AND STAMPINGS",
+ '3398' => "METAL HEAT TREATING",
+ '2514' => "METAL HOUSEHOLD FURNITURE",
+ '1000' => "METAL MINING",
+ '1080' => "METAL MINING SERVICES",
+ '1081' => "METAL MINING SERVICES",
+ '1099' => "METAL ORES, NEC",
+ '3431' => "METAL SANITARY WARE",
+ '3470' => "METAL SERVICES, NEC",
+ '3469' => "METAL STAMPINGS, NEC",
+ '5050' => "METALS AND MINERALS, EXCEPT PETROLEUM",
+ '5051' => "METALS SERVICE CENTERS AND OFFICES",
+ '3540' => "METALWORKING MACHINERY",
+ '3549' => "METALWORKING MACHINERY, NEC",
+ '2431' => "MILLWORK",
+ '2430' => "MILLWORK, PLYWOOD & STRUCTURAL",
+ '3296' => "MINERAL WOOL",
+ '3295' => "MINERALS, GROUND OR TREATED",
+ '3532' => "MINING MACHINERY",
+ '7990' => "MISC. AMUSEMENT, RECREATION SERVICES",
+ '5690' => "MISC. APPAREL & ACCESSORY STORES",
+ '5699' => "MISC. APPAREL & ACCESSORY STORES",
+ '6159' => "MISC. BUSINESS CREDIT INSTITUTIONS",
+ '2670' => "MISC. CONVERTED PAPER PRODUCTS",
+ '3690' => "MISC. ELECTRICAL EQUIPMENT & SUPPLIES",
+ '7350' => "MISC. EQUIPMENT RENTAL & LEASING",
+ '3490' => "MISC. FABRICATED METAL PRODUCTS",
+ '2390' => "MISC. FABRICATED TEXTILE PRODUCTS",
+ '3496' => "MISC. FABRICATED WIRE PRODUCTS",
+ '2090' => "MISC. FOOD AND KINDRED PRODUCTS",
+ '5390' => "MISC. GENERAL MERCHANDISE STORES",
+ '5399' => "MISC. GENERAL MERCHANDISE STORES",
+ '5719' => "MISC. HOMEFURNISHINGS STORES",
+ '5190' => "MISC. NONDURABLE GOODS",
+ '3290' => "MISC. NONMETALLIC MINERAL PRODUCTS",
+ '2990' => "MISC. PETROLEUM AND COAL PRODUCTS",
+ '1790' => "MISC. SPECIAL TRADE CONTRACTORS",
+ '2380' => "MISCELLANEOUS APPAREL AND ACCESSORIES",
+ '7380' => "MISCELLANEOUS BUSINESS SERVICES",
+ '2890' => "MISCELLANEOUS CHEMICAL PRODUCTS",
+ '5090' => "MISCELLANEOUS DURABLE GOODS",
+ '5490' => "MISCELLANEOUS FOOD STORES",
+ '5499' => "MISCELLANEOUS FOOD STORES",
+ '2590' => "MISCELLANEOUS FURNITURE AND FIXTURES",
+ '6790' => "MISCELLANEOUS INVESTING",
+ '3990' => "MISCELLANEOUS MANUFACTURES",
+ '3900' => "MISCELLANEOUS MANUFACTURING INDUSTRIES",
+ '0919' => "MISCELLANEOUS MARINE PRODUCTS",
+ '1090' => "MISCELLANEOUS METAL ORES",
+ '3449' => "MISCELLANEOUS METAL WORK",
+ '1490' => "MISCELLANEOUS NONMETALLIC MINERALS",
+ '1499' => "MISCELLANEOUS NONMETALLIC MINERALS",
+ '7290' => "MISCELLANEOUS PERSONAL SERVICES",
+ '7299' => "MISCELLANEOUS PERSONAL SERVICES, NEC",
+ '3080' => "MISCELLANEOUS PLASTICS PRODUCTS, NEC",
+ '3390' => "MISCELLANEOUS PRIMARY METAL PRODUCTS",
+ '2740' => "MISCELLANEOUS PUBLISHING",
+ '2741' => "MISCELLANEOUS PUBLISHING",
+ '7600' => "MISCELLANEOUS REPAIR SERVICES",
+ '7690' => "MISCELLANEOUS REPAIR SHOPS",
+ '5900' => "MISCELLANEOUS RETAIL",
+ '5999' => "MISCELLANEOUS RETAIL STORES, NEC",
+ '5940' => "MISCELLANEOUS SHOPPING GOODS STORES",
+ '2290' => "MISCELLANEOUS TEXTILE GOODS",
+ '3790' => "MISCELLANEOUS TRANSPORTATION EQUIPMENT",
+ '4780' => "MISCELLANEOUS TRANSPORTATION SERVICES",
+ '2490' => "MISCELLANEOUS WOOD PRODUCTS",
+ '5270' => "MOBILE HOME DEALERS",
+ '5271' => "MOBILE HOME DEALERS",
+ '6515' => "MOBILE HOME SITE OPERATORS",
+ '2451' => "MOBILE HOMES",
+ '6160' => "MORTGAGE BANKERS AND BROKERS",
+ '6162' => "MORTGAGE BANKERS AND CORRESPONDENTS",
+ '7812' => "MOTION PICTURE & VIDEO PRODUCTION",
+ '7822' => "MOTION PICTURE AND TAPE DISTRIBUTION",
+ '7820' => "MOTION PICTURE DISTRIBUTION & SERVICES",
+ '7829' => "MOTION PICTURE DISTRIBUTION SERVICES",
+ '7810' => "MOTION PICTURE PRODUCTION & SERVICES",
+ '7830' => "MOTION PICTURE THEATERS",
+ '7832' => "MOTION PICTURE THEATERS, EX DRIVE-IN",
+ '7800' => "MOTION PICTURES",
+ '3716' => "MOTOR HOMES",
+ '3714' => "MOTOR VEHICLE PARTS AND ACCESSORIES",
+ '5015' => "MOTOR VEHICLE PARTS, USED",
+ '5013' => "MOTOR VEHICLE SUPPLIES AND NEW PARTS",
+ '3711' => "MOTOR VEHICLES AND CAR BODIES",
+ '3710' => "MOTOR VEHICLES AND EQUIPMENT",
+ '5010' => "MOTOR VEHICLES, PARTS, AND SUPPLIES",
+ '5570' => "MOTORCYCLE DEALERS",
+ '5571' => "MOTORCYCLE DEALERS",
+ '3750' => "MOTORCYCLES, BICYCLES, AND PARTS",
+ '3751' => "MOTORCYCLES, BICYCLES, AND PARTS",
+ '3621' => "MOTORS AND GENERATORS",
+ '8410' => "MUSEUMS AND ART GALLERIES",
+ '8412' => "MUSEUMS AND ART GALLERIES",
+ '8400' => "MUSEUMS, BOTANICAL, ZOOLOGICAL GARDENS",
+ '5736' => "MUSICAL INSTRUMENT STORES",
+ '3930' => "MUSICAL INSTRUMENTS",
+ '3931' => "MUSICAL INSTRUMENTS",
+ '2441' => "NAILED WOOD BOXES AND SHOOK",
+ '2240' => "NARROW FABRIC MILLS",
+ '2241' => "NARROW FABRIC MILLS",
+ '6021' => "NATIONAL COMMERCIAL BANKS",
+ '4924' => "NATURAL GAS DISTRIBUTION",
+ '1320' => "NATURAL GAS LIQUIDS",
+ '1321' => "NATURAL GAS LIQUIDS",
+ '4922' => "NATURAL GAS TRANSMISSION",
+ '5510' => "NEW AND USED CAR DEALERS",
+ '5511' => "NEW AND USED CAR DEALERS",
+ '5994' => "NEWS DEALERS AND NEWSSTANDS",
+ '7383' => "NEWS SYNDICATES",
+ '2710' => "NEWSPAPERS",
+ '2711' => "NEWSPAPERS",
+ '2873' => "NITROGENOUS FERTILIZERS",
+ '3297' => "NONCLAY REFRACTORIES",
+ '8733' => "NONCOMMERCIAL RESEARCH ORGANIZATIONS",
+ '3644' => "NONCURRENT-CARRYING WIRING DEVICES",
+ '6091' => "NONDEPOSIT TRUST FACILITIES",
+ '6100' => "NONDEPOSITORY INSTITUTIONS",
+ '5199' => "NONDURABLE GOODS, NEC",
+ '3364' => "NONFERROUS DIE-CASTING EXC. ALUMINUM",
+ '3463' => "NONFERROUS FORGINGS",
+ '3360' => "NONFERROUS FOUNDRIES (CASTINGS)",
+ '3369' => "NONFERROUS FOUNDRIES, NEC",
+ '3350' => "NONFERROUS ROLLING AND DRAWING",
+ '3356' => "NONFERROUS ROLLING AND DRAWING, NEC",
+ '3357' => "NONFERROUS WIREDRAWING & INSULATING",
+ '3299' => "NONMETALLIC MINERAL PRODUCTS, NEC",
+ '1480' => "NONMETALLIC MINERALS SERVICES",
+ '1481' => "NONMETALLIC MINERALS SERVICES",
+ '1400' => "NONMETALLIC MINERALS, EXCEPT FUELS",
+ '1540' => "NONRESIDENTIAL BUILDING CONSTRUCTION",
+ '6512' => "NONRESIDENTIAL BUILDING OPERATORS",
+ '1542' => "NONRESIDENTIAL CONSTRUCTION, NEC",
+ '5960' => "NONSTORE RETAILERS",
+ '2297' => "NONWOVEN FABRICS",
+ '8050' => "NURSING AND PERSONAL CARE FACILITIES",
+ '8059' => "NURSING AND PERSONAL CARE, NEC",
+ '5044' => "OFFICE EQUIPMENT",
+ '2520' => "OFFICE FURNITURE",
+ '2522' => "OFFICE FURNITURE, EXCEPT WOOD",
+ '3579' => "OFFICE MACHINES, NEC",
+ '8010' => "OFFICES & CLINICS OF MEDICAL DOCTORS",
+ '8011' => "OFFICES & CLINICS OF MEDICAL DOCTORS",
+ '8041' => "OFFICES AND CLINICS OF CHIROPRACTORS",
+ '8020' => "OFFICES AND CLINICS OF DENTISTS",
+ '8021' => "OFFICES AND CLINICS OF DENTISTS",
+ '8042' => "OFFICES AND CLINICS OF OPTOMETRISTS",
+ '8043' => "OFFICES AND CLINICS OF PODIATRISTS",
+ '8049' => "OFFICES OF HEALTH PRACTITIONERS, NEC",
+ '8030' => "OFFICES OF OSTEOPATHIC PHYSICIANS",
+ '8031' => "OFFICES OF OSTEOPATHIC PHYSICIANS",
+ '8040' => "OFFICES OF OTHER HEALTH PRACTITIONERS",
+ '1382' => "OIL AND GAS EXPLORATION SERVICES",
+ '1300' => "OIL AND GAS EXTRACTION",
+ '3533' => "OIL AND GAS FIELD MACHINERY",
+ '1380' => "OIL AND GAS FIELD SERVICES",
+ '1389' => "OIL AND GAS FIELD SERVICES, NEC",
+ '6792' => "OIL ROYALTY TRADERS",
+ '1530' => "OPERATIVE BUILDERS",
+ '1531' => "OPERATIVE BUILDERS",
+ '3850' => "OPHTHALMIC GOODS",
+ '3851' => "OPHTHALMIC GOODS",
+ '5048' => "OPHTHALMIC GOODS",
+ '5995' => "OPTICAL GOODS STORES",
+ '3827' => "OPTICAL INSTRUMENTS AND LENSES",
+ '3480' => "ORDNANCE AND ACCESSORIES, NEC",
+ '3489' => "ORDNANCE AND ACCESSORIES, NEC",
+ '2824' => "ORGANIC FIBERS, NONCELLULOSIC",
+ '0181' => "ORNAMENTAL NURSERY PRODUCTS",
+ '0783' => "ORNAMENTAL SHRUB AND TREE SERVICES",
+ '7312' => "OUTDOOR ADVERTISING SERVICES",
+ '5142' => "PACKAGED FROZEN FOODS",
+ '3565' => "PACKAGING MACHINERY",
+ '4783' => "PACKING AND CRATING",
+ '5230' => "PAINT, GLASS, AND WALLPAPER STORES",
+ '5231' => "PAINT, GLASS, AND WALLPAPER STORES",
+ '1720' => "PAINTING AND PAPER HANGING",
+ '1721' => "PAINTING AND PAPER HANGING",
+ '2850' => "PAINTS AND ALLIED PRODUCTS",
+ '2851' => "PAINTS AND ALLIED PRODUCTS",
+ '5198' => "PAINTS, VARNISHES, AND SUPPLIES",
+ '2600' => "PAPER AND ALLIED PRODUCTS",
+ '5110' => "PAPER AND PAPER PRODUCTS",
+ '2671' => "PAPER COATED & LAMINATED, PACKAGING",
+ '2672' => "PAPER COATED AND LAMINATED, NEC",
+ '3554' => "PAPER INDUSTRIES MACHINERY",
+ '2620' => "PAPER MILLS",
+ '2621' => "PAPER MILLS",
+ '2650' => "PAPERBOARD CONTAINERS AND BOXES",
+ '2630' => "PAPERBOARD MILLS",
+ '2631' => "PAPERBOARD MILLS",
+ '2540' => "PARTITIONS AND FIXTURES",
+ '2542' => "PARTITIONS AND FIXTURES, EXCEPT WOOD",
+ '7515' => "PASSENGER CAR LEASING",
+ '7514' => "PASSENGER CAR RENTAL",
+ '4729' => "PASSENGER TRANSPORT ARRANGEMENT, NEC",
+ '4720' => "PASSENGER TRANSPORTATION ARRANGEMENT",
+ '6794' => "PATENT OWNERS AND LESSORS",
+ '3951' => "PENS AND MECHANICAL PENCILS",
+ '3950' => "PENS, PENCILS, OFFICE, & ART SUPPLIES",
+ '6370' => "PENSION, HEALTH, AND WELFARE FUNDS",
+ '6371' => "PENSION, HEALTH, AND WELFARE FUNDS",
+ '2720' => "PERIODICALS",
+ '2721' => "PERIODICALS",
+ '6140' => "PERSONAL CREDIT INSTITUTIONS",
+ '6141' => "PERSONAL CREDIT INSTITUTIONS",
+ '3172' => "PERSONAL LEATHER GOODS, NEC",
+ '7200' => "PERSONAL SERVICES",
+ '7360' => "PERSONNEL SUPPLY SERVICES",
+ '2900' => "PETROLEUM AND COAL PRODUCTS",
+ '2999' => "PETROLEUM AND COAL PRODUCTS, NEC",
+ '5170' => "PETROLEUM AND PETROLEUM PRODUCTS",
+ '5171' => "PETROLEUM BULK STATIONS & TERMINALS",
+ '5172' => "PETROLEUM PRODUCTS, NEC",
+ '2910' => "PETROLEUM REFINING",
+ '2911' => "PETROLEUM REFINING",
+ '2834' => "PHARMACEUTICAL PREPARATIONS",
+ '1475' => "PHOSPHATE ROCK",
+ '2874' => "PHOSPHATIC FERTILIZERS",
+ '7334' => "PHOTOCOPYING & DUPLICATING SERVICES",
+ '7384' => "PHOTOFINISHING LABORATORIES",
+ '3860' => "PHOTOGRAPHIC EQUIPMENT AND SUPPLIES",
+ '3861' => "PHOTOGRAPHIC EQUIPMENT AND SUPPLIES",
+ '5043' => "PHOTOGRAPHIC EQUIPMENT AND SUPPLIES",
+ '7220' => "PHOTOGRAPHIC STUDIOS, PORTRAIT",
+ '7221' => "PHOTOGRAPHIC STUDIOS, PORTRAIT",
+ '7991' => "PHYSICAL FITNESS FACILITIES",
+ '2035' => "PICKLES, SAUCES, AND SALAD DRESSINGS",
+ '5131' => "PIECE GOODS & NOTIONS",
+ '4600' => "PIPELINES, EXCEPT NATURAL GAS",
+ '4610' => "PIPELINES, EXCEPT NATURAL GAS",
+ '4619' => "PIPELINES, NEC",
+ '1742' => "PLASTERING, DRYWALL, AND INSULATION",
+ '3085' => "PLASTICS BOTTLES",
+ '3086' => "PLASTICS FOAM PRODUCTS",
+ '5162' => "PLASTICS MATERIALS & BASIC SHAPES",
+ '2821' => "PLASTICS MATERIALS AND RESINS",
+ '2820' => "PLASTICS MATERIALS AND SYNTHETICS",
+ '3084' => "PLASTICS PIPE",
+ '3088' => "PLASTICS PLUMBING FIXTURES",
+ '3089' => "PLASTICS PRODUCTS, NEC",
+ '2796' => "PLATEMAKING SERVICES",
+ '3471' => "PLATING AND POLISHING",
+ '2395' => "PLEATING AND STITCHING",
+ '5074' => "PLUMBING & HYDRONIC HEATING SUPPLIES",
+ '3430' => "PLUMBING AND HEATING, EXCEPT ELECTRIC",
+ '3432' => "PLUMBING FIXTURE FITTINGS AND TRIM",
+ '1710' => "PLUMBING, HEATING, AIR-CONDITIONING",
+ '1711' => "PLUMBING, HEATING, AIR-CONDITIONING",
+ '2842' => "POLISHES AND SANITATION GOODS",
+ '8650' => "POLITICAL ORGANIZATIONS",
+ '8651' => "POLITICAL ORGANIZATIONS",
+ '3264' => "PORCELAIN ELECTRICAL SUPPLIES",
+ '1474' => "POTASH, SODA, AND BORATE MINERALS",
+ '2096' => "POTATO CHIPS AND SIMILAR SNACKS",
+ '3260' => "POTTERY AND RELATED PRODUCTS",
+ '3269' => "POTTERY PRODUCTS, NEC",
+ '0250' => "POULTRY AND EGGS",
+ '0259' => "POULTRY AND EGGS, NEC",
+ '5144' => "POULTRY AND POULTRY PRODUCTS",
+ '0254' => "POULTRY HATCHERIES",
+ '2015' => "POULTRY SLAUGHTERING AND PROCESSING",
+ '7211' => "POWER LAUNDRIES, FAMILY & COMMERCIAL",
+ '3568' => "POWER TRANSMISSION EQUIPMENT, NEC",
+ '3546' => "POWER-DRIVEN HANDTOOLS",
+ '3448' => "PREFABRICATED METAL BUILDINGS",
+ '2452' => "PREFABRICATED WOOD BUILDINGS",
+ '7372' => "PREPACKAGED SOFTWARE",
+ '2048' => "PREPARED FEEDS, NEC",
+ '2045' => "PREPARED FLOUR MIXES AND DOUGHS",
+ '3652' => "PRERECORDED RECORDS AND TAPES",
+ '2030' => "PRESERVED FRUITS AND VEGETABLES",
+ '3229' => "PRESSED AND BLOWN GLASS, NEC",
+ '3334' => "PRIMARY ALUMINUM",
+ '3692' => "PRIMARY BATTERIES, DRY AND WET",
+ '3331' => "PRIMARY COPPER",
+ '3300' => "PRIMARY METAL INDUSTRIES",
+ '3399' => "PRIMARY METAL PRODUCTS, NEC",
+ '3330' => "PRIMARY NONFERROUS METALS",
+ '3339' => "PRIMARY NONFERROUS METALS, NEC",
+ '3672' => "PRINTED CIRCUIT BOARDS",
+ '2700' => "PRINTING AND PUBLISHING",
+ '5111' => "PRINTING AND WRITING PAPER",
+ '2893' => "PRINTING INK",
+ '2790' => "PRINTING TRADE SERVICES",
+ '3555' => "PRINTING TRADES MACHINERY",
+ '8800' => "PRIVATE HOUSEHOLDS",
+ '8810' => "PRIVATE HOUSEHOLDS",
+ '8811' => "PRIVATE HOUSEHOLDS",
+ '3823' => "PROCESS CONTROL INSTRUMENTS",
+ '7920' => "PRODUCERS, ORCHESTRAS, ENTERTAINERS",
+ '3230' => "PRODUCTS OF PURCHASED GLASS",
+ '3231' => "PRODUCTS OF PURCHASED GLASS",
+ '5040' => "PROFESSIONAL & COMMERCIAL EQUIPMENT",
+ '5049' => "PROFESSIONAL EQUIPMENT, NEC",
+ '8620' => "PROFESSIONAL ORGANIZATIONS",
+ '8621' => "PROFESSIONAL ORGANIZATIONS",
+ '8063' => "PSYCHIATRIC HOSPITALS",
+ '2530' => "PUBLIC BUILDING & RELATED FURNITURE",
+ '2531' => "PUBLIC BUILDING & RELATED FURNITURE",
+ '7992' => "PUBLIC GOLF COURSES",
+ '8743' => "PUBLIC RELATIONS SERVICES",
+ '4220' => "PUBLIC WAREHOUSING AND STORAGE",
+ '2610' => "PULP MILLS",
+ '2611' => "PULP MILLS",
+ '3561' => "PUMPS AND PUMPING EQUIPMENT",
+ '7948' => "RACING, INCLUDING TRACK OPERATION",
+ '3663' => "RADIO & TV COMMUNICATIONS EQUIPMENT",
+ '4830' => "RADIO AND TELEVISION BROADCASTING",
+ '7622' => "RADIO AND TELEVISION REPAIR",
+ '4832' => "RADIO BROADCASTING STATIONS",
+ '5730' => "RADIO, TELEVISION, & COMPUTER STORES",
+ '5731' => "RADIO, TV, & ELECTRONIC STORES",
+ '7313' => "RADIO, TV, PUBLISHER REPRESENTATIVES",
+ '4812' => "RADIOTELEPHONE COMMUNICATIONS",
+ '3740' => "RAILROAD EQUIPMENT",
+ '3743' => "RAILROAD EQUIPMENT",
+ '6517' => "RAILROAD PROPERTY LESSORS",
+ '4000' => "RAILROAD TRANSPORTATION",
+ '4010' => "RAILROADS",
+ '4011' => "RAILROADS, LINE-HAUL OPERATING",
+ '2061' => "RAW CANE SUGAR",
+ '3273' => "READY-MIXED CONCRETE",
+ '6500' => "REAL ESTATE",
+ '6530' => "REAL ESTATE AGENTS AND MANAGERS",
+ '6531' => "REAL ESTATE AGENTS AND MANAGERS",
+ '6798' => "REAL ESTATE INVESTMENT TRUSTS",
+ '6510' => "REAL ESTATE OPERATORS AND LESSORS",
+ '6519' => "REAL PROPERTY LESSORS, NEC",
+ '2493' => "RECONSTITUTED WOOD PRODUCTS",
+ '5735' => "RECORD & PRERECORDED TAPE STORES",
+ '5560' => "RECREATIONAL VEHICLE DEALERS",
+ '5561' => "RECREATIONAL VEHICLE DEALERS",
+ '4613' => "REFINED PETROLEUM PIPELINES",
+ '4222' => "REFRIGERATED WAREHOUSING AND STORAGE",
+ '3585' => "REFRIGERATION AND HEATING EQUIPMENT",
+ '3580' => "REFRIGERATION AND SERVICE MACHINERY",
+ '5078' => "REFRIGERATION EQUIPMENT AND SUPPLIES",
+ '7623' => "REFRIGERATION SERVICE AND REPAIR",
+ '4953' => "REFUSE SYSTEMS",
+ '3625' => "RELAYS AND INDUSTRIAL CONTROLS",
+ '8660' => "RELIGIOUS ORGANIZATIONS",
+ '8661' => "RELIGIOUS ORGANIZATIONS",
+ '4740' => "RENTAL OF RAILROAD CARS",
+ '4741' => "RENTAL OF RAILROAD CARS",
+ '7699' => "REPAIR SERVICES, NEC",
+ '8730' => "RESEARCH AND TESTING SERVICES",
+ '1520' => "RESIDENTIAL BUILDING CONSTRUCTION",
+ '8360' => "RESIDENTIAL CARE",
+ '8361' => "RESIDENTIAL CARE",
+ '1522' => "RESIDENTIAL CONSTRUCTION, NEC",
+ '3645' => "RESIDENTIAL LIGHTING FIXTURES",
+ '5460' => "RETAIL BAKERIES",
+ '5461' => "RETAIL BAKERIES",
+ '5260' => "RETAIL NURSERIES AND GARDEN STORES",
+ '5261' => "RETAIL NURSERIES AND GARDEN STORES",
+ '5990' => "RETAIL STORES, NEC",
+ '7640' => "REUPHOLSTERY AND FURNITURE REPAIR",
+ '7641' => "REUPHOLSTERY AND FURNITURE REPAIR",
+ '0112' => "RICE",
+ '2044' => "RICE MILLING",
+ '2095' => "ROASTED COFFEE",
+ '2384' => "ROBES AND DRESSING GOWNS",
+ '3547' => "ROLLING MILL MACHINERY",
+ '5033' => "ROOFING, SIDING, & INSULATION",
+ '1760' => "ROOFING, SIDING, AND SHEET METAL WORK",
+ '1761' => "ROOFING, SIDING, AND SHEET METAL WORK",
+ '7020' => "ROOMING AND BOARDING HOUSES",
+ '7021' => "ROOMING AND BOARDING HOUSES",
+ '3052' => "RUBBER & PLASTICS HOSE & BELTING",
+ '3000' => "RUBBER AND MISC. PLASTICS PRODUCTS",
+ '3020' => "RUBBER AND PLASTICS FOOTWEAR",
+ '3021' => "RUBBER AND PLASTICS FOOTWEAR",
+ '2068' => "SALTED AND ROASTED NUTS AND SEEDS",
+ '1440' => "SAND AND GRAVEL",
+ '2656' => "SANITARY FOOD CONTAINERS",
+ '2676' => "SANITARY PAPER PRODUCTS",
+ '4950' => "SANITARY SERVICES",
+ '4959' => "SANITARY SERVICES, NEC",
+ '2013' => "SAUSAGES AND OTHER PREPARED MEATS",
+ '6030' => "SAVINGS INSTITUTIONS",
+ '6036' => "SAVINGS INSTITUTIONS, EXCEPT FEDERAL",
+ '3425' => "SAW BLADES AND HANDSAWS",
+ '2420' => "SAWMILLS AND PLANING MILLS",
+ '2421' => "SAWMILLS AND PLANING MILLS, GENERAL",
+ '3596' => "SCALES AND BALANCES, EXC. LABORATORY",
+ '2397' => "SCHIFFLI MACHINE EMBROIDERIES",
+ '4150' => "SCHOOL BUSES",
+ '4151' => "SCHOOL BUSES",
+ '8290' => "SCHOOLS & EDUCATIONAL SERVICES, NEC",
+ '8299' => "SCHOOLS & EDUCATIONAL SERVICES, NEC",
+ '5093' => "SCRAP AND WASTE MATERIALS",
+ '3451' => "SCREW MACHINE PRODUCTS",
+ '3450' => "SCREW MACHINE PRODUCTS, BOLTS, ETC.",
+ '3810' => "SEARCH AND NAVIGATION EQUIPMENT",
+ '3812' => "SEARCH AND NAVIGATION EQUIPMENT",
+ '3340' => "SECONDARY NONFERROUS METALS",
+ '3341' => "SECONDARY NONFERROUS METALS",
+ '7338' => "SECRETARIAL & COURT REPORTING",
+ '6289' => "SECURITY & COMMODITY SERVICES, NEC",
+ '6200' => "SECURITY AND COMMODITY BROKERS",
+ '6230' => "SECURITY AND COMMODITY EXCHANGES",
+ '6231' => "SECURITY AND COMMODITY EXCHANGES",
+ '6280' => "SECURITY AND COMMODITY SERVICES",
+ '6210' => "SECURITY BROKERS AND DEALERS",
+ '6211' => "SECURITY BROKERS AND DEALERS",
+ '7382' => "SECURITY SYSTEMS SERVICES",
+ '3674' => "SEMICONDUCTORS AND RELATED DEVICES",
+ '3263' => "SEMIVITREOUS TABLE & KITCHENWARE",
+ '5087' => "SERVICE ESTABLISHMENT EQUIPMENT",
+ '3589' => "SERVICE INDUSTRY MACHINERY, NEC",
+ '7819' => "SERVICES ALLIED TO MOTION PICTURES",
+ '7340' => "SERVICES TO BUILDINGS",
+ '8999' => "SERVICES, NEC",
+ '8990' => "SERVICES, NEC",
+ '8999' => "SERVICES, NEC",
+ '2652' => "SETUP PAPERBOARD BOXES",
+ '4952' => "SEWERAGE SYSTEMS",
+ '5949' => "SEWING, NEEDLEWORK, AND PIECE GOODS",
+ '0214' => "SHEEP AND GOATS",
+ '3444' => "SHEET METALWORK",
+ '0913' => "SHELLFISH",
+ '3730' => "SHIP AND BOAT BUILDING AND REPAIRING",
+ '3731' => "SHIP BUILDING AND REPAIRING",
+ '7250' => "SHOE REPAIR AND SHOESHINE PARLORS",
+ '7251' => "SHOE REPAIR AND SHOESHINE PARLORS",
+ '5660' => "SHOE STORES",
+ '5661' => "SHOE STORES",
+ '6153' => "SHORT-TERM BUSINESS CREDIT",
+ '3993' => "SIGNS AND ADVERTISING SPECIALITIES",
+ '1044' => "SILVER ORES",
+ '3914' => "SILVERWARE AND PLATED WARE",
+ '1521' => "SINGLE-FAMILY HOUSING CONSTRUCTION",
+ '8051' => "SKILLED NURSING CARE FACILITIES",
+ '3484' => "SMALL ARMS",
+ '3482' => "SMALL ARMS AMMUNITION",
+ '2841' => "SOAP AND OTHER DETERGENTS",
+ '2840' => "SOAP, CLEANERS, AND TOILET GOODS",
+ '8300' => "SOCIAL SERVICES",
+ '8390' => "SOCIAL SERVICES, NEC",
+ '8399' => "SOCIAL SERVICES, NEC",
+ '2436' => "SOFTWOOD VENEER AND PLYWOOD",
+ '0710' => "SOIL PREPARATION SERVICES",
+ '0711' => "SOIL PREPARATION SERVICES",
+ '2075' => "SOYBEAN OIL MILLS",
+ '0116' => "SOYBEANS",
+ '3764' => "SPACE PROPULSION UNITS AND PARTS",
+ '3769' => "SPACE VEHICLE EQUIPMENT, NEC",
+ '3544' => "SPECIAL DIES, TOOLS, JIGS & FIXTURES",
+ '3550' => "SPECIAL INDUSTRY MACHINERY",
+ '3559' => "SPECIAL INDUSTRY MACHINERY, NEC",
+ '2429' => "SPECIAL PRODUCT SAWMILLS, NEC",
+ '1700' => "SPECIAL TRADE CONTRACTORS",
+ '1799' => "SPECIAL TRADE CONTRACTORS, NEC",
+ '4226' => "SPECIAL WAREHOUSING AND STORAGE, NEC",
+ '8069' => "SPECIALTY HOSPITALS EXC. PSYCHIATRIC",
+ '8093' => "SPECIALTY OUTPATIENT CLINICS, NEC",
+ '3566' => "SPEED CHANGERS, DRIVES, AND GEARS",
+ '5091' => "SPORTING & RECREATIONAL GOODS",
+ '3949' => "SPORTING AND ATHLETIC GOODS, NEC",
+ '7032' => "SPORTING AND RECREATIONAL CAMPS",
+ '5941' => "SPORTING GOODS AND BICYCLE SHOPS",
+ '7941' => "SPORTS CLUBS, MANAGERS, & PROMOTERS",
+ '6022' => "STATE COMMERCIAL BANKS",
+ '6062' => "STATE CREDIT UNIONS",
+ '5112' => "STATIONERY AND OFFICE SUPPLIES",
+ '2678' => "STATIONERY PRODUCTS",
+ '5943' => "STATIONERY STORES",
+ '4960' => "STEAM AND AIR-CONDITIONING SUPPLY",
+ '4961' => "STEAM AND AIR-CONDITIONING SUPPLY",
+ '3325' => "STEEL FOUNDRIES, NEC",
+ '3324' => "STEEL INVESTMENT FOUNDRIES",
+ '3317' => "STEEL PIPE AND TUBES",
+ '3493' => "STEEL SPRINGS, EXCEPT WIRE",
+ '3315' => "STEEL WIRE AND RELATED PRODUCTS",
+ '3200' => "STONE, CLAY, AND GLASS PRODUCTS",
+ '3691' => "STORAGE BATTERIES",
+ '3250' => "STRUCTURAL CLAY PRODUCTS",
+ '3259' => "STRUCTURAL CLAY PRODUCTS, NEC",
+ '1791' => "STRUCTURAL STEEL ERECTION",
+ '2439' => "STRUCTURAL WOOD MEMBERS, NEC",
+ '6550' => "SUBDIVIDERS AND DEVELOPERS",
+ '6552' => "SUBDIVIDERS AND DEVELOPERS, NEC",
+ '2060' => "SUGAR AND CONFECTIONERY PRODUCTS",
+ '0133' => "SUGARCANE AND SUGAR BEETS",
+ '6350' => "SURETY INSURANCE",
+ '6351' => "SURETY INSURANCE",
+ '2843' => "SURFACE ACTIVE AGENTS",
+ '3841' => "SURGICAL AND MEDICAL INSTRUMENTS",
+ '3842' => "SURGICAL APPLIANCES AND SUPPLIES",
+ '8713' => "SURVEYING SERVICES",
+ '3613' => "SWITCHGEAR AND SWITCHBOARD APPARATUS",
+ '4013' => "SWITCHING AND TERMINAL SERVICES",
+ '2822' => "SYNTHETIC RUBBER",
+ '3795' => "TANKS AND TANK COMPONENTS",
+ '7291' => "TAX RETURN PREPARATION SERVICES",
+ '4120' => "TAXICABS",
+ '4121' => "TAXICABS",
+ '4820' => "TELEGRAPH & OTHER COMMUNICATIONS",
+ '4822' => "TELEGRAPH & OTHER COMMUNICATIONS",
+ '3661' => "TELEPHONE AND TELEGRAPH APPARATUS",
+ '4810' => "TELEPHONE COMMUNICATION",
+ '4813' => "TELEPHONE COMMUNICATIONS, EXC. RADIO",
+ '4833' => "TELEVISION BROADCASTING STATIONS",
+ '1743' => "TERRAZZO, TILE, MARBLE, MOSAIC WORK",
+ '8734' => "TESTING LABORATORIES",
+ '2393' => "TEXTILE BAGS",
+ '2260' => "TEXTILE FINISHING, EXCEPT WOOL",
+ '2299' => "TEXTILE GOODS, NEC",
+ '3552' => "TEXTILE MACHINERY",
+ '2200' => "TEXTILE MILL PRODUCTS",
+ '7922' => "THEATRICAL PRODUCERS AND SERVICES",
+ '2284' => "THREAD MILLS",
+ '2282' => "THROWING AND WINDING MILLS",
+ '0810' => "TIMBER TRACTS",
+ '0811' => "TIMBER TRACTS",
+ '2296' => "TIRE CORD AND FABRICS",
+ '7534' => "TIRE RETREADING AND REPAIR SHOPS",
+ '3010' => "TIRES AND INNER TUBES",
+ '3011' => "TIRES AND INNER TUBES",
+ '5014' => "TIRES AND TUBES",
+ '6540' => "TITLE ABSTRACT OFFICES",
+ '6541' => "TITLE ABSTRACT OFFICES",
+ '6360' => "TITLE INSURANCE",
+ '6361' => "TITLE INSURANCE",
+ '0132' => "TOBACCO",
+ '5194' => "TOBACCO AND TOBACCO PRODUCTS",
+ '2100' => "TOBACCO PRODUCTS",
+ '2140' => "TOBACCO STEMMING AND REDRYING",
+ '2141' => "TOBACCO STEMMING AND REDRYING",
+ '5993' => "TOBACCO STORES AND STANDS",
+ '2844' => "TOILET PREPARATIONS",
+ '7532' => "TOP & BODY REPAIR & PAINT SHOPS",
+ '4725' => "TOUR OPERATORS",
+ '4492' => "TOWING AND TUGBOAT SERVICE",
+ '5092' => "TOYS AND HOBBY GOODS AND SUPPLIES",
+ '3940' => "TOYS AND SPORTING GOODS",
+ '7033' => "TRAILER PARKS AND CAMPSITES",
+ '3612' => "TRANSFORMERS, EXCEPT ELECTRONIC",
+ '4500' => "TRANSPORTATION BY AIR",
+ '3700' => "TRANSPORTATION EQUIPMENT",
+ '5088' => "TRANSPORTATION EQUIPMENT & SUPPLIES",
+ '3799' => "TRANSPORTATION EQUIPMENT, NEC",
+ '4700' => "TRANSPORTATION SERVICES",
+ '4789' => "TRANSPORTATION SERVICES, NEC",
+ '4724' => "TRAVEL AGENCIES",
+ '3792' => "TRAVEL TRAILERS AND CAMPERS",
+ '0173' => "TREE NUTS",
+ '3713' => "TRUCK AND BUS BODIES",
+ '7513' => "TRUCK RENTAL AND LEASING, NO DRIVERS",
+ '3715' => "TRUCK TRAILERS",
+ '4210' => "TRUCKING & COURIER SERVICES, EX. AIR",
+ '4200' => "TRUCKING AND WAREHOUSING",
+ '4230' => "TRUCKING TERMINAL FACILITIES",
+ '4231' => "TRUCKING TERMINAL FACILITIES",
+ '4213' => "TRUCKING, EXCEPT LOCAL",
+ '6730' => "TRUSTS",
+ '6733' => "TRUSTS, NEC",
+ '3511' => "TURBINES AND TURBINE GENERATOR SETS",
+ '0253' => "TURKEYS AND TURKEY EGGS",
+ '2791' => "TYPESETTING",
+ '4300' => "U.S. POSTAL SERVICE",
+ '4310' => "U.S. POSTAL SERVICE",
+ '4311' => "U.S. POSTAL SERVICE",
+ '3081' => "UNSUPPORTED PLASTICS FILM & SHEET",
+ '3082' => "UNSUPPORTED PLASTICS PROFILE SHAPES",
+ '2512' => "UPHOLSTERED HOUSEHOLD FURNITURE",
+ '1094' => "URANIUM-RADIUM-VANADIUM ORES",
+ '5520' => "USED CAR DEALERS",
+ '5521' => "USED CAR DEALERS",
+ '5930' => "USED MERCHANDISE STORES",
+ '5932' => "USED MERCHANDISE STORES",
+ '7519' => "UTILITY TRAILER RENTAL",
+ '3494' => "VALVES AND PIPE FITTINGS, NEC",
+ '5330' => "VARIETY STORES",
+ '5331' => "VARIETY STORES",
+ '2076' => "VEGETABLE OIL MILLS, NEC",
+ '0160' => "VEGETABLES AND MELONS",
+ '0161' => "VEGETABLES AND MELONS",
+ '3647' => "VEHICULAR LIGHTING EQUIPMENT",
+ '0740' => "VETERINARY SERVICES",
+ '0741' => "VETERINARY SERVICES FOR LIVESTOCK",
+ '0742' => "VETERINARY SERVICES, SPECIALTIES",
+ '7840' => "VIDEO TAPE RENTAL",
+ '7841' => "VIDEO TAPE RENTAL",
+ '3262' => "VITREOUS CHINA TABLE & KITCHENWARE",
+ '3261' => "VITREOUS PLUMBING FIXTURES",
+ '8240' => "VOCATIONAL SCHOOLS",
+ '8249' => "VOCATIONAL SCHOOLS, NEC",
+ '5075' => "WARM AIR HEATING & AIR-CONDITIONING",
+ '7630' => "WATCH, CLOCK, AND JEWELRY REPAIR",
+ '7631' => "WATCH, CLOCK, AND JEWELRY REPAIR",
+ '3870' => "WATCHES, CLOCKS, WATCHCASES & PARTS",
+ '3873' => "WATCHES, CLOCKS, WATCHCASES & PARTS",
+ '4489' => "WATER PASSENGER TRANSPORTATION, NEC",
+ '4940' => "WATER SUPPLY",
+ '4941' => "WATER SUPPLY",
+ '4400' => "WATER TRANSPORTATION",
+ '4440' => "WATER TRANSPORTATION OF FREIGHT, NEC",
+ '4449' => "WATER TRANSPORTATION OF FREIGHT, NEC",
+ '4480' => "WATER TRANSPORTATION OF PASSENGERS",
+ '4490' => "WATER TRANSPORTATION SERVICES",
+ '4499' => "WATER TRANSPORTATION SERVICES, NEC",
+ '1780' => "WATER WELL DRILLING",
+ '1781' => "WATER WELL DRILLING",
+ '1623' => "WATER, SEWER, AND UTILITY LINES",
+ '2385' => "WATERPROOF OUTERWEAR",
+ '2257' => "WEFT KNIT FABRIC MILLS",
+ '3548' => "WELDING APPARATUS",
+ '7692' => "WELDING REPAIR",
+ '2046' => "WET CORN MILLING",
+ '5000' => "WHOLESALE TRADE^DURABLE GOODS",
+ '5100' => "WHOLESALE TRADE^NONDURABLE GOODS",
+ '5182' => "WINE AND DISTILLED BEVERAGES",
+ '2084' => "WINES, BRANDY, AND BRANDY SPIRITS",
+ '3495' => "WIRE SPRINGS",
+ '2331' => "WOMEN'S & MISSES' BLOUSES & SHIRTS",
+ '5630' => "WOMEN'S ACCESSORY & SPECIALTY STORES",
+ '5632' => "WOMEN'S ACCESSORY & SPECIALTY STORES",
+ '5137' => "WOMEN'S AND CHILDREN'S CLOTHING",
+ '2340' => "WOMEN'S AND CHILDREN'S UNDERGARMENTS",
+ '2341' => "WOMEN'S AND CHILDREN'S UNDERWEAR",
+ '2330' => "WOMEN'S AND MISSES' OUTERWEAR",
+ '2339' => "WOMEN'S AND MISSES' OUTERWEAR, NEC",
+ '2337' => "WOMEN'S AND MISSES' SUITS AND COATS",
+ '5620' => "WOMEN'S CLOTHING STORES",
+ '5621' => "WOMEN'S CLOTHING STORES",
+ '3144' => "WOMEN'S FOOTWEAR, EXCEPT ATHLETIC",
+ '3171' => "WOMEN'S HANDBAGS AND PURSES",
+ '2251' => "WOMEN'S HOSIERY, EXCEPT SOCKS",
+ '2335' => "WOMEN'S, JUNIOR'S, & MISSES' DRESSES",
+ '2450' => "WOOD BUILDINGS AND MOBILE HOMES",
+ '2440' => "WOOD CONTAINERS",
+ '2449' => "WOOD CONTAINERS, NEC",
+ '2511' => "WOOD HOUSEHOLD FURNITURE",
+ '2434' => "WOOD KITCHEN CABINETS",
+ '2521' => "WOOD OFFICE FURNITURE",
+ '2448' => "WOOD PALLETS AND SKIDS",
+ '2541' => "WOOD PARTITIONS AND FIXTURES",
+ '2491' => "WOOD PRESERVING",
+ '2499' => "WOOD PRODUCTS, NEC",
+ '2517' => "WOOD TV AND RADIO CABINETS",
+ '3553' => "WOODWORKING MACHINERY",
+ '1795' => "WRECKING AND DEMOLITION WORK",
+ '3844' => "X-RAY APPARATUS AND TUBES",
+ '2280' => "YARN AND THREAD MILLS",
+ '2281' => "YARN SPINNING MILLS"
+ }
+
+ end
+end
+
diff --git a/test/fixtures/banking.ofx.sgml b/test/fixtures/banking.ofx.sgml
new file mode 100644
index 0000000..026b77b
--- /dev/null
+++ b/test/fixtures/banking.ofx.sgml
@@ -0,0 +1,87 @@
+OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+
+
+
+
+
+ 0
+ INFO
+ The user is authentic; operation succeeded.
+
+ 20070623142635.169[-5:CDT]
+ ENG
+
+ U.S. Bank
+ 1402
+
+ 1402
+
+
+
+
+ 9C24229A0077EAA50000011353C9E00743FC
+
+ 0
+ INFO
+
+
+ USD
+
+ 033000033
+ 103333333333
+ CHECKING
+
+
+ 20070604190000.000[-5:CDT]
+ 20070622190000.000[-5:CDT]
+
+ PAYMENT
+ 20070606120000.000
+ -11.11
+ 11111111 22
+ WEB AUTHORIZED PMT FOO INC
+ Download from usbank.com. FOO INC
+
+
+ CHECK
+ 20070607120000.000
+ -111.11
+ 22222A
+ 0000009611
+ CHECK
+ Download from usbank.com.
+
+
+ DIRECTDEP
+ 20070614120000.000
+ 1111.11
+ X34AE33
+ ELECTRONIC DEPOSIT BAR INC
+ Download from usbank.com. BAR INC
+
+
+ CREDIT
+ 20070619120000.000
+ 11.11
+ 8 8 9089743
+ ATM DEPOSIT US BANK ANYTOWNAS
+ Download from usbank.com. US BANK ANYTOWN ASUS1
+
+
+
+ 1234.09
+ 20070623142635.369[-5:CDT]
+
+
+
+
+
+
diff --git a/test/fixtures/creditcard.ofx.sgml b/test/fixtures/creditcard.ofx.sgml
new file mode 100644
index 0000000..07bba18
--- /dev/null
+++ b/test/fixtures/creditcard.ofx.sgml
@@ -0,0 +1,79 @@
+OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+
+
+
+
+
+ 0
+ INFO
+
+ 20070623192010
+ ENG
+
+ Citigroup
+ 24909
+
+ 24909
+
+
+
+
+ 0
+
+ 0
+ INFO
+
+
+ USD
+
+ XXXXXXXXXXXX1111
+
+
+ 20070509120000
+ 20070608120000
+
+ DEBIT
+ 20070510170000
+ -19.17
+ xx
+ 5912
+ WALGREEN 34638675 ANYTOWN
+
+
+ DEBIT
+ 20070512170000
+ -12.0
+ yy-56
+ 7933
+ SUNSET BOWL ANYTOWN
+
+
+ CREDIT
+ 20070526170000
+ 11.01
+ 78-9
+ 0000
+ ELECTRONIC PAYMENT-THANK YOU
+
+
+
+ -1111.01
+ 20070623192013
+
+
+ 19000.99
+ 20070623192013
+
+
+
+
+
+
diff --git a/test/fixtures/with_spaces.ofx.sgml b/test/fixtures/with_spaces.ofx.sgml
new file mode 100644
index 0000000..7bae080
--- /dev/null
+++ b/test/fixtures/with_spaces.ofx.sgml
@@ -0,0 +1,28 @@
+OFXHEADER:100
+DATA:OFXSGML
+VERSION:102
+SECURITY:NONE
+ENCODING:USASCII
+CHARSET:1252
+COMPRESSION:NONE
+OLDFILEUID:NONE
+NEWFILEUID:NONE
+
+
+
+
+
+ 0
+ INFO
+ The user is authentic; operation succeeded.
+
+ 20070623142635.169[-5:CDT]
+ ENG
+
+ U.S. Bank
+ 1402
+
+ 1402
+
+
+
diff --git a/test/test_ofx_parser.rb b/test/test_ofx_parser.rb
new file mode 100644
index 0000000..43d1ab8
--- /dev/null
+++ b/test/test_ofx_parser.rb
@@ -0,0 +1,244 @@
+require 'test/unit'
+require 'ofx-parser'
+
+class OfxParserTest < Test::Unit::TestCase
+
+ OFX_FILES = {}
+
+ fixtures_dir = File.dirname(__FILE__) + '/fixtures'
+
+ # Load up the xml files
+ Dir.open(fixtures_dir).each do |fn|
+ next unless fn =~ /\.ofx\.sgml$/
+ OFX_FILES[fn.scan(/^[^.]*/).to_s.to_sym] = File.read(fixtures_dir + "/#{fn}")
+ end
+
+ def setup
+ # empty ofx parser - useful for testing other methods independently
+ @parser = OfxParser::OfxParser
+ end
+
+ def test_pre_process_strips_spaces
+ header, body = @parser.pre_process(OFX_FILES[:with_spaces])
+
+ assert_no_match(/>\s+.*?, body, "should be no spaces after a tag close")
+ assert_no_match(/>.*?\s+, body, "should be no spaces before a tag close")
+ assert_no_match(/>\s+, body, "should be no spaces between two tags")
+ assert_match("The user is authentic; operation succeeded.", body, "content in tags should not be altered")
+ end
+
+ def test_pre_process_header
+ header, body = @parser.pre_process(OFX_FILES[:with_spaces])
+
+ assert_equal 9, header.keys.size
+ end
+
+ def test_parse_datetime
+ assert_equal DateTime.civil(2007, 6, 22, 19, 0, 0, Rational(-5,24)), @parser.parse_datetime('20070622190000.200[-5:CDT]')
+ assert_equal DateTime.civil(2007, 6, 22), @parser.parse_datetime('20070622')
+ assert_equal DateTime.civil(2007, 6, 22, 19, 0, 0), @parser.parse_datetime('20070622190000')
+ assert_equal DateTime.civil(2007, 6, 22, 19, 0, 0), @parser.parse_datetime('20070622190000.200')
+ end
+
+ def test_sign_on
+ ofx = OfxParser::OfxParser.parse(OFX_FILES[:with_spaces])
+
+ assert_equal '0', ofx.sign_on.status.code
+ assert_equal 'INFO', ofx.sign_on.status.severity
+ assert_equal 'The user is authentic; operation succeeded.', ofx.sign_on.status.message
+ assert_equal 'Success', ofx.sign_on.status.code_desc
+
+ assert_equal DateTime.civil(2007,6,23,14,26,35,Rational(-5, 24)), ofx.sign_on.date
+ assert_equal 'ENG', ofx.sign_on.language
+ assert_equal 'U.S. Bank', ofx.sign_on.institute.name
+ assert_equal '1402', ofx.sign_on.institute.id
+ end
+
+ def test_no_accounts
+ ofx = OfxParser::OfxParser.parse(OFX_FILES[:with_spaces])
+
+ assert_equal 0, ofx.accounts.size
+ end
+
+ def test_banking
+ ofx = OfxParser::OfxParser.parse(OFX_FILES[:banking])
+
+ acct = ofx.bank_account
+
+ assert_equal '103333333333', acct.number
+ assert_equal '033000033', acct.routing_number
+ assert_equal :CHECKING, acct.type
+ assert_equal '1234.09', acct.balance
+ assert_equal 123409, acct.balance_in_pennies
+ assert_equal DateTime.civil(2007,6,23,14,26,35,Rational(-5, 24)), acct.balance_date
+ assert_equal '9C24229A0077EAA50000011353C9E00743FC', acct.transaction_uid
+
+ statement = acct.statement
+
+ assert_equal 'USD', statement.currency
+ assert_equal DateTime.civil(2007,6,4,19,0,0,Rational(-5, 24)), statement.start_date
+ assert_equal DateTime.civil(2007,6,22,19,0,0,Rational(-5, 24)), statement.end_date
+
+ transactions = statement.transactions
+ assert_equal 4, transactions.size
+
+ assert_equal :PAYMENT, transactions[0].type
+ assert_equal OfxParser::Transaction::TYPE[:PAYMENT], transactions[0].type_desc
+ assert_equal DateTime.civil(2007,6,6,12,0,0), transactions[0].date
+ assert_equal '-11.11', transactions[0].amount
+ assert_equal -1111, transactions[0].amount_in_pennies
+ assert_equal '11111111 22', transactions[0].fit_id
+ assert_equal nil, transactions[0].check_number
+ assert_equal nil, transactions[0].sic
+ assert_equal nil, transactions[0].sic_desc
+ assert_equal 'WEB AUTHORIZED PMT FOO INC', transactions[0].payee
+ assert_equal 'Download from usbank.com. FOO INC', transactions[0].memo
+
+ assert_equal :CHECK, transactions[1].type
+ assert_equal OfxParser::Transaction::TYPE[:CHECK], transactions[1].type_desc
+ assert_equal DateTime.civil(2007,6,7,12,0,0), transactions[1].date
+ assert_equal '-111.11', transactions[1].amount
+ assert_equal -11111, transactions[1].amount_in_pennies
+ assert_equal '22222A', transactions[1].fit_id
+ assert_equal '0000009611', transactions[1].check_number
+ assert_equal nil, transactions[1].sic
+ assert_equal nil, transactions[1].sic_desc
+ assert_equal 'CHECK', transactions[1].payee
+ assert_equal 'Download from usbank.com.', transactions[1].memo
+
+ assert_equal :DIRECTDEP, transactions[2].type
+ assert_equal OfxParser::Transaction::TYPE[:DIRECTDEP], transactions[2].type_desc
+ assert_equal DateTime.civil(2007,6,14,12,0,0), transactions[2].date
+ assert_equal '1111.11', transactions[2].amount
+ assert_equal 111111, transactions[2].amount_in_pennies
+ assert_equal 'X34AE33', transactions[2].fit_id
+ assert_equal nil, transactions[2].check_number
+ assert_equal nil, transactions[2].sic
+ assert_equal nil, transactions[2].sic_desc
+ assert_equal 'ELECTRONIC DEPOSIT BAR INC', transactions[2].payee
+ assert_equal 'Download from usbank.com. BAR INC', transactions[2].memo
+
+ assert_equal :CREDIT, transactions[3].type
+ assert_equal OfxParser::Transaction::TYPE[:CREDIT], transactions[3].type_desc
+ assert_equal DateTime.civil(2007,6,19,12,0,0), transactions[3].date
+ assert_equal '11.11', transactions[3].amount
+ assert_equal 1111, transactions[3].amount_in_pennies
+ assert_equal '8 8 9089743', transactions[3].fit_id
+ assert_equal nil, transactions[3].check_number
+ assert_equal nil, transactions[3].sic
+ assert_equal nil, transactions[3].sic_desc
+ assert_equal 'ATM DEPOSIT US BANK ANYTOWNAS', transactions[3].payee
+ assert_equal 'Download from usbank.com. US BANK ANYTOWN ASUS1', transactions[3].memo
+
+ assert_equal 1, ofx.accounts.size
+ end
+
+ def test_creditcard
+ ofx = OfxParser::OfxParser.parse(OFX_FILES[:creditcard])
+
+ acct = ofx.credit_card
+
+ assert_equal 'XXXXXXXXXXXX1111', acct.number
+ assert_equal '19000.99', acct.remaining_credit
+ assert_equal 1900099, acct.remaining_credit_in_pennies
+ assert_equal DateTime.civil(2007,6,23,19,20,13), acct.remaining_credit_date
+ assert_equal '-1111.01', acct.balance
+ assert_equal -111101, acct.balance_in_pennies
+ assert_equal DateTime.civil(2007,6,23,19,20,13), acct.balance_date
+ assert_equal '0', acct.transaction_uid
+
+ statement = acct.statement
+
+ assert_equal 'USD', statement.currency
+ assert_equal DateTime.civil(2007,5,9,12,0,0), statement.start_date
+ assert_equal DateTime.civil(2007,6,8,12,0,0), statement.end_date
+
+ transactions = statement.transactions
+ assert_equal 3, transactions.size
+
+ assert_equal :DEBIT, transactions[0].type
+ assert_equal OfxParser::Transaction::TYPE[:DEBIT], transactions[0].type_desc
+ assert_equal DateTime.civil(2007,5,10,17,0,0), transactions[0].date
+ assert_equal '-19.17', transactions[0].amount
+ assert_equal -1917, transactions[0].amount_in_pennies
+ assert_equal 'xx', transactions[0].fit_id
+ assert_equal nil, transactions[0].check_number
+ assert_equal '5912', transactions[0].sic
+ assert_equal OfxParser::Sic::CODES['5912'], transactions[0].sic_desc
+ assert_equal 'WALGREEN 34638675 ANYTOWN', transactions[0].payee
+ assert_equal '', transactions[0].memo
+
+ assert_equal :DEBIT, transactions[1].type
+ assert_equal OfxParser::Transaction::TYPE[:DEBIT], transactions[1].type_desc
+ assert_equal DateTime.civil(2007,5,12,17,0,0), transactions[1].date
+ assert_equal '-12.0', transactions[1].amount
+ assert_equal -1200, transactions[1].amount_in_pennies
+ assert_equal 'yy-56', transactions[1].fit_id
+ assert_equal nil, transactions[1].check_number
+ assert_equal '7933', transactions[1].sic
+ assert_equal OfxParser::Sic::CODES['7933'], transactions[1].sic_desc
+ assert_equal 'SUNSET BOWL ANYTOWN', transactions[1].payee
+ assert_equal '', transactions[1].memo
+
+ assert_equal :CREDIT, transactions[2].type
+ assert_equal OfxParser::Transaction::TYPE[:CREDIT], transactions[2].type_desc
+ assert_equal DateTime.civil(2007,5,26,17,0,0), transactions[2].date
+ assert_equal '11.01', transactions[2].amount
+ assert_equal 1101, transactions[2].amount_in_pennies
+ assert_equal '78-9', transactions[2].fit_id
+ assert_equal nil, transactions[2].check_number
+ assert_equal '0000', transactions[2].sic
+ assert_equal nil, transactions[2].sic_desc
+ assert_equal 'ELECTRONIC PAYMENT-THANK YOU', transactions[2].payee
+ assert_equal '', transactions[2].memo
+
+ assert_equal 1, ofx.accounts.size
+ end
+
+ def test_monetary_support_call
+ t = OfxParser::Transaction.new
+ t.amount = '-11.1'
+
+ assert_nothing_raised { t.amount_in_pennies }
+ assert_raise(NoMethodError) { t.amount_in_whatever }
+
+ assert t.respond_to?(:amount_in_pennies)
+ assert !t.respond_to?(:amount_in_whatever)
+
+
+ end
+
+ class X
+ include OfxParser::MonetarySupport
+ attr_accessor :amount
+ monetary_vars :amount
+ end
+
+ def test_original_method
+ x = X.new
+ assert_equal :a_b, x.original_method('a_b_in_pennies')
+ assert_equal :a, x.original_method('a_in_pennies')
+ end
+
+ def test_for_pennies
+ amounts = {
+ '-11.1' => -111,
+ '-11.110' => -1111,
+ '-11.11101' => -1111,
+ '11.11' => 1111,
+ '11,11' => 1111,
+ '1' => 100,
+ '1.0' => 100,
+ '-1.0' => -100,
+ '' => nil
+ }
+
+ x = X.new
+
+ amounts.each do |actual, expected|
+ x.amount = actual
+ assert_equal expected, x.amount_in_pennies, "#{actual.inspect} should give #{expected.inspect}"
+ end
+ end
+
+end
\ No newline at end of file