# 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.
#
# Documentation - These files are never code.
README(\..*)?$, Docs
NOTICE$, Docs
VERSION$, Docs
BUILD$, Docs
DISCLAIMER, Docs
CHANGELOG$, Docs
\.md$, Docs
\.txt$, Docs
\.placeholder$, Empty

# Uncommentable files
#
# These files cannot contain comments, so no header can be added.
# They are nevertheless covered by the Apache license.
^go\.sum$, Apache-2.0
^vendor/modules\.txt$, Apache-2.0
\.project$, Apache-2.0
\.cfg$, Apache-2.0
\.json$, Apache-2.0
\.webmanifest, Apache-2.0
\.csv$, Apache-2.0
\.conf$, Apache-2.0
\.config(\.example)?$, Apache-2.0
\.traffic_ops$, Apache-2.0 # JSON with a specific format.
\.dist$, Apache-2.0 # JSON with a specific format.
traffic_monitor_config\.js$, Apache-2.0 # Actually JSON with a specific format.
CrStates$, Apache-2.0 # JSON with a specific format.
^docs/.*\.(png|jpe?g|ico|gif)$, Apache-2.0
^blueprints/.*\.(png|jpe?g|ico|gif)$, Apache-2.0
favicon.(ico|png)$, Apache-2.0
traffic_ops/app/db/trafficvault/test/.*\.key$, Apache-2.0 # test AES key files
traffic_ops/app/db/trafficvault/test/data/.*\.dat$, Apache-2.0 # test data files
^traffic_ops/experimental/goto/testFiles/, Apache-2.0
\.pem$, Apache-2.0 # Single certificate file.
traffic_router/core/src/test/resources/api/2.0/cdns/name/thecdn/sslkeys(-missing-1)?, Apache-2.0 #JSON files with no extension
traffic_router/core/src/test/resources/api/2.0/steering*, Apache-2.0
traffic_router/core/src/test/resources/api/2.0/federations/all, Apache-2.0
BUILD_NUMBER$, Apache-2.0

# Images, created for this project or used under an Apache license.
^misc/logos/ATC-PNG\.png, Apache-2.0
^misc/logos/ATC-PNG-FULL-BLACK\.png, Apache-2.0
^misc/logos/ATC-PNG-FULL-BLACK-LARGE\.png, Apache-2.0
^misc/logos/ATC-PNG-FULL-WHITE\.png, Apache-2.0
^misc/logos/ATC-PNG-FULL-WHITE-LARGE\.png, Apache-2.0
^misc/logos/ATC-PNG-LARGE\.png, Apache-2.0
^misc/logos/ATC-SVG\.sketch, Apache-2.0
^misc/logos/ATC-SVG-FULL\.sketch, Apache-2.0
^misc/logos/page_logos/trafficLogoFactory\.psd, Apache-2.0
^misc/logos/page_logos/traffic_monitor_logo\.png, Apache-2.0
^misc/logos/page_logos/traffic_operations_logo\.png, Apache-2.0
^misc/logos/page_logos/traffic_portal\.png, Apache-2.0
^misc/logos/page_logos/traffic_router_logo\.png, Apache-2.0
^misc/logos/page_logos/traffic_stats_logo\.png, Apache-2.0
^misc/logos/page_logos/traffic_stats_logo_red\.png, Apache-2.0

# Demo certificates
ssl\.(crt|key)$, Apache-2.0
/keystore, Apache-2.0

# Uncommentable files
#
# These files cannot contain comments, but are covered by separate
# licenses. These licenses must be documented in the root LICENSE file.
Inconsolata\.ttf$, SIL OFL 1.1
Inconsolata-Bold\.ttf$, SIL OFL 1.1
[Ff]ont[Aa]wesome[^\.]*\.([ot]tf|eot|woff2?)$, SIL OFL 1.1
Lato-Bold\.ttf$, SIL OFL 1.1
Lato-Regular\.ttf$, SIL OFL 1.1
ssl-bundle\.crt$, MPL
^traffic_portal/app/src/assets/images/sort_, MIT

# Code dependencies
#
# These files could bear headers, but are part of dependent code and
# so we present them for the most part unmodified. These licenses must
# be documented in the root LICENSE file.
[Ff]ont[Aa]wesome[^\.]*\.css, MIT
select2.css, Apache-2.0
select2.css, GPL/LGPL
j[Mm]enu.*\.(css|js), MIT
sphinx_rtd_theme/.*\.(html|css|css\.map|js|py)$, MIT
bootstrap(-theme)?\.css\.map, MIT
datatables\.min, MIT
GeoLite2-City.mmdb.gz, CC-A-SA
jquery\.tree\.min\.css$, MIT
jquery\.dataTables\..*\.(css|js)$, MIT
github\.com/basho/backoff/.*, MIT
github\.com/dchest/siphash/.*, CC0
github\.com/kylelemons/godebug.*, Apache-2.0
github\.com/pkg/errors\..*, BSD
traffic_portal/app/src/assets/js/chartjs/angular-chart\..*, BSD
traffic_portal/app/src/assets/css/jsonformatter\..*, Apache-2.0
traffic_portal/app/src/assets/js/jsonformatter\..*, Apache-2.0
traffic_portal/app/src/assets/js/fast-json-patch.*, MIT
traffic_portal/app/src/assets/css/angular-ui-tree\..*, MIT
traffic_portal/app/src/assets/js/angular-ui-tree\..*, MIT
traffic_portal/app/src/assets/css/colReorder.dataTables\..*, MIT
traffic_portal/app/src/assets/js/colReorder.dataTables\..*, MIT
traffic_portal/app/src/assets/js/dataTables.buttons\..*, MIT
traffic_portal/app/src/assets/js/buttons.html5\..*, MIT

# Ignored - Do not report.
\.DS_Store, Ignore # Created automatically OSX.

# This file is created dynamically by the testing script itself, it is
# not distributed, but if it were, it would be Apache, and the source
# would be right with it.
^infrastructure/test/license/license, Apache-2.0

# Don't object to licenses in the license file itself.
^LICENSE$, !GoBSD
^LICENSE$, !MIT
^LICENSE$, !BSD
^LICENSE$, !X11
^LICENSE$, !ISC

# ... or in the documentation about the licenses.
^infrastructure/test/license/README.md$, !BSD
^infrastructure/test/license/README.md$, !GPL/LGPL
^infrastructure/test/license/README.md$, !MIT
^infrastructure/test/license/README.md$, !WTFPL
^infrastructure/test/license/README.md$, !X11

# License files are licensed under their own terms, don't attempt to detect them.
^licenses/.*, Ignore

# False positives
licenseList\.go$, !GoBSD
licenseList\.go$, !MIT
licenseList\.go$, !BSD
licenseList\.go$, !X11
^traffic_ops/app/t_integration/extensions\.t$, !X11
GeoLite2-City.mmdb.gz, !MIT

# Files generated by tools that are checked into the repo, covered by the
# Apache-2.0 license.
.*\/pnpm-lock\.yaml$, Apache-2.0

# Google fonts, distributed under the Apache-2.0 license
/Roboto\.ttf$, Apache-2.0
/Roboto\.\d+\.ttf$, Apache-2.0
/MaterialIcons.ttf$, Apache-2.0
