## 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.
##
#macro ( topMenu $menus )
#**##foreach( $menu in $menus )
#**##if ( $menu.name )
      <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">$menu.name <b class="caret"></b></a>
        <ul class="dropdown-menu">
#*    *##foreach( $item in $menu.items )
#*      *##if ($item.items.size() > 0)
            <li class="dropdown-submenu">
#*            *##set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
#*            *##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
#*            *##topLink( $currentItemHref $item.name $item.target )

              <ul class="dropdown-menu">
#*            *##foreach($subitem in $item.items)
#*              *##set ( $currentItemHref = $PathTool.calculateLink( $subitem.href, $relativePath ) )
#*              *##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
                  <li>#topLink( $currentItemHref $subitem.name $subitem.target )</li>
#*            *##end
              </ul>
            </li>
#*      *##else
#*        *##set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
#*        *##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
            <li>#topLink( $currentItemHref $item.name $item.target )</li>
#*      *##end
#*    *##end
        </ul>
      </li>
#**##end
#**##end
#end
##
##
##
#macro ( topLink $href $name $target )
#**##set ( $linkTitle = ' title="' + $name + '"' )
#**##if( $target )
#*  *##set ( $linkTarget = ' target="' + $target + '"' )
#**##else
#*  *##set ( $linkTarget = "" )
#**##end
#**#<a href="$href"$linkTarget title="$name">$name</a>##
#end
##
##
##
#macro ( topLinks $links )
#**##set ( $counter = 0 )
#**##foreach( $item in $links )
#*  *##set ( $counter = $counter + 1 )
#*  *##set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
#*  *##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
    <li>#topLink( $currentItemHref $item.name $item.target )</li>
#**##end
#end
##
##
##
#macro ( link $href $name $target $img $position $alt $border $width $height $icon)
#**##set ( $linkTitle = ' title="' + $name + '"' )
#**##if( $target )
#*  *##set ( $linkTarget = ' target="' + $target + '"' )
#**##else
#*  *##set ( $linkTarget = "" )
#**##end
#**##if ( $decoration.isLink( $href ) )
#*  *##set ( $linkClass = ' class="externalLink"' )
#**##else
#*  *##set ( $linkClass = "" )
#**##end
#**##if ( $img )
#*  *##if ( $position == "left" )
#*    *#<a href="$href"$linkClass$linkTarget$linkTitle>#image($img $alt $border $width $height)$name</a>##
#*  *##else
#*    *#<a href="$href"$linkClass$linkTarget$linkTitle>$name #image($img $alt $border $width $height)</a>##
#*  *##end
#**##else
#*  *#<a href="$href"$linkClass$linkTarget$linkTitle>##
#*  *##if($icon)
#*    *#<span class="$icon"></span>##
#*  *##end
#*  *#$name</a>##
#**##end
#end
##
##
##
#macro ( image $img $alt $border $width $height )
#**##if( $img )
#*  *##if ( !$decoration.isLink( $img ) )
#*    *##set ( $imgSrc = $PathTool.calculateLink( $img, $relativePath ) )
#*    *##set ( $imgSrc = $imgSrc.replaceAll( '\\', '/' ) )
#*    *##set ( $imgSrc = ' src="' + $imgSrc + '"' )
#*  *##else
#*    *##set ( $imgSrc = ' src="' + $img + '"' )
#*  *##end
#*  *##if( $alt )
#*    *##set ( $imgAlt = ' alt="' + $alt + '"' )
#*  *##else
#*    *##set ( $imgAlt = ' alt=""' )
#*  *##end
#*  *##if( $border )
#*    *##set ( $imgBorder = ' border="' + $border + '"' )
#*  *##else
#*    *##set ( $imgBorder = "" )
#*  *##end
#*  *##if( $width )
#*    *##set ( $imgWidth = ' width="' + $width + '"' )
#*  *##else
#*    *##set ( $imgWidth = "" )
#*  *##end
#*  *##if( $height )
#*    *##set ( $imgHeight = ' height="' + $height + '"' )
#*  *##else
#*    *##set ( $imgHeight = "" )
#*  *##end
<img class="imageLink"$imgSrc$imgAlt$imgBorder$imgWidth$imgHeight/>##
#**##end
#end
##
##
##
#macro ( banner $banner $id )
#**##if ( $banner )
#*  *##if( $banner.href )
#*    *##set ( $hrf = $banner.href )
#*    *##if ( !$decoration.isLink( $hrf ) )
#*      *##set ( $hrf = $PathTool.calculateLink( $hrf, $relativePath ) )
#*      *##set ( $hrf = $hrf.replaceAll( '\\', '/' ) )
#*      *##if ( ( $hrf == '' ) )
#*        *##set ( $hrf = './' )
#*      *##end
#*    *##end
#*    *#<a href="$hrf" id="$id"#if( $banner.alt ) title="$banner.alt"#end>##
#*  *##else
#*    *#<div id="$id">##
#*  *##end
##
#*  *##if( $banner.src )
#*    *##set ( $src = $banner.src )
#*    *##if ( !$decoration.isLink( $src ) )
#*      *##set ( $src = $PathTool.calculateLink( $src, $relativePath ) )
#*      *##set ( $src = $src.replaceAll( '\\', '/' ) )
#*    *##end
#*    *##if ( $banner.alt )
#*      *##set ( $alt = ' alt="' + $banner.alt + '"' )
#*    *##elseif ( $banner.name )
#*      *##set ( $alt = ' alt="' + $banner.name + '"' )
#*    *##else
#*      *##set ( $alt = ' alt=""' )
#*    *##end
#*    *##if( $banner.border )
#*      *##set ( $imgBorder = ' border="' + $banner.border + '"' )
#*    *##else
#*      *##set ( $imgBorder = "" )
#*    *##end
#*    *##if( $banner.width )
#*      *##set ( $imgWidth = ' width="' + $banner.width + '"' )
#*    *##else
#*      *##set ( $imgWidth = "" )
#*    *##end
#*    *##if( $banner.height )
#*      *##set ( $imgHeight = ' height="' + $banner.height + '"' )
#*    *##else
#*      *##set ( $imgHeight = "" )
#*    *##end
#*    *##if( $banner.title )
#*      *##set ( $bannerTitle=' title="' + $banner.title + '"' )
#*    *##else
#*      *##set ( $bannerTitle="" )
#*    *##end
#*    *#<img src="$src" $alt$bannerTitle$imgBorder$imgWidth$imgHeight/>##
#*  *##else
#*    *#<h2>$banner.name</h2>
#*  *##end
##
#*  *##if( $banner.href )
#*    *#</a>##
#*  *##else
#*    *#</div>
#*  *##end
#**##end
#end
##
##
##
#macro ( links $links )
#**##set ( $counter = 0 )
#**### MSKINS-41
#**##set ( $begin = $links.size() - 1 )
#**##foreach( $index in [$begin..0] )
#*  *##set ( $item = $links.get( $index ) )
#*  *##set ( $counter = $counter + 1 )
#*  *##set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
#*  *##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
##
      <li class="pull-right">##
#*  *##if ( $counter > 0 && $counter < $links.size() )
#*  *#<span class="divider">|</span>
#*  *##end
#*  *##link( $currentItemHref $item.name $item.target $item.img $item.position $item.alt $item.border $item.width $item.height false)
#*  *#</li>
#**##end
#end
##
##
##
#macro ( breadcrumbs $breadcrumbs $cssClass )
#**##set ( $breadcrumbDivider = $decoration.getCustomValue( 'fluidoSkin.breadcrumbDivider', '/' ) )
#**##foreach( $item in $breadcrumbs )
#*  *##set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
#*  *##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
#*  *##if ( ( $currentItemHref == '' ) )
#*    *##set ( $currentItemHref = './' )
#*  *##end
##
      <li class="$cssClass">##
#*  *##link( $currentItemHref $item.name $item.target $item.img $item.position $item.alt $item.border $item.width $item.height false )
#*  *#<span class="divider">$breadcrumbDivider</span>##
#*  *#</li>
#**##end
#**### add Edit button if content is editable
#**##if( $decoration.edit && $docRenderingContext.editable )
#*  *##set ( $edit = ' <a href="' + $docRenderingContext.getDoxiaSourcePath( $decoration.edit ) + '"><img src="' + $relativePath + '/images/accessories-text-editor.png" title="Edit" /></a>' )
#**##end
#**##if ( $shortTitle )
    <li class="active $cssClass">$shortTitle$!edit</li>
#**##else
    <li class="active $cssClass">$title$!edit</li>
#**##end
#end
##
##
##
#macro ( displayTree $display $item )
#**##if ( $item && $item.items && $item.items.size() > 0 )
#*  *##foreach( $subitem in $item.items )
#*    *##set ( $subitemHref = $PathTool.calculateLink( $subitem.href, $relativePath ) )
#*    *##set ( $subitemHref = $subitemHref.replaceAll( '\\', '/' ) )
##
#*    *##if ( $alignedFileName == $subitemHref )
#*      *##set ( $display = true )
#*    *##end
##
#*    *##displayTree( $display $subitem )
#*  *##end
#**##end
#end
##
##
##
#macro ( menuItem $item $indent )
#**##set ( $collapseClass = "none" )
#**##set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
#**##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
##
#**##if ( $item && $item.items && $item.items.size() > 0 )
#*  *##if ( $item.collapse == false )
#*    *##set ( $collapseClass = "icon-chevron-down" )
#*  *##else
#*    *### By default collapsed
#*    *##set ( $collapseClass = "icon-chevron-right" )
#*  *##end
##
#*  *##set ( $display = false )
#*  *##displayTree( $display $item )
##
#*  *##if ( $alignedFileName == $currentItemHref || $display )
#*    *##set ( $collapseClass = "icon-chevron-down" )
#*  *##end
#**##end
##
#**##if ( $alignedFileName == $currentItemHref )
$indent    <li class="active">##
#**##else
$indent    <li>##
#**##end
##
#**##if ( $item.img )
#*  *##if ( $item.position == "left" )
#*    *##if ( $alignedFileName == $currentItemHref )
#*      *#<a href="#">#image($item.img $item.alt $item.border $item.width $item.height) $item.name</a>##
#*    *##else
#*      *##link($currentItemHref $item.name $item.target $item.img $item.position $item.alt $item.border $item.width $item.height false)
#*    *##end
#*  *##else
#*    *##if ( $alignedFileName == $currentItemHref )
#*      *#<a href="#">$item.name #image($item.img $item.alt $item.border $item.width $item.height)</a>##
#*    *##else
#*      *##link($currentItemHref $item.name $item.target $item.img $item.position $item.alt $item.border $item.width $item.height false)
#*    *##end
#*  *##end
#**##else
#*  *##if ( $alignedFileName == $currentItemHref )
#*    *#<a href="#"><span class="$collapseClass"></span>$item.name</a>##
#*  *##else
#*    *##link( $currentItemHref $item.name $item.target $item.img $item.position $item.alt $item.border $item.width $item.height $collapseClass)
#*  *##end
#**##end
#**##if ( $item && $item.items && $item.items.size() > 0 )
#*  *##if ( $collapseClass == "icon-chevron-down" )

$indent     <ul class="nav nav-list">
#*    *##foreach( $subitem in $item.items )
#*      *##menuItem( $subitem "$indent  " )
#*    *##end
$indent     </ul>##
#*  *##end
#**##end
#**#</li>
#end
##
##
##
#macro ( mainMenu $menus )
  <ul class="nav nav-list">
#**##foreach( $menu in $menus )
#**##if ( $menu.name )
#*  *##if ( $menu.img )
#*    *##if( $menu.position )
#*      *##set ( $position = $menu.position )
#*    *##else
#*      *##set ( $position = "left" )
#*    *##end
##
#*    *##if ( !$decoration.isLink( $menu.img ) )
#*      *##set ( $src = $PathTool.calculateLink( $menu.img, $relativePath ) )
#*      *##set ( $src = $src.replaceAll( '\\', '/' ) )
#*      *##set ( $src = ' src="' + $src + '"' )
#*    *##else
#*      *##set ( $src = ' src="' + $menu.img + '"' )
#*    *##end
##
#*    *##if( $menu.alt )
#*      *##set ( $alt = ' alt="' + $menu.alt + '"' )
#*    *##else
#*      *##set ( $alt = ' alt="' + $menu.name + '"' )
#*    *##end
##
#*    *##if( $menu.border )
#*      *##set ( $border = ' border="' + $menu.border + '"' )
#*    *##else
#*      *##set ( $border = ' border="0"' )
#*    *##end
##
#*    *##if( $menu.width )
#*      *##set ( $width = ' width="' + $menu.width + '"' )
#*    *##else
#*      *##set ( $width = "" )
#*    *##end
#*    *##if( $menu.height )
#*      *##set ( $height = ' height="' + $menu.height + '"' )
#*    *##else
#*      *##set ( $height = "" )
#*    *##end
##
#*    *##set ( $img = '<img class="imageLink"' + $src + $alt + $border + $width + $height + "/>" )
##
#*    *##if ( $position == "left" )
   <li class="nav-header">$img $menu.name</li>
