 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at
	
     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.

 Files having a separate license should be ignored.
 For Celix these include
   - Mongoose
   - Civetweb
   - Unzip and MiniZip files
   - Doxygen scripts for CMake (Doxyfile.in, UseDoxygen.cmake)
   - memstream
 
 Also there are several files which can't have a license statement.
   - *.in Input files used by CMake to generate files for deployment,
          should not contain comments.
  - .project Eclipse project file, not in the release but generated by CMake.
             Excluded to prevent false positives when using RAT on a dev tree.
  - Template files for code generation. 
   
 Todo: Why doesn't RAT exclude these files when using a full path?

Doxyfile.in

 Workaround to exclude .in files.
(.*).in

 Avpr files cannot have comments and as result no license info
(.*).avpr

build/*
cmake-build-debug/*

.project
   
md5.inl


MiniZip64_info.txt

unzip.c
unzip.h
miniunz.c
ioapi.c
ioapi.h
iowin32.c
iowin32.h

UseDoxygen.cmake
CodeCoverage.cmake

manifest_sections.txt
manifest.txt

fmemopen.c
fmemopen.h
open_memstream.c
open_memstream.h

# thpool and memstream documentation files
./utils/public/include/memstream/README.md

.travis.yml

(.)*\.descriptor

scope.*\.json


#MIT - C Thread Pool
thpool.c
thpool.h
Design.md
FAQ.md
README.md

#ansi_up.js : javascript lib to handle ansi colors
ansi_up.js