<?xml version="1.0" encoding="UTF-8"?>
<!--
aoweb-struts - Template webapp for legacy Struts-based site framework with AOServ Platform control panels.
Copyright (C) 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026  AO Industries, Inc.
    support@aoindustries.com
    7262 Bull Pen Cir
    Mobile, AL 36695

This file is part of aoweb-struts.

aoweb-struts is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

aoweb-struts is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with aoweb-struts.  If not, see <https://www.gnu.org/licenses/>.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.aoapps</groupId><artifactId>ao-oss-parent</artifactId><version>1.29.0-SNAPSHOT</version>
    <relativePath>../oss/parent/pom.xml</relativePath>
  </parent>

  <groupId>com.aoindustries</groupId><artifactId>aoweb-struts</artifactId><version>4.0.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <properties>
    <!-- Must be set to ${git.commit.time} for snapshots or ISO 8601 timestamp for releases. -->
    <project.build.outputTimestamp>${git.commit.time}</project.build.outputTimestamp>
    <module.name>com.aoindustries.web.struts</module.name>
    <javadoc.breadcrumbs><![CDATA[<a target="${javadoc.target}" href="${project.url}">${project.name}</a>]]></javadoc.breadcrumbs>
    <javadoc.taglibReference><![CDATA[
      <li><a target="${javadoc.target}" href="${project.url}aoweb-struts-aoweb.tld/">AOWeb Taglib Reference</a></li>
      <li><a target="${javadoc.target}" href="${project.url}aoweb-struts-skin.tld/">Skin Taglib Reference</a></li>
    ]]></javadoc.taglibReference>
    <!-- Java 17 -->
    <javase.version>17</javase.version>
    <javase.release>17</javase.release>
    <javadoc.link.javase>${javadoc.link.javase.17}</javadoc.link.javase>
    <!-- Jakarta EE 10 -->
    <javaee.version>10</javaee.version>
    <javadoc.link.javaee>${javadoc.link.jakartaee.10}</javadoc.link.javaee>

    <description.html><![CDATA[Template webapp for legacy Struts-based site framework with <a target="${javadoc.target}" href="https://aoindustries.com/aoserv/">AOServ Platform</a> control panels.]]></description.html>

    <!-- SonarQube -->
    <sonar.projectKey>com.aoapps.platform:aoapps-brands<!-- TODO: ${project.groupId}:${project.artifactId} --></sonar.projectKey>
    <!-- TODO: Implement tests -->
    <sonar.coverage.exclusions>**.*</sonar.coverage.exclusions>

    <!-- Require secure session cookies in production -->
    <session.cookie.secure>true</session.cookie.secure>

    <!-- Struts 2 -->
    <log4j2.struts2.level>warn</log4j2.struts2.level>
    <log4j2.xwork2.level>warn</log4j2.xwork2.level>
    <log4j2.root.level>info</log4j2.root.level>
  </properties>

  <name>AOWeb Struts</name>
  <url>https://aoindustries.com/aoweb-struts/</url>
  <description>Template webapp for legacy Struts-based site framework with AOServ Platform control panels.</description>
  <inceptionYear>2007</inceptionYear>

  <licenses>
    <license>
      <name>GNU General Lesser Public License (LGPL) version 3.0</name>
      <url>https://www.gnu.org/licenses/lgpl-3.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>

  <organization>
    <name>AO Industries, Inc.</name>
    <url>https://aoindustries.com/</url>
  </organization>

  <developers>
    <developer>
      <name>AO Industries, Inc.</name>
      <email>support@aoindustries.com</email>
      <url>https://aoindustries.com/</url>
      <organization>AO Industries, Inc.</organization>
      <organizationUrl>https://aoindustries.com/</organizationUrl>
    </developer>
  </developers>

  <scm>
    <connection>scm:git:git://github.com/ao-apps/aoweb-struts.git</connection>
    <developerConnection>scm:git:git@github.com:ao-apps/aoweb-struts.git</developerConnection>
    <url>https://github.com/ao-apps/aoweb-struts</url>
    <tag>HEAD</tag>
  </scm>

  <issueManagement>
    <system>GitHub Issues</system>
    <url>https://github.com/ao-apps/aoweb-struts/issues</url>
  </issueManagement>

  <ciManagement>
    <system>Jenkins</system>
    <url>https://jenkins.aoindustries.com/job/ao/job/aoweb-struts/</url>
  </ciManagement>
  <!-- Only one allowed in POM:
  <ciManagement>
    <system>GitHub Actions</system>
    <url>https://github.com/ao-apps/aoweb-struts/actions</url>
  </ciManagement>
  -->

  <repositories>
    <!-- Repository required here, too, so can find parent -->
    <repository>
      <id>aoapps-snapshots</id>
      <name>AOApps Snapshot Repository</name>
      <url>https://snapshots.maven.aoapps.com/</url>
      <releases>
        <enabled>false</enabled>
      </releases>
      <snapshots>
        <checksumPolicy>fail</checksumPolicy>
      </snapshots>
    </repository>
  </repositories>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId><version>${org.codehaus.gmaven.groovy-maven-plugin.version}</version>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId><artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <id>substitute-templates</id><phase>generate-sources</phase><goals><goal>run</goal></goals>
            <configuration>
              <target xmlns:if="ant:if" xmlns:unless="ant:unless">
                <mkdir dir="${project.build.directory}/substitute-templates" />
                <copy overwrite="true" todir="${project.build.directory}/substitute-templates">
                  <fileset dir="${project.basedir}/src/main/webapp" includes="WEB-INF/struts-config*.xml.template, WEB-INF/web.xml.template" />
                </copy>
                <!-- WEB-INF/struts-config-clientarea-accounting.xml -->
                <replace
                  file="${project.build.directory}/substitute-templates/WEB-INF/struts-config-clientarea-accounting.xml.template"
                  value="${struts-config-clientarea-accounting.xml.messageResources}"
                  summary="true"
                  failOnNoReplacements="true"
                >
                  <replacetoken><![CDATA[<!-- Include "struts-config-clientarea-accounting.xml.messageResources" -->]]></replacetoken>
                </replace>
                <condition property="struts-config-clientarea-accounting.xml.matches" value="true">
                  <filesmatch
                    file1="${project.build.directory}/substitute-templates/WEB-INF/struts-config-clientarea-accounting.xml.template"
                    file2="${project.basedir}/src/main/webapp/WEB-INF/struts-config-clientarea-accounting.xml"
                  />
                </condition>
                <copy
                  unless:set="struts-config-clientarea-accounting.xml.matches"
                  overwrite="true"
                  file="${project.build.directory}/substitute-templates/WEB-INF/struts-config-clientarea-accounting.xml.template"
                  tofile="${project.basedir}/src/main/webapp/WEB-INF/struts-config-clientarea-accounting.xml"
                />
                <echo
                  if:set="struts-config-clientarea-accounting.xml.matches"
                  message="struts-config-clientarea-accounting.xml unchanged"
                  level="info"
                />
                <!-- WEB-INF/struts-config-clientarea-control.xml -->
                <replace
                  file="${project.build.directory}/substitute-templates/WEB-INF/struts-config-clientarea-control.xml.template"
                  value="${struts-config-clientarea-control.xml.messageResources}"
                  summary="true"
                  failOnNoReplacements="true"
                >
                  <replacetoken><![CDATA[<!-- Include "struts-config-clientarea-control.xml.messageResources" -->]]></replacetoken>
                </replace>
                <condition property="struts-config-clientarea-control.xml.matches" value="true">
                  <filesmatch
                    file1="${project.build.directory}/substitute-templates/WEB-INF/struts-config-clientarea-control.xml.template"
                    file2="${project.basedir}/src/main/webapp/WEB-INF/struts-config-clientarea-control.xml"
                  />
                </condition>
                <copy
                  unless:set="struts-config-clientarea-control.xml.matches"
                  overwrite="true"
                  file="${project.build.directory}/substitute-templates/WEB-INF/struts-config-clientarea-control.xml.template"
                  tofile="${project.basedir}/src/main/webapp/WEB-INF/struts-config-clientarea-control.xml"
                />
                <echo
                  if:set="struts-config-clientarea-control.xml.matches"
                  message="struts-config-clientarea-control.xml unchanged"
                  level="info"
                />
                <!-- WEB-INF/struts-config-clientarea-ticket.xml -->
                <replace
                  file="${project.build.directory}/substitute-templates/WEB-INF/struts-config-clientarea-ticket.xml.template"
                  value="${struts-config-clientarea-ticket.xml.messageResources}"
                  summary="true"
                  failOnNoReplacements="true"
                >
                  <replacetoken><![CDATA[<!-- Include "struts-config-clientarea-ticket.xml.messageResources" -->]]></replacetoken>
                </replace>
                <condition property="struts-config-clientarea-ticket.xml.matches" value="true">
                  <filesmatch
                    file1="${project.build.directory}/substitute-templates/WEB-INF/struts-config-clientarea-ticket.xml.template"
                    file2="${project.basedir}/src/main/webapp/WEB-INF/struts-config-clientarea-ticket.xml"
                  />
                </condition>
                <copy
                  unless:set="struts-config-clientarea-ticket.xml.matches"
                  overwrite="true"
                  file="${project.build.directory}/substitute-templates/WEB-INF/struts-config-clientarea-ticket.xml.template"
                  tofile="${project.basedir}/src/main/webapp/WEB-INF/struts-config-clientarea-ticket.xml"
                />
                <echo
                  if:set="struts-config-clientarea-ticket.xml.matches"
                  message="struts-config-clientarea-ticket.xml unchanged"
                  level="info"
                />
                <!-- WEB-INF/struts-config-clientarea.xml -->
                <replace
                  file="${project.build.directory}/substitute-templates/WEB-INF/struts-config-clientarea.xml.template"
                  value="${struts-config-clientarea.xml.messageResources}"
                  summary="true"
                  failOnNoReplacements="true"
                >
                  <replacetoken><![CDATA[<!-- Include "struts-config-clientarea.xml.messageResources" -->]]></replacetoken>
                </replace>
                <condition property="struts-config-clientarea.xml.matches" value="true">
                  <filesmatch
                    file1="${project.build.directory}/substitute-templates/WEB-INF/struts-config-clientarea.xml.template"
                    file2="${project.basedir}/src/main/webapp/WEB-INF/struts-config-clientarea.xml"
                  />
                </condition>
                <copy
                  unless:set="struts-config-clientarea.xml.matches"
                  overwrite="true"
                  file="${project.build.directory}/substitute-templates/WEB-INF/struts-config-clientarea.xml.template"
                  tofile="${project.basedir}/src/main/webapp/WEB-INF/struts-config-clientarea.xml"
                />
                <echo
                  if:set="struts-config-clientarea.xml.matches"
                  message="struts-config-clientarea.xml unchanged"
                  level="info"
                />
                <!-- WEB-INF/struts-config-signup.xml -->
                <replace
                  file="${project.build.directory}/substitute-templates/WEB-INF/struts-config-signup.xml.template"
                  value="${struts-config-signup.xml.messageResources}"
                  summary="true"
                  failOnNoReplacements="true"
                >
                  <replacetoken><![CDATA[<!-- Include "struts-config-signup.xml.messageResources" -->]]></replacetoken>
                </replace>
                <condition property="struts-config-signup.xml.matches" value="true">
                  <filesmatch
                    file1="${project.build.directory}/substitute-templates/WEB-INF/struts-config-signup.xml.template"
                    file2="${project.basedir}/src/main/webapp/WEB-INF/struts-config-signup.xml"
                  />
                </condition>
                <copy
                  unless:set="struts-config-signup.xml.matches"
                  overwrite="true"
                  file="${project.build.directory}/substitute-templates/WEB-INF/struts-config-signup.xml.template"
                  tofile="${project.basedir}/src/main/webapp/WEB-INF/struts-config-signup.xml"
                />
                <echo
                  if:set="struts-config-signup.xml.matches"
                  message="struts-config-signup.xml unchanged"
                  level="info"
                />
                <!-- WEB-INF/struts-config.xml -->
                <replace
                  file="${project.build.directory}/substitute-templates/WEB-INF/struts-config.xml.template"
                  value="${struts-config.xml.actions}"
                  summary="true"
                  failOnNoReplacements="true"
                >
                  <replacetoken><![CDATA[<!-- Include "struts-config.xml.actions" -->]]></replacetoken>
                </replace>
                <replace
                  file="${project.build.directory}/substitute-templates/WEB-INF/struts-config.xml.template"
                  value="${struts-config.xml.messageResources}"
                  summary="true"
                  failOnNoReplacements="true"
                >
                  <replacetoken><![CDATA[<!-- Include "struts-config.xml.messageResources" -->]]></replacetoken>
                </replace>
                <condition property="struts-config.xml.matches" value="true">
                  <filesmatch
                    file1="${project.build.directory}/substitute-templates/WEB-INF/struts-config.xml.template"
                    file2="${project.basedir}/src/main/webapp/WEB-INF/struts-config.xml"
                  />
                </condition>
                <copy
                  unless:set="struts-config.xml.matches"
                  overwrite="true"
                  file="${project.build.directory}/substitute-templates/WEB-INF/struts-config.xml.template"
                  tofile="${project.basedir}/src/main/webapp/WEB-INF/struts-config.xml"
                />
                <echo
                  if:set="struts-config.xml.matches"
                  message="struts-config.xml unchanged"
                  level="info"
                />
                <!-- WEB-INF/web.xml -->
                <replace
                  file="${project.build.directory}/substitute-templates/WEB-INF/web.xml.template"
                  value="${web.xml.contextParams}"
                  summary="true"
                  failOnNoReplacements="true"
                >
                  <replacetoken><![CDATA[<!-- Include "web.xml.contextParams" -->]]></replacetoken>
                </replace>
                <replace
                  file="${project.build.directory}/substitute-templates/WEB-INF/web.xml.template"
                  value="${web.xml.struts2Mappings}"
                  summary="true"
                  failOnNoReplacements="true"
                >
                  <replacetoken><![CDATA[<!-- Include "web.xml.struts2Mappings" -->]]></replacetoken>
                </replace>
                <replace
                  file="${project.build.directory}/substitute-templates/WEB-INF/web.xml.template"
                  value="${web.xml.strutsInitParams}"
                  summary="true"
                  failOnNoReplacements="true"
                >
                  <replacetoken><![CDATA[<!-- Include "web.xml.strutsInitParams" -->]]></replacetoken>
                </replace>
                <replace
                  file="${project.build.directory}/substitute-templates/WEB-INF/web.xml.template"
                  value="${web.xml.servlets}"
                  summary="true"
                  failOnNoReplacements="true"
                >
                  <replacetoken><![CDATA[<!-- Include "web.xml.servlets" -->]]></replacetoken>
                </replace>
                <replace
                  file="${project.build.directory}/substitute-templates/WEB-INF/web.xml.template"
                  value="${web.xml.servletMappingsPre}"
                  summary="true"
                  failOnNoReplacements="true"
                >
                  <replacetoken><![CDATA[<!-- Include "web.xml.servletMappingsPre" -->]]></replacetoken>
                </replace>
                <replace
                  file="${project.build.directory}/substitute-templates/WEB-INF/web.xml.template"
                  value="${web.xml.servletMappingsPost}"
                  summary="true"
                  failOnNoReplacements="true"
                >
                  <replacetoken><![CDATA[<!-- Include "web.xml.servletMappingsPost" -->]]></replacetoken>
                </replace>
                <condition property="web.xml.matches" value="true">
                  <filesmatch
                    file1="${project.build.directory}/substitute-templates/WEB-INF/web.xml.template"
                    file2="${project.basedir}/src/main/webapp/WEB-INF/web.xml"
                  />
                </condition>
                <copy
                  unless:set="web.xml.matches"
                  overwrite="true"
                  file="${project.build.directory}/substitute-templates/WEB-INF/web.xml.template"
                  tofile="${project.basedir}/src/main/webapp/WEB-INF/web.xml"
                />
                <echo
                  if:set="web.xml.matches"
                  message="web.xml unchanged"
                  level="info"
                />
              </target>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId>
        <configuration>
          <usedDependencies>
            <!-- JSP Only -->
            <dependency>com.semanticcms:semanticcms-core-taglib</dependency>
            <dependency>io.github.weblegacy:struts-taglib</dependency>
          </usedDependencies>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId>
        <configuration>
          <archiveClasses>true</archiveClasses>
          <warSourceExcludes>
            <!-- Default Excludes -->
            ${maven-war-plugin.warSourceExcludes.default}
            <!-- Exclude files used in template substitutions -->
            ,WEB-INF/struts-config*.xml.actions
            ,WEB-INF/struts-config*.xml.messageResources
            ,WEB-INF/web.xml.contextParams
            ,WEB-INF/web.xml.struts2Mappings
            ,WEB-INF/web.xml.strutsInitParams
            ,WEB-INF/web.xml.servlets
            ,WEB-INF/web.xml.servletMappingsPre
            ,WEB-INF/web.xml.servletMappingsPost
          </warSourceExcludes>
          <packagingExcludes>
            <!-- Default Excludes -->
            ${maven-war-plugin.packagingExcludes.default}
            <!-- Additional Excludes -->
            ,aoweb-struts-devel-*.jar
          </packagingExcludes>
        </configuration>
      </plugin>
      <plugin>
        <groupId>com.github.spotbugs</groupId><artifactId>spotbugs-maven-plugin</artifactId>
        <configuration>
          <!-- TODO: Clean-up SpotBugs -->
          <failOnError>false</failOnError>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <profiles>
    <profile>
      <id>audit-dependencies</id>
      <activation>
         <property><name>ossindex.skip</name><value>!true</value></property>
      </activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.sonatype.ossindex.maven</groupId><artifactId>ossindex-maven-plugin</artifactId>
            <configuration>
              <excludeVulnerabilityIds>
                <!--
                https://guide.sonatype.com/vulnerability/CVE-2026-119078?component-type=maven&component-name=commons-codec%2Fcommons-codec&utm_source=ossindex-client&utm_medium=integration&utm_content=1.8.1
                Application does not use Blake3 or doFinalize.
                -->
                <exclude>CVE-2026-119078</exclude>
              </excludeVulnerabilityIds>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
    <!-- WEB-INF/struts-config-clientarea-accounting.xml.messageResources -->
    <profile>
      <id>struts-config-clientarea-accounting.xml.messageResources-exists</id>
      <activation><file><exists>src/main/webapp/WEB-INF/struts-config-clientarea-accounting.xml.messageResources</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>struts-config-clientarea-accounting.xml.messageResources</id><phase>validate</phase><goals><goal>execute</goal></goals>
                <configuration>
                  <properties>
                    <struts-config-clientarea-accounting.xml.messageResources>${project.basedir}/src/main/webapp/WEB-INF/struts-config-clientarea-accounting.xml.messageResources</struts-config-clientarea-accounting.xml.messageResources>
                  </properties>
                  <source>
                    def file = new File(properties['struts-config-clientarea-accounting.xml.messageResources'])
                    project.properties['struts-config-clientarea-accounting.xml.messageResources'] = file.getText()
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>struts-config-clientarea-accounting.xml.messageResources-missing</id>
      <activation><file><missing>src/main/webapp/WEB-INF/struts-config-clientarea-accounting.xml.messageResources</missing></file></activation>
      <properties>
        <struts-config-clientarea-accounting.xml.messageResources><![CDATA[<!-- struts-config-clientarea-accounting.xml.messageResources: no template file -->]]></struts-config-clientarea-accounting.xml.messageResources>
      </properties>
    </profile>
    <!-- WEB-INF/struts-config-clientarea-control.xml.messageResources -->
    <profile>
      <id>struts-config-clientarea-control.xml.messageResources-exists</id>
      <activation><file><exists>src/main/webapp/WEB-INF/struts-config-clientarea-control.xml.messageResources</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>struts-config-clientarea-control.xml.messageResources</id><phase>validate</phase><goals><goal>execute</goal></goals>
                <configuration>
                  <properties>
                    <struts-config-clientarea-control.xml.messageResources>${project.basedir}/src/main/webapp/WEB-INF/struts-config-clientarea-control.xml.messageResources</struts-config-clientarea-control.xml.messageResources>
                  </properties>
                  <source>
                    def file = new File(properties['struts-config-clientarea-control.xml.messageResources'])
                    project.properties['struts-config-clientarea-control.xml.messageResources'] = file.getText()
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>struts-config-clientarea-control.xml.messageResources-missing</id>
      <activation><file><missing>src/main/webapp/WEB-INF/struts-config-clientarea-control.xml.messageResources</missing></file></activation>
      <properties>
        <struts-config-clientarea-control.xml.messageResources><![CDATA[<!-- struts-config-clientarea-control.xml.messageResources: no template file -->]]></struts-config-clientarea-control.xml.messageResources>
      </properties>
    </profile>
    <!-- WEB-INF/struts-config-clientarea-ticket.xml.messageResources -->
    <profile>
      <id>struts-config-clientarea-ticket.xml.messageResources-exists</id>
      <activation><file><exists>src/main/webapp/WEB-INF/struts-config-clientarea-ticket.xml.messageResources</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>struts-config-clientarea-ticket.xml.messageResources</id><phase>validate</phase><goals><goal>execute</goal></goals>
                <configuration>
                  <properties>
                    <struts-config-clientarea-ticket.xml.messageResources>${project.basedir}/src/main/webapp/WEB-INF/struts-config-clientarea-ticket.xml.messageResources</struts-config-clientarea-ticket.xml.messageResources>
                  </properties>
                  <source>
                    def file = new File(properties['struts-config-clientarea-ticket.xml.messageResources'])
                    project.properties['struts-config-clientarea-ticket.xml.messageResources'] = file.getText()
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>struts-config-clientarea-ticket.xml.messageResources-missing</id>
      <activation><file><missing>src/main/webapp/WEB-INF/struts-config-clientarea-ticket.xml.messageResources</missing></file></activation>
      <properties>
        <struts-config-clientarea-ticket.xml.messageResources><![CDATA[<!-- struts-config-clientarea-ticket.xml.messageResources: no template file -->]]></struts-config-clientarea-ticket.xml.messageResources>
      </properties>
    </profile>
    <!-- WEB-INF/struts-config-clientarea.xml.messageResources -->
    <profile>
      <id>struts-config-clientarea.xml.messageResources-exists</id>
      <activation><file><exists>src/main/webapp/WEB-INF/struts-config-clientarea.xml.messageResources</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>struts-config-clientarea.xml.messageResources</id><phase>validate</phase><goals><goal>execute</goal></goals>
                <configuration>
                  <properties>
                    <struts-config-clientarea.xml.messageResources>${project.basedir}/src/main/webapp/WEB-INF/struts-config-clientarea.xml.messageResources</struts-config-clientarea.xml.messageResources>
                  </properties>
                  <source>
                    def file = new File(properties['struts-config-clientarea.xml.messageResources'])
                    project.properties['struts-config-clientarea.xml.messageResources'] = file.getText()
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>struts-config-clientarea.xml.messageResources-missing</id>
      <activation><file><missing>src/main/webapp/WEB-INF/struts-config-clientarea.xml.messageResources</missing></file></activation>
      <properties>
        <struts-config-clientarea.xml.messageResources><![CDATA[<!-- struts-config-clientarea.xml.messageResources: no template file -->]]></struts-config-clientarea.xml.messageResources>
      </properties>
    </profile>
    <!-- WEB-INF/struts-config-signup.xml.messageResources -->
    <profile>
      <id>struts-config-signup.xml.messageResources-exists</id>
      <activation><file><exists>src/main/webapp/WEB-INF/struts-config-signup.xml.messageResources</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>struts-config-signup.xml.messageResources</id><phase>validate</phase><goals><goal>execute</goal></goals>
                <configuration>
                  <properties>
                    <struts-config-signup.xml.messageResources>${project.basedir}/src/main/webapp/WEB-INF/struts-config-signup.xml.messageResources</struts-config-signup.xml.messageResources>
                  </properties>
                  <source>
                    def file = new File(properties['struts-config-signup.xml.messageResources'])
                    project.properties['struts-config-signup.xml.messageResources'] = file.getText()
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>struts-config-signup.xml.messageResources-missing</id>
      <activation><file><missing>src/main/webapp/WEB-INF/struts-config-signup.xml.messageResources</missing></file></activation>
      <properties>
        <struts-config-signup.xml.messageResources><![CDATA[<!-- struts-config-signup.xml.messageResources: no template file -->]]></struts-config-signup.xml.messageResources>
      </properties>
    </profile>
    <!-- WEB-INF/struts-config.xml.actions -->
    <profile>
      <id>struts-config.xml.actions-exists</id>
      <activation><file><exists>src/main/webapp/WEB-INF/struts-config.xml.actions</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>struts-config.xml.actions</id><phase>validate</phase><goals><goal>execute</goal></goals>
                <configuration>
                  <properties>
                    <struts-config.xml.actions>${project.basedir}/src/main/webapp/WEB-INF/struts-config.xml.actions</struts-config.xml.actions>
                  </properties>
                  <source>
                    def file = new File(properties['struts-config.xml.actions'])
                    project.properties['struts-config.xml.actions'] = file.getText()
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>struts-config.xml.actions-missing</id>
      <activation><file><missing>src/main/webapp/WEB-INF/struts-config.xml.actions</missing></file></activation>
      <properties>
        <struts-config.xml.actions><![CDATA[<!-- struts-config.xml.actions: no template file -->]]></struts-config.xml.actions>
      </properties>
    </profile>
    <!-- WEB-INF/struts-config.xml.messageResources -->
    <profile>
      <id>struts-config.xml.messageResources-exists</id>
      <activation><file><exists>src/main/webapp/WEB-INF/struts-config.xml.messageResources</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>struts-config.xml.messageResources</id><phase>validate</phase><goals><goal>execute</goal></goals>
                <configuration>
                  <properties>
                    <struts-config.xml.messageResources>${project.basedir}/src/main/webapp/WEB-INF/struts-config.xml.messageResources</struts-config.xml.messageResources>
                  </properties>
                  <source>
                    def file = new File(properties['struts-config.xml.messageResources'])
                    project.properties['struts-config.xml.messageResources'] = file.getText()
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>struts-config.xml.messageResources-missing</id>
      <activation><file><missing>src/main/webapp/WEB-INF/struts-config.xml.messageResources</missing></file></activation>
      <properties>
        <struts-config.xml.messageResources><![CDATA[<!-- struts-config.xml.messageResources: no template file -->]]></struts-config.xml.messageResources>
      </properties>
    </profile>
    <!-- WEB-INF/web.xml.contextParams -->
    <profile>
      <id>web.xml.contextParams-exists</id>
      <activation><file><exists>src/main/webapp/WEB-INF/web.xml.contextParams</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>web.xml.contextParams</id><phase>validate</phase><goals><goal>execute</goal></goals>
                <configuration>
                  <properties>
                    <web.xml.contextParams>${project.basedir}/src/main/webapp/WEB-INF/web.xml.contextParams</web.xml.contextParams>
                  </properties>
                  <source>
                    def file = new File(properties['web.xml.contextParams'])
                    project.properties['web.xml.contextParams'] = file.getText()
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>web.xml.contextParams-missing</id>
      <activation><file><missing>src/main/webapp/WEB-INF/web.xml.contextParams</missing></file></activation>
      <properties>
        <web.xml.contextParams><![CDATA[<!-- web.xml.contextParams: no template file -->]]></web.xml.contextParams>
      </properties>
    </profile>
    <!-- WEB-INF/web.xml.struts2Mappings -->
    <profile>
      <id>web.xml.struts2Mappings-exists</id>
      <activation><file><exists>src/main/webapp/WEB-INF/web.xml.struts2Mappings</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>web.xml.struts2Mappings</id><phase>validate</phase><goals><goal>execute</goal></goals>
                <configuration>
                  <properties>
                    <web.xml.struts2Mappings>${project.basedir}/src/main/webapp/WEB-INF/web.xml.struts2Mappings</web.xml.struts2Mappings>
                  </properties>
                  <source>
                    def file = new File(properties['web.xml.struts2Mappings'])
                    project.properties['web.xml.struts2Mappings'] = file.getText()
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>web.xml.struts2Mappings-missing</id>
      <activation><file><missing>src/main/webapp/WEB-INF/web.xml.struts2Mappings</missing></file></activation>
      <properties>
        <web.xml.struts2Mappings><![CDATA[<!-- web.xml.struts2Mappings: no template file -->]]></web.xml.struts2Mappings>
      </properties>
    </profile>
    <!-- WEB-INF/web.xml.strutsInitParams -->
    <profile>
      <id>web.xml.strutsInitParams-exists</id>
      <activation><file><exists>src/main/webapp/WEB-INF/web.xml.strutsInitParams</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>web.xml.strutsInitParams</id><phase>validate</phase><goals><goal>execute</goal></goals>
                <configuration>
                  <properties>
                    <web.xml.strutsInitParams>${project.basedir}/src/main/webapp/WEB-INF/web.xml.strutsInitParams</web.xml.strutsInitParams>
                  </properties>
                  <source>
                    def file = new File(properties['web.xml.strutsInitParams'])
                    project.properties['web.xml.strutsInitParams'] = file.getText()
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>web.xml.strutsInitParams-missing</id>
      <activation><file><missing>src/main/webapp/WEB-INF/web.xml.strutsInitParams</missing></file></activation>
      <properties>
        <web.xml.strutsInitParams><![CDATA[<!-- web.xml.strutsInitParams: no template file -->]]></web.xml.strutsInitParams>
      </properties>
    </profile>
    <!-- WEB-INF/web.xml.servlets -->
    <profile>
      <id>web.xml.servlets-exists</id>
      <activation><file><exists>src/main/webapp/WEB-INF/web.xml.servlets</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>web.xml.servlets</id><phase>validate</phase><goals><goal>execute</goal></goals>
                <configuration>
                  <properties>
                    <web.xml.servlets>${project.basedir}/src/main/webapp/WEB-INF/web.xml.servlets</web.xml.servlets>
                  </properties>
                  <source>
                    def file = new File(properties['web.xml.servlets'])
                    project.properties['web.xml.servlets'] = file.getText()
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>web.xml.servlets-missing</id>
      <activation><file><missing>src/main/webapp/WEB-INF/web.xml.servlets</missing></file></activation>
      <properties>
        <web.xml.servlets><![CDATA[<!-- web.xml.servlets: no template file -->]]></web.xml.servlets>
      </properties>
    </profile>
    <!-- WEB-INF/web.xml.servletMappingsPre -->
    <profile>
      <id>web.xml.servletMappingsPre-exists</id>
      <activation><file><exists>src/main/webapp/WEB-INF/web.xml.servletMappingsPre</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>web.xml.servletMappingsPre</id><phase>validate</phase><goals><goal>execute</goal></goals>
                <configuration>
                  <properties>
                    <web.xml.servletMappingsPre>${project.basedir}/src/main/webapp/WEB-INF/web.xml.servletMappingsPre</web.xml.servletMappingsPre>
                  </properties>
                  <source>
                    def file = new File(properties['web.xml.servletMappingsPre'])
                    project.properties['web.xml.servletMappingsPre'] = file.getText()
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>web.xml.servletMappingsPre-missing</id>
      <activation><file><missing>src/main/webapp/WEB-INF/web.xml.servletMappingsPre</missing></file></activation>
      <properties>
        <web.xml.servletMappingsPre><![CDATA[<!-- web.xml.servletMappingsPre: no template file -->]]></web.xml.servletMappingsPre>
      </properties>
    </profile>
    <!-- WEB-INF/web.xml.servletMappingsPost -->
    <profile>
      <id>web.xml.servletMappingsPost-exists</id>
      <activation><file><exists>src/main/webapp/WEB-INF/web.xml.servletMappingsPost</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.codehaus.gmaven</groupId><artifactId>groovy-maven-plugin</artifactId>
            <executions>
              <execution>
                <id>web.xml.servletMappingsPost</id><phase>validate</phase><goals><goal>execute</goal></goals>
                <configuration>
                  <properties>
                    <web.xml.servletMappingsPost>${project.basedir}/src/main/webapp/WEB-INF/web.xml.servletMappingsPost</web.xml.servletMappingsPost>
                  </properties>
                  <source>
                    def file = new File(properties['web.xml.servletMappingsPost'])
                    project.properties['web.xml.servletMappingsPost'] = file.getText()
                  </source>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>web.xml.servletMappingsPost-missing</id>
      <activation><file><missing>src/main/webapp/WEB-INF/web.xml.servletMappingsPost</missing></file></activation>
      <properties>
        <web.xml.servletMappingsPost><![CDATA[<!-- web.xml.servletMappingsPost: no template file -->]]></web.xml.servletMappingsPost>
      </properties>
    </profile>
    <profile>
      <id>offlineLinks</id><activation><file><exists>src/main/java</exists></file></activation>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId><artifactId>maven-dependency-plugin</artifactId>
            <executions>
              <execution>
                <id>unpack.offlineLinks</id><phase>${unpack.offlineLinks.phase}</phase><goals><goal>unpack</goal></goals>
                <configuration>
                  <artifactItems>
                    <!-- Direct -->
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-collections</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-collections</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-concurrent</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-concurrent</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-encoding</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-encoding</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-encoding-servlet</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-encoding-servlet</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-encoding-taglib</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-encoding-taglib</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-fluent-html</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-fluent-html</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-fluent-html-any</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-fluent-html-any</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-fluent-html-servlet</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-fluent-html-servlet</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-fluent-html-util</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-fluent-html-util</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-hodgepodge</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-hodgepodge</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-io-buffer</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-io-buffer</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-lang</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-lang</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-net-types</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-net-types</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-payments-api</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-payments-api</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-security</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-security</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-servlet-filter</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-servlet-filter</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-servlet-last-modified</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-servlet-last-modified</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-servlet-util</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-servlet-util</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-sql</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-sql</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-style</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-style</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-taglib</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-taglib</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-tempfiles-servlet</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-tempfiles-servlet</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-web-resources-registry</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-web-resources-registry</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-web-resources-renderer</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-web-resources-renderer</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoapps</groupId><artifactId>ao-web-resources-servlet</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoapps/ao-web-resources-servlet</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoindustries</groupId><artifactId>aoserv-client</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoindustries/aoserv-client</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoindustries</groupId><artifactId>aoserv-credit-cards</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoindustries/aoserv-credit-cards</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.aoindustries</groupId><artifactId>aoserv-daemon-client</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.aoindustries/aoserv-daemon-client</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/org.apache.commons/commons-collections4</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>commons-validator</groupId><artifactId>commons-validator</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/commons-validator/commons-validator</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.google.api</groupId><artifactId>gax</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.google.api/gax</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.google.auth</groupId><artifactId>google-auth-library-credentials</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.google.auth/google-auth-library-credentials</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.google.auth</groupId><artifactId>google-auth-library-oauth2-http</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.google.auth/google-auth-library-oauth2-http</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>com.google.cloud</groupId><artifactId>google-cloud-recaptchaenterprise</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.google.cloud/google-cloud-recaptchaenterprise</outputDirectory>
                    </artifactItem>
                    <!-- ao-javadoc-offline: <groupId>jakarta.mail</groupId><artifactId>jakarta.mail-api</artifactId><classifier>javadoc</classifier> -->
                    <!-- ao-javadoc-offline: <groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><classifier>javadoc</classifier> -->
                    <!-- ao-javadoc-offline: <groupId>jakarta.servlet.jsp</groupId><artifactId>jakarta.servlet.jsp-api</artifactId><classifier>javadoc</classifier> -->
                    <!-- ao-javadoc-offline: <groupId>jakarta.websocket</groupId><artifactId>jakarta.websocket-api</artifactId><classifier>javadoc</classifier> -->
                    <!-- ao-javadoc-offline: <groupId>jakarta.websocket</groupId><artifactId>jakarta.websocket-client-api</artifactId><classifier>javadoc</classifier> -->
                    <artifactItem>
                      <groupId>com.google.api.grpc</groupId><artifactId>proto-google-cloud-recaptchaenterprise-v1</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/com.google.api.grpc/proto-google-cloud-recaptchaenterprise-v1</outputDirectory>
                    </artifactItem>
                    <!-- JSP Only: <groupId>com.semanticcms</groupId><artifactId>semanticcms-core-taglib</artifactId><classifier>javadoc</classifier> -->
                    <artifactItem>
                      <groupId>io.github.weblegacy</groupId><artifactId>struts-core</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/io.github.weblegacy/struts-core</outputDirectory>
                    </artifactItem>
                    <!-- JSP Only: <groupId>io.github.weblegacy</groupId><artifactId>struts-taglib</artifactId><classifier>javadoc</classifier> -->
                    <artifactItem>
                      <groupId>org.apache.struts</groupId><artifactId>struts2-convention-plugin</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/org.apache.struts/struts2-convention-plugin</outputDirectory>
                    </artifactItem>
                    <artifactItem>
                      <groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><classifier>javadoc</classifier>
                      <includes>element-list, package-list</includes>
                      <outputDirectory>${project.build.directory}/offlineLinks/org.apache.struts/struts2-core</outputDirectory>
                    </artifactItem>
                  </artifactItems>
                </configuration>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId>
            <configuration>
              <offlineLinks combine.children="append">
                <!-- Direct -->
                <offlineLink>
                  <url>https://oss.aoapps.com/collections/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-collections</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/concurrent/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-concurrent</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/encoding/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-encoding</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/encoding/servlet/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-encoding-servlet</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/encoding/taglib/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-encoding-taglib</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/fluent-html/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-fluent-html</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/fluent-html/any/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-fluent-html-any</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/fluent-html/servlet/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-fluent-html-servlet</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/fluent-html/util/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-fluent-html-util</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/hodgepodge/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-hodgepodge</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/io-buffer/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-io-buffer</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/lang/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-lang</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/net-types/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-net-types</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/payments/api/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-payments-api</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/security/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-security</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/servlet-filter/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-servlet-filter</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/servlet-last-modified/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-servlet-last-modified</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/servlet-util/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-servlet-util</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/sql/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-sql</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/style/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-style</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/taglib/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-taglib</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/tempfiles/servlet/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-tempfiles-servlet</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/web-resources/registry/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-web-resources-registry</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/web-resources/renderer/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-web-resources-renderer</location>
                </offlineLink>
                <offlineLink>
                  <url>https://oss.aoapps.com/web-resources/servlet/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoapps/ao-web-resources-servlet</location>
                </offlineLink>
                <offlineLink>
                  <url>https://aoindustries.com/aoserv/client/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoindustries/aoserv-client</location>
                </offlineLink>
                <offlineLink>
                  <url>https://aoindustries.com/aoserv/credit-cards/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoindustries/aoserv-credit-cards</location>
                </offlineLink>
                <offlineLink>
                  <url>https://aoindustries.com/aoserv/daemon/client/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/com.aoindustries/aoserv-daemon-client</location>
                </offlineLink>
                <offlineLink>
                  <url>https://commons.apache.org/proper/commons-collections/javadocs/api-${org.apache.commons:commons-collections4:jar.version}/</url>
                  <location>${project.build.directory}/offlineLinks/org.apache.commons/commons-collections4</location>
                </offlineLink>
                <offlineLink>
                  <url>https://commons.apache.org/proper/commons-validator/apidocs/</url>
                  <location>${project.build.directory}/offlineLinks/commons-validator/commons-validator</location>
                </offlineLink>
                <offlineLink>
                  <url>https://javadoc.io/doc/com.google.api/gax/${com.google.api:gax:jar.version}/</url>
                  <location>${project.build.directory}/offlineLinks/com.google.api/gax</location>
                </offlineLink>
                <offlineLink>
                  <url>https://javadoc.io/doc/com.google.auth/google-auth-library-credentials/${com.google.auth:google-auth-library-credentials:jar.version}/</url>
                  <location>${project.build.directory}/offlineLinks/com.google.auth/google-auth-library-credentials</location>
                </offlineLink>
                <offlineLink>
                  <url>https://javadoc.io/doc/com.google.auth/google-auth-library-oauth2-http/${com.google.auth:google-auth-library-oauth2-http:jar.version}/</url>
                  <location>${project.build.directory}/offlineLinks/com.google.auth/google-auth-library-oauth2-http</location>
                </offlineLink>
                <offlineLink>
                  <url>https://javadoc.io/doc/com.google.cloud/google-cloud-recaptchaenterprise/${com.google.cloud:google-cloud-recaptchaenterprise:jar.version}/</url>
                  <location>${project.build.directory}/offlineLinks/com.google.cloud/google-cloud-recaptchaenterprise</location>
                </offlineLink>
                <!-- ao-javadoc-offline: <groupId>jakarta.mail</groupId><artifactId>jakarta.mail-api</artifactId><classifier>javadoc</classifier> -->
                <!-- ao-javadoc-offline: <groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><classifier>javadoc</classifier> -->
                <!-- ao-javadoc-offline: <groupId>jakarta.servlet.jsp</groupId><artifactId>jakarta.servlet.jsp-api</artifactId><classifier>javadoc</classifier> -->
                <!-- ao-javadoc-offline: <groupId>jakarta.websocket</groupId><artifactId>jakarta.websocket-api</artifactId><classifier>javadoc</classifier> -->
                <!-- ao-javadoc-offline: <groupId>jakarta.websocket</groupId><artifactId>jakarta.websocket-client-api</artifactId><classifier>javadoc</classifier> -->
                <offlineLink>
                  <url>https://javadoc.io/doc/com.google.api.grpc/proto-google-cloud-recaptchaenterprise-v1/${com.google.api.grpc:proto-google-cloud-recaptchaenterprise-v1:jar.version}/</url>
                  <location>${project.build.directory}/offlineLinks/com.google.api.grpc/proto-google-cloud-recaptchaenterprise-v1</location>
                </offlineLink>
                <!-- JSP Only: <groupId>com.semanticcms</groupId><artifactId>semanticcms-core-taglib</artifactId><classifier>javadoc</classifier> -->
                <offlineLink>
                  <url>https://javadoc.io/doc/io.github.weblegacy/struts-core/${io.github.weblegacy:struts-core:jar.version}/</url>
                  <location>${project.build.directory}/offlineLinks/io.github.weblegacy/struts-core</location>
                </offlineLink>
                <!-- JSP Only: <groupId>io.github.weblegacy</groupId><artifactId>struts-taglib</artifactId><classifier>javadoc</classifier> -->
                <offlineLink>
                  <url>https://javadoc.io/doc/org.apache.struts/struts2-convention-plugin/${org.apache.struts:struts2-convention-plugin:jar.version}/</url>
                  <location>${project.build.directory}/offlineLinks/org.apache.struts/struts2-convention-plugin</location>
                </offlineLink>
                <offlineLink>
                  <url>https://javadoc.io/doc/org.apache.struts/struts2-core/${org.apache.struts:struts2-core:jar.version}/</url>
                  <location>${project.build.directory}/offlineLinks/org.apache.struts/struts2-core</location>
                </offlineLink>
              </offlineLinks>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
    <!-- Do not archive classes in "skip-war" profile -->
    <profile>
      <id>skip-war</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId>
            <configuration>
              <archiveClasses>false</archiveClasses>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <!-- Features only enabled during development time -->
      <id>development</id>
      <properties>
        <!-- Allow unsecure session cookies in development -->
        <session.cookie.secure>false</session.cookie.secure>
        <!-- Struts 2 -->
        <log4j2.struts2.level>info</log4j2.struts2.level>
        <log4j2.xwork2.level>info</log4j2.xwork2.level>
      </properties>
      <dependencies>
        <!-- Struts 2 Debugging: https://struts.apache.org/getting-started/debugging-struts.html -->
        <dependency>
          <groupId>org.apache.struts</groupId><artifactId>struts2-config-browser-plugin</artifactId><version>7.4.0</version>
          <scope>runtime</scope>
        </dependency>
        <!-- Own -devel package -->
        <dependency>
          <groupId>com.aoindustries</groupId><artifactId>aoweb-struts-devel</artifactId><version>4.0.0-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <!--
          *-devel packages for all dependencies except tests (direct, runtime, transitive, and BOM)
        -->
        <!-- Direct -->
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-collections-devel</artifactId> -->
        <dependency>
          <groupId>com.aoapps</groupId><artifactId>ao-encoding-devel</artifactId><version>7.1.0-POST-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-encoding-servlet-devel</artifactId> -->
        <dependency>
          <groupId>com.aoapps</groupId><artifactId>ao-encoding-taglib-devel</artifactId><version>6.0.0-POST-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-fluent-html-devel</artifactId> -->
        <dependency>
          <groupId>com.aoapps</groupId><artifactId>ao-fluent-html-any-devel</artifactId><version>0.9.0-POST-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-fluent-html-servlet-devel</artifactId> -->
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-fluent-html-util-devel</artifactId> -->
        <dependency>
          <groupId>com.aoapps</groupId><artifactId>ao-hodgepodge-devel</artifactId><version>6.1.0-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-io-buffer-devel</artifactId> -->
        <dependency>
          <groupId>com.aoapps</groupId><artifactId>ao-lang-devel</artifactId><version>5.9.0-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <dependency>
          <groupId>com.aoapps</groupId><artifactId>ao-net-types-devel</artifactId><version>3.0.0-POST-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <dependency>
          <groupId>com.aoapps</groupId><artifactId>ao-payments-api-devel</artifactId><version>3.0.0-POST-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-security-devel</artifactId> -->
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-servlet-filter-devel</artifactId> -->
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-servlet-last-modified-devel</artifactId> -->
        <dependency>
          <groupId>com.aoapps</groupId><artifactId>ao-servlet-util-devel</artifactId><version>6.0.2-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <dependency>
          <groupId>com.aoapps</groupId><artifactId>ao-sql-devel</artifactId><version>2.1.0-POST-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-style-devel</artifactId> -->
        <dependency>
          <groupId>com.aoapps</groupId><artifactId>ao-taglib-devel</artifactId><version>10.0.0-POST-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-tempfiles-servlet-devel</artifactId> -->
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-web-resources-registry-devel</artifactId> -->
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-web-resources-renderer-devel</artifactId> -->
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-web-resources-servlet-devel</artifactId> -->
        <dependency>
          <groupId>com.aoindustries</groupId><artifactId>aoserv-client-devel</artifactId><version>1.92.3-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <!-- No -devel: <groupId>com.aoindustries</groupId><artifactId>aoserv-credit-cards-devel</artifactId> -->
        <!-- No -devel: <groupId>com.aoindustries</groupId><artifactId>aoserv-daemon-client-devel</artifactId> -->
        <!-- No -devel: <groupId>org.apache.commons</groupId><artifactId>commons-collections4-devel</artifactId> -->
        <!-- No -devel: <groupId>commons-validator</groupId><artifactId>commons-validator-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.api</groupId><artifactId>gax-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.auth</groupId><artifactId>google-auth-library-credentials-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.auth</groupId><artifactId>google-auth-library-oauth2-http-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.cloud</groupId><artifactId>google-cloud-recaptchaenterprise-devel</artifactId> -->
        <!-- No -devel: <groupId>jakarta.mail</groupId><artifactId>jakarta.mail-api-devel</artifactId> -->
        <!-- No -devel: <groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api-devel</artifactId> -->
        <!-- No -devel: <groupId>jakarta.servlet.jsp</groupId><artifactId>jakarta.servlet.jsp-api-devel</artifactId> -->
        <!-- No -devel: <groupId>jakarta.websocket</groupId><artifactId>jakarta.websocket-api-devel</artifactId> -->
        <!-- No -devel: <groupId>jakarta.websocket</groupId><artifactId>jakarta.websocket-client-api-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.api.grpc</groupId><artifactId>proto-google-cloud-recaptchaenterprise-v1-devel</artifactId> -->
        <dependency>
          <groupId>com.semanticcms</groupId><artifactId>semanticcms-core-taglib-devel</artifactId><version>2.0.1-POST-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <!-- No -devel: <groupId>io.github.weblegacy</groupId><artifactId>struts-core-devel</artifactId> -->
        <!-- No -devel: <groupId>io.github.weblegacy</groupId><artifactId>struts-taglib-devel</artifactId> -->
        <!-- No -devel: <groupId>org.apache.struts</groupId><artifactId>struts2-convention-plugin-devel</artifactId> -->
        <!-- No -devel: <groupId>org.apache.struts</groupId><artifactId>struts2-core-devel</artifactId> -->
        <!-- Transitive -->
        <!-- No -devel: <groupId>org.codehaus.mojo</groupId><artifactId>animal-sniffer-annotations-devel</artifactId> -->
        <!-- No -devel: <groupId>org.antlr</groupId><artifactId>antlr4-runtime-devel</artifactId> -->
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-tempfiles-devel</artifactId> -->
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-tlds-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.api</groupId><artifactId>api-common-devel</artifactId> -->
        <!-- No -devel: <groupId>org.ow2.asm</groupId><artifactId>asm-devel</artifactId> -->
        <!-- No -devel: <groupId>org.ow2.asm</groupId><artifactId>asm-commons-devel</artifactId> -->
        <!-- No -devel: <groupId>org.ow2.asm</groupId><artifactId>asm-tree-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.auto.value</groupId><artifactId>auto-value-annotations-devel</artifactId> -->
        <!-- No -devel: <groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine-devel</artifactId> -->
        <!-- No -devel: <groupId>commons-beanutils</groupId><artifactId>commons-beanutils-devel</artifactId> -->
        <!-- No -devel: <groupId>io.github.weblegacy</groupId><artifactId>commons-chain-devel</artifactId> -->
        <!-- No -devel: <groupId>io.github.weblegacy</groupId><artifactId>commons-chain-web-devel</artifactId> -->
        <!-- No -devel: <groupId>io.github.weblegacy</groupId><artifactId>commons-chain-web-jakarta-devel</artifactId> -->
        <!-- No -devel: <groupId>io.github.weblegacy</groupId><artifactId>commons-chain-web-jakarta-servlet-devel</artifactId> -->
        <!-- No -devel: <groupId>commons-codec</groupId><artifactId>commons-codec-devel</artifactId> -->
        <!-- No -devel: <groupId>commons-collections</groupId><artifactId>commons-collections-devel</artifactId> -->
        <!-- No -devel: <groupId>commons-digester</groupId><artifactId>commons-digester-devel</artifactId> -->
        <!-- No -devel: <groupId>org.apache.commons</groupId><artifactId>commons-fileupload2-core-devel</artifactId> -->
        <!-- No -devel: <groupId>org.apache.commons</groupId><artifactId>commons-fileupload2-jakarta-devel</artifactId> -->
        <!-- No -devel: <groupId>org.apache.commons</groupId><artifactId>commons-fileupload2-jakarta-servlet6-devel</artifactId> -->
        <!-- No -devel: <groupId>commons-io</groupId><artifactId>commons-io-devel</artifactId> -->
        <!-- No -devel: <groupId>org.apache.commons</groupId><artifactId>commons-lang3-devel</artifactId> -->
        <!-- No -devel: <groupId>commons-logging</groupId><artifactId>commons-logging-devel</artifactId> -->
        <!-- No -devel: <groupId>org.apache.commons</groupId><artifactId>commons-text-devel</artifactId> -->
        <!-- No -devel: <groupId>org.conscrypt</groupId><artifactId>conscrypt-openjdk-uber-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.errorprone</groupId><artifactId>error_prone_annotations-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.guava</groupId><artifactId>failureaccess-devel</artifactId> -->
        <!-- No -devel: <groupId>org.freemarker</groupId><artifactId>freemarker-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.api</groupId><artifactId>gax-grpc-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.api</groupId><artifactId>gax-httpjson-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.http-client</groupId><artifactId>google-http-client-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.http-client</groupId><artifactId>google-http-client-gson-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-alts-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-api-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-auth-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-context-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-core-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-inprocess-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-netty-shaded-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-protobuf-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-stub-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.code.gson</groupId><artifactId>gson-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.guava</groupId><artifactId>guava-devel</artifactId> -->
        <!-- No -devel: <groupId>org.apache.httpcomponents</groupId><artifactId>httpclient-devel</artifactId> -->
        <!-- No -devel: <groupId>org.apache.httpcomponents</groupId><artifactId>httpcore-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.j2objc</groupId><artifactId>j2objc-annotations-devel</artifactId> -->
        <!-- No -devel: <groupId>jakarta.activation</groupId><artifactId>jakarta.activation-api-devel</artifactId> -->
        <!-- No -devel: <groupId>jakarta.el</groupId><artifactId>jakarta.el-api-devel</artifactId> -->
        <!-- No -devel: <groupId>jakarta.servlet.jsp.jstl</groupId><artifactId>jakarta.servlet.jsp.jstl-api-devel</artifactId> -->
        <!-- No -devel: <groupId>org.javassist</groupId><artifactId>javassist-devel</artifactId> -->
        <!-- No -devel: <groupId>javax.annotation</groupId><artifactId>javax.annotation-api-devel</artifactId> -->
        <!-- No -devel: <groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j-devel</artifactId> -->
        <!-- No -devel: <groupId>org.jspecify</groupId><artifactId>jspecify-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.code.findbugs</groupId><artifactId>jsr305-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.guava</groupId><artifactId>listenablefuture-devel</artifactId> -->
        <!-- No -devel: <groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api-devel</artifactId> -->
        <!-- No -devel: <groupId>ognl</groupId><artifactId>ognl-devel</artifactId> -->
        <!-- No -devel: <groupId>io.opencensus</groupId><artifactId>opencensus-api-devel</artifactId> -->
        <!-- No -devel: <groupId>io.opencensus</groupId><artifactId>opencensus-contrib-http-util-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.api.grpc</groupId><artifactId>proto-google-cloud-recaptchaenterprise-v1beta1-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.api.grpc</groupId><artifactId>proto-google-common-protos-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.protobuf</groupId><artifactId>protobuf-java-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.protobuf</groupId><artifactId>protobuf-java-util-devel</artifactId> -->
        <!-- No -devel: <groupId>com.semanticcms</groupId><artifactId>semanticcms-core-model-devel</artifactId> -->
        <!-- No -devel: <groupId>org.slf4j</groupId><artifactId>slf4j-api-devel</artifactId> -->
        <!-- No -devel: <groupId>org.threeten</groupId><artifactId>threetenbp-devel</artifactId> -->
        <!-- No -devel: <groupId>org.webjars</groupId><artifactId>webjars-locator-lite-devel</artifactId> -->
        <!-- Runtime Direct -->
        <!-- No -devel: <groupId>org.eclipse.angus</groupId><artifactId>angus-mail-devel</artifactId> -->
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-mime-mappings-devel</artifactId> -->
        <!-- No -devel: <groupId>org.glassfish.web</groupId><artifactId>jakarta.servlet.jsp.jstl-devel</artifactId> -->
        <!-- No -devel: <groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core-devel</artifactId> -->
        <dependency>
          <groupId>com.semanticcms</groupId><artifactId>semanticcms-core-servlet-devel</artifactId><version>2.0.0-POST-SNAPSHOT</version>
          <scope>runtime</scope>
        </dependency>
        <!-- No -devel: <groupId>org.slf4j</groupId><artifactId>slf4j-jdk14-devel</artifactId> -->
        <!-- Runtime Transitive -->
        <!-- No -devel: <groupId>org.eclipse.angus</groupId><artifactId>angus-activation-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.android</groupId><artifactId>annotations-devel</artifactId> -->
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-concurrent-devel</artifactId> -->
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>ao-servlet-subrequest-devel</artifactId> -->
        <!-- No -devel: <groupId>dev.cel</groupId><artifactId>common-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-googleapis-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-protobuf-lite-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-services-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-util-devel</artifactId> -->
        <!-- No -devel: <groupId>io.grpc</groupId><artifactId>grpc-xds-devel</artifactId> -->
        <!-- No -devel: <groupId>io.perfmark</groupId><artifactId>perfmark-api-devel</artifactId> -->
        <!-- No -devel: <groupId>dev.cel</groupId><artifactId>protobuf-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.re2j</groupId><artifactId>re2j-devel</artifactId> -->
        <!-- No -devel: <groupId>dev.cel</groupId><artifactId>runtime-devel</artifactId> -->
        <!-- No -devel: <groupId>org.threeten</groupId><artifactId>threeten-extra-devel</artifactId> -->
        <!-- Imports -->
        <!-- No -devel: <groupId>com.aoapps</groupId><artifactId>jakartaee-web-profile-bom-devel</artifactId> -->
        <!-- No -devel: <groupId>com.google.cloud</groupId><artifactId>libraries-bom-devel</artifactId> -->
      </dependencies>
    </profile>
    <profile>
      <id>jenkins-deploy</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId><artifactId>maven-antrun-plugin</artifactId>
            <executions>
              <execution>
                <!-- Already substituted -->
                <id>substitute-templates</id><phase>none</phase>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </profile>
    <profile>
      <id>release</id>
      <properties>
        <!--
          Newer plugins are failing on release builds:
          error: -\-add-modules ALL-MODULE-PATH can only be used when compiling the unnamed module or when compiling in the context of an automatic module

          This is caused by the project being detected as a modular build, despite the exclusions via Private-Package
          and the added Automatic-Module-Name manifest entry.

          Specifically excluding module-info.java from javadoc does not solve the issue.

          Could be related:
          https://issues.apache.org/jira/browse/MJAVADOC-586
          https://bugs.openjdk.org/browse/JDK-8252531 (we also run javadoc in package phase)

          Workaround by using old version of maven-javadoc-plugin.
        -->
        <org.apache.maven.plugins.maven-javadoc-plugin.version>${org.apache.maven.plugins.maven-javadoc-plugin.version.compat}</org.apache.maven.plugins.maven-javadoc-plugin.version>
        <copy-element-list-to-package-list-before-javadoc.phase>prepare-package</copy-element-list-to-package-list-before-javadoc.phase>
      </properties>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId>
            <configuration>
              <!--
                Releases use "Automatic-Module-Name" instead of "module-info.java"
                since has direct dependencies that are not yet modularized:
                commons-collections-3.2.2.jar
                commons-digester-2.1.jar
                gax-2.72.2.jar
                google-cloud-recaptchaenterprise-3.78.0.jar
                jsr305-3.0.2.jar
                proto-google-cloud-recaptchaenterprise-v1-3.78.0.jar
                struts2-convention-plugin-7.4.0.jar
                struts2-core-7.4.0.jar
              -->
              <archive>
                <manifestEntries>
                  <Automatic-Module-Name>${module.name}</Automatic-Module-Name>
                </manifestEntries>
              </archive>
              <packagingExcludes>
                <!-- Default Excludes -->
                ${maven-war-plugin.packagingExcludes.default}
                <!-- Additional Excludes -->
                ,aoweb-struts-devel-*.jar
                <!-- Exclude module-info due to named dependencies-->
                ,WEB-INF/classes/module-info.class
              </packagingExcludes>
              <!-- There is no way to exclude module-info.class from secondary artifact, just don't attach -->
              <attachClasses>false</attachClasses>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </profile>
  </profiles>

  <dependencyManagement>
    <dependencies>
      <!-- Direct -->
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-collections</artifactId><version>4.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-concurrent</artifactId><version>4.1.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-encoding</artifactId><version>7.1.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-encoding-servlet</artifactId><version>5.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-encoding-taglib</artifactId><version>6.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-fluent-html</artifactId><version>0.8.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-fluent-html-any</artifactId><version>0.9.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-fluent-html-servlet</artifactId><version>0.9.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-fluent-html-util</artifactId><version>0.8.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-hodgepodge</artifactId><version>6.1.0-SNAPSHOT<!-- ${POST-SNAPSHOT} --></version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-io-buffer</artifactId><version>4.2.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-lang</artifactId><version>5.9.0-SNAPSHOT<!-- ${POST-SNAPSHOT} --></version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-net-types</artifactId><version>3.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-payments-api</artifactId><version>3.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-security</artifactId><version>3.3.2-SNAPSHOT<!-- ${POST-SNAPSHOT} --></version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-servlet-filter</artifactId><version>4.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-servlet-last-modified</artifactId><version>4.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-servlet-util</artifactId><version>6.0.2-SNAPSHOT<!-- ${POST-SNAPSHOT} --></version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-sql</artifactId><version>2.1.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-style</artifactId><version>3.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-taglib</artifactId><version>10.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-tempfiles-servlet</artifactId><version>4.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-web-resources-registry</artifactId><version>0.7.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-web-resources-renderer</artifactId><version>0.7.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-web-resources-servlet</artifactId><version>0.7.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoindustries</groupId><artifactId>aoserv-client</artifactId><version>1.92.3-SNAPSHOT<!-- ${POST-SNAPSHOT} --></version>
      </dependency>
      <dependency>
        <groupId>com.aoindustries</groupId><artifactId>aoserv-credit-cards</artifactId><version>3.1.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoindustries</groupId><artifactId>aoserv-daemon-client</artifactId><version>1.92.1${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.6.0</version>
      </dependency>
      <dependency>
        <groupId>commons-validator</groupId><artifactId>commons-validator</artifactId><version>1.11.0</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.api</groupId><artifactId>gax</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.auth</groupId><artifactId>google-auth-library-credentials</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.auth</groupId><artifactId>google-auth-library-oauth2-http</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.cloud</groupId><artifactId>google-cloud-recaptchaenterprise</artifactId> -->
      <dependency>
        <groupId>jakarta.mail</groupId><artifactId>jakarta.mail-api</artifactId><version>2.1.5</version>
      </dependency>
      <dependency>
        <groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>jakarta.servlet.jsp</groupId><artifactId>jakarta.servlet.jsp-api</artifactId><version>3.1.1</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>jakarta.websocket</groupId><artifactId>jakarta.websocket-api</artifactId><version>2.1.1</version>
        <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>jakarta.websocket</groupId><artifactId>jakarta.websocket-client-api</artifactId><version>2.1.1</version>
        <scope>provided</scope>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.api.grpc</groupId><artifactId>proto-google-cloud-recaptchaenterprise-v1</artifactId> -->
      <dependency>
        <groupId>com.semanticcms</groupId><artifactId>semanticcms-core-taglib</artifactId><version>2.0.1${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>io.github.weblegacy</groupId><artifactId>struts-core</artifactId><version>1.5.0-RC2</version>
      </dependency>
      <dependency>
        <groupId>io.github.weblegacy</groupId><artifactId>struts-taglib</artifactId><version>1.5.0-RC2</version>
      </dependency>
      <dependency>
        <groupId>org.apache.struts</groupId><artifactId>struts2-convention-plugin</artifactId><version>7.4.0</version>
      </dependency>
      <dependency>
        <groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>7.4.0</version>
      </dependency>
      <!-- Transitive -->
      <!-- com.google.cloud:libraries-bom: <groupId>org.codehaus.mojo</groupId><artifactId>animal-sniffer-annotations</artifactId> -->
      <dependency>
        <groupId>org.antlr</groupId><artifactId>antlr4-runtime</artifactId><version>4.13.2</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-tempfiles</artifactId><version>3.1.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-tlds</artifactId><version>2.1.0${POST-SNAPSHOT}</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.api</groupId><artifactId>api-common</artifactId> -->
      <dependency>
        <groupId>org.ow2.asm</groupId><artifactId>asm</artifactId><version>9.11.1</version>
      </dependency>
      <dependency>
        <groupId>org.ow2.asm</groupId><artifactId>asm-commons</artifactId><version>9.11.1</version>
      </dependency>
      <dependency>
        <groupId>org.ow2.asm</groupId><artifactId>asm-tree</artifactId><version>9.11.1</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.auto.value</groupId><artifactId>auto-value-annotations</artifactId> -->
      <dependency>
        <groupId>com.github.ben-manes.caffeine</groupId><artifactId>caffeine</artifactId><version>3.3.1</version>
      </dependency>
      <dependency>
        <groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.11.0</version>
      </dependency>
      <dependency>
        <groupId>io.github.weblegacy</groupId><artifactId>commons-chain</artifactId><version>1.3.0</version>
      </dependency>
      <dependency>
        <groupId>io.github.weblegacy</groupId><artifactId>commons-chain-web</artifactId><version>1.3.0</version>
      </dependency>
      <dependency>
        <groupId>io.github.weblegacy</groupId><artifactId>commons-chain-web-jakarta</artifactId><version>1.3.0</version>
      </dependency>
      <dependency>
        <groupId>io.github.weblegacy</groupId><artifactId>commons-chain-web-jakarta-servlet</artifactId><version>1.3.0</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>commons-codec</groupId><artifactId>commons-codec</artifactId> -->
      <dependency>
        <groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.2</version>
      </dependency>
      <dependency>
        <groupId>commons-digester</groupId><artifactId>commons-digester</artifactId><version>2.1</version>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId><artifactId>commons-fileupload2-core</artifactId><version>2.0.0-M5</version>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId><artifactId>commons-fileupload2-jakarta</artifactId><version>2.0.0-M1</version>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId><artifactId>commons-fileupload2-jakarta-servlet6</artifactId><version>2.0.0-M5</version>
      </dependency>
      <dependency>
        <groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.22.0</version>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.21.0</version>
      </dependency>
      <dependency>
        <groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.4.0</version>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId><artifactId>commons-text</artifactId><version>1.15.0</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>org.conscrypt</groupId><artifactId>conscrypt-openjdk-uber</artifactId> -->
      <dependency>
        <groupId>com.google.errorprone</groupId><artifactId>error_prone_annotations</artifactId><version>2.52.0</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.guava</groupId><artifactId>failureaccess</artifactId> -->
      <dependency>
        <groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.35</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.api</groupId><artifactId>gax-grpc</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.api</groupId><artifactId>gax-httpjson</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.http-client</groupId><artifactId>google-http-client</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.http-client</groupId><artifactId>google-http-client-gson</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-alts</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-api</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-auth</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-context</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-core</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-inprocess</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-netty-shaded</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.code.gson</groupId><artifactId>gson</artifactId> -->
      <dependency>
        <groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>33.8.0-jre</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>org.apache.httpcomponents</groupId><artifactId>httpcore</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.j2objc</groupId><artifactId>j2objc-annotations</artifactId> -->
      <dependency>
        <groupId>jakarta.activation</groupId><artifactId>jakarta.activation-api</artifactId><version>2.1.4</version>
      </dependency>
      <dependency>
        <groupId>jakarta.el</groupId><artifactId>jakarta.el-api</artifactId><version>5.0.1</version>
        <scope>provided</scope>
      </dependency>
      <!-- jakartaee-web-profile-bom: <groupId>jakarta.servlet.jsp.jstl</groupId><artifactId>jakarta.servlet.jsp.jstl-api</artifactId> -->
      <dependency>
        <groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.33.0-GA</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>javax.annotation</groupId><artifactId>javax.annotation-api</artifactId> -->
      <dependency>
        <groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>2.0.20</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>org.jspecify</groupId><artifactId>jspecify</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.code.findbugs</groupId><artifactId>jsr305</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.guava</groupId><artifactId>listenablefuture</artifactId> -->
      <dependency>
        <groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.26.1</version>
      </dependency>
      <dependency>
        <groupId>ognl</groupId><artifactId>ognl</artifactId><version>3.4.17</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>io.opencensus</groupId><artifactId>opencensus-api</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.opencensus</groupId><artifactId>opencensus-contrib-http-util</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.api.grpc</groupId><artifactId>proto-google-cloud-recaptchaenterprise-v1beta1</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.api.grpc</groupId><artifactId>proto-google-common-protos</artifactId> -->
      <dependency>
        <groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>4.36.2</version>
      </dependency>
      <dependency>
        <groupId>com.google.protobuf</groupId><artifactId>protobuf-java-util</artifactId><version>4.36.2</version>
      </dependency>
      <dependency>
        <groupId>com.semanticcms</groupId><artifactId>semanticcms-core-model</artifactId><version>2.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.20</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>org.threeten</groupId><artifactId>threetenbp</artifactId> -->
      <dependency>
        <groupId>org.webjars</groupId><artifactId>webjars-locator-lite</artifactId><version>1.1.5</version>
      </dependency>
      <!-- Runtime Direct -->
      <dependency>
        <groupId>org.eclipse.angus</groupId><artifactId>angus-mail</artifactId><version>2.0.5</version>
      </dependency>
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-mime-mappings</artifactId><version>2.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <!-- jakartaee-web-profile-bom: <groupId>org.glassfish.web</groupId><artifactId>jakarta.servlet.jsp.jstl</artifactId> -->
      <dependency>
        <groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.26.1</version>
      </dependency>
      <dependency>
        <groupId>com.semanticcms</groupId><artifactId>semanticcms-core-servlet</artifactId><version>2.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <dependency>
        <groupId>org.slf4j</groupId><artifactId>slf4j-jdk14</artifactId><version>2.0.20</version>
      </dependency>
      <!-- Runtime Transitive -->
      <dependency>
        <groupId>org.eclipse.angus</groupId><artifactId>angus-activation</artifactId><version>2.0.3</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.android</groupId><artifactId>annotations</artifactId> -->
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>ao-servlet-subrequest</artifactId><version>3.0.0${POST-SNAPSHOT}</version>
      </dependency>
      <!-- com.google.cloud:libraries-bom: <groupId>dev.cel</groupId><artifactId>common</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-googleapis</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-protobuf-lite</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-services</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-util</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.grpc</groupId><artifactId>grpc-xds</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>io.perfmark</groupId><artifactId>perfmark-api</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>dev.cel</groupId><artifactId>protobuf</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>com.google.re2j</groupId><artifactId>re2j</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>dev.cel</groupId><artifactId>runtime</artifactId> -->
      <!-- com.google.cloud:libraries-bom: <groupId>org.threeten</groupId><artifactId>threeten-extra</artifactId> -->
      <!-- Imports -->
      <dependency>
        <groupId>com.aoapps</groupId><artifactId>jakartaee-web-profile-bom</artifactId><version>10.0.1${POST-SNAPSHOT}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>com.google.cloud</groupId><artifactId>libraries-bom</artifactId><version>26.91.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <!-- Direct -->
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-collections</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-concurrent</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-encoding</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-encoding-servlet</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-encoding-taglib</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-fluent-html</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-fluent-html-any</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-fluent-html-servlet</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-fluent-html-util</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-hodgepodge</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-io-buffer</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-lang</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-net-types</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-payments-api</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-security</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-servlet-filter</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-servlet-last-modified</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-servlet-util</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-sql</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-style</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-taglib</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-tempfiles-servlet</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-web-resources-registry</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-web-resources-renderer</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoapps</groupId><artifactId>ao-web-resources-servlet</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoindustries</groupId><artifactId>aoserv-client</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoindustries</groupId><artifactId>aoserv-credit-cards</artifactId>
    </dependency>
    <dependency>
      <groupId>com.aoindustries</groupId><artifactId>aoserv-daemon-client</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId>
    </dependency>
    <dependency>
      <groupId>commons-validator</groupId><artifactId>commons-validator</artifactId>
    </dependency>
    <dependency>
      <groupId>com.google.api</groupId><artifactId>gax</artifactId>
    </dependency>
    <dependency>
      <groupId>com.google.auth</groupId><artifactId>google-auth-library-credentials</artifactId>
    </dependency>
    <dependency>
      <groupId>com.google.auth</groupId><artifactId>google-auth-library-oauth2-http</artifactId>
    </dependency>
    <dependency>
      <groupId>com.google.cloud</groupId><artifactId>google-cloud-recaptchaenterprise</artifactId>
    </dependency>
    <dependency>
      <groupId>jakarta.mail</groupId><artifactId>jakarta.mail-api</artifactId>
    </dependency>
    <dependency>
      <groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId>
    </dependency>
    <dependency>
      <groupId>jakarta.servlet.jsp</groupId><artifactId>jakarta.servlet.jsp-api</artifactId>
    </dependency>
    <dependency>
      <groupId>jakarta.websocket</groupId><artifactId>jakarta.websocket-api</artifactId>
    </dependency>
    <dependency>
      <groupId>jakarta.websocket</groupId><artifactId>jakarta.websocket-client-api</artifactId>
    </dependency>
    <dependency>
      <groupId>com.google.api.grpc</groupId><artifactId>proto-google-cloud-recaptchaenterprise-v1</artifactId>
    </dependency>
    <dependency>
      <groupId>com.semanticcms</groupId><artifactId>semanticcms-core-taglib</artifactId>
    </dependency>
    <dependency>
      <groupId>io.github.weblegacy</groupId><artifactId>struts-core</artifactId>
    </dependency>
    <dependency>
      <groupId>io.github.weblegacy</groupId><artifactId>struts-taglib</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.struts</groupId><artifactId>struts2-convention-plugin</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId>
    </dependency>
    <!-- Runtime Direct -->
    <dependency>
      <groupId>org.eclipse.angus</groupId><artifactId>angus-mail</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <!-- Required for UTF-8 static resources -->
      <groupId>com.aoapps</groupId><artifactId>ao-mime-mappings</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.glassfish.web</groupId><artifactId>jakarta.servlet.jsp.jstl</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>com.semanticcms</groupId><artifactId>semanticcms-core-servlet</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId><artifactId>slf4j-jdk14</artifactId>
      <scope>runtime</scope>
    </dependency>
  </dependencies>
</project>
