## ---------------------------------------------------------------------------
## 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.
## ---------------------------------------------------------------------------

# to configure camel main
# here you can configure options on camel main (see MainConfigurationProperties class)
camel.main.name = MyCoolCamel

# enable tracing
### camel.main.tracing = true

# you can also configure camel context directly
# camel.context.shutdown-strategy.shutdown-now-on-timeout = false

# you can configure whether OS environment should override (=2 which is default) or as fallback (=1)
### camel.component.properties.environment-variable-mode=1

# properties used in the route
camel.component.aws2-s3.accessKey=AKIAJRUNH7VJCF4GQPCA
camel.component.aws2-s3.secretKey=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
camel.component.aws2-s3.region=eu-west-1
