##
## 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.
##
## $Date: 2008-03-09 23:17:06 -0700 (Sun, 09 Mar 2008) $ $Rev: 635446 $
##

========================================================================

Apache ServiceMix includes a number of components and libraries with 
separate copyright notices and license terms. Your use of those 
components are subject to the terms and conditions of the following 
licenses. 

#set ( $apacheTxt = "The Apache Software License, Version 2.0" )
#foreach ( $project in $projects )
#foreach ( $license in $project.licenses)
#if ( ! ($apacheTxt == $license.name) ) 

$project.name #if ($project.url)($project.url)#end $project.artifact
    License: $license.name #if ($license.url) ($license.url)#end

#end
#end
#end