#*    *##else
   <li class="nav-header">$menu.name $img</li>
#*    *##end
#*  *##else
   <li class="nav-header">$menu.name</li>
#*  *##end
#**##end
#**##if ( $menu.items && $menu.items.size() > 0 )
#*  *##foreach( $item in $menu.items )
#*    *##menuItem( $item '' )
#*  *##end
#**##end
#**##end
  </ul>
#end
##
##
##
#macro ( copyright )
#**##if ( $project )
#*  *##if ( ${project.organization} && ${project.organization.name} )
#*    *##set ( $period = "" )
#*  *##else
#*    *##set ( $period = "." )
#*  *##end
##
#*  *##set ( $currentYear = ${currentDate.year} + 1900 )
##
#*  *##if ( ${project.inceptionYear} && ( ${project.inceptionYear} != ${currentYear.toString()} ) )
#*    *#${project.inceptionYear}&#x2013;${currentYear}${period}
#*  *##else
#*    *#${currentYear}${period}
#*  *##end
##
#*  *##if ( ${project.organization} )
#*    *##if ( ${project.organization.name} && ${project.organization.url} )
#*      *#<a href="$project.organization.url">${project.organization.name}</a>.
#*    *##elseif ( ${project.organization.name} )
#*      *#${project.organization.name}.
#*    *##end
#*  *##end
#**##end
#end
##
##
##
#macro ( publishDate $position $decorationPublishDate $version )
#**##if ( $publishDate )
#*  *##set ( $dateValue = $dateFormat.format( $publishDate ) )
#**##elseif ( $decoration.custom.getChild( 'publishDate' ) )
#*  *##set ( $dateValue = $decoration.custom.getChild( 'publishDate' ).getValue() )
#**##else
#*  *##set ( $dateValue = $dateFormat.format( $currentDate ) )
#**##end
##
#**##set ( $datePosition = $decorationPublishDate.position )
#**##set ( $versionPosition = $version.position )
##
#**##set ( $breadcrumbs = $decoration.body.breadcrumbs )
#**##set ( $links = $decoration.body.links )
##
#**##if ( $datePosition.equalsIgnoreCase( "right" ) && ( $versionPosition.equalsIgnoreCase( "right" ) || !$topBarEnabled
                                                                                                         && $decoration.body.links
                                                                                                         && $decoration.body.links.size() > 0) )
#*  *##set ( $prefix = '<span class="divider">|</span> ' )
#**##else
#*  *##set ( $prefix = "" )
#**##end
##
#**##if ( $datePosition.equalsIgnoreCase( $position ) )
#*  *##if ( ( $datePosition.equalsIgnoreCase( "right" ) ) || ( $datePosition.equalsIgnoreCase( "bottom" ) ) )
        <li id="publishDate" class="pull-right">$prefix$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateValue</li>
#*    *##if ( $versionPosition.equalsIgnoreCase( $position ) )
          <li id="projectVersion" class="pull-right">##
#*      *##if ( !$topBarEnabled
              && $decoration.body.links
              && $decoration.body.links.size() > 0 )
#*        *#<span class="divider">|</span>##
#*      *##end
#*      *#$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}##
#*      *#</li>
#*    *##end
#*  *##elseif ( ( $datePosition.equalsIgnoreCase( "navigation-bottom" ) ) || ( $datePosition.equalsIgnoreCase( "navigation-top" ) ) )
      <div id="lastPublished">
        <span id="publishDate">$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateValue</span>
#*    *##if ( $versionPosition.equalsIgnoreCase( $position ) )
        <span class="divider">|</span> <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
#*    *##end
      </div>
#*  *##elseif ( $datePosition.equalsIgnoreCase("left") )
        <li id="publishDate">$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateValue##
#*    *##if ( $versionPosition.equalsIgnoreCase( $position ) || $breadcrumbs && $breadcrumbs.size() > 0)
#*      *#<span class="divider">|</span>
#*    *##end
#*    *#</li>
#*    *##if ( $versionPosition.equalsIgnoreCase( $position ) )
          <li id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}##
#*      *##if ( $breadcrumbs && $breadcrumbs.size() > 0 )
#*        *#<span class="divider">|</span>##
#*      *##end
#*      *#</li>
#*    *##end
#*    *##if ( $breadcrumbs && $breadcrumbs.size() > 0 )
#*      *##breadcrumbs( $breadcrumbs "" )
#*    *##end
#*  *##end
#**##elseif ( $versionPosition.equalsIgnoreCase( $position ) )
#*  *##if ( $versionPosition.equalsIgnoreCase( "right" ) )
      <li id="projectVersion" class="pull-right">$prefix$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</li>
#*  *##elseif ( $versionPosition.equalsIgnoreCase( "bottom" ) )
      <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
#*  *##elseif ( ( $versionPosition.equalsIgnoreCase( "navigation-bottom" ) ) || ( $versionPosition.equalsIgnoreCase( "navigation-top" ) ) )
      <div id="lastPublished">
        <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
      </div>
#*  *##elseif ( $versionPosition.equalsIgnoreCase("left") )
        <li id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}##
#*      *##if ( $breadcrumbs && $breadcrumbs.size() > 0 )
#*        *#<span class="divider">|</span>##
#*      *##end
#*    *#</li>
#*    *##if ( $breadcrumbs && $breadcrumbs.size() > 0 )
#*      *##breadcrumbs( $breadcrumbs "")
#*    *##end
#*  *##end
#**##elseif ( $position.equalsIgnoreCase( "left" ) )
#*  *##if ( $breadcrumbs && $breadcrumbs.size() > 0 )
#*    *##breadcrumbs( $breadcrumbs "" )
#*  *##end
#**##end
#end
##
##
##
#macro ( builtByLogo $poweredBy )
#**##if( $poweredBy )
#**##foreach ($item in $poweredBy)
#*  *##if( $item.href )
#*    *##set ( $href = $PathTool.calculateLink( $item.href, $relativePath ) )
#*    *##set ( $href = $href.replaceAll( '\\', '/' ) )
#*  *##else
#*    *##set ( $href="https://maven.apache.org/" )
#*  *##end
##
#*  *##if( $item.name )
#*    *##set ( $name = $item.name )
#*  *##else
#*    *##set ( $name = $i18n.getString( "site-renderer", $locale, "template.builtby" )  )
#*    *##set ( $name = "${name} Maven"  )
#*  *##end
##
#*  *##if( $item.img )
#*    *##set ( $img = $item.img )
#*  *##else
#*    *##set ( $img = "images/logos/maven-feather.png" )
#*  *##end
##
#*  *##if ( !$decoration.isLink( $img ) )
#*    *##set ( $img = $PathTool.calculateLink( $img, $relativePath ) )
#*    *##set ( $img = $img.replaceAll( '\\', '/' ) )
#*  *##end
##
#*  *##if( $item.alt )
#*    *##set ( $alt = ' alt="' + $item.alt + '"' )
#*  *##else
#*    *##set ( $alt = ' alt="' + $name + '"' )
#*  *##end
##
#*  *##if( $item.border )
#*    *##set ( $border = ' border="' + $item.border + '"' )
#*  *##else
#*    *##set ( $border = "" )
#*  *##end
##
#*  *##if( $item.width )
#*    *##set ( $width = ' width="' + $item.width + '"' )
#*  *##else
#*    *##set ( $width = "" )
#*  *##end
#*  *##if( $item.height )
#*    *##set ( $height = ' height="' + $item.height + '"' )
#*  *##else
#*    *##set ( $height = "" )
#*  *##end
##
#*  *#<a href="$href" title="$name" class="builtBy">##
#*    *#<img class="builtBy" $alt src="$img" $border $width $height />##
#*  *#</a>
#**##end
#**##if( $poweredBy.isEmpty() )
#*  *#<a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">##
#*    *#<img class="builtBy" alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" src="$relativePath/images/logos/maven-feather.png" />##
#*  *#</a>
#**##end
#**##else
#**#<a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">##
#*  *#<img class="builtBy" alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" src="$relativePath/images/logos/maven-feather.png" />##
#**#</a>
#**##end
#end
##
##
##
#macro ( piwik )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.piwik.piwikUrl' )
        && $decoration.getCustomChild( 'fluidoSkin.piwik.idsite' ) )
#*  *##set ( $piwikUrl =  $decoration.getCustomValue( 'fluidoSkin.piwik.piwikUrl' ) )
#*  *##set ( $idsite =  $decoration.getCustomValue( 'fluidoSkin.piwik.idsite' ) )
##
    <!-- Piwik -->
    <script type="text/javascript">
    var pkBaseURL = (("https:" == document.location.protocol) ? "https://$piwikUrl/" : "http://$piwikUrl/");
    document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js' type='text/javascript'%3E%3C/script%3E"));
    </script><script type="text/javascript">
    try {
    var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", $idsite);
    piwikTracker.trackPageView();
    piwikTracker.enableLinkTracking();
    } catch( err ) {}
    </script><noscript><p><img src="http://$piwikUrl/piwik.php?idsite=$idsite" style="border:0" alt=""/></p></noscript>
    <!-- End Piwik Tag -->
#**##end
#end
##
##
##
#macro ( googleAnalytics $accountId )
#**##if( $accountId && $accountId != "" )
    <!-- Google Analytics -->
    <script>
      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
       (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
            m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
      })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
      ga('create', '$accountId', 'auto');
      ga('send', 'pageview');
#**##if( $decoration.getCustomValue( 'fluidoSkin.googleAnalytics.anonymizeIp', 'true' ) == 'true' )
      ga('set', 'anonymizeIp', true);
#**##end
#**##if( $decoration.getCustomValue( 'fluidoSkin.googleAnalytics.forceSSL', 'true' ) == 'true' )
      ga('set', 'forceSSL', true);
#**##end
    </script>
#**##end
#end
##
##
##
#macro ( googleSearch $top )
<form id="search-form" action="https://www.google.com/search" method="get" #if ( $top ) class="navbar-search pull-right" #end>
#**##if( $decoration.getCustomChild( 'fluidoSkin.googleSearch.sitesearch' ) )
#*  *##set( $sitesearchValue = $decoration.getCustomValue( 'fluidoSkin.googleSearch.sitesearch' ) )
#**##else
#*  *##set( $startIndex = $project.url.indexOf("://") + 3 )
#*  *##set( $sitesearchValue = $project.url.substring( $startIndex, $project.url.length() ) )
#**##end
  <input value="$sitesearchValue" name="sitesearch" type="hidden"/>
  <input class="search-query" name="q" id="query" type="text" />
</form>
<script type="text/javascript">asyncJs( 'https://cse.google.com/brand?form=search-form' )</script>
#end
##
##
##
#macro ( forkMeOnGitHub )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.gitHub.projectId' ) )
##
#*  *##set ( $gitHubProjectId = $decoration.getCustomValue( 'fluidoSkin.gitHub.projectId' ) )
##
#*  *##set ( $leftRibbon = { "red" : "forkme_left_red_aa0000.png", "green" : "forkme_left_green_007200.png", "black" : "forkme_left_darkblue_121621.png", "darkblue" : "forkme_left_darkblue_121621.png", "orange" : "forkme_left_orange_ff7600.png", "gray" : "forkme_left_gray_6d6d6d.png" } )
#*  *##set ( $rightRibbon = { "red" : "forkme_right_red_aa0000.png", "green" : "forkme_right_green_007200.png", "black" : "forkme_right_darkblue_121621.png", "darkblue" : "forkme_right_darkblue_121621.png", "orange" : "forkme_right_orange_ff7600.png", "gray" : "forkme_right_gray_6d6d6d.png" } )
##
#*  *##set ( $ribbon = $leftRibbon )
#*  *##set ( $ribbonOrientation = 'left' )
#*  *##if ( $decoration.getCustomValue( 'fluidoSkin.gitHub.ribbonOrientation', '' ).equalsIgnoreCase( 'right' ) )
#*    *##set ( $ribbonOrientation = 'right' )
#*    *##set ( $ribbon = $rightRibbon )
#*  *##end
##
#*  *##set ( $ribbonColor = 'red' )
#*  *##set ( $definedRibbonColor = $decoration.getCustomChild( 'fluidoSkin.gitHub.ribbonColor' ) )
##
#*  *##if ( $definedRibbonColor
            && ( $definedRibbonColor.getValue().equalsIgnoreCase( "red" )
            || $definedRibbonColor.getValue().equalsIgnoreCase( "green" )
            || $definedRibbonColor.getValue().equalsIgnoreCase( "black" )
            || $definedRibbonColor.getValue().equalsIgnoreCase( "orange" )
            || $definedRibbonColor.getValue().equalsIgnoreCase( "gray" ) ) )
#*    *##set ( $ribbonColor = $definedRibbonColor.getValue().toLowerCase() )
#*  *##end
##
    <a href="https://github.com/$gitHubProjectId">
      <img style="position: absolute; top: 0; $ribbonOrientation: 0; border: 0; z-index: 10000;"
        src="https://s3.amazonaws.com/github/ribbons/$ribbon.get( $ribbonColor )"
        alt="Fork me on GitHub">
    </a>
#**##end
#end
##
##
## activate profile background image if custom.fluidoSkin.profile value set to "retired", "pre-release" or "sandbox"
#macro ( prjProfile )
#**##set ( $profile = $decoration.getCustomValue( 'fluidoSkin.profile', '' ) )
#**##if ( $profile.equalsIgnoreCase( "retired" )
          || $profile.equalsIgnoreCase( "pre-release" )
          || $profile.equalsIgnoreCase( "sandbox" ) )
      <style type="text/css">body{background-image: url('$relativePath/images/profiles/${profile}.png');}</style>
#**##end
#end
##
##
##
#macro ( facebookLike $sideBarEnabled )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.facebookLike' ) && $project.url )
##  ## kindly hardcoded
##
#*  *##set( $layout = 'box_count' )
#*  *##if( !$sideBarEnabled )
#*    *##set( $layout = 'button_count' )
#*  *##end
##
#*  *##set( $colorscheme = 'light' )
#*  *##if( !$sideBarEnabled )
#*    *##set( $colorscheme = 'dark' )
#*  *##end
##
#*  *##set( $frameWidth = 'width:48px; height:63px' )
#*  *##if( !$sideBarEnabled )
#*    *##set( $frameWidth = 'width:100px; height:20px' )
#*  *##end
##
    <iframe src="https://www.facebook.com/plugins/like.php?href=$project.url&send=false&layout=$layout&show-faces=false&action=like&colorscheme=$colorscheme"
        scrolling="no" frameborder="0"
        style="border:none; $frameWidth; margin-top: 10px;" #if( !$sideBarEnabled ) class="pull-right" #end></iframe>
#**##end
#end
##
##
##
#macro ( followTwitter $sideBarEnabled )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.twitter.user' ) )
#*  *##set( $user = $decoration.getCustomValue( 'fluidoSkin.twitter.user' ) )
#*  *##set( $showUser = $decoration.getCustomValue( 'fluidoSkin.twitter.showUser', '' ).equalsIgnoreCase( 'true' ) )
#*  *##set( $showFollowers = $decoration.getCustomValue( 'fluidoSkin.twitter.showFollowers', '' ).equalsIgnoreCase( 'true' ) )
##
#*  *##if ( $sideBarEnabled )
#*    *##set( $dataSize = "medium" )
#*    *##set( $dataAlign = "left" )
    <div id="twitter">
#*  *##else
#*    *##set( $dataSize = "large" )
#*    *##set( $dataAlign = "right" )
    <ul class="nav pull-right"><li>
#*  *##end
##
    <a href="https://twitter.com/${user}" class="twitter-follow-button" data-show-count="${showFollowers}" data-align="${dataAlign}" data-size="${dataSize}" data-show-screen-name="${showUser}" data-lang="${locale}">Follow ${user}</a>
    <script type="text/javascript">!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
##
#*  *##if ( $sideBarEnabled )
    </div>
#*  *##else
    </li></ul>
#*  *##end
#**##end
#end
##
##
##
#macro ( ohloh )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.ohloh.projectId' ) )
#*  *##set ( $projectId = $decoration.getCustomValue( 'fluidoSkin.ohloh.projectId' ) )
##
#*  *##set( $widget = "users_logo.js" )
##
#*  *##if ( $decoration.getCustomChild( 'fluidoSkin.ohloh.widget' ) )
#*    *##set( $definedWidget = $decoration.getCustomValue( 'fluidoSkin.ohloh.widget' ) )
##
#*    *##if ( $definedWidget.equalsIgnoreCase( "users-logo" ) )
#*      *##set( $widget = "users_logo.js" )
#*    *##elseif ( $definedWidget.equalsIgnoreCase( "users-green" ) )
#*      *##set( $widget = "users.js?style=green" )
#*    *##elseif ( $definedWidget.equalsIgnoreCase( "users-red" ) )
#*    *##set( $widget = "users.js?style=red" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "users-blue" ) )
#*    *##set( $widget = "users.js?style=blue" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "users-gray" ) )
#*    *##set( $widget = "users.js?style=gray" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "users-rainbow" ) )
#*    *##set( $widget = "users.js?style=rainbow" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "users" ) )
#*    *##set( $widget = "users.js" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "thin-badge" ) )
#*    *##set( $widget = "thin_badge.js" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "partner-badge" ) )
#*    *##set( $widget = "partner_badge.js" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "languages" ) )
#*    *##set( $widget = "languages.js" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "factoids" ) )
#*    *##set( $widget = "factoids.js" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "cocomo" ) )
#*    *##set( $widget = "cocomo.js" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "stats" ) )
#*    *##set( $widget = "basic_stats.js" )
#*  *##end
#**##end
##
    <div id="ohloh" class="pull-right">
      <script type="text/javascript" src="https://www.ohloh.net/p/${projectId}/widgets/project_${widget}"></script>
    </div>
  #end
#end
##
##
##
#macro ( flattrHead )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.flattr.thing' )
          && ( $decoration.getCustomChild( 'fluidoSkin.flattr.url' ) || $project.url ) )
    <script type="text/javascript">
    /* <![CDATA[ */
        (function() {
            var s = document.createElement('script'), t = document.getElementsByTagName('script')[0];
            s.type = 'text/javascript';
            s.async = true;
            s.src = 'https://api.flattr.com/js/0.6/load.js?mode=auto';
            t.parentNode.insertBefore(s, t);
        })();
    /* ]]> */</script>
#**##end
#end
##
##
##
#macro ( flattrBody $sideBarEnabled )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.flattr.thing' )
          && ( $decoration.getCustomChild( 'fluidoSkin.flattr.url' ) || $project.url ) )
#*  *##set ( $flattrThing = $decoration.getCustomValue( 'fluidoSkin.flattr.thing' ) )
#*  *##set ( $flattrUrl = $decoration.getCustomValue( 'fluidoSkin.flattr.url', $project.url ) )
##
#*  *##set ( $styleModifier = '' )
#*  *##if ( $decoration.getCustomValue( 'fluidoSkin.flattr.style', '' ).equalsIgnoreCase( 'compact' ) )
#*    *##set ( $styleModifier = 'rev="flattr;button:compact;"' )
#*  *##end
##
#*  *##if ( $sideBarEnabled )
    <div id="flattr">
#*  *##else
    <ul class="nav pull-right"><li>
#*  *##end
##
    <a class="FlattrButton" style="display:none;" $styleModifier href="$flattrUrl"></a>
    <noscript><a href="https://flattr.com/thing/$flattrThing" target="_blank">
    <img src="https://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a></noscript>
##
#*  *##if ( $sideBarEnabled )
    </div>
#*  *##else
    </li></ul>
#*  *##end
#**##end
#end