Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package libupnpp for openSUSE:Factory 
checked in at 2026-10-14 18:35:21
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libupnpp (Old)
 and      /work/SRC/openSUSE:Factory/.libupnpp.new.3698736 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libupnpp"

Wed Oct 14 18:35:21 2026 rev:13 rq:1384665 version:1.0.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/libupnpp/libupnpp.changes        2025-06-10 
09:07:00.195696324 +0200
+++ /work/SRC/openSUSE:Factory/.libupnpp.new.3698736/libupnpp.changes   
2026-10-14 18:36:06.183347200 +0200
@@ -1,0 +2,7 @@
+Tue Oct 13 16:28:07 UTC 2026 - Bjørn Lie <[email protected]>
+
+- Update to version 1.0.4:
+  * Build: use internal XML parser instead of expat.
+- Drop pkgconfig(expat) BuildRequires: following upstream changes.
+
+-------------------------------------------------------------------

Old:
----
  libupnpp-1.0.3.tar.gz
  libupnpp-1.0.3.tar.gz.asc

New:
----
  libupnpp-1.0.4.tar.gz
  libupnpp-1.0.4.tar.gz.asc

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libupnpp.spec ++++++
--- /var/tmp/diff_new_pack.EskPt4/_old  2026-10-14 18:36:07.133387200 +0200
+++ /var/tmp/diff_new_pack.EskPt4/_new  2026-10-14 18:36:07.134387242 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package libupnpp
 #
-# Copyright (c) 2025 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 # Copyright (c) 2025 Andreas Stieger <[email protected]>
 #
 # All modifications and additions to the file contributed by third parties
@@ -19,7 +19,7 @@
 
 %define so_ver  17
 Name:           libupnpp
-Version:        1.0.3
+Version:        1.0.4
 Release:        0
 Summary:        Library providing a higher level API over libnpupnp or libupnp
 License:        LGPL-2.1-or-later
@@ -31,7 +31,6 @@
 BuildRequires:  c++_compiler
 BuildRequires:  meson
 BuildRequires:  pkgconfig
-BuildRequires:  pkgconfig(expat)
 BuildRequires:  pkgconfig(libcurl)
 BuildRequires:  pkgconfig(libnpupnp) >= 6.0.0
 

++++++ libupnpp-1.0.3.tar.gz -> libupnpp-1.0.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/LIBUPNPP-VERSION.txt 
new/libupnpp-1.0.4/LIBUPNPP-VERSION.txt
--- old/libupnpp-1.0.3/LIBUPNPP-VERSION.txt     2025-05-26 08:48:27.000000000 
+0200
+++ new/libupnpp-1.0.4/LIBUPNPP-VERSION.txt     1970-01-01 01:00:00.000000000 
+0100
@@ -1 +0,0 @@
-1.0.3
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/avlastchg.cxx 
new/libupnpp-1.0.4/libupnpp/control/avlastchg.cxx
--- old/libupnpp-1.0.3/libupnpp/control/avlastchg.cxx   2024-04-23 
08:18:31.000000000 +0200
+++ new/libupnpp-1.0.4/libupnpp/control/avlastchg.cxx   2026-01-18 
09:02:44.000000000 +0100
@@ -20,18 +20,26 @@
 #include <cstring>
 
 #include "libupnpp/control/avlastchg.hxx"
-#include "libupnpp/expatmm.h"
 #include "libupnpp/log.h"
 
+#ifdef UPNPP_USE_EXPAT
+#include "libupnpp/expatmm.h"
+#define XMLPARSERTP inputRefXMLParser
+#else
+#define PICOXML_EXPAT_STARTELEMENT_COMPAT
+#include "libupnpp/picoxml.h"
+#define XMLPARSERTP PicoXMLParser
+#endif
+
 using namespace std;
 
 namespace UPnPClient {
 
 
-class LastchangeParser : public inputRefXMLParser {
+class LastchangeParser : public XMLPARSERTP {
 public:
     LastchangeParser(const string& input, std::unordered_map<string,string>& 
props)
-        : inputRefXMLParser(input), m_props(props) {}
+        : XMLPARSERTP(input), m_props(props) {}
 
 protected:
     void StartElement(const XML_Char* name, const XML_Char** attrs) override
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/cdircontent.cxx 
new/libupnpp-1.0.4/libupnpp/control/cdircontent.cxx
--- old/libupnpp-1.0.3/libupnpp/control/cdircontent.cxx 2025-04-09 
18:24:59.000000000 +0200
+++ new/libupnpp-1.0.4/libupnpp/control/cdircontent.cxx 2026-01-18 
09:02:44.000000000 +0100
@@ -19,18 +19,25 @@
 
 #include <cstring>
 
-#include <unordered_map>
 #include <string>
 #include <vector>
 #include <iostream>
 
 #include "libupnpp/control/cdircontent.hxx"
-#include "libupnpp/expatmm.h"
 #include "libupnpp/log.hxx"
 #include "libupnpp/upnpp_p.hxx"
 #include "libupnpp/soaphelp.hxx"
 #include "libupnpp/smallut.h"
 
+#ifdef UPNPP_USE_EXPAT
+#include "libupnpp/expatmm.h"
+#define XMLPARSERTP inputRefXMLParser
+#else
+#define PICOXML_EXPAT_STARTELEMENT_COMPAT
+#include "libupnpp/picoxml.h"
+#define XMLPARSERTP PicoXMLParser
+#endif
+
 using namespace UPnPP;
 
 namespace UPnPClient {
@@ -56,17 +63,18 @@
 };
 
 // An XML parser which builds directory contents from DIDL-lite input.
-class UPnPDirParser : public inputRefXMLParser {
+class UPnPDirParser : public XMLPARSERTP {
 public:
     UPnPDirParser(UPnPDirContent& dir, const std::string& input)
-        : inputRefXMLParser(input), m_dir(dir) {
+        : XMLPARSERTP(input), m_dir(dir) {
         //LOGDEB("UPnPDirParser: input: " << input << '\n');
     }
     UPnPDirContent& m_dir;
 protected:
+    /* !! Beware: if changed to use the attrs, and using picoxml, need to 
define
+       PICOXML_EXPAT_STARTELEMENT_COMPAT before the picoxml.h include */
     void StartElement(const XML_Char* name, const XML_Char**) override {
-        //LOGDEB("startElement: name [" << name << "]" << " bpos " <<
-        //             XML_GetCurrentByteIndex(expat_parser) << endl);
+        //LOGDEB("startElement: name [" << name << "]" << " bpos " << 
getCurrentByteIndex() << '\n');
         auto& mapattrs = m_path.back().attributes;
         switch (name[0]) {
         case 'c':
@@ -131,10 +139,15 @@
     }
 
     void storeFrag(bool isContainer) {
-        size_t len = XML_GetCurrentByteIndex(expat_parser) - 
m_path.back().start_index;
+        auto len = getCurrentByteIndex() - m_path.back().start_index;
         if (len > 0) {
-            m_tobj.m_didlfrag = m_input.substr(m_path.back().start_index, len) 
+
-                (isContainer ? "</container>" : "</item>");
+            m_tobj.m_didlfrag = m_input.substr(m_path.back().start_index, len);
+#ifdef UPNPP_USE_EXPAT
+            // Expat returns the offset for the starting byte of the closing 
tag
+            // We could mimick this in picoxml, but why?
+            m_tobj.m_didlfrag += (isContainer ? "</container>" : "</item>");
+#endif
+            LOGDEB1("DIDLFRAG [" << m_tobj.m_didlfrag << "]\n");
         }
     }
     void EndElement(const XML_Char* name) override {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/description.cxx 
new/libupnpp-1.0.4/libupnpp/control/description.cxx
--- old/libupnpp-1.0.3/libupnpp/control/description.cxx 2025-04-23 
12:41:08.000000000 +0200
+++ new/libupnpp-1.0.4/libupnpp/control/description.cxx 2026-01-18 
09:02:44.000000000 +0100
@@ -27,20 +27,28 @@
 #include <upnp.h>
 
 #include "libupnpp/upnpplib.hxx"
-#include "libupnpp/expatmm.h"
 #include "libupnpp/upnpp_p.hxx"
 #include "libupnpp/smallut.h"
 #include "libupnpp/log.hxx"
 
+#ifdef UPNPP_USE_EXPAT
+#include "libupnpp/expatmm.h"
+#define XMLPARSERTP inputRefXMLParser
+#else
+#define PICOXML_EXPAT_STARTELEMENT_COMPAT
+#include "libupnpp/picoxml.h"
+#define XMLPARSERTP PicoXMLParser
+#endif
+
 using namespace std;
 using namespace UPnPP;
 
 namespace UPnPClient {
 
-class UPnPDeviceParser : public inputRefXMLParser {
+class UPnPDeviceParser : public XMLPARSERTP {
 public:
     UPnPDeviceParser(const string& input, UPnPDeviceDesc& device)
-        : inputRefXMLParser(input), m_device(device) {}
+        : XMLPARSERTP(input), m_device(device) {}
 
 protected:
     void EndElement(const XML_Char* name) override
@@ -139,19 +147,19 @@
 
 
 // XML parser for the service description document (SCPDURL)
-class ServiceDescriptionParser : public inputRefXMLParser {
+class ServiceDescriptionParser : public XMLPARSERTP {
 public:
     ServiceDescriptionParser(UPnPServiceDesc::Parsed& out, const string& input)
-        : inputRefXMLParser(input), m_parsed(out) {
+        : XMLPARSERTP(input), m_parsed(out) {
         m_parsed.stateTable.clear();
         m_parsed.actionList.clear();
     }
 
 protected:
-    void StartElement(const XML_Char* name, const XML_Char**) override
-    {
-        //LOGDEB("startElement: name [" << name << "]" << " bpos " <<
-        //             XML_GetCurrentByteIndex(expat_parser) << endl);
+    /* !! Beware: if changed to use the attrs, and using picoxml, need to 
define
+       PICOXML_EXPAT_STARTELEMENT_COMPAT before the picoxml.h include */
+    void StartElement(const XML_Char* name, const XML_Char**) override {
+        //LOGDEB("startElement: name [" << name << "]" << " bpos " << 
getCurrentByteIndex() << '\n');
         StackEl& lastelt = m_path.back();
         
         switch (name[0]) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/ohplaylist.cxx 
new/libupnpp-1.0.4/libupnpp/control/ohplaylist.cxx
--- old/libupnpp-1.0.3/libupnpp/control/ohplaylist.cxx  2024-04-23 
08:33:25.000000000 +0200
+++ new/libupnpp-1.0.4/libupnpp/control/ohplaylist.cxx  2026-01-18 
09:02:44.000000000 +0100
@@ -32,11 +32,19 @@
 #include "libupnpp/upnpavutils.hxx"
 #include "libupnpp/control/cdircontent.hxx"
 #include "libupnpp/control/service.hxx"
-#include "libupnpp/expatmm.h"
 #include "libupnpp/log.hxx"
 #include "libupnpp/soaphelp.hxx"
 #include "libupnpp/upnpp_p.hxx"
 
+#ifdef UPNPP_USE_EXPAT
+#include "libupnpp/expatmm.h"
+#define XMLPARSERTP inputRefXMLParser
+#else
+#define PICOXML_EXPAT_STARTELEMENT_COMPAT
+#include "libupnpp/picoxml.h"
+#define XMLPARSERTP PicoXMLParser
+#endif
+
 using namespace std;
 using namespace std::placeholders;
 using namespace UPnPP;
@@ -239,10 +247,10 @@
 // </TrackList>
 
 
-class OHTrackListParser : public inputRefXMLParser {
+class OHTrackListParser : public XMLPARSERTP {
 public:
     OHTrackListParser(const string& input, vector<OHPlaylist::TrackListEntry>* 
vp)
-        : inputRefXMLParser(input), m_v(vp)
+        : XMLPARSERTP(input), m_v(vp)
     {
         //LOGDEB("OHTrackListParser: input: " << input << '\n');
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/ohproduct.cxx 
new/libupnpp-1.0.4/libupnpp/control/ohproduct.cxx
--- old/libupnpp-1.0.3/libupnpp/control/ohproduct.cxx   2024-04-23 
08:18:31.000000000 +0200
+++ new/libupnpp-1.0.4/libupnpp/control/ohproduct.cxx   2026-01-18 
09:02:44.000000000 +0100
@@ -24,12 +24,20 @@
 #include <string>
 #include <vector>
 
-#include "libupnpp/expatmm.h"
 #include "libupnpp/log.hxx"
 #include "libupnpp/soaphelp.hxx"
 #include "libupnpp/upnpp_p.hxx"
 #include "libupnpp/smallut.h"
 
+#ifdef UPNPP_USE_EXPAT
+#include "libupnpp/expatmm.h"
+#define XMLPARSERTP inputRefXMLParser
+#else
+#define PICOXML_EXPAT_STARTELEMENT_COMPAT
+#include "libupnpp/picoxml.h"
+#define XMLPARSERTP PicoXMLParser
+#endif
+
 using namespace std::placeholders;
 using namespace UPnPP;
 
@@ -52,10 +60,10 @@
 // - Analog - Specifies an analog external input
 // - Digital - Specifies a digital external input
 // - Hdmi - Specifies a HDMI external input
-class OHSourceParser : public inputRefXMLParser {
+class OHSourceParser : public XMLPARSERTP {
 public:
     OHSourceParser(const std::string& input, std::vector<OHProduct::Source>& 
sources)
-        : inputRefXMLParser(input), m_sources(sources) {}
+        : XMLPARSERTP(input), m_sources(sources) {}
 
 protected:
     void EndElement(const XML_Char* name) override
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/ohradio.cxx 
new/libupnpp-1.0.4/libupnpp/control/ohradio.cxx
--- old/libupnpp-1.0.3/libupnpp/control/ohradio.cxx     2025-03-24 
12:58:42.000000000 +0100
+++ new/libupnpp-1.0.4/libupnpp/control/ohradio.cxx     2026-01-18 
09:02:44.000000000 +0100
@@ -33,9 +33,16 @@
 #include "libupnpp/control/cdircontent.hxx"
 #include "libupnpp/control/service.hxx"
 #include "libupnpp/log.hxx"
-#include "libupnpp/expatmm.h"
 #include "libupnpp/soaphelp.hxx"
-#include "libupnpp/upnpp_p.hxx"
+
+#ifdef UPNPP_USE_EXPAT
+#include "libupnpp/expatmm.h"
+#define XMLPARSERTP inputRefXMLParser
+#else
+#define PICOXML_EXPAT_STARTELEMENT_COMPAT
+#include "libupnpp/picoxml.h"
+#define XMLPARSERTP PicoXMLParser
+#endif
 
 using namespace std;
 using namespace std::placeholders;
@@ -244,10 +251,10 @@
 // </TrackList>
 
 
-class OHTrackListParser : public inputRefXMLParser {
+class OHTrackListParser : public XMLPARSERTP {
 public:
     OHTrackListParser(const string& input, vector<OHPlaylist::TrackListEntry>* 
vp)
-        : inputRefXMLParser(input), m_v(vp)
+        : XMLPARSERTP(input), m_v(vp)
     {
         //LOGDEB("OHTrackListParser: input: " << input << '\n');
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/control/service.cxx 
new/libupnpp-1.0.4/libupnpp/control/service.cxx
--- old/libupnpp-1.0.3/libupnpp/control/service.cxx     2025-03-24 
12:58:42.000000000 +0100
+++ new/libupnpp-1.0.4/libupnpp/control/service.cxx     2026-01-18 
09:02:44.000000000 +0100
@@ -168,7 +168,7 @@
 
     std::vector<std::pair<std::string, std::string>> response;
     if (opts && (opts->active_options & AOM_TIMEOUTMS)) {
-        response.emplace_back("timeoutms", lltodecstr(opts->timeoutms));
+        response.emplace_back("timeoutms", std::to_string(opts->timeoutms));
     }
     int errcode;
     std::string errdesc;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/expatmm.h 
new/libupnpp-1.0.4/libupnpp/expatmm.h
--- old/libupnpp-1.0.3/libupnpp/expatmm.h       2024-04-01 10:31:22.000000000 
+0200
+++ new/libupnpp-1.0.4/libupnpp/expatmm.h       2026-01-18 09:02:44.000000000 
+0100
@@ -23,6 +23,7 @@
 #ifndef _EXPATMM_EXPATXMLPARSER_H
 #define _EXPATMM_EXPATXMLPARSER_H
 
+#include <stdio.h>
 #include <expat.h>
 
 #include <cstring>
@@ -125,6 +126,9 @@
     virtual XML_Size getLastErrorColumn(void) const {
         return last_error_column;
     }
+    virtual XML_Index getCurrentByteIndex(void) const {
+        return XML_GetCurrentByteIndex(expat_parser);
+    }
     virtual std::string getLastErrorMessage(void) const {
         return last_error_message;
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/picoxml.h 
new/libupnpp-1.0.4/libupnpp/picoxml.h
--- old/libupnpp-1.0.3/libupnpp/picoxml.h       1970-01-01 01:00:00.000000000 
+0100
+++ new/libupnpp-1.0.4/libupnpp/picoxml.h       2026-01-18 09:02:44.000000000 
+0100
@@ -0,0 +1,473 @@
+/* Copyright (C) 2016 J.F.Dockes
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * 
+ *     (1) Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer. 
+ * 
+ *     (2) Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in
+ *     the documentation and/or other materials provided with the
+ *     distribution.  
+ *     
+ *     (3)The name of the author may not be used to
+ *     endorse or promote products derived from this software without
+ *     specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.  
+ **********************************************************/
+
+#ifndef _PICOXML_H_INCLUDED_
+#define _PICOXML_H_INCLUDED_
+
+/** 
+ * PicoXMLParser: a single include file parser for an XML-like, but restricted 
language, adequate
+ * for config files, not for arbitrary externally generated data.
+ * 
+ *  - The code depends on nothing but the C++ standard library
+ *  - The input to the parser is a single C++ string. We do not deal with
+ *    input in several pieces or files.
+ *  - SAX mode only. You have access to the current tag stack. 
+ *  - Checks for proper tag nesting and not much else.
+ *  - MISSING support: 
+ *    - NO literal '>' inside attribute values. Use &gt;
+ *    - No CDATA support
+ *    - No DOCTYPE support
+ *    - No processing of namespaces.
+ *  - Not fast: a lot of std::string and memory allocations.
+ *
+ * A typical input would be like the following (you can add XML declarations, 
whitespace and 
+ * newlines to taste).
+ *
+ * <top>top chrs1<sub attr="attrval">sub chrs</sub>top chrs2 <emptyelt /></top>
+ *
+ * Usage: subclass PicoXMLParser, overriding the methods in the "protected:" 
section (look there 
+ * for more details), call the constructor with your input, then call parse().
+ */
+
+#include <string>
+#include <vector>
+#include <map>
+#include <sstream>
+#include <iostream>
+
+// Expat compat
+typedef char XML_Char;
+
+class PicoXMLParser {
+public:
+    PicoXMLParser(const std::string& input)
+        : m_input(input), m_pos(0) {}
+
+    virtual ~PicoXMLParser() = default;
+    PicoXMLParser(const PicoXMLParser&) = delete;
+    PicoXMLParser& operator=(const PicoXMLParser&) = delete;
+
+    virtual bool parse() {
+        return _parse();
+    }
+    virtual bool Parse() {
+        return _parse();
+    }
+
+    virtual std::string getLastErrorMessage() {
+        return m_reason.str();
+    }
+    virtual std::string::size_type getCurrentByteIndex(void) {
+        return m_pos;
+    }
+    
+protected:
+
+    /* Methods to be overriden */
+
+    /** 
+     * Tag open handler.
+     * @param tagname the tag name 
+     * @param attrs a map of attribute name/value pairs
+     */
+    virtual void startElement(const std::string& /* nm */,
+                              const std::map<std::string, std::string>& /* 
attrs */) {}
+    /** Expatmm compat. */
+    virtual void StartElement(const XML_Char *, const XML_Char **) {}
+
+    /**
+     * Tag close handler. 
+     * You should probably have been accumulating text and stuff since
+     * the tag opening.
+     * @param tagname the tag name.
+     */
+    virtual void endElement(const std::string& /* nm */) {}
+    /** Expatmm compat */
+    virtual void EndElement(const XML_Char * /* nm */) {}
+
+    /**
+     * Non-tag data handler.
+     * @param data the data.
+     */
+    virtual void characterData(const std::string& /*data*/) {}
+    /** Expatmm compat */
+    virtual void CharacterData(const XML_Char *, int) {}
+
+    /** 
+     * Return current tag name stack. Deprecated, use m_path.
+     * This does not include the current (bottom) tag.
+     * Attributes are not kept in there, you'll have to do this yourself.
+     * @return a const ref to a vector of tag names.
+     */
+    virtual const std::vector<std::string>& tagStack() {
+        return m_tagstack;
+    }
+
+    /** 
+     * Current element stack, including the bottom one
+     * Each entry includes the attributes and the starting character offset.
+     * The stack includes the last element (the one open is called for).
+     */
+    class StackEl {
+    public:
+        StackEl(const std::string& nm) : name(nm) {}
+        std::string name;
+        std::string::size_type start_index;
+        std::map<std::string,std::string> attributes;
+        std::string data; // Derived class usage
+    };
+    std::vector<StackEl> m_path;
+
+    const std::string& m_input;
+
+private:
+    std::string::size_type m_pos{0};
+    std::string::size_type m_tagstart{0};
+    std::stringstream m_reason;
+    std::vector<std::string> m_tagstack;
+
+    void _startelem(const std::string& tagname,
+                    const std::map<std::string, std::string>& attrs, bool 
empty) {
+        m_path.emplace_back(tagname);
+        StackEl& lastelt = m_path.back();
+        lastelt.start_index = m_tagstart;
+        lastelt.attributes = attrs;
+
+        startElement(tagname, attrs);
+
+#ifdef PICOXML_EXPAT_STARTELEMENT_COMPAT
+        { // Call Expat-compatible StartElement
+            auto sz = 2*(attrs.size()+1);
+            if (m_vattrs.size() < sz) {
+                m_vattrs.resize(sz);
+            }
+            auto it = m_vattrs.begin();
+            for (const auto& attr : attrs) {
+                *it++ = attr.first.c_str();
+                *it++ = attr.second.c_str();
+            }
+            *it++ = nullptr;
+            *it++ = nullptr;
+            StartElement(tagname.c_str(), m_vattrs.data());
+        }
+#else
+            StartElement(tagname.c_str(), nullptr);
+#endif
+        
+        m_tagstack.push_back(tagname);      // Compat
+        if (empty) {
+            _endelem(tagname);
+        }
+    }
+
+    void _endelem(const std::string& tagname) {
+        m_tagstack.pop_back();
+        endElement(tagname);
+        EndElement(tagname.c_str());
+        m_path.pop_back();
+    }
+
+    bool _parse() {
+        // skip initial whitespace and XML decl. On success, returns with
+        // current pos on first tag '<'
+        if (!skipDecl()) {
+            return false;
+        }
+        if (nomore()) {
+            // empty file
+            return true;
+        }
+        
+        for (;;) {
+            // Current char is '<' and the next char is not '?'
+            //std::cerr << "m_pos " << m_pos << " char " << m_input[m_pos] << 
"\n";
+            // skipComment also processes
+            bool wascomment;
+            if (!skipComment(wascomment)) {
+                return false;
+            }
+            if (nomore()) {
+                if (!m_tagstack.empty()) {
+                    m_reason << "EOF hit inside open element at cpos " << 
m_pos;
+                    return false;
+                }
+                return true;
+            }
+            if (wascomment)
+                continue;
+            m_tagstart = m_pos;
+            m_pos++;
+            if (nomore()) {
+                m_reason << "EOF within tag";
+                return false;
+            }
+            std::string::size_type spos = m_pos;
+            int isendtag = m_input[m_pos] == '/' ? 1 : 0;
+
+            skipStr(">");
+            if (m_pos == std::string::npos || m_pos <= spos + 1) {
+                m_reason << "Empty tag or EOF inside tag. pos " << spos;
+                return false;
+            }
+
+            int emptyel = m_input[m_pos-2] == '/' ? 1 : 0;
+            if (emptyel && isendtag) {
+                m_reason << "Bad tag </xx/> at cpos " << spos;
+                return false;
+            }
+                    
+            std::string tag = m_input.substr(spos + isendtag, m_pos - (spos + 
1 + isendtag + emptyel));
+            //std::cerr << "TAG NAME [" << tag << "]\n";
+            trimtag(tag);
+            std::map<std::string, std::string> attrs;
+            if (!parseattrs(tag, attrs)) {
+                return false;
+            }
+            if (isendtag) {
+                if (m_tagstack.empty() || tag.compare(m_tagstack.back())) {
+                    m_reason << "Closing not open tag " << tag << " at cpos " 
<< m_pos;
+                    return false;
+                }
+                _endelem(tag);
+            } else {
+                _startelem(tag, attrs, emptyel);
+            }
+            if (!_chardata()) {
+                return false;
+            }
+        }
+        return false;
+    }
+
+    bool _chardata() {
+        std::string::size_type spos = m_pos;
+        m_pos = m_input.find("<", m_pos);
+        if (nomore()) {
+            return true;
+        }
+        if (m_pos != spos) {
+            std::string data{unQuote(m_input.substr(spos, m_pos - spos))};
+            if (m_unquoteError) {
+                return false;
+            }
+            characterData(data);
+            CharacterData(data.c_str(), static_cast<int>(data.size()));
+        }
+        return true;
+    }
+    
+    bool nomore(int sz = 0) const {
+        return m_pos == std::string::npos || m_pos >= m_input.size() - sz;
+    }
+    bool skipWS(const std::string& in, std::string::size_type& pos) {
+        if (pos == std::string::npos)
+            return false;
+        pos = in.find_first_not_of(" \t\n\r", pos);
+        return pos != std::string::npos;
+    }
+    bool skipStr(const std::string& str) {
+        if (m_pos == std::string::npos)
+            return false;
+        m_pos = m_input.find(str, m_pos);
+        if (m_pos != std::string::npos)
+            m_pos += str.size();
+        return m_pos != std::string::npos;
+    }
+    int peek(int sz = 0) const {
+        if (nomore(sz))
+            return -1;
+        return m_input[m_pos + 1 + sz];
+    }
+    void trimtag(std::string& tag) {
+        auto trimpos = tag.find_last_not_of(" \t\n\r");
+        if (trimpos != std::string::npos)
+            tag.resize(trimpos + 1);
+    }
+
+    bool skipDecl() {
+        for (;;) {
+            if (!skipWS(m_input, m_pos)) {
+                m_reason << "EOF during initial ws skip";
+                return true;
+            }
+            if (m_input[m_pos] != '<') {
+                m_reason << "EOF file does not begin with decl/tag: m_pos " <<
+                    m_pos << " char [" << m_input[m_pos] << "]\n";
+                return false;
+            }
+            if (peek() == '?') {
+                if (!skipStr("?>")) {
+                    m_reason << "EOF while looking for end of xml decl";
+                    return false;
+                }
+            } else {
+                break;
+            }
+        }
+        return true;
+    }
+
+    bool skipComment(bool& wascomment) {
+        wascomment = false;
+        if (nomore()) {
+            return true;
+        }
+        if (m_input[m_pos] != '<') {
+            m_reason << "Internal error: skipComment called with wrong "
+                "start: m_pos " << m_pos << " char [" << m_input[m_pos] << 
"]\n";
+            return false;
+        }
+        if (peek() == '!' && peek(1) == '-' && peek(2) == '-') {
+            if (!skipStr("-->")) {
+                m_reason << "EOF while looking for end of XML comment";
+                return false;
+            }
+            // Process possible characters until next tag
+            wascomment = true;
+            return _chardata();
+        }
+        return true;
+    }
+    
+    bool parseattrs(std::string& tag, std::map<std::string, std::string>& 
attrs) {
+        //std::cerr << "parseattrs: [" << tag << "]\n";
+        attrs.clear();
+        std::string::size_type spos = tag.find_first_of(" \t\n\r");
+        if (spos == std::string::npos)
+            return true;
+        std::string tagname = tag.substr(0, spos);
+        //std::cerr << "tag name [" << tagname << "] pos " << spos << "\n";
+        skipWS(tag, spos);
+
+        for (;;) {
+            //std::cerr << "top of loop [" << tag.substr(spos) << "]\n";
+            std::string::size_type epos = tag.find_first_of(" \t\n\r=", spos);
+            if (epos == std::string::npos) {
+                m_reason << "Bad attributes syntax at cpos " << m_pos + epos;
+                return false;
+            }
+            std::string attrnm = tag.substr(spos, epos - spos);
+            if (attrnm.empty()) {
+                m_reason << "Empty attribute name ?? at cpos " << m_pos + epos;
+                return false;
+            }
+            //std::cerr << "attr name [" << attrnm << "]\n";
+            skipWS(tag, epos);
+            if (epos == std::string::npos || epos == tag.size() - 1 ||
+                tag[epos] != '=') {
+                m_reason <<"Missing equal sign or value at cpos " << 
m_pos+epos;
+                return false;
+            }
+            epos++;
+            skipWS(tag, epos);
+            char qc{0};
+            if ((tag[epos] != '"' && tag[epos] != '\'') ||
+                epos == tag.size() - 1) {
+                m_reason << "Missing quote or value at cpos " << m_pos+epos;
+                return false;
+            }
+            qc = tag[epos];
+            spos = epos + 1;
+            epos = tag.find_first_of(qc, spos);
+            if (epos == std::string::npos) {
+                m_reason << "Missing closing quote at cpos " << m_pos+spos;
+                return false;
+            }
+            attrs[attrnm] = unQuote(tag.substr(spos, epos - spos));
+            if (m_unquoteError) {
+                return false;
+            }
+            //std::cerr << "attr value [" << attrs[attrnm] << "]\n";
+            if (epos == tag.size() - 1) {
+                break;
+            }
+            epos++;
+            skipWS(tag, epos);
+            if (epos == tag.size() - 1) {
+                break;
+            }
+            spos = epos;
+        }
+        tag = tagname;
+        return true;
+    }
+
+    std::string unQuote(const std::string &s) {
+        static const std::string e_quot{"quot"};
+        static const std::string e_amp{"amp"};
+        static const std::string e_apos{"apos"};
+        static const std::string e_lt{"lt"};
+        static const std::string e_gt{"gt"};
+
+        m_unquoteError = false;
+        std::string out;
+        out.reserve(s.size());
+        std::string::const_iterator it = s.begin();
+        std::string::size_type epos = 0;
+        while (it != s.end()) {
+            if (*it != '&') {
+                out += *it++;
+                continue;
+            }
+            // Position: m_pos minus the string size (including 2 quotes) plus 
position inside s
+            epos = m_pos - (s.size() + 2) + it - s.begin();
+            ++it;
+            std::string code;
+            while (it != s.end() && *it != ';') {
+                code += *it++;
+            }
+            if (it == s.end()) {
+                // Unexpected
+                m_reason << "End of quoted string, inside entity name at cpos 
" << epos;
+                m_unquoteError = true;
+                out.clear();
+                break;
+            }
+            ++it;
+            if (code == e_quot) {
+                out += '"';
+            } else if (code == e_amp) {
+                out += '&';
+            } else if (code == e_apos) {
+                out += '\'';
+            } else if (code == e_lt) {
+                out += '<';
+            } else if (code == e_gt) {
+                out += '>';
+            }
+        }
+        return out;
+    }
+
+    std::vector<const char *> m_vattrs;
+    bool m_unquoteError;
+};
+#endif /* _PICOXML_H_INCLUDED_ */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/smallut.cpp 
new/libupnpp-1.0.4/libupnpp/smallut.cpp
--- old/libupnpp-1.0.3/libupnpp/smallut.cpp     2025-04-28 14:06:58.000000000 
+0200
+++ new/libupnpp-1.0.4/libupnpp/smallut.cpp     2026-01-18 09:02:44.000000000 
+0100
@@ -30,8 +30,8 @@
 #include <list>
 #include <map>
 #include <set>
-#include <unordered_set>
 #include <string>
+#include <unordered_set>
 #include <utility>
 #include <vector>
 
@@ -451,28 +451,43 @@
     return s;
 }
 
-template <class T> std::string commonprefix(const T& values)
+std::string commonprefix(const std::string& curpfx, const std::string& value, 
bool aspaths)
+{
+    if (curpfx.empty()) {
+        return value;
+    }
+    auto prefix = curpfx;
+    while (value.compare(0, prefix.size(), prefix)) {
+        // If the prefix has an ending / and the value is identical with no / 
keep the longer
+        if (aspaths && prefix.back() == '/' && !prefix.compare(0, 
prefix.size()-1, value)) {
+            break;
+        }
+        prefix.pop_back();
+        if (prefix.empty())
+            return {};
+    }
+    if (aspaths &&
+        value.size() > prefix.size() && prefix.back() != '/' && 
value[prefix.size()] == '/') {
+        prefix += '/';
+    }
+            
+    return prefix;
+}
+
+template <class T> std::string commonprefix(const T& values, bool aspaths)
 {
     if (values.empty())
         return {};
     if (values.size() == 1)
         return *values.begin();
-    unsigned int i = 0;
-    for (;;++i) {
-        auto it = values.begin();
-        if (it->size() <= i) {
-            goto out;
-        }
-        auto val = (*it)[i];
-        it++;
-        for (;it < values.end(); it++) {
-            if (it->size() <= i || (*it)[i] != val) {
-                goto out;
-            }
-        }
+    std::string prefix;
+    // Look at all input  strings
+    for (const auto& value : values) {
+        prefix = commonprefix(prefix, value, aspaths);
+        if (prefix.empty())
+            return std::string();
     }
-out:
-    return values.begin()->substr(0, i);
+    return prefix;
 }
 
 #ifdef SMALLUT_EXTERNAL_INSTANTIATIONS
@@ -499,7 +514,8 @@
     const std::unordered_set<std::string>&);
 template std::string stringsToCSV<std::list<std::string>>(const 
std::list<std::string>&, char);
 template std::string stringsToCSV<std::vector<std::string>>(const 
std::vector<std::string>&, char);
-template std::string commonprefix<std::vector<std::string>>(const 
std::vector<std::string>&values);
+template std::string commonprefix<std::vector<std::string>>(const 
std::vector<std::string>&values,
+                                                            bool aspaths);
 #endif
 
 void stringToTokens(const std::string& str, std::vector<std::string>& tokens,
@@ -825,65 +841,6 @@
     return pcSubst(in, out, std::bind(&PcSubstMapMapper::domap, &mapper, _1));
 }
 
-void ulltodecstr(uint64_t val, std::string& buf)
-{
-    buf.clear();
-    if (val == 0) {
-        buf = "0";
-        return;
-    }
-
-    char rbuf[30];
-    int idx=29;
-    rbuf[idx--] = 0;
-    do {
-        rbuf[idx--] = '0' + val % 10;
-        val /= 10;
-    } while (val);
-
-    buf.assign(&rbuf[idx+1]);
-}
-
-void lltodecstr(int64_t val, std::string& buf)
-{
-    buf.clear();
-    if (val == 0) {
-        buf = "0";
-        return;
-    }
-
-    bool neg = val < 0;
-    if (neg) {
-        val = -val;
-    }
-
-    char rbuf[30];
-    int idx=29;
-    rbuf[idx--] = 0;
-    do {
-        rbuf[idx--] = '0' + val % 10;
-        val /= 10;
-    } while (val);
-    if (neg) {
-        rbuf[idx--] = '-';
-    }
-    buf.assign(&rbuf[idx+1]);
-}
-
-std::string lltodecstr(int64_t val)
-{
-    std::string buf;
-    lltodecstr(val, buf);
-    return buf;
-}
-
-std::string ulltodecstr(uint64_t val)
-{
-    std::string buf;
-    ulltodecstr(val, buf);
-    return buf;
-}
-
 // Convert byte count into unit (KB/MB...) appropriate for display
 std::string displayableBytes(int64_t size)
 {
@@ -904,7 +861,7 @@
         roundable = double(size) / 1E9;
     }
     size = int64_t(std::round(roundable));
-    return lltodecstr(size).append(unit);
+    return std::to_string(size).append(unit);
 }
 
 std::string breakIntoLines(const std::string& in, unsigned int ll, unsigned 
int maxlines)
@@ -1286,6 +1243,46 @@
     return true;
 }
 
+
+
+// Extract a numeric part from an alphanumeric string
+static bool extractNumber(const std::string &s, size_t &i, int &num)
+{
+    if (i >= s.size()) return false;
+    size_t start = i;
+//    if (s[start] == '0' && start + 1 < s.size() && isdigit(s[start + 1])) {
+        // Handle leading zeros if needed
+//    }
+    while (i < s.size() && isdigit(s[i])) i++;
+    if (i == start) return false;
+    num = std::stoi(s.substr(start, i - start));
+    return true;
+}
+
+// Custom comparator for sorting alphanumeric strings with natural sorting of 
the numeric parts
+static bool naturalCompare(const std::string &a, const std::string &b)
+{
+    size_t i = 0, j = 0;
+    while (i < a.size() && j < b.size()) {
+        if (isdigit(a[i]) && isdigit(b[j])) {
+            int numA, numB;
+            extractNumber(a, i, numA);
+            extractNumber(b, j, numB);
+            if (numA != numB) return numA < numB;
+        } else {
+            if (a[i] != b[j]) return a[i] < b[j];
+            i++; j++;
+        }
+    }
+    return a.size() < b.size();
+}
+
+void sortAlphanumStrings(std::vector<std::string> & strings)
+{
+    std::sort(strings.begin(), strings.end(), naturalCompare);
+}
+
+
 void millisleep(int millis)
 {
 #ifdef _WIN32
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/smallut.h 
new/libupnpp-1.0.4/libupnpp/smallut.h
--- old/libupnpp-1.0.3/libupnpp/smallut.h       2025-04-27 08:40:40.000000000 
+0200
+++ new/libupnpp-1.0.4/libupnpp/smallut.h       2026-02-10 17:24:58.000000000 
+0100
@@ -86,6 +86,9 @@
 extern void stringtoupper(std::string& io);
 extern std::string stringtoupper(const std::string& io);
 extern bool beginswith(const std::string& b, const std::string& sml);
+inline bool startswith(const std::string& b, const std::string& sml) {
+    return beginswith(b, sml);
+}
 extern bool endswith(const std::string& bg, const std::string& sml);
 
 #ifdef _WIN32
@@ -136,7 +139,11 @@
 template <class T> std::string stringsToCSV(const T& tokens, char sep = ',');
 
 /** Find longest common prefix for bunch of strings */
-template <class T> std::string commonprefix(const T& values);
+template <class T> std::string commonprefix(const T& values, bool aspaths = 
false);
+
+/** Same, progressive way. Initially call with curpfx=="". Returns newprefix.
+  *** If the return value is empty, STOP CALLING ***, else we start again with 
the next value. */
+std::string commonprefix(const std::string& curpfx, const std::string& value, 
bool aspaths);
 
 /**
  * Split input string. No handling of quoting.
@@ -182,11 +189,6 @@
 /** Truncate a string to a given maxlength, avoiding cutting off midword if 
reasonably possible. */
 extern std::string truncate_to_word(const std::string& input, 
std::string::size_type maxlen);
 
-void ulltodecstr(uint64_t val, std::string& buf);
-void lltodecstr(int64_t val, std::string& buf);
-std::string lltodecstr(int64_t val);
-std::string ulltodecstr(uint64_t val);
-
 /** Convert byte count into unit (KB/MB...) appropriate for display */
 std::string displayableBytes(int64_t size);
 
@@ -292,6 +294,9 @@
 /// Decode percent-encoded string
 extern std::string pc_decode(const std::string&);
 
+/// Sort alphanumeric strings with integer ordering for the numeric parts.
+extern void sortAlphanumStrings(std::vector<std::string> &strings);
+
 /// Parse HTTP range header value into a vector of offset pairs. -1 is used as 
a placeholder
 /// wherever a part of a range is absent: either for a missing end or for a 
suffix range (absent
 /// start meaning count from the end).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/upnpplib.cxx 
new/libupnpp-1.0.4/libupnpp/upnpplib.cxx
--- old/libupnpp-1.0.3/libupnpp/upnpplib.cxx    2025-05-26 08:47:32.000000000 
+0200
+++ new/libupnpp-1.0.4/libupnpp/upnpplib.cxx    2026-01-18 09:02:44.000000000 
+0100
@@ -319,7 +319,7 @@
 string LibUPnP::port()
 {
     unsigned short prt = UpnpGetServerPort();
-    return ulltodecstr(prt);
+    return std::to_string(prt);
 }
 
 int LibUPnP::Internal::setupWebServer(const string& description, 
UpnpDevice_Handle *dvh)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/libupnpp/upnpplib.hxx 
new/libupnpp-1.0.4/libupnpp/upnpplib.hxx
--- old/libupnpp-1.0.3/libupnpp/upnpplib.hxx    2025-05-26 08:48:35.000000000 
+0200
+++ new/libupnpp-1.0.4/libupnpp/upnpplib.hxx    2026-03-20 09:33:25.000000000 
+0100
@@ -26,7 +26,7 @@
 /** Version components. */
 #define LIBUPNPP_VERSION_MAJOR 1
 #define LIBUPNPP_VERSION_MINOR 0
-#define LIBUPNPP_VERSION_REVISION 3
+#define LIBUPNPP_VERSION_REVISION 4
 /// Got this from Xapian...
 #define LIBUPNPP_AT_LEAST(A,B,C)                                        \
     (LIBUPNPP_VERSION_MAJOR > (A) ||                                    \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/meson.build 
new/libupnpp-1.0.4/meson.build
--- old/libupnpp-1.0.3/meson.build      2025-05-26 08:48:35.000000000 +0200
+++ new/libupnpp-1.0.4/meson.build      2026-03-20 09:33:25.000000000 +0100
@@ -2,7 +2,7 @@
   'libupnpp',
   'cpp',
   license: 'LGPL 2.1+',
-  version: '1.0.3', # VERSIONCOMMENT keep this here, used by setversion.sh
+  version: '1.0.4', # VERSIONCOMMENT keep this here, used by setversion.sh
   default_options: ['cpp_std=c++17', 'buildtype=debugoptimized'],
   meson_version: '>=0.49',
 )
@@ -25,7 +25,10 @@
 deps += dependency('threads')
 deps += dependency('libnpupnp')
 deps += dependency('libcurl')
-deps += dependency('expat')
+if get_option('use_expat')
+  deps += dependency('expat')
+  add_project_arguments('-DUPNPP_USE_EXPAT', language: 'cpp')
+endif
 
 # Note: meson sets -D_FILE_OFFSET_BITS=64 by default
 if get_option('default_library') != 'static'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/meson_options.txt 
new/libupnpp-1.0.4/meson_options.txt
--- old/libupnpp-1.0.3/meson_options.txt        2024-04-01 10:14:13.000000000 
+0200
+++ new/libupnpp-1.0.4/meson_options.txt        2026-01-18 09:02:44.000000000 
+0100
@@ -1,3 +1,3 @@
-option('expat', type : 'feature',
-  description : 'Use expat',
+option('use_expat', type : 'boolean', value: 'false',
+  description : 'Use expat instead of picoxml',
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/qmk/config.h 
new/libupnpp-1.0.4/qmk/config.h
--- old/libupnpp-1.0.3/qmk/config.h     2025-05-26 08:48:35.000000000 +0200
+++ new/libupnpp-1.0.4/qmk/config.h     2026-03-20 09:33:25.000000000 +0100
@@ -3,6 +3,6 @@
 
 // This is only used with qmake on Windows and MacOS with qmake (it is 
generated by meson in the
 // build dir).
-#define LIBUPNPP_VERSION "1.0.3"
+#define LIBUPNPP_VERSION "1.0.4"
 
 #endif // _LIBUPNPPCONFIG_H_INCLUDED
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libupnpp-1.0.3/qmk/libupnpp.pro.user 
new/libupnpp-1.0.4/qmk/libupnpp.pro.user
--- old/libupnpp-1.0.3/qmk/libupnpp.pro.user    2023-10-11 10:48:22.000000000 
+0200
+++ new/libupnpp-1.0.4/qmk/libupnpp.pro.user    1970-01-01 01:00:00.000000000 
+0100
@@ -1,406 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 10.0.1, 2023-08-31T17:53:24. -->
-<qtcreator>
- <data>
-  <variable>EnvironmentId</variable>
-  <value type="QByteArray">{8650a31b-ca0b-4a0b-b764-066b30ac029a}</value>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.ActiveTarget</variable>
-  <value type="qlonglong">0</value>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.EditorSettings</variable>
-  <valuemap type="QVariantMap">
-   <value type="bool" key="EditorConfiguration.AutoIndent">true</value>
-   <value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
-   <value type="bool" 
key="EditorConfiguration.CamelCaseNavigation">true</value>
-   <valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
-    <value type="QString" key="language">Cpp</value>
-    <valuemap type="QVariantMap" key="value">
-     <value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
-    </valuemap>
-   </valuemap>
-   <value type="qlonglong" key="EditorConfiguration.CodeStyle.Count">1</value>
-   <value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
-   <value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
-   <value type="int" key="EditorConfiguration.IndentSize">4</value>
-   <value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
-   <value type="int" key="EditorConfiguration.MarginColumn">80</value>
-   <value type="bool" key="EditorConfiguration.MouseHiding">true</value>
-   <value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
-   <value type="int" key="EditorConfiguration.PaddingMode">1</value>
-   <value type="bool" 
key="EditorConfiguration.PreferSingleLineComments">false</value>
-   <value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
-   <value type="bool" key="EditorConfiguration.ShowMargin">false</value>
-   <value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
-   <value type="bool" 
key="EditorConfiguration.SmartSelectionChanging">true</value>
-   <value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
-   <value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
-   <value type="int" key="EditorConfiguration.TabSize">8</value>
-   <value type="bool" key="EditorConfiguration.UseGlobal">true</value>
-   <value type="bool" key="EditorConfiguration.UseIndenter">false</value>
-   <value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
-   <value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
-   <value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
-   <value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
-   <value type="QString" key="EditorConfiguration.ignoreFileTypes">*.md, *.MD, 
Makefile</value>
-   <value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
-   <value type="bool" 
key="EditorConfiguration.skipTrailingWhitespace">true</value>
-   <value type="bool" key="EditorConfiguration.tintMarginArea">true</value>
-  </valuemap>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.PluginSettings</variable>
-  <valuemap type="QVariantMap">
-   <valuelist type="QVariantList" key="ClangCodeModel.CustomCommandLineKey">
-    <value type="QString">-fno-delayed-template-parsing</value>
-   </valuelist>
-   <value type="bool" key="ClangCodeModel.UseGlobalConfig">true</value>
-   <value type="QString" 
key="ClangCodeModel.WarningConfigId">Builtin.Questionable</value>
-   <valuemap type="QVariantMap" key="ClangTools">
-    <value type="bool" key="ClangTools.AnalyzeOpenFiles">true</value>
-    <value type="bool" key="ClangTools.BuildBeforeAnalysis">true</value>
-    <value type="QString" 
key="ClangTools.DiagnosticConfig">Builtin.DefaultTidyAndClazy</value>
-    <value type="int" key="ClangTools.ParallelJobs">2</value>
-    <valuelist type="QVariantList" key="ClangTools.SelectedDirs"/>
-    <valuelist type="QVariantList" key="ClangTools.SelectedFiles"/>
-    <valuelist type="QVariantList" key="ClangTools.SuppressedDiagnostics"/>
-    <value type="bool" key="ClangTools.UseGlobalSettings">true</value>
-   </valuemap>
-  </valuemap>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.Target.0</variable>
-  <valuemap type="QVariantMap">
-   <value type="QString" key="DeviceType">Desktop</value>
-   <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 6.5.2 
MSVC2019 64bit</value>
-   <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 6.5.2 
MSVC2019 64bit</value>
-   <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">qt.qt6.652.win64_msvc2019_64_kit</value>
-   <value type="qlonglong" 
key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
-   <value type="qlonglong" 
key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
-   <value type="qlonglong" 
key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
-   <valuemap type="QVariantMap" 
key="ProjectExplorer.Target.BuildConfiguration.0">
-    <value type="int" key="EnableQmlDebugging">0</value>
-    <value type="QString" 
key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\bill\Documents\upnp\libupnpp\build-libupnpp-Desktop_Qt_6_5_2_MSVC2019_64bit-Debug</value>
-    <value type="QString" 
key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/bill/Documents/upnp/libupnpp/build-libupnpp-Desktop_Qt_6_5_2_MSVC2019_64bit-Debug</value>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
-      <value type="bool" 
key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
-      <valuelist type="QVariantList" 
key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
-     </valuemap>
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <value type="QString" 
key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
-     </valuemap>
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" 
key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" 
key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" 
key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
-    <value type="bool" 
key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
-    <valuelist type="QVariantList" 
key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="int" 
key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
-   </valuemap>
-   <valuemap type="QVariantMap" 
key="ProjectExplorer.Target.BuildConfiguration.1">
-    <value type="QString" 
key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\bill\Documents\upnp\libupnpp\build-libupnpp-Desktop_Qt_6_5_2_MSVC2019_64bit-Release</value>
-    <value type="QString" 
key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/bill/Documents/upnp/libupnpp/build-libupnpp-Desktop_Qt_6_5_2_MSVC2019_64bit-Release</value>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
-      <value type="bool" 
key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
-      <valuelist type="QVariantList" 
key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
-     </valuemap>
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <value type="QString" 
key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
-     </valuemap>
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" 
key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" 
key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" 
key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
-    <value type="bool" 
key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
-    <valuelist type="QVariantList" 
key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="int" 
key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
-    <value type="int" key="QtQuickCompiler">0</value>
-   </valuemap>
-   <valuemap type="QVariantMap" 
key="ProjectExplorer.Target.BuildConfiguration.2">
-    <value type="int" key="EnableQmlDebugging">0</value>
-    <value type="QString" 
key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\bill\Documents\upnp\libupnpp\build-libupnpp-Desktop_Qt_6_5_2_MSVC2019_64bit-Profile</value>
-    <value type="QString" 
key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/bill/Documents/upnp/libupnpp/build-libupnpp-Desktop_Qt_6_5_2_MSVC2019_64bit-Profile</value>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
-      <value type="bool" 
key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
-      <valuelist type="QVariantList" 
key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
-     </valuemap>
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <value type="QString" 
key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
-     </valuemap>
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" 
key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" 
key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" 
key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
-    <value type="bool" 
key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
-    <valuelist type="QVariantList" 
key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="int" 
key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
-    <value type="int" key="QtQuickCompiler">0</value>
-    <value type="int" key="SeparateDebugInfo">0</value>
-   </valuemap>
-   <value type="qlonglong" 
key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
-   <valuemap type="QVariantMap" 
key="ProjectExplorer.Target.DeployConfiguration.0">
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">0</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
-    </valuemap>
-    <value type="int" 
key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.DeployConfiguration.CustomData"/>
-    <value type="bool" 
key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
-   </valuemap>
-   <value type="qlonglong" 
key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
-   <valuemap type="QVariantMap" 
key="ProjectExplorer.Target.RunConfiguration.0">
-    <valuelist type="QVariantList" key="CustomOutputParsers"/>
-    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
-    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
-    <value type="QString" 
key="ProjectExplorer.RunConfiguration.BuildKey"></value>
-    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-   </valuemap>
-   <value type="qlonglong" 
key="ProjectExplorer.Target.RunConfigurationCount">1</value>
-  </valuemap>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.Target.1</variable>
-  <valuemap type="QVariantMap">
-   <value type="QString" key="DeviceType">Desktop</value>
-   <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.15.2 
MSVC2019 32bit</value>
-   <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.15.2 
MSVC2019 32bit</value>
-   <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5152.win32_msvc2019_kit</value>
-   <value type="qlonglong" 
key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
-   <value type="qlonglong" 
key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
-   <value type="qlonglong" 
key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
-   <valuemap type="QVariantMap" 
key="ProjectExplorer.Target.BuildConfiguration.0">
-    <value type="int" key="EnableQmlDebugging">0</value>
-    <value type="QString" 
key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\bill\Documents\upnp\libupnpp\qmk\..\build-libupnpp-Desktop_Qt_5_15_2_MSVC2019_32bit-Debug</value>
-    <value type="QString" 
key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/bill/Documents/upnp/libupnpp/build-libupnpp-Desktop_Qt_5_15_2_MSVC2019_32bit-Debug</value>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
-      <value type="bool" 
key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
-      <valuelist type="QVariantList" 
key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
-     </valuemap>
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <value type="QString" 
key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
-     </valuemap>
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" 
key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" 
key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" 
key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
-    <value type="bool" 
key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
-    <valuelist type="QVariantList" 
key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Debug</value>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="int" 
key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
-   </valuemap>
-   <valuemap type="QVariantMap" 
key="ProjectExplorer.Target.BuildConfiguration.1">
-    <value type="QString" 
key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\bill\Documents\upnp\libupnpp\qmk\..\build-libupnpp-Desktop_Qt_5_15_2_MSVC2019_32bit-Release</value>
-    <value type="QString" 
key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/bill/Documents/upnp/libupnpp/build-libupnpp-Desktop_Qt_5_15_2_MSVC2019_32bit-Release</value>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
-      <value type="bool" 
key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
-      <valuelist type="QVariantList" 
key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
-     </valuemap>
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <value type="QString" 
key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
-     </valuemap>
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" 
key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" 
key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" 
key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
-    <value type="bool" 
key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
-    <valuelist type="QVariantList" 
key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Release</value>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="int" 
key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
-    <value type="int" key="QtQuickCompiler">0</value>
-   </valuemap>
-   <valuemap type="QVariantMap" 
key="ProjectExplorer.Target.BuildConfiguration.2">
-    <value type="int" key="EnableQmlDebugging">0</value>
-    <value type="QString" 
key="ProjectExplorer.BuildConfiguration.BuildDirectory">C:\Users\bill\Documents\upnp\libupnpp\qmk\..\build-libupnpp-Desktop_Qt_5_15_2_MSVC2019_32bit-Profile</value>
-    <value type="QString" 
key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">C:/Users/bill/Documents/upnp/libupnpp/build-libupnpp-Desktop_Qt_5_15_2_MSVC2019_32bit-Profile</value>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
-      <value type="bool" 
key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
-      <valuelist type="QVariantList" 
key="QtProjectManager.QMakeBuildStep.SelectedAbis"/>
-     </valuemap>
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-     </valuemap>
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">2</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Build</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
-    </valuemap>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
-     <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
-      <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
-      <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
-      <value type="QString" 
key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
-     </valuemap>
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">1</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Clean</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
-    </valuemap>
-    <value type="int" 
key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
-    <value type="bool" 
key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
-    <valuelist type="QVariantList" 
key="ProjectExplorer.BuildConfiguration.CustomParsers"/>
-    <value type="bool" 
key="ProjectExplorer.BuildConfiguration.ParseStandardOutput">false</value>
-    <valuelist type="QVariantList" 
key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Profile</value>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
-    <value type="int" 
key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
-    <value type="int" key="QtQuickCompiler">0</value>
-    <value type="int" key="SeparateDebugInfo">0</value>
-   </valuemap>
-   <value type="qlonglong" 
key="ProjectExplorer.Target.BuildConfigurationCount">3</value>
-   <valuemap type="QVariantMap" 
key="ProjectExplorer.Target.DeployConfiguration.0">
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
-     <value type="qlonglong" 
key="ProjectExplorer.BuildStepList.StepsCount">0</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Deploy</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.DisplayName">Deploy</value>
-     <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Deploy</value>
-    </valuemap>
-    <value type="int" 
key="ProjectExplorer.BuildConfiguration.BuildStepListCount">1</value>
-    <valuemap type="QVariantMap" 
key="ProjectExplorer.DeployConfiguration.CustomData"/>
-    <value type="bool" 
key="ProjectExplorer.DeployConfiguration.CustomDataEnabled">false</value>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.DefaultDeployConfiguration</value>
-   </valuemap>
-   <value type="qlonglong" 
key="ProjectExplorer.Target.DeployConfigurationCount">1</value>
-   <valuemap type="QVariantMap" 
key="ProjectExplorer.Target.RunConfiguration.0">
-    <valuelist type="QVariantList" key="CustomOutputParsers"/>
-    <value type="int" key="PE.EnvironmentAspect.Base">2</value>
-    <valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
-    <value type="QString" 
key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.CustomExecutableRunConfiguration</value>
-    <value type="QString" 
key="ProjectExplorer.RunConfiguration.BuildKey"></value>
-    <value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
-    <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
-   </valuemap>
-   <value type="qlonglong" 
key="ProjectExplorer.Target.RunConfigurationCount">1</value>
-  </valuemap>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.TargetCount</variable>
-  <value type="qlonglong">2</value>
- </data>
- <data>
-  <variable>ProjectExplorer.Project.Updater.FileVersion</variable>
-  <value type="int">22</value>
- </data>
- <data>
-  <variable>Version</variable>
-  <value type="int">22</value>
- </data>
-</qtcreator>

Reply via email to