<!-- 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.--><project name="Component">  <bannerLeft>    <name>Logging Services</name>    <src>images/ls-logo.jpg</src>    <href>http://logging.apache.org/</href>  </bannerLeft>  <bannerRight>    <src>images/logo.jpg</src>  </bannerRight>  <body>    <links>      <item name="Apache" href="http://www.apache.org/" />      <item name="Logging Services" href="http://logging.apache.org/"/>      <item name="Log4j" href="http://logging.apache.org/log4j/"/>      <item name="Log4j Companions" href="http://logging.apache.org/log4j/companions"/>    </links>    {$reports}  </body></project>