<?xml version="1.0"?>

<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
-->

<model xmlns="http://codehaus-plexus.github.io/MODELLO/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://codehaus-plexus.github.io/MODELLO/2.0.0 https://codehaus-plexus.github.io/modello/xsd/modello-2.0.0.xsd"
  xml.namespace="http://maven.apache.org/SETTINGS/${version}"
  xml.schemaLocation="http://maven.apache.org/xsd/settings-${version}.xsd">
  <id>settings</id>
  <name>Settings</name>
  <description>
    <![CDATA[
    <p>This is a reference for the user-specific configuration for Maven.</p>
    <p>Includes things that should not be distributed with the <code>pom.xml</code> file, such as developer identity, along with
    local settings, like proxy information.</p>
    <p>The default location for the settings file is {@code ~/.m2/settings.xml}.</p>
    ]]>
  </description>
  <defaults>
    <default>
      <key>package</key>
      <value>org.apache.maven.settings</value>
    </default>
  </defaults>
  <classes>
    <class java.clone="deep">
      <name>TrackableBase</name>
      <version>1.0.0+</version>
      <description>
        common base class that contains code to track the source for
        this instance (USER|GLOBAL)
      </description>
      <codeSegments>
        <codeSegment>
          <version>1.0.0/1.3.0</version>
          <code>
    public static final String USER_LEVEL = "user-level";
    public static final String PROJECT_LEVEL = "project-level";
    public static final String GLOBAL_LEVEL = "global-level";

    private String sourceLevel = USER_LEVEL;
    private boolean sourceLevelSet = false;

    public void setSourceLevel(String sourceLevel) {
        if (sourceLevelSet) {
            throw new IllegalStateException("Cannot reset sourceLevel attribute; it is already set to: " + sourceLevel);
        } else if (!(USER_LEVEL.equals(sourceLevel) || PROJECT_LEVEL.equals(sourceLevel)  || GLOBAL_LEVEL.equals(sourceLevel))) {
            throw new IllegalArgumentException("sourceLevel must be one of: {" + USER_LEVEL + "," + PROJECT_LEVEL + "," + GLOBAL_LEVEL + "}");
        } else {
            this.sourceLevel = sourceLevel;
            this.sourceLevelSet = true;
        }
    }

    public String getSourceLevel() {
        return sourceLevel;
    }
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>IdentifiableBase</name>
      <superClass>TrackableBase</superClass>
      <version>1.0.0+</version>
      <description>
        Base class for {@code Mirror}, {@code Profile}, {@code Proxy} and {@code Server}.
      </description>
      <fields>
        <field>
          <name>id</name>
          <version>1.0.0+</version>
          <type>String</type>
          <defaultValue>default</defaultValue>
          <required>true</required>
          <description>Item identifier.</description>
        </field>
      </fields>
    </class>
    <class rootElement="true" xml.tagName="settings">
      <name>Settings</name>
      <version>1.0.0+</version>
      <superClass>TrackableBase</superClass>
      <description>
        Root element of the user configuration file.
      </description>
      <fields>
        <field>
          <name>localRepository</name>
          <version>1.0.0+</version>
          <required>true</required>
          <description>
            <![CDATA[
            The local repository.<br><b>Default value is:</b> {@code ${user.home}/.m2/repository}
            ]]>
          </description>
          <type>String</type>
        </field>
        <field>
          <name>interactiveMode</name>
          <version>1.0.0+</version>
          <description>
            Whether Maven should attempt to interact with the user for input.
          </description>
          <type>boolean</type>
          <defaultValue>true</defaultValue>
        </field>
        <field>
          <name>usePluginRegistry</name>
          <version>1.0.0+</version>
          <description>
            Whether Maven should use the {@code plugin-registry.xml} file to manage plugin versions.
          </description>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
        </field>
        <field>
          <name>offline</name>
          <version>1.0.0+</version>
          <required>false</required>
          <description>
            Indicate whether maven should operate in offline mode full-time.
          </description>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
        </field>
        <field xdoc.separator="blank">
          <name>proxies</name>
          <version>1.0.0+</version>
          <description>
            Configuration for different proxy profiles. Multiple proxy profiles
            might come in handy for anyone working from a notebook or other
            mobile platform, to enable easy switching of entire proxy
            configurations by simply specifying the profile id, again either from
            the command line or from the defaults section below.
          </description>
          <association>
            <type>Proxy</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field xdoc.separator="blank">
          <name>servers</name>
          <version>1.0.0+</version>
          <description>
            Configuration of server-specific settings, mainly authentication
            method. This allows configuration of authentication on a per-server
            basis.
          </description>
          <association>
            <type>Server</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field xdoc.separator="blank">
          <name>mirrors</name>
          <version>1.0.0+</version>
          <description>
            Configuration of download mirrors for repositories.
          </description>
          <association>
            <type>Mirror</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field xdoc.separator="blank">
          <name>repositories</name>
          <version>1.3.0+</version>
          <description>
            The lists of the remote repositories.
          </description>
          <association>
            <type>Repository</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>pluginRepositories</name>
          <version>1.3.0+</version>
          <description>
            The lists of the remote repositories for discovering plugins.
          </description>
          <association>
            <type>Repository</type>
            <multiplicity>*</multiplicity>
          </association>
          <comment>
            This may be removed or relocated in the near
            future. It is undecided whether plugins really need a remote
            repository set of their own.
          </comment>
        </field>
        <field xdoc.separator="blank">
          <name>profiles</name>
          <version>1.0.0+</version>
          <description>
            Configuration of build profiles for adjusting the build
            according to environmental parameters.
          </description>
          <association>
            <type>Profile</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field xdoc.separator="blank">
          <name>activeProfiles</name>
          <version>1.0.0+</version>
          <description>
            List of manually-activated build profiles, specified in the order in which
            they should be applied.
          </description>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>pluginGroups</name>
          <version>1.0.0+</version>
          <description>
            List of groupIds to search for a plugin when that plugin
            groupId is not explicitly provided.
          </description>
          <association>
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.0/1.3.0</version>
          <code>
            <![CDATA[
    public Boolean getInteractiveMode() {
        return Boolean.valueOf(isInteractiveMode());
    }

    private Proxy activeProxy;

    /**
     * Reset the {@code activeProxy} field to {@code null}.
     */
    public void flushActiveProxy() {
        this.activeProxy = null;
    }

    /**
     * @return the first active proxy
     */
    public synchronized Proxy getActiveProxy() {
        if (activeProxy == null) {
            java.util.List<Proxy> proxies = getProxies();
            if (proxies != null && !proxies.isEmpty()) {
                for (Proxy proxy : proxies) {
                    if (proxy.isActive()) {
                        activeProxy = proxy;
                        break;
                    }
                }
            }
        }
        return activeProxy;
    }

    public Server getServer(String serverId) {
        Server match = null;
        java.util.List<Server> servers = getServers();
        if (servers != null && serverId != null) {
            for (Server server : servers) {
                if (serverId.equals(server.getId())) {
                    match = server;
                    break;
                }
            }
        }
        return match;
    }

    @Deprecated
    public Mirror getMirrorOf(String repositoryId) {
        Mirror match = null;
        java.util.List<Mirror> mirrors = getMirrors();
        if (mirrors != null && repositoryId != null) {
            for (Mirror mirror : mirrors) {
                if (repositoryId.equals(mirror.getMirrorOf())) {
                    match = mirror;
                    break;
                }
            }
        }
        return match;
    }

    private java.util.Map<String, Profile> profileMap;

    /**
     * Reset the {@code profileMap} field to {@code null}
     */
    public void flushProfileMap() {
        this.profileMap = null;
    }

    /**
     * @return a Map of profiles field keyed by {@link Profile#getId()}
     */
    public java.util.Map<String, Profile> getProfilesAsMap() {
        if (profileMap == null) {
            profileMap = new java.util.LinkedHashMap<String, Profile>();
            if (getProfiles() != null) {
                for (Profile profile : getProfiles()) {
                    profileMap.put(profile.getId(), profile);
                }
            }
        }
        return profileMap;
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>Proxy</name>
      <version>1.0.0+</version>
      <superClass>IdentifiableBase</superClass>
      <description>
        The {@code &lt;proxy&gt;} element contains information required to a proxy settings.
      </description>
      <fields>
        <field xml.tagName="active">
          <name>activeString</name>
          <version>1.0.0+</version>
          <required>false</required>
          <defaultValue>true</defaultValue>
          <description>
            Whether this proxy configuration is the active one. Note: While the type of this field
            is {@code String} for technical reasons, the semantic type is actually {@code boolean}.
            @see #isActive()
          </description>
          <type>String</type>
        </field>
        <field>
          <name>protocol</name>
          <version>1.0.0+</version>
          <description>
            The proxy protocol.
          </description>
          <type>String</type>
          <defaultValue>http</defaultValue>
        </field>
        <field>
          <name>username</name>
          <version>1.0.0+</version>
          <description>
            The proxy user.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>password</name>
          <version>1.0.0+</version>
          <description>
            The proxy password.
          </description>
          <type>String</type>
        </field>
        <field xml.tagName="port">
          <name>portString</name>
          <version>1.0.0+</version>
          <description>
            The proxy port. Note: While the type of this field is {@code String} for technical
            reasons, the semantic type is actually {@code int}.
            @see #getPort()
          </description>
          <type>String</type>
          <defaultValue>8080</defaultValue>
        </field>
        <field>
          <name>host</name>
          <version>1.0.0+</version>
          <description>
            The proxy host.
          </description>
          <type>String</type>
          <required>true</required>
        </field>
        <field>
          <name>nonProxyHosts</name>
          <version>1.0.0+</version>
          <description>
            The list of non-proxied hosts (delimited by {@code |}).
          </description>
          <type>String</type>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.0/1.3.0</version>
          <code>
    public boolean isActive() {
        return (getActiveString() != null) ? Boolean.parseBoolean(getActiveString()) : true;
    }

    public void setActive(boolean active) {
        setActiveString(String.valueOf(active));
    }

    public int getPort() {
        return (getPortString() != null) ? Integer.parseInt(getPortString()) : 8080;
    }

    public void setPort(int port) {
        setPortString(String.valueOf(port));
    }
          </code>
        </codeSegment>
        <codeSegment>
          <version>2.0.0+</version>
          <code>
    /**
     * Indicates if this proxy is active.
     * To allow interpolation of this field, this method lazily parses
     * the {@link #getActiveString()} value as a boolean and defaults to {@code true}
     * if not set.
     *
     * @return a boolean indicating if this proxy is active
     */
    public boolean isActive() {
        return (getActiveString() != null) ? Boolean.parseBoolean(getActiveString()) : true;
    }

    /**
     * Returns the port to use for this proxy.
     * To allow interpolation of this field, this method lazily parses
     * the {@link #getPortString()} value as an integer and defaults to {@code 8080}
     * if not set.
     *
     * @return an integer indicating the port to use for this proxy
     */
    public int getPort() {
        return (getPortString() != null) ? Integer.parseInt(getPortString()) : 8080;
    }

          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class>
      <name>Server</name>
      <version>1.0.0+</version>
      <superClass>IdentifiableBase</superClass>
      <description>
        The {@code &lt;server&gt;} element contains information required to a server settings.
      </description>
      <fields>
        <field>
          <name>username</name>
          <version>1.0.0+</version>
          <description>
            The username used to authenticate.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>password</name>
          <version>1.0.0+</version>
          <description>
            The password used in conjunction with the username to authenticate.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>privateKey</name>
          <version>1.0.0+</version>
          <description>
            The private key location used to authenticate.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>passphrase</name>
          <version>1.0.0+</version>
          <description>
            The passphrase used in conjunction with the privateKey to authenticate.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>filePermissions</name>
          <version>1.0.0+</version>
          <description>
            The permissions for files when they are created.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>directoryPermissions</name>
          <version>1.0.0+</version>
          <description>
            The permissions for directories when they are created.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>configuration</name>
          <type>DOM</type>
          <description>
            Extra configuration for the transport layer.
          </description>
        </field>
      </fields>
    </class>
    <class>
      <name>Mirror</name>
      <version>1.0.0+</version>
      <superClass>IdentifiableBase</superClass>
      <description>
        A download mirror for a given repository.
      </description>
      <fields>
        <field>
          <name>mirrorOf</name>
          <required>true</required>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            <![CDATA[
            A repository id or (since Maven 2.0.9) an expression matching one or many repository ids to mirror, e.g.,
            <code>central</code> or <code>*,!repo1</code>.
            <code>*</code> (since Maven 2.0.5), <code>external:*</code> (since Maven 2.0.9) and <code>external:http:*</code> (since Maven 3.8.0) have
            a special meaning: see <a href="/guides/mini/guide-mirror-settings.html">Mirror Settings</a> guide.
            ]]>
          </description>
        </field>
        <field>
          <name>name</name>
          <required>false</required>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            The optional name that describes the mirror.
          </description>
        </field>
        <field>
          <name>url</name>
          <required>true</required>
          <version>1.0.0+</version>
          <type>String</type>
          <description>The URL of the mirror repository.</description>
        </field>
        <field>
          <name>layout</name>
          <version>1.1.0+</version>
          <type>String</type>
          <defaultValue>default</defaultValue>
          <description>The layout of the mirror repository.
            @since Maven 3.</description>
        </field>
        <field>
          <name>mirrorOfLayouts</name>
          <version>1.1.0+</version>
          <type>String</type>
          <defaultValue>default,legacy</defaultValue>
          <description>
            The layouts of repositories being mirrored. This value can be used to restrict the usage
            of the mirror to repositories with a matching layout (apart from a matching id).
            @since Maven 3.
          </description>
        </field>
        <field>
          <name>blocked</name>
          <version>1.2.0+</version>
          <type>boolean</type>
          <defaultValue>false</defaultValue>
          <description>
            <![CDATA[
            Whether this mirror should be blocked from any download request but fail the download process, explaining why.
            <br><b>Default value is</b>: <code>false</code>
            <br><b>Since</b>: Maven 3.8.0
            ]]>
          </description>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.0+</version>
          <code>
            <![CDATA[

    public String toString() {
        StringBuilder sb = new StringBuilder(128);
        sb.append("Mirror[");
        sb.append("id=").append(this.getId());
        sb.append(",mirrorOf=").append(this.getMirrorOf());
        sb.append(",url=").append(this.getUrl());
        sb.append(",name=").append(this.getName());
        if (isBlocked()) {
            sb.append(",blocked");
        }
        sb.append("]");
        return sb.toString();
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <!-- Profile support -->
    <class>
      <name>Profile</name>
      <version>1.0.0+</version>
      <superClass>IdentifiableBase</superClass>
      <description>
        Modifications to the build process which is keyed on some sort of environmental parameter.
      </description>
      <fields>
        <field>
          <name>activation</name>
          <version>1.0.0+</version>
          <description>
            The conditional logic which will automatically trigger the inclusion of this profile.
          </description>
          <association>
            <type>Activation</type>
          </association>
        </field>
        <field>
          <name>properties</name>
          <description>
            Extended configuration specific to this profile goes here.
            Contents take the form of {@code &lt;property.name&gt;property.value&lt;/property.name&gt;}
          </description>
          <type>Properties</type>
          <association xml.mapStyle="inline">
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field xdoc.separator="blank">
          <name>repositories</name>
          <version>1.0.0+</version>
          <description>
            The lists of the remote repositories.
          </description>
          <association>
            <type>Repository</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>pluginRepositories</name>
          <version>1.0.0+</version>
          <description>
            The lists of the remote repositories for discovering plugins.
          </description>
          <association>
            <type>Repository</type>
            <multiplicity>*</multiplicity>
          </association>
          <comment>
            This may be removed or relocated in the near
            future. It is undecided whether plugins really need a remote
            repository set of their own.
          </comment>
        </field>
      </fields>
    </class>
    <class java.clone="deep">
      <name>Activation</name>
      <version>1.0.0+</version>
      <description>
        The conditions within the build runtime environment which will trigger
        the automatic inclusion of the parent build profile.
      </description>
      <fields>
        <field>
          <name>activeByDefault</name>
          <version>1.0.0+</version>
          <type>boolean</type>
          <description>
            Flag specifying whether this profile is active as a default.
          </description>
        </field>
        <field>
          <name>jdk</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            Specifies that this profile will be activated when a matching JDK is detected.
          </description>
        </field>
        <field>
          <name>os</name>
          <version>1.0.0+</version>
          <description>
            Specifies that this profile will be activated when matching OS attributes are detected.
          </description>
          <association>
            <type>ActivationOS</type>
          </association>
        </field>
        <field>
          <name>property</name>
          <version>1.0.0+</version>
          <description>
            Specifies that this profile will be activated when this property is specified.
          </description>
          <association>
            <type>ActivationProperty</type>
          </association>
        </field>
        <field>
          <name>file</name>
          <version>1.0.0+</version>
          <description>
            Specifies that this profile will be activated based on existence of a file.
          </description>
          <association>
            <type>ActivationFile</type>
          </association>
        </field>
        <field>
          <name>packaging</name>
          <version>1.2.0+</version>
          <type>String</type>
          <description>
            Specifies that this profile will be activated based on the project's packaging.
          </description>
        </field>
      </fields>
    </class>

    <!-- TODO: reproduced from maven-model/maven.mdo, instead should inherit code and link to external docs -->
    <class java.clone="deep">
      <name>RepositoryBase</name>
      <version>1.0.0+</version>
      <superClass>IdentifiableBase</superClass>
      <description>
        Repository contains the information needed
        for establishing connections with remote repository
      </description>
      <fields>
        <field>
          <name>name</name>
          <version>1.0.0+</version>
          <description>
            Human readable name of the repository.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>url</name>
          <version>1.0.0+</version>
          <description>
            The url of the repository.
          </description>
          <type>String</type>
        </field>
        <field>
          <name>layout</name>
          <version>1.0.0+</version>
          <description>
            The type of layout this repository uses for locating and
            storing artifacts - can be "legacy" or "default".
          </description>
          <type>String</type>
          <defaultValue>default</defaultValue>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>1.0.0/1.1.0</version>
          <code>
            <![CDATA[
    /**
     * @see java.lang.Object#equals(java.lang.Object)
     */
    public boolean equals(Object obj) {
        RepositoryBase other = (RepositoryBase) obj;
        boolean retValue = false;
        if (this.getId() != null) {
            retValue = this.getId().equals(other.getId());
        }
        return retValue;
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>

    <class>
      <name>Repository</name>
      <superClass>RepositoryBase</superClass>
      <version>1.0.0+</version>
      <description>
        Repository contains the information needed for establishing
        connections with remote repository
      </description>
      <fields>
        <field>
          <name>releases</name>
          <version>1.0.0+</version>
          <description>
            How to handle downloading of releases from this repository
          </description>
          <association>
            <type>RepositoryPolicy</type>
          </association>
        </field>
        <field>
          <name>snapshots</name>
          <version>1.0.0+</version>
          <description>
            How to handle downloading of snapshots from this repository
          </description>
          <association>
            <type>RepositoryPolicy</type>
          </association>
        </field>
      </fields>
      <!-- prevent Modello generation of an incorrect equals method. Could be avoided by using <identity/> tags to mark ID as the only identity field -->
      <codeSegments>
        <codeSegment>
          <version>1.0.0/1.1.0</version>
          <code>
            <![CDATA[
    /**
     * @see RepositoryBase#equals(java.lang.Object)
     */
    public boolean equals(Object obj) {
        return super.equals(obj);
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>

    <class java.clone="deep">
      <name>RepositoryPolicy</name>
      <version>1.0.0+</version>
      <description>Download policy</description>
      <fields>
        <field>
          <name>enabled</name>
          <version>1.0.0+</version>
          <description>
            Whether to use this repository for downloading this type of
            artifact.
          </description>
          <type>boolean</type>
          <defaultValue>true</defaultValue>
        </field>
        <field>
          <name>updatePolicy</name>
          <version>1.0.0+</version>
          <description>
            The frequency for downloading updates - can be "always",
            "daily" (default), "interval:XXX" (in minutes) or "never"
            (only if it doesn't exist locally).
          </description>
          <type>String</type>
        </field>
        <field>
          <name>checksumPolicy</name>
          <version>1.0.0+</version>
          <description>
            What to do when verification of an artifact checksum fails. Valid values are "fail" (default for Maven 4 and
            above), "warn" (default for Maven 2 and 3) or "ignore".
          </description>
          <type>String</type>
        </field>
      </fields>
    </class>

    <class java.clone="deep">
      <name>ActivationProperty</name>
      <version>1.0.0+</version>
      <description>
        This is the property specification used to activate a profile. If the value field is empty,
        then the existence of the named property will activate the profile, otherwise it does a case-sensitive
        match against the property value as well.
      </description>
      <fields>
        <field>
          <name>name</name>
          <version>1.0.0+</version>
          <type>String</type>
          <required>true</required>
          <description>
            The name of the property to be used to activate a profile.
          </description>
        </field>
        <field>
          <name>value</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            The value of the property to be used to activate a profile.
          </description>
        </field>
      </fields>
    </class>
    <class java.clone="deep">
      <name>ActivationOS</name>
      <version>1.0.0+</version>
      <description>
        This is an activator which will detect an operating system's attributes in order to activate
        its profile.
      </description>
      <fields>
        <field>
          <name>name</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            The name of the OS to be used to activate a profile.
          </description>
        </field>
        <field>
          <name>family</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            The general family of the OS to be used to activate a profile (e.g. 'windows')
          </description>
        </field>
        <field>
          <name>arch</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            The architecture of the OS to be used to activate a profile.
          </description>
        </field>
        <field>
          <name>version</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            The version of the OS to be used to activate a profile.
          </description>
        </field>
      </fields>
    </class>
    <class java.clone="deep">
      <name>ActivationFile</name>
      <version>1.0.0+</version>
      <description>
        This is the file specification used to activate a profile. The missing value will be the location
        of a file that needs to exist, and if it doesn't the profile must run.  On the other hand exists will test
        for the existence of the file and if it is there will run the profile.
      </description>
      <fields>
        <field>
          <name>missing</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            The name of the file that should be missing to activate a profile.
          </description>
        </field>
        <field>
          <name>exists</name>
          <version>1.0.0+</version>
          <type>String</type>
          <description>
            The name of the file that should exist to activate a profile.
          </description>
        </field>
      </fields>
    </class>
    <!-- /BuildProfile support -->
    <class locationTracker="locations">
      <name>InputLocation</name>
      <version>2.0.0+</version>
      <fields>
        <!-- line, column and source fields are auto-generated by Modello -->
      </fields>
      <codeSegments>
        <codeSegment>
          <version>2.0.0+</version>
          <code>

    @Override
    public String toString() {
        return getLineNumber() + " : " + getColumnNumber() + ", " + getSource();
    }
          </code>
        </codeSegment>
      </codeSegments>
    </class>
    <class sourceTracker="source">
      <name>InputSource</name>
      <version>2.0.0+</version>
      <fields>
        <field>
          <name>location</name>
          <version>2.0.0+</version>
          <type>String</type>
          <description>
            The path/URL of the settings definition or {@code null} if unknown.
          </description>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <version>2.0.0+</version>
          <code>
    @Override
    public String toString() {
        return getLocation();
    }
          </code>
        </codeSegment>
      </codeSegments>
    </class>
  </classes>
</model>
