# List of files to exclude from RAT, see RAT_README for details
# this file
.rat-excludes*
# git files
.gitignore
.gitattributes
# test files
EXPECTED*
DIFF*
eqat*
qat*
.data*
sample_events*
FILTER*
lob_input*
romeo*
expected*
COMPARE*
expat*
regress*
regtest_*
montest_readme.txt
test-requirements.txt*
# protocol buffers
dtm*.*.pb.cc
protobuf*
# make
package.exclude.*
package.exclude
# readme files
readme*
README*
RAT_README
readme.md
README.md
run_me*
# documentation and build info 
eclipse.*cproject*
eclipse.project
doxygen_tmudr.1.6.config
# Files needed by txn coprocesser - hbase
Hbase_server.skeleton.cpp*
__init__.py*
# SQL messages file
SqlciErrors.txt
# DCS config files
backup-masters
servers
master
# jquery
jquery-ui.css*
jquery-ui.js*
jquery-ui.structure.css*
jquery-ui.theme.css*
jquery-1.11.0.js*
demo*.css*
Sortingicons.psd*
# licenses
license*.txt*
LICENSE.rtf*
lic-.*-src
lic-.*-bin
note-.*-bin
# win generated
odbc.vcxproj*
odbc.vcxproj.*
SetCertificateDirReg_os.vcxproj*
SetCertificateDirReg_os.vcxproj.*
SetCertificateDirReg_os.sln*
SetCertificateDirReg.rc*
odbccp32.props
UpdateDSN_os.sln
UpdateDSN*.vcxproj*
UpdateDSN*.vcxproj.*
UpdateDSN_os.vcxproj*
UpdateDSN_os.vcxproj.*
win64_installer_os.ism
odbcclient_os.sln
Drvr35*.rc*
Drvr35Res.rc
Drvr35Res.rc2
Drvr35*.vcxproj*
Drvr35*.vcxproj.*
Drvr35Adm_os.*
DrvMsg35.rc
Drvr35Res_os.rc*
Drvr35Msg_os.*
Drvr35Res_os.vcxproj*
Drvr35Res_os.vcxproj.*
drvr35*.rc*
drvr35*.vcxproj*
drvr35adm.*
TranslationDll.rc
TranslationDll*.vcxproj*
TranslationDll*.vcxproj.*
TranslationDll_os.vcxproj*
TranslationDll_os.vcxproj.*
drvr35.rc
drvr35*.vcxproj*
drvr35*.vcxproj.*
drvr35_os.rc
drvr35_os.vcxproj*
drvr35_os.vcxproj.*
openssl.props
version_drvr.cpp
TCPIPV4.*
TCPIPV6.*
TCPIPV4_os.*
TCPIPV6_os.*
.props*
.sln*
.ism*
resource.h*
resource.hm*
odb.sln
odb.vcxproj.*
odb.rc
swscanf.cpp
swsprintf.cpp
ulexer.h
# Compiler GUI files
usage.csv
Resource.qrc
#phoenix tests - MIT licensed from Salesforce
AlterTableTest.java
ArithmeticQueryTest.java
AutoCommitTest.java
BaseTest.java
BinaryRowKeyTest.java
CoalesceFunctionTest.java
CompareDecimalToLongTest.java
CreateTableTest.java
CustomEntityDataTest.java
DeleteRangeTest.java
DescColumnSortOrderTest.java
DistinctCountTest.java
ExecuteStatementsTest.java
ExtendedQueryExecTest.java
FunkyNamesTest.java
GroupByCaseTest.java
IndexTest.java
IsNullTest.java
KeyOnlyTest.java
MultiCfQueryExecTest.java
OrderByTest.java
ProductMetricsTest.java
QueryExecTest.java
QueryExecWithoutSCNTest.java
QueryPlanTest.java
ReadIsolationLevelTest.java
SaltedTableTest.java
SaltedTableUpsertSelectTest.java
SaltedTableVarLengthRowKeyTest.java
ServerExceptionTest.java
SkipScanQueryTest.java
StatementHintsTest.java
StddevTest.java
ToCharFunctionTest.java
ToNumberFunctionTest.java
TopNTest.java
UpsertBigValuesTest.java
UpsertSelectAutoCommitTest.java
UpsertSelectTest.java
UpsertValuesTest.java
VariableLengthPKTest.java
# asciidoc extention file -- MIT license
google-analytics-postprocessor.rb

# pyinstaller JSON config files
mod_cfgs.json
prompt.json
script.json
version.json
# ambari configuration JSON files
mpack.json
role_command_order.json
theme.json
# pyinstaller dependencies
# they have BSD-3 license that RAT does not recognize
prettytable.py
socks.py
