<?xml version="1.0" encoding="UTF-8"?>
<!-- Schema for InstallService, part of AlwaysUp: https://www.CoreTechnologies.com/products/AlwaysUp -->
<!-- A good online XSD/XML validator: https://www.liquid-technologies.com/online-xsd-validator -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- +++++++++++++ Document structure +++++++++++++ -->
	<xs:element name="alwaysup-installservice-configuration">
		<xs:complexType>
      <xs:sequence>
        <!-- The version of AlwaysUp that created the service XML (optional)-->
        <xs:element name="version" type="xs:string" minOccurs="0" maxOccurs="1"/>
        <!-- The name of the service. -->
        <xs:element name="name">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="serviceNameType">
                <xs:attribute type="xs:boolean" name="omit-suffix" use="optional"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>       
        <!-- An optional description of the service. -->
        <xs:element name="description" minOccurs="0" maxOccurs="1">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:minLength value="1"/>
              <xs:maxLength value="256"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <!-- General settings -->
        <xs:element name="general">
          <xs:complexType>
            <xs:all>
              <!-- The path to the application to run. -->
              <xs:element name="application-path" type="nonEmptyStringType"/>
              <!-- The arguments to the application to run (optional). -->
              <xs:element name="application-arguments" type="xs:string" minOccurs="0" maxOccurs="1"/>
              <!-- The directory in which to start the application (optional). -->
              <xs:element name="start-directory" type="xs:string" minOccurs="0" maxOccurs="1"/>
              <!-- The priority at which to run the application (optional). -->
              <xs:element name="set-priority" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:all>
                    <!-- Specify to reduce the priority to normal when a user logs on. -->
                    <xs:element name="reduce-to-normal-on-login" minOccurs="0" maxOccurs="1">
                      <xs:complexType/>
                    </xs:element>
                  </xs:all>
                  <xs:attribute name="priority" type="priorityType" use="required"/>
                  <!-- The priority at which to run the application - string values below. -->
                </xs:complexType>
              </xs:element>
              <!-- How to start the application. Default is automatically if no choice is made. -->
              <xs:element name="start" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="type" type="startType" use="required"/>
                  <xs:attribute name="delayed" type="xs:boolean" use="optional"/>
                </xs:complexType>
              </xs:element>
              <!-- Limit the application to specific CPUs. -->
              <xs:element name="cpu-affinity" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="mask" type="xs:positiveInteger" use="required"/>
                </xs:complexType>
              </xs:element>
              <!-- Adjust the application's main window. -->
              <xs:element name="adjust-main-window" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:all>
                    <!-- Always on top of other windows. -->
                    <xs:element name="always-on-top" minOccurs="0" maxOccurs="1">
                      <xs:complexType/>
                    </xs:element>
                  </xs:all>
                  <xs:attribute name="show" type="showType" use="optional"/>
                </xs:complexType>
              </xs:element>
              <!-- Use a special command to stop the application. -->
              <xs:element name="stop-command" minOccurs="0" maxOccurs="1" type="nonEmptyStringType"/>
              <!-- Run a command when the application stops. -->
              <xs:element name="on-stop-command" minOccurs="0" maxOccurs="1" type="nonEmptyStringType"/>
              <!-- Capture output. -->
              <xs:element name="capture-output" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:all>
                    <!-- Output file. -->
                    <xs:element name="file" minOccurs="0" maxOccurs="1" type="nonEmptyStringType"/>
                    <!-- Action: trim or rollover. -->
                    <xs:element minOccurs="0" maxOccurs="1" ref="captureOutputAction"/>
                  </xs:all>
                </xs:complexType>
              </xs:element>
              <!-- Wait time when stopping. -->
              <xs:element name="stop-wait-time" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="value" type="xs:positiveInteger" use="required"/>
                </xs:complexType>
              </xs:element>
              <!-- Prevent the computer from automatically going to sleep when the service is running. -->
              <xs:element name="prevent-automatic-sleep" minOccurs="0" maxOccurs="1">
                <xs:complexType/>
              </xs:element>
              <xs:element name="tags" type="xs:string" minOccurs="0" maxOccurs="1"/>
            </xs:all>
          </xs:complexType>
        </xs:element>
        <!-- Log-on settings. No value implies to log on as the LocalSystem. -->
        <xs:choice>
          <!-- Log on as a user -->
          <xs:element name="log-on">
            <xs:complexType>
              <xs:all>
                <!-- The username, incuding any domain. -->
                <xs:element name="username" type="nonEmptyStringType"/>
                <!-- The password. -->
                <xs:element name="password" type="xs:string"/>
              </xs:all>
              <xs:attribute name="run-restricted" type="xs:boolean" use="optional"/>
              <xs:attribute name="hide-windows" type="xs:boolean" use="optional"/>
            </xs:complexType>
          </xs:element>
          <!-- Log on as LocalSystem (the default) -->
          <xs:element name="log-on-as-system">
            <xs:complexType>
              <xs:attribute name="hide-windows" type="xs:boolean" use="optional"/>
            </xs:complexType>
          </xs:element>
        </xs:choice>
        <!-- Monitoring the application -->
        <xs:element name="monitor">
          <xs:complexType>
            <xs:all>
              <xs:element name="restart">
                <xs:complexType>
                  <xs:all>
                    <xs:element name="when-app-crashes" minOccurs="0" maxOccurs="1">
                      <xs:complexType/>
                    </xs:element>
                    <xs:element name="when-app-hangs" minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:attribute name="enabled" type="xs:boolean"/>
                        <xs:attribute name="for-longer-than" type="xs:positiveInteger" use="required"/>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="when-memory-exceeds" minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:attribute name="enabled" type="xs:boolean"/>
                        <xs:attribute name="size" type="xs:positiveInteger" use="required"/>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="when-cpu-hogged" minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:attribute name="enabled" type="xs:boolean"/>
                        <xs:attribute name="for-longer-than" type="xs:positiveInteger" use="required"/>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="when-runs-too-long" minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:attribute name="enabled" type="xs:boolean"/>
                        <xs:attribute name="for-longer-than" type="xs:positiveInteger" use="required"/>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="when-computer-resumes" minOccurs="0" maxOccurs="1">
                      <xs:complexType/>
                    </xs:element>
                    <xs:element name="regularly" minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:all>
                          <!-- Optionally reboot when restarting. -->
                          <xs:element name="reboot" minOccurs="0" maxOccurs="1">
                            <xs:complexType/>
                          </xs:element>
                          <!-- Only restart if memory has exceeded a given threshold. -->
                          <xs:element name="only-if-memory-exceeds" minOccurs="0" maxOccurs="1">
                            <xs:complexType>
                              <xs:attribute name="size" type="xs:positiveInteger" use="required"/>
                            </xs:complexType>
                          </xs:element>
                          <!-- Only restart if the application has been idle for a given period. -->
                          <xs:element name="only-if-idle" minOccurs="0" maxOccurs="1">
                            <xs:complexType>
                              <xs:attribute name="duration" type="xs:positiveInteger" use="required"/>
                            </xs:complexType>
                          </xs:element>
                          <!-- Only restart if no user is logged on to the PC. -->
                          <xs:element name="only-if-no-one-logged-on" minOccurs="0" maxOccurs="1"/>
                          <!-- If conditions are not met at the given time, keep trying for a given period. -->
                          <xs:element name="keep-trying-for" minOccurs="0" maxOccurs="1">
                            <xs:complexType>
                              <xs:attribute name="duration" type="xs:positiveInteger" use="required"/>
                            </xs:complexType>
                          </xs:element>
                        </xs:all>
                        <xs:attribute name="enabled" type="xs:boolean"/>
                        <xs:attribute name="period" type="periodType" use="required"/>
                        <xs:attribute name="time" type="xs:string"/>
                      </xs:complexType>
                    </xs:element>
                    <!-- Specify if the application should not be immediately restarted when it stops. -->
                    <xs:element name="delay" minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:choice>
                            <xs:element name="on-the-hour"/>
                            <xs:element name="on-the-half-hour"/>
                            <xs:element name="wait">
                              <xs:complexType>
                                <xs:attribute name="time" type="xs:positiveInteger" use="required"/>
                              </xs:complexType>
                            </xs:element>
                            <xs:element name="until">
                              <xs:complexType>
                                <xs:attribute name="time" type="xs:string" use="required"/>
                              </xs:complexType>
                            </xs:element>
                          </xs:choice>
                          <xs:element name="applies-to-first-run" minOccurs="0" maxOccurs="1"/>
                          <xs:element name="suspend-while-waiting" minOccurs="0" maxOccurs="1"/>
                         <xs:element name="minimize-logging" minOccurs="0" maxOccurs="1"/>
                         <xs:element name="tolerate-quick-exit" minOccurs="0" maxOccurs="1"/>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <!-- Stop trying to restart after some number of times in a given time-frame. -->
                    <xs:element name="stop-after" minOccurs="0" maxOccurs="1">
                      <xs:complexType>
                        <xs:attribute name="num-attempts" type="xs:positiveInteger" use="required"/>
                        <xs:attribute name="num-minutes" type="xs:positiveInteger" use="required"/>
                      </xs:complexType>
                    </xs:element>
                  </xs:all>
                </xs:complexType>
              </xs:element>
              <xs:element name="dismiss-messageboxes" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="stop-if-fatal" type="xs:boolean"/>
                </xs:complexType>
              </xs:element>
              <!-- Sanity check settings. -->
              <xs:element name="sanity-check" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="command-line" type="nonEmptyStringType"/>
                  </xs:sequence>
                  <xs:attribute name="enabled" type="xs:boolean"/>
                  <xs:attribute name="frequency" type="xs:positiveInteger" use="required"/>
                  <xs:attribute name="timeout" type="xs:positiveInteger"/>
                  <xs:attribute name="delay" type="xs:positiveInteger"/>
                  <xs:attribute name="delay-when-restarted" type="xs:boolean"/>
                </xs:complexType>
              </xs:element>
              <!-- Automate settings. -->
              <xs:element name="automate" minOccurs="0" maxOccurs="1">
              <xs:complexType>
              <xs:sequence>
              <xs:element name="command" type="nonEmptyStringType"/>
              <xs:element name="num-times" minOccurs="0" maxOccurs="1">
              <xs:complexType>
              <xs:attribute name="enabled" type="xs:boolean"/>
              <xs:attribute name="value" type="xs:positiveInteger" use="required"/>
              </xs:complexType>
              </xs:element>
              </xs:sequence>
              <xs:attribute name="enabled" type="xs:boolean"/>
              <xs:attribute name="interval" type="xs:positiveInteger" use="required"/>
              </xs:complexType>
							</xs:element>
						</xs:all>
					</xs:complexType>
				</xs:element>
				<!-- Notification settings -->
				<xs:element name="notification">
					<xs:complexType>
						<xs:all>
							<xs:element name="email" minOccurs="0" maxOccurs="1">
								<xs:complexType>
									<xs:all>
										<!-- The To address for emails. Multiple addresses must be separated by a comma. -->
										<xs:element name="to-address" type="xs:string" minOccurs="0" maxOccurs="1"/>
										<xs:element name="from-name" type="xs:string" minOccurs="0" maxOccurs="1"/>
										<xs:element name="from-address" type="xs:string" minOccurs="0" maxOccurs="1"/>
										<xs:element name="send" minOccurs="0" maxOccurs="1">
											<xs:complexType>
												<xs:all>
													<xs:element name="when-application-stops" minOccurs="0" maxOccurs="1">
														<xs:complexType/>
													</xs:element>
													<xs:element name="when-messagebox-dismissed" minOccurs="0" maxOccurs="1">
														<xs:complexType/>
													</xs:element>
													<xs:element name="when-service-starts" minOccurs="0" maxOccurs="1">
														<xs:complexType>
															<xs:all>
																<xs:element name="only-after-reboot" type="xs:string" minOccurs="0" maxOccurs="1"/>
															</xs:all>
														</xs:complexType>
													</xs:element>
													<xs:element name="when-application-needs-attention" minOccurs="0" maxOccurs="1">
														<xs:complexType/>
													</xs:element>
													<xs:element name="daily" minOccurs="0" maxOccurs="1">
														<xs:complexType/>
													</xs:element>
													<xs:element name="weekly" minOccurs="0" maxOccurs="1">
														<xs:complexType/>
													</xs:element>
												</xs:all>
											</xs:complexType>
										</xs:element>
										<xs:element name="smtp-server" minOccurs="0" maxOccurs="1">
											<xs:complexType>
												<xs:all>
													<xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1"/>
													<xs:element name="port" type="xs:string" minOccurs="0" maxOccurs="1"/>
													<xs:element name="encryption" minOccurs="0" maxOccurs="1">
														<xs:complexType>
															<xs:attribute name="type" type="encryptionType" use="required"/>
														</xs:complexType>
													</xs:element>
													<xs:element name="authentication" minOccurs="0" maxOccurs="1">
														<xs:complexType>
															<xs:all>
																<!-- The username. -->
																<xs:element name="username" type="nonEmptyStringType"/>
																<!-- The password. -->
																<xs:element name="password" type="xs:string"/>
															</xs:all>
															<xs:attribute name="enabled" type="xs:boolean"/>
															<xs:attribute name="type" type="authType" use="required"/>
														</xs:complexType>
													</xs:element>
												</xs:all>
											</xs:complexType>
										</xs:element>
										<xs:element name="use-text-format" minOccurs="0" maxOccurs="1">
											<xs:complexType/>
										</xs:element>
										<!-- Additional text is limited to max 30 characters. -->
										<xs:element name="additional-text" minOccurs="0" maxOccurs="1">
											<xs:simpleType>
												<xs:restriction base="xs:string">
													<xs:minLength value="1"/>
													<xs:maxLength value="30"/>
												</xs:restriction>
											</xs:simpleType>
										</xs:element>
									</xs:all>
								</xs:complexType>
							</xs:element>
						</xs:all>
					</xs:complexType>
				</xs:element>
				<!-- Startup settings -->
				<xs:element name="startup">
					<xs:complexType>
						<xs:all>
							<xs:element name="restore-network-drives" minOccurs="0" maxOccurs="1">
								<xs:complexType/>
							</xs:element>
							<xs:element name="ensure-network-is-up" minOccurs="0" maxOccurs="1">
								<xs:complexType/>
							</xs:element>
							<xs:element name="pause" minOccurs="0" maxOccurs="1">
								<xs:complexType>
									<xs:sequence>
										<xs:element name="only-after-reboot" type="xs:string" minOccurs="0" maxOccurs="1"/>
									</xs:sequence>
									<xs:attribute name="time" type="xs:positiveInteger" use="required"/>
								</xs:complexType>
							</xs:element>
							<xs:element name="run" minOccurs="0" maxOccurs="1">
								<xs:complexType>
									<xs:sequence>
										<xs:element name="command-line" type="nonEmptyStringType"/>
									</xs:sequence>
									<xs:attribute name="enabled" type="xs:boolean"/>
									<xs:attribute name="run-on-restart" type="xs:boolean"/>
								</xs:complexType>
							</xs:element>
							<xs:element name="dependencies" minOccurs="0" maxOccurs="1">
								<xs:complexType>
									<xs:sequence>
										<xs:element name="service-name" type="nonEmptyStringType" maxOccurs="unbounded"/>
									</xs:sequence>
									<xs:attribute name="enabled" type="xs:boolean"/>
								</xs:complexType>
							</xs:element>
							<xs:element name="stop-instances" minOccurs="0" maxOccurs="1">
								<xs:complexType>
									<xs:attribute name="stop-on-restart" type="xs:boolean"/>
									<xs:attribute name="in-same-session-or-account" type="xs:boolean"/>
								</xs:complexType>
							</xs:element>
						</xs:all>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<!-- +++++++++++++ Referenced types +++++++++++++ -->
	<!-- startType: valid ways that the application can be started. -->
	<xs:simpleType name="startType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="automatically"/>
			<xs:enumeration value="automatic"/>
			<xs:enumeration value="manually"/>
			<xs:enumeration value="manual"/>
			<xs:enumeration value="disabled"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="showType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="min"/>
			<xs:enumeration value="max"/>
			<xs:enumeration value="normal"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- priorityType: valid priority values. -->
	<xs:simpleType name="priorityType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="idle"/>
			<xs:enumeration value="below-normal"/>
			<xs:enumeration value="normal"/>
			<xs:enumeration value="above-normal"/>
			<xs:enumeration value="high"/>
			<xs:enumeration value="real-time"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- periodType: valid restart-app period values. -->
	<xs:simpleType name="periodType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="daily"/>
			<xs:enumeration value="monday"/>
			<xs:enumeration value="tuesday"/>
			<xs:enumeration value="wednesday"/>
			<xs:enumeration value="thursday"/>
			<xs:enumeration value="friday"/>
			<xs:enumeration value="saturday"/>
			<xs:enumeration value="sunday"/>
			<xs:enumeration value="every-12-hours"/>
			<xs:enumeration value="every-8-hours"/>
			<xs:enumeration value="every-6-hours"/>
			<xs:enumeration value="every-4-hours"/>
			<xs:enumeration value="every-2-hours"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- encryptionType: valid email encryption values. -->
	<xs:simpleType name="encryptionType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="SSL-OR-TLS"/>
			<xs:enumeration value="STARTTLS"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- authType: valid email authentication values. -->
	<xs:simpleType name="authType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="CRAM-MD5"/>
			<xs:enumeration value="AUTH-LOGIN"/>
			<xs:enumeration value="AUTH-PLAIN"/>
			<xs:enumeration value="AUTH-NTLM"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- nonEmptyStringType: Represents a non-empty string. -->
	<xs:simpleType name="nonEmptyStringType">
		<xs:restriction base="xs:string">
			<xs:minLength value="1"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- serviceNameType: Service name with documented restrictions. -->
	<xs:simpleType name="serviceNameType">
		<xs:restriction base="xs:string">
			<xs:minLength value="1"/>
			<xs:maxLength value="256"/>
			<xs:pattern value="[^\\/]*"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- Capture output action: trim or rollover. -->
    <xs:element name="captureOutputAction" abstract="true"/>
    <xs:element name="trim" substitutionGroup="captureOutputAction">
      <xs:complexType>
        <xs:attribute name="max-size" type="xs:positiveInteger" use="required"/>
      </xs:complexType>
    </xs:element>
    <xs:element name="rollover" substitutionGroup="captureOutputAction">
      <xs:complexType>
        <xs:attribute name="max-size" type="xs:positiveInteger" use="required"/>
      </xs:complexType>
    </xs:element>
</xs:schema>
