From 6e1604e47b3e27531a3cc6af289c9f8a11f69170 Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Fri, 31 May 2024 11:55:08 -0700
Subject: [PATCH 01/48] Update changelog for GLSL optimizations

---
 CHANGELOG.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7819c7abb1..495feae6dc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,6 +11,7 @@
 - Added support for [Python 3.12](https://github.com/AcademySoftwareFoundation/MaterialX/pull/1802) in Python wheel generation.
 - Added support for the [full set of shader generators](https://github.com/AcademySoftwareFoundation/MaterialX/pull/1771) in JavaScript.
 - Added an example script to [generate a MaterialX document](https://github.com/AcademySoftwareFoundation/MaterialX/pull/1746) from a folder of textures.
+- Added support for [frame timing](https://github.com/AcademySoftwareFoundation/MaterialX/pull/1739) in the MaterialX Viewer.
 - Added unit tests for [core utilities](https://github.com/AcademySoftwareFoundation/MaterialX/pull/1768) and [ESSL shader generation](https://github.com/AcademySoftwareFoundation/MaterialX/pull/1781).
 
 ### Changed
@@ -20,6 +21,7 @@
 - Extended the [switch node](https://github.com/AcademySoftwareFoundation/MaterialX/pull/1660) to ten inputs in MaterialX 1.39, with automatic upgrade logic for legacy documents.
 - Renamed the inputs of the [atan2 node](https://github.com/AcademySoftwareFoundation/MaterialX/pull/1659) in MaterialX 1.39, with automatic upgrade logic for legacy documents.
 - Renamed the [normalmap nodedef](https://github.com/AcademySoftwareFoundation/MaterialX/pull/1677) in MaterialX 1.39, with automatic upgrade logic for legacy documents.
+- Optimized [Fresnel](https://github.com/AcademySoftwareFoundation/MaterialX/pull/1732) [computations](https://github.com/AcademySoftwareFoundation/MaterialX/pull/1733) in [GLSL](https://github.com/AcademySoftwareFoundation/MaterialX/pull/1736), improving the performance of physically based shading in real-time renders.
 - Applied [lossless optimization](https://github.com/AcademySoftwareFoundation/MaterialX/pull/1738) to PNG and JPG textures in the MaterialX repository.
 
 ### Removed

From 24d7e0dfcecdfa4be0ce3e1167d5e9bc29dbf09e Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Fri, 31 May 2024 17:30:23 -0700
Subject: [PATCH 02/48] Static analysis fixes

This changelist addresses a handful of static analysis warnings flagged by PVS-Studio.
---
 source/MaterialXCore/Node.cpp        | 2 +-
 source/MaterialXCore/Version.cpp     | 2 +-
 source/MaterialXGenShader/TypeDesc.h | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/source/MaterialXCore/Node.cpp b/source/MaterialXCore/Node.cpp
index 17784c4a96..223452878d 100644
--- a/source/MaterialXCore/Node.cpp
+++ b/source/MaterialXCore/Node.cpp
@@ -690,7 +690,7 @@ void NodeGraph::removeInterfaceName(const string& inputPath)
             ElementPtr interfacePort = interface->getChild(interfaceName);
             if (interfacePort)
             {
-                InputPtr interfaceInput = interfacePort ? interfacePort->asA<Input>() : nullptr;
+                InputPtr interfaceInput = interfacePort->asA<Input>();
                 if (interfaceInput && interfaceInput->hasValue())
                 {
                     input->setValueString(interfaceInput->getValueString());
diff --git a/source/MaterialXCore/Version.cpp b/source/MaterialXCore/Version.cpp
index 12078ae33d..5fd7829d56 100644
--- a/source/MaterialXCore/Version.cpp
+++ b/source/MaterialXCore/Version.cpp
@@ -1013,7 +1013,7 @@ void Document::upgradeVersion()
                 continue;
             }
 
-            string channelString = port ? port->getAttribute("channels") : EMPTY_STRING;
+            const string& channelString = port->getAttribute("channels");
             if (channelString.empty())
             {
                 continue;
diff --git a/source/MaterialXGenShader/TypeDesc.h b/source/MaterialXGenShader/TypeDesc.h
index a0cd9bd89e..4560df8a0c 100644
--- a/source/MaterialXGenShader/TypeDesc.h
+++ b/source/MaterialXGenShader/TypeDesc.h
@@ -131,7 +131,7 @@ class MX_GENSHADER_API TypeDesc
     /// Hash operator
     struct Hasher
     {
-        size_t operator()(TypeDesc t) const
+        size_t operator()(const TypeDesc& t) const
         {
             return t._id;
         }

From 64567ccf9c65c9c48dff35531872dae8d98cd959 Mon Sep 17 00:00:00 2001
From: shill-lucasfilm <40578207+shill-lucasfilm@users.noreply.github.com>
Date: Sat, 1 Jun 2024 11:57:00 -0700
Subject: [PATCH 03/48] Zeltner sheen improvements (#1857)

Main changes:
* Fixed an issue with roughness = 0.
* Added comments to BRDF function to explain simpifications / optimisations.
* Added a corresponding sampling function.
---
 .../pbrlib/genglsl/lib/mx_microfacet.glsl     | 13 ++++-
 .../genglsl/lib/mx_microfacet_sheen.glsl      | 52 ++++++++++++++++---
 libraries/pbrlib/genglsl/mx_sheen_bsdf.glsl   |  2 +
 3 files changed, 59 insertions(+), 8 deletions(-)

diff --git a/libraries/pbrlib/genglsl/lib/mx_microfacet.glsl b/libraries/pbrlib/genglsl/lib/mx_microfacet.glsl
index 567d713a6b..f0e6f55c13 100644
--- a/libraries/pbrlib/genglsl/lib/mx_microfacet.glsl
+++ b/libraries/pbrlib/genglsl/lib/mx_microfacet.glsl
@@ -71,7 +71,7 @@ vec2 mx_spherical_fibonacci(int i, int numSamples)
     return vec2((float(i) + 0.5) / float(numSamples), mx_golden_ratio_sequence(i));
 }
 
-// Generate a uniform-weighted sample in the unit hemisphere.
+// Generate a uniform-weighted sample on the unit hemisphere.
 vec3 mx_uniform_sample_hemisphere(vec2 Xi)
 {
     float phi = 2.0 * M_PI * Xi.x;
@@ -82,6 +82,17 @@ vec3 mx_uniform_sample_hemisphere(vec2 Xi)
                 cosTheta);
 }
 
+// Generate a cosine-weighted sample on the unit hemisphere.
+vec3 mx_cosine_sample_hemisphere(vec2 Xi)
+{
+    float phi = 2.0 * M_PI * Xi.x;
+    float cosTheta = sqrt(Xi.y);
+    float sinTheta = sqrt(1.0 - Xi.y);
+    return vec3(cos(phi) * sinTheta,
+                sin(phi) * sinTheta,
+                cosTheta);
+}
+
 // Construct an orthonormal basis from a unit vector.
 // https://graphics.pixar.com/library/OrthonormalB/paper.pdf
 mat3 mx_orthonormal_basis(vec3 N)
diff --git a/libraries/pbrlib/genglsl/lib/mx_microfacet_sheen.glsl b/libraries/pbrlib/genglsl/lib/mx_microfacet_sheen.glsl
index 512f351058..fe4eee34e9 100644
--- a/libraries/pbrlib/genglsl/lib/mx_microfacet_sheen.glsl
+++ b/libraries/pbrlib/genglsl/lib/mx_microfacet_sheen.glsl
@@ -135,17 +135,55 @@ mat3 mx_orthonormal_basis_ltc(vec3 V, vec3 N, float NdotV)
 // Multiplication by directional albedo is handled by the calling function.
 float mx_zeltner_sheen_brdf(vec3 L, vec3 V, vec3 N, float NdotV, float roughness)
 {
-    mat3 toLTCSpace = transpose(mx_orthonormal_basis_ltc(V, N, NdotV));
-    vec3 wi = toLTCSpace * L;
+    mat3 toLTC = transpose(mx_orthonormal_basis_ltc(V, N, NdotV));
+    vec3 w = toLTC * L;
 
     float aInv = mx_zeltner_sheen_ltc_aInv(NdotV, roughness);
     float bInv = mx_zeltner_sheen_ltc_bInv(NdotV, roughness);
 
-    vec3 wiOrig = vec3(aInv*wi.x + bInv*wi.z, aInv * wi.y, wi.z);
-    float lenSqr = dot(wiOrig, wiOrig);
+    // Transform w to original configuration (clamped cosine).
+    //                 |aInv    0 bInv|
+    // wo = M^-1 . w = |   0 aInv    0| . w
+    //                 |   0    0    1|
+    vec3 wo = vec3(aInv*w.x + bInv*w.z, aInv * w.y, w.z);
+    float lenSqr = dot(wo, wo);
+
+    // D(w) = Do(M^-1.w / ||M^-1.w||) . |M^-1| / ||M^-1.w||^3
+    //      = Do(M^-1.w) . |M^-1| / ||M^-1.w||^4
+    //      = Do(wo) . |M^-1| / dot(wo, wo)^2
+    //      = Do(wo) . aInv^2 / dot(wo, wo)^2
+    //      = Do(wo) . (aInv / dot(wo, wo))^2
+    return max(wo.z, 0.0) * M_PI_INV * mx_square(aInv / lenSqr);
+}
+
+vec3 mx_zeltner_sheen_importance_sample(vec2 Xi, vec3 V, vec3 N, float roughness, out float pdf)
+{
+    float NdotV = clamp(dot(N, V), 0.0, 1.0);
+    roughness = clamp(roughness, 0.01, 1.0); // Clamp to range of original impl.
+
+    vec3 wo = mx_cosine_sample_hemisphere(Xi);
+
+    float aInv = mx_zeltner_sheen_ltc_aInv(NdotV, roughness);
+    float bInv = mx_zeltner_sheen_ltc_bInv(NdotV, roughness);
+
+    // Transform wo from original configuration (clamped cosine).
+    //              |1/aInv      0 -bInv/aInv|
+    // w = M . wo = |     0 1/aInv          0| . wo
+    //              |     0      0          1|    
+    vec3 w = vec3(wo.x/aInv - wo.z*bInv/aInv, wo.y / aInv, wo.z);
+
+    float lenSqr = dot(w, w);
+    w *= inversesqrt(lenSqr);
+
+    // D(w) = Do(wo) . ||M.wo||^3 / |M|
+    //      = Do(wo / ||M.wo||) . ||M.wo||^4 / |M| 
+    //      = Do(w) . ||M.wo||^4 / |M| (possible because M doesn't change z component)
+    //      = Do(w) . dot(w, w)^2 * aInv^2
+    //      = Do(w) . (aInv * dot(w, w))^2
+    pdf = max(w.z, 0.0) * M_PI_INV * mx_square(aInv * lenSqr);
 
-    float det = aInv * aInv;
-    float jacobian = det / mx_square(lenSqr);
+    mat3 fromLTC = mx_orthonormal_basis_ltc(V, N, NdotV);
+    w = fromLTC * w;
 
-    return jacobian * max(wiOrig.z, 0.0) * M_PI_INV;
+    return w;
 }
diff --git a/libraries/pbrlib/genglsl/mx_sheen_bsdf.glsl b/libraries/pbrlib/genglsl/mx_sheen_bsdf.glsl
index 596307f62e..82afe0e328 100644
--- a/libraries/pbrlib/genglsl/mx_sheen_bsdf.glsl
+++ b/libraries/pbrlib/genglsl/mx_sheen_bsdf.glsl
@@ -58,6 +58,7 @@ void mx_sheen_bsdf_reflection(vec3 L, vec3 V, vec3 P, float occlusion, float wei
     N = mx_forward_facing_normal(N, V);
 
     float NdotV = min(dot(N, V), 1.0);
+    roughness = clamp(roughness, 0.01, 1.0); // Clamp to range of original impl.
 
     vec3 fr = color * mx_zeltner_sheen_brdf(L, V, N, NdotV, roughness);
     float dirAlbedo = mx_zeltner_sheen_dir_albedo(NdotV, roughness);
@@ -76,6 +77,7 @@ void mx_sheen_bsdf_indirect(vec3 V, float weight, vec3 color, float roughness, v
     N = mx_forward_facing_normal(N, V);
 
     float NdotV = min(dot(N, V), 1.0);
+    roughness = clamp(roughness, 0.01, 1.0); // Clamp to range of original impl.
 
     float dirAlbedo = mx_zeltner_sheen_dir_albedo(NdotV, roughness);
     bsdf.throughput = vec3(1.0 - dirAlbedo * weight);

From 6844e2aecbf60358b7fb35195b7d108b1d19b217 Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Sat, 1 Jun 2024 14:31:18 -0700
Subject: [PATCH 04/48] Update C++ requirements for 1.39

- Update documentation to reflect the C++17 requirement in MaterialX 1.39.
- Remove C++ requirements for individual projects, as these are superseded by the project-wide C++17 requirement.
---
 README.md                                  | 6 +++---
 documents/DeveloperGuide/MainPage.md       | 6 +++---
 source/MaterialXGraphEditor/CMakeLists.txt | 2 --
 source/MaterialXView/CMakeLists.txt        | 2 --
 4 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/README.md b/README.md
index ddccb4a9db..d495b7735c 100644
--- a/README.md
+++ b/README.md
@@ -20,11 +20,11 @@ MaterialX is an open standard for representing rich material and look-developmen
 
 ### Supported Platforms
 
-The MaterialX codebase requires a compiler with support for C++14, and can be built with any of the following:
+The MaterialX codebase requires a compiler with support for C++17, and can be built with any of the following:
 
 - Microsoft Visual Studio 2017 or newer
-- GCC 6 or newer
-- Clang 6 or newer
+- GCC 8 or newer
+- Clang 5 or newer
 
 The Python bindings for MaterialX are based on [PyBind11](https://github.com/pybind/pybind11), and support Python versions 3.6 and greater.
 
diff --git a/documents/DeveloperGuide/MainPage.md b/documents/DeveloperGuide/MainPage.md
index 68bd57ce5a..9cf0a0d8e0 100644
--- a/documents/DeveloperGuide/MainPage.md
+++ b/documents/DeveloperGuide/MainPage.md
@@ -11,11 +11,11 @@ MaterialX is an open standard for representing rich material and look-developmen
 
 ### Supported Platforms
 
-The MaterialX codebase requires a compiler with support for C++14, and can be built with any of the following:
+The MaterialX codebase requires a compiler with support for C++17, and can be built with any of the following:
 
 - Microsoft Visual Studio 2017 or newer
-- GCC 6 or newer
-- Clang 6 or newer
+- GCC 8 or newer
+- Clang 5 or newer
 
 The Python bindings for MaterialX are based on [PyBind11](https://github.com/pybind/pybind11), and support Python versions 3.6 and greater.
 
diff --git a/source/MaterialXGraphEditor/CMakeLists.txt b/source/MaterialXGraphEditor/CMakeLists.txt
index 557b134cff..7521ba9261 100644
--- a/source/MaterialXGraphEditor/CMakeLists.txt
+++ b/source/MaterialXGraphEditor/CMakeLists.txt
@@ -1,5 +1,3 @@
-set(CMAKE_CXX_STANDARD 17)
-
 set(DEAR_IMGUI_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/External/ImGui" CACHE STRING "Path to Dear ImGui")
 
 if (NOT IS_DIRECTORY "${DEAR_IMGUI_PREFIX}/backends")
diff --git a/source/MaterialXView/CMakeLists.txt b/source/MaterialXView/CMakeLists.txt
index 83faa1cb79..9be0ab9ec0 100644
--- a/source/MaterialXView/CMakeLists.txt
+++ b/source/MaterialXView/CMakeLists.txt
@@ -1,5 +1,3 @@
-set(CMAKE_CXX_STANDARD 17)
-
 option(MATERIALX_NANOGUI_EXTERNAL "Build aginst an external install of NanoGUI (NANOGUI_ROOT may also need to be set)" OFF)
 
 set(MATERIALXVIEW_RENDER_BACKEND_DEFINITIONS "")

From 333c2f259187c6b0330accf618811945445c9faa Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Sat, 1 Jun 2024 16:48:47 -0700
Subject: [PATCH 05/48] Update gltf_pbr to 1.39

This changelist updates the gltf_pbr shading model to 1.39, making additional simplifications for clarity and performance.
---
 libraries/bxdf/gltf_pbr.mtlx | 47 ++++++------------------------------
 1 file changed, 8 insertions(+), 39 deletions(-)

diff --git a/libraries/bxdf/gltf_pbr.mtlx b/libraries/bxdf/gltf_pbr.mtlx
index b42054a185..390ca6e2a3 100644
--- a/libraries/bxdf/gltf_pbr.mtlx
+++ b/libraries/bxdf/gltf_pbr.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodedef name="ND_gltf_pbr_surfaceshader" node="gltf_pbr" nodegroup="pbr" doc="glTF PBR" version="2.0.1" isdefaultversion="true">
     <input name="base_color" type="color3" value="1, 1, 1" uimin="0, 0, 0" uimax="1, 1, 1" uiname="Base Color" uifolder="Base" />
     <input name="metallic" type="float" value="1" uimin="0" uimax="1" uiname="Metallic" uifolder="Base" />
@@ -148,16 +148,6 @@
     <!-- Thin-film + Dielectric
          Note: Due to limitations in codegen, the base layer BSDF is duplicated (#1035). -->
 
-    <dielectric_bsdf name="tf_transmission_bsdf" type="BSDF">
-      <input name="weight" type="float" value="1" />
-      <input name="tint" type="color3" interfacename="base_color" />
-      <input name="ior" type="float" interfacename="ior" />
-      <input name="roughness" type="vector2" nodename="roughness_uv" />
-      <input name="normal" type="vector3" interfacename="normal" />
-      <input name="tangent" type="vector3" interfacename="tangent" />
-      <input name="scatter_mode" type="string" value="T" />
-    </dielectric_bsdf>
-
     <generalized_schlick_bsdf name="tf_reflection_bsdf" type="BSDF">
       <input name="color0" type="color3" nodename="dielectric_f0" />
       <input name="color90" type="color3" nodename="dielectric_f90" />
@@ -165,32 +155,19 @@
       <input name="normal" type="vector3" interfacename="normal" />
       <input name="tangent" type="vector3" interfacename="tangent" />
       <input name="scatter_mode" type="string" value="R" />
+      <input name="thinfilm_thickness" type="float" interfacename="iridescence_thickness" />
+      <input name="thinfilm_ior" type="float" interfacename="iridescence_ior" />
     </generalized_schlick_bsdf>
 
-    <mix name="tf_transmission_mix" type="BSDF">
-      <input name="bg" type="BSDF" nodename="diffuse_bsdf" />
-      <input name="fg" type="BSDF" nodename="tf_transmission_bsdf" />
-      <input name="mix" type="float" interfacename="transmission" />
-    </mix>
 
     <layer name="tf_dielectric_bsdf" type="BSDF">
       <input name="top" type="BSDF" nodename="tf_reflection_bsdf" />
-      <input name="base" type="BSDF" nodename="tf_transmission_mix" />
-    </layer>
-
-    <thin_film_bsdf name="dielectric_thinfilm_bsdf" type="BSDF">
-      <input name="thickness" type="float" interfacename="iridescence_thickness" />
-      <input name="ior" type="float" interfacename="iridescence_ior" />
-    </thin_film_bsdf>
-
-    <layer name="iridescent_dielectric_bsdf" type="BSDF">
-      <input name="top" type="BSDF" nodename="dielectric_thinfilm_bsdf" />
-      <input name="base" type="BSDF" nodename="tf_dielectric_bsdf" />
+      <input name="base" type="BSDF" nodename="transmission_mix" />
     </layer>
 
     <mix name="mix_iridescent_dielectric_bsdf" type="BSDF">
       <input name="bg" type="BSDF" nodename="dielectric_bsdf" />
-      <input name="fg" type="BSDF" nodename="iridescent_dielectric_bsdf" />
+      <input name="fg" type="BSDF" nodename="tf_dielectric_bsdf" />
       <input name="mix" type="float" interfacename="iridescence" />
     </mix>
 
@@ -213,21 +190,13 @@
       <input name="roughness" type="vector2" nodename="roughness_uv" />
       <input name="normal" type="vector3" interfacename="normal" />
       <input name="tangent" type="vector3" interfacename="tangent" />
+      <input name="thinfilm_thickness" type="float" interfacename="iridescence_thickness" />
+      <input name="thinfilm_ior" type="float" interfacename="iridescence_ior" />
     </generalized_schlick_bsdf>
 
-    <thin_film_bsdf name="metal_thinfilm_bsdf" type="BSDF">
-      <input name="thickness" type="float" interfacename="iridescence_thickness" />
-      <input name="ior" type="float" interfacename="iridescence_ior" />
-    </thin_film_bsdf>
-
-    <layer name="iridescent_metal_bsdf" type="BSDF">
-      <input name="top" type="BSDF" nodename="metal_thinfilm_bsdf" />
-      <input name="base" type="BSDF" nodename="tf_metal_bsdf" />
-    </layer>
-
     <mix name="mix_iridescent_metal_bsdf" type="BSDF">
       <input name="bg" type="BSDF" nodename="metal_bsdf" />
-      <input name="fg" type="BSDF" nodename="iridescent_metal_bsdf" />
+      <input name="fg" type="BSDF" nodename="tf_metal_bsdf" />
       <input name="mix" type="float" interfacename="iridescence" />
     </mix>
 

From 329862e4f897847c9a63e9d67118465bd4dfba9d Mon Sep 17 00:00:00 2001
From: ld-kerley <154285602+ld-kerley@users.noreply.github.com>
Date: Sun, 2 Jun 2024 10:11:33 -0700
Subject: [PATCH 06/48] Remove Convert C++ node (#1854)

replace with direct source code implementation.

remove unneeded getSwizzledVariable()
---
 .../stdlib/genglsl/stdlib_genglsl_impl.mtlx   |  34 ++---
 .../stdlib/genmdl/stdlib_genmdl_impl.mtlx     |  34 ++---
 .../stdlib/genmsl/stdlib_genmsl_impl.mtlx     |  34 ++---
 .../stdlib/genosl/stdlib_genosl_impl.mtlx     |  34 ++---
 .../MaterialXGenGlsl/GlslShaderGenerator.cpp  |  23 ----
 source/MaterialXGenMdl/MdlShaderGenerator.cpp |  20 ---
 source/MaterialXGenMdl/MdlSyntax.cpp          |  50 -------
 source/MaterialXGenMdl/MdlSyntax.h            |   2 -
 source/MaterialXGenMsl/MslShaderGenerator.cpp |  23 ----
 source/MaterialXGenOsl/OslShaderGenerator.cpp |  20 ---
 .../MaterialXGenShader/Nodes/ConvertNode.cpp  | 115 ----------------
 source/MaterialXGenShader/Nodes/ConvertNode.h |  24 ----
 source/MaterialXGenShader/Syntax.cpp          | 128 ------------------
 source/MaterialXGenShader/Syntax.h            |  14 --
 14 files changed, 68 insertions(+), 487 deletions(-)
 delete mode 100644 source/MaterialXGenShader/Nodes/ConvertNode.cpp
 delete mode 100644 source/MaterialXGenShader/Nodes/ConvertNode.h

diff --git a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
index 05e99fc154..8d8b620a2b 100644
--- a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
+++ b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
@@ -686,23 +686,23 @@
   <!-- ======================================================================== -->
 
   <!-- <convert> -->
-  <implementation name="IM_convert_float_color3_genglsl" nodedef="ND_convert_float_color3" target="genglsl" />
-  <implementation name="IM_convert_float_color4_genglsl" nodedef="ND_convert_float_color4" target="genglsl" />
-  <implementation name="IM_convert_float_vector2_genglsl" nodedef="ND_convert_float_vector2" target="genglsl" />
-  <implementation name="IM_convert_float_vector3_genglsl" nodedef="ND_convert_float_vector3" target="genglsl" />
-  <implementation name="IM_convert_float_vector4_genglsl" nodedef="ND_convert_float_vector4" target="genglsl" />
-  <implementation name="IM_convert_vector2_vector3_genglsl" nodedef="ND_convert_vector2_vector3" target="genglsl" />
-  <implementation name="IM_convert_vector3_vector2_genglsl" nodedef="ND_convert_vector3_vector2" target="genglsl" />
-  <implementation name="IM_convert_vector3_color3_genglsl" nodedef="ND_convert_vector3_color3" target="genglsl" />
-  <implementation name="IM_convert_vector3_vector4_genglsl" nodedef="ND_convert_vector3_vector4" target="genglsl" />
-  <implementation name="IM_convert_vector4_vector3_genglsl" nodedef="ND_convert_vector4_vector3" target="genglsl" />
-  <implementation name="IM_convert_vector4_color4_genglsl" nodedef="ND_convert_vector4_color4" target="genglsl" />
-  <implementation name="IM_convert_color3_vector3_genglsl" nodedef="ND_convert_color3_vector3" target="genglsl" />
-  <implementation name="IM_convert_color4_vector4_genglsl" nodedef="ND_convert_color4_vector4" target="genglsl" />
-  <implementation name="IM_convert_color3_color4_genglsl" nodedef="ND_convert_color3_color4" target="genglsl" />
-  <implementation name="IM_convert_color4_color3_genglsl" nodedef="ND_convert_color4_color3" target="genglsl" />
-  <implementation name="IM_convert_boolean_float_genglsl" nodedef="ND_convert_boolean_float" target="genglsl" />
-  <implementation name="IM_convert_integer_float_genglsl" nodedef="ND_convert_integer_float" target="genglsl" />
+  <implementation name="IM_convert_float_color3_genglsl" nodedef="ND_convert_float_color3" target="genglsl" sourcecode="vec3({{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_float_color4_genglsl" nodedef="ND_convert_float_color4" target="genglsl" sourcecode="vec4({{in}},{{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_float_vector2_genglsl" nodedef="ND_convert_float_vector2" target="genglsl" sourcecode="vec2({{in}},{{in}})" />
+  <implementation name="IM_convert_float_vector3_genglsl" nodedef="ND_convert_float_vector3" target="genglsl" sourcecode="vec3({{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_float_vector4_genglsl" nodedef="ND_convert_float_vector4" target="genglsl" sourcecode="vec4({{in}},{{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_vector2_vector3_genglsl" nodedef="ND_convert_vector2_vector3" target="genglsl" sourcecode="vec3({{in}}[0],{{in}}[1],0)" />
+  <implementation name="IM_convert_vector3_vector2_genglsl" nodedef="ND_convert_vector3_vector2" target="genglsl" sourcecode="vec2({{in}}[0],{{in}}[1])" />
+  <implementation name="IM_convert_vector3_color3_genglsl" nodedef="ND_convert_vector3_color3" target="genglsl" sourcecode="{{in}}" />
+  <implementation name="IM_convert_vector3_vector4_genglsl" nodedef="ND_convert_vector3_vector4" target="genglsl" sourcecode="vec4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
+  <implementation name="IM_convert_vector4_vector3_genglsl" nodedef="ND_convert_vector4_vector3" target="genglsl" sourcecode="vec3({{in}}[0],{{in}}[1],{{in}}[2])" />
+  <implementation name="IM_convert_vector4_color4_genglsl" nodedef="ND_convert_vector4_color4" target="genglsl" sourcecode="{{in}}" />
+  <implementation name="IM_convert_color3_vector3_genglsl" nodedef="ND_convert_color3_vector3" target="genglsl" sourcecode="{{in}}" />
+  <implementation name="IM_convert_color4_vector4_genglsl" nodedef="ND_convert_color4_vector4" target="genglsl" sourcecode="{{in}}" />
+  <implementation name="IM_convert_color3_color4_genglsl" nodedef="ND_convert_color3_color4" target="genglsl" sourcecode="vec4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
+  <implementation name="IM_convert_color4_color3_genglsl" nodedef="ND_convert_color4_color3" target="genglsl" sourcecode="vec3({{in}}[0],{{in}}[1],{{in}}[2])" />
+  <implementation name="IM_convert_boolean_float_genglsl" nodedef="ND_convert_boolean_float" target="genglsl" sourcecode="float({{in}})" />
+  <implementation name="IM_convert_integer_float_genglsl" nodedef="ND_convert_integer_float" target="genglsl" sourcecode="float({{in}})" />
 
   <!-- <combine> -->
   <implementation name="IM_combine2_vector2_genglsl" nodedef="ND_combine2_vector2" target="genglsl" />
diff --git a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
index 8dc976c477..e8fca2128c 100644
--- a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
+++ b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
@@ -694,23 +694,23 @@
   <!-- ======================================================================== -->
 
   <!-- <convert> -->
-  <implementation name="IM_convert_float_color3_genmdl" nodedef="ND_convert_float_color3" target="genmdl" />
-  <implementation name="IM_convert_float_color4_genmdl" nodedef="ND_convert_float_color4" target="genmdl" />
-  <implementation name="IM_convert_float_vector2_genmdl" nodedef="ND_convert_float_vector2" target="genmdl" />
-  <implementation name="IM_convert_float_vector3_genmdl" nodedef="ND_convert_float_vector3" target="genmdl" />
-  <implementation name="IM_convert_float_vector4_genmdl" nodedef="ND_convert_float_vector4" target="genmdl" />
-  <implementation name="IM_convert_vector2_vector3_genmdl" nodedef="ND_convert_vector2_vector3" target="genmdl" />
-  <implementation name="IM_convert_vector3_color3_genmdl" nodedef="ND_convert_vector3_color3" target="genmdl" />
-  <implementation name="IM_convert_vector3_vector2_genmdl" nodedef="ND_convert_vector3_vector2" target="genmdl" />
-  <implementation name="IM_convert_vector3_vector4_genmdl" nodedef="ND_convert_vector3_vector4" target="genmdl" />
-  <implementation name="IM_convert_vector4_color4_genmdl" nodedef="ND_convert_vector4_color4" target="genmdl" />
-  <implementation name="IM_convert_vector4_vector3_genmdl" nodedef="ND_convert_vector4_vector3" target="genmdl" />
-  <implementation name="IM_convert_color3_vector3_genmdl" nodedef="ND_convert_color3_vector3" target="genmdl" />
-  <implementation name="IM_convert_color4_vector4_genmdl" nodedef="ND_convert_color4_vector4" target="genmdl" />
-  <implementation name="IM_convert_color3_color4_genmdl" nodedef="ND_convert_color3_color4" target="genmdl" />
-  <implementation name="IM_convert_color4_color3_genmdl" nodedef="ND_convert_color4_color3" target="genmdl" />
-  <implementation name="IM_convert_boolean_float_genmdl" nodedef="ND_convert_boolean_float" target="genmdl" />
-  <implementation name="IM_convert_integer_float_genmdl" nodedef="ND_convert_integer_float" target="genmdl" />
+  <implementation name="IM_convert_float_color3_genmdl" nodedef="ND_convert_float_color3" target="genmdl" sourcecode="color({{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_float_color4_genmdl" nodedef="ND_convert_float_color4" target="genmdl" sourcecode="color4({{in}},{{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_float_vector2_genmdl" nodedef="ND_convert_float_vector2" target="genmdl" sourcecode="float2({{in}},{{in}})" />
+  <implementation name="IM_convert_float_vector3_genmdl" nodedef="ND_convert_float_vector3" target="genmdl" sourcecode="float3({{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_float_vector4_genmdl" nodedef="ND_convert_float_vector4" target="genmdl" sourcecode="float4({{in}},{{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_vector2_vector3_genmdl" nodedef="ND_convert_vector2_vector3" target="genmdl" sourcecode="float3({{in}}[0],{{in}}[1],0)" />
+  <implementation name="IM_convert_vector3_color3_genmdl" nodedef="ND_convert_vector3_color3" target="genmdl" sourcecode="color({{in}})" />
+  <implementation name="IM_convert_vector3_vector2_genmdl" nodedef="ND_convert_vector3_vector2" target="genmdl" sourcecode="float2({{in}}[0],{{in}}[1])" />
+  <implementation name="IM_convert_vector3_vector4_genmdl" nodedef="ND_convert_vector3_vector4" target="genmdl" sourcecode="float4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
+  <implementation name="IM_convert_vector4_color4_genmdl" nodedef="ND_convert_vector4_color4" target="genmdl" sourcecode="color4({{in}}[0],{{in}}[1],{{in}}[2],{{in}}[3])" />
+  <implementation name="IM_convert_vector4_vector3_genmdl" nodedef="ND_convert_vector4_vector3" target="genmdl" sourcecode="float3({{in}}[0],{{in}}[1],{{in}}[2])" />
+  <implementation name="IM_convert_color3_vector3_genmdl" nodedef="ND_convert_color3_vector3" target="genmdl" sourcecode="float3({{in}})" />
+  <implementation name="IM_convert_color4_vector4_genmdl" nodedef="ND_convert_color4_vector4" target="genmdl" sourcecode="float4({{in}})" />
+  <implementation name="IM_convert_color3_color4_genmdl" nodedef="ND_convert_color3_color4" target="genmdl" sourcecode="color4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
+  <implementation name="IM_convert_color4_color3_genmdl" nodedef="ND_convert_color4_color3" target="genmdl" sourcecode="color({{in}}[0],{{in}}[1],{{in}}[2])" />
+  <implementation name="IM_convert_boolean_float_genmdl" nodedef="ND_convert_boolean_float" target="genmdl" sourcecode="float({{in}})" />
+  <implementation name="IM_convert_integer_float_genmdl" nodedef="ND_convert_integer_float" target="genmdl" sourcecode="float({{in}})" />
 
   <!-- <combine2> -->
   <implementation name="IM_combine2_vector2_genmdl" nodedef="ND_combine2_vector2" target="genmdl" />
diff --git a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
index 0e5b03be26..3d1bdaf7fa 100644
--- a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
+++ b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
@@ -686,23 +686,23 @@
   <!-- ======================================================================== -->
 
   <!-- <convert> -->
-  <implementation name="IM_convert_float_color3_genmsl" nodedef="ND_convert_float_color3" target="genmsl" />
-  <implementation name="IM_convert_float_color4_genmsl" nodedef="ND_convert_float_color4" target="genmsl" />
-  <implementation name="IM_convert_float_vector2_genmsl" nodedef="ND_convert_float_vector2" target="genmsl" />
-  <implementation name="IM_convert_float_vector3_genmsl" nodedef="ND_convert_float_vector3" target="genmsl" />
-  <implementation name="IM_convert_float_vector4_genmsl" nodedef="ND_convert_float_vector4" target="genmsl" />
-  <implementation name="IM_convert_vector2_vector3_genmsl" nodedef="ND_convert_vector2_vector3" target="genmsl" />
-  <implementation name="IM_convert_vector3_vector2_genmsl" nodedef="ND_convert_vector3_vector2" target="genmsl" />
-  <implementation name="IM_convert_vector3_color3_genmsl" nodedef="ND_convert_vector3_color3" target="genmsl" />
-  <implementation name="IM_convert_vector3_vector4_genmsl" nodedef="ND_convert_vector3_vector4" target="genmsl" />
-  <implementation name="IM_convert_vector4_vector3_genmsl" nodedef="ND_convert_vector4_vector3" target="genmsl" />
-  <implementation name="IM_convert_vector4_color4_genmsl" nodedef="ND_convert_vector4_color4" target="genmsl" />
-  <implementation name="IM_convert_color3_vector3_genmsl" nodedef="ND_convert_color3_vector3" target="genmsl" />
-  <implementation name="IM_convert_color4_vector4_genmsl" nodedef="ND_convert_color4_vector4" target="genmsl" />
-  <implementation name="IM_convert_color3_color4_genmsl" nodedef="ND_convert_color3_color4" target="genmsl" />
-  <implementation name="IM_convert_color4_color3_genmsl" nodedef="ND_convert_color4_color3" target="genmsl" />
-  <implementation name="IM_convert_boolean_float_genmsl" nodedef="ND_convert_boolean_float" target="genmsl" />
-  <implementation name="IM_convert_integer_float_genmsl" nodedef="ND_convert_integer_float" target="genmsl" />
+  <implementation name="IM_convert_float_color3_genmsl" nodedef="ND_convert_float_color3" target="genmsl" sourcecode="vec3({{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_float_color4_genmsl" nodedef="ND_convert_float_color4" target="genmsl" sourcecode="vec4({{in}},{{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_float_vector2_genmsl" nodedef="ND_convert_float_vector2" target="genmsl" sourcecode="vec2({{in}},{{in}})" />
+  <implementation name="IM_convert_float_vector3_genmsl" nodedef="ND_convert_float_vector3" target="genmsl" sourcecode="vec3({{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_float_vector4_genmsl" nodedef="ND_convert_float_vector4" target="genmsl" sourcecode="vec4({{in}},{{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_vector2_vector3_genmsl" nodedef="ND_convert_vector2_vector3" target="genmsl" sourcecode="vec3({{in}}[0],{{in}}[1],0)" />
+  <implementation name="IM_convert_vector3_vector2_genmsl" nodedef="ND_convert_vector3_vector2" target="genmsl" sourcecode="vec2({{in}}[0],{{in}}[1])" />
+  <implementation name="IM_convert_vector3_color3_genmsl" nodedef="ND_convert_vector3_color3" target="genmsl" sourcecode="{{in}}" />
+  <implementation name="IM_convert_vector3_vector4_genmsl" nodedef="ND_convert_vector3_vector4" target="genmsl" sourcecode="vec4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
+  <implementation name="IM_convert_vector4_vector3_genmsl" nodedef="ND_convert_vector4_vector3" target="genmsl" sourcecode="vec3({{in}}[0],{{in}}[1],{{in}}[2])" />
+  <implementation name="IM_convert_vector4_color4_genmsl" nodedef="ND_convert_vector4_color4" target="genmsl" sourcecode="{{in}}" />
+  <implementation name="IM_convert_color3_vector3_genmsl" nodedef="ND_convert_color3_vector3" target="genmsl" sourcecode="{{in}}" />
+  <implementation name="IM_convert_color4_vector4_genmsl" nodedef="ND_convert_color4_vector4" target="genmsl" sourcecode="{{in}}" />
+  <implementation name="IM_convert_color3_color4_genmsl" nodedef="ND_convert_color3_color4" target="genmsl" sourcecode="vec4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
+  <implementation name="IM_convert_color4_color3_genmsl" nodedef="ND_convert_color4_color3" target="genmsl" sourcecode="vec3({{in}}[0],{{in}}[1],{{in}}[2])" />
+  <implementation name="IM_convert_boolean_float_genmsl" nodedef="ND_convert_boolean_float" target="genmsl" sourcecode="float({{in}})" />
+  <implementation name="IM_convert_integer_float_genmsl" nodedef="ND_convert_integer_float" target="genmsl" sourcecode="float({{in}})" />
 
   <!-- <combine> -->
   <implementation name="IM_combine2_vector2_genmsl" nodedef="ND_combine2_vector2" target="genmsl" />
diff --git a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
index 3c6e73c901..ab957b8b4b 100644
--- a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
+++ b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
@@ -685,23 +685,23 @@
   <!-- ======================================================================== -->
 
   <!-- <convert> -->
-  <implementation name="IM_convert_float_color3_genosl" nodedef="ND_convert_float_color3" target="genosl" />
-  <implementation name="IM_convert_float_color4_genosl" nodedef="ND_convert_float_color4" target="genosl" />
-  <implementation name="IM_convert_float_vector2_genosl" nodedef="ND_convert_float_vector2" target="genosl" />
-  <implementation name="IM_convert_float_vector3_genosl" nodedef="ND_convert_float_vector3" target="genosl" />
-  <implementation name="IM_convert_float_vector4_genosl" nodedef="ND_convert_float_vector4" target="genosl" />
-  <implementation name="IM_convert_vector2_vector3_genosl" nodedef="ND_convert_vector2_vector3" target="genosl" />
-  <implementation name="IM_convert_vector3_vector2_genosl" nodedef="ND_convert_vector3_vector2" target="genosl" />
-  <implementation name="IM_convert_vector3_color3_genosl" nodedef="ND_convert_vector3_color3" target="genosl" />
-  <implementation name="IM_convert_vector3_vector4_genosl" nodedef="ND_convert_vector3_vector4" target="genosl" />
-  <implementation name="IM_convert_vector4_vector3_genosl" nodedef="ND_convert_vector4_vector3" target="genosl" />
-  <implementation name="IM_convert_vector4_color4_genosl" nodedef="ND_convert_vector4_color4" target="genosl" />
-  <implementation name="IM_convert_color3_vector3_genosl" nodedef="ND_convert_color3_vector3" target="genosl" />
-  <implementation name="IM_convert_color4_vector4_genosl" nodedef="ND_convert_color4_vector4" target="genosl" />
-  <implementation name="IM_convert_color3_color4_genosl" nodedef="ND_convert_color3_color4" target="genosl" />
-  <implementation name="IM_convert_color4_color3_genosl" nodedef="ND_convert_color4_color3" target="genosl" />
-  <implementation name="IM_convert_boolean_float_genosl" nodedef="ND_convert_boolean_float" target="genosl" />
-  <implementation name="IM_convert_integer_float_genosl" nodedef="ND_convert_integer_float" target="genosl" />
+  <implementation name="IM_convert_float_color3_genosl" nodedef="ND_convert_float_color3" target="genosl" sourcecode="color({{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_float_color4_genosl" nodedef="ND_convert_float_color4" target="genosl" sourcecode="color4({ {{in}},{{in}},{{in}} },{{in}})" />
+  <implementation name="IM_convert_float_vector2_genosl" nodedef="ND_convert_float_vector2" target="genosl" sourcecode="vector2({{in}},{{in}})" />
+  <implementation name="IM_convert_float_vector3_genosl" nodedef="ND_convert_float_vector3" target="genosl" sourcecode="vector({{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_float_vector4_genosl" nodedef="ND_convert_float_vector4" target="genosl" sourcecode="vector4({{in}},{{in}},{{in}},{{in}})" />
+  <implementation name="IM_convert_vector2_vector3_genosl" nodedef="ND_convert_vector2_vector3" target="genosl" sourcecode="vector({{in}}[0],{{in}}[1],0)" />
+  <implementation name="IM_convert_vector3_vector2_genosl" nodedef="ND_convert_vector3_vector2" target="genosl" sourcecode="vector2({{in}}[0],{{in}}[1])" />
+  <implementation name="IM_convert_vector3_color3_genosl" nodedef="ND_convert_vector3_color3" target="genosl" sourcecode="color({{in}})" />
+  <implementation name="IM_convert_vector3_vector4_genosl" nodedef="ND_convert_vector3_vector4" target="genosl" sourcecode="vector4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
+  <implementation name="IM_convert_vector4_vector3_genosl" nodedef="ND_convert_vector4_vector3" target="genosl" sourcecode="vector({{in}}[0],{{in}}[1],{{in}}[2])" />
+  <implementation name="IM_convert_vector4_color4_genosl" nodedef="ND_convert_vector4_color4" target="genosl" sourcecode="color4({ {{in}}[0],{{in}}[1],{{in}}[2] }, {{in}}[3])" />
+  <implementation name="IM_convert_color3_vector3_genosl" nodedef="ND_convert_color3_vector3" target="genosl" sourcecode="vector({{in}})" />
+  <implementation name="IM_convert_color4_vector4_genosl" nodedef="ND_convert_color4_vector4" target="genosl" sourcecode="vector4({{in}})" />
+  <implementation name="IM_convert_color3_color4_genosl" nodedef="ND_convert_color3_color4" target="genosl" sourcecode="color4({ {{in}}[0],{{in}}[1],{{in}}[2] },1)" />
+  <implementation name="IM_convert_color4_color3_genosl" nodedef="ND_convert_color4_color3" target="genosl" sourcecode="color({{in}}[0],{{in}}[1],{{in}}[2])" />
+  <implementation name="IM_convert_boolean_float_genosl" nodedef="ND_convert_boolean_float" target="genosl" sourcecode="float({{in}})" />
+  <implementation name="IM_convert_integer_float_genosl" nodedef="ND_convert_integer_float" target="genosl" sourcecode="float({{in}})" />
 
   <!-- <combine2> -->
   <implementation name="IM_combine2_vector2_genosl" nodedef="ND_combine2_vector2" target="genosl" />
diff --git a/source/MaterialXGenGlsl/GlslShaderGenerator.cpp b/source/MaterialXGenGlsl/GlslShaderGenerator.cpp
index 6abb8d52b8..0e76154615 100644
--- a/source/MaterialXGenGlsl/GlslShaderGenerator.cpp
+++ b/source/MaterialXGenGlsl/GlslShaderGenerator.cpp
@@ -19,7 +19,6 @@
 #include <MaterialXGenGlsl/Nodes/BlurNodeGlsl.h>
 
 #include <MaterialXGenShader/Nodes/MaterialNode.h>
-#include <MaterialXGenShader/Nodes/ConvertNode.h>
 #include <MaterialXGenShader/Nodes/CombineNode.h>
 #include <MaterialXGenShader/Nodes/SwitchNode.h>
 #include <MaterialXGenShader/Nodes/HwImageNode.h>
@@ -81,28 +80,6 @@ GlslShaderGenerator::GlslShaderGenerator() :
     };
     registerImplementation(elementNames, SwitchNode::create);
 
-    // <!-- <convert> -->
-    elementNames = {
-        "IM_convert_float_color3_" + GlslShaderGenerator::TARGET,
-        "IM_convert_float_color4_" + GlslShaderGenerator::TARGET,
-        "IM_convert_float_vector2_" + GlslShaderGenerator::TARGET,
-        "IM_convert_float_vector3_" + GlslShaderGenerator::TARGET,
-        "IM_convert_float_vector4_" + GlslShaderGenerator::TARGET,
-        "IM_convert_vector2_vector3_" + GlslShaderGenerator::TARGET,
-        "IM_convert_vector3_vector2_" + GlslShaderGenerator::TARGET,
-        "IM_convert_vector3_color3_" + GlslShaderGenerator::TARGET,
-        "IM_convert_vector3_vector4_" + GlslShaderGenerator::TARGET,
-        "IM_convert_vector4_vector3_" + GlslShaderGenerator::TARGET,
-        "IM_convert_vector4_color4_" + GlslShaderGenerator::TARGET,
-        "IM_convert_color3_vector3_" + GlslShaderGenerator::TARGET,
-        "IM_convert_color4_vector4_" + GlslShaderGenerator::TARGET,
-        "IM_convert_color3_color4_" + GlslShaderGenerator::TARGET,
-        "IM_convert_color4_color3_" + GlslShaderGenerator::TARGET,
-        "IM_convert_boolean_float_" + GlslShaderGenerator::TARGET,
-        "IM_convert_integer_float_" + GlslShaderGenerator::TARGET,
-    };
-    registerImplementation(elementNames, ConvertNode::create);
-
     // <!-- <combine> -->
     elementNames = {
         "IM_combine2_vector2_" + GlslShaderGenerator::TARGET,
diff --git a/source/MaterialXGenMdl/MdlShaderGenerator.cpp b/source/MaterialXGenMdl/MdlShaderGenerator.cpp
index 4c92ed491f..a41b0d8f0c 100644
--- a/source/MaterialXGenMdl/MdlShaderGenerator.cpp
+++ b/source/MaterialXGenMdl/MdlShaderGenerator.cpp
@@ -21,7 +21,6 @@
 #include <MaterialXGenShader/GenContext.h>
 #include <MaterialXGenShader/Shader.h>
 #include <MaterialXGenShader/ShaderStage.h>
-#include <MaterialXGenShader/Nodes/ConvertNode.h>
 #include <MaterialXGenShader/Nodes/SwitchNode.h>
 #include <MaterialXGenShader/Nodes/ClosureCompoundNode.h>
 #include <MaterialXGenShader/Nodes/ClosureSourceCodeNode.h>
@@ -93,25 +92,6 @@ MdlShaderGenerator::MdlShaderGenerator() :
     // <!-- <surface> -->
     registerImplementation("IM_surface_" + MdlShaderGenerator::TARGET, SurfaceNodeMdl::create);
 
-    // <!-- <convert> -->
-    registerImplementation("IM_convert_float_color3_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_float_color4_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_float_vector2_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_float_vector3_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_float_vector4_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_vector2_vector3_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_vector3_vector2_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_vector3_color3_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_vector3_vector4_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_vector4_vector3_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_vector4_color4_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_color3_vector3_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_color4_vector4_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_color3_color4_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_color4_color3_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_boolean_float_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_integer_float_" + MdlShaderGenerator::TARGET, ConvertNode::create);
-
     // <!-- <combine> -->
     registerImplementation("IM_combine2_vector2_" + MdlShaderGenerator::TARGET, CombineNodeMdl::create);
     registerImplementation("IM_combine2_color4CF_" + MdlShaderGenerator::TARGET, CombineNodeMdl::create);
diff --git a/source/MaterialXGenMdl/MdlSyntax.cpp b/source/MaterialXGenMdl/MdlSyntax.cpp
index 5565f3e31f..d30ab223cd 100644
--- a/source/MaterialXGenMdl/MdlSyntax.cpp
+++ b/source/MaterialXGenMdl/MdlSyntax.cpp
@@ -493,56 +493,6 @@ TypeDesc MdlSyntax::getEnumeratedType(const string& value) const
     return Type::NONE;
 }
 
-string MdlSyntax::getSwizzledVariable(const string& srcName, TypeDesc srcType, const string& channels, TypeDesc dstType) const
-{
-    if (srcType == Type::COLOR3 || srcType == Type::COLOR4)
-    {
-        const TypeSyntax& srcSyntax = getTypeSyntax(srcType);
-        const TypeSyntax& dstSyntax = getTypeSyntax(dstType);
-
-        const StringVec& srcMembers = srcSyntax.getMembers();
-
-        StringVec membersSwizzled;
-
-        for (size_t i = 0; i < channels.size(); ++i)
-        {
-            const char ch = channels[i];
-            if (ch == '0' || ch == '1')
-            {
-                membersSwizzled.push_back(string(1, ch));
-                continue;
-            }
-
-            auto it = CHANNELS_MAPPING.find(ch);
-            if (it == CHANNELS_MAPPING.end())
-            {
-                throw ExceptionShaderGenError("Invalid channel pattern '" + channels + "'.");
-            }
-
-            const size_t channelIndex = it->second;
-            if (channelIndex < 0 || channelIndex >= srcMembers.size())
-            {
-                throw ExceptionShaderGenError("Given channel index: '" + string(1, ch) + "' in channels pattern is incorrect for type '" + srcType.getName() + "'.");
-            }
-
-            string variable = srcName;
-            if (srcType == Type::COLOR3)
-            {
-                variable = "float3(" + srcName + ")";
-            }
-            else if (channelIndex < 3)
-            {
-                variable = "float3(" + srcName + ".rgb)";
-            }
-
-            membersSwizzled.push_back(variable + srcMembers[channelIndex]);
-        }
-
-        return dstSyntax.getValue(membersSwizzled, false);
-    }
-    return Syntax::getSwizzledVariable(srcName, srcType, channels, dstType);
-}
-
 string MdlSyntax::getArrayTypeSuffix(TypeDesc type, const Value& value) const
 {
     if (type.isArray())
diff --git a/source/MaterialXGenMdl/MdlSyntax.h b/source/MaterialXGenMdl/MdlSyntax.h
index 1e318ac19d..e282cefeca 100644
--- a/source/MaterialXGenMdl/MdlSyntax.h
+++ b/source/MaterialXGenMdl/MdlSyntax.h
@@ -33,8 +33,6 @@ class MX_GENMDL_API MdlSyntax : public Syntax
     const string& getUniformQualifier() const override { return UNIFORM_QUALIFIER; };
     const string& getSourceFileExtension() const override { return SOURCE_FILE_EXTENSION; };
 
-    string getSwizzledVariable(const string& srcName, TypeDesc srcType, const string& channels, TypeDesc dstType) const override;
-
     /// Override to return array type suffix.
     string getArrayTypeSuffix(TypeDesc type, const Value& value) const override;
 
diff --git a/source/MaterialXGenMsl/MslShaderGenerator.cpp b/source/MaterialXGenMsl/MslShaderGenerator.cpp
index 7f450b1d1d..f88de98808 100644
--- a/source/MaterialXGenMsl/MslShaderGenerator.cpp
+++ b/source/MaterialXGenMsl/MslShaderGenerator.cpp
@@ -19,7 +19,6 @@
 #include <MaterialXGenMsl/Nodes/BlurNodeMsl.h>
 
 #include <MaterialXGenShader/Nodes/MaterialNode.h>
-#include <MaterialXGenShader/Nodes/ConvertNode.h>
 #include <MaterialXGenShader/Nodes/CombineNode.h>
 #include <MaterialXGenShader/Nodes/SwitchNode.h>
 #include <MaterialXGenShader/Nodes/HwImageNode.h>
@@ -85,28 +84,6 @@ MslShaderGenerator::MslShaderGenerator() :
     };
     registerImplementation(elementNames, SwitchNode::create);
 
-    // <!-- <convert> -->
-    elementNames = {
-        "IM_convert_float_color3_" + MslShaderGenerator::TARGET,
-        "IM_convert_float_color4_" + MslShaderGenerator::TARGET,
-        "IM_convert_float_vector2_" + MslShaderGenerator::TARGET,
-        "IM_convert_float_vector3_" + MslShaderGenerator::TARGET,
-        "IM_convert_float_vector4_" + MslShaderGenerator::TARGET,
-        "IM_convert_vector2_vector3_" + MslShaderGenerator::TARGET,
-        "IM_convert_vector3_vector2_" + MslShaderGenerator::TARGET,
-        "IM_convert_vector3_color3_" + MslShaderGenerator::TARGET,
-        "IM_convert_vector3_vector4_" + MslShaderGenerator::TARGET,
-        "IM_convert_vector4_vector3_" + MslShaderGenerator::TARGET,
-        "IM_convert_vector4_color4_" + MslShaderGenerator::TARGET,
-        "IM_convert_color3_vector3_" + MslShaderGenerator::TARGET,
-        "IM_convert_color4_vector4_" + MslShaderGenerator::TARGET,
-        "IM_convert_color3_color4_" + MslShaderGenerator::TARGET,
-        "IM_convert_color4_color3_" + MslShaderGenerator::TARGET,
-        "IM_convert_boolean_float_" + MslShaderGenerator::TARGET,
-        "IM_convert_integer_float_" + MslShaderGenerator::TARGET,
-    };
-    registerImplementation(elementNames, ConvertNode::create);
-
     // <!-- <combine> -->
     elementNames = {
         "IM_combine2_vector2_" + MslShaderGenerator::TARGET,
diff --git a/source/MaterialXGenOsl/OslShaderGenerator.cpp b/source/MaterialXGenOsl/OslShaderGenerator.cpp
index bb670ff4c9..922eb58fa0 100644
--- a/source/MaterialXGenOsl/OslShaderGenerator.cpp
+++ b/source/MaterialXGenOsl/OslShaderGenerator.cpp
@@ -9,7 +9,6 @@
 #include <MaterialXGenShader/GenContext.h>
 #include <MaterialXGenShader/Shader.h>
 #include <MaterialXGenShader/ShaderStage.h>
-#include <MaterialXGenShader/Nodes/ConvertNode.h>
 #include <MaterialXGenShader/Nodes/CombineNode.h>
 #include <MaterialXGenShader/Nodes/SwitchNode.h>
 #include <MaterialXGenShader/Nodes/SourceCodeNode.h>
@@ -55,25 +54,6 @@ OslShaderGenerator::OslShaderGenerator() :
     registerImplementation("IM_switch_matrix33I_" + OslShaderGenerator::TARGET, SwitchNode::create);
     registerImplementation("IM_switch_matrix44I_" + OslShaderGenerator::TARGET, SwitchNode::create);
 
-    // <!-- <convert> -->
-    registerImplementation("IM_convert_float_color3_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_float_color4_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_float_vector2_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_float_vector3_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_float_vector4_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_vector2_vector3_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_vector3_vector2_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_vector3_color3_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_vector3_vector4_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_vector4_vector3_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_vector4_color4_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_color3_vector3_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_color4_vector4_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_color3_color4_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_color4_color3_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_boolean_float_" + OslShaderGenerator::TARGET, ConvertNode::create);
-    registerImplementation("IM_convert_integer_float_" + OslShaderGenerator::TARGET, ConvertNode::create);
-
     // <!-- <combine> -->
     registerImplementation("IM_combine2_vector2_" + OslShaderGenerator::TARGET, CombineNode::create);
     registerImplementation("IM_combine2_color4CF_" + OslShaderGenerator::TARGET, CombineNode::create);
diff --git a/source/MaterialXGenShader/Nodes/ConvertNode.cpp b/source/MaterialXGenShader/Nodes/ConvertNode.cpp
deleted file mode 100644
index fbd56b7768..0000000000
--- a/source/MaterialXGenShader/Nodes/ConvertNode.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-//
-// Copyright Contributors to the MaterialX Project
-// SPDX-License-Identifier: Apache-2.0
-//
-
-#include <MaterialXGenShader/Nodes/ConvertNode.h>
-#include <MaterialXGenShader/GenContext.h>
-#include <MaterialXGenShader/ShaderNode.h>
-#include <MaterialXGenShader/ShaderStage.h>
-#include <MaterialXGenShader/ShaderGenerator.h>
-#include <MaterialXGenShader/TypeDesc.h>
-
-MATERIALX_NAMESPACE_BEGIN
-
-ShaderNodeImplPtr ConvertNode::create()
-{
-    return std::make_shared<ConvertNode>();
-}
-
-void ConvertNode::emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const
-{
-    using ConvertTable = std::unordered_map<TypeDesc, std::unordered_map<TypeDesc, string, TypeDesc::Hasher>, TypeDesc::Hasher>;
-
-    static const ConvertTable CONVERT_TABLE({ { Type::COLOR3,
-                                                { { Type::VECTOR3, string("rgb") },
-                                                  { Type::COLOR4, string("rgb1") } } },
-                                              { Type::COLOR4,
-                                                { { Type::VECTOR4, string("rgba") },
-                                                  { Type::COLOR3, string("rgb") } } },
-                                              { Type::VECTOR2,
-                                                { { Type::VECTOR3, string("xy0") } } },
-                                              { Type::VECTOR3,
-                                                { { Type::COLOR3, string("xyz") },
-                                                  { Type::VECTOR4, string("xyz1") },
-                                                  { Type::VECTOR2, string("xy") } } },
-                                              { Type::VECTOR4,
-                                                { { Type::COLOR4, string("xyzw") },
-                                                  { Type::VECTOR3, string("xyz") } } },
-                                              { Type::FLOAT,
-                                                { { Type::COLOR3, string("rrr") },
-                                                  { Type::COLOR4, string("rrrr") },
-                                                  { Type::VECTOR2, string("rr") },
-                                                  { Type::VECTOR3, string("rrr") },
-                                                  { Type::VECTOR4, string("rrrr") } } } });
-
-    static const string IN_STRING("in");
-
-    DEFINE_SHADER_STAGE(stage, Stage::PIXEL)
-    {
-        const ShaderGenerator& shadergen = context.getShaderGenerator();
-
-        const ShaderInput* in = node.getInput(IN_STRING);
-        const ShaderOutput* out = node.getOutput();
-        if (!in || !out)
-        {
-            throw ExceptionShaderGenError("Node '" + node.getName() + "' is not a valid convert node");
-        }
-        if (!in->getConnection() && !in->getValue())
-        {
-            throw ExceptionShaderGenError("No connection or value found to convert on node '" + node.getName() + "'");
-        }
-
-        string result;
-
-        // Handle supported scalar type conversions.
-        if (in->getType().isScalar() && out->getType().isScalar())
-        {
-            result = shadergen.getUpstreamResult(in, context);
-            result = shadergen.getSyntax().getTypeName(out->getType()) + "(" + result + ")";
-        }
-        // Handle supported vector type conversions.
-        else
-        {
-            // Search the conversion table for a swizzle pattern to use.
-            const string* swizzle = nullptr;
-            auto i = CONVERT_TABLE.find(in->getType());
-            if (i != CONVERT_TABLE.end())
-            {
-                auto j = i->second.find(out->getType());
-                if (j != i->second.end())
-                {
-                    swizzle = &j->second;
-                }
-            }
-            if (!swizzle || swizzle->empty())
-            {
-                throw ExceptionShaderGenError("Conversion from '" + in->getType().getName() + "' to '" + out->getType().getName() + "' is not supported by convert node");
-            }
-
-            // If the input is unconnected we must declare a local variable
-            // for it first, in order to swizzle it below.
-            string variableName;
-            if (!in->getConnection())
-            {
-                variableName = in->getVariable();
-                string variableValue = in->getValue() ? shadergen.getSyntax().getValue(in->getType(), *in->getValue()) : shadergen.getSyntax().getDefaultValue(in->getType());
-                shadergen.emitLine(shadergen.getSyntax().getTypeName(in->getType()) + " " + variableName + " = " + variableValue, stage);
-            }
-            else
-            {
-                variableName = shadergen.getUpstreamResult(in, context);
-            }
-
-            const TypeDesc type = in->getConnection() ? in->getConnection()->getType() : in->getType();
-            result = shadergen.getSyntax().getSwizzledVariable(variableName, type, *swizzle, node.getOutput()->getType());
-        }
-
-        shadergen.emitLineBegin(stage);
-        shadergen.emitOutput(node.getOutput(), true, false, context, stage);
-        shadergen.emitString(" = " + result, stage);
-        shadergen.emitLineEnd(stage);
-    }
-}
-
-MATERIALX_NAMESPACE_END
diff --git a/source/MaterialXGenShader/Nodes/ConvertNode.h b/source/MaterialXGenShader/Nodes/ConvertNode.h
deleted file mode 100644
index ea89f9e617..0000000000
--- a/source/MaterialXGenShader/Nodes/ConvertNode.h
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// Copyright Contributors to the MaterialX Project
-// SPDX-License-Identifier: Apache-2.0
-//
-
-#ifndef MATERIALX_CONVERTNODE_H
-#define MATERIALX_CONVERTNODE_H
-
-#include <MaterialXGenShader/ShaderNodeImpl.h>
-
-MATERIALX_NAMESPACE_BEGIN
-
-/// Convert node implementation
-class MX_GENSHADER_API ConvertNode : public ShaderNodeImpl
-{
-  public:
-    static ShaderNodeImplPtr create();
-
-    void emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const override;
-};
-
-MATERIALX_NAMESPACE_END
-
-#endif
diff --git a/source/MaterialXGenShader/Syntax.cpp b/source/MaterialXGenShader/Syntax.cpp
index 8308f31ffa..ff9b35894c 100644
--- a/source/MaterialXGenShader/Syntax.cpp
+++ b/source/MaterialXGenShader/Syntax.cpp
@@ -120,134 +120,6 @@ const string& Syntax::getTypeDefinition(TypeDesc type) const
     return syntax.getTypeDefinition();
 }
 
-string Syntax::getSwizzledVariable(const string& srcName, TypeDesc srcType, const string& channels, TypeDesc dstType) const
-{
-    const TypeSyntax& srcSyntax = getTypeSyntax(srcType);
-    const TypeSyntax& dstSyntax = getTypeSyntax(dstType);
-
-    const StringVec& srcMembers = srcSyntax.getMembers();
-
-    StringVec membersSwizzled;
-
-    for (size_t i = 0; i < channels.size(); ++i)
-    {
-        const char ch = channels[i];
-        if (ch == '0' || ch == '1')
-        {
-            membersSwizzled.push_back(string(1, ch));
-            continue;
-        }
-
-        auto it = CHANNELS_MAPPING.find(ch);
-        if (it == CHANNELS_MAPPING.end())
-        {
-            throw ExceptionShaderGenError("Invalid channel pattern '" + channels + "'.");
-        }
-
-        if (srcMembers.empty())
-        {
-            membersSwizzled.push_back(srcName);
-        }
-        else
-        {
-            const size_t channelIndex = it->second;
-            if (channelIndex >= srcMembers.size())
-            {
-                throw ExceptionShaderGenError("Given channel index: '" + string(1, ch) + "' in channels pattern is incorrect for type '" + srcType.getName() + "'.");
-            }
-            membersSwizzled.push_back(srcName + srcMembers[channelIndex]);
-        }
-    }
-
-    return dstSyntax.getValue(membersSwizzled, false);
-}
-
-ValuePtr Syntax::getSwizzledValue(ValuePtr value, TypeDesc srcType, const string& channels, TypeDesc dstType) const
-{
-    const TypeSyntax& srcSyntax = getTypeSyntax(srcType);
-    const vector<string>& srcMembers = srcSyntax.getMembers();
-
-    StringStream ss;
-    string delimiter = ", ";
-
-    for (size_t i = 0; i < channels.size(); ++i)
-    {
-        if (i == channels.size() - 1)
-        {
-            delimiter.clear();
-        }
-
-        const char ch = channels[i];
-        if (ch == '0' || ch == '1')
-        {
-            ss << string(1, ch);
-            continue;
-        }
-
-        auto it = CHANNELS_MAPPING.find(ch);
-        if (it == CHANNELS_MAPPING.end())
-        {
-            throw ExceptionShaderGenError("Invalid channel pattern '" + channels + "'.");
-        }
-
-        if (srcMembers.empty())
-        {
-            ss << value->getValueString();
-        }
-        else
-        {
-            const size_t channelIndex = it->second;
-            if (channelIndex >= srcMembers.size())
-            {
-                throw ExceptionShaderGenError("Given channel index: '" + string(1, ch) + "' in channels pattern is incorrect for type '" + srcType.getName() + "'.");
-            }
-            if (srcType == Type::FLOAT)
-            {
-                float v = value->asA<float>();
-                ss << std::to_string(v);
-            }
-            else if (srcType == Type::INTEGER)
-            {
-                int v = value->asA<int>();
-                ss << std::to_string(v);
-            }
-            else if (srcType == Type::BOOLEAN)
-            {
-                bool v = value->asA<bool>();
-                ss << std::to_string(v);
-            }
-            else if (srcType == Type::COLOR3)
-            {
-                Color3 v = value->asA<Color3>();
-                ss << std::to_string(v[channelIndex]);
-            }
-            else if (srcType == Type::COLOR4)
-            {
-                Color4 v = value->asA<Color4>();
-                ss << std::to_string(v[channelIndex]);
-            }
-            else if (srcType == Type::VECTOR2)
-            {
-                Vector2 v = value->asA<Vector2>();
-                ss << std::to_string(v[channelIndex]);
-            }
-            else if (srcType == Type::VECTOR3)
-            {
-                Vector3 v = value->asA<Vector3>();
-                ss << std::to_string(v[channelIndex]);
-            }
-            else if (srcType == Type::VECTOR4)
-            {
-                Vector4 v = value->asA<Vector4>();
-                ss << std::to_string(v[channelIndex]);
-            }
-        }
-        ss << delimiter;
-    }
-
-    return Value::createValueFromStrings(ss.str(), dstType.getName());
-}
-
 bool Syntax::typeSupported(const TypeDesc*) const
 {
     return true;
diff --git a/source/MaterialXGenShader/Syntax.h b/source/MaterialXGenShader/Syntax.h
index f069f19189..18c85ed78d 100644
--- a/source/MaterialXGenShader/Syntax.h
+++ b/source/MaterialXGenShader/Syntax.h
@@ -110,20 +110,6 @@ class MX_GENSHADER_API Syntax
     /// Returns the value string for a given shader port object
     virtual string getValue(const ShaderPort* port, bool uniform = false) const;
 
-    /// Get syntax for a swizzled variable
-    virtual string getSwizzledVariable(const string& srcName, TypeDesc srcType, const string& channels, TypeDesc dstType) const;
-    [[deprecated]] string getSwizzledVariable(const string& srcName, const TypeDesc* srcType, const string& channels, const TypeDesc* dstType) const
-    {
-        return getSwizzledVariable(srcName, *srcType, channels, *dstType);
-    }
-
-    /// Get swizzled value
-    virtual ValuePtr getSwizzledValue(ValuePtr value, TypeDesc srcType, const string& channels, TypeDesc dstType) const;
-    [[deprecated]] ValuePtr getSwizzledValue(ValuePtr value, const TypeDesc* srcType, const string& channels, const TypeDesc* dstType) const
-    {
-        return getSwizzledValue(value, *srcType, channels, *dstType);
-    }
-
     /// Returns a type qualifier to be used when declaring types for input variables.
     /// Default implementation returns empty string and derived syntax classes should
     /// override this method.

From 974a80298ad57582eefd5abb4b9671c6bc0a4ad1 Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Sat, 1 Jun 2024 21:02:35 -0700
Subject: [PATCH 07/48] Update Lama nodes to 1.39

This changelist updates the MaterialX Lama BSDF nodes to 1.39, providing a baseline for upcoming improvements.
---
 libraries/bxdf/lama/lama_add.mtlx         |  2 +-
 libraries/bxdf/lama/lama_conductor.mtlx   | 14 ++++----------
 libraries/bxdf/lama/lama_dielectric.mtlx  | 10 +++++++---
 libraries/bxdf/lama/lama_diffuse.mtlx     |  5 +++--
 libraries/bxdf/lama/lama_emission.mtlx    |  2 +-
 libraries/bxdf/lama/lama_layer.mtlx       |  6 +++---
 libraries/bxdf/lama/lama_mix.mtlx         |  2 +-
 libraries/bxdf/lama/lama_sheen.mtlx       |  2 +-
 libraries/bxdf/lama/lama_sss.mtlx         |  2 +-
 libraries/bxdf/lama/lama_translucent.mtlx |  2 +-
 10 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/libraries/bxdf/lama/lama_add.mtlx b/libraries/bxdf/lama/lama_add.mtlx
index deb6c5a136..d589e366e6 100644
--- a/libraries/bxdf/lama/lama_add.mtlx
+++ b/libraries/bxdf/lama/lama_add.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
 
   <!-- LamaAdd for BSDFs -->
   <nodedef name="ND_lama_add_bsdf" node="LamaAdd" nodegroup="pbr" version="1.0" isdefaultversion="true">
diff --git a/libraries/bxdf/lama/lama_conductor.mtlx b/libraries/bxdf/lama/lama_conductor.mtlx
index dc183c5d98..4e2bdb1ea0 100644
--- a/libraries/bxdf/lama/lama_conductor.mtlx
+++ b/libraries/bxdf/lama/lama_conductor.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
   <nodedef name="ND_lama_conductor" node="LamaConductor" nodegroup="pbr" doc="Lama conductor" version="1.0" isdefaultversion="true">
     <input name="tint" type="color3" value="1, 1, 1" uiname="Tint" uifolder="Main"
            doc="Overall color multiplier. It should be used with parcimony, as a non-white value breaks physicality. The prefered way to define the color of a conductor is through the Fresnel attributes right below." />
@@ -128,6 +128,8 @@
       <input name="normal" type="vector3" interfacename="normal" />
       <input name="tangent" type="vector3" nodename="tangent_rotate_normalize" />
       <input name="distribution" type="string" value="ggx" />
+      <input name="thinfilm_thickness" type="float" interfacename="iridescenceThickness" />
+      <input name="thinfilm_ior" type="float" nodename="iridescence_relative_ior" />
     </conductor_bsdf>
 
     <!-- BRDF + Thin film -->
@@ -135,20 +137,12 @@
       <input name="in1" type="float" interfacename="iridescenceIOR" />
       <input name="in2" type="float" interfacename="exteriorIOR" />
     </divide>
-    <thin_film_bsdf name="thin_film_bsdf" type="BSDF">
-      <input name="thickness" type="float" interfacename="iridescenceThickness" />
-      <input name="ior" type="float" nodename="iridescence_relative_ior" />
-    </thin_film_bsdf>
 
     <!-- Layered BRDF -->
-    <layer name="thin_film_conductor_bsdf" type="BSDF">
-      <input name="top" type="BSDF" nodename="thin_film_bsdf" />
-      <input name="base" type="BSDF" nodename="conductor_bsdf" />
-    </layer>
 
     <!-- Tinted BRDF -->
     <multiply name="tinted_bsdf" type="BSDF">
-      <input name="in1" type="BSDF" nodename="thin_film_conductor_bsdf" />
+      <input name="in1" type="BSDF" nodename="conductor_bsdf" />
       <input name="in2" type="color3" interfacename="tint" />
     </multiply>
 
diff --git a/libraries/bxdf/lama/lama_dielectric.mtlx b/libraries/bxdf/lama/lama_dielectric.mtlx
index 68b9238261..ec9b44ab3e 100644
--- a/libraries/bxdf/lama/lama_dielectric.mtlx
+++ b/libraries/bxdf/lama/lama_dielectric.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
   <nodedef name="ND_lama_dielectric" node="LamaDielectric" nodegroup="pbr" doc="Lama dielectric" version="1.0" isdefaultversion="true">
     <input name="reflectionTint" type="color3" value="1.0, 1.0, 1.0" uiname="Reflection Tint" uifolder="Main"
            doc="Color multiplier for external reflection. It should be used with parcimony, as a non-white value breaks physicality." />
@@ -29,7 +29,7 @@
            doc="Absorption radius" />
     <input name="scatterColor" type="color3" value="0.0, 0.0, 0.0" uiname="Scatter Color" uifolder="Interior"
            doc="Scatter color" />
-    <input name="scatterAnisotropy" type="float" value="0.0" uimin="-1.0" uimax="1.0" uiname="Scatter Anisotropy" uifolder="Interior" 
+    <input name="scatterAnisotropy" type="float" value="0.0" uimin="-1.0" uimax="1.0" uiname="Scatter Anisotropy" uifolder="Interior"
            doc="Scatter anisotropy" />
     <output name="out" type="BSDF" />
   </nodedef>
@@ -44,9 +44,13 @@
       <input name="reflectivity" type="color3" nodename="reflectivity_color" />
       <input name="edge_color" type="color3" value="0.0, 0.0, 0.0" />
     </artistic_ior>
+    <extract name="ior_float" type="float">
+      <input name="in" type="color3" nodename="artistic_ior" output="ior" />
+      <input name="index" type="integer" value="0" />
+    </extract>
     <switch name="fresnel_mode_switch" type="float">
       <input name="in1" type="float" interfacename="IOR" />
-      <input name="in2" type="float" nodename="artistic_ior" output="ior" channels="r" />
+      <input name="in2" type="float" nodename="ior_float" />
       <input name="which" type="integer" interfacename="fresnelMode" />
     </switch>
     <divide name="relative_ior" type="float">
diff --git a/libraries/bxdf/lama/lama_diffuse.mtlx b/libraries/bxdf/lama/lama_diffuse.mtlx
index f028dbd82e..0df1dd8fa6 100644
--- a/libraries/bxdf/lama/lama_diffuse.mtlx
+++ b/libraries/bxdf/lama/lama_diffuse.mtlx
@@ -1,9 +1,10 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
   <nodedef name="ND_lama_diffuse" node="LamaDiffuse" nodegroup="pbr" version="1.0" isdefaultversion="true">
     <input name="color" uiname="Color" type="color3" value="0.18, 0.18, 0.18"
            doc="Diffuse color (aka albedo), defining what ratio of light is reflected for each color channel." />
-    <input name="roughness" uiname="Roughness" type="float" uimin="0.0" uimax="1.0" value="0.0" doc="Micro-facet distribution (Oren-Nayar) roughness." />
+    <input name="roughness" uiname="Roughness" type="float" uimin="0.0" uimax="1.0" value="0.0"
+           doc="Micro-facet distribution (Oren-Nayar) roughness." />
     <input name="normal" uiname="Normal" type="vector3" defaultgeomprop="Nworld"
            doc="Shading normal, typically defined by bump or normal mapping. Defaults to the smooth surface normal if not set." />
     <input name="energyCompensation" uiname="Energy Compensation" uifolder="Advanced" type="float" uniform="true" uimin="0.0" uimax="1.0" value="1.0"
diff --git a/libraries/bxdf/lama/lama_emission.mtlx b/libraries/bxdf/lama/lama_emission.mtlx
index e9d7433d17..87da14bd91 100644
--- a/libraries/bxdf/lama/lama_emission.mtlx
+++ b/libraries/bxdf/lama/lama_emission.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
   <nodedef name="ND_lama_emission" node="LamaEmission" nodegroup="pbr" doc="Lama emission" version="1.0" isdefaultversion="true">
     <input name="color" type="color3" value="1.0, 1.0, 1.0" uiname="Color" uifolder="Main"
            doc="Color being uniformly emitted in all directions above the surface." />
diff --git a/libraries/bxdf/lama/lama_layer.mtlx b/libraries/bxdf/lama/lama_layer.mtlx
index 6d47cd6112..921ec36933 100644
--- a/libraries/bxdf/lama/lama_layer.mtlx
+++ b/libraries/bxdf/lama/lama_layer.mtlx
@@ -1,10 +1,10 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
   <!-- LamaLayer for BSDFs -->
   <nodedef name="ND_lama_layer_bsdf" node="LamaLayer" nodegroup="pbr" version="1.0" isdefaultversion="true">
-    <input name="materialTop" uiname="Material Top" type="BSDF" 
+    <input name="materialTop" uiname="Material Top" type="BSDF"
            doc="Material used for the top slab. If not set, the base material will be used by itself." />
-    <input name="materialBase" uiname="Material Base" type="BSDF" 
+    <input name="materialBase" uiname="Material Base" type="BSDF"
            doc="Base material, right under the top one." />
     <input name="topMix" uiname="Top Mix" type="float" uimin="0.0" uimax="1.0" value="1.0"
            doc="Defines how visible the top material is." />
diff --git a/libraries/bxdf/lama/lama_mix.mtlx b/libraries/bxdf/lama/lama_mix.mtlx
index 58a2b355f9..69e6ad3ec6 100644
--- a/libraries/bxdf/lama/lama_mix.mtlx
+++ b/libraries/bxdf/lama/lama_mix.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
 
   <!-- LamaMix for BSDFs -->
   <nodedef name="ND_lama_mix_bsdf" node="LamaMix" nodegroup="pbr" version="1.0" isdefaultversion="true">
diff --git a/libraries/bxdf/lama/lama_sheen.mtlx b/libraries/bxdf/lama/lama_sheen.mtlx
index b58ecf1516..76c7b9597d 100644
--- a/libraries/bxdf/lama/lama_sheen.mtlx
+++ b/libraries/bxdf/lama/lama_sheen.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
   <nodedef name="ND_lama_sheen" node="LamaSheen" nodegroup="pbr" doc="Lama sheen" version="1.0" isdefaultversion="true">
     <input name="color" type="color3" value="1, 1, 1" uiname="Color" uifolder="Main"
            doc="Amount of sheen to add, per channel. When this node is used as top material in a stack, the more sheen is added, the less energy will be transmitted to the base material." />
diff --git a/libraries/bxdf/lama/lama_sss.mtlx b/libraries/bxdf/lama/lama_sss.mtlx
index 01db34f64f..1646a09570 100644
--- a/libraries/bxdf/lama/lama_sss.mtlx
+++ b/libraries/bxdf/lama/lama_sss.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
   <nodedef name="ND_lama_sss" node="LamaSSS" nodegroup="pbr" doc="Lama SSS" version="1.0" isdefaultversion="true">
     <input name="color" type="color3" value="0.18, 0.18, 0.18" uiname="Color" uifolder="Main"
            doc="Diffuse color (aka albedo), defining what ratio of light is reflected -- or transmitted -- for each color channel." />
diff --git a/libraries/bxdf/lama/lama_translucent.mtlx b/libraries/bxdf/lama/lama_translucent.mtlx
index 85f495db46..9577e9c14f 100644
--- a/libraries/bxdf/lama/lama_translucent.mtlx
+++ b/libraries/bxdf/lama/lama_translucent.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
   <nodedef name="ND_lama_translucent" node="LamaTranslucent" nodegroup="pbr" version="1.0" isdefaultversion="true">
     <input name="color" uiname="Color" type="color3" value="0.18, 0.18, 0.18"
            doc="Translucent color (aka albedo), defining what ratio of light is transmitted for each color channel." />

From 8c515e8d3f7e795e156346e41c955ec5c3f0bec7 Mon Sep 17 00:00:00 2001
From: ld-kerley <154285602+ld-kerley@users.noreply.github.com>
Date: Mon, 3 Jun 2024 15:25:29 -0700
Subject: [PATCH 08/48] Fix OSL syntax for Convert nodes (#1863)

PR #1854, previously removed the C++ implementations for `convert` and replaced them with direct source code implementations.  The testing done wasn't correctly running `oslc` so a few syntax errors slipped through.

These are corrected in this PR.

Note:
`vector2`, `vector4` and `color4` are implemented as structs in OSL, and so do not have constructors in the typical sense.   The following is not legal OSL syntax.
```
vector4 a = vector4(0,0,0,0);
```
instead you must use a list initializer to initialize the struct.
```
vector4 a = {0,0,0,0};
```

Conversely, currently it is NOT legal to initialize a builtin type, for instance `color` or `vector` using a list initializer.
The following is not legal OSL syntax.
```
color a = {0,0,0};
```
instead you must use the type constructor.
```
color a = color(0,0,0);
```

Also note, subscript access also is also not legal OSL syntax because these types are implemented as structs. For example to access the green component of a `color4`, you must use `myColor.rgb[1]`.
---
 .../stdlib/genosl/stdlib_genosl_impl.mtlx     | 22 +++++++++----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
index ab957b8b4b..42daa95a57 100644
--- a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
+++ b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
@@ -686,20 +686,20 @@
 
   <!-- <convert> -->
   <implementation name="IM_convert_float_color3_genosl" nodedef="ND_convert_float_color3" target="genosl" sourcecode="color({{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_float_color4_genosl" nodedef="ND_convert_float_color4" target="genosl" sourcecode="color4({ {{in}},{{in}},{{in}} },{{in}})" />
-  <implementation name="IM_convert_float_vector2_genosl" nodedef="ND_convert_float_vector2" target="genosl" sourcecode="vector2({{in}},{{in}})" />
+  <implementation name="IM_convert_float_color4_genosl" nodedef="ND_convert_float_color4" target="genosl" sourcecode="{ color({{in}},{{in}},{{in}}),{{in}}}" />
+  <implementation name="IM_convert_float_vector2_genosl" nodedef="ND_convert_float_vector2" target="genosl" sourcecode="{ {{in}},{{in}} }" />
   <implementation name="IM_convert_float_vector3_genosl" nodedef="ND_convert_float_vector3" target="genosl" sourcecode="vector({{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_float_vector4_genosl" nodedef="ND_convert_float_vector4" target="genosl" sourcecode="vector4({{in}},{{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_vector2_vector3_genosl" nodedef="ND_convert_vector2_vector3" target="genosl" sourcecode="vector({{in}}[0],{{in}}[1],0)" />
-  <implementation name="IM_convert_vector3_vector2_genosl" nodedef="ND_convert_vector3_vector2" target="genosl" sourcecode="vector2({{in}}[0],{{in}}[1])" />
+  <implementation name="IM_convert_float_vector4_genosl" nodedef="ND_convert_float_vector4" target="genosl" sourcecode="{ {{in}},{{in}},{{in}},{{in}} }" />
+  <implementation name="IM_convert_vector2_vector3_genosl" nodedef="ND_convert_vector2_vector3" target="genosl" sourcecode="vector({{in}}.x,{{in}}.y,0)" />
+  <implementation name="IM_convert_vector3_vector2_genosl" nodedef="ND_convert_vector3_vector2" target="genosl" sourcecode="{ {{in}}[0],{{in}}[1] }" />
   <implementation name="IM_convert_vector3_color3_genosl" nodedef="ND_convert_vector3_color3" target="genosl" sourcecode="color({{in}})" />
-  <implementation name="IM_convert_vector3_vector4_genosl" nodedef="ND_convert_vector3_vector4" target="genosl" sourcecode="vector4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
-  <implementation name="IM_convert_vector4_vector3_genosl" nodedef="ND_convert_vector4_vector3" target="genosl" sourcecode="vector({{in}}[0],{{in}}[1],{{in}}[2])" />
-  <implementation name="IM_convert_vector4_color4_genosl" nodedef="ND_convert_vector4_color4" target="genosl" sourcecode="color4({ {{in}}[0],{{in}}[1],{{in}}[2] }, {{in}}[3])" />
+  <implementation name="IM_convert_vector3_vector4_genosl" nodedef="ND_convert_vector3_vector4" target="genosl" sourcecode="{ {{in}}[0],{{in}}[1],{{in}}[2],1 }" />
+  <implementation name="IM_convert_vector4_vector3_genosl" nodedef="ND_convert_vector4_vector3" target="genosl" sourcecode="vector({{in}}.x,{{in}}.y,{{in}}.z)" />
+  <implementation name="IM_convert_vector4_color4_genosl" nodedef="ND_convert_vector4_color4" target="genosl" sourcecode="{ color({{in}}.x,{{in}}.y,{{in}}.z), {{in}}.w }" />
   <implementation name="IM_convert_color3_vector3_genosl" nodedef="ND_convert_color3_vector3" target="genosl" sourcecode="vector({{in}})" />
-  <implementation name="IM_convert_color4_vector4_genosl" nodedef="ND_convert_color4_vector4" target="genosl" sourcecode="vector4({{in}})" />
-  <implementation name="IM_convert_color3_color4_genosl" nodedef="ND_convert_color3_color4" target="genosl" sourcecode="color4({ {{in}}[0],{{in}}[1],{{in}}[2] },1)" />
-  <implementation name="IM_convert_color4_color3_genosl" nodedef="ND_convert_color4_color3" target="genosl" sourcecode="color({{in}}[0],{{in}}[1],{{in}}[2])" />
+  <implementation name="IM_convert_color4_vector4_genosl" nodedef="ND_convert_color4_vector4" target="genosl" sourcecode="{ {{in}}.rgb[0],{{in}}.rgb[1],{{in}}.rgb[2],{{in}}.a }" />
+  <implementation name="IM_convert_color3_color4_genosl" nodedef="ND_convert_color3_color4" target="genosl" sourcecode="{ color({{in}}[0],{{in}}[1],{{in}}[2]),1 }" />
+  <implementation name="IM_convert_color4_color3_genosl" nodedef="ND_convert_color4_color3" target="genosl" sourcecode="color({{in}}.rgb[0],{{in}}.rgb[1],{{in}}.rgb[2])" />
   <implementation name="IM_convert_boolean_float_genosl" nodedef="ND_convert_boolean_float" target="genosl" sourcecode="float({{in}})" />
   <implementation name="IM_convert_integer_float_genosl" nodedef="ND_convert_integer_float" target="genosl" sourcecode="float({{in}})" />
 

From e613fc7514f224d847174d2d640a0b71a0dcf8e3 Mon Sep 17 00:00:00 2001
From: ld-kerley <154285602+ld-kerley@users.noreply.github.com>
Date: Mon, 3 Jun 2024 16:20:41 -0700
Subject: [PATCH 09/48] Remove Combine C++ node (#1855)

Replace with direct source code implementation for `combine2`, `combine3` and `combine4`.
---
 .../stdlib/genglsl/stdlib_genglsl_impl.mtlx   |  22 +--
 .../stdlib/genmdl/stdlib_genmdl_impl.mtlx     |  16 +-
 .../stdlib/genmsl/stdlib_genmsl_impl.mtlx     |  22 +--
 .../stdlib/genosl/stdlib_genosl_impl.mtlx     |  16 +-
 .../MaterialXGenGlsl/GlslShaderGenerator.cpp  |  14 --
 source/MaterialXGenMdl/MdlShaderGenerator.cpp |  11 --
 .../MaterialXGenMdl/Nodes/CombineNodeMdl.cpp  |  94 ------------
 source/MaterialXGenMdl/Nodes/CombineNodeMdl.h |  26 ----
 source/MaterialXGenMsl/MslShaderGenerator.cpp |  14 --
 source/MaterialXGenOsl/OslShaderGenerator.cpp |  11 --
 .../MaterialXGenShader/Nodes/CombineNode.cpp  | 143 ------------------
 source/MaterialXGenShader/Nodes/CombineNode.h |  24 ---
 12 files changed, 42 insertions(+), 371 deletions(-)
 delete mode 100644 source/MaterialXGenMdl/Nodes/CombineNodeMdl.cpp
 delete mode 100644 source/MaterialXGenMdl/Nodes/CombineNodeMdl.h
 delete mode 100644 source/MaterialXGenShader/Nodes/CombineNode.cpp
 delete mode 100644 source/MaterialXGenShader/Nodes/CombineNode.h

diff --git a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
index 8d8b620a2b..fd43c9e118 100644
--- a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
+++ b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
@@ -704,15 +704,19 @@
   <implementation name="IM_convert_boolean_float_genglsl" nodedef="ND_convert_boolean_float" target="genglsl" sourcecode="float({{in}})" />
   <implementation name="IM_convert_integer_float_genglsl" nodedef="ND_convert_integer_float" target="genglsl" sourcecode="float({{in}})" />
 
-  <!-- <combine> -->
-  <implementation name="IM_combine2_vector2_genglsl" nodedef="ND_combine2_vector2" target="genglsl" />
-  <implementation name="IM_combine2_color4CF_genglsl" nodedef="ND_combine2_color4CF" target="genglsl" />
-  <implementation name="IM_combine2_vector4VF_genglsl" nodedef="ND_combine2_vector4VF" target="genglsl" />
-  <implementation name="IM_combine2_vector4VV_genglsl" nodedef="ND_combine2_vector4VV" target="genglsl" />
-  <implementation name="IM_combine3_color3_genglsl" nodedef="ND_combine3_color3" target="genglsl" />
-  <implementation name="IM_combine3_vector3_genglsl" nodedef="ND_combine3_vector3" target="genglsl" />
-  <implementation name="IM_combine4_color4_genglsl" nodedef="ND_combine4_color4" target="genglsl" />
-  <implementation name="IM_combine4_vector4_genglsl" nodedef="ND_combine4_vector4" target="genglsl" />
+  <!-- <combine2> -->
+  <implementation name="IM_combine2_vector2_genglsl" nodedef="ND_combine2_vector2" target="genglsl" sourcecode="vec2({{in1}},{{in2}})"/>
+  <implementation name="IM_combine2_color4CF_genglsl" nodedef="ND_combine2_color4CF" target="genglsl" sourcecode="vec4({{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}})"/>
+  <implementation name="IM_combine2_vector4VF_genglsl" nodedef="ND_combine2_vector4VF" target="genglsl" sourcecode="vec4({{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}})"/>
+  <implementation name="IM_combine2_vector4VV_genglsl" nodedef="ND_combine2_vector4VV" target="genglsl" sourcecode="vec4({{in1}}[0],{{in1}}[1],{{in2}}[0],{{in2}}[1])"/>
+
+  <!-- <combine3> -->
+  <implementation name="IM_combine3_color3_genglsl" nodedef="ND_combine3_color3" target="genglsl" sourcecode="vec3({{in1}},{{in2}},{{in3}})"/>
+  <implementation name="IM_combine3_vector3_genglsl" nodedef="ND_combine3_vector3" target="genglsl" sourcecode="vec3({{in1}},{{in2}},{{in3}})"/>
+
+  <!-- <combine4> -->
+  <implementation name="IM_combine4_color4_genglsl" nodedef="ND_combine4_color4" target="genglsl" sourcecode="vec4({{in1}},{{in2}},{{in3}},{{in4}})"/>
+  <implementation name="IM_combine4_vector4_genglsl" nodedef="ND_combine4_vector4" target="genglsl" sourcecode="vec4({{in1}},{{in2}},{{in3}},{{in4}})"/>
 
   <!-- <creatematrix> -->
   <implementation name="IM_creatematrix_vector3_matrix33_genglsl" nodedef="ND_creatematrix_vector3_matrix33" file="mx_creatematrix_vector3_matrix33.glsl" function="mx_creatematrix_vector3_matrix33" target="genglsl" />
diff --git a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
index e8fca2128c..3ec74a5deb 100644
--- a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
+++ b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
@@ -713,18 +713,18 @@
   <implementation name="IM_convert_integer_float_genmdl" nodedef="ND_convert_integer_float" target="genmdl" sourcecode="float({{in}})" />
 
   <!-- <combine2> -->
-  <implementation name="IM_combine2_vector2_genmdl" nodedef="ND_combine2_vector2" target="genmdl" />
-  <implementation name="IM_combine2_color4CF_genmdl" nodedef="ND_combine2_color4CF" target="genmdl" />
-  <implementation name="IM_combine2_vector4VF_genmdl" nodedef="ND_combine2_vector4VF" target="genmdl" />
-  <implementation name="IM_combine2_vector4VV_genmdl" nodedef="ND_combine2_vector4VV" target="genmdl" />
+  <implementation name="IM_combine2_vector2_genmdl" nodedef="ND_combine2_vector2" target="genmdl" sourcecode="float2( {{in1}},{{in2}} )"/>
+  <implementation name="IM_combine2_color4CF_genmdl" nodedef="ND_combine2_color4CF" target="genmdl" sourcecode="color4( {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} )"/>
+  <implementation name="IM_combine2_vector4VF_genmdl" nodedef="ND_combine2_vector4VF" target="genmdl" sourcecode="float4( {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} )"/>
+  <implementation name="IM_combine2_vector4VV_genmdl" nodedef="ND_combine2_vector4VV" target="genmdl" sourcecode="float4( {{in1}}[0],{{in1}}[1],{{in2}}[0],{{in2}}[1] )"/>
 
   <!-- <combine3> -->
-  <implementation name="IM_combine3_color3_genmdl" nodedef="ND_combine3_color3" target="genmdl" />
-  <implementation name="IM_combine3_vector3_genmdl" nodedef="ND_combine3_vector3" target="genmdl" />
+  <implementation name="IM_combine3_color3_genmdl" nodedef="ND_combine3_color3" target="genmdl" sourcecode="color( {{in1}},{{in2}},{{in3}} )"/>
+  <implementation name="IM_combine3_vector3_genmdl" nodedef="ND_combine3_vector3" target="genmdl" sourcecode="float3( {{in1}},{{in2}},{{in3}} )"/>
 
   <!-- <combine4> -->
-  <implementation name="IM_combine4_color4_genmdl" nodedef="ND_combine4_color4" target="genmdl" />
-  <implementation name="IM_combine4_vector4_genmdl" nodedef="ND_combine4_vector4" target="genmdl" />
+  <implementation name="IM_combine4_color4_genmdl" nodedef="ND_combine4_color4" target="genmdl" sourcecode="color4( {{in1}},{{in2}},{{in3}},{{in4}} )"/>
+  <implementation name="IM_combine4_vector4_genmdl" nodedef="ND_combine4_vector4" target="genmdl" sourcecode="float4( {{in1}},{{in2}},{{in3}},{{in4}} )"/>
 
   <!-- <creatematrix> -->
   <implementation name="IM_creatematrix_vector3_matrix33_genmdl" nodedef="ND_creatematrix_vector3_matrix33" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_creatematrix_vector3_matrix33({{in1}}, {{in2}}, {{in3}})" target="genmdl" />
diff --git a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
index 3d1bdaf7fa..6e5f271164 100644
--- a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
+++ b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
@@ -704,15 +704,19 @@
   <implementation name="IM_convert_boolean_float_genmsl" nodedef="ND_convert_boolean_float" target="genmsl" sourcecode="float({{in}})" />
   <implementation name="IM_convert_integer_float_genmsl" nodedef="ND_convert_integer_float" target="genmsl" sourcecode="float({{in}})" />
 
-  <!-- <combine> -->
-  <implementation name="IM_combine2_vector2_genmsl" nodedef="ND_combine2_vector2" target="genmsl" />
-  <implementation name="IM_combine2_color4CF_genmsl" nodedef="ND_combine2_color4CF" target="genmsl" />
-  <implementation name="IM_combine2_vector4VF_genmsl" nodedef="ND_combine2_vector4VF" target="genmsl" />
-  <implementation name="IM_combine2_vector4VV_genmsl" nodedef="ND_combine2_vector4VV" target="genmsl" />
-  <implementation name="IM_combine3_color3_genmsl" nodedef="ND_combine3_color3" target="genmsl" />
-  <implementation name="IM_combine3_vector3_genmsl" nodedef="ND_combine3_vector3" target="genmsl" />
-  <implementation name="IM_combine4_color4_genmsl" nodedef="ND_combine4_color4" target="genmsl" />
-  <implementation name="IM_combine4_vector4_genmsl" nodedef="ND_combine4_vector4" target="genmsl" />
+  <!-- <combine2> -->
+  <implementation name="IM_combine2_vector2_genmsl" nodedef="ND_combine2_vector2" target="genmsl" sourcecode="{ {{in1}},{{in2}} }"/>
+  <implementation name="IM_combine2_color4CF_genmsl" nodedef="ND_combine2_color4CF" target="genmsl" sourcecode="{ {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} }"/>
+  <implementation name="IM_combine2_vector4VF_genmsl" nodedef="ND_combine2_vector4VF" target="genmsl" sourcecode="{ {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} }"/>
+  <implementation name="IM_combine2_vector4VV_genmsl" nodedef="ND_combine2_vector4VV" target="genmsl" sourcecode="{ {{in1}}[0],{{in1}}[1],{{in2}}[0],{{in2}}[1] }"/>
+
+  <!-- <combine3> -->
+  <implementation name="IM_combine3_color3_genmsl" nodedef="ND_combine3_color3" target="genmsl" sourcecode="{ {{in1}},{{in2}},{{in3}} }"/>
+  <implementation name="IM_combine3_vector3_genmsl" nodedef="ND_combine3_vector3" target="genmsl" sourcecode="{ {{in1}},{{in2}},{{in3}} }"/>
+
+  <!-- <combine4> -->
+  <implementation name="IM_combine4_color4_genmsl" nodedef="ND_combine4_color4" target="genmsl" sourcecode="{ {{in1}},{{in2}},{{in3}},{{in4}} }"/>
+  <implementation name="IM_combine4_vector4_genmsl" nodedef="ND_combine4_vector4" target="genmsl" sourcecode="{ {{in1}},{{in2}},{{in3}},{{in4}} }"/>
 
   <!-- <creatematrix> -->
   <implementation name="IM_creatematrix_vector3_matrix33_genmsl" nodedef="ND_creatematrix_vector3_matrix33" file="../genglsl/mx_creatematrix_vector3_matrix33.glsl" function="mx_creatematrix_vector3_matrix33" target="genmsl" />
diff --git a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
index 42daa95a57..fd339948d7 100644
--- a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
+++ b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
@@ -704,18 +704,18 @@
   <implementation name="IM_convert_integer_float_genosl" nodedef="ND_convert_integer_float" target="genosl" sourcecode="float({{in}})" />
 
   <!-- <combine2> -->
-  <implementation name="IM_combine2_vector2_genosl" nodedef="ND_combine2_vector2" target="genosl" />
-  <implementation name="IM_combine2_color4CF_genosl" nodedef="ND_combine2_color4CF" target="genosl" />
-  <implementation name="IM_combine2_vector4VF_genosl" nodedef="ND_combine2_vector4VF" target="genosl" />
-  <implementation name="IM_combine2_vector4VV_genosl" nodedef="ND_combine2_vector4VV" target="genosl" />
+  <implementation name="IM_combine2_vector2_genosl" nodedef="ND_combine2_vector2" target="genosl" sourcecode="{ {{in1}},{{in2}} }"/>
+  <implementation name="IM_combine2_color4CF_genosl" nodedef="ND_combine2_color4CF" target="genosl" sourcecode="{ color({{in1}}[0],{{in1}}[1],{{in1}}[2]),{{in2}} }"/>
+  <implementation name="IM_combine2_vector4VF_genosl" nodedef="ND_combine2_vector4VF" target="genosl" sourcecode="{ {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} }"/>
+  <implementation name="IM_combine2_vector4VV_genosl" nodedef="ND_combine2_vector4VV" target="genosl" sourcecode="{ {{in1}}.x,{{in1}}.y,{{in2}}.x,{{in2}}.y }"/>
 
   <!-- <combine3> -->
-  <implementation name="IM_combine3_color3_genosl" nodedef="ND_combine3_color3" target="genosl" />
-  <implementation name="IM_combine3_vector3_genosl" nodedef="ND_combine3_vector3" target="genosl" />
+  <implementation name="IM_combine3_color3_genosl" nodedef="ND_combine3_color3" target="genosl" sourcecode="color( {{in1}},{{in2}},{{in3}} )"/>
+  <implementation name="IM_combine3_vector3_genosl" nodedef="ND_combine3_vector3" target="genosl" sourcecode="vector( {{in1}},{{in2}},{{in3}} )"/>
 
   <!-- <combine4> -->
-  <implementation name="IM_combine4_color4_genosl" nodedef="ND_combine4_color4" target="genosl" />
-  <implementation name="IM_combine4_vector4_genosl" nodedef="ND_combine4_vector4" target="genosl" />
+  <implementation name="IM_combine4_color4_genosl" nodedef="ND_combine4_color4" target="genosl" sourcecode="{ color({{in1}},{{in2}},{{in3}}),{{in4}} }"/>
+  <implementation name="IM_combine4_vector4_genosl" nodedef="ND_combine4_vector4" target="genosl" sourcecode="{ {{in1}},{{in2}},{{in3}},{{in4}} }"/>
 
   <!-- <creatematrix> -->
   <implementation name="IM_creatematrix_vector3_matrix33_genosl" nodedef="ND_creatematrix_vector3_matrix33" file="mx_creatematrix.osl" function="mx_creatematrix_vector3_matrix33" target="genosl" />
diff --git a/source/MaterialXGenGlsl/GlslShaderGenerator.cpp b/source/MaterialXGenGlsl/GlslShaderGenerator.cpp
index 0e76154615..e114b4fe2a 100644
--- a/source/MaterialXGenGlsl/GlslShaderGenerator.cpp
+++ b/source/MaterialXGenGlsl/GlslShaderGenerator.cpp
@@ -19,7 +19,6 @@
 #include <MaterialXGenGlsl/Nodes/BlurNodeGlsl.h>
 
 #include <MaterialXGenShader/Nodes/MaterialNode.h>
-#include <MaterialXGenShader/Nodes/CombineNode.h>
 #include <MaterialXGenShader/Nodes/SwitchNode.h>
 #include <MaterialXGenShader/Nodes/HwImageNode.h>
 #include <MaterialXGenShader/Nodes/HwTexCoordNode.h>
@@ -80,19 +79,6 @@ GlslShaderGenerator::GlslShaderGenerator() :
     };
     registerImplementation(elementNames, SwitchNode::create);
 
-    // <!-- <combine> -->
-    elementNames = {
-        "IM_combine2_vector2_" + GlslShaderGenerator::TARGET,
-        "IM_combine2_color4CF_" + GlslShaderGenerator::TARGET,
-        "IM_combine2_vector4VF_" + GlslShaderGenerator::TARGET,
-        "IM_combine2_vector4VV_" + GlslShaderGenerator::TARGET,
-        "IM_combine3_color3_" + GlslShaderGenerator::TARGET,
-        "IM_combine3_vector3_" + GlslShaderGenerator::TARGET,
-        "IM_combine4_color4_" + GlslShaderGenerator::TARGET,
-        "IM_combine4_vector4_" + GlslShaderGenerator::TARGET,
-    };
-    registerImplementation(elementNames, CombineNode::create);
-
     // <!-- <position> -->
     registerImplementation("IM_position_vector3_" + GlslShaderGenerator::TARGET, HwPositionNode::create);
     // <!-- <normal> -->
diff --git a/source/MaterialXGenMdl/MdlShaderGenerator.cpp b/source/MaterialXGenMdl/MdlShaderGenerator.cpp
index a41b0d8f0c..fa984729a6 100644
--- a/source/MaterialXGenMdl/MdlShaderGenerator.cpp
+++ b/source/MaterialXGenMdl/MdlShaderGenerator.cpp
@@ -12,7 +12,6 @@
 #include <MaterialXGenMdl/Nodes/SurfaceNodeMdl.h>
 #include <MaterialXGenMdl/Nodes/HeightToNormalNodeMdl.h>
 #include <MaterialXGenMdl/Nodes/BlurNodeMdl.h>
-#include <MaterialXGenMdl/Nodes/CombineNodeMdl.h>
 #include <MaterialXGenMdl/Nodes/ClosureLayerNodeMdl.h>
 #include <MaterialXGenMdl/Nodes/ClosureCompoundNodeMdl.h>
 #include <MaterialXGenMdl/Nodes/ClosureSourceCodeNodeMdl.h>
@@ -92,16 +91,6 @@ MdlShaderGenerator::MdlShaderGenerator() :
     // <!-- <surface> -->
     registerImplementation("IM_surface_" + MdlShaderGenerator::TARGET, SurfaceNodeMdl::create);
 
-    // <!-- <combine> -->
-    registerImplementation("IM_combine2_vector2_" + MdlShaderGenerator::TARGET, CombineNodeMdl::create);
-    registerImplementation("IM_combine2_color4CF_" + MdlShaderGenerator::TARGET, CombineNodeMdl::create);
-    registerImplementation("IM_combine2_vector4VF_" + MdlShaderGenerator::TARGET, CombineNodeMdl::create);
-    registerImplementation("IM_combine2_vector4VV_" + MdlShaderGenerator::TARGET, CombineNodeMdl::create);
-    registerImplementation("IM_combine3_color3_" + MdlShaderGenerator::TARGET, CombineNodeMdl::create);
-    registerImplementation("IM_combine3_vector3_" + MdlShaderGenerator::TARGET, CombineNodeMdl::create);
-    registerImplementation("IM_combine4_color4_" + MdlShaderGenerator::TARGET, CombineNodeMdl::create);
-    registerImplementation("IM_combine4_vector4_" + MdlShaderGenerator::TARGET, CombineNodeMdl::create);
-
     // <!-- <blur> -->
     registerImplementation("IM_blur_float_" + MdlShaderGenerator::TARGET, BlurNodeMdl::create);
     registerImplementation("IM_blur_color3_" + MdlShaderGenerator::TARGET, BlurNodeMdl::create);
diff --git a/source/MaterialXGenMdl/Nodes/CombineNodeMdl.cpp b/source/MaterialXGenMdl/Nodes/CombineNodeMdl.cpp
deleted file mode 100644
index 9d6789c94c..0000000000
--- a/source/MaterialXGenMdl/Nodes/CombineNodeMdl.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-//
-// Copyright Contributors to the MaterialX Project
-// SPDX-License-Identifier: Apache-2.0
-//
-
-#include <MaterialXGenMdl/Nodes/CombineNodeMdl.h>
-
-#include <MaterialXGenShader/GenContext.h>
-#include <MaterialXGenShader/ShaderNode.h>
-#include <MaterialXGenShader/ShaderStage.h>
-#include <MaterialXGenShader/ShaderGenerator.h>
-
-MATERIALX_NAMESPACE_BEGIN
-
-ShaderNodeImplPtr CombineNodeMdl::create()
-{
-    return std::make_shared<CombineNodeMdl>();
-}
-
-void CombineNodeMdl::emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const
-{
-    DEFINE_SHADER_STAGE(stage, Stage::PIXEL)
-    {
-        // Custom handling for color3 type input, all other types
-        // can are handled by our parent class below.
-        // Custom handling is needed since in MDL color must be converted
-        // to float3 before accessing its sub-component.
-
-        const ShaderInput* in1 = node.getInput(0);
-        const ShaderOutput* out = node.getOutput();
-        if (!in1 || !out)
-        {
-            throw ExceptionShaderGenError("Node '" + node.getName() + "' is not a valid convert node");
-        }
-
-        if (in1->getType() == Type::COLOR3)
-        {
-            const ShaderInput* in2 = node.getInput(1);
-            if (!in2 || in2->getType() != Type::FLOAT)
-            {
-                throw ExceptionShaderGenError("Node '" + node.getName() + "' is not a valid convert node");
-            }
-
-            const ShaderGenerator& shadergen = context.getShaderGenerator();
-
-            // If in1 is unconnected we must declare a local variable
-            // for it first, in order to access components from it below.
-            string in1Variable = in1->getConnection() ? in1->getConnection()->getVariable() : in1->getVariable();
-            if (!in1->getConnection())
-            {
-                string variableValue = in1->getValue() ? shadergen.getSyntax().getValue(in1->getType(), *in1->getValue()) : shadergen.getSyntax().getDefaultValue(in1->getType());
-                shadergen.emitLine(shadergen.getSyntax().getTypeName(in1->getType()) + " " + in1Variable + " = " + variableValue, stage);
-            }
-
-            // Get the value components to use for constructing the new value.
-            StringVec valueComponents;
-
-            // Get components from in1
-            const StringVec& in1Members = shadergen.getSyntax().getTypeSyntax(in1->getType()).getMembers();
-            size_t memberSize = in1Members.size();
-            if (memberSize)
-            {
-                valueComponents.resize(memberSize + 1);
-                for (size_t i = 0; i < memberSize; i++)
-                {
-                    valueComponents[i] = "float3(" + in1Variable + ")" + in1Members[i];
-                }
-            }
-            else
-            {
-                memberSize = 1;
-                valueComponents.resize(2);
-                valueComponents[0] = in1Variable;
-            }
-            // Get component from in2
-            valueComponents[memberSize] = shadergen.getUpstreamResult(in2, context);
-
-            // Let the TypeSyntax construct the value from the components.
-            const TypeSyntax& outTypeSyntax = shadergen.getSyntax().getTypeSyntax(out->getType());
-            const string result = outTypeSyntax.getValue(valueComponents, false);
-
-            shadergen.emitLineBegin(stage);
-            shadergen.emitOutput(node.getOutput(), true, false, context, stage);
-            shadergen.emitString(" = " + result, stage);
-            shadergen.emitLineEnd(stage);
-        }
-        else
-        {
-            CombineNode::emitFunctionCall(node, context, stage);
-        }
-    }
-}
-
-MATERIALX_NAMESPACE_END
diff --git a/source/MaterialXGenMdl/Nodes/CombineNodeMdl.h b/source/MaterialXGenMdl/Nodes/CombineNodeMdl.h
deleted file mode 100644
index d8361820cf..0000000000
--- a/source/MaterialXGenMdl/Nodes/CombineNodeMdl.h
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// Copyright Contributors to the MaterialX Project
-// SPDX-License-Identifier: Apache-2.0
-//
-
-#ifndef MATERIALX_COMBINENODEMDL_H
-#define MATERIALX_COMBINENODEMDL_H
-
-#include <MaterialXGenMdl/Export.h>
-
-#include <MaterialXGenShader/Nodes/CombineNode.h>
-
-MATERIALX_NAMESPACE_BEGIN
-
-/// Custom combine node implementation for MDL
-class MX_GENMDL_API CombineNodeMdl : public CombineNode
-{
-  public:
-    static ShaderNodeImplPtr create();
-
-    void emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const override;
-};
-
-MATERIALX_NAMESPACE_END
-
-#endif
diff --git a/source/MaterialXGenMsl/MslShaderGenerator.cpp b/source/MaterialXGenMsl/MslShaderGenerator.cpp
index f88de98808..798c3b00b2 100644
--- a/source/MaterialXGenMsl/MslShaderGenerator.cpp
+++ b/source/MaterialXGenMsl/MslShaderGenerator.cpp
@@ -19,7 +19,6 @@
 #include <MaterialXGenMsl/Nodes/BlurNodeMsl.h>
 
 #include <MaterialXGenShader/Nodes/MaterialNode.h>
-#include <MaterialXGenShader/Nodes/CombineNode.h>
 #include <MaterialXGenShader/Nodes/SwitchNode.h>
 #include <MaterialXGenShader/Nodes/HwImageNode.h>
 #include <MaterialXGenShader/Nodes/HwTexCoordNode.h>
@@ -84,19 +83,6 @@ MslShaderGenerator::MslShaderGenerator() :
     };
     registerImplementation(elementNames, SwitchNode::create);
 
-    // <!-- <combine> -->
-    elementNames = {
-        "IM_combine2_vector2_" + MslShaderGenerator::TARGET,
-        "IM_combine2_color4CF_" + MslShaderGenerator::TARGET,
-        "IM_combine2_vector4VF_" + MslShaderGenerator::TARGET,
-        "IM_combine2_vector4VV_" + MslShaderGenerator::TARGET,
-        "IM_combine3_color3_" + MslShaderGenerator::TARGET,
-        "IM_combine3_vector3_" + MslShaderGenerator::TARGET,
-        "IM_combine4_color4_" + MslShaderGenerator::TARGET,
-        "IM_combine4_vector4_" + MslShaderGenerator::TARGET,
-    };
-    registerImplementation(elementNames, CombineNode::create);
-
     // <!-- <position> -->
     registerImplementation("IM_position_vector3_" + MslShaderGenerator::TARGET, HwPositionNode::create);
     // <!-- <normal> -->
diff --git a/source/MaterialXGenOsl/OslShaderGenerator.cpp b/source/MaterialXGenOsl/OslShaderGenerator.cpp
index 922eb58fa0..6302230f74 100644
--- a/source/MaterialXGenOsl/OslShaderGenerator.cpp
+++ b/source/MaterialXGenOsl/OslShaderGenerator.cpp
@@ -9,7 +9,6 @@
 #include <MaterialXGenShader/GenContext.h>
 #include <MaterialXGenShader/Shader.h>
 #include <MaterialXGenShader/ShaderStage.h>
-#include <MaterialXGenShader/Nodes/CombineNode.h>
 #include <MaterialXGenShader/Nodes/SwitchNode.h>
 #include <MaterialXGenShader/Nodes/SourceCodeNode.h>
 #include <MaterialXGenShader/Nodes/ClosureAddNode.h>
@@ -54,16 +53,6 @@ OslShaderGenerator::OslShaderGenerator() :
     registerImplementation("IM_switch_matrix33I_" + OslShaderGenerator::TARGET, SwitchNode::create);
     registerImplementation("IM_switch_matrix44I_" + OslShaderGenerator::TARGET, SwitchNode::create);
 
-    // <!-- <combine> -->
-    registerImplementation("IM_combine2_vector2_" + OslShaderGenerator::TARGET, CombineNode::create);
-    registerImplementation("IM_combine2_color4CF_" + OslShaderGenerator::TARGET, CombineNode::create);
-    registerImplementation("IM_combine2_vector4VF_" + OslShaderGenerator::TARGET, CombineNode::create);
-    registerImplementation("IM_combine2_vector4VV_" + OslShaderGenerator::TARGET, CombineNode::create);
-    registerImplementation("IM_combine3_color3_" + OslShaderGenerator::TARGET, CombineNode::create);
-    registerImplementation("IM_combine3_vector3_" + OslShaderGenerator::TARGET, CombineNode::create);
-    registerImplementation("IM_combine4_color4_" + OslShaderGenerator::TARGET, CombineNode::create);
-    registerImplementation("IM_combine4_vector4_" + OslShaderGenerator::TARGET, CombineNode::create);
-
     // <!-- <blur> -->
     registerImplementation("IM_blur_float_" + OslShaderGenerator::TARGET, BlurNodeOsl::create);
     registerImplementation("IM_blur_color3_" + OslShaderGenerator::TARGET, BlurNodeOsl::create);
diff --git a/source/MaterialXGenShader/Nodes/CombineNode.cpp b/source/MaterialXGenShader/Nodes/CombineNode.cpp
deleted file mode 100644
index 0237830c52..0000000000
--- a/source/MaterialXGenShader/Nodes/CombineNode.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-//
-// Copyright Contributors to the MaterialX Project
-// SPDX-License-Identifier: Apache-2.0
-//
-
-#include <MaterialXGenShader/Nodes/CombineNode.h>
-#include <MaterialXGenShader/GenContext.h>
-#include <MaterialXGenShader/ShaderNode.h>
-#include <MaterialXGenShader/ShaderStage.h>
-#include <MaterialXGenShader/ShaderGenerator.h>
-
-MATERIALX_NAMESPACE_BEGIN
-
-ShaderNodeImplPtr CombineNode::create()
-{
-    return std::make_shared<CombineNode>();
-}
-
-void CombineNode::emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const
-{
-    DEFINE_SHADER_STAGE(stage, Stage::PIXEL)
-    {
-        const ShaderGenerator& shadergen = context.getShaderGenerator();
-
-        const ShaderInput* in1 = node.getInput(0);
-        const ShaderOutput* out = node.getOutput();
-        if (!in1 || !out)
-        {
-            throw ExceptionShaderGenError("Node '" + node.getName() + "' is not a valid convert node");
-        }
-
-        // Check the node signature to determine which
-        // type conversion to perform, and get the value
-        // components to use for constructing the new value.
-        //
-        StringVec valueComponents;
-        if (in1->getType() == Type::FLOAT)
-        {
-            // Get the components of the input values.
-            const size_t numInputs = node.numInputs();
-            valueComponents.resize(numInputs);
-            for (size_t i = 0; i < numInputs; ++i)
-            {
-                const ShaderInput* input = node.getInput(i);
-                valueComponents[i] = shadergen.getUpstreamResult(input, context);
-            }
-        }
-        else if (in1->getType() == Type::COLOR3 || in1->getType() == Type::VECTOR3)
-        {
-            const ShaderInput* in2 = node.getInput(1);
-            if (!in2 || in2->getType() != Type::FLOAT)
-            {
-                throw ExceptionShaderGenError("Node '" + node.getName() + "' is not a valid convert node");
-            }
-
-            // If in1 is unconnected we must declare a local variable
-            // for it first, in order to access components from it below.
-            string in1Variable = in1->getConnection() ? in1->getConnection()->getVariable() : in1->getVariable();
-            if (!in1->getConnection())
-            {
-                string variableValue = in1->getValue() ? shadergen.getSyntax().getValue(in1->getType(), *in1->getValue()) : shadergen.getSyntax().getDefaultValue(in1->getType());
-                shadergen.emitLine(shadergen.getSyntax().getTypeName(in1->getType()) + " " + in1Variable + " = " + variableValue, stage);
-            }
-
-            // Get components from in1
-            const StringVec& in1Members = shadergen.getSyntax().getTypeSyntax(in1->getType()).getMembers();
-            size_t memberSize = in1Members.size();
-
-            // Get the components of the input values.
-            if (memberSize)
-            {
-                valueComponents.resize(memberSize + 1);
-                for (size_t i = 0; i < memberSize; i++)
-                {
-                    valueComponents[i] = in1Variable + in1Members[i];
-                }
-            }
-            else
-            {
-                memberSize = 1;
-                valueComponents.resize(2);
-                valueComponents[0] = in1Variable;
-            }
-            // Get component from in2
-            valueComponents[memberSize] = shadergen.getUpstreamResult(in2, context);
-        }
-        else if (in1->getType() == Type::VECTOR2)
-        {
-            const ShaderInput* in2 = node.getInput(1);
-            if (!in2 || (in2->getType() != Type::VECTOR2))
-            {
-                throw ExceptionShaderGenError("Node '" + node.getName() + "' is not a valid convert node");
-            }
-
-            // If in1 is unconnected we must declare a local variable
-            // for it first, in order to access components from it below.
-            string in1Variable = in1->getConnection() ? in1->getConnection()->getVariable() : in1->getVariable();
-            if (!in1->getConnection())
-            {
-                string variableValue = in1->getValue() ? shadergen.getSyntax().getValue(in1->getType(), *in1->getValue()) : shadergen.getSyntax().getDefaultValue(in1->getType());
-                shadergen.emitLine(shadergen.getSyntax().getTypeName(in1->getType()) + " " + in1Variable + " = " + variableValue, stage);
-            }
-
-            // If in2 is unconnected we must declare a local variable
-            // for it first, in order to access components from it below.
-            string in2Variable = in2->getConnection() ? in2->getConnection()->getVariable() : in2->getVariable();
-            if (!in2->getConnection())
-            {
-                string variableValue = in2->getValue() ? shadergen.getSyntax().getValue(in2->getType(), *in2->getValue()) : shadergen.getSyntax().getDefaultValue(in2->getType());
-                shadergen.emitLine(shadergen.getSyntax().getTypeName(in2->getType()) + " " + in2Variable + " = " + variableValue, stage);
-            }
-
-            // Get the components of the input values.
-            valueComponents.resize(4);
-
-            // Get components from in1.
-            const StringVec& in1Members = shadergen.getSyntax().getTypeSyntax(in1->getType()).getMembers();
-            valueComponents[0] = in1Variable + in1Members[0];
-            valueComponents[1] = in1Variable + in1Members[1];
-
-            // Get components from in2.
-            const StringVec& in2Members = shadergen.getSyntax().getTypeSyntax(in2->getType()).getMembers();
-            valueComponents[2] = in2Variable + in2Members[0];
-            valueComponents[3] = in2Variable + in2Members[1];
-        }
-
-        if (valueComponents.empty())
-        {
-            throw ExceptionShaderGenError("Node '" + node.getName() + "' is not a valid convert node");
-        }
-
-        // Let the TypeSyntax construct the value from the components.
-        const TypeSyntax& outTypeSyntax = shadergen.getSyntax().getTypeSyntax(out->getType());
-        const string result = outTypeSyntax.getValue(valueComponents, false);
-
-        shadergen.emitLineBegin(stage);
-        shadergen.emitOutput(node.getOutput(), true, false, context, stage);
-        shadergen.emitString(" = " + result, stage);
-        shadergen.emitLineEnd(stage);
-    }
-}
-
-MATERIALX_NAMESPACE_END
diff --git a/source/MaterialXGenShader/Nodes/CombineNode.h b/source/MaterialXGenShader/Nodes/CombineNode.h
deleted file mode 100644
index c77ba1396b..0000000000
--- a/source/MaterialXGenShader/Nodes/CombineNode.h
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// Copyright Contributors to the MaterialX Project
-// SPDX-License-Identifier: Apache-2.0
-//
-
-#ifndef MATERIALX_COMBINENODE_H
-#define MATERIALX_COMBINENODE_H
-
-#include <MaterialXGenShader/ShaderNodeImpl.h>
-
-MATERIALX_NAMESPACE_BEGIN
-
-/// Combine node implementation
-class MX_GENSHADER_API CombineNode : public ShaderNodeImpl
-{
-  public:
-    static ShaderNodeImplPtr create();
-
-    void emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const override;
-};
-
-MATERIALX_NAMESPACE_END
-
-#endif

From c354a4412be97e9464b4b0ec95416306c3c3278f Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Mon, 3 Jun 2024 20:03:04 -0700
Subject: [PATCH 10/48] Update OpenPBR to v1.0

---
 libraries/bxdf/open_pbr_surface.mtlx | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/libraries/bxdf/open_pbr_surface.mtlx b/libraries/bxdf/open_pbr_surface.mtlx
index b4a6fac5a3..d57a18a6ec 100644
--- a/libraries/bxdf/open_pbr_surface.mtlx
+++ b/libraries/bxdf/open_pbr_surface.mtlx
@@ -3,8 +3,8 @@
   <!--
     OpenPBR Surface node definition
   -->
-  <nodedef name="ND_open_pbr_surface_surfaceshader" node="open_pbr_surface" nodegroup="pbr" version="0.5" isdefaultversion="true"
-           doc="OpenPBR Surface Shading Model">
+  <nodedef name="ND_open_pbr_surface_surfaceshader" node="open_pbr_surface" nodegroup="pbr" version="1.0" isdefaultversion="true"
+           doc="OpenPBR Surface Shading Model" uiname="OpenPBR Surface">
     <input name="base_weight" type="float" value="1.0" uimin="0.0" uimax="1.0" uiname="Base Weight" uifolder="Base"
            doc="Multiplier on the intensity of the reflection from the diffuse and metallic base." />
     <input name="base_color" type="color3" value="0.8, 0.8, 0.8" uimin="0,0,0" uimax="1,1,1" uiname="Base Color" uifolder="Base"
@@ -35,7 +35,7 @@
            doc="The amount of directional bias, or anisotropy, of the volumetric scattering in the transparent base." />
     <input name="transmission_dispersion_scale" type="float" value="0.0" uimin="0.0" uimax="1.0" uiname="Transmission Dispersion Scale" uifolder="Transmission" uiadvanced="true"
            doc="Linearly scales the amount of dispersion." />
-    <input name="transmission_dispersion_abbe_number" type="float" value="0.0" uimin="0.0" uisoftmin="9.0" uisoftmax="91.0" uiname="Transmission Dispersion Abbe Number" uifolder="Transmission" uiadvanced="true"
+    <input name="transmission_dispersion_abbe_number" type="float" value="20.0" uimin="0.0" uisoftmin="9.0" uisoftmax="91.0" uiname="Transmission Dispersion Abbe Number" uifolder="Transmission" uiadvanced="true"
            doc="Physical Abbe number of the dielectric medium, describing how much the dielectric index of refraction varies across wavelengths." />
     <input name="subsurface_weight" type="float" value="0" uimin="0.0" uimax="1.0" uiname="Subsurface Weight" uifolder="Subsurface" uiadvanced="true"
            doc="Mixture weight which dials the opaque dielectric base between diffuse reflection and subsurface scattering. A value of 1.0 indicates full subsurface scattering and a value 0 for diffuse reflection only." />
@@ -304,12 +304,23 @@
     </multiply>
 
     <!-- Dielectric Base -->
-    <divide name="specular_to_coat_ior_ratio" type="float">
-      <input name="in1" type="float" interfacename="specular_ior" />
-      <input name="in2" type="float" interfacename="coat_ior" />
-    </divide>
+      <!-- apply IOR ratio inversion method to avoid TIR artifact (as in Coat TIR section of spec) -->
+      <divide name="specular_to_coat_ior_ratio" type="float">
+         <input name="in1" type="float" interfacename="specular_ior" />
+         <input name="in2" type="float" interfacename="coat_ior" />
+      </divide>
+      <divide name="coat_to_specular_ior_ratio" type="float">
+         <input name="in1" type="float" interfacename="coat_ior" />
+         <input name="in2" type="float" interfacename="specular_ior" />
+      </divide>
+      <ifgreater name="specular_to_coat_ior_ratio_tir_fix" type="float">
+         <input name="value1" type="float" nodename="specular_to_coat_ior_ratio" />
+         <input name="value2" type="float" value="1.0" />
+         <input name="in1" type="float" nodename="specular_to_coat_ior_ratio" />
+         <input name="in2" type="float" nodename="coat_to_specular_ior_ratio" />
+      </ifgreater>
     <mix name="eta_s" type="float">
-      <input name="fg" type="float" nodename="specular_to_coat_ior_ratio" />
+      <input name="fg" type="float" nodename="specular_to_coat_ior_ratio_tir_fix" />
       <input name="bg" type="float" interfacename="specular_ior" />
       <input name="mix" type="float" interfacename="coat_weight" />
     </mix>

From e59c0e57a810dfc7256b4390179c794db8c9effa Mon Sep 17 00:00:00 2001
From: ld-kerley <154285602+ld-kerley@users.noreply.github.com>
Date: Tue, 4 Jun 2024 14:47:58 -0700
Subject: [PATCH 11/48] Simplify TypeSyntax API (#1867)

After the recent refactor of `<convert>` (#1854) and `<combine>` (#1855) the `getValue()` function overload is no longer needed.
---
 source/MaterialXGenGlsl/GlslSyntax.cpp | 17 ------
 source/MaterialXGenMdl/MdlSyntax.cpp   | 31 -----------
 source/MaterialXGenMsl/MslSyntax.cpp   | 17 ------
 source/MaterialXGenOsl/OslSyntax.cpp   | 75 +-------------------------
 source/MaterialXGenShader/Syntax.cpp   | 33 ------------
 source/MaterialXGenShader/Syntax.h     |  7 ---
 6 files changed, 1 insertion(+), 179 deletions(-)

diff --git a/source/MaterialXGenGlsl/GlslSyntax.cpp b/source/MaterialXGenGlsl/GlslSyntax.cpp
index db7b2e742e..f91305f1a6 100644
--- a/source/MaterialXGenGlsl/GlslSyntax.cpp
+++ b/source/MaterialXGenGlsl/GlslSyntax.cpp
@@ -44,23 +44,6 @@ class GlslArrayTypeSyntax : public ScalarTypeSyntax
         return EMPTY_STRING;
     }
 
-    string getValue(const StringVec& values, bool /*uniform*/) const override
-    {
-        if (values.empty())
-        {
-            throw ExceptionShaderGenError("No values given to construct an array value");
-        }
-
-        string result = _name + "[" + std::to_string(values.size()) + "](" + values[0];
-        for (size_t i = 1; i < values.size(); ++i)
-        {
-            result += ", " + values[i];
-        }
-        result += ")";
-
-        return result;
-    }
-
   protected:
     virtual size_t getSize(const Value& value) const = 0;
 };
diff --git a/source/MaterialXGenMdl/MdlSyntax.cpp b/source/MaterialXGenMdl/MdlSyntax.cpp
index d30ab223cd..0244a8352f 100644
--- a/source/MaterialXGenMdl/MdlSyntax.cpp
+++ b/source/MaterialXGenMdl/MdlSyntax.cpp
@@ -93,23 +93,6 @@ class MdlArrayTypeSyntax : public ScalarTypeSyntax
         return EMPTY_STRING;
     }
 
-    string getValue(const StringVec& values, bool /*uniform*/) const override
-    {
-        if (values.empty())
-        {
-            throw ExceptionShaderGenError("No values given to construct an array value");
-        }
-
-        string result = getName() + "[](" + values[0];
-        for (size_t i = 1; i < values.size(); ++i)
-        {
-            result += ", " + values[i];
-        }
-        result += ")";
-
-        return result;
-    }
-
   protected:
     virtual bool isEmpty(const Value& value) const = 0;
 };
@@ -178,20 +161,6 @@ class MdlColor4TypeSyntax : public AggregateTypeSyntax
 
         return ss.str();
     }
-
-    string getValue(const StringVec& values, bool /*uniform*/) const override
-    {
-        size_t valueCount = values.size();
-        if (valueCount == 4)
-        {
-            return "mk_color4(" + values[0] + ", " + values[1] + ", " + values[2] + ", " + values[3] + ")";
-        }
-        else if (valueCount == 2)
-        {
-            return "mk_color4(" + values[0] + ", " + values[1] + ")";
-        }
-        throw ExceptionShaderGenError("Incorrect number of values to construct a color4 value:" + std::to_string(valueCount));
-    }
 };
 
 class MdlEnumSyntax : public AggregateTypeSyntax
diff --git a/source/MaterialXGenMsl/MslSyntax.cpp b/source/MaterialXGenMsl/MslSyntax.cpp
index 2440d1e7de..30f44c5d1c 100644
--- a/source/MaterialXGenMsl/MslSyntax.cpp
+++ b/source/MaterialXGenMsl/MslSyntax.cpp
@@ -44,23 +44,6 @@ class MslArrayTypeSyntax : public ScalarTypeSyntax
         return EMPTY_STRING;
     }
 
-    string getValue(const StringVec& values, bool /*uniform*/) const override
-    {
-        if (values.empty())
-        {
-            throw ExceptionShaderGenError("No values given to construct an array value");
-        }
-
-        string result = "{" + values[0];
-        for (size_t i = 1; i < values.size(); ++i)
-        {
-            result += ", " + values[i] + "f";
-        }
-        result += "}";
-
-        return result;
-    }
-
   protected:
     virtual size_t getSize(const Value& value) const = 0;
 };
diff --git a/source/MaterialXGenOsl/OslSyntax.cpp b/source/MaterialXGenOsl/OslSyntax.cpp
index 158b109496..797a891ce6 100644
--- a/source/MaterialXGenOsl/OslSyntax.cpp
+++ b/source/MaterialXGenOsl/OslSyntax.cpp
@@ -26,11 +26,6 @@ class OslBooleanTypeSyntax : public ScalarTypeSyntax
     {
         return value.asA<bool>() ? "1" : "0";
     }
-
-    string getValue(const StringVec& values, bool /*uniform*/) const override
-    {
-        return values.size() && values[0] == "true" ? "1" : "0";
-    }
 };
 
 class OslArrayTypeSyntax : public ScalarTypeSyntax
@@ -55,23 +50,6 @@ class OslArrayTypeSyntax : public ScalarTypeSyntax
         return EMPTY_STRING;
     }
 
-    string getValue(const StringVec& values, bool /*uniform*/) const override
-    {
-        if (values.empty())
-        {
-            throw ExceptionShaderGenError("No values given to construct an array value");
-        }
-
-        string result = "{" + values[0];
-        for (size_t i = 1; i < values.size(); ++i)
-        {
-            result += ", " + values[i];
-        }
-        result += "}";
-
-        return result;
-    }
-
   protected:
     virtual bool isEmpty(const Value& value) const = 0;
 };
@@ -131,23 +109,6 @@ class OslStructTypeSyntax : public AggregateTypeSyntax
             return getName() + "(" + value.getValueString() + ")";
         }
     }
-
-    string getValue(const StringVec& values, bool uniform) const override
-    {
-        if (values.empty())
-        {
-            throw ExceptionShaderGenError("No values given to construct a value");
-        }
-
-        string result = uniform ? "{" : getName() + "(" + values[0];
-        for (size_t i = 1; i < values.size(); ++i)
-        {
-            result += ", " + values[i];
-        }
-        result += uniform ? "}" : ")";
-
-        return result;
-    }
 };
 
 // For the color4 type we need even more specialization since it's a struct of a struct:
@@ -189,23 +150,6 @@ class OslColor4TypeSyntax : public OslStructTypeSyntax
 
         return ss.str();
     }
-
-    string getValue(const StringVec& values, bool uniform) const override
-    {
-        if (values.size() < 4)
-        {
-            throw ExceptionShaderGenError("Too few values given to construct a color4 value");
-        }
-
-        if (uniform)
-        {
-            return "{color(" + values[0] + ", " + values[1] + ", " + values[2] + "), " + values[3] + "}";
-        }
-        else
-        {
-            return "color4(color(" + values[0] + ", " + values[1] + ", " + values[2] + "), " + values[3] + ")";
-        }
-    }
 };
 
 class OSLMatrix3TypeSyntax : public AggregateTypeSyntax
@@ -218,14 +162,9 @@ class OSLMatrix3TypeSyntax : public AggregateTypeSyntax
     {
     }
 
-    string getValue(const Value& value, bool uniform) const override
+    string getValue(const Value& value, bool /*uniform*/) const override
     {
         StringVec values = splitString(value.getValueString(), ",");
-        return getValue(values, uniform);
-    }
-
-    string getValue(const StringVec& values, bool /*uniform*/) const override
-    {
         if (values.empty())
         {
             throw ExceptionShaderGenError("No values given to construct a value");
@@ -280,18 +219,6 @@ class OSLFilenameTypeSyntax : public AggregateTypeSyntax
         const string suffix = uniform ? "}" : ")";
         return prefix + "\"" + value.getValueString() + "\", \"\"" + suffix;
     }
-
-    string getValue(const StringVec& values, bool uniform) const override
-    {
-        if (values.size() != 2)
-        {
-            throw ExceptionShaderGenError("Incorrect number of values given to construct a value");
-        }
-
-        const string prefix = uniform ? "{" : getName() + "(";
-        const string suffix = uniform ? "}" : ")";
-        return prefix + "\"" + values[0] + "\", \"" + values[1] + "\"" + suffix;
-    }
 };
 
 } // anonymous namespace
diff --git a/source/MaterialXGenShader/Syntax.cpp b/source/MaterialXGenShader/Syntax.cpp
index ff9b35894c..e270909e0f 100644
--- a/source/MaterialXGenShader/Syntax.cpp
+++ b/source/MaterialXGenShader/Syntax.cpp
@@ -224,19 +224,6 @@ string ScalarTypeSyntax::getValue(const Value& value, bool /*uniform*/) const
     return value.getValueString();
 }
 
-string ScalarTypeSyntax::getValue(const StringVec& values, bool /*uniform*/) const
-{
-    if (values.empty())
-    {
-        throw ExceptionShaderGenError("No values given to construct a value");
-    }
-    // Write the value using a stream to maintain any float formatting set
-    // using Value::setFloatFormat() and Value::setFloatPrecision()
-    StringStream ss;
-    ss << values[0];
-    return ss.str();
-}
-
 StringTypeSyntax::StringTypeSyntax(const string& name, const string& defaultValue, const string& uniformDefaultValue,
                                    const string& typeAlias, const string& typeDefinition) :
     ScalarTypeSyntax(name, defaultValue, uniformDefaultValue, typeAlias, typeDefinition)
@@ -260,24 +247,4 @@ string AggregateTypeSyntax::getValue(const Value& value, bool /*uniform*/) const
     return valueString.empty() ? valueString : getName() + "(" + valueString + ")";
 }
 
-string AggregateTypeSyntax::getValue(const StringVec& values, bool /*uniform*/) const
-{
-    if (values.empty())
-    {
-        throw ExceptionShaderGenError("No values given to construct a value");
-    }
-
-    // Write the value using a stream to maintain any float formatting set
-    // using Value::setFloatFormat() and Value::setFloatPrecision()
-    StringStream ss;
-    ss << getName() << "(" << values[0];
-    for (size_t i = 1; i < values.size(); ++i)
-    {
-        ss << ", " << values[i];
-    }
-    ss << ")";
-
-    return ss.str();
-}
-
 MATERIALX_NAMESPACE_END
diff --git a/source/MaterialXGenShader/Syntax.h b/source/MaterialXGenShader/Syntax.h
index 18c85ed78d..a4bb7e49b5 100644
--- a/source/MaterialXGenShader/Syntax.h
+++ b/source/MaterialXGenShader/Syntax.h
@@ -246,11 +246,6 @@ class MX_GENSHADER_API TypeSyntax
     /// The value is constructed from the given value object.
     virtual string getValue(const Value& value, bool uniform) const = 0;
 
-    /// Returns a value formatted according to this type syntax.
-    /// The value is constructed from the given list of value entries
-    /// with one entry for each member of the type.
-    virtual string getValue(const StringVec& values, bool uniform) const = 0;
-
   protected:
     /// Protected constructor
     TypeSyntax(const string& name, const string& defaultValue, const string& uniformDefaultValue,
@@ -274,7 +269,6 @@ class MX_GENSHADER_API ScalarTypeSyntax : public TypeSyntax
                      const string& typeAlias = EMPTY_STRING, const string& typeDefinition = EMPTY_STRING);
 
     string getValue(const Value& value, bool uniform) const override;
-    string getValue(const StringVec& values, bool uniform) const override;
 };
 
 /// Specialization of TypeSyntax for string types.
@@ -296,7 +290,6 @@ class MX_GENSHADER_API AggregateTypeSyntax : public TypeSyntax
                         const StringVec& members = EMPTY_MEMBERS);
 
     string getValue(const Value& value, bool uniform) const override;
-    string getValue(const StringVec& values, bool uniform) const override;
 };
 
 MATERIALX_NAMESPACE_END

From ee5a81f24c1b651c7e666cdde7cbda6a219eeced Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Tue, 4 Jun 2024 14:57:35 -0700
Subject: [PATCH 12/48] Update OpenPBR default example

This changelist updates the OpenPBR default example, matching its values to the latest default values of the shading model.
---
 resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx b/resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx
index 85c5379162..756eda8ab6 100644
--- a/resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx
+++ b/resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx
@@ -20,7 +20,7 @@
     <input name="transmission_scatter" type="color3" value="0, 0, 0" />
     <input name="transmission_scatter_anisotropy" type="float" value="0.0" />
     <input name="transmission_dispersion_scale" type="float" value="0.0" />
-    <input name="transmission_dispersion_abbe_number" type="float" value="0.0" />
+    <input name="transmission_dispersion_abbe_number" type="float" value="20.0" />
     <input name="subsurface_weight" type="float" value="0" />
     <input name="subsurface_color" type="color3" value="0.8, 0.8, 0.8" />
     <input name="subsurface_radius" type="float" value="1.0" />
@@ -35,8 +35,8 @@
     <input name="coat_roughness_anisotropy" type="float" value="0.0" />
     <input name="coat_ior" type="float" value="1.6" />
     <input name="coat_darkening" type="float" value="1.0" />
-    <input name="thin_film_weight" type="float" value="0.0" />
-    <input name="thin_film_thickness" type="float" value="0" />
+    <input name="thin_film_weight" type="float" value="0" />
+    <input name="thin_film_thickness" type="float" value="0.5" />
     <input name="thin_film_ior" type="float" value="1.5" />
     <input name="emission_luminance" type="float" value="0.0" />
     <input name="emission_color" type="color3" value="1, 1, 1" />

From 44bf535467bc815869689e71bc1ed5898d9b1769 Mon Sep 17 00:00:00 2001
From: Niklas Harrysson <niklas.harrysson@gmail.com>
Date: Wed, 5 Jun 2024 18:32:47 +0200
Subject: [PATCH 13/48] Updates to double-sided materials for 1.39 (#1866)

This change list updates the library files so they match the definitions for surfacematerial and surface nodes in v1.39.
---
 libraries/pbrlib/genosl/legacy/mx_surface.osl       | 2 +-
 libraries/pbrlib/genosl/mx_surface.osl              | 2 +-
 libraries/pbrlib/pbrlib_defs.mtlx                   | 1 +
 libraries/stdlib/stdlib_defs.mtlx                   | 1 +
 source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl | 3 ++-
 source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl | 5 +++--
 source/MaterialXGenOsl/Nodes/MaterialNodeOsl.cpp    | 2 +-
 7 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/libraries/pbrlib/genosl/legacy/mx_surface.osl b/libraries/pbrlib/genosl/legacy/mx_surface.osl
index 589a40b9fb..d48320411e 100644
--- a/libraries/pbrlib/genosl/legacy/mx_surface.osl
+++ b/libraries/pbrlib/genosl/legacy/mx_surface.osl
@@ -1,4 +1,4 @@
-void mx_surface(BSDF bsdf, EDF edf, float opacity, output surfaceshader result)
+void mx_surface(BSDF bsdf, EDF edf, float opacity, int thin_walled, output surfaceshader result)
 {
     result.bsdf    = bsdf.response;
     result.edf     = edf;
diff --git a/libraries/pbrlib/genosl/mx_surface.osl b/libraries/pbrlib/genosl/mx_surface.osl
index 452592dbdd..ac454937a6 100644
--- a/libraries/pbrlib/genosl/mx_surface.osl
+++ b/libraries/pbrlib/genosl/mx_surface.osl
@@ -1,4 +1,4 @@
-void mx_surface(BSDF bsdf, EDF edf, float opacity, output surfaceshader result)
+void mx_surface(BSDF bsdf, EDF edf, float opacity, int thin_walled, output surfaceshader result)
 {
     result.bsdf    = bsdf;
     result.edf     = edf;
diff --git a/libraries/pbrlib/pbrlib_defs.mtlx b/libraries/pbrlib/pbrlib_defs.mtlx
index 3d0aaee762..eebe56b1de 100644
--- a/libraries/pbrlib/pbrlib_defs.mtlx
+++ b/libraries/pbrlib/pbrlib_defs.mtlx
@@ -221,6 +221,7 @@
     <input name="bsdf" type="BSDF" value="" doc="Distribution function for surface scattering." />
     <input name="edf" type="EDF" value="" doc="Distribution function for surface emission." />
     <input name="opacity" type="float" value="1.0" doc="Surface cutout opacity" />
+    <input name="thin_walled" type="boolean" value="false" uniform="true" doc="Option to make the surface thin-walled." />
     <output name="out" type="surfaceshader" />
   </nodedef>
 
diff --git a/libraries/stdlib/stdlib_defs.mtlx b/libraries/stdlib/stdlib_defs.mtlx
index df48c8414f..9b7a244cb9 100644
--- a/libraries/stdlib/stdlib_defs.mtlx
+++ b/libraries/stdlib/stdlib_defs.mtlx
@@ -86,6 +86,7 @@
   <!-- Surface material -->
   <nodedef name="ND_surfacematerial" node="surfacematerial" nodegroup="material">
     <input name="surfaceshader" type="surfaceshader" value="" />
+    <input name="backsurfaceshader" type="surfaceshader" value="" />
     <input name="displacementshader" type="displacementshader" value="" />
     <output name="out" type="material" />
   </nodedef>
diff --git a/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl b/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl
index 02fb7f2c1e..f6d3674324 100644
--- a/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl
+++ b/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl
@@ -545,6 +545,7 @@ export material mx_surface(
     material mxp_bsdf = material() [[ anno::usage( "materialx:bsdf") ]],
     material mxp_edf  = material() [[ anno::usage( "materialx:edf") ]],
     float mxp_opacity = 1.0,
+    uniform bool mxp_thin_walled = false,
     uniform float mxp_transmission_ior = 0.0 // extra parameter for setting transmission IOR
 ) [[
     anno::usage( "materialx:surfaceshader")
@@ -555,7 +556,7 @@ export material mx_surface(
     // we need to carry volume properties along for SSS
     material_volume   bsdf_volume = mxp_bsdf.volume;
 } in material(
-    thin_walled: false,
+    thin_walled: mxp_thin_walled,
     surface: material_surface(
         scattering: bsdf_node,
         emission: edf_node
diff --git a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
index e40c246b41..90fc10a4ba 100644
--- a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
+++ b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
@@ -36,12 +36,13 @@ import .::hsv::*;
 
 export material mx_surfacematerial(
     material mxp_surfaceshader = material() [[ anno::usage( "materialx:surfaceshader") ]],
+    material mxp_backsurfaceshader = material() [[ anno::usage( "materialx:surfaceshader") ]],
     material mxp_displacementshader =  material() [[ anno::usage( "materialx:displacementshader") ]]
 )
 = material(
-    thin_walled: false,
+    thin_walled: mxp_surfaceshader.thin_walled || mxp_backsurfaceshader.thin_walled,
     surface: mxp_surfaceshader.surface,
-    backface: mxp_surfaceshader.backface,
+    backface: mxp_backsurfaceshader.surface,
     geometry: material_geometry(
         cutout_opacity: mxp_surfaceshader.geometry.cutout_opacity,
         displacement : mxp_displacementshader.geometry.displacement,
diff --git a/source/MaterialXGenOsl/Nodes/MaterialNodeOsl.cpp b/source/MaterialXGenOsl/Nodes/MaterialNodeOsl.cpp
index e8a18942f0..42518e9c1d 100644
--- a/source/MaterialXGenOsl/Nodes/MaterialNodeOsl.cpp
+++ b/source/MaterialXGenOsl/Nodes/MaterialNodeOsl.cpp
@@ -18,7 +18,7 @@ ShaderNodeImplPtr MaterialNodeOsl::create()
 void MaterialNodeOsl::emitFunctionDefinition(const ShaderNode&, GenContext& context, ShaderStage& stage) const
 {
     const static string FUNCTION_DEFINITION =
-        "MATERIAL mx_surfacematerial(surfaceshader surface, displacementshader disp)\n"
+        "MATERIAL mx_surfacematerial(surfaceshader surface, surfaceshader backsurface, displacementshader disp)\n"
         "{\n"
         "    float opacity_weight = clamp(surface.opacity, 0.0, 1.0);\n"
         "    return (surface.bsdf + surface.edf) * opacity_weight + transparent() * (1.0 - opacity_weight);\n"

From 6c288c00efae192918bac7abc96fb3a12a73d8ed Mon Sep 17 00:00:00 2001
From: ld-kerley <154285602+ld-kerley@users.noreply.github.com>
Date: Wed, 5 Jun 2024 14:13:18 -0700
Subject: [PATCH 14/48] Add ccache support (#1869)

Add optional support for using ccache to speed up builds.

Guarded by `MATERIALX_BUILD_USE_CCACHE` if people need to disable for some reason.
---
 CMakeLists.txt | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index c8e059ce0b..9c79bcc43a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -49,6 +49,7 @@ option(MATERIALX_BUILD_BENCHMARK_TESTS "Build benchmark tests." OFF)
 
 option(MATERIALX_BUILD_SHARED_LIBS "Build MaterialX libraries as shared rather than static." OFF)
 option(MATERIALX_BUILD_MONOLITHIC "Build a single monolithic MaterialX library." OFF)
+option(MATERIALX_BUILD_USE_CCACHE "Enable the use of ccache to speed up build time, if present." ON)
 option(MATERIALX_PYTHON_LTO "Enable link-time optimizations for MaterialX Python." ON)
 option(MATERIALX_INSTALL_PYTHON "Install the MaterialX Python package as a third-party library when the install target is built." ON)
 option(MATERIALX_INSTALL_RESOURCES "Install the resources folder when building render modules." ON)
@@ -137,6 +138,7 @@ mark_as_advanced(MATERIALX_BUILD_OIIO)
 mark_as_advanced(MATERIALX_BUILD_BENCHMARK_TESTS)
 mark_as_advanced(MATERIALX_BUILD_SHARED_LIBS)
 mark_as_advanced(MATERIALX_BUILD_MONOLITHIC)
+mark_as_advanced(MATERIALX_BUILD_USE_CCACHE)
 mark_as_advanced(MATERIALX_NAMESPACE_SUFFIX)
 mark_as_advanced(MATERIALX_LIBNAME_SUFFIX)
 mark_as_advanced(MATERIALX_PYTHON_LTO)
@@ -169,6 +171,15 @@ if (MATERIALX_BUILD_GEN_MDL)
     mark_as_advanced(MATERIALX_INSTALL_MDL_MODULE_PATH)
 endif()
 
+if (MATERIALX_BUILD_USE_CCACHE)
+    # Setup CCache for C/C++ compilation
+    find_program(CCACHE_PROGRAM ccache)
+    if(CCACHE_PROGRAM)
+        set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
+        set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_PROGRAM}")
+    endif()
+endif()
+
 # Add global definitions
 add_definitions(-DMATERIALX_OSL_BINARY_OSLC=\"${MATERIALX_OSL_BINARY_OSLC}\")
 add_definitions(-DMATERIALX_OSL_BINARY_TESTRENDER=\"${MATERIALX_OSL_BINARY_TESTRENDER}\")

From 7cf5067b42b909bdde9aea8304ad9e7f1d4775df Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Fri, 7 Jun 2024 11:10:16 -0700
Subject: [PATCH 15/48] Revert to windows-2019 in CI (#1873)

This changelist reverts our GitHub Actions CI from windows-2022 to windows-2019, working around temporary issues with the windows-2022 runners.
---
 .github/workflows/main.yml | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index e2a9635f5e..213ca8c51b 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -104,18 +104,18 @@ jobs:
           python: 3.7
           cmake_config: -G "Visual Studio 16 2019" -A "Win32" -DMATERIALX_BUILD_SHARED_LIBS=ON
 
-        - name: Windows_VS2022_x64_Python311
-          os: windows-2022
+        - name: Windows_VS2019_x64_Python311
+          os: windows-2019
           architecture: x64
           python: 3.11
-          cmake_config: -G "Visual Studio 17 2022" -A "x64"
+          cmake_config: -G "Visual Studio 16 2019" -A "x64"
           test_shaders: ON
 
-        - name: Windows_VS2022_x64_Python312
-          os: windows-2022
+        - name: Windows_VS2019_x64_Python312
+          os: windows-2019
           architecture: x64
           python: 3.12
-          cmake_config: -G "Visual Studio 17 2022" -A "x64"
+          cmake_config: -G "Visual Studio 16 2019" -A "x64"
           upload_shaders: ON
 
     steps:
@@ -383,7 +383,7 @@ jobs:
       fail-fast: false
       matrix:
         python-minor: ['7', '8', '9', '10', '11', '12']
-        os: ['ubuntu-latest', 'windows-latest', 'macos-13']
+        os: ['ubuntu-latest', 'windows-2019', 'macos-13']
 
     steps:
     - name: Sync Repository

From b5ce26963a71b46d9e6548f99062b2da1027a22c Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Fri, 7 Jun 2024 15:56:35 -0700
Subject: [PATCH 16/48] Add boolean-output conditional nodes (#1875)

This changelist adds boolean-output versions of the `ifgreater`, `ifgreatereq`, `ifequal` nodes to the MaterialX data libraries, as defined in the 1.39 specification:

https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/documents/Specification/MaterialX.Specification.md#conditional-nodes
---
 .../stdlib/genglsl/stdlib_genglsl_impl.mtlx   |  7 ++
 .../stdlib/genmdl/stdlib_genmdl_impl.mtlx     |  7 ++
 .../stdlib/genmsl/stdlib_genmsl_impl.mtlx     |  7 ++
 .../stdlib/genosl/stdlib_genosl_impl.mtlx     |  7 ++
 libraries/stdlib/stdlib_defs.mtlx             | 35 +++++++++
 .../conditional/conditional_if_float.mtlx     | 21 +++++
 .../conditional/conditional_if_int.mtlx       | 28 +++++++
 .../mdl/materialx/stdlib_1_6.mdl              | 77 +++++++++++++++++++
 8 files changed, 189 insertions(+)

diff --git a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
index fd43c9e118..49e6a19c86 100644
--- a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
+++ b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
@@ -600,6 +600,7 @@
   <implementation name="IM_ifgreater_vector4_genglsl" nodedef="ND_ifgreater_vector4" target="genglsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreater_matrix33_genglsl" nodedef="ND_ifgreater_matrix33" target="genglsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreater_matrix44_genglsl" nodedef="ND_ifgreater_matrix44" target="genglsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifgreater_boolean_genglsl" nodedef="ND_ifgreater_boolean" target="genglsl" sourcecode="({{value1}} > {{value2}}) ? true : false" />
   <implementation name="IM_ifgreater_floatI_genglsl" nodedef="ND_ifgreater_floatI" target="genglsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreater_integerI_genglsl" nodedef="ND_ifgreater_integerI" target="genglsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreater_color3I_genglsl" nodedef="ND_ifgreater_color3I" target="genglsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
@@ -609,6 +610,7 @@
   <implementation name="IM_ifgreater_vector4I_genglsl" nodedef="ND_ifgreater_vector4I" target="genglsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreater_matrix33I_genglsl" nodedef="ND_ifgreater_matrix33I" target="genglsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreater_matrix44I_genglsl" nodedef="ND_ifgreater_matrix44I" target="genglsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifgreater_booleanI_genglsl" nodedef="ND_ifgreater_booleanI" target="genglsl" sourcecode="({{value1}} > {{value2}}) ? true : false" />
 
   <!-- <ifgreatereq -->
   <implementation name="IM_ifgreatereq_float_genglsl" nodedef="ND_ifgreatereq_float" target="genglsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
@@ -620,6 +622,7 @@
   <implementation name="IM_ifgreatereq_vector4_genglsl" nodedef="ND_ifgreatereq_vector4" target="genglsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreatereq_matrix33_genglsl" nodedef="ND_ifgreatereq_matrix33" target="genglsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreatereq_matrix44_genglsl" nodedef="ND_ifgreatereq_matrix44" target="genglsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifgreatereq_boolean_genglsl" nodedef="ND_ifgreatereq_boolean" target="genglsl" sourcecode="({{value1}} >= {{value2}}) ? true : false" />
   <implementation name="IM_ifgreatereq_floatI_genglsl" nodedef="ND_ifgreatereq_floatI" target="genglsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreatereq_integerI_genglsl" nodedef="ND_ifgreatereq_integerI" target="genglsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreatereq_color3I_genglsl" nodedef="ND_ifgreatereq_color3I" target="genglsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
@@ -629,6 +632,7 @@
   <implementation name="IM_ifgreatereq_vector4I_genglsl" nodedef="ND_ifgreatereq_vector4I" target="genglsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreatereq_matrix33I_genglsl" nodedef="ND_ifgreatereq_matrix33I" target="genglsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreatereq_matrix44I_genglsl" nodedef="ND_ifgreatereq_matrix44I" target="genglsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifgreatereq_booleanI_genglsl" nodedef="ND_ifgreatereq_booleanI" target="genglsl" sourcecode="({{value1}} >= {{value2}}) ? true : false" />
 
   <!-- <ifequal -->
   <implementation name="IM_ifequal_float_genglsl" nodedef="ND_ifequal_float" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
@@ -640,6 +644,7 @@
   <implementation name="IM_ifequal_vector4_genglsl" nodedef="ND_ifequal_vector4" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_matrix33_genglsl" nodedef="ND_ifequal_matrix33" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_matrix44_genglsl" nodedef="ND_ifequal_matrix44" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifequal_boolean_genglsl" nodedef="ND_ifequal_boolean" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? true : false" />
   <implementation name="IM_ifequal_floatI_genglsl" nodedef="ND_ifequal_floatI" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_integerI_genglsl" nodedef="ND_ifequal_integerI" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_color3I_genglsl" nodedef="ND_ifequal_color3I" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
@@ -649,6 +654,7 @@
   <implementation name="IM_ifequal_vector4I_genglsl" nodedef="ND_ifequal_vector4I" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_matrix33I_genglsl" nodedef="ND_ifequal_matrix33I" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_matrix44I_genglsl" nodedef="ND_ifequal_matrix44I" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifequal_booleanI_genglsl" nodedef="ND_ifequal_booleanI" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? true : false" />
   <implementation name="IM_ifequal_floatB_genglsl" nodedef="ND_ifequal_floatB" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_integerB_genglsl" nodedef="ND_ifequal_integerB" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_color3B_genglsl" nodedef="ND_ifequal_color3B" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
@@ -658,6 +664,7 @@
   <implementation name="IM_ifequal_vector4B_genglsl" nodedef="ND_ifequal_vector4B" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_matrix33B_genglsl" nodedef="ND_ifequal_matrix33B" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_matrix44B_genglsl" nodedef="ND_ifequal_matrix44B" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifequal_booleanB_genglsl" nodedef="ND_ifequal_booleanB" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? true : false" />
 
   <!-- <switch> -->
 
diff --git a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
index 3ec74a5deb..3b332e59a1 100644
--- a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
+++ b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
@@ -610,6 +610,7 @@
   <implementation name="IM_ifgreater_vector4_genmdl" nodedef="ND_ifgreater_vector4" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreater_vector4({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifgreater_matrix33_genmdl" nodedef="ND_ifgreater_matrix33" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreater_matrix33({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifgreater_matrix44_genmdl" nodedef="ND_ifgreater_matrix44" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreater_matrix44({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
+  <implementation name="IM_ifgreater_boolean_genmdl" nodedef="ND_ifgreater_boolean" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreater_boolean({{value1}}, {{value2}})" target="genmdl" />
   <implementation name="IM_ifgreater_floatI_genmdl" nodedef="ND_ifgreater_floatI" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreater_floatI({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifgreater_integerI_genmdl" nodedef="ND_ifgreater_integerI" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreater_integerI({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifgreater_color3I_genmdl" nodedef="ND_ifgreater_color3I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreater_color3I({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
@@ -619,6 +620,7 @@
   <implementation name="IM_ifgreater_vector4I_genmdl" nodedef="ND_ifgreater_vector4I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreater_vector4I({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifgreater_matrix33I_genmdl" nodedef="ND_ifgreater_matrix33I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreater_matrix33I({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifgreater_matrix44I_genmdl" nodedef="ND_ifgreater_matrix44I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreater_matrix44I({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
+  <implementation name="IM_ifgreater_booleanI_genmdl" nodedef="ND_ifgreater_booleanI" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreater_booleanI({{value1}}, {{value2}})" target="genmdl" />
 
   <!-- <ifgreatereq> -->
   <implementation name="IM_ifgreatereq_float_genmdl" nodedef="ND_ifgreatereq_float" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreatereq_float({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
@@ -630,6 +632,7 @@
   <implementation name="IM_ifgreatereq_vector4_genmdl" nodedef="ND_ifgreatereq_vector4" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreatereq_vector4({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifgreatereq_matrix33_genmdl" nodedef="ND_ifgreatereq_matrix33" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreatereq_matrix33({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifgreatereq_matrix44_genmdl" nodedef="ND_ifgreatereq_matrix44" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreatereq_matrix44({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
+  <implementation name="IM_ifgreatereq_boolean_genmdl" nodedef="ND_ifgreatereq_boolean" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreatereq_boolean({{value1}}, {{value2}})" target="genmdl" />
   <implementation name="IM_ifgreatereq_floatI_genmdl" nodedef="ND_ifgreatereq_floatI" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreatereq_floatI({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifgreatereq_integerI_genmdl" nodedef="ND_ifgreatereq_integerI" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreatereq_integerI({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifgreatereq_color3I_genmdl" nodedef="ND_ifgreatereq_color3I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreatereq_color3I({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
@@ -639,6 +642,7 @@
   <implementation name="IM_ifgreatereq_vector4I_genmdl" nodedef="ND_ifgreatereq_vector4I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreatereq_vector4I({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifgreatereq_matrix33I_genmdl" nodedef="ND_ifgreatereq_matrix33I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreatereq_matrix33I({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifgreatereq_matrix44I_genmdl" nodedef="ND_ifgreatereq_matrix44I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreatereq_matrix44I({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
+  <implementation name="IM_ifgreatereq_booleanI_genmdl" nodedef="ND_ifgreatereq_booleanI" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifgreatereq_booleanI({{value1}}, {{value2}})" target="genmdl" />
 
   <!-- <ifequal> -->
   <implementation name="IM_ifequal_float_genmdl" nodedef="ND_ifequal_float" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_float({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
@@ -650,6 +654,7 @@
   <implementation name="IM_ifequal_vector4_genmdl" nodedef="ND_ifequal_vector4" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_vector4({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifequal_matrix33_genmdl" nodedef="ND_ifequal_matrix33" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_matrix33({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifequal_matrix44_genmdl" nodedef="ND_ifequal_matrix44" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_matrix44({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
+  <implementation name="IM_ifequal_boolean4_genmdl" nodedef="ND_ifequal_boolean" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_boolean({{value1}}, {{value2}})" target="genmdl" />
   <implementation name="IM_ifequal_floatI_genmdl" nodedef="ND_ifequal_floatI" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_floatI({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifequal_integerI_genmdl" nodedef="ND_ifequal_integerI" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_integerI({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifequal_color3I_genmdl" nodedef="ND_ifequal_color3I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_color3I({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
@@ -659,6 +664,7 @@
   <implementation name="IM_ifequal_vector4I_genmdl" nodedef="ND_ifequal_vector4I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_vector4I({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifequal_matrix33I_genmdl" nodedef="ND_ifequal_matrix33I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_matrix33I({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifequal_matrix44I_genmdl" nodedef="ND_ifequal_matrix44I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_matrix44I({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
+  <implementation name="IM_ifequal_booleanI_genmdl" nodedef="ND_ifequal_booleanI" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_booleanI({{value1}}, {{value2}})" target="genmdl" />
   <implementation name="IM_ifequal_floatB_genmdl" nodedef="ND_ifequal_floatB" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_floatB({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifequal_integerB_genmdl" nodedef="ND_ifequal_integerB" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_integerB({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifequal_color3B_genmdl" nodedef="ND_ifequal_color3B" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_color3B({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
@@ -668,6 +674,7 @@
   <implementation name="IM_ifequal_vector4B_genmdl" nodedef="ND_ifequal_vector4B" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_vector4B({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifequal_matrix33B_genmdl" nodedef="ND_ifequal_matrix33B" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_matrix33B({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifequal_matrix44B_genmdl" nodedef="ND_ifequal_matrix44B" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_matrix44B({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
+  <implementation name="IM_ifequal_booleanB_genmdl" nodedef="ND_ifequal_booleanB" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_booleanB({{value1}}, {{value2}})" target="genmdl" />
 
   <!-- <switch> -->
   <!-- 'which' type : float -->
diff --git a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
index 6e5f271164..d0befd463e 100644
--- a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
+++ b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
@@ -600,6 +600,7 @@
   <implementation name="IM_ifgreater_vector4_genmsl" nodedef="ND_ifgreater_vector4" target="genmsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreater_matrix33_genmsl" nodedef="ND_ifgreater_matrix33" target="genmsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreater_matrix44_genmsl" nodedef="ND_ifgreater_matrix44" target="genmsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifgreater_boolean_genmsl" nodedef="ND_ifgreater_boolean" target="genmsl" sourcecode="({{value1}} > {{value2}}) ? true : false" />
   <implementation name="IM_ifgreater_floatI_genmsl" nodedef="ND_ifgreater_floatI" target="genmsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreater_integerI_genmsl" nodedef="ND_ifgreater_integerI" target="genmsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreater_color3I_genmsl" nodedef="ND_ifgreater_color3I" target="genmsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
@@ -609,6 +610,7 @@
   <implementation name="IM_ifgreater_vector4I_genmsl" nodedef="ND_ifgreater_vector4I" target="genmsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreater_matrix33I_genmsl" nodedef="ND_ifgreater_matrix33I" target="genmsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreater_matrix44I_genmsl" nodedef="ND_ifgreater_matrix44I" target="genmsl" sourcecode="({{value1}} > {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifgreater_booleanI_genmsl" nodedef="ND_ifgreater_booleanI" target="genmsl" sourcecode="({{value1}} > {{value2}}) ? true : false" />
 
   <!-- <ifgreatereq -->
   <implementation name="IM_ifgreatereq_float_genmsl" nodedef="ND_ifgreatereq_float" target="genmsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
@@ -620,6 +622,7 @@
   <implementation name="IM_ifgreatereq_vector4_genmsl" nodedef="ND_ifgreatereq_vector4" target="genmsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreatereq_matrix33_genmsl" nodedef="ND_ifgreatereq_matrix33" target="genmsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreatereq_matrix44_genmsl" nodedef="ND_ifgreatereq_matrix44" target="genmsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifgreatereq_boolean_genmsl" nodedef="ND_ifgreatereq_boolean" target="genmsl" sourcecode="({{value1}} >= {{value2}}) ? true : false" />
   <implementation name="IM_ifgreatereq_floatI_genmsl" nodedef="ND_ifgreatereq_floatI" target="genmsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreatereq_integerI_genmsl" nodedef="ND_ifgreatereq_integerI" target="genmsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreatereq_color3I_genmsl" nodedef="ND_ifgreatereq_color3I" target="genmsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
@@ -629,6 +632,7 @@
   <implementation name="IM_ifgreatereq_vector4I_genmsl" nodedef="ND_ifgreatereq_vector4I" target="genmsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreatereq_matrix33I_genmsl" nodedef="ND_ifgreatereq_matrix33I" target="genmsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifgreatereq_matrix44I_genmsl" nodedef="ND_ifgreatereq_matrix44I" target="genmsl" sourcecode="({{value1}} >= {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifgreatereq_booleanI_genmsl" nodedef="ND_ifgreatereq_booleanI" target="genmsl" sourcecode="({{value1}} >= {{value2}}) ? true : false" />
 
   <!-- <ifequal -->
   <implementation name="IM_ifequal_float_genmsl" nodedef="ND_ifequal_float" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
@@ -640,6 +644,7 @@
   <implementation name="IM_ifequal_vector4_genmsl" nodedef="ND_ifequal_vector4" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_matrix33_genmsl" nodedef="ND_ifequal_matrix33" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_matrix44_genmsl" nodedef="ND_ifequal_matrix44" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifequal_boolean_genmsl" nodedef="ND_ifequal_boolean" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? true : false" />
   <implementation name="IM_ifequal_floatI_genmsl" nodedef="ND_ifequal_floatI" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_integerI_genmsl" nodedef="ND_ifequal_integerI" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_color3I_genmsl" nodedef="ND_ifequal_color3I" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
@@ -649,6 +654,7 @@
   <implementation name="IM_ifequal_vector4I_genmsl" nodedef="ND_ifequal_vector4I" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_matrix33I_genmsl" nodedef="ND_ifequal_matrix33I" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_matrix44I_genmsl" nodedef="ND_ifequal_matrix44I" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifequal_booleanI_genmsl" nodedef="ND_ifequal_booleanI" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? true : false" />
   <implementation name="IM_ifequal_floatB_genmsl" nodedef="ND_ifequal_floatB" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_integerB_genmsl" nodedef="ND_ifequal_integerB" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_color3B_genmsl" nodedef="ND_ifequal_color3B" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
@@ -658,6 +664,7 @@
   <implementation name="IM_ifequal_vector4B_genmsl" nodedef="ND_ifequal_vector4B" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_matrix33B_genmsl" nodedef="ND_ifequal_matrix33B" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_matrix44B_genmsl" nodedef="ND_ifequal_matrix44B" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
+  <implementation name="IM_ifequal_booleanB_genmsl" nodedef="ND_ifequal_booleanB" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? true : false" />
 
   <!-- <switch> -->
 
diff --git a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
index fd339948d7..a1e9bf36b4 100644
--- a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
+++ b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
@@ -601,6 +601,7 @@
   <implementation name="IM_ifgreater_vector4_genosl" nodedef="ND_ifgreater_vector4" target="genosl" sourcecode="mx_ternary({{value1}} > {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifgreater_matrix33_genosl" nodedef="ND_ifgreater_matrix33" target="genosl" sourcecode="mx_ternary({{value1}} > {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifgreater_matrix44_genosl" nodedef="ND_ifgreater_matrix44" target="genosl" sourcecode="mx_ternary({{value1}} > {{value2}}, {{in1}}, {{in2}})" />
+  <implementation name="IM_ifgreater_boolean_genosl" nodedef="ND_ifgreater_boolean" target="genosl" sourcecode="mx_ternary({{value1}} > {{value2}}, 1, 0)" />
   <implementation name="IM_ifgreater_floatI_genosl" nodedef="ND_ifgreater_floatI" target="genosl" sourcecode="mx_ternary({{value1}} > {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifgreater_integerI_genosl" nodedef="ND_ifgreater_integerI" target="genosl" sourcecode="mx_ternary({{value1}} > {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifgreater_color3I_genosl" nodedef="ND_ifgreater_color3I" target="genosl" sourcecode="mx_ternary({{value1}} > {{value2}}, {{in1}}, {{in2}})" />
@@ -610,6 +611,7 @@
   <implementation name="IM_ifgreater_vector4I_genosl" nodedef="ND_ifgreater_vector4I" target="genosl" sourcecode="mx_ternary({{value1}} > {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifgreater_matrix33I_genosl" nodedef="ND_ifgreater_matrix33I" target="genosl" sourcecode="mx_ternary({{value1}} > {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifgreater_matrix44I_genosl" nodedef="ND_ifgreater_matrix44I" target="genosl" sourcecode="mx_ternary({{value1}} > {{value2}}, {{in1}}, {{in2}})" />
+  <implementation name="IM_ifgreater_booleanI_genosl" nodedef="ND_ifgreater_booleanI" target="genosl" sourcecode="mx_ternary({{value1}} > {{value2}}, 1, 0)" />
 
   <!-- <ifgreatereq> -->
   <implementation name="IM_ifgreatereq_float_genosl" nodedef="ND_ifgreatereq_float" target="genosl" sourcecode="mx_ternary({{value1}} >= {{value2}}, {{in1}}, {{in2}})" />
@@ -621,6 +623,7 @@
   <implementation name="IM_ifgreatereq_vector4_genosl" nodedef="ND_ifgreatereq_vector4" target="genosl" sourcecode="mx_ternary({{value1}} >= {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifgreatereq_matrix33_genosl" nodedef="ND_ifgreatereq_matrix33" target="genosl" sourcecode="mx_ternary({{value1}} >= {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifgreatereq_matrix44_genosl" nodedef="ND_ifgreatereq_matrix44" target="genosl" sourcecode="mx_ternary({{value1}} >= {{value2}}, {{in1}}, {{in2}})" />
+  <implementation name="IM_ifgreatereq_boolean_genosl" nodedef="ND_ifgreatereq_boolean" target="genosl" sourcecode="mx_ternary({{value1}} >= {{value2}}, 1, 0)" />
   <implementation name="IM_ifgreatereq_floatI_genosl" nodedef="ND_ifgreatereq_floatI" target="genosl" sourcecode="mx_ternary({{value1}} >= {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifgreatereq_integerI_genosl" nodedef="ND_ifgreatereq_integerI" target="genosl" sourcecode="mx_ternary({{value1}} >= {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifgreatereq_color3I_genosl" nodedef="ND_ifgreatereq_color3I" target="genosl" sourcecode="mx_ternary({{value1}} >= {{value2}}, {{in1}}, {{in2}})" />
@@ -630,6 +633,7 @@
   <implementation name="IM_ifgreatereq_vector4I_genosl" nodedef="ND_ifgreatereq_vector4I" target="genosl" sourcecode="mx_ternary({{value1}} >= {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifgreatereq_matrix33I_genosl" nodedef="ND_ifgreatereq_matrix33I" target="genosl" sourcecode="mx_ternary({{value1}} >= {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifgreatereq_matrix44I_genosl" nodedef="ND_ifgreatereq_matrix44I" target="genosl" sourcecode="mx_ternary({{value1}} >= {{value2}}, {{in1}}, {{in2}})" />
+  <implementation name="IM_ifgreatereq_booleanI_genosl" nodedef="ND_ifgreatereq_booleanI" target="genosl" sourcecode="mx_ternary({{value1}} >= {{value2}}, 1, 0)" />
 
   <!-- <ifequal> -->
   <implementation name="IM_ifequal_float_genosl" nodedef="ND_ifequal_float" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
@@ -641,6 +645,7 @@
   <implementation name="IM_ifequal_vector4_genosl" nodedef="ND_ifequal_vector4" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifequal_matrix33_genosl" nodedef="ND_ifequal_matrix33" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifequal_matrix44_genosl" nodedef="ND_ifequal_matrix44" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
+  <implementation name="IM_ifequal_boolean_genosl" nodedef="ND_ifequal_boolean" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, 1, 0)" />
   <implementation name="IM_ifequal_floatI_genosl" nodedef="ND_ifequal_floatI" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifequal_integerI_genosl" nodedef="ND_ifequal_integerI" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifequal_color3I_genosl" nodedef="ND_ifequal_color3I" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
@@ -650,6 +655,7 @@
   <implementation name="IM_ifequal_vector4I_genosl" nodedef="ND_ifequal_vector4I" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifequal_matrix33I_genosl" nodedef="ND_ifequal_matrix33I" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifequal_matrix44I_genosl" nodedef="ND_ifequal_matrix44I" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
+  <implementation name="IM_ifequal_booleanI_genosl" nodedef="ND_ifequal_booleanI" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, 1, 0)" />
   <implementation name="IM_ifequal_floatB_genosl" nodedef="ND_ifequal_floatB" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifequal_integerB_genosl" nodedef="ND_ifequal_integerB" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifequal_color3B_genosl" nodedef="ND_ifequal_color3B" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
@@ -659,6 +665,7 @@
   <implementation name="IM_ifequal_vector4B_genosl" nodedef="ND_ifequal_vector4B" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifequal_matrix33B_genosl" nodedef="ND_ifequal_matrix33B" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifequal_matrix44B_genosl" nodedef="ND_ifequal_matrix44B" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
+  <implementation name="IM_ifequal_booleanB_genosl" nodedef="ND_ifequal_booleanB" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, 1, 0)" />
 
   <!-- <switch> -->
   <!-- 'which' type : float -->
diff --git a/libraries/stdlib/stdlib_defs.mtlx b/libraries/stdlib/stdlib_defs.mtlx
index 9b7a244cb9..3432892a0c 100644
--- a/libraries/stdlib/stdlib_defs.mtlx
+++ b/libraries/stdlib/stdlib_defs.mtlx
@@ -3691,6 +3691,11 @@
     <input name="in2" type="matrix44" value="0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0" />
     <output name="out" type="matrix44" defaultinput="in1" />
   </nodedef>
+  <nodedef name="ND_ifgreater_boolean" node="ifgreater" nodegroup="conditional">
+    <input name="value1" type="float" value="1.0" />
+    <input name="value2" type="float" value="0.0" />
+    <output name="out" type="boolean" default="false" />
+  </nodedef>
   <nodedef name="ND_ifgreater_floatI" node="ifgreater" nodegroup="conditional">
     <input name="value1" type="integer" value="1" />
     <input name="value2" type="integer" value="0" />
@@ -3754,6 +3759,11 @@
     <input name="in2" type="matrix44" value="0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0" />
     <output name="out" type="matrix44" defaultinput="in1" />
   </nodedef>
+  <nodedef name="ND_ifgreater_booleanI" node="ifgreater" nodegroup="conditional">
+    <input name="value1" type="integer" value="1" />
+    <input name="value2" type="integer" value="0" />
+   <output name="out" type="boolean" default="false" />
+  </nodedef>
 
   <!--
     Node: <ifgreatereq>
@@ -3822,6 +3832,11 @@
     <input name="in2" type="matrix44" value="0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0" />
     <output name="out" type="matrix44" defaultinput="in1" />
   </nodedef>
+  <nodedef name="ND_ifgreatereq_boolean" node="ifgreatereq" nodegroup="conditional">
+    <input name="value1" type="float" value="1.0" />
+    <input name="value2" type="float" value="0.0" />
+    <output name="out" type="boolean" default="false" />
+  </nodedef>
   <nodedef name="ND_ifgreatereq_floatI" node="ifgreatereq" nodegroup="conditional">
     <input name="value1" type="integer" value="1" />
     <input name="value2" type="integer" value="0" />
@@ -3885,6 +3900,11 @@
     <input name="in2" type="matrix44" value="0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0" />
     <output name="out" type="matrix44" defaultinput="in1" />
   </nodedef>
+  <nodedef name="ND_ifgreatereq_booleanI" node="ifgreatereq" nodegroup="conditional">
+    <input name="value1" type="integer" value="1" />
+    <input name="value2" type="integer" value="0" />
+   <output name="out" type="boolean" default="false" />
+  </nodedef>
 
   <!--
     Node: <ifequal>
@@ -3953,6 +3973,11 @@
     <input name="in2" type="matrix44" value="0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0" />
     <output name="out" type="matrix44" defaultinput="in1" />
   </nodedef>
+  <nodedef name="ND_ifequal_boolean" node="ifequal" nodegroup="conditional">
+    <input name="value1" type="float" value="1.0" />
+    <input name="value2" type="float" value="0.0" />
+    <output name="out" type="boolean" default="false" />
+  </nodedef>
   <nodedef name="ND_ifequal_floatI" node="ifequal" nodegroup="conditional">
     <input name="value1" type="integer" value="0" />
     <input name="value2" type="integer" value="0" />
@@ -4016,6 +4041,11 @@
     <input name="in2" type="matrix44" value="0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0" />
     <output name="out" type="matrix44" defaultinput="in1" />
   </nodedef>
+  <nodedef name="ND_ifequal_booleanI" node="ifequal" nodegroup="conditional">
+    <input name="value1" type="integer" value="1" />
+    <input name="value2" type="integer" value="0" />
+   <output name="out" type="boolean" default="false" />
+  </nodedef>
   <nodedef name="ND_ifequal_floatB" node="ifequal" nodegroup="conditional">
     <input name="value1" type="boolean" value="false" />
     <input name="value2" type="boolean" value="false" />
@@ -4079,6 +4109,11 @@
     <input name="in2" type="matrix44" value="0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0" />
     <output name="out" type="matrix44" defaultinput="in1" />
   </nodedef>
+  <nodedef name="ND_ifequal_booleanB" node="ifequal" nodegroup="conditional">
+    <input name="value1" type="boolean" value="false" />
+    <input name="value2" type="boolean" value="false" />
+   <output name="out" type="boolean" default="false" />
+  </nodedef>
 
   <!--
     Node: <switch>
diff --git a/resources/Materials/TestSuite/stdlib/conditional/conditional_if_float.mtlx b/resources/Materials/TestSuite/stdlib/conditional/conditional_if_float.mtlx
index ce184b05ea..1cacea0be8 100644
--- a/resources/Materials/TestSuite/stdlib/conditional/conditional_if_float.mtlx
+++ b/resources/Materials/TestSuite/stdlib/conditional/conditional_if_float.mtlx
@@ -85,6 +85,13 @@
     </ifgreater>
     <output name="out" type="matrix44" nodename="ifgreater1" />
   </nodegraph>
+  <nodegraph name="ifgreater_boolean">
+    <ifgreater name="ifgreater1" type="boolean">
+      <input name="value1" type="float" value="0.8000" />
+      <input name="value2" type="float" value="0.6000" />
+    </ifgreater>
+    <output name="out" type="boolean" nodename="ifgreater1" />
+  </nodegraph>
   <nodegraph name="ifequal_float">
     <ifequal name="ifequal1" type="float">
       <input name="value1" type="float" value="0.8000" />
@@ -166,6 +173,13 @@
     </ifequal>
     <output name="out" type="matrix44" nodename="ifequal1" />
   </nodegraph>
+  <nodegraph name="ifequal_boolean">
+    <ifequal name="ifequal1" type="boolean">
+      <input name="value1" type="float" value="0.8000" />
+      <input name="value2" type="float" value="0.6000" />
+    </ifequal>
+    <output name="out" type="boolean" nodename="ifequal1" />
+  </nodegraph>
   <nodegraph name="ifgreatereq_float">
     <ifgreatereq name="ifgreatereq1" type="float">
       <input name="value1" type="float" value="0.8000" />
@@ -247,4 +261,11 @@
     </ifgreatereq>
     <output name="out" type="matrix44" nodename="ifgreatereq1" />
   </nodegraph>
+  <nodegraph name="ifgreatereq_boolean">
+    <ifgreatereq name="ifgreatereq1" type="boolean">
+      <input name="value1" type="float" value="0.8000" />
+      <input name="value2" type="float" value="0.6000" />
+    </ifgreatereq>
+    <output name="out" type="boolean" nodename="ifgreatereq1" />
+  </nodegraph>
 </materialx>
diff --git a/resources/Materials/TestSuite/stdlib/conditional/conditional_if_int.mtlx b/resources/Materials/TestSuite/stdlib/conditional/conditional_if_int.mtlx
index 0bfccb959f..1fdd8cb7b8 100644
--- a/resources/Materials/TestSuite/stdlib/conditional/conditional_if_int.mtlx
+++ b/resources/Materials/TestSuite/stdlib/conditional/conditional_if_int.mtlx
@@ -87,6 +87,13 @@
     </ifgreater>
     <output name="out" type="matrix44" nodename="ifgreater1" />
   </nodegraph>
+  <nodegraph name="ifgreater_boolean">
+    <ifgreater name="ifgreater1" type="boolean">
+      <input name="value1" type="integer" value="8" />
+      <input name="value2" type="integer" value="6" />
+    </ifgreater>
+    <output name="out" type="boolean" nodename="ifgreater1" />
+  </nodegraph>
 
   <!-- equal int condition -->
   <nodegraph name="ifequal_float">
@@ -170,6 +177,13 @@
     </ifequal>
     <output name="out" type="matrix44" nodename="ifequal1" />
   </nodegraph>
+  <nodegraph name="ifequal_boolean">
+    <ifequal name="ifequal1" type="boolean">
+      <input name="value1" type="integer" value="8" />
+      <input name="value2" type="integer" value="6" />
+    </ifequal>
+    <output name="out" type="boolean" nodename="ifequal1" />
+  </nodegraph>
 
   <!-- equal boolean condition -->
   <nodegraph name="ifequalB_float">
@@ -253,6 +267,13 @@
     </ifequal>
     <output name="out" type="matrix44" nodename="ifequal1" />
   </nodegraph>
+  <nodegraph name="ifequalB_boolean">
+    <ifequal name="ifequal1" type="boolean">
+      <input name="value1" type="boolean" value="true" />
+      <input name="value2" type="boolean" value="true" />
+    </ifequal>
+    <output name="out" type="boolean" nodename="ifequal1" />
+  </nodegraph>
 
   <!-- greatereq int condition -->
   <nodegraph name="ifgreatereq_float">
@@ -336,4 +357,11 @@
     </ifgreatereq>
     <output name="out" type="matrix44" nodename="ifgreatereq1" />
   </nodegraph>
+  <nodegraph name="ifgreatereq_boolean">
+    <ifgreatereq name="ifgreatereq1" type="boolean">
+      <input name="value1" type="integer" value="8" />
+      <input name="value2" type="integer" value="6" />
+    </ifgreatereq>
+    <output name="out" type="boolean" nodename="ifgreatereq1" />
+  </nodegraph>
 </materialx>
diff --git a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
index 90fc10a4ba..2187d35971 100644
--- a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
+++ b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
@@ -3204,6 +3204,17 @@ export float4x4 mx_ifgreater_matrix44(
 	if (mxp_value1 > mxp_value2) { return mxp_in1; } return mxp_in2;
 }
 
+export bool mx_ifgreater_boolean(
+	float mxp_value1 = float(1.0),
+	float mxp_value2 = float(0.0)
+)
+	[[
+		anno::description("Node Group: conditional")
+	]]
+{
+	if (mxp_value1 > mxp_value2) { return true; } return false;
+}
+
 export float mx_ifgreater_floatI(
 	int mxp_value1 = int(1),
 	int mxp_value2 = int(0),
@@ -3321,6 +3332,17 @@ export float4x4 mx_ifgreater_matrix44I(
 	if (mxp_value1 > mxp_value2) { return mxp_in1; } return mxp_in2;
 }
 
+export bool mx_ifgreater_booleanI(
+	int mxp_value1 = int(1),
+	int mxp_value2 = int(0)
+)
+	[[
+		anno::description("Node Group: conditional")
+	]]
+{
+	if (mxp_value1 > mxp_value2) { return true; } return false;
+}
+
 export float mx_ifgreatereq_float(
 	float mxp_value1 = float(1.0),
 	float mxp_value2 = float(0.0),
@@ -3438,6 +3460,17 @@ export float4x4 mx_ifgreatereq_matrix44(
 	if (mxp_value1 >= mxp_value2) { return mxp_in1; } return mxp_in2;
 }
 
+export bool mx_ifgreatereq_boolean(
+	float mxp_value1 = float(1.0),
+	float mxp_value2 = float(0.0)
+)
+	[[
+		anno::description("Node Group: conditional")
+	]]
+{
+	if (mxp_value1 >= mxp_value2) { return true; } return false;
+}
+
 export float mx_ifgreatereq_floatI(
 	int mxp_value1 = int(1),
 	int mxp_value2 = int(0),
@@ -3555,6 +3588,17 @@ export float4x4 mx_ifgreatereq_matrix44I(
 	if (mxp_value1 >= mxp_value2) { return mxp_in1; } return mxp_in2;
 }
 
+export bool mx_ifgreatereq_booleanI(
+	int mxp_value1 = int(1),
+	int mxp_value2 = int(0)
+)
+	[[
+		anno::description("Node Group: conditional")
+	]]
+{
+	if (mxp_value1 >= mxp_value2) { return true; } return false;
+}
+
 export float mx_ifequal_float(
 	float mxp_value1 = float(0.0),
 	float mxp_value2 = float(0.0),
@@ -3672,6 +3716,17 @@ export float4x4 mx_ifequal_matrix44(
 	if (mxp_value1 == mxp_value2) { return mxp_in1; } return mxp_in2;
 }
 
+export bool mx_ifequal_float(
+	float mxp_value1 = float(0.0),
+	float mxp_value2 = float(0.0)
+)
+	[[
+		anno::description("Node Group: conditional")
+	]]
+{
+	if (mxp_value1 == mxp_value2) { return true; } return false;
+}
+
 export float mx_ifequal_floatI(
 	int mxp_value1 = int(0),
 	int mxp_value2 = int(0),
@@ -3789,6 +3844,17 @@ export float4x4 mx_ifequal_matrix44I(
 	if (mxp_value1 == mxp_value2) { return mxp_in1; } return mxp_in2;
 }
 
+export bool mx_ifequal_booleanI(
+	int mxp_value1 = int(0),
+	int mxp_value2 = int(0)
+)
+	[[
+		anno::description("Node Group: conditional")
+	]]
+{
+	if (mxp_value1 == mxp_value2) { return true; } return false;
+}
+
 export float mx_ifequal_floatB(
 	bool mxp_value1 = bool(false),
 	bool mxp_value2 = bool(false),
@@ -3906,6 +3972,17 @@ export float4x4 mx_ifequal_matrix44B(
 	if (mxp_value1 == mxp_value2) { return mxp_in1; } return mxp_in2;
 }
 
+export bool mx_ifequal_booleanB(
+	bool mxp_value1 = bool(false),
+	bool mxp_value2 = bool(false)
+)
+	[[
+		anno::description("Node Group: conditional")
+	]]
+{
+	if (mxp_value1 == mxp_value2) { return true; } return false;
+}
+
 export float mx_switch_float(
 	float mxp_in1 = float(0.0),
 	float mxp_in2 = float(0.0),

From 6a64c59c4b95d32a007215600f513e58d736bbb9 Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Sat, 8 Jun 2024 11:22:00 -0700
Subject: [PATCH 17/48] Update legacy OSL function (#1877)

This changelist updates the mx_oren_nayar_diffuse_bsdf function in the legacy OSL pathway, addressing a shader compilation issue when this option is enabled.
---
 libraries/pbrlib/genosl/legacy/mx_oren_nayar_diffuse_bsdf.osl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libraries/pbrlib/genosl/legacy/mx_oren_nayar_diffuse_bsdf.osl b/libraries/pbrlib/genosl/legacy/mx_oren_nayar_diffuse_bsdf.osl
index e9d0d99b16..b9c5fba797 100644
--- a/libraries/pbrlib/genosl/legacy/mx_oren_nayar_diffuse_bsdf.osl
+++ b/libraries/pbrlib/genosl/legacy/mx_oren_nayar_diffuse_bsdf.osl
@@ -1,4 +1,4 @@
-void mx_oren_nayar_diffuse_bsdf(float weight, color _color, float roughness, normal N, output BSDF bsdf)
+void mx_oren_nayar_diffuse_bsdf(float weight, color _color, float roughness, normal N, int energy_compensation, output BSDF bsdf)
 {
     bsdf.response = _color * weight * oren_nayar(N, roughness);
     bsdf.throughput = color(0.0);

From 2352013206ae0569d831a0e8708551a97d3c882c Mon Sep 17 00:00:00 2001
From: ld-kerley <154285602+ld-kerley@users.noreply.github.com>
Date: Sun, 9 Jun 2024 12:23:26 -0700
Subject: [PATCH 18/48] Remove Switch C++ node (#1862)

Replace with nodegraph implementation.
---
 .../stdlib/genglsl/stdlib_genglsl_impl.mtlx   |   22 -
 .../stdlib/genmdl/stdlib_genmdl_impl.mtlx     |   20 -
 .../stdlib/genmsl/stdlib_genmsl_impl.mtlx     |   22 -
 .../stdlib/genosl/stdlib_genosl_impl.mtlx     |   20 -
 libraries/stdlib/stdlib_ng.mtlx               | 1012 ++++++++++++++++-
 .../MaterialXGenGlsl/GlslShaderGenerator.cpp  |   25 -
 source/MaterialXGenMdl/MdlShaderGenerator.cpp |    1 -
 .../mdl/materialx/stdlib_1_6.mdl              |  424 -------
 .../mdl/materialx/stdlib_1_8.mdl              |   16 -
 source/MaterialXGenMsl/MslShaderGenerator.cpp |   25 -
 source/MaterialXGenOsl/OslShaderGenerator.cpp |   21 -
 .../MaterialXGenShader/Nodes/SwitchNode.cpp   |   70 --
 source/MaterialXGenShader/Nodes/SwitchNode.h  |   27 -
 13 files changed, 1011 insertions(+), 694 deletions(-)
 delete mode 100644 source/MaterialXGenShader/Nodes/SwitchNode.cpp
 delete mode 100644 source/MaterialXGenShader/Nodes/SwitchNode.h

diff --git a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
index 49e6a19c86..cd4b44d1a5 100644
--- a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
+++ b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
@@ -666,28 +666,6 @@
   <implementation name="IM_ifequal_matrix44B_genglsl" nodedef="ND_ifequal_matrix44B" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_booleanB_genglsl" nodedef="ND_ifequal_booleanB" target="genglsl" sourcecode="({{value1}} == {{value2}}) ? true : false" />
 
-  <!-- <switch> -->
-
-  <!-- 'which' type : float -->
-  <implementation name="IM_switch_float_genglsl" nodedef="ND_switch_float" target="genglsl" />
-  <implementation name="IM_switch_color3_genglsl" nodedef="ND_switch_color3" target="genglsl" />
-  <implementation name="IM_switch_color4_genglsl" nodedef="ND_switch_color4" target="genglsl" />
-  <implementation name="IM_switch_vector2_genglsl" nodedef="ND_switch_vector2" target="genglsl" />
-  <implementation name="IM_switch_vector3_genglsl" nodedef="ND_switch_vector3" target="genglsl" />
-  <implementation name="IM_switch_vector4_genglsl" nodedef="ND_switch_vector4" target="genglsl" />
-  <implementation name="IM_switch_matrix33_genglsl" nodedef="ND_switch_matrix33" target="genglsl" />
-  <implementation name="IM_switch_matrix44_genglsl" nodedef="ND_switch_matrix44" target="genglsl" />
-
-  <!-- 'which' type : integer -->
-  <implementation name="IM_switch_floatI_genglsl" nodedef="ND_switch_floatI" target="genglsl" />
-  <implementation name="IM_switch_color3I_genglsl" nodedef="ND_switch_color3I" target="genglsl" />
-  <implementation name="IM_switch_color4I_genglsl" nodedef="ND_switch_color4I" target="genglsl" />
-  <implementation name="IM_switch_vector2I_genglsl" nodedef="ND_switch_vector2I" target="genglsl" />
-  <implementation name="IM_switch_vector3I_genglsl" nodedef="ND_switch_vector3I" target="genglsl" />
-  <implementation name="IM_switch_vector4I_genglsl" nodedef="ND_switch_vector4I" target="genglsl" />
-  <implementation name="IM_switch_matrix33I_genglsl" nodedef="ND_switch_matrix33I" target="genglsl" />
-  <implementation name="IM_switch_matrix44I_genglsl" nodedef="ND_switch_matrix44I" target="genglsl" />
-
   <!-- ======================================================================== -->
   <!-- Channel nodes                                                            -->
   <!-- ======================================================================== -->
diff --git a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
index 3b332e59a1..8f168e4768 100644
--- a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
+++ b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
@@ -676,26 +676,6 @@
   <implementation name="IM_ifequal_matrix44B_genmdl" nodedef="ND_ifequal_matrix44B" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_matrix44B({{value1}}, {{value2}}, {{in1}}, {{in2}})" target="genmdl" />
   <implementation name="IM_ifequal_booleanB_genmdl" nodedef="ND_ifequal_booleanB" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_ifequal_booleanB({{value1}}, {{value2}})" target="genmdl" />
 
-  <!-- <switch> -->
-  <!-- 'which' type : float -->
-  <implementation name="IM_switch_float_genmdl" nodedef="ND_switch_float" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_float({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_color3_genmdl" nodedef="ND_switch_color3" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_color3({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_color4_genmdl" nodedef="ND_switch_color4" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_color4({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_vector2_genmdl" nodedef="ND_switch_vector2" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_vector2({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_vector3_genmdl" nodedef="ND_switch_vector3" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_vector3({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_vector4_genmdl" nodedef="ND_switch_vector4" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_vector4({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_matrix33_genmdl" nodedef="ND_switch_matrix33" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_matrix33({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_matrix44_genmdl" nodedef="ND_switch_matrix44" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_matrix44({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <!-- 'which' type : integer -->
-  <implementation name="IM_switch_floatI_genmdl" nodedef="ND_switch_floatI" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_floatI({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_color3I_genmdl" nodedef="ND_switch_color3I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_color3I({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_color4I_genmdl" nodedef="ND_switch_color4I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_color4I({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_vector2I_genmdl" nodedef="ND_switch_vector2I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_vector2I({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_vector3I_genmdl" nodedef="ND_switch_vector3I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_vector3I({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_vector4I_genmdl" nodedef="ND_switch_vector4I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_vector4I({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_matrix33I_genmdl" nodedef="ND_switch_matrix33I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_matrix33I({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-  <implementation name="IM_switch_matrix44I_genmdl" nodedef="ND_switch_matrix44I" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_switch_matrix44I({{in1}}, {{in2}}, {{in3}}, {{in4}}, {{in5}}, {{in6}}, {{in7}}, {{in8}}, {{in9}}, {{in10}}, {{which}})" target="genmdl" />
-
   <!-- ======================================================================== -->
   <!-- Channel nodes                                                            -->
   <!-- ======================================================================== -->
diff --git a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
index d0befd463e..13bb5f54b7 100644
--- a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
+++ b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
@@ -666,28 +666,6 @@
   <implementation name="IM_ifequal_matrix44B_genmsl" nodedef="ND_ifequal_matrix44B" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? {{in1}} : {{in2}}" />
   <implementation name="IM_ifequal_booleanB_genmsl" nodedef="ND_ifequal_booleanB" target="genmsl" sourcecode="({{value1}} == {{value2}}) ? true : false" />
 
-  <!-- <switch> -->
-
-  <!-- 'which' type : float -->
-  <implementation name="IM_switch_float_genmsl" nodedef="ND_switch_float" target="genmsl" />
-  <implementation name="IM_switch_color3_genmsl" nodedef="ND_switch_color3" target="genmsl" />
-  <implementation name="IM_switch_color4_genmsl" nodedef="ND_switch_color4" target="genmsl" />
-  <implementation name="IM_switch_vector2_genmsl" nodedef="ND_switch_vector2" target="genmsl" />
-  <implementation name="IM_switch_vector3_genmsl" nodedef="ND_switch_vector3" target="genmsl" />
-  <implementation name="IM_switch_vector4_genmsl" nodedef="ND_switch_vector4" target="genmsl" />
-  <implementation name="IM_switch_matrix33_genmsl" nodedef="ND_switch_matrix33" target="genmsl" />
-  <implementation name="IM_switch_matrix44_genmsl" nodedef="ND_switch_matrix44" target="genmsl" />
-
-  <!-- 'which' type : integer -->
-  <implementation name="IM_switch_floatI_genmsl" nodedef="ND_switch_floatI" target="genmsl" />
-  <implementation name="IM_switch_color3I_genmsl" nodedef="ND_switch_color3I" target="genmsl" />
-  <implementation name="IM_switch_color4I_genmsl" nodedef="ND_switch_color4I" target="genmsl" />
-  <implementation name="IM_switch_vector2I_genmsl" nodedef="ND_switch_vector2I" target="genmsl" />
-  <implementation name="IM_switch_vector3I_genmsl" nodedef="ND_switch_vector3I" target="genmsl" />
-  <implementation name="IM_switch_vector4I_genmsl" nodedef="ND_switch_vector4I" target="genmsl" />
-  <implementation name="IM_switch_matrix33I_genmsl" nodedef="ND_switch_matrix33I" target="genmsl" />
-  <implementation name="IM_switch_matrix44I_genmsl" nodedef="ND_switch_matrix44I" target="genmsl" />
-
   <!-- ======================================================================== -->
   <!-- Channel nodes                                                            -->
   <!-- ======================================================================== -->
diff --git a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
index a1e9bf36b4..0d68794430 100644
--- a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
+++ b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
@@ -667,26 +667,6 @@
   <implementation name="IM_ifequal_matrix44B_genosl" nodedef="ND_ifequal_matrix44B" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, {{in1}}, {{in2}})" />
   <implementation name="IM_ifequal_booleanB_genosl" nodedef="ND_ifequal_booleanB" target="genosl" sourcecode="mx_ternary({{value1}} == {{value2}}, 1, 0)" />
 
-  <!-- <switch> -->
-  <!-- 'which' type : float -->
-  <implementation name="IM_switch_float_genosl" nodedef="ND_switch_float" target="genosl" />
-  <implementation name="IM_switch_color3_genosl" nodedef="ND_switch_color3" target="genosl" />
-  <implementation name="IM_switch_color4_genosl" nodedef="ND_switch_color4" target="genosl" />
-  <implementation name="IM_switch_vector2_genosl" nodedef="ND_switch_vector2" target="genosl" />
-  <implementation name="IM_switch_vector3_genosl" nodedef="ND_switch_vector3" target="genosl" />
-  <implementation name="IM_switch_vector4_genosl" nodedef="ND_switch_vector4" target="genosl" />
-  <implementation name="IM_switch_matrix33_genosl" nodedef="ND_switch_matrix33" target="genosl" />
-  <implementation name="IM_switch_matrix44_genosl" nodedef="ND_switch_matrix44" target="genosl" />
-  <!-- 'which' type : integer -->
-  <implementation name="IM_switch_floatI_genosl" nodedef="ND_switch_floatI" target="genosl" />
-  <implementation name="IM_switch_color3I_genosl" nodedef="ND_switch_color3I" target="genosl" />
-  <implementation name="IM_switch_color4I_genosl" nodedef="ND_switch_color4I" target="genosl" />
-  <implementation name="IM_switch_vector2I_genosl" nodedef="ND_switch_vector2I" target="genosl" />
-  <implementation name="IM_switch_vector3I_genosl" nodedef="ND_switch_vector3I" target="genosl" />
-  <implementation name="IM_switch_vector4I_genosl" nodedef="ND_switch_vector4I" target="genosl" />
-  <implementation name="IM_switch_matrix33I_genosl" nodedef="ND_switch_matrix33I" target="genosl" />
-  <implementation name="IM_switch_matrix44I_genosl" nodedef="ND_switch_matrix44I" target="genosl" />
-
   <!-- ======================================================================== -->
   <!-- Channel nodes                                                            -->
   <!-- ======================================================================== -->
diff --git a/libraries/stdlib/stdlib_ng.mtlx b/libraries/stdlib/stdlib_ng.mtlx
index fcb1a4aacf..6724a28e03 100644
--- a/libraries/stdlib/stdlib_ng.mtlx
+++ b/libraries/stdlib/stdlib_ng.mtlx
@@ -4242,7 +4242,1017 @@
   </nodegraph>
 
   <!-- ======================================================================== -->
-  <!-- Convolution nodes                                                        -->
+  <!-- Switch nodes                                                             -->
   <!-- ======================================================================== -->
 
+  <nodegraph name="NG_switch_float" nodedef="ND_switch_float">
+    <ifgreater name="ifgreater_10" type="float">
+      <input name="value1" type="float" value="10.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="float" interfacename="in10" />
+      <input name="in2" type="float" value="0.0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="float">
+      <input name="value1" type="float" value="9.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="float" interfacename="in9" />
+      <input name="in2" type="float" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="float">
+      <input name="value1" type="float" value="8.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="float" interfacename="in8" />
+      <input name="in2" type="float" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="float">
+      <input name="value1" type="float" value="7.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="float" interfacename="in7" />
+      <input name="in2" type="float" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="float">
+      <input name="value1" type="float" value="6.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="float" interfacename="in6" />
+      <input name="in2" type="float" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="float">
+      <input name="value1" type="float" value="5.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="float" interfacename="in5" />
+      <input name="in2" type="float" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="float">
+      <input name="value1" type="float" value="4.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="float" interfacename="in4" />
+      <input name="in2" type="float" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="float">
+      <input name="value1" type="float" value="3.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="float" interfacename="in3" />
+      <input name="in2" type="float" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="float">
+      <input name="value1" type="float" value="2.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="float" interfacename="in2" />
+      <input name="in2" type="float" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="float">
+      <input name="value1" type="float" value="1.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="float" interfacename="in1" />
+      <input name="in2" type="float" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="float" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_color3" nodedef="ND_switch_color3">
+    <ifgreater name="ifgreater_10" type="color3">
+      <input name="value1" type="float" value="10.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in10" />
+      <input name="in2" type="color3" value="0,0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="color3">
+      <input name="value1" type="float" value="9.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in9" />
+      <input name="in2" type="color3" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="color3">
+      <input name="value1" type="float" value="8.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in8" />
+      <input name="in2" type="color3" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="color3">
+      <input name="value1" type="float" value="7.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in7" />
+      <input name="in2" type="color3" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="color3">
+      <input name="value1" type="float" value="6.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in6" />
+      <input name="in2" type="color3" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="color3">
+      <input name="value1" type="float" value="5.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in5" />
+      <input name="in2" type="color3" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="color3">
+      <input name="value1" type="float" value="4.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in4" />
+      <input name="in2" type="color3" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="color3">
+      <input name="value1" type="float" value="3.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in3" />
+      <input name="in2" type="color3" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="color3">
+      <input name="value1" type="float" value="2.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in2" />
+      <input name="in2" type="color3" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="color3">
+      <input name="value1" type="float" value="1.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in1" />
+      <input name="in2" type="color3" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="color3" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_color4" nodedef="ND_switch_color4">
+    <ifgreater name="ifgreater_10" type="color4">
+      <input name="value1" type="float" value="10.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in10" />
+      <input name="in2" type="color4" value="0,0,0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="color4">
+      <input name="value1" type="float" value="9.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in9" />
+      <input name="in2" type="color4" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="color4">
+      <input name="value1" type="float" value="8.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in8" />
+      <input name="in2" type="color4" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="color4">
+      <input name="value1" type="float" value="7.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in7" />
+      <input name="in2" type="color4" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="color4">
+      <input name="value1" type="float" value="6.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in6" />
+      <input name="in2" type="color4" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="color4">
+      <input name="value1" type="float" value="5.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in5" />
+      <input name="in2" type="color4" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="color4">
+      <input name="value1" type="float" value="4.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in4" />
+      <input name="in2" type="color4" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="color4">
+      <input name="value1" type="float" value="3.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in3" />
+      <input name="in2" type="color4" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="color4">
+      <input name="value1" type="float" value="2.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in2" />
+      <input name="in2" type="color4" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="color4">
+      <input name="value1" type="float" value="1.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in1" />
+      <input name="in2" type="color4" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="color4" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_vector2" nodedef="ND_switch_vector2">
+    <ifgreater name="ifgreater_10" type="vector2">
+      <input name="value1" type="float" value="10.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in10" />
+      <input name="in2" type="vector2" value="0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="vector2">
+      <input name="value1" type="float" value="9.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in9" />
+      <input name="in2" type="vector2" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="vector2">
+      <input name="value1" type="float" value="8.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in8" />
+      <input name="in2" type="vector2" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="vector2">
+      <input name="value1" type="float" value="7.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in7" />
+      <input name="in2" type="vector2" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="vector2">
+      <input name="value1" type="float" value="6.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in6" />
+      <input name="in2" type="vector2" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="vector2">
+      <input name="value1" type="float" value="5.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in5" />
+      <input name="in2" type="vector2" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="vector2">
+      <input name="value1" type="float" value="4.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in4" />
+      <input name="in2" type="vector2" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="vector2">
+      <input name="value1" type="float" value="3.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in3" />
+      <input name="in2" type="vector2" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="vector2">
+      <input name="value1" type="float" value="2.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in2" />
+      <input name="in2" type="vector2" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="vector2">
+      <input name="value1" type="float" value="1.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in1" />
+      <input name="in2" type="vector2" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="vector2" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_vector3" nodedef="ND_switch_vector3">
+    <ifgreater name="ifgreater_10" type="vector3">
+      <input name="value1" type="float" value="10.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in10" />
+      <input name="in2" type="vector3" value="0,0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="vector3">
+      <input name="value1" type="float" value="9.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in9" />
+      <input name="in2" type="vector3" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="vector3">
+      <input name="value1" type="float" value="8.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in8" />
+      <input name="in2" type="vector3" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="vector3">
+      <input name="value1" type="float" value="7.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in7" />
+      <input name="in2" type="vector3" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="vector3">
+      <input name="value1" type="float" value="6.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in6" />
+      <input name="in2" type="vector3" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="vector3">
+      <input name="value1" type="float" value="5.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in5" />
+      <input name="in2" type="vector3" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="vector3">
+      <input name="value1" type="float" value="4.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in4" />
+      <input name="in2" type="vector3" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="vector3">
+      <input name="value1" type="float" value="3.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in3" />
+      <input name="in2" type="vector3" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="vector3">
+      <input name="value1" type="float" value="2.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in2" />
+      <input name="in2" type="vector3" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="vector3">
+      <input name="value1" type="float" value="1.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in1" />
+      <input name="in2" type="vector3" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="vector3" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_vector4" nodedef="ND_switch_vector4">
+    <ifgreater name="ifgreater_10" type="vector4">
+      <input name="value1" type="float" value="10.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in10" />
+      <input name="in2" type="vector4" value="0,0,0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="vector4">
+      <input name="value1" type="float" value="9.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in9" />
+      <input name="in2" type="vector4" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="vector4">
+      <input name="value1" type="float" value="8.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in8" />
+      <input name="in2" type="vector4" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="vector4">
+      <input name="value1" type="float" value="7.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in7" />
+      <input name="in2" type="vector4" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="vector4">
+      <input name="value1" type="float" value="6.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in6" />
+      <input name="in2" type="vector4" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="vector4">
+      <input name="value1" type="float" value="5.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in5" />
+      <input name="in2" type="vector4" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="vector4">
+      <input name="value1" type="float" value="4.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in4" />
+      <input name="in2" type="vector4" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="vector4">
+      <input name="value1" type="float" value="3.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in3" />
+      <input name="in2" type="vector4" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="vector4">
+      <input name="value1" type="float" value="2.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in2" />
+      <input name="in2" type="vector4" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="vector4">
+      <input name="value1" type="float" value="1.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in1" />
+      <input name="in2" type="vector4" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="vector4" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_matrix33" nodedef="ND_switch_matrix33">
+    <ifgreater name="ifgreater_10" type="matrix33">
+      <input name="value1" type="float" value="10.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in10" />
+      <input name="in2" type="matrix33" value="0,0,0,0,0,0,0,0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="matrix33">
+      <input name="value1" type="float" value="9.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in9" />
+      <input name="in2" type="matrix33" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="matrix33">
+      <input name="value1" type="float" value="8.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in8" />
+      <input name="in2" type="matrix33" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="matrix33">
+      <input name="value1" type="float" value="7.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in7" />
+      <input name="in2" type="matrix33" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="matrix33">
+      <input name="value1" type="float" value="6.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in6" />
+      <input name="in2" type="matrix33" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="matrix33">
+      <input name="value1" type="float" value="5.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in5" />
+      <input name="in2" type="matrix33" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="matrix33">
+      <input name="value1" type="float" value="4.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in4" />
+      <input name="in2" type="matrix33" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="matrix33">
+      <input name="value1" type="float" value="3.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in3" />
+      <input name="in2" type="matrix33" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="matrix33">
+      <input name="value1" type="float" value="2.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in2" />
+      <input name="in2" type="matrix33" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="matrix33">
+      <input name="value1" type="float" value="1.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in1" />
+      <input name="in2" type="matrix33" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="matrix33" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_matrix44" nodedef="ND_switch_matrix44">
+    <ifgreater name="ifgreater_10" type="matrix44">
+      <input name="value1" type="float" value="10.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in10" />
+      <input name="in2" type="matrix44" value="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="matrix44">
+      <input name="value1" type="float" value="9.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in9" />
+      <input name="in2" type="matrix44" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="matrix44">
+      <input name="value1" type="float" value="8.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in8" />
+      <input name="in2" type="matrix44" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="matrix44">
+      <input name="value1" type="float" value="7.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in7" />
+      <input name="in2" type="matrix44" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="matrix44">
+      <input name="value1" type="float" value="6.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in6" />
+      <input name="in2" type="matrix44" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="matrix44">
+      <input name="value1" type="float" value="5.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in5" />
+      <input name="in2" type="matrix44" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="matrix44">
+      <input name="value1" type="float" value="4.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in4" />
+      <input name="in2" type="matrix44" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="matrix44">
+      <input name="value1" type="float" value="3.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in3" />
+      <input name="in2" type="matrix44" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="matrix44">
+      <input name="value1" type="float" value="2.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in2" />
+      <input name="in2" type="matrix44" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="matrix44">
+      <input name="value1" type="float" value="1.0" />
+      <input name="value2" type="float" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in1" />
+      <input name="in2" type="matrix44" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="matrix44" nodename="ifgreater_1" />
+  </nodegraph>
+
+  <nodegraph name="NG_switch_floatI" nodedef="ND_switch_floatI">
+    <ifgreater name="ifgreater_10" type="float">
+      <input name="value1" type="integer" value="10" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="float" interfacename="in10" />
+      <input name="in2" type="float" value="0.0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="float">
+      <input name="value1" type="integer" value="9" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="float" interfacename="in9" />
+      <input name="in2" type="float" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="float">
+      <input name="value1" type="integer" value="8" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="float" interfacename="in8" />
+      <input name="in2" type="float" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="float">
+      <input name="value1" type="integer" value="7" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="float" interfacename="in7" />
+      <input name="in2" type="float" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="float">
+      <input name="value1" type="integer" value="6" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="float" interfacename="in6" />
+      <input name="in2" type="float" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="float">
+      <input name="value1" type="integer" value="5" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="float" interfacename="in5" />
+      <input name="in2" type="float" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="float">
+      <input name="value1" type="integer" value="4" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="float" interfacename="in4" />
+      <input name="in2" type="float" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="float">
+      <input name="value1" type="integer" value="3" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="float" interfacename="in3" />
+      <input name="in2" type="float" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="float">
+      <input name="value1" type="integer" value="2" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="float" interfacename="in2" />
+      <input name="in2" type="float" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="float">
+      <input name="value1" type="integer" value="1" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="float" interfacename="in1" />
+      <input name="in2" type="float" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="float" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_color3I" nodedef="ND_switch_color3I">
+    <ifgreater name="ifgreater_10" type="color3">
+      <input name="value1" type="integer" value="10" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in10" />
+      <input name="in2" type="color3" value="0,0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="color3">
+      <input name="value1" type="integer" value="9" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in9" />
+      <input name="in2" type="color3" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="color3">
+      <input name="value1" type="integer" value="8" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in8" />
+      <input name="in2" type="color3" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="color3">
+      <input name="value1" type="integer" value="7" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in7" />
+      <input name="in2" type="color3" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="color3">
+      <input name="value1" type="integer" value="6" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in6" />
+      <input name="in2" type="color3" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="color3">
+      <input name="value1" type="integer" value="5" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in5" />
+      <input name="in2" type="color3" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="color3">
+      <input name="value1" type="integer" value="4" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in4" />
+      <input name="in2" type="color3" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="color3">
+      <input name="value1" type="integer" value="3" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in3" />
+      <input name="in2" type="color3" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="color3">
+      <input name="value1" type="integer" value="2" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in2" />
+      <input name="in2" type="color3" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="color3">
+      <input name="value1" type="integer" value="1" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color3" interfacename="in1" />
+      <input name="in2" type="color3" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="color3" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_color4I" nodedef="ND_switch_color4I">
+    <ifgreater name="ifgreater_10" type="color4">
+      <input name="value1" type="integer" value="10" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in10" />
+      <input name="in2" type="color4" value="0,0,0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="color4">
+      <input name="value1" type="integer" value="9" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in9" />
+      <input name="in2" type="color4" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="color4">
+      <input name="value1" type="integer" value="8" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in8" />
+      <input name="in2" type="color4" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="color4">
+      <input name="value1" type="integer" value="7" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in7" />
+      <input name="in2" type="color4" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="color4">
+      <input name="value1" type="integer" value="6" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in6" />
+      <input name="in2" type="color4" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="color4">
+      <input name="value1" type="integer" value="5" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in5" />
+      <input name="in2" type="color4" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="color4">
+      <input name="value1" type="integer" value="4" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in4" />
+      <input name="in2" type="color4" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="color4">
+      <input name="value1" type="integer" value="3" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in3" />
+      <input name="in2" type="color4" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="color4">
+      <input name="value1" type="integer" value="2" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in2" />
+      <input name="in2" type="color4" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="color4">
+      <input name="value1" type="integer" value="1" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="color4" interfacename="in1" />
+      <input name="in2" type="color4" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="color4" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_vector2I" nodedef="ND_switch_vector2I">
+    <ifgreater name="ifgreater_10" type="vector2">
+      <input name="value1" type="integer" value="10" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in10" />
+      <input name="in2" type="vector2" value="0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="vector2">
+      <input name="value1" type="integer" value="9" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in9" />
+      <input name="in2" type="vector2" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="vector2">
+      <input name="value1" type="integer" value="8" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in8" />
+      <input name="in2" type="vector2" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="vector2">
+      <input name="value1" type="integer" value="7" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in7" />
+      <input name="in2" type="vector2" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="vector2">
+      <input name="value1" type="integer" value="6" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in6" />
+      <input name="in2" type="vector2" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="vector2">
+      <input name="value1" type="integer" value="5" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in5" />
+      <input name="in2" type="vector2" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="vector2">
+      <input name="value1" type="integer" value="4" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in4" />
+      <input name="in2" type="vector2" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="vector2">
+      <input name="value1" type="integer" value="3" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in3" />
+      <input name="in2" type="vector2" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="vector2">
+      <input name="value1" type="integer" value="2" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in2" />
+      <input name="in2" type="vector2" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="vector2">
+      <input name="value1" type="integer" value="1" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector2" interfacename="in1" />
+      <input name="in2" type="vector2" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="vector2" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_vector3I" nodedef="ND_switch_vector3I">
+    <ifgreater name="ifgreater_10" type="vector3">
+      <input name="value1" type="integer" value="10" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in10" />
+      <input name="in2" type="vector3" value="0,0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="vector3">
+      <input name="value1" type="integer" value="9" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in9" />
+      <input name="in2" type="vector3" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="vector3">
+      <input name="value1" type="integer" value="8" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in8" />
+      <input name="in2" type="vector3" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="vector3">
+      <input name="value1" type="integer" value="7" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in7" />
+      <input name="in2" type="vector3" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="vector3">
+      <input name="value1" type="integer" value="6" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in6" />
+      <input name="in2" type="vector3" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="vector3">
+      <input name="value1" type="integer" value="5" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in5" />
+      <input name="in2" type="vector3" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="vector3">
+      <input name="value1" type="integer" value="4" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in4" />
+      <input name="in2" type="vector3" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="vector3">
+      <input name="value1" type="integer" value="3" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in3" />
+      <input name="in2" type="vector3" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="vector3">
+      <input name="value1" type="integer" value="2" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in2" />
+      <input name="in2" type="vector3" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="vector3">
+      <input name="value1" type="integer" value="1" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector3" interfacename="in1" />
+      <input name="in2" type="vector3" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="vector3" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_vector4I" nodedef="ND_switch_vector4I">
+    <ifgreater name="ifgreater_10" type="vector4">
+      <input name="value1" type="integer" value="10" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in10" />
+      <input name="in2" type="vector4" value="0,0,0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="vector4">
+      <input name="value1" type="integer" value="9" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in9" />
+      <input name="in2" type="vector4" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="vector4">
+      <input name="value1" type="integer" value="8" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in8" />
+      <input name="in2" type="vector4" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="vector4">
+      <input name="value1" type="integer" value="7" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in7" />
+      <input name="in2" type="vector4" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="vector4">
+      <input name="value1" type="integer" value="6" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in6" />
+      <input name="in2" type="vector4" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="vector4">
+      <input name="value1" type="integer" value="5" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in5" />
+      <input name="in2" type="vector4" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="vector4">
+      <input name="value1" type="integer" value="4" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in4" />
+      <input name="in2" type="vector4" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="vector4">
+      <input name="value1" type="integer" value="3" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in3" />
+      <input name="in2" type="vector4" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="vector4">
+      <input name="value1" type="integer" value="2" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in2" />
+      <input name="in2" type="vector4" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="vector4">
+      <input name="value1" type="integer" value="1" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="vector4" interfacename="in1" />
+      <input name="in2" type="vector4" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="vector4" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_matrix33I" nodedef="ND_switch_matrix33I">
+    <ifgreater name="ifgreater_10" type="matrix33">
+      <input name="value1" type="integer" value="10" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in10" />
+      <input name="in2" type="matrix33" value="0,0,0,0,0,0,0,0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="matrix33">
+      <input name="value1" type="integer" value="9" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in9" />
+      <input name="in2" type="matrix33" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="matrix33">
+      <input name="value1" type="integer" value="8" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in8" />
+      <input name="in2" type="matrix33" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="matrix33">
+      <input name="value1" type="integer" value="7" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in7" />
+      <input name="in2" type="matrix33" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="matrix33">
+      <input name="value1" type="integer" value="6" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in6" />
+      <input name="in2" type="matrix33" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="matrix33">
+      <input name="value1" type="integer" value="5" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in5" />
+      <input name="in2" type="matrix33" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="matrix33">
+      <input name="value1" type="integer" value="4" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in4" />
+      <input name="in2" type="matrix33" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="matrix33">
+      <input name="value1" type="integer" value="3" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in3" />
+      <input name="in2" type="matrix33" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="matrix33">
+      <input name="value1" type="integer" value="2" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in2" />
+      <input name="in2" type="matrix33" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="matrix33">
+      <input name="value1" type="integer" value="1" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix33" interfacename="in1" />
+      <input name="in2" type="matrix33" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="matrix33" nodename="ifgreater_1" />
+  </nodegraph>
+  <nodegraph name="NG_switch_matrix44I" nodedef="ND_switch_matrix44I">
+    <ifgreater name="ifgreater_10" type="matrix44">
+      <input name="value1" type="integer" value="10" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in10" />
+      <input name="in2" type="matrix44" value="0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" />
+    </ifgreater>
+    <ifgreater name="ifgreater_9" type="matrix44">
+      <input name="value1" type="integer" value="9" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in9" />
+      <input name="in2" type="matrix44" nodename="ifgreater_10" />
+    </ifgreater>
+    <ifgreater name="ifgreater_8" type="matrix44">
+      <input name="value1" type="integer" value="8" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in8" />
+      <input name="in2" type="matrix44" nodename="ifgreater_9" />
+    </ifgreater>
+    <ifgreater name="ifgreater_7" type="matrix44">
+      <input name="value1" type="integer" value="7" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in7" />
+      <input name="in2" type="matrix44" nodename="ifgreater_8" />
+    </ifgreater>
+    <ifgreater name="ifgreater_6" type="matrix44">
+      <input name="value1" type="integer" value="6" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in6" />
+      <input name="in2" type="matrix44" nodename="ifgreater_7" />
+    </ifgreater>
+    <ifgreater name="ifgreater_5" type="matrix44">
+      <input name="value1" type="integer" value="5" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in5" />
+      <input name="in2" type="matrix44" nodename="ifgreater_6" />
+    </ifgreater>
+    <ifgreater name="ifgreater_4" type="matrix44">
+      <input name="value1" type="integer" value="4" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in4" />
+      <input name="in2" type="matrix44" nodename="ifgreater_5" />
+    </ifgreater>
+    <ifgreater name="ifgreater_3" type="matrix44">
+      <input name="value1" type="integer" value="3" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in3" />
+      <input name="in2" type="matrix44" nodename="ifgreater_4" />
+    </ifgreater>
+    <ifgreater name="ifgreater_2" type="matrix44">
+      <input name="value1" type="integer" value="2" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in2" />
+      <input name="in2" type="matrix44" nodename="ifgreater_3" />
+    </ifgreater>
+    <ifgreater name="ifgreater_1" type="matrix44">
+      <input name="value1" type="integer" value="1" />
+      <input name="value2" type="integer" interfacename="which" />
+      <input name="in1" type="matrix44" interfacename="in1" />
+      <input name="in2" type="matrix44" nodename="ifgreater_2" />
+    </ifgreater>
+    <output name="out" type="matrix44" nodename="ifgreater_1" />
+  </nodegraph>
+
 </materialx>
diff --git a/source/MaterialXGenGlsl/GlslShaderGenerator.cpp b/source/MaterialXGenGlsl/GlslShaderGenerator.cpp
index e114b4fe2a..8258225529 100644
--- a/source/MaterialXGenGlsl/GlslShaderGenerator.cpp
+++ b/source/MaterialXGenGlsl/GlslShaderGenerator.cpp
@@ -19,7 +19,6 @@
 #include <MaterialXGenGlsl/Nodes/BlurNodeGlsl.h>
 
 #include <MaterialXGenShader/Nodes/MaterialNode.h>
-#include <MaterialXGenShader/Nodes/SwitchNode.h>
 #include <MaterialXGenShader/Nodes/HwImageNode.h>
 #include <MaterialXGenShader/Nodes/HwTexCoordNode.h>
 #include <MaterialXGenShader/Nodes/HwTransformNode.h>
@@ -55,30 +54,6 @@ GlslShaderGenerator::GlslShaderGenerator() :
 
     StringVec elementNames;
 
-    // <!-- <switch> -->
-    elementNames = {
-        // <!-- 'which' type : float -->
-        "IM_switch_float_" + GlslShaderGenerator::TARGET,
-        "IM_switch_color3_" + GlslShaderGenerator::TARGET,
-        "IM_switch_color4_" + GlslShaderGenerator::TARGET,
-        "IM_switch_vector2_" + GlslShaderGenerator::TARGET,
-        "IM_switch_vector3_" + GlslShaderGenerator::TARGET,
-        "IM_switch_vector4_" + GlslShaderGenerator::TARGET,
-        "IM_switch_matrix33_" + GlslShaderGenerator::TARGET,
-        "IM_switch_matrix44_" + GlslShaderGenerator::TARGET,
-
-        // <!-- 'which' type : integer -->
-        "IM_switch_floatI_" + GlslShaderGenerator::TARGET,
-        "IM_switch_color3I_" + GlslShaderGenerator::TARGET,
-        "IM_switch_color4I_" + GlslShaderGenerator::TARGET,
-        "IM_switch_vector2I_" + GlslShaderGenerator::TARGET,
-        "IM_switch_vector3I_" + GlslShaderGenerator::TARGET,
-        "IM_switch_vector4I_" + GlslShaderGenerator::TARGET,
-        "IM_switch_matrix33I_" + GlslShaderGenerator::TARGET,
-        "IM_switch_matrix44I_" + GlslShaderGenerator::TARGET,
-    };
-    registerImplementation(elementNames, SwitchNode::create);
-
     // <!-- <position> -->
     registerImplementation("IM_position_vector3_" + GlslShaderGenerator::TARGET, HwPositionNode::create);
     // <!-- <normal> -->
diff --git a/source/MaterialXGenMdl/MdlShaderGenerator.cpp b/source/MaterialXGenMdl/MdlShaderGenerator.cpp
index fa984729a6..dbf1667d13 100644
--- a/source/MaterialXGenMdl/MdlShaderGenerator.cpp
+++ b/source/MaterialXGenMdl/MdlShaderGenerator.cpp
@@ -20,7 +20,6 @@
 #include <MaterialXGenShader/GenContext.h>
 #include <MaterialXGenShader/Shader.h>
 #include <MaterialXGenShader/ShaderStage.h>
-#include <MaterialXGenShader/Nodes/SwitchNode.h>
 #include <MaterialXGenShader/Nodes/ClosureCompoundNode.h>
 #include <MaterialXGenShader/Nodes/ClosureSourceCodeNode.h>
 #include <MaterialXGenShader/Util.h>
diff --git a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
index 2187d35971..1c9d78f36a 100644
--- a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
+++ b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
@@ -3983,430 +3983,6 @@ export bool mx_ifequal_booleanB(
 	if (mxp_value1 == mxp_value2) { return true; } return false;
 }
 
-export float mx_switch_float(
-	float mxp_in1 = float(0.0),
-	float mxp_in2 = float(0.0),
-	float mxp_in3 = float(0.0),
-	float mxp_in4 = float(0.0),
-	float mxp_in5 = float(0.0),
-	float mxp_which = float(0.0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	float returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export color mx_switch_color3(
-	color mxp_in1 = color(0.0, 0.0, 0.0),
-	color mxp_in2 = color(0.0, 0.0, 0.0),
-	color mxp_in3 = color(0.0, 0.0, 0.0),
-	color mxp_in4 = color(0.0, 0.0, 0.0),
-	color mxp_in5 = color(0.0, 0.0, 0.0),
-	float mxp_which = float(0.0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	color returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export core::color4 mx_switch_color4(
-	core::color4 mxp_in1 = core::mk_color4(0.0, 0.0, 0.0, 0.0),
-	core::color4 mxp_in2 = core::mk_color4(0.0, 0.0, 0.0, 0.0),
-	core::color4 mxp_in3 = core::mk_color4(0.0, 0.0, 0.0, 0.0),
-	core::color4 mxp_in4 = core::mk_color4(0.0, 0.0, 0.0, 0.0),
-	core::color4 mxp_in5 = core::mk_color4(0.0, 0.0, 0.0, 0.0),
-	float mxp_which = float(0.0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	core::color4 returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export float2 mx_switch_vector2(
-	float2 mxp_in1 = float2(0.0, 0.0),
-	float2 mxp_in2 = float2(0.0, 0.0),
-	float2 mxp_in3 = float2(0.0, 0.0),
-	float2 mxp_in4 = float2(0.0, 0.0),
-	float2 mxp_in5 = float2(0.0, 0.0),
-	float mxp_which = float(0.0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	float2 returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export float3 mx_switch_vector3(
-	float3 mxp_in1 = float3(0.0, 0.0, 0.0),
-	float3 mxp_in2 = float3(0.0, 0.0, 0.0),
-	float3 mxp_in3 = float3(0.0, 0.0, 0.0),
-	float3 mxp_in4 = float3(0.0, 0.0, 0.0),
-	float3 mxp_in5 = float3(0.0, 0.0, 0.0),
-	float mxp_which = float(0.0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	float3 returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export float4 mx_switch_vector4(
-	float4 mxp_in1 = float4(0.0, 0.0, 0.0, 0.0),
-	float4 mxp_in2 = float4(0.0, 0.0, 0.0, 0.0),
-	float4 mxp_in3 = float4(0.0, 0.0, 0.0, 0.0),
-	float4 mxp_in4 = float4(0.0, 0.0, 0.0, 0.0),
-	float4 mxp_in5 = float4(0.0, 0.0, 0.0, 0.0),
-	float mxp_which = float(0.0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	float4 returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export float3x3 mx_switch_matrix33(
-	float3x3 mxp_in1 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in2 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in3 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in4 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in5 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in6 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in7 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in8 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in9 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in10 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float mxp_which = float(0.0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	float3x3 returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		case 5: returnValue=mxp_in6; break;
-		case 6: returnValue=mxp_in7; break;
-		case 7: returnValue=mxp_in8; break;
-		case 8: returnValue=mxp_in9; break;
-		case 9: returnValue=mxp_in10; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export float4x4 mx_switch_matrix44(
-	float4x4 mxp_in1 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in2 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in3 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in4 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in5 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in6 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in7 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in8 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in9 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in10 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float mxp_which = float(0.0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	float4x4 returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		case 5: returnValue=mxp_in6; break;
-		case 6: returnValue=mxp_in7; break;
-		case 7: returnValue=mxp_in8; break;
-		case 8: returnValue=mxp_in9; break;
-		case 9: returnValue=mxp_in10; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export float mx_switch_floatI(
-	float mxp_in1 = float(0.0),
-	float mxp_in2 = float(0.0),
-	float mxp_in3 = float(0.0),
-	float mxp_in4 = float(0.0),
-	float mxp_in5 = float(0.0),
-	int mxp_which = int(0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	float returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export color mx_switch_color3I(
-	color mxp_in1 = color(0.0, 0.0, 0.0),
-	color mxp_in2 = color(0.0, 0.0, 0.0),
-	color mxp_in3 = color(0.0, 0.0, 0.0),
-	color mxp_in4 = color(0.0, 0.0, 0.0),
-	color mxp_in5 = color(0.0, 0.0, 0.0),
-	int mxp_which = int(0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	color returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export core::color4 mx_switch_color4I(
-	core::color4 mxp_in1 = core::mk_color4(0.0, 0.0, 0.0, 0.0),
-	core::color4 mxp_in2 = core::mk_color4(0.0, 0.0, 0.0, 0.0),
-	core::color4 mxp_in3 = core::mk_color4(0.0, 0.0, 0.0, 0.0),
-	core::color4 mxp_in4 = core::mk_color4(0.0, 0.0, 0.0, 0.0),
-	core::color4 mxp_in5 = core::mk_color4(0.0, 0.0, 0.0, 0.0),
-	int mxp_which = int(0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	core::color4 returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export float2 mx_switch_vector2I(
-	float2 mxp_in1 = float2(0.0, 0.0),
-	float2 mxp_in2 = float2(0.0, 0.0),
-	float2 mxp_in3 = float2(0.0, 0.0),
-	float2 mxp_in4 = float2(0.0, 0.0),
-	float2 mxp_in5 = float2(0.0, 0.0),
-	int mxp_which = int(0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	float2 returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export float3 mx_switch_vector3I(
-	float3 mxp_in1 = float3(0.0, 0.0, 0.0),
-	float3 mxp_in2 = float3(0.0, 0.0, 0.0),
-	float3 mxp_in3 = float3(0.0, 0.0, 0.0),
-	float3 mxp_in4 = float3(0.0, 0.0, 0.0),
-	float3 mxp_in5 = float3(0.0, 0.0, 0.0),
-	int mxp_which = int(0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	float3 returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export float4 mx_switch_vector4I(
-	float4 mxp_in1 = float4(0.0, 0.0, 0.0, 0.0),
-	float4 mxp_in2 = float4(0.0, 0.0, 0.0, 0.0),
-	float4 mxp_in3 = float4(0.0, 0.0, 0.0, 0.0),
-	float4 mxp_in4 = float4(0.0, 0.0, 0.0, 0.0),
-	float4 mxp_in5 = float4(0.0, 0.0, 0.0, 0.0),
-	int mxp_which = int(0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	float4 returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export float3x3 mx_switch_matrix33I(
-	float3x3 mxp_in1 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in2 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in3 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in4 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in5 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in6 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in7 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in8 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in9 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float3x3 mxp_in10 = float3x3(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	int mxp_which = int(0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	float3x3 returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		case 5: returnValue=mxp_in6; break;
-		case 6: returnValue=mxp_in7; break;
-		case 7: returnValue=mxp_in8; break;
-		case 8: returnValue=mxp_in9; break;
-		case 9: returnValue=mxp_in10; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
-export float4x4 mx_switch_matrix44I(
-	float4x4 mxp_in1 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in2 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in3 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in4 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in5 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in6 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in7 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in8 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in9 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	float4x4 mxp_in10 = float4x4(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
-	int mxp_which = int(0)
-)
-	[[
-		anno::description("Node Group: conditional")
-	]]
-{
-	float4x4 returnValue;
-	switch (int(mxp_which)) {
-		case 0: returnValue=mxp_in1; break;
-		case 1: returnValue=mxp_in2; break;
-		case 2: returnValue=mxp_in3; break;
-		case 3: returnValue=mxp_in4; break;
-		case 4: returnValue=mxp_in5; break;
-		case 5: returnValue=mxp_in6; break;
-		case 6: returnValue=mxp_in7; break;
-		case 7: returnValue=mxp_in8; break;
-		case 8: returnValue=mxp_in9; break;
-		case 9: returnValue=mxp_in10; break;
-		default: returnValue=mxp_in1; break;
-	}
-	return returnValue;
-}
-
 export color mx_convert_float_color3(
 	float mxp_in = float(0.0)
 )
diff --git a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_8.mdl b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_8.mdl
index c4e0c8318d..cd46a0bfcf 100644
--- a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_8.mdl
+++ b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_8.mdl
@@ -265,22 +265,6 @@ export using .::stdlib_1_7 import mx_ifequal_color4B;
 export using .::stdlib_1_7 import mx_ifequal_vector2B;
 export using .::stdlib_1_7 import mx_ifequal_vector3B;
 export using .::stdlib_1_7 import mx_ifequal_vector4B;
-export using .::stdlib_1_7 import mx_switch_float;
-export using .::stdlib_1_7 import mx_switch_color3;
-export using .::stdlib_1_7 import mx_switch_color4;
-export using .::stdlib_1_7 import mx_switch_vector2;
-export using .::stdlib_1_7 import mx_switch_vector3;
-export using .::stdlib_1_7 import mx_switch_vector4;
-export using .::stdlib_1_7 import mx_switch_matrix33;
-export using .::stdlib_1_7 import mx_switch_matrix44;
-export using .::stdlib_1_7 import mx_switch_floatI;
-export using .::stdlib_1_7 import mx_switch_color3I;
-export using .::stdlib_1_7 import mx_switch_color4I;
-export using .::stdlib_1_7 import mx_switch_vector2I;
-export using .::stdlib_1_7 import mx_switch_vector3I;
-export using .::stdlib_1_7 import mx_switch_vector4I;
-export using .::stdlib_1_7 import mx_switch_matrix33I;
-export using .::stdlib_1_7 import mx_switch_matrix44I;
 export using .::stdlib_1_7 import mx_convert_float_color3;
 export using .::stdlib_1_7 import mx_convert_float_color4;
 export using .::stdlib_1_7 import mx_convert_float_vector2;
diff --git a/source/MaterialXGenMsl/MslShaderGenerator.cpp b/source/MaterialXGenMsl/MslShaderGenerator.cpp
index 798c3b00b2..8db763d7e1 100644
--- a/source/MaterialXGenMsl/MslShaderGenerator.cpp
+++ b/source/MaterialXGenMsl/MslShaderGenerator.cpp
@@ -19,7 +19,6 @@
 #include <MaterialXGenMsl/Nodes/BlurNodeMsl.h>
 
 #include <MaterialXGenShader/Nodes/MaterialNode.h>
-#include <MaterialXGenShader/Nodes/SwitchNode.h>
 #include <MaterialXGenShader/Nodes/HwImageNode.h>
 #include <MaterialXGenShader/Nodes/HwTexCoordNode.h>
 #include <MaterialXGenShader/Nodes/HwTransformNode.h>
@@ -59,30 +58,6 @@ MslShaderGenerator::MslShaderGenerator() :
 
     StringVec elementNames;
 
-    // <!-- <switch> -->
-    elementNames = {
-        // <!-- 'which' type : float -->
-        "IM_switch_float_" + MslShaderGenerator::TARGET,
-        "IM_switch_color3_" + MslShaderGenerator::TARGET,
-        "IM_switch_color4_" + MslShaderGenerator::TARGET,
-        "IM_switch_vector2_" + MslShaderGenerator::TARGET,
-        "IM_switch_vector3_" + MslShaderGenerator::TARGET,
-        "IM_switch_vector4_" + MslShaderGenerator::TARGET,
-        "IM_switch_matrix33_" + MslShaderGenerator::TARGET,
-        "IM_switch_matrix44_" + MslShaderGenerator::TARGET,
-
-        // <!-- 'which' type : integer -->
-        "IM_switch_floatI_" + MslShaderGenerator::TARGET,
-        "IM_switch_color3I_" + MslShaderGenerator::TARGET,
-        "IM_switch_color4I_" + MslShaderGenerator::TARGET,
-        "IM_switch_vector2I_" + MslShaderGenerator::TARGET,
-        "IM_switch_vector3I_" + MslShaderGenerator::TARGET,
-        "IM_switch_vector4I_" + MslShaderGenerator::TARGET,
-        "IM_switch_matrix33I_" + MslShaderGenerator::TARGET,
-        "IM_switch_matrix44I_" + MslShaderGenerator::TARGET,
-    };
-    registerImplementation(elementNames, SwitchNode::create);
-
     // <!-- <position> -->
     registerImplementation("IM_position_vector3_" + MslShaderGenerator::TARGET, HwPositionNode::create);
     // <!-- <normal> -->
diff --git a/source/MaterialXGenOsl/OslShaderGenerator.cpp b/source/MaterialXGenOsl/OslShaderGenerator.cpp
index 6302230f74..f29719a39b 100644
--- a/source/MaterialXGenOsl/OslShaderGenerator.cpp
+++ b/source/MaterialXGenOsl/OslShaderGenerator.cpp
@@ -9,7 +9,6 @@
 #include <MaterialXGenShader/GenContext.h>
 #include <MaterialXGenShader/Shader.h>
 #include <MaterialXGenShader/ShaderStage.h>
-#include <MaterialXGenShader/Nodes/SwitchNode.h>
 #include <MaterialXGenShader/Nodes/SourceCodeNode.h>
 #include <MaterialXGenShader/Nodes/ClosureAddNode.h>
 #include <MaterialXGenShader/Nodes/ClosureMixNode.h>
@@ -33,26 +32,6 @@ OslShaderGenerator::OslShaderGenerator() :
 {
     // Register build-in implementations
 
-    // <!-- <switch> -->
-    // <!-- 'which' type : float -->
-    registerImplementation("IM_switch_float_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_color3_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_color4_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_vector2_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_vector3_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_vector4_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_matrix33_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_matrix44_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    // <!-- 'which' type : integer -->
-    registerImplementation("IM_switch_floatI_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_color3I_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_color4I_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_vector2I_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_vector3I_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_vector4I_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_matrix33I_" + OslShaderGenerator::TARGET, SwitchNode::create);
-    registerImplementation("IM_switch_matrix44I_" + OslShaderGenerator::TARGET, SwitchNode::create);
-
     // <!-- <blur> -->
     registerImplementation("IM_blur_float_" + OslShaderGenerator::TARGET, BlurNodeOsl::create);
     registerImplementation("IM_blur_color3_" + OslShaderGenerator::TARGET, BlurNodeOsl::create);
diff --git a/source/MaterialXGenShader/Nodes/SwitchNode.cpp b/source/MaterialXGenShader/Nodes/SwitchNode.cpp
deleted file mode 100644
index f244854e47..0000000000
--- a/source/MaterialXGenShader/Nodes/SwitchNode.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-//
-// Copyright Contributors to the MaterialX Project
-// SPDX-License-Identifier: Apache-2.0
-//
-
-#include <MaterialXGenShader/Nodes/SwitchNode.h>
-#include <MaterialXGenShader/GenContext.h>
-#include <MaterialXGenShader/ShaderNode.h>
-#include <MaterialXGenShader/ShaderStage.h>
-#include <MaterialXGenShader/ShaderGenerator.h>
-
-MATERIALX_NAMESPACE_BEGIN
-
-const StringVec SwitchNode::INPUT_NAMES = { "in1", "in2", "in3", "in4", "in5", "in6", "in7", "in8", "in9", "in10" };
-
-ShaderNodeImplPtr SwitchNode::create()
-{
-    return std::make_shared<SwitchNode>();
-}
-
-void SwitchNode::emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const
-{
-    DEFINE_SHADER_STAGE(stage, Stage::PIXEL)
-    {
-        const ShaderGenerator& shadergen = context.getShaderGenerator();
-
-        // Declare the output variable
-        shadergen.emitLineBegin(stage);
-        shadergen.emitOutput(node.getOutput(), true, true, context, stage);
-        shadergen.emitLineEnd(stage);
-
-        const ShaderInput* which = node.getInput("which");
-
-        // Process the branches of the switch node
-        for (int branch = 0; branch < 10; ++branch)
-        {
-            const ShaderInput* input = node.getInput(INPUT_NAMES[branch]);
-            if (!input)
-            {
-                // The boolean version only has two inputs
-                // so break if the input doesn't exist
-                break;
-            }
-
-            shadergen.emitLineBegin(stage);
-            if (branch > 0)
-            {
-                shadergen.emitString("else ", stage);
-            }
-            // Convert to float to insure a valid comparison, since the 'which'
-            // input may be float, integer or boolean.
-            shadergen.emitString("if (float(", stage);
-            shadergen.emitInput(which, context, stage);
-            shadergen.emitString(") < float(", stage);
-            shadergen.emitValue(float(branch + 1), stage);
-            shadergen.emitString("))", stage);
-            shadergen.emitLineEnd(stage, false);
-
-            shadergen.emitScopeBegin(stage);
-            shadergen.emitLineBegin(stage);
-            shadergen.emitOutput(node.getOutput(), false, false, context, stage);
-            shadergen.emitString(" = ", stage);
-            shadergen.emitInput(input, context, stage);
-            shadergen.emitLineEnd(stage);
-            shadergen.emitScopeEnd(stage);
-        }
-    }
-}
-
-MATERIALX_NAMESPACE_END
diff --git a/source/MaterialXGenShader/Nodes/SwitchNode.h b/source/MaterialXGenShader/Nodes/SwitchNode.h
deleted file mode 100644
index 0d5a06662e..0000000000
--- a/source/MaterialXGenShader/Nodes/SwitchNode.h
+++ /dev/null
@@ -1,27 +0,0 @@
-//
-// Copyright Contributors to the MaterialX Project
-// SPDX-License-Identifier: Apache-2.0
-//
-
-#ifndef MATERIALX_SWITCHNODE_H
-#define MATERIALX_SWITCHNODE_H
-
-#include <MaterialXGenShader/ShaderNodeImpl.h>
-
-MATERIALX_NAMESPACE_BEGIN
-
-/// Switch node implementation
-class MX_GENSHADER_API SwitchNode : public ShaderNodeImpl
-{
-  public:
-    static ShaderNodeImplPtr create();
-
-    void emitFunctionCall(const ShaderNode& node, GenContext& context, ShaderStage& stage) const override;
-
-  public:
-    static const StringVec INPUT_NAMES;
-};
-
-MATERIALX_NAMESPACE_END
-
-#endif

From 458d33baaaebbe427782dabb2b83654746720266 Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Sun, 9 Jun 2024 12:30:11 -0700
Subject: [PATCH 19/48] Updates to MDL implementations

- Add missing exports for mx_ifgreater, mx_ifgreatereq, and mx_ifequal.
- Remove unused functions for mx_convert, mx_combine2, mx_combine3, and mx_combine4.
---
 .../mdl/materialx/stdlib_1_6.mdl              | 275 ------------------
 .../mdl/materialx/stdlib_1_8.mdl              |  47 ++-
 2 files changed, 21 insertions(+), 301 deletions(-)

diff --git a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
index 1c9d78f36a..cd29a08b9c 100644
--- a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
+++ b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
@@ -3983,281 +3983,6 @@ export bool mx_ifequal_booleanB(
 	if (mxp_value1 == mxp_value2) { return true; } return false;
 }
 
-export color mx_convert_float_color3(
-	float mxp_in = float(0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return color(mxp_in);
-}
-
-export core::color4 mx_convert_float_color4(
-	float mxp_in = float(0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return core::mk_color4(mxp_in);
-}
-
-export float2 mx_convert_float_vector2(
-	float mxp_in = float(0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float2(mxp_in);
-}
-
-export float3 mx_convert_float_vector3(
-	float mxp_in = float(0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float3(mxp_in);
-}
-
-export float4 mx_convert_float_vector4(
-	float mxp_in = float(0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float4(mxp_in);
-}
-
-export float3 mx_convert_vector2_vector3(
-	float2 mxp_in = float2(0.0, 0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float3(mxp_in.x, mxp_in.y, 0.0);
-}
-
-export color mx_convert_vector3_color3(
-	float3 mxp_in = float3(0.0, 0.0, 0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return color(mxp_in);
-}
-
-export float2 mx_convert_vector3_vector2(
-	float3 mxp_in = float3(0.0, 0.0, 0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float2(mxp_in.x, mxp_in.y);
-}
-
-export float4 mx_convert_vector3_vector4(
-	float3 mxp_in = float3(0.0, 0.0, 0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float4(mxp_in.x, mxp_in.y, mxp_in.z, 0.0);
-}
-
-export core::color4 mx_convert_vector4_color4(
-	float4 mxp_in = float4(0.0, 0.0, 0.0, 0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return core::mk_color4(mxp_in);
-}
-
-export float3 mx_convert_vector4_vector3(
-	float4 mxp_in = float4(0.0, 0.0, 0.0, 0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float3(mxp_in.x, mxp_in.y, mxp_in.z);
-}
-
-export float3 mx_convert_color3_vector3(
-	color mxp_in = color(0.0, 0.0, 0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float3(mxp_in);
-}
-
-export float4 mx_convert_color4_vector4(
-	core::color4 mxp_in = core::mk_color4(0.0, 0.0, 0.0, 0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return core::mk_float4(mxp_in);
-}
-
-export core::color4 mx_convert_color3_color4(
-	color mxp_in = color(0.0, 0.0, 0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return core::mk_color4(mxp_in);
-}
-
-export color mx_convert_color4_color3(
-	core::color4 mxp_in = core::mk_color4(0.0, 0.0, 0.0, 0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return mxp_in.rgb;
-}
-
-export float mx_convert_boolean_float(
-	bool mxp_in = bool(false)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float(mxp_in);
-}
-
-export float mx_convert_integer_float(
-	int mxp_in = int(0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float(mxp_in);
-}
-
-export float2 mx_combine2_vector2(
-	float mxp_in1 = float(0.0),
-	float mxp_in2 = float(0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float2(mxp_in1, mxp_in2);
-}
-
-export core::color4 mx_combine2_color4CF(
-	color mxp_in1 = color(0.0, 0.0, 0.0),
-	float mxp_in2 = float(0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return core::color4(mxp_in1, mxp_in2);
-}
-
-export float4 mx_combine2_vector4VF(
-	float3 mxp_in1 = float3(0.0, 0.0, 0.0),
-	float mxp_in2 = float(0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float4(mxp_in1.x, mxp_in1.y, mxp_in1.z, mxp_in2);
-}
-
-export core::color4 mx_combine2_color4CC(
-	float2 mxp_in1 = float2(0.0, 0.0),
-	float2 mxp_in2 = float2(0.0, 0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return core::color4(color(mxp_in1.x, mxp_in1.y, mxp_in2.x), mxp_in2.y);
-}
-
-export float4 mx_combine2_vector4VV(
-	float2 mxp_in1 = float2(0.0, 0.0),
-	float2 mxp_in2 = float2(0.0, 0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float4(mxp_in1.x, mxp_in1.y, mxp_in2.x, mxp_in2.y);
-}
-
-export color mx_combine3_color3(
-	float mxp_in1 = float(0.0),
-	float mxp_in2 = float(0.0),
-	float mxp_in3 = float(0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return color(mxp_in1, mxp_in2, mxp_in3);
-}
-
-export float3 mx_combine3_vector3(
-	float mxp_in1 = float(0.0),
-	float mxp_in2 = float(0.0),
-	float mxp_in3 = float(0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float3(mxp_in1, mxp_in2, mxp_in3);
-}
-
-export core::color4 mx_combine4_color4(
-	float mxp_in1 = float(0.0),
-	float mxp_in2 = float(0.0),
-	float mxp_in3 = float(0.0),
-	float mxp_in4 = float(0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return core::mk_color4(mxp_in1, mxp_in2, mxp_in3, mxp_in4);
-}
-
-export float4 mx_combine4_vector4(
-	float mxp_in1 = float(0.0),
-	float mxp_in2 = float(0.0),
-	float mxp_in3 = float(0.0),
-	float mxp_in4 = float(0.0)
-)
-	[[
-		anno::description("Node Group: channel")
-	]]
-{
-	return float4(mxp_in1, mxp_in2, mxp_in3, mxp_in4);
-}
-
 export float3x3 mx_creatematrix_vector3_matrix33(
 	float3 mxp_in1 = float3(1.0, 0.0, 0.0),
 	float3 mxp_in2 = float3(0.0, 1.0, 0.0),
diff --git a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_8.mdl b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_8.mdl
index cd46a0bfcf..b6e7174114 100644
--- a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_8.mdl
+++ b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_8.mdl
@@ -223,6 +223,9 @@ export using .::stdlib_1_7 import mx_ifgreater_color4;
 export using .::stdlib_1_7 import mx_ifgreater_vector2;
 export using .::stdlib_1_7 import mx_ifgreater_vector3;
 export using .::stdlib_1_7 import mx_ifgreater_vector4;
+export using .::stdlib_1_7 import mx_ifgreater_matrix33;
+export using .::stdlib_1_7 import mx_ifgreater_matrix44;
+export using .::stdlib_1_7 import mx_ifgreater_boolean;
 export using .::stdlib_1_7 import mx_ifgreater_floatI;
 export using .::stdlib_1_7 import mx_ifgreater_integerI;
 export using .::stdlib_1_7 import mx_ifgreater_color3I;
@@ -230,6 +233,9 @@ export using .::stdlib_1_7 import mx_ifgreater_color4I;
 export using .::stdlib_1_7 import mx_ifgreater_vector2I;
 export using .::stdlib_1_7 import mx_ifgreater_vector3I;
 export using .::stdlib_1_7 import mx_ifgreater_vector4I;
+export using .::stdlib_1_7 import mx_ifgreater_matrix33I;
+export using .::stdlib_1_7 import mx_ifgreater_matrix44I;
+export using .::stdlib_1_7 import mx_ifgreater_booleanI;
 export using .::stdlib_1_7 import mx_ifgreatereq_float;
 export using .::stdlib_1_7 import mx_ifgreatereq_integer;
 export using .::stdlib_1_7 import mx_ifgreatereq_color3;
@@ -237,6 +243,9 @@ export using .::stdlib_1_7 import mx_ifgreatereq_color4;
 export using .::stdlib_1_7 import mx_ifgreatereq_vector2;
 export using .::stdlib_1_7 import mx_ifgreatereq_vector3;
 export using .::stdlib_1_7 import mx_ifgreatereq_vector4;
+export using .::stdlib_1_7 import mx_ifgreatereq_matrix33;
+export using .::stdlib_1_7 import mx_ifgreatereq_matrix44;
+export using .::stdlib_1_7 import mx_ifgreatereq_boolean;
 export using .::stdlib_1_7 import mx_ifgreatereq_floatI;
 export using .::stdlib_1_7 import mx_ifgreatereq_integerI;
 export using .::stdlib_1_7 import mx_ifgreatereq_color3I;
@@ -244,6 +253,9 @@ export using .::stdlib_1_7 import mx_ifgreatereq_color4I;
 export using .::stdlib_1_7 import mx_ifgreatereq_vector2I;
 export using .::stdlib_1_7 import mx_ifgreatereq_vector3I;
 export using .::stdlib_1_7 import mx_ifgreatereq_vector4I;
+export using .::stdlib_1_7 import mx_ifgreatereq_matrix33I;
+export using .::stdlib_1_7 import mx_ifgreatereq_matrix44I;
+export using .::stdlib_1_7 import mx_ifgreatereq_booleanI;
 export using .::stdlib_1_7 import mx_ifequal_float;
 export using .::stdlib_1_7 import mx_ifequal_integer;
 export using .::stdlib_1_7 import mx_ifequal_color3;
@@ -251,6 +263,9 @@ export using .::stdlib_1_7 import mx_ifequal_color4;
 export using .::stdlib_1_7 import mx_ifequal_vector2;
 export using .::stdlib_1_7 import mx_ifequal_vector3;
 export using .::stdlib_1_7 import mx_ifequal_vector4;
+export using .::stdlib_1_7 import mx_ifequal_matrix33;
+export using .::stdlib_1_7 import mx_ifequal_matrix44;
+export using .::stdlib_1_7 import mx_ifequal_boolean;
 export using .::stdlib_1_7 import mx_ifequal_floatI;
 export using .::stdlib_1_7 import mx_ifequal_integerI;
 export using .::stdlib_1_7 import mx_ifequal_color3I;
@@ -258,6 +273,9 @@ export using .::stdlib_1_7 import mx_ifequal_color4I;
 export using .::stdlib_1_7 import mx_ifequal_vector2I;
 export using .::stdlib_1_7 import mx_ifequal_vector3I;
 export using .::stdlib_1_7 import mx_ifequal_vector4I;
+export using .::stdlib_1_7 import mx_ifequal_matrix33I;
+export using .::stdlib_1_7 import mx_ifequal_matrix44I;
+export using .::stdlib_1_7 import mx_ifequal_booleanI;
 export using .::stdlib_1_7 import mx_ifequal_floatB;
 export using .::stdlib_1_7 import mx_ifequal_integerB;
 export using .::stdlib_1_7 import mx_ifequal_color3B;
@@ -265,32 +283,9 @@ export using .::stdlib_1_7 import mx_ifequal_color4B;
 export using .::stdlib_1_7 import mx_ifequal_vector2B;
 export using .::stdlib_1_7 import mx_ifequal_vector3B;
 export using .::stdlib_1_7 import mx_ifequal_vector4B;
-export using .::stdlib_1_7 import mx_convert_float_color3;
-export using .::stdlib_1_7 import mx_convert_float_color4;
-export using .::stdlib_1_7 import mx_convert_float_vector2;
-export using .::stdlib_1_7 import mx_convert_float_vector3;
-export using .::stdlib_1_7 import mx_convert_float_vector4;
-export using .::stdlib_1_7 import mx_convert_vector2_vector3;
-export using .::stdlib_1_7 import mx_convert_vector3_color3;
-export using .::stdlib_1_7 import mx_convert_vector3_vector2;
-export using .::stdlib_1_7 import mx_convert_vector3_vector4;
-export using .::stdlib_1_7 import mx_convert_vector4_color4;
-export using .::stdlib_1_7 import mx_convert_vector4_vector3;
-export using .::stdlib_1_7 import mx_convert_color3_vector3;
-export using .::stdlib_1_7 import mx_convert_color4_vector4;
-export using .::stdlib_1_7 import mx_convert_color3_color4;
-export using .::stdlib_1_7 import mx_convert_color4_color3;
-export using .::stdlib_1_7 import mx_convert_boolean_float;
-export using .::stdlib_1_7 import mx_convert_integer_float;
-export using .::stdlib_1_7 import mx_combine2_vector2;
-export using .::stdlib_1_7 import mx_combine2_color4CF;
-export using .::stdlib_1_7 import mx_combine2_vector4VF;
-export using .::stdlib_1_7 import mx_combine2_color4CC;
-export using .::stdlib_1_7 import mx_combine2_vector4VV;
-export using .::stdlib_1_7 import mx_combine3_color3;
-export using .::stdlib_1_7 import mx_combine3_vector3;
-export using .::stdlib_1_7 import mx_combine4_color4;
-export using .::stdlib_1_7 import mx_combine4_vector4;
+export using .::stdlib_1_7 import mx_ifequal_matrix33B;
+export using .::stdlib_1_7 import mx_ifequal_matrix44B;
+export using .::stdlib_1_7 import mx_ifequal_booleanB;
 export using .::stdlib_1_7 import mx_creatematrix_vector3_matrix33;
 export using .::stdlib_1_7 import mx_creatematrix_vector3_matrix44;
 export using .::stdlib_1_7 import mx_creatematrix_vector4_matrix44;

From e77d2c3a0b00ea41af458ecf56ebaeac3d8a5b4c Mon Sep 17 00:00:00 2001
From: mkuo-lucasfilm <mkuo@lucasfilm.com>
Date: Mon, 10 Jun 2024 11:19:57 -0700
Subject: [PATCH 20/48] Initial updates to LamaDiffuse and LamaDielectric
 (#1876)

- LamaDiffuse: removed lobeName and matte inputs
- LamaDielectric: removed exteriorIOR input
---
 libraries/bxdf/lama/lama_dielectric.mtlx             | 12 +++---------
 libraries/bxdf/lama/lama_diffuse.mtlx                |  4 ----
 .../TestSuite/pbrlib/surfaceshader/lama_tests.mtlx   |  3 ---
 3 files changed, 3 insertions(+), 16 deletions(-)

diff --git a/libraries/bxdf/lama/lama_dielectric.mtlx b/libraries/bxdf/lama/lama_dielectric.mtlx
index ec9b44ab3e..815c7e511c 100644
--- a/libraries/bxdf/lama/lama_dielectric.mtlx
+++ b/libraries/bxdf/lama/lama_dielectric.mtlx
@@ -21,8 +21,6 @@
            doc="Overrides the surface tangent as the anisotropy direction." />
     <input name="rotation" type="float" value="0.0" uiname="Rotation" uifolder="Anisotropy"
            doc="Rotates the anisotropy direction (possibly overriden by the previous attribute) around the normal, from 0 to 360 degrees." />
-    <input name="exteriorIOR" type="float" value="1.0" uimin="1.0" uimax="3.0" uiname="Exterior IOR" uifolder="Advanced"
-           doc="Defines what the IOR of the exterior medium is (can be either the outside medium, eg. air or water, or in case of a layered material, the top layer medium, like plexiglass or varnish)." />
     <input name="absorptionColor" type="color3" value="1.0, 1.0, 1.0" uiname="Absorption Color" uifolder="Interior"
            doc="Absorption color" />
     <input name="absorptionRadius" type="float" value="1.0" uiname="Absorption Radius" uifolder="Interior"
@@ -53,11 +51,7 @@
       <input name="in2" type="float" nodename="ior_float" />
       <input name="which" type="integer" interfacename="fresnelMode" />
     </switch>
-    <divide name="relative_ior" type="float">
-      <input name="in1" type="float" nodename="fresnel_mode_switch" />
-      <input name="in2" type="float" interfacename="exteriorIOR" />
-    </divide>
-
+      
     <!-- Roughness -->
     <subtract name="roughness_inverse" type="float">
       <input name="in1" type="float" value="1.0" />
@@ -132,7 +126,7 @@
     <dielectric_bsdf name="transmission_bsdf" type="BSDF">
       <input name="weight" type="float" value="1.0" />
       <input name="tint" type="color3" interfacename="transmissionTint" />
-      <input name="ior" type="float" nodename="relative_ior" />
+      <input name="ior" type="float" nodename="fresnel_mode_switch" />
       <input name="roughness" type="vector2" nodename="roughness_anisotropic_squared_clamped" />
       <input name="normal" type="vector3" interfacename="normal" />
       <input name="tangent" type="vector3" nodename="tangent_rotate_normalize" />
@@ -148,7 +142,7 @@
     <dielectric_bsdf name="reflection_bsdf" type="BSDF">
       <input name="weight" type="float" value="1.0" />
       <input name="tint" type="color3" interfacename="reflectionTint" />
-      <input name="ior" type="float" nodename="relative_ior" />
+      <input name="ior" type="float" nodename="fresnel_mode_switch" />
       <input name="roughness" type="vector2" nodename="roughness_anisotropic_squared_clamped" />
       <input name="normal" type="vector3" interfacename="normal" />
       <input name="tangent" type="vector3" nodename="tangent_rotate_normalize" />
diff --git a/libraries/bxdf/lama/lama_diffuse.mtlx b/libraries/bxdf/lama/lama_diffuse.mtlx
index 0df1dd8fa6..dee56af3e0 100644
--- a/libraries/bxdf/lama/lama_diffuse.mtlx
+++ b/libraries/bxdf/lama/lama_diffuse.mtlx
@@ -9,10 +9,6 @@
            doc="Shading normal, typically defined by bump or normal mapping. Defaults to the smooth surface normal if not set." />
     <input name="energyCompensation" uiname="Energy Compensation" uifolder="Advanced" type="float" uniform="true" uimin="0.0" uimax="1.0" value="1.0"
            doc="Indicates how much energy should be added to compensate for the loss inherent to the Oren-Nayar model, ranging from no compensation at all, to the expected energy from multiple scattering between the micro-facets. This prevents overly dark results when roughness is high." />
-    <input name="lobeName" uiname="Lobe Name" uifolder="Advanced" type="string" uniform="true" value="diffuse"
-           doc="Defines the name that can be used in LPE AOVs for this lobe." />
-    <input name="matte" uiname="Matte" uifolder="Advanced" type="string" uniform="true" value=""
-           doc="Defines the name that can be used by the matte system, to output the weight of this lobe in the final material as an AOV." />
     <output name="out" type="BSDF" />
   </nodedef>
 
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama_tests.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama_tests.mtlx
index 6862892c7e..7c8ec722d2 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama_tests.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama_tests.mtlx
@@ -33,7 +33,6 @@
     <input name="roughness" type="float" value="0.1" />
     <input name="anisotropy" type="float" value="0.0" />
     <input name="rotation" type="float" value="0.0" />
-    <input name="exteriorIOR" type="float" value="1.0" />
     <input name="absorptionColor" type="color3" value="1.0, 1.0, 1.0" />
     <input name="absorptionRadius" type="float" value="1.0" />
     <input name="scatterColor" type="color3" value="0.0, 0.0, 0.0" />
@@ -51,8 +50,6 @@
     <input name="color" type="color3" value="0.1, 0.2, 0.3" />
     <input name="roughness" type="float" value="0.5" />
     <input name="energyCompensation" type="float" value="1.0" />
-    <input name="lobeName" type="string" value="diffuse" />
-    <input name="matte" type="string" value="" />
   </LamaDiffuse>
   <surface name="LamaDiffuseSurface" type="surfaceshader">
     <input name="bsdf" type="BSDF" nodename="LamaDiffuse" />

From 9f0af022b0b749dedabd7035151451e4474c0654 Mon Sep 17 00:00:00 2001
From: mkuo-lucasfilm <mkuo@lucasfilm.com>
Date: Mon, 10 Jun 2024 16:59:42 -0700
Subject: [PATCH 21/48] Add energy compensation to LamaDiffuse (#1882)

---
 libraries/bxdf/lama/lama_diffuse.mtlx | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/libraries/bxdf/lama/lama_diffuse.mtlx b/libraries/bxdf/lama/lama_diffuse.mtlx
index dee56af3e0..358c728e39 100644
--- a/libraries/bxdf/lama/lama_diffuse.mtlx
+++ b/libraries/bxdf/lama/lama_diffuse.mtlx
@@ -21,12 +21,25 @@
       <input name="in1" type="float" nodename="roughness_squared" />
       <input name="in2" type="float" value="0.5" />
     </multiply>
-    <oren_nayar_diffuse_bsdf name="oren_nayar" type="BSDF">
+    <oren_nayar_diffuse_bsdf name="oren_nayar_uncompensated" type="BSDF">
       <input name="weight" type="float" value="1.0" />
       <input name="color" type="color3" interfacename="color" />
       <input name="roughness" type="float" nodename="half_roughness_squared" />
       <input name="normal" type="vector3" interfacename="normal" />
+      <input name="energy_compensation" type="boolean" value="false" />
     </oren_nayar_diffuse_bsdf>
+    <oren_nayar_diffuse_bsdf name="oren_nayar_compensated" type="BSDF">
+      <input name="weight" type="float" value="1.0" />
+      <input name="color" type="color3" interfacename="color" />
+      <input name="roughness" type="float" nodename="half_roughness_squared" />
+      <input name="normal" type="vector3" interfacename="normal" />
+      <input name="energy_compensation" type="boolean" value="true" />
+    </oren_nayar_diffuse_bsdf>
+    <mix name="oren_nayar" type="BSDF">
+      <input name="fg" type="BSDF" nodename="oren_nayar_compensated" />
+      <input name="bg" type="BSDF" nodename="oren_nayar_uncompensated" />
+      <input name="mix" type="float" interfacename="energyCompensation" />
+    </mix>
     <output name="out" type="BSDF" nodename="oren_nayar" />
   </nodegraph>
 </materialx>

From dd27a509f165cc14e2f60beb4fe0ea9d76c13f33 Mon Sep 17 00:00:00 2001
From: Bernard Kwok <kwokcb@gmail.com>
Date: Mon, 10 Jun 2024 20:17:55 -0400
Subject: [PATCH 22/48] Improve robustness of input connections (#1879)

This change adds detection for the case where both a connection and a value are specified, adds and update connection APIs to enforce not creating invalid documents.

- Adds a new `Input::setConnectedInterfaceName()` interface which clears the `value` attributes to avoid accidently creating invalid documents.
- Updates other existing connection APIs to also clear the `value` attribute appropriately.
- Updates validation on an input to mark when both a value and a connection are created.
---
 .../JsMaterialXCore/JsInterface.cpp           |  1 +
 source/MaterialXCore/Interface.cpp            | 36 +++++++++++--
 source/MaterialXCore/Interface.h              |  4 ++
 source/MaterialXGraphEditor/Graph.cpp         | 24 ++++-----
 source/MaterialXTest/MaterialXCore/Node.cpp   | 51 +++++++++++++++++++
 .../PyMaterialXCore/PyInterface.cpp           |  1 +
 6 files changed, 101 insertions(+), 16 deletions(-)

diff --git a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp
index 92bfe75bcd..d2620000b6 100644
--- a/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp
+++ b/source/JsMaterialX/JsMaterialXCore/JsInterface.cpp
@@ -48,6 +48,7 @@ EMSCRIPTEN_BINDINGS(interface)
         .function("setConnectedOutput", &mx::Input::setConnectedOutput)
         .function("getConnectedOutput", &mx::Input::getConnectedOutput)
         .function("getInterfaceInput", &mx::Input::getInterfaceInput)
+        .function("setConnectedInterfaceName", &mx::Input::setConnectedInterfaceName)
         .class_property("CATEGORY", &mx::Input::CATEGORY)
         .class_property("DEFAULT_GEOM_PROP_ATTRIBUTE", &mx::Input::DEFAULT_GEOM_PROP_ATTRIBUTE);
 
diff --git a/source/MaterialXCore/Interface.cpp b/source/MaterialXCore/Interface.cpp
index 9259e56dd6..6b200a8dcf 100644
--- a/source/MaterialXCore/Interface.cpp
+++ b/source/MaterialXCore/Interface.cpp
@@ -31,6 +31,9 @@ void PortElement::setConnectedNode(ConstNodePtr node)
     if (node)
     {
         setNodeName(node->getName());
+        removeAttribute(VALUE_ATTRIBUTE);
+        removeAttribute(NODE_GRAPH_ATTRIBUTE);
+        removeAttribute(INTERFACE_NAME_ATTRIBUTE);
     }
     else
     {
@@ -60,6 +63,8 @@ void PortElement::setConnectedOutput(ConstOutputPtr output)
             setNodeName(parent->getName());
             removeAttribute(NODE_GRAPH_ATTRIBUTE);
         }
+
+        removeAttribute(VALUE_ATTRIBUTE);
     }
     else
     {
@@ -235,6 +240,26 @@ NodePtr Input::getConnectedNode() const
     return PortElement::getConnectedNode();
 }
 
+void Input::setConnectedInterfaceName(const string& interfaceName)
+{
+    if (!interfaceName.empty())
+    {
+        ConstGraphElementPtr graph = getAncestorOfType<GraphElement>();
+        if (graph && graph->getInput(interfaceName))
+        {
+            setInterfaceName(interfaceName);
+            removeAttribute(VALUE_ATTRIBUTE);
+            removeAttribute(OUTPUT_ATTRIBUTE);
+            removeAttribute(NODE_GRAPH_ATTRIBUTE);
+            removeAttribute(NODE_NAME_ATTRIBUTE);
+        }
+    }
+    else
+    {
+        removeAttribute(INTERFACE_NAME_ATTRIBUTE);
+    }
+}
+
 InputPtr Input::getInterfaceInput() const
 {
     if (hasInterfaceName())
@@ -271,9 +296,14 @@ bool Input::validate(string* message) const
     }
     if (parent->isA<Node>())
     {
-        bool hasValueBinding = hasValue();
-        bool hasConnection = hasNodeName() || hasNodeGraphString() || hasOutputString() || hasInterfaceName();
-        validateRequire(hasValueBinding || hasConnection, res, message, "Node input binds no value or connection");
+        int numBindings = 0;
+        if (hasValue()) numBindings++;
+        if (hasNodeName()) numBindings++;
+        if (hasNodeGraphString()) numBindings++;
+        if (hasInterfaceName()) numBindings++;
+        if (hasOutputString() && !(hasNodeName() || hasNodeGraphString()))  numBindings++;
+        validateRequire(numBindings, res, message, "Node input binds no value or connection");
+        validateRequire(numBindings <= 1, res, message, "Node input has too many bindings");
     }
     else if (parent->isA<NodeGraph>())
     {
diff --git a/source/MaterialXCore/Interface.h b/source/MaterialXCore/Interface.h
index a7212bee9b..c19bc82da5 100644
--- a/source/MaterialXCore/Interface.h
+++ b/source/MaterialXCore/Interface.h
@@ -211,6 +211,10 @@ class MX_CORE_API Input : public PortElement
     /// Return the node, if any, to which this input is connected.
     NodePtr getConnectedNode() const override;
 
+    /// Connects this input to a corresponding interface with the given name.
+    /// If the interface name specified is an empty string then any existing connection is removed.
+    void setConnectedInterfaceName(const string& interfaceName);
+
     /// Return the input on the parent graph corresponding to the interface name
     /// for this input.
     InputPtr getInterfaceInput() const;
diff --git a/source/MaterialXGraphEditor/Graph.cpp b/source/MaterialXGraphEditor/Graph.cpp
index 64614a02cb..9b84698c4b 100644
--- a/source/MaterialXGraphEditor/Graph.cpp
+++ b/source/MaterialXGraphEditor/Graph.cpp
@@ -1834,7 +1834,7 @@ void Graph::copyInputs()
                             else if (upNode->getInput())
                             {
 
-                                copyNode->inputPins[count]->_input->setInterfaceName(upNode->getName());
+                                copyNode->inputPins[count]->_input->setConnectedInterfaceName(upNode->getName());
                             }
                             else
                             {
@@ -1860,7 +1860,7 @@ void Graph::copyInputs()
                         {
                             if (upNode->getInput())
                             {
-                                copyNode->inputPins[count]->_input->setInterfaceName(upNode->getName());
+                                copyNode->inputPins[count]->_input->setConnectedInterfaceName(upNode->getName());
                             }
                             else
                             {
@@ -1869,7 +1869,6 @@ void Graph::copyInputs()
                         }
 
                         copyNode->inputPins[count]->setConnected(true);
-                        copyNode->inputPins[count]->_input->removeAttribute(mx::ValueElement::VALUE_ATTRIBUTE);
                     }
                     else if (copyNode->getOutput() != nullptr)
                     {
@@ -1885,7 +1884,7 @@ void Graph::copyInputs()
                 {
                     if (pin->_input->getInterfaceInput())
                     {
-                        copyNode->inputPins[count]->_input->removeAttribute(mx::ValueElement::INTERFACE_NAME_ATTRIBUTE);
+                        copyNode->inputPins[count]->_input->setConnectedInterfaceName(mx::EMPTY_STRING);
                     }
                     copyNode->inputPins[count]->setConnected(false);
                     setDefaults(copyNode->inputPins[count]->_input);
@@ -2625,7 +2624,7 @@ void Graph::addLink(ed::PinId startPinId, ed::PinId endPinId)
                         }
                         else if (uiUpNode->getInput() != nullptr)
                         {
-                            pin->_input->setInterfaceName(uiUpNode->getName());
+                            pin->_input->setConnectedInterfaceName(uiUpNode->getName());
                         }
                         else
                         {
@@ -2651,7 +2650,7 @@ void Graph::addLink(ed::PinId startPinId, ed::PinId endPinId)
                     {
                         if (uiUpNode->getInput())
                         {
-                            pin->_input->setInterfaceName(uiUpNode->getName());
+                            pin->_input->setConnectedInterfaceName(uiUpNode->getName());
                         }
                         else
                         {
@@ -2697,7 +2696,6 @@ void Graph::addLink(ed::PinId startPinId, ed::PinId endPinId)
                     }
 
                     pin->setConnected(true);
-                    pin->_input->removeAttribute(mx::ValueElement::VALUE_ATTRIBUTE);
                     connectingInput = pin->_input;
                     break;
                 }
@@ -2777,7 +2775,7 @@ void Graph::deleteLinkInfo(int startAttr, int endAttr)
                 if (_graphNodes[upNode]->getInput())
                 {
                     // Remove interface value in order to set the default of the input
-                    pin->_input->removeAttribute(mx::ValueElement::INTERFACE_NAME_ATTRIBUTE);
+                    pin->_input->setConnectedInterfaceName(mx::EMPTY_STRING);
                     setDefaults(pin->_input);
                     setDefaults(_graphNodes[upNode]->getInput());
                 }
@@ -2810,7 +2808,7 @@ void Graph::deleteLinkInfo(int startAttr, int endAttr)
                 removeEdge(downNode, upNode, pin);
                 if (_graphNodes[upNode]->getInput())
                 {
-                    _graphNodes[downNode]->getNodeGraph()->getInput(pin->_name)->removeAttribute(mx::ValueElement::INTERFACE_NAME_ATTRIBUTE);
+                    _graphNodes[downNode]->getNodeGraph()->getInput(pin->_name)->setConnectedInterfaceName(mx::EMPTY_STRING);
                     setDefaults(_graphNodes[upNode]->getInput());
                 }
                 for (UiPinPtr connect : pin->_connections)
@@ -2906,8 +2904,8 @@ void Graph::deleteNode(UiNodePtr node)
                 }
                 if (node->getInput())
                 {
-                    // Remove interface value in order to set the default of the input
-                    pin->_input->removeAttribute(mx::ValueElement::INTERFACE_NAME_ATTRIBUTE);
+                    // Remove interface in order to set the default of the input
+                    pin->_input->setConnectedInterfaceName(mx::EMPTY_STRING);
                     setDefaults(pin->_input);
                     setDefaults(node->getInput());
                 }
@@ -2916,7 +2914,7 @@ void Graph::deleteNode(UiNodePtr node)
             {
                 if (node->getInput())
                 {
-                    pin->_pinNode->getNodeGraph()->getInput(pin->_name)->removeAttribute(mx::ValueElement::INTERFACE_NAME_ATTRIBUTE);
+                    pin->_pinNode->getNodeGraph()->getInput(pin->_name)->setConnectedInterfaceName(mx::EMPTY_STRING);
                     setDefaults(node->getInput());
                 }
                 pin->_input->setConnectedNode(nullptr);
@@ -3320,7 +3318,7 @@ void Graph::propertyEditor()
                                 {
                                     _currUiNode->getInput()->setName(name);
                                     mx::ValuePtr val = _currUiNode->getInput()->getValue();
-                                    input->setInterfaceName(name);
+                                    input->setConnectedInterfaceName(name);
                                     mx::InputPtr pt = input->getInterfaceInput();
                                 }
                             }
diff --git a/source/MaterialXTest/MaterialXCore/Node.cpp b/source/MaterialXTest/MaterialXCore/Node.cpp
index 57e1cb44cc..b72cd65328 100644
--- a/source/MaterialXTest/MaterialXCore/Node.cpp
+++ b/source/MaterialXTest/MaterialXCore/Node.cpp
@@ -32,6 +32,57 @@ bool isTopologicalOrder(const std::vector<mx::ElementPtr>& elems)
     return true;
 }
 
+TEST_CASE("Interface Input Validation", "[node]")
+{
+    std::string validationErrors;
+
+    mx::FileSearchPath searchPath = mx::getDefaultDataSearchPath();
+    mx::DocumentPtr doc = mx::createDocument();
+    mx::loadLibraries({ "libraries" }, searchPath, doc);
+
+    // Test inside nodegraph
+    mx::GraphElementPtr nodegraph = doc->addNodeGraph("graph1");
+
+    std::vector<mx::GraphElementPtr> graphs = { doc, nodegraph };
+    for (auto graph : graphs)
+    {
+        mx::InputPtr graphInput = graph->addInput(mx::EMPTY_STRING, "color3");
+        mx::NodePtr addNode = graph->addNode("add", mx::EMPTY_STRING, "color3");
+        mx::InputPtr addInput = addNode->addInput("in1");
+
+        addInput->setValueString("3, 3, 3");
+        addInput->setInterfaceName(graphInput->getName());
+        bool valid = doc->validate(&validationErrors);
+        if (!valid)
+        {
+            INFO(validationErrors);
+        }
+        REQUIRE(!valid);
+
+        addInput->setConnectedInterfaceName(graphInput->getName());
+        mx::InputPtr interfaceInput = addInput->getInterfaceInput();
+        REQUIRE((interfaceInput && interfaceInput->getNamePath() == graphInput->getNamePath()));
+        REQUIRE(!addInput->getValue());
+        valid = doc->validate(&validationErrors);
+        if (!valid)
+        {
+            INFO(validationErrors);
+        }
+        REQUIRE(valid);
+
+        addInput->setConnectedInterfaceName(mx::EMPTY_STRING);
+        addInput->setValueString("2, 2, 2");
+        interfaceInput = addInput->getInterfaceInput();
+        REQUIRE(!interfaceInput);
+        valid = doc->validate(&validationErrors);
+        if (!valid)
+        {
+            INFO(validationErrors);
+        }
+        REQUIRE(valid);
+    }
+}
+
 TEST_CASE("Node", "[node]")
 {
     // Create a document.
diff --git a/source/PyMaterialX/PyMaterialXCore/PyInterface.cpp b/source/PyMaterialX/PyMaterialXCore/PyInterface.cpp
index b35144dd68..42e978d282 100644
--- a/source/PyMaterialX/PyMaterialXCore/PyInterface.cpp
+++ b/source/PyMaterialX/PyMaterialXCore/PyInterface.cpp
@@ -37,6 +37,7 @@ void bindPyInterface(py::module& mod)
         .def("getDefaultGeomPropString", &mx::Input::getDefaultGeomPropString)
         .def("getDefaultGeomProp", &mx::Input::getDefaultGeomProp)
         .def("getConnectedNode", &mx::Input::getConnectedNode)
+        .def("setConnectedInterfaceName", &mx::Input::setConnectedInterfaceName)
         .def("getInterfaceInput", &mx::Input::getInterfaceInput)
         .def_readonly_static("CATEGORY", &mx::Input::CATEGORY);
 

From 3af0077a547584bfe1fa21db3a07b5d5e33ee320 Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Tue, 11 Jun 2024 09:04:43 -0700
Subject: [PATCH 23/48] Add mode input to sheen_bsdf (#1880)

This changelist adds a `mode` input to `sheen_bsdf`, allowing the user to select between Conty-Kulla and Zeltner sheen models.

The Zeltner model is initially supported only in GLSL, ESSL, and MSL, integrating recent work from Stephen Hill, with OSL and MDL falling back to the Conty-Kulla model for now.

The graph implementation of `open_pbr_surface` has been updated to take advantage of this new feature, and the `open_pbr_velvet.mtlx` example has been adjusted to take the visual behavior of Zeltner sheen into account.
---
 libraries/bxdf/open_pbr_surface.mtlx          |  2 +-
 libraries/pbrlib/genglsl/mx_sheen_bsdf.glsl   | 88 +++++++------------
 libraries/pbrlib/pbrlib_defs.mtlx             |  1 +
 .../Examples/OpenPbr/open_pbr_velvet.mtlx     |  2 +-
 4 files changed, 34 insertions(+), 59 deletions(-)

diff --git a/libraries/bxdf/open_pbr_surface.mtlx b/libraries/bxdf/open_pbr_surface.mtlx
index d57a18a6ec..6e4c0d5eee 100644
--- a/libraries/bxdf/open_pbr_surface.mtlx
+++ b/libraries/bxdf/open_pbr_surface.mtlx
@@ -558,12 +558,12 @@
     </layer>
 
     <!-- Fuzz Layer -->
-    <!-- TODO: Add a new BSDF node for the selected fuzz model in OpenPBR -->
     <sheen_bsdf name="fuzz_bsdf" type="BSDF">
       <input name="weight" type="float" interfacename="fuzz_weight" />
       <input name="color" type="color3" interfacename="fuzz_color" />
       <input name="roughness" type="float" interfacename="fuzz_roughness" />
       <input name="normal" type="vector3" interfacename="geometry_normal" />
+      <input name="mode" type="string" value="zeltner" />
     </sheen_bsdf>
     <layer name="fuzz_layer" type="BSDF">
       <input name="top" type="BSDF" nodename="fuzz_bsdf" />
diff --git a/libraries/pbrlib/genglsl/mx_sheen_bsdf.glsl b/libraries/pbrlib/genglsl/mx_sheen_bsdf.glsl
index 82afe0e328..211f22355e 100644
--- a/libraries/pbrlib/genglsl/mx_sheen_bsdf.glsl
+++ b/libraries/pbrlib/genglsl/mx_sheen_bsdf.glsl
@@ -1,10 +1,6 @@
 #include "lib/mx_microfacet_sheen.glsl"
 
-#define SHEEN_METHOD 0
-
-#if SHEEN_METHOD == 0
-
-void mx_sheen_bsdf_reflection(vec3 L, vec3 V, vec3 P, float occlusion, float weight, vec3 color, float roughness, vec3 N, inout BSDF bsdf)
+void mx_sheen_bsdf_reflection(vec3 L, vec3 V, vec3 P, float occlusion, float weight, vec3 color, float roughness, vec3 N, int mode, inout BSDF bsdf)
 {
     if (weight < M_FLOAT_EPS)
     {
@@ -12,43 +8,35 @@ void mx_sheen_bsdf_reflection(vec3 L, vec3 V, vec3 P, float occlusion, float wei
     }
 
     N = mx_forward_facing_normal(N, V);
-
-    vec3 H = normalize(L + V);
-
-    float NdotL = clamp(dot(N, L), M_FLOAT_EPS, 1.0);
     float NdotV = clamp(dot(N, V), M_FLOAT_EPS, 1.0);
-    float NdotH = clamp(dot(N, H), M_FLOAT_EPS, 1.0);
-
-    vec3 fr = color * mx_imageworks_sheen_brdf(NdotL, NdotV, NdotH, roughness);
-    float dirAlbedo = mx_imageworks_sheen_dir_albedo(NdotV, roughness);
-    bsdf.throughput = vec3(1.0 - dirAlbedo * weight);
-
-    // We need to include NdotL from the light integral here
-    // as in this case it's not cancelled out by the BRDF denominator.
-    bsdf.response = fr * NdotL * occlusion * weight;
-}
 
-void mx_sheen_bsdf_indirect(vec3 V, float weight, vec3 color, float roughness, vec3 N, inout BSDF bsdf)
-{
-    if (weight < M_FLOAT_EPS)
+    if (mode == 0)
     {
-        return;
-    }
+        vec3 H = normalize(L + V);
 
-    N = mx_forward_facing_normal(N, V);
+        float NdotL = clamp(dot(N, L), M_FLOAT_EPS, 1.0);
+        float NdotH = clamp(dot(N, H), M_FLOAT_EPS, 1.0);
 
-    float NdotV = clamp(dot(N, V), M_FLOAT_EPS, 1.0);
+        vec3 fr = color * mx_imageworks_sheen_brdf(NdotL, NdotV, NdotH, roughness);
+        float dirAlbedo = mx_imageworks_sheen_dir_albedo(NdotV, roughness);
+        bsdf.throughput = vec3(1.0 - dirAlbedo * weight);
 
-    float dirAlbedo = mx_imageworks_sheen_dir_albedo(NdotV, roughness);
-    bsdf.throughput = vec3(1.0 - dirAlbedo * weight);
+        // We need to include NdotL from the light integral here
+        // as in this case it's not cancelled out by the BRDF denominator.
+        bsdf.response = fr * NdotL * occlusion * weight;
+    }
+    else
+    {
+        roughness = clamp(roughness, 0.01, 1.0); // Clamp to range of original impl.
 
-    vec3 Li = mx_environment_irradiance(N);
-    bsdf.response = Li * color * dirAlbedo * weight;
+        vec3 fr = color * mx_zeltner_sheen_brdf(L, V, N, NdotV, roughness);
+        float dirAlbedo = mx_zeltner_sheen_dir_albedo(NdotV, roughness);
+        bsdf.throughput = vec3(1.0 - dirAlbedo * weight);
+        bsdf.response = dirAlbedo * fr * occlusion * weight;
+    }
 }
 
-#elif SHEEN_METHOD == 1
-
-void mx_sheen_bsdf_reflection(vec3 L, vec3 V, vec3 P, float occlusion, float weight, vec3 color, float roughness, vec3 N, inout BSDF bsdf)
+void mx_sheen_bsdf_indirect(vec3 V, float weight, vec3 color, float roughness, vec3 N, int mode, inout BSDF bsdf)
 {
     if (weight < M_FLOAT_EPS)
     {
@@ -56,34 +44,20 @@ void mx_sheen_bsdf_reflection(vec3 L, vec3 V, vec3 P, float occlusion, float wei
     }
 
     N = mx_forward_facing_normal(N, V);
+    float NdotV = clamp(dot(N, V), M_FLOAT_EPS, 1.0);
 
-    float NdotV = min(dot(N, V), 1.0);
-    roughness = clamp(roughness, 0.01, 1.0); // Clamp to range of original impl.
-
-    vec3 fr = color * mx_zeltner_sheen_brdf(L, V, N, NdotV, roughness);
-    float dirAlbedo = mx_zeltner_sheen_dir_albedo(NdotV, roughness);
-    bsdf.throughput = vec3(1.0 - dirAlbedo * weight);
-
-    bsdf.response = dirAlbedo * fr * occlusion * weight;
-}
-
-void mx_sheen_bsdf_indirect(vec3 V, float weight, vec3 color, float roughness, vec3 N, inout BSDF bsdf)
-{
-    if (weight < M_FLOAT_EPS)
+    float dirAlbedo;
+    if (mode == 0)
     {
-        return;
+        dirAlbedo = mx_imageworks_sheen_dir_albedo(NdotV, roughness);
+    }
+    else
+    {
+        roughness = clamp(roughness, 0.01, 1.0); // Clamp to range of original impl.
+        dirAlbedo = mx_zeltner_sheen_dir_albedo(NdotV, roughness);
     }
-
-    N = mx_forward_facing_normal(N, V);
-
-    float NdotV = min(dot(N, V), 1.0);
-    roughness = clamp(roughness, 0.01, 1.0); // Clamp to range of original impl.
-
-    float dirAlbedo = mx_zeltner_sheen_dir_albedo(NdotV, roughness);
-    bsdf.throughput = vec3(1.0 - dirAlbedo * weight);
 
     vec3 Li = mx_environment_irradiance(N);
+    bsdf.throughput = vec3(1.0 - dirAlbedo * weight);
     bsdf.response = Li * color * dirAlbedo * weight;
 }
-
-#endif
diff --git a/libraries/pbrlib/pbrlib_defs.mtlx b/libraries/pbrlib/pbrlib_defs.mtlx
index eebe56b1de..b4184a2cd4 100644
--- a/libraries/pbrlib/pbrlib_defs.mtlx
+++ b/libraries/pbrlib/pbrlib_defs.mtlx
@@ -132,6 +132,7 @@
     <input name="color" type="color3" value="1.0, 1.0, 1.0" />
     <input name="roughness" type="float" value="0.3" />
     <input name="normal" type="vector3" defaultgeomprop="Nworld" />
+    <input name="mode" type="string" value="conty_kulla" enum="conty_kulla, zeltner" uniform="true" />
     <output name="out" type="BSDF" />
   </nodedef>
 
diff --git a/resources/Materials/Examples/OpenPbr/open_pbr_velvet.mtlx b/resources/Materials/Examples/OpenPbr/open_pbr_velvet.mtlx
index bf81e0821f..6fbc907f3d 100644
--- a/resources/Materials/Examples/OpenPbr/open_pbr_velvet.mtlx
+++ b/resources/Materials/Examples/OpenPbr/open_pbr_velvet.mtlx
@@ -8,6 +8,6 @@
     <input name="specular_roughness" type="float" value="0.8" />
     <input name="fuzz_weight" type="float" value="1" />
     <input name="fuzz_color" type="color3" value="0.4, 0.4, 0.4" />
-    <input name="fuzz_roughness" type="float" value="0.2" />
+    <input name="fuzz_roughness" type="float" value="0.5" />
   </open_pbr_surface>
 </materialx>

From 5eb710be52c2a92bf53b1e85bfc5c417af714311 Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Tue, 11 Jun 2024 09:55:46 -0700
Subject: [PATCH 24/48] Update thin_film_ior default in OpenPBR

This changelist updates the default value of `thin_film_ior` in OpenPBR from 1.5 to 1.4, tracking the latest work in the OpenPBR repository.
---
 libraries/bxdf/open_pbr_surface.mtlx                       | 2 +-
 resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/libraries/bxdf/open_pbr_surface.mtlx b/libraries/bxdf/open_pbr_surface.mtlx
index 6e4c0d5eee..665e369f4b 100644
--- a/libraries/bxdf/open_pbr_surface.mtlx
+++ b/libraries/bxdf/open_pbr_surface.mtlx
@@ -69,7 +69,7 @@
            doc="Coverage weight of the thin-film. Use for materials such as multi-tone car paint or soap bubbles." />
     <input name="thin_film_thickness" type="float" value="0.5" uimin="0.0" uisoftmax="1.0" uiname="Thin Film Thickness" uifolder="Thin Film" uiadvanced="true"
            doc="The thickness of the thin-film layer on the base (in micrometers)." />
-    <input name="thin_film_ior" type="float" value="1.5" uimin="0.0" uisoftmin="1.0" uisoftmax="3.0" uiname="Thin Film Index of Refraction" uifolder="Thin Film" uiadvanced="true"
+    <input name="thin_film_ior" type="float" value="1.4" uimin="0.0" uisoftmin="1.0" uisoftmax="3.0" uiname="Thin Film Index of Refraction" uifolder="Thin Film" uiadvanced="true"
            doc="The index of refraction of the thin-film." />
     <input name="emission_luminance" type="float" value="0.0" uimin="0.0" uisoftmax="1000.0" uiname="Emission Luminance" uifolder="Emission"
            doc="The amount of emitted light, as a luminance in nits." />
diff --git a/resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx b/resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx
index 756eda8ab6..8125541a99 100644
--- a/resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx
+++ b/resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx
@@ -37,7 +37,7 @@
     <input name="coat_darkening" type="float" value="1.0" />
     <input name="thin_film_weight" type="float" value="0" />
     <input name="thin_film_thickness" type="float" value="0.5" />
-    <input name="thin_film_ior" type="float" value="1.5" />
+    <input name="thin_film_ior" type="float" value="1.4" />
     <input name="emission_luminance" type="float" value="0.0" />
     <input name="emission_color" type="color3" value="1, 1, 1" />
     <input name="geometry_opacity" type="float" value="1" />

From c979f5d2abbbe7ab43499329d1573052df71ecf9 Mon Sep 17 00:00:00 2001
From: mkuo-lucasfilm <mkuo@lucasfilm.com>
Date: Wed, 12 Jun 2024 11:57:55 -0700
Subject: [PATCH 25/48] Update LamaConductor Node (#1885)

1. Removed the iridescenceThickness and iridescenceIOR inputs, as these are not present in the RenderMan definition of the node.
2. Removed the exteriorIor input, as we expect relative IOR to be computed by the renderer.
---
 libraries/bxdf/lama/lama_conductor.mtlx       | 32 ++-----------------
 .../pbrlib/surfaceshader/lama_tests.mtlx      |  3 --
 2 files changed, 2 insertions(+), 33 deletions(-)

diff --git a/libraries/bxdf/lama/lama_conductor.mtlx b/libraries/bxdf/lama/lama_conductor.mtlx
index 4e2bdb1ea0..07a7b7fcd6 100644
--- a/libraries/bxdf/lama/lama_conductor.mtlx
+++ b/libraries/bxdf/lama/lama_conductor.mtlx
@@ -23,24 +23,12 @@
            doc="Overrides the surface tangent as the anisotropy direction." />
     <input name="anisotropyRotation" type="float" value="0.0" uiname="Rotation" uifolder="Anisotropy"
            doc="Rotates the anisotropy direction (possibly overriden by the previous attribute) around the normal, from 0 to 360 degrees." />
-    <input name="iridescenceThickness" type="float" value="0.0" uimin="0.0" uisoftmax="200.0" uiname="Thickness" uifolder="Iridescence"
-           doc="Thin film thickness in nanometers, driving the iridescent effect." />
-    <input name="iridescenceIOR" type="float" value="1.5" uimin="1.0" uimax="3.0" uiname="IOR" uifolder="Iridescence"
-           doc="Thin film index of refraction, driving the iridescent effect." />
-    <input name="exteriorIOR" type="float" value="1.0" uimin="1.0" uimax="3.0" uiname="Exterior IOR" uifolder="Advanced"
-           doc="Defines what the IOR of the exterior medium is (can be either the outside medium, eg. air or water, or in case of a layered material, the top layer medium, like plexiglass or varnish)." />
     <output name="out" type="BSDF" />
   </nodedef>
 
   <nodegraph name="IMPL_lama_conductor" nodedef="ND_lama_conductor">
 
     <!-- IOR -->
-    <ifgreater name="exterior_ior_switch" type="float">
-      <input name="in1" type="float" interfacename="iridescenceIOR" />
-      <input name="in2" type="float" interfacename="exteriorIOR" />
-      <input name="value1" type="float" interfacename="iridescenceThickness" />
-      <input name="value2" type="float" value="0" />
-    </ifgreater>
     <artistic_ior name="artistic_ior" type="multioutput">
       <input name="reflectivity" type="color3" interfacename="reflectivity" />
       <input name="edge_color" type="color3" interfacename="edgeColor" />
@@ -61,14 +49,6 @@
       <input name="in2" type="color3" nodename="artistic_ior" output="extinction" />
       <input name="which" type="integer" interfacename="fresnelMode" />
     </switch>
-    <divide name="relative_eta" type="color3">
-      <input name="in1" type="color3" nodename="eta_switch" />
-      <input name="in2" type="float" nodename="exterior_ior_switch" />
-    </divide>
-    <divide name="relative_kappa" type="color3">
-      <input name="in1" type="color3" nodename="kappa_switch" />
-      <input name="in2" type="float" nodename="exterior_ior_switch" />
-    </divide>
 
     <!-- Roughness -->
     <subtract name="roughness_inverse" type="float">
@@ -122,22 +102,14 @@
     <!-- BRDF -->
     <conductor_bsdf name="conductor_bsdf" type="BSDF">
       <input name="weight" type="float" value="1.0" />
-      <input name="ior" type="color3" nodename="relative_eta" />
-      <input name="extinction" type="color3" nodename="relative_kappa" />
+      <input name="ior" type="color3" nodename="eta_switch" />
+      <input name="extinction" type="color3" nodename="kappa_switch" />
       <input name="roughness" type="vector2" nodename="roughness_anisotropic_squared_clamped" />
       <input name="normal" type="vector3" interfacename="normal" />
       <input name="tangent" type="vector3" nodename="tangent_rotate_normalize" />
       <input name="distribution" type="string" value="ggx" />
-      <input name="thinfilm_thickness" type="float" interfacename="iridescenceThickness" />
-      <input name="thinfilm_ior" type="float" nodename="iridescence_relative_ior" />
     </conductor_bsdf>
 
-    <!-- BRDF + Thin film -->
-    <divide name="iridescence_relative_ior" type="float">
-      <input name="in1" type="float" interfacename="iridescenceIOR" />
-      <input name="in2" type="float" interfacename="exteriorIOR" />
-    </divide>
-
     <!-- Layered BRDF -->
 
     <!-- Tinted BRDF -->
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama_tests.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama_tests.mtlx
index 7c8ec722d2..e907eae290 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama_tests.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama_tests.mtlx
@@ -12,9 +12,6 @@
     <input name="roughness" type="float" value="0.1" />
     <input name="anisotropy" type="float" value="0.0" />
     <input name="anisotropyRotation" type="float" value="0.0" />
-    <input name="iridescenceThickness" type="float" value="0.0" />
-    <input name="iridescenceIOR" type="float" value="1.5" />
-    <input name="exteriorIOR" type="float" value="1.0" />
   </LamaConductor>
   <surface name="LamaConductorSurface" type="surfaceshader">
     <input name="bsdf" type="BSDF" nodename="LamaConductor" />

From 382d499012096859787b29a2238f0f3ea903e1fe Mon Sep 17 00:00:00 2001
From: mkuo-lucasfilm <mkuo@lucasfilm.com>
Date: Wed, 12 Jun 2024 15:48:12 -0700
Subject: [PATCH 26/48] Update Lama Testing Suite (#1887)

Divided lama_tests document into individual test documents for each node to aid in testing
---
 .../pbrlib/surfaceshader/lama/lama_add.mtlx   |  67 ++++++
 .../surfaceshader/lama/lama_conductor.mtlx    |  23 +++
 .../surfaceshader/lama/lama_dielectric.mtlx   |  26 +++
 .../surfaceshader/lama/lama_diffuse.mtlx      |  17 ++
 .../surfaceshader/lama/lama_emission.mtlx     |  15 ++
 .../pbrlib/surfaceshader/lama/lama_layer.mtlx |  50 +++++
 .../pbrlib/surfaceshader/lama/lama_mix.mtlx   |  67 ++++++
 .../pbrlib/surfaceshader/lama/lama_sheen.mtlx |  16 ++
 .../pbrlib/surfaceshader/lama/lama_sss.mtlx   |  23 +++
 .../surfaceshader/lama/lama_translucent.mtlx  |  19 ++
 .../pbrlib/surfaceshader/lama_tests.mtlx      | 194 ------------------
 11 files changed, 323 insertions(+), 194 deletions(-)
 create mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_add.mtlx
 create mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_conductor.mtlx
 create mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_dielectric.mtlx
 create mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_diffuse.mtlx
 create mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_emission.mtlx
 create mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_layer.mtlx
 create mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_mix.mtlx
 create mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sheen.mtlx
 create mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sss.mtlx
 create mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_translucent.mtlx
 delete mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama_tests.mtlx

diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_add.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_add.mtlx
new file mode 100644
index 0000000000..4dd9c18323
--- /dev/null
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_add.mtlx
@@ -0,0 +1,67 @@
+<?xml version="1.0"?>
+<materialx version="1.38" colorspace="acescg">
+
+  <!-- LamaConductor -->
+  <LamaConductor name="LamaConductor" type="BSDF">
+    <input name="tint" type="color3" value="1, 1, 1" />
+    <input name="fresnelMode" type="integer" value="0" />
+    <input name="IOR" type="vector3" value="0.180000007153,0.419999986887,1.37000000477" />
+    <input name="extinction" type="vector3" value="3.42000007629,2.34999990463,1.76999998093" />
+    <input name="reflectivity" type="color3" value="0.9450, 0.7772, 0.3737" />
+    <input name="edgeColor" type="color3" value="0.9979, 0.9813, 0.7523" />
+    <input name="roughness" type="float" value="0.1" />
+    <input name="anisotropy" type="float" value="0.0" />
+    <input name="anisotropyRotation" type="float" value="0.0" />
+  </LamaConductor>
+
+  <!-- LamaDielectric -->
+  <LamaDielectric name="LamaDielectric" type="BSDF">
+    <input name="reflectionTint" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="transmissionTint" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="fresnelMode" type="integer" value="0" />
+    <input name="IOR" type="float" value="1.5" />
+    <input name="reflectivity" type="float" value="0.04" />
+    <input name="roughness" type="float" value="0.1" />
+    <input name="anisotropy" type="float" value="0.0" />
+    <input name="rotation" type="float" value="0.0" />
+    <input name="absorptionColor" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="absorptionRadius" type="float" value="1.0" />
+    <input name="scatterColor" type="color3" value="0.0, 0.0, 0.0" />
+    <input name="scatterAnisotropy" type="float" value="0.0" />
+  </LamaDielectric>
+
+  <!-- LamaAdd with BSDFs -->
+  <LamaAdd name="LamaAddBSDF" type="BSDF">
+    <input name="material1" type="BSDF" nodename="LamaConductor" />
+    <input name="material2" type="BSDF" nodename="LamaDielectric" />
+    <input name="weight1" type="float" value="0.5" />
+    <input name="weight2" type="float" value="0.5" />
+  </LamaAdd>
+  <surface name="LamaAddBSDFSurface" type="surfaceshader">
+    <input name="bsdf" type="BSDF" nodename="LamaAddBSDF" />
+  </surface>
+  <surfacematerial name="LamaAddBSDFTest" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaAddBSDFSurface" />
+  </surfacematerial>
+
+  <!-- LamaAdd with EDFs -->
+  <LamaEmission name="LamaEmission1" type="EDF">
+    <input name="color" type="color3" value="1.0, 1.0, 0.0" />
+  </LamaEmission>
+  <LamaEmission name="LamaEmission2" type="EDF">
+    <input name="color" type="color3" value="1.0, 0.0, 1.0" />
+  </LamaEmission>
+  <LamaAdd name="LamaAddEDF" type="EDF">
+    <input name="material1" type="EDF" nodename="LamaEmission1" />
+    <input name="material2" type="EDF" nodename="LamaEmission2" />
+    <input name="weight1" type="float" value="0.5" />
+    <input name="weight2" type="float" value="0.5" />
+  </LamaAdd>
+  <surface name="LamaAddEDFSurface" type="surfaceshader">
+    <input name="edf" type="EDF" nodename="LamaAddEDF" />
+  </surface>
+  <surfacematerial name="LamaAddEDFTest" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaAddEDFSurface" />
+  </surfacematerial>
+
+</materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_conductor.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_conductor.mtlx
new file mode 100644
index 0000000000..8fd275c1de
--- /dev/null
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_conductor.mtlx
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<materialx version="1.38" colorspace="acescg">
+
+  <!-- LamaConductor -->
+  <LamaConductor name="LamaConductor" type="BSDF">
+    <input name="tint" type="color3" value="1, 1, 1" />
+    <input name="fresnelMode" type="integer" value="0" />
+    <input name="IOR" type="vector3" value="0.180000007153,0.419999986887,1.37000000477" />
+    <input name="extinction" type="vector3" value="3.42000007629,2.34999990463,1.76999998093" />
+    <input name="reflectivity" type="color3" value="0.9450, 0.7772, 0.3737" />
+    <input name="edgeColor" type="color3" value="0.9979, 0.9813, 0.7523" />
+    <input name="roughness" type="float" value="0.1" />
+    <input name="anisotropy" type="float" value="0.0" />
+    <input name="anisotropyRotation" type="float" value="0.0" />
+  </LamaConductor>
+  <surface name="LamaConductorSurface" type="surfaceshader">
+    <input name="bsdf" type="BSDF" nodename="LamaConductor" />
+  </surface>
+  <surfacematerial name="LamaConductorTest" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaConductorSurface" />
+  </surfacematerial>
+
+</materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_dielectric.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_dielectric.mtlx
new file mode 100644
index 0000000000..df0cf64032
--- /dev/null
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_dielectric.mtlx
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<materialx version="1.38" colorspace="acescg">
+
+  <!-- LamaDielectric -->
+  <LamaDielectric name="LamaDielectric" type="BSDF">
+    <input name="reflectionTint" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="transmissionTint" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="fresnelMode" type="integer" value="0" />
+    <input name="IOR" type="float" value="1.5" />
+    <input name="reflectivity" type="float" value="0.04" />
+    <input name="roughness" type="float" value="0.1" />
+    <input name="anisotropy" type="float" value="0.0" />
+    <input name="rotation" type="float" value="0.0" />
+    <input name="absorptionColor" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="absorptionRadius" type="float" value="1.0" />
+    <input name="scatterColor" type="color3" value="0.0, 0.0, 0.0" />
+    <input name="scatterAnisotropy" type="float" value="0.0" />
+  </LamaDielectric>
+  <surface name="LamaDielectricSurface" type="surfaceshader">
+    <input name="bsdf" type="BSDF" nodename="LamaDielectric" />
+  </surface>
+  <surfacematerial name="LamaDielectricTest" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaDielectricSurface" />
+  </surfacematerial>
+
+</materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_diffuse.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_diffuse.mtlx
new file mode 100644
index 0000000000..efdf361d79
--- /dev/null
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_diffuse.mtlx
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<materialx version="1.38" colorspace="acescg">
+
+  <!-- LamaDiffuse -->
+  <LamaDiffuse name="LamaDiffuse" type="BSDF">
+    <input name="color" type="color3" value="0.1, 0.2, 0.3" />
+    <input name="roughness" type="float" value="0.5" />
+    <input name="energyCompensation" type="float" value="1.0" />
+  </LamaDiffuse>
+  <surface name="LamaDiffuseSurface" type="surfaceshader">
+    <input name="bsdf" type="BSDF" nodename="LamaDiffuse" />
+  </surface>
+  <surfacematerial name="LamaDiffuseTest" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaDiffuseSurface" />
+  </surfacematerial>
+
+</materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_emission.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_emission.mtlx
new file mode 100644
index 0000000000..ecd281562b
--- /dev/null
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_emission.mtlx
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<materialx version="1.38" colorspace="acescg">
+
+  <!-- LamaEmission -->
+  <LamaEmission name="LamaEmission" type="EDF">
+    <input name="color" type="color3" value="0.0, 1.0, 0.0" />
+  </LamaEmission>
+  <surface name="LamaEmissionSurface" type="surfaceshader">
+    <input name="edf" type="EDF" nodename="LamaEmission" />
+  </surface>
+  <surfacematerial name="LamaEmissionTest" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaEmissionSurface" />
+  </surfacematerial>
+
+</materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_layer.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_layer.mtlx
new file mode 100644
index 0000000000..7925d24c6d
--- /dev/null
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_layer.mtlx
@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+<materialx version="1.38" colorspace="acescg">
+
+  <!-- LamaLayer with BSDFs -->
+  
+  <!-- LamaConductor -->
+  <LamaConductor name="LamaConductor" type="BSDF">
+    <input name="tint" type="color3" value="1, 1, 1" />
+    <input name="fresnelMode" type="integer" value="0" />
+    <input name="IOR" type="vector3" value="0.180000007153,0.419999986887,1.37000000477" />
+    <input name="extinction" type="vector3" value="3.42000007629,2.34999990463,1.76999998093" />
+    <input name="reflectivity" type="color3" value="0.9450, 0.7772, 0.3737" />
+    <input name="edgeColor" type="color3" value="0.9979, 0.9813, 0.7523" />
+    <input name="roughness" type="float" value="0.1" />
+    <input name="anisotropy" type="float" value="0.0" />
+    <input name="anisotropyRotation" type="float" value="0.0" />
+  </LamaConductor>
+
+  <!-- LamaDielectric -->
+  <LamaDielectric name="LamaDielectric" type="BSDF">
+    <input name="reflectionTint" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="transmissionTint" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="fresnelMode" type="integer" value="0" />
+    <input name="IOR" type="float" value="1.5" />
+    <input name="reflectivity" type="float" value="0.04" />
+    <input name="roughness" type="float" value="0.1" />
+    <input name="anisotropy" type="float" value="0.0" />
+    <input name="rotation" type="float" value="0.0" />
+    <input name="absorptionColor" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="absorptionRadius" type="float" value="1.0" />
+    <input name="scatterColor" type="color3" value="0.0, 0.0, 0.0" />
+    <input name="scatterAnisotropy" type="float" value="0.0" />
+  </LamaDielectric>
+
+  <LamaLayer name="LamaLayerBSDF" type="BSDF">
+      <input name="materialTop" type="BSDF" nodename="LamaDielectric" />
+      <input name="materialBase" type="BSDF" nodename="LamaConductor" />
+      <input name="topMix" type="float" value="1.0" />
+      <input name="topThickness" type="float" value="0.0" />
+  </LamaLayer>
+
+  <surface name="LamaLayerBSDFSurface" type="surfaceshader">
+      <input name="bsdf" type="BSDF" nodename="LamaLayerBSDF" />
+  </surface>
+
+  <surfacematerial name="LamaLayerBSDFTest" type="material">
+      <input name="surfaceshader" type="surfaceshader" nodename="LamaLayerBSDFSurface" />
+  </surfacematerial>
+    
+</materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_mix.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_mix.mtlx
new file mode 100644
index 0000000000..1b15af3a5c
--- /dev/null
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_mix.mtlx
@@ -0,0 +1,67 @@
+<?xml version="1.0"?>
+<materialx version="1.38" colorspace="acescg">
+
+  <!-- LamaConductor -->
+  <LamaConductor name="LamaConductor" type="BSDF">
+    <input name="tint" type="color3" value="1, 1, 1" />
+    <input name="fresnelMode" type="integer" value="0" />
+    <input name="IOR" type="vector3" value="0.180000007153,0.419999986887,1.37000000477" />
+    <input name="extinction" type="vector3" value="3.42000007629,2.34999990463,1.76999998093" />
+    <input name="reflectivity" type="color3" value="0.9450, 0.7772, 0.3737" />
+    <input name="edgeColor" type="color3" value="0.9979, 0.9813, 0.7523" />
+    <input name="roughness" type="float" value="0.1" />
+    <input name="anisotropy" type="float" value="0.0" />
+    <input name="anisotropyRotation" type="float" value="0.0" />
+  </LamaConductor>
+
+  <!-- LamaDielectric -->
+  <LamaDielectric name="LamaDielectric" type="BSDF">
+    <input name="reflectionTint" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="transmissionTint" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="fresnelMode" type="integer" value="0" />
+    <input name="IOR" type="float" value="1.5" />
+    <input name="reflectivity" type="float" value="0.04" />
+    <input name="roughness" type="float" value="0.1" />
+    <input name="anisotropy" type="float" value="0.0" />
+    <input name="rotation" type="float" value="0.0" />
+    <input name="absorptionColor" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="absorptionRadius" type="float" value="1.0" />
+    <input name="scatterColor" type="color3" value="0.0, 0.0, 0.0" />
+    <input name="scatterAnisotropy" type="float" value="0.0" />
+  </LamaDielectric>
+
+  <!-- LamaAdd with EDFs -->
+  <LamaEmission name="LamaEmission1" type="EDF">
+    <input name="color" type="color3" value="1.0, 1.0, 0.0" />
+  </LamaEmission>
+  <LamaEmission name="LamaEmission2" type="EDF">
+    <input name="color" type="color3" value="1.0, 0.0, 1.0" />
+  </LamaEmission>
+
+  <!-- LamaMix with BSDFs -->
+  <LamaMix name="LamaMixBSDF" type="BSDF">
+    <input name="material1" type="BSDF" nodename="LamaConductor" />
+    <input name="material2" type="BSDF" nodename="LamaDielectric" />
+    <input name="mix" type="float" value="0.5" />
+  </LamaMix>
+  <surface name="LamaMixBSDFSurface" type="surfaceshader">
+    <input name="bsdf" type="BSDF" nodename="LamaMixBSDF" />
+  </surface>
+  <surfacematerial name="LamaMixBSDFTest" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaMixBSDFSurface" />
+  </surfacematerial>
+
+  <!-- LamaMix with EDFs -->
+  <LamaMix name="LamaMixEDF" type="EDF">
+    <input name="material1" type="EDF" nodename="LamaEmission1" />
+    <input name="material2" type="EDF" nodename="LamaEmission2" />
+    <input name="mix" type="float" value="0.5" />
+  </LamaMix>
+  <surface name="LamaMixEDFSurface" type="surfaceshader">
+    <input name="edf" type="EDF" nodename="LamaMixEDF" />
+  </surface>
+  <surfacematerial name="LamaMixEDFTest" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaMixEDFSurface" />
+  </surfacematerial>
+
+</materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sheen.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sheen.mtlx
new file mode 100644
index 0000000000..eea254e6a0
--- /dev/null
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sheen.mtlx
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<materialx version="1.38" colorspace="acescg">
+
+  <!-- LamaSheen -->
+  <LamaSheen name="LamaSheen" type="BSDF">
+    <input name="color" type="color3" value="1, 1, 1" />
+    <input name="roughness" type="float" value="0.1" />
+  </LamaSheen>
+  <surface name="LamaSheenSurface" type="surfaceshader">
+    <input name="bsdf" type="BSDF" nodename="LamaSheen" />
+  </surface>
+  <surfacematerial name="LamaSheenTest" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaSheenSurface" />
+  </surfacematerial>
+
+</materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sss.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sss.mtlx
new file mode 100644
index 0000000000..5bf446d7d7
--- /dev/null
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sss.mtlx
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<materialx version="1.38" colorspace="acescg">
+
+  <!-- LamaSSS -->
+  <LamaSSS name="LamaSSS" type="BSDF">
+    <input name="color" type="color3" value="0.43, 0.21, 0.17" />
+    <input name="sssRadius" type="color3" value="11.61, 3.88, 1.75" />
+    <input name="sssScale" type="float" value="0.01" />
+    <input name="sssMode" type="integer" value="1" />
+    <input name="sssIOR" type="float" value="1.0" />
+    <input name="sssContinuationRays" type="integer" value="1" />
+    <input name="sssUnitLength" type="float" value="1.0" />
+    <input name="mode" type="integer" value="2" />
+    <input name="albedoInversionMethod" type="integer" value="1" />
+  </LamaSSS>
+  <surface name="LamaSSSSurface" type="surfaceshader">
+    <input name="bsdf" type="BSDF" nodename="LamaSSS" />
+  </surface>
+  <surfacematerial name="LamaSSSTest" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaSSSSurface" />
+  </surfacematerial>
+
+</materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_translucent.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_translucent.mtlx
new file mode 100644
index 0000000000..d07d6a9f93
--- /dev/null
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_translucent.mtlx
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<materialx version="1.38" colorspace="acescg">
+
+  <!-- LamaTranslucent -->
+  <LamaTranslucent name="LamaTranslucent" type="BSDF">
+    <input name="color" type="color3" value="0.9, 0.0, 0.6" />
+    <input name="roughness" type="float" value="0.0" />
+    <input name="energyCompensation" type="float" value="1.0" />
+    <input name="lobeName" type="string" value="diffuse" />
+    <input name="matte" type="string" value="" />
+  </LamaTranslucent>
+  <surface name="LamaTranslucentSurface" type="surfaceshader">
+    <input name="bsdf" type="BSDF" nodename="LamaTranslucent" />
+  </surface>
+  <surfacematerial name="LamaTranslucentTest" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaTranslucentSurface" />
+  </surfacematerial>
+
+</materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama_tests.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama_tests.mtlx
deleted file mode 100644
index e907eae290..0000000000
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama_tests.mtlx
+++ /dev/null
@@ -1,194 +0,0 @@
-<?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
-
-  <!-- LamaConductor -->
-  <LamaConductor name="LamaConductor" type="BSDF">
-    <input name="tint" type="color3" value="1, 1, 1" />
-    <input name="fresnelMode" type="integer" value="0" />
-    <input name="IOR" type="vector3" value="0.180000007153,0.419999986887,1.37000000477" />
-    <input name="extinction" type="vector3" value="3.42000007629,2.34999990463,1.76999998093" />
-    <input name="reflectivity" type="color3" value="0.9450, 0.7772, 0.3737" />
-    <input name="edgeColor" type="color3" value="0.9979, 0.9813, 0.7523" />
-    <input name="roughness" type="float" value="0.1" />
-    <input name="anisotropy" type="float" value="0.0" />
-    <input name="anisotropyRotation" type="float" value="0.0" />
-  </LamaConductor>
-  <surface name="LamaConductorSurface" type="surfaceshader">
-    <input name="bsdf" type="BSDF" nodename="LamaConductor" />
-  </surface>
-  <surfacematerial name="LamaConductorTest" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="LamaConductorSurface" />
-  </surfacematerial>
-
-  <!-- LamaDielectric -->
-  <LamaDielectric name="LamaDielectric" type="BSDF">
-    <input name="reflectionTint" type="color3" value="1.0, 1.0, 1.0" />
-    <input name="transmissionTint" type="color3" value="1.0, 1.0, 1.0" />
-    <input name="fresnelMode" type="integer" value="0" />
-    <input name="IOR" type="float" value="1.5" />
-    <input name="reflectivity" type="float" value="0.04" />
-    <input name="roughness" type="float" value="0.1" />
-    <input name="anisotropy" type="float" value="0.0" />
-    <input name="rotation" type="float" value="0.0" />
-    <input name="absorptionColor" type="color3" value="1.0, 1.0, 1.0" />
-    <input name="absorptionRadius" type="float" value="1.0" />
-    <input name="scatterColor" type="color3" value="0.0, 0.0, 0.0" />
-    <input name="scatterAnisotropy" type="float" value="0.0" />
-  </LamaDielectric>
-  <surface name="LamaDielectricSurface" type="surfaceshader">
-    <input name="bsdf" type="BSDF" nodename="LamaDielectric" />
-  </surface>
-  <surfacematerial name="LamaDielectricTest" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="LamaDielectricSurface" />
-  </surfacematerial>
-
-  <!-- LamaDiffuse -->
-  <LamaDiffuse name="LamaDiffuse" type="BSDF">
-    <input name="color" type="color3" value="0.1, 0.2, 0.3" />
-    <input name="roughness" type="float" value="0.5" />
-    <input name="energyCompensation" type="float" value="1.0" />
-  </LamaDiffuse>
-  <surface name="LamaDiffuseSurface" type="surfaceshader">
-    <input name="bsdf" type="BSDF" nodename="LamaDiffuse" />
-  </surface>
-  <surfacematerial name="LamaDiffuseTest" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="LamaDiffuseSurface" />
-  </surfacematerial>
-
-  <!-- LamaEmission -->
-  <LamaEmission name="LamaEmission" type="EDF">
-    <input name="color" type="color3" value="0.0, 1.0, 0.0" />
-  </LamaEmission>
-  <surface name="LamaEmissionSurface" type="surfaceshader">
-    <input name="edf" type="EDF" nodename="LamaEmission" />
-  </surface>
-  <surfacematerial name="LamaEmissionTest" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="LamaEmissionSurface" />
-  </surfacematerial>
-
-  <!-- LamaSheen -->
-  <LamaSheen name="LamaSheen" type="BSDF">
-    <input name="color" type="color3" value="1, 1, 1" />
-    <input name="roughness" type="float" value="0.1" />
-  </LamaSheen>
-  <surface name="LamaSheenSurface" type="surfaceshader">
-    <input name="bsdf" type="BSDF" nodename="LamaSheen" />
-  </surface>
-  <surfacematerial name="LamaSheenTest" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="LamaSheenSurface" />
-  </surfacematerial>
-
-  <!-- LamaSSS -->
-  <LamaSSS name="LamaSSS" type="BSDF">
-    <input name="color" type="color3" value="0.43, 0.21, 0.17" />
-    <input name="sssRadius" type="color3" value="11.61, 3.88, 1.75" />
-    <input name="sssScale" type="float" value="0.01" />
-    <input name="sssMode" type="integer" value="1" />
-    <input name="sssIOR" type="float" value="1.0" />
-    <input name="sssContinuationRays" type="integer" value="1" />
-    <input name="sssUnitLength" type="float" value="1.0" />
-    <input name="mode" type="integer" value="2" />
-    <input name="albedoInversionMethod" type="integer" value="1" />
-  </LamaSSS>
-  <surface name="LamaSSSSurface" type="surfaceshader">
-    <input name="bsdf" type="BSDF" nodename="LamaSSS" />
-  </surface>
-  <surfacematerial name="LamaSSSTest" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="LamaSSSSurface" />
-  </surfacematerial>
-
-  <!-- LamaTranslucent -->
-  <LamaTranslucent name="LamaTranslucent" type="BSDF">
-    <input name="color" type="color3" value="0.9, 0.0, 0.6" />
-    <input name="roughness" type="float" value="0.0" />
-    <input name="energyCompensation" type="float" value="1.0" />
-    <input name="lobeName" type="string" value="diffuse" />
-    <input name="matte" type="string" value="" />
-  </LamaTranslucent>
-  <surface name="LamaTranslucentSurface" type="surfaceshader">
-    <input name="bsdf" type="BSDF" nodename="LamaTranslucent" />
-  </surface>
-  <surfacematerial name="LamaTranslucentTest" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="LamaTranslucentSurface" />
-  </surfacematerial>
-
-  <!-- LamaAdd with BSDFs -->
-  <LamaAdd name="LamaAddBSDF" type="BSDF">
-    <input name="material1" type="BSDF" nodename="LamaConductor" />
-    <input name="material2" type="BSDF" nodename="LamaDielectric" />
-    <input name="weight1" type="float" value="0.5" />
-    <input name="weight2" type="float" value="0.5" />
-  </LamaAdd>
-  <surface name="LamaAddBSDFSurface" type="surfaceshader">
-    <input name="bsdf" type="BSDF" nodename="LamaAddBSDF" />
-  </surface>
-  <surfacematerial name="LamaAddBSDFTest" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="LamaAddBSDFSurface" />
-  </surfacematerial>
-
-  <!-- LamaAdd with EDFs -->
-  <LamaEmission name="LamaEmission1" type="EDF">
-    <input name="color" type="color3" value="1.0, 1.0, 0.0" />
-  </LamaEmission>
-  <LamaEmission name="LamaEmission2" type="EDF">
-    <input name="color" type="color3" value="1.0, 0.0, 1.0" />
-  </LamaEmission>
-  <LamaAdd name="LamaAddEDF" type="EDF">
-    <input name="material1" type="EDF" nodename="LamaEmission1" />
-    <input name="material2" type="EDF" nodename="LamaEmission2" />
-    <input name="weight1" type="float" value="0.5" />
-    <input name="weight2" type="float" value="0.5" />
-  </LamaAdd>
-  <surface name="LamaAddEDFSurface" type="surfaceshader">
-    <input name="edf" type="EDF" nodename="LamaAddEDF" />
-  </surface>
-  <surfacematerial name="LamaAddEDFTest" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="LamaAddEDFSurface" />
-  </surfacematerial>
-
-  <!-- LamaMix with BSDFs -->
-  <LamaMix name="LamaMixBSDF" type="BSDF">
-    <input name="material1" type="BSDF" nodename="LamaConductor" />
-    <input name="material2" type="BSDF" nodename="LamaDielectric" />
-    <input name="mix" type="float" value="0.5" />
-  </LamaMix>
-  <surface name="LamaMixBSDFSurface" type="surfaceshader">
-    <input name="bsdf" type="BSDF" nodename="LamaMixBSDF" />
-  </surface>
-  <surfacematerial name="LamaMixBSDFTest" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="LamaMixBSDFSurface" />
-  </surfacematerial>
-
-  <!-- LamaMix with EDFs -->
-  <LamaMix name="LamaMixEDF" type="EDF">
-    <input name="material1" type="EDF" nodename="LamaEmission1" />
-    <input name="material2" type="EDF" nodename="LamaEmission2" />
-    <input name="mix" type="float" value="0.5" />
-  </LamaMix>
-  <surface name="LamaMixEDFSurface" type="surfaceshader">
-    <input name="edf" type="EDF" nodename="LamaMixEDF" />
-  </surface>
-  <surfacematerial name="LamaMixEDFTest" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="LamaMixEDFSurface" />
-  </surfacematerial>
-
-  <!-- LamaLayer with BSDFs -->
-  <!-- TODO: re-enable this test once any BSDF can be layered as the top material.
-
-    <LamaLayer name="LamaLayerBSDF" type="BSDF">
-        <input name="materialTop" type="BSDF" nodename="LamaDielectric" />
-        <input name="materialBase" type="BSDF" nodename="LamaConductor" />
-        <input name="topMix" type="float" value="1.0" />
-        <input name="topThickness" type="float" value="0.0" />
-    </LamaLayer>
-
-    <surface name="LamaLayerBSDFSurface" type="surfaceshader">
-        <input name="bsdf" type="BSDF" nodename="LamaLayerBSDF" />
-    </surface>
-
-    <surfacematerial name="LamaLayerBSDFTest" type="material">
-        <input name="surfaceshader" type="surfaceshader" nodename="LamaLayerBSDFSurface" />
-    </surfacematerial>
-    
-    -->
-</materialx>

From 1e84f03547d35cc882e41cc30999b0a1e1163421 Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Wed, 12 Jun 2024 16:01:32 -0700
Subject: [PATCH 27/48] Web viewer improvements

- Replace the post-processed gamma pass with direct encoding to sRGB in GLSL, improving the color accuracy of rendered images.
- Enable anti-aliasing for a small improvement in visual quality.
- Additional minor improvements to JavaScript and Python bindings.
---
 javascript/MaterialXView/source/index.js      | 27 +++----------------
 javascript/MaterialXView/source/viewer.js     |  1 +
 libraries/stdlib/genglsl/lib/mx_math.glsl     |  8 ++++++
 .../JsMaterialXGenShader/JsGenOptions.cpp     |  6 +++++
 .../MaterialXGenGlsl/GlslShaderGenerator.cpp  | 23 +++++++++++-----
 source/MaterialXGenShader/GenOptions.h        | 17 +++++++-----
 .../MaterialXRender/RenderUtil.cpp            |  6 +----
 .../MaterialXRender/RenderUtil.h              |  6 -----
 .../PyMaterialXGenShader/PyGenOptions.cpp     |  5 ++--
 9 files changed, 50 insertions(+), 49 deletions(-)

diff --git a/javascript/MaterialXView/source/index.js b/javascript/MaterialXView/source/index.js
index 026653ca60..c4ea5ca538 100644
--- a/javascript/MaterialXView/source/index.js
+++ b/javascript/MaterialXView/source/index.js
@@ -4,17 +4,11 @@
 //
 
 import * as THREE from 'three';
-import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
-import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
-import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';
-import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js';
-
-import { GammaCorrectionShader } from 'three/examples/jsm/shaders/GammaCorrectionShader.js';
-
 import { Viewer } from './viewer.js'
+import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
 import { dropHandler, dragOverHandler, setLoadingCallback, setSceneLoadingCallback } from './dropHandling.js';
 
-let renderer, composer, orbitControls;
+let renderer, orbitControls;
 
 // Turntable option. For now the step size is fixed.
 let turntableEnabled = false;
@@ -49,7 +43,6 @@ function captureFrame()
 function init()
 {
     let canvas = document.getElementById('webglcanvas');
-    let context = canvas.getContext('webgl2');
 
     // Handle material selection changes
     let materialsSelect = document.getElementById('materials');
@@ -78,22 +71,10 @@ function init()
     scene.initialize();
 
     // Set up renderer
-    renderer = new THREE.WebGLRenderer({ canvas, context });
+    renderer = new THREE.WebGLRenderer({ antialias: true, canvas });
     renderer.setSize(window.innerWidth, window.innerHeight);
-    // Disable introspection for shader debugging for deployment. 
-    // - The code associated with getting program information can be very slow when 
-    //   dealing with shaders with lots of input uniforms (such as standard surface, openpbr shading models)
-    //   as each call is blocking.
-    // - Adding this avoids the chess set scene from "hanging" the Chrome browser on Windows to a few second load.
-    // - Documentation for this flag: https://threejs.org/docs/index.html#api/en/renderers/WebGLRenderer.debug
     renderer.debug.checkShaderErrors = false;
 
-    composer = new EffectComposer(renderer);
-    const renderPass = new RenderPass(scene.getScene(), scene.getCamera());
-    composer.addPass(renderPass);
-    const gammaCorrectionPass = new ShaderPass(GammaCorrectionShader);
-    composer.addPass(gammaCorrectionPass);
-
     window.addEventListener('resize', onWindowResize);
 
     // Set up controls
@@ -198,7 +179,7 @@ function animate()
         viewer.getScene().setUpdateTransforms();
     }
 
-    composer.render();
+    renderer.render(viewer.getScene().getScene(), viewer.getScene().getCamera());
     viewer.getScene().updateTransforms();
 
     if (captureRequested)
diff --git a/javascript/MaterialXView/source/viewer.js b/javascript/MaterialXView/source/viewer.js
index 4e42013a25..57e155c87b 100644
--- a/javascript/MaterialXView/source/viewer.js
+++ b/javascript/MaterialXView/source/viewer.js
@@ -887,6 +887,7 @@ export class Material
         const irradianceTexture = viewer.getIrradianceTexture();
         const gen = viewer.getGenerator();
         const genContext = viewer.getGenContext();
+        genContext.getOptions().hwSrgbEncodeOutput = true;
 
         // Perform transparency check on renderable item
         var startTranspCheckTime = performance.now();
diff --git a/libraries/stdlib/genglsl/lib/mx_math.glsl b/libraries/stdlib/genglsl/lib/mx_math.glsl
index dc15848a3a..781a24a6e7 100644
--- a/libraries/stdlib/genglsl/lib/mx_math.glsl
+++ b/libraries/stdlib/genglsl/lib/mx_math.glsl
@@ -14,3 +14,11 @@ vec3 mx_square(vec3 x)
 {
     return x*x;
 }
+
+vec3 mx_srgb_encode(vec3 color)
+{
+    bvec3 isAbove = greaterThan(color, vec3(0.0031308));
+    vec3 linSeg = color * 12.92;
+    vec3 powSeg = 1.055 * pow(max(color, vec3(0.0)), vec3(1.0 / 2.4)) - 0.055;
+    return mix(linSeg, powSeg, isAbove);
+}
diff --git a/source/JsMaterialX/JsMaterialXGenShader/JsGenOptions.cpp b/source/JsMaterialX/JsMaterialXGenShader/JsGenOptions.cpp
index 9b28a6f534..d12cba9d9f 100644
--- a/source/JsMaterialX/JsMaterialXGenShader/JsGenOptions.cpp
+++ b/source/JsMaterialX/JsMaterialXGenShader/JsGenOptions.cpp
@@ -32,10 +32,15 @@ EMSCRIPTEN_BINDINGS(GenOptions)
     ems::class_<mx::GenOptions>("GenOptions")
         .property("shaderInterfaceType", &mx::GenOptions::shaderInterfaceType)
         .property("fileTextureVerticalFlip", &mx::GenOptions::fileTextureVerticalFlip)
+        .property("targetColorSpaceOverride", &mx::GenOptions::targetColorSpaceOverride)
+        .property("targetDistanceUnit", &mx::GenOptions::targetDistanceUnit)
         .property("addUpstreamDependencies", &mx::GenOptions::addUpstreamDependencies)
+        .property("emitColorTransforms", &mx::GenOptions::emitColorTransforms)
         .property("hwTransparency", &mx::GenOptions::hwTransparency)
         .property("hwSpecularEnvironmentMethod", &mx::GenOptions::hwSpecularEnvironmentMethod)
         .property("hwDirectionalAlbedoMethod", &mx::GenOptions::hwDirectionalAlbedoMethod)
+        .property("hwTransmissionRenderMethod", &mx::GenOptions::hwTransmissionRenderMethod)
+        .property("hwSrgbEncodeOutput", &mx::GenOptions::hwSrgbEncodeOutput)
         .property("hwWriteDepthMoments", &mx::GenOptions::hwWriteDepthMoments)
         .property("hwShadowMap", &mx::GenOptions::hwShadowMap)
         .property("hwAmbientOcclusion", &mx::GenOptions::hwAmbientOcclusion)
@@ -43,5 +48,6 @@ EMSCRIPTEN_BINDINGS(GenOptions)
         .property("hwNormalizeUdimTexCoords", &mx::GenOptions::hwNormalizeUdimTexCoords)
         .property("hwWriteAlbedoTable", &mx::GenOptions::hwWriteAlbedoTable)
         .property("hwWriteEnvPrefilter", &mx::GenOptions::hwWriteEnvPrefilter)
+        .property("hwImplicitBitangents", &mx::GenOptions::hwImplicitBitangents)
         ;
 }
diff --git a/source/MaterialXGenGlsl/GlslShaderGenerator.cpp b/source/MaterialXGenGlsl/GlslShaderGenerator.cpp
index 8258225529..c648441c7e 100644
--- a/source/MaterialXGenGlsl/GlslShaderGenerator.cpp
+++ b/source/MaterialXGenGlsl/GlslShaderGenerator.cpp
@@ -575,14 +575,18 @@ void GlslShaderGenerator::emitPixelStage(const ShaderGraph& graph, GenContext& c
         const ShaderOutput* outputConnection = outputSocket->getConnection();
         if (outputConnection)
         {
-            string finalOutput = outputConnection->getVariable();
-
             if (graph.hasClassification(ShaderNode::Classification::SURFACE))
             {
+                string outColor = outputConnection->getVariable() + ".color";
+                string outTransparency = outputConnection->getVariable() + ".transparency";
+                if (context.getOptions().hwSrgbEncodeOutput)
+                {
+                    outColor = "mx_srgb_encode(" + outColor + ")";
+                }
                 if (context.getOptions().hwTransparency)
                 {
-                    emitLine("float outAlpha = clamp(1.0 - dot(" + finalOutput + ".transparency, vec3(0.3333)), 0.0, 1.0)", stage);
-                    emitLine(outputSocket->getVariable() + " = vec4(" + finalOutput + ".color, outAlpha)", stage);
+                    emitLine("float outAlpha = clamp(1.0 - dot(" + outTransparency + ", vec3(0.3333)), 0.0, 1.0)", stage);
+                    emitLine(outputSocket->getVariable() + " = vec4(" + outColor + ", outAlpha)", stage);
                     emitLine("if (outAlpha < " + HW::T_ALPHA_THRESHOLD + ")", stage, false);
                     emitScopeBegin(stage);
                     emitLine("discard", stage);
@@ -590,16 +594,21 @@ void GlslShaderGenerator::emitPixelStage(const ShaderGraph& graph, GenContext& c
                 }
                 else
                 {
-                    emitLine(outputSocket->getVariable() + " = vec4(" + finalOutput + ".color, 1.0)", stage);
+                    emitLine(outputSocket->getVariable() + " = vec4(" + outColor + ", 1.0)", stage);
                 }
             }
             else
             {
+                string outValue = outputConnection->getVariable();
+                if (context.getOptions().hwSrgbEncodeOutput && outputSocket->getType().isFloat3())
+                {
+                    outValue = "mx_srgb_encode(" + outValue + ")";
+                }
                 if (!outputSocket->getType().isFloat4())
                 {
-                    toVec4(outputSocket->getType(), finalOutput);
+                    toVec4(outputSocket->getType(), outValue);
                 }
-                emitLine(outputSocket->getVariable() + " = " + finalOutput, stage);
+                emitLine(outputSocket->getVariable() + " = " + outValue, stage);
             }
         }
         else
diff --git a/source/MaterialXGenShader/GenOptions.h b/source/MaterialXGenShader/GenOptions.h
index 6af73d62a8..51170c68de 100644
--- a/source/MaterialXGenShader/GenOptions.h
+++ b/source/MaterialXGenShader/GenOptions.h
@@ -80,10 +80,12 @@ class MX_GENSHADER_API GenOptions
         fileTextureVerticalFlip(false),
         addUpstreamDependencies(true),
         libraryPrefix("libraries"),
+        emitColorTransforms(true),
         hwTransparency(false),
         hwSpecularEnvironmentMethod(SPECULAR_ENVIRONMENT_FIS),
         hwDirectionalAlbedoMethod(DIRECTIONAL_ALBEDO_ANALYTIC),
         hwTransmissionRenderMethod(TRANSMISSION_REFRACTION),
+        hwSrgbEncodeOutput(false),
         hwWriteDepthMoments(false),
         hwShadowMap(false),
         hwAmbientOcclusion(false),
@@ -91,8 +93,7 @@ class MX_GENSHADER_API GenOptions
         hwNormalizeUdimTexCoords(false),
         hwWriteAlbedoTable(false),
         hwWriteEnvPrefilter(false),
-        hwImplicitBitangents(true),
-        emitColorTransforms(true)
+        hwImplicitBitangents(true)
     {
     }
     virtual ~GenOptions() { }
@@ -129,6 +130,10 @@ class MX_GENSHADER_API GenOptions
     /// Defaults to "libraries".
     FilePath libraryPrefix;
 
+    /// Enable emitting colorspace transform code if a color management
+    /// system is defined. Defaults to true.
+    bool emitColorTransforms;
+
     /// Sets if transparency is needed or not for HW shaders.
     /// If a surface shader has potential of being transparent
     /// this must be set to true, otherwise no transparency
@@ -148,6 +153,10 @@ class MX_GENSHADER_API GenOptions
     /// for HW shader targets.
     HwTransmissionRenderMethod hwTransmissionRenderMethod;
 
+    /// Enables an sRGB encoding for the color output on HW shader targets.
+    /// Defaults to false.
+    bool hwSrgbEncodeOutput;
+
     /// Enables the writing of depth moments for HW shader targets.
     /// Defaults to false.
     bool hwWriteDepthMoments;
@@ -182,10 +191,6 @@ class MX_GENSHADER_API GenOptions
     /// Calculate fallback bitangents from existing normals and tangents
     /// inside the bitangent node.
     bool hwImplicitBitangents;
-
-    /// Enable emitting colorspace transform code if a color management
-    /// system is defined. Defaults to true.
-    bool emitColorTransforms;
 };
 
 MATERIALX_NAMESPACE_END
diff --git a/source/MaterialXTest/MaterialXRender/RenderUtil.cpp b/source/MaterialXTest/MaterialXRender/RenderUtil.cpp
index cabcaca9a4..d8265a4050 100644
--- a/source/MaterialXTest/MaterialXRender/RenderUtil.cpp
+++ b/source/MaterialXTest/MaterialXRender/RenderUtil.cpp
@@ -15,8 +15,7 @@ namespace RenderUtil
 
 ShaderRenderTester::ShaderRenderTester(mx::ShaderGeneratorPtr shaderGenerator) :
     _shaderGenerator(shaderGenerator),
-    _resolveImageFilenames(false),
-    _emitColorTransforms(true)
+    _resolveImageFilenames(false)
 {
 }
 
@@ -165,9 +164,6 @@ bool ShaderRenderTester::validate(const mx::FilePath optionsFilePath)
     // Set target unit space
     context.getOptions().targetDistanceUnit = "meter";
 
-    // Set whether to emit colorspace transforms
-    context.getOptions().emitColorTransforms = _emitColorTransforms;
-
     // Register shader metadata defined in the libraries.
     _shaderGenerator->registerShaderMetadata(dependLib, context);
 
diff --git a/source/MaterialXTest/MaterialXRender/RenderUtil.h b/source/MaterialXTest/MaterialXRender/RenderUtil.h
index 15eb5778f6..af4e221f25 100644
--- a/source/MaterialXTest/MaterialXRender/RenderUtil.h
+++ b/source/MaterialXTest/MaterialXRender/RenderUtil.h
@@ -95,11 +95,6 @@ class ShaderRenderTester
 
     bool validate(const mx::FilePath optionsFilePath);
 
-    void setEmitColorTransforms(bool val)
-    {
-        _emitColorTransforms = val;
-    }
-
   protected:
     // Check if testing should be performed based in input options
 #if defined(MATERIALX_TEST_RENDER)
@@ -177,7 +172,6 @@ class ShaderRenderTester
     // Color management information
     mx::ColorManagementSystemPtr _colorManagementSystem;
     mx::FilePath _colorManagementConfigFile;
-    bool _emitColorTransforms;
 };
 
 } // namespace RenderUtil
diff --git a/source/PyMaterialX/PyMaterialXGenShader/PyGenOptions.cpp b/source/PyMaterialX/PyMaterialXGenShader/PyGenOptions.cpp
index c40728ad26..3949d50b8d 100644
--- a/source/PyMaterialX/PyMaterialXGenShader/PyGenOptions.cpp
+++ b/source/PyMaterialX/PyMaterialXGenShader/PyGenOptions.cpp
@@ -27,11 +27,13 @@ void bindPyGenOptions(py::module& mod)
         .def_readwrite("shaderInterfaceType", &mx::GenOptions::shaderInterfaceType)
         .def_readwrite("fileTextureVerticalFlip", &mx::GenOptions::fileTextureVerticalFlip)
         .def_readwrite("targetColorSpaceOverride", &mx::GenOptions::targetColorSpaceOverride)
+        .def_readwrite("targetDistanceUnit", &mx::GenOptions::targetDistanceUnit)
         .def_readwrite("addUpstreamDependencies", &mx::GenOptions::addUpstreamDependencies)
         .def_readwrite("libraryPrefix", &mx::GenOptions::libraryPrefix)        
-        .def_readwrite("targetDistanceUnit", &mx::GenOptions::targetDistanceUnit)
+        .def_readwrite("emitColorTransforms", &mx::GenOptions::emitColorTransforms)
         .def_readwrite("hwTransparency", &mx::GenOptions::hwTransparency)
         .def_readwrite("hwSpecularEnvironmentMethod", &mx::GenOptions::hwSpecularEnvironmentMethod)
+        .def_readwrite("hwSrgbEncodeOutput", &mx::GenOptions::hwSrgbEncodeOutput)
         .def_readwrite("hwWriteDepthMoments", &mx::GenOptions::hwWriteDepthMoments)
         .def_readwrite("hwShadowMap", &mx::GenOptions::hwShadowMap)
         .def_readwrite("hwMaxActiveLightSources", &mx::GenOptions::hwMaxActiveLightSources)
@@ -40,6 +42,5 @@ void bindPyGenOptions(py::module& mod)
         .def_readwrite("hwWriteAlbedoTable", &mx::GenOptions::hwWriteAlbedoTable)
         .def_readwrite("hwWriteEnvPrefilter", &mx::GenOptions::hwWriteEnvPrefilter)
         .def_readwrite("hwImplicitBitangents", &mx::GenOptions::hwImplicitBitangents)
-        .def_readwrite("emitColorTransforms", &mx::GenOptions::emitColorTransforms)
         .def(py::init<>());
 }

From 23e6259a1cd8a64728907e0f72181fa62ef57186 Mon Sep 17 00:00:00 2001
From: Niklas Harrysson <niklas.harrysson@gmail.com>
Date: Sat, 15 Jun 2024 01:12:24 +0200
Subject: [PATCH 28/48] Fix MDL compile error (#1889)

Fixing a typo in MDL code.
---
 source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
index cd29a08b9c..cd47e35d17 100644
--- a/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
+++ b/source/MaterialXGenMdl/mdl/materialx/stdlib_1_6.mdl
@@ -3716,7 +3716,7 @@ export float4x4 mx_ifequal_matrix44(
 	if (mxp_value1 == mxp_value2) { return mxp_in1; } return mxp_in2;
 }
 
-export bool mx_ifequal_float(
+export bool mx_ifequal_boolean(
 	float mxp_value1 = float(0.0),
 	float mxp_value2 = float(0.0)
 )

From f737174084386cdb222448dcf7b39aff8d61558b Mon Sep 17 00:00:00 2001
From: Ashwin Bhat <1727158+ashwinbhat@users.noreply.github.com>
Date: Sun, 16 Jun 2024 17:49:32 -0700
Subject: [PATCH 29/48] Fix Monolithic build on Windows (#1872)

Configure MaterialX with MATERIALX_BUILD_MONOLITHIC=ON on Windows, building this with with VS2022 causes couple issues:
1. error C1128: number of sections exceeded object file format fixed by adding /bigobj flag
2. Linker error from MaterialX_v1_39_0::OiioImageLoader::saveImage() fixed by muting OiioImageLoader using MATERIALX_BUILD_OIIO
---
 CMakeLists.txt                           | 3 +++
 source/MaterialXRender/OiioImageLoader.h | 5 +++--
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9c79bcc43a..ecb1952635 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -236,6 +236,9 @@ endif()
 # Adjust compiler settings
 if(MSVC)
     add_compile_options(/MP)
+    if(MATERIALX_BUILD_MONOLITHIC)
+        add_compile_options(/bigobj)
+    endif()
     if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
         string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
     else()
diff --git a/source/MaterialXRender/OiioImageLoader.h b/source/MaterialXRender/OiioImageLoader.h
index 38781dad9e..5a81e69051 100644
--- a/source/MaterialXRender/OiioImageLoader.h
+++ b/source/MaterialXRender/OiioImageLoader.h
@@ -5,7 +5,8 @@
 
 #ifndef MATERIALX_OIIOIMAGELOADER_H
 #define MATERIALX_OIIOIMAGELOADER_H
-
+    
+#if MATERIALX_BUILD_OIIO
 /// @file
 /// Image loader wrapper using OpenImageIO
 
@@ -55,5 +56,5 @@ class MX_RENDER_API OiioImageLoader : public ImageLoader
 };
 
 MATERIALX_NAMESPACE_END
-
+#endif //MATERIALX_BUILD_OIIO
 #endif

From f98abc434e0e502f5299cf6ea076a410d4d13614 Mon Sep 17 00:00:00 2001
From: Niklas Harrysson <niklas.harrysson@gmail.com>
Date: Mon, 17 Jun 2024 02:50:53 +0200
Subject: [PATCH 30/48] Remove unused thin_surface node (#1890)

This changelist removes the `thin_surface` node. The specification for thin-walled surfaces was changed in 1.39, making this node deprecated.

The node was never implemented across multiple targets (MDL is the only exception), and we've never heard of anyone trying to use it. So no upgrade logic is added at this point. Should anyone need an upgrade path we can add that later.
---
 .../pbrlib/genmdl/pbrlib_genmdl_impl.mtlx     |  3 --
 libraries/pbrlib/pbrlib_defs.mtlx             | 13 -------
 .../mdl/materialx/pbrlib_1_6.mdl              | 35 -------------------
 .../mdl/materialx/pbrlib_1_7.mdl              |  1 -
 .../MaterialXGenGlsl/GenGlsl.cpp              |  2 +-
 .../MaterialXTest/MaterialXGenMdl/GenMdl.cpp  |  2 +-
 source/MaterialXTest/MaterialXGenMdl/GenMdl.h |  2 +-
 .../MaterialXTest/MaterialXGenMsl/GenMsl.cpp  |  2 +-
 .../MaterialXTest/MaterialXGenOsl/GenOsl.cpp  |  2 +-
 .../MaterialXGenShader/GenShaderUtil.cpp      |  1 -
 10 files changed, 5 insertions(+), 58 deletions(-)

diff --git a/libraries/pbrlib/genmdl/pbrlib_genmdl_impl.mtlx b/libraries/pbrlib/genmdl/pbrlib_genmdl_impl.mtlx
index 752aa7bf5f..c0c3293ff1 100644
--- a/libraries/pbrlib/genmdl/pbrlib_genmdl_impl.mtlx
+++ b/libraries/pbrlib/genmdl/pbrlib_genmdl_impl.mtlx
@@ -46,9 +46,6 @@
   <!-- <surface> -->
   <implementation name="IM_surface_genmdl" nodedef="ND_surface" target="genmdl" />
 
-  <!-- <thin_surface> -->
-  <implementation name="IM_thin_surface_genmdl" nodedef="ND_thin_surface" sourcecode="materialx::pbrlib_{{MDL_VERSION_SUFFIX}}::mx_thin_surface(mxp_front_bsdf:{{front_bsdf}}, mxp_front_edf:{{front_edf}}, mxp_back_bsdf:{{back_bsdf}}, mxp_back_edf:{{back_edf}}, mxp_opacity:{{opacity}})" target="genmdl" />
-
   <!-- <volume> -->
   <implementation name="IM_volume_genmdl" nodedef="ND_volume" sourcecode="materialx::pbrlib_{{MDL_VERSION_SUFFIX}}::mx_volume(mxp_vdf:{{vdf}}, mxp_edf:{{edf}})" target="genmdl" />
 
diff --git a/libraries/pbrlib/pbrlib_defs.mtlx b/libraries/pbrlib/pbrlib_defs.mtlx
index b4184a2cd4..3664430a05 100644
--- a/libraries/pbrlib/pbrlib_defs.mtlx
+++ b/libraries/pbrlib/pbrlib_defs.mtlx
@@ -226,19 +226,6 @@
     <output name="out" type="surfaceshader" />
   </nodedef>
 
-  <!--
-    Node: <thin_surface>
-    Construct a surface shader from scattering and emission distribution functions for non-closed "thin" objects.
-  -->
-  <nodedef name="ND_thin_surface" node="thin_surface" nodegroup="pbr" doc="A constructor node for the surfaceshader type for non-closed 'thin' objects.">
-    <input name="front_bsdf" type="BSDF" value="" doc="Distribution function for front-side surface scattering." />
-    <input name="front_edf" type="EDF" value="" doc="Distribution function for front-side surface emission." />
-    <input name="back_bsdf" type="BSDF" value="" doc="Distribution function for back-side surface scattering." />
-    <input name="back_edf" type="EDF" value="" doc="Distribution function for back-side surface emission." />
-    <input name="opacity" type="float" value="1.0" doc="Surface cutout opacity" />
-    <output name="out" type="surfaceshader" />
-  </nodedef>
-
   <!--
     Node: <volume>
     Construct a volume shader describing a participating medium.
diff --git a/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl b/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl
index f6d3674324..5e2e74e733 100644
--- a/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl
+++ b/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl
@@ -568,41 +568,6 @@ export material mx_surface(
     )
 );
 
-export material mx_thin_surface(
-    material mxp_front_bsdf    = material() [[ anno::usage( "materialx:bsdf") ]],
-    material mxp_front_edf     = material() [[ anno::usage( "materialx:edf") ]],
-    material mxp_back_bsdf     = material() [[ anno::usage( "materialx:bsdf") ]],
-    material mxp_back_edf      = material() [[ anno::usage( "materialx:edf") ]],
-    float    mxp_opacity = 1.0
-) [[ 
-    anno::usage( "materialx:surfaceshader") 
-]]
-= let {
-    bsdf              front_bsdf_node = mxp_front_bsdf.surface.scattering;
-    material_emission front_edf_node  = mxp_front_edf.surface.emission;
-    bsdf              back_bsdf_node  = mxp_back_bsdf.surface.scattering;
-    material_emission back_edf_node   = mxp_back_edf.surface.emission;
-    // we need to carry volume properties along for SSS
-    // TODO: clarify SSS behavior in MaterialX for thin-walled surfaces,
-    //       in MDL there is only one volume property
-    material_volume   bsdf_volume = mxp_front_bsdf.volume;
-} in material(
-    thin_walled: true,
-    surface: material_surface( 
-        scattering: front_bsdf_node,
-        emission: front_edf_node
-    ),
-    backface: material_surface( 
-        scattering: back_bsdf_node,
-        emission: back_edf_node
-    ),
-    ior: color(1.0),
-    volume: bsdf_volume,
-    geometry: material_geometry(
-        cutout_opacity: mxp_opacity
-    )
-);
-
 // MDL 1.6, Volumes do not support emission.
 export material mx_volume(
     material mxp_vdf    = material() [[ anno::usage( "materialx:vdf") ]],
diff --git a/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_7.mdl b/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_7.mdl
index e7e5526c01..2d288ee8f2 100644
--- a/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_7.mdl
+++ b/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_7.mdl
@@ -54,7 +54,6 @@ export using .::pbrlib_1_6 import mx_measured_edf;
 export using .::pbrlib_1_6 import mx_absorption_vdf;
 export using .::pbrlib_1_6 import mx_anisotropic_vdf;
 export using .::pbrlib_1_6 import mx_surface;
-export using .::pbrlib_1_6 import mx_thin_surface;
 export using .::pbrlib_1_6 import mx_light;
 export using .::pbrlib_1_6 import mx_displacement_float;
 export using .::pbrlib_1_6 import mx_displacement_vector3;
diff --git a/source/MaterialXTest/MaterialXGenGlsl/GenGlsl.cpp b/source/MaterialXTest/MaterialXGenGlsl/GenGlsl.cpp
index f8a8003aa0..2a9a0bb6fa 100644
--- a/source/MaterialXTest/MaterialXGenGlsl/GenGlsl.cpp
+++ b/source/MaterialXTest/MaterialXGenGlsl/GenGlsl.cpp
@@ -81,7 +81,7 @@ TEST_CASE("GenShader: GLSL Implementation Check", "[genglsl]")
 
     mx::StringSet generatorSkipNodeTypes;
     mx::StringSet generatorSkipNodeDefs;
-    GenShaderUtil::checkImplementations(context, generatorSkipNodeTypes, generatorSkipNodeDefs, 31);
+    GenShaderUtil::checkImplementations(context, generatorSkipNodeTypes, generatorSkipNodeDefs, 30);
 }
 
 TEST_CASE("GenShader: GLSL Unique Names", "[genglsl]")
diff --git a/source/MaterialXTest/MaterialXGenMdl/GenMdl.cpp b/source/MaterialXTest/MaterialXGenMdl/GenMdl.cpp
index 3d97c567cd..db75a5ddf6 100644
--- a/source/MaterialXTest/MaterialXGenMdl/GenMdl.cpp
+++ b/source/MaterialXTest/MaterialXGenMdl/GenMdl.cpp
@@ -93,7 +93,7 @@ TEST_CASE("GenShader: MDL Implementation Check", "[genmdl]")
     generatorSkipNodeTypes.insert("light");
     mx::StringSet generatorSkipNodeDefs;
 
-    GenShaderUtil::checkImplementations(context, generatorSkipNodeTypes, generatorSkipNodeDefs, 32);
+    GenShaderUtil::checkImplementations(context, generatorSkipNodeTypes, generatorSkipNodeDefs, 31);
 }
 
 
diff --git a/source/MaterialXTest/MaterialXGenMdl/GenMdl.h b/source/MaterialXTest/MaterialXGenMdl/GenMdl.h
index 179688a05a..f40254c5f4 100644
--- a/source/MaterialXTest/MaterialXGenMdl/GenMdl.h
+++ b/source/MaterialXTest/MaterialXGenMdl/GenMdl.h
@@ -80,7 +80,7 @@ class MdlShaderGeneratorTester : public GenShaderUtil::ShaderGeneratorTester
             "geompropvalue", "surfacematerial", "volumematerial", 
             "IM_absorption_vdf_", "IM_mix_vdf_", "IM_add_vdf_", "IM_multiply_vdf",
             "IM_measured_edf_", "IM_blackbody_", "IM_conical_edf_", 
-            "IM_displacement_", "IM_thin_surface_", "IM_volume_", "IM_light_"
+            "IM_displacement_", "IM_volume_", "IM_light_"
         };
         ShaderGeneratorTester::getImplementationWhiteList(whiteList);
     }
diff --git a/source/MaterialXTest/MaterialXGenMsl/GenMsl.cpp b/source/MaterialXTest/MaterialXGenMsl/GenMsl.cpp
index 68cde348d7..b0309ea44d 100644
--- a/source/MaterialXTest/MaterialXGenMsl/GenMsl.cpp
+++ b/source/MaterialXTest/MaterialXGenMsl/GenMsl.cpp
@@ -84,7 +84,7 @@ TEST_CASE("GenShader: MSL Implementation Check", "[genmsl]")
 
     mx::StringSet generatorSkipNodeTypes;
     mx::StringSet generatorSkipNodeDefs;
-    GenShaderUtil::checkImplementations(context, generatorSkipNodeTypes, generatorSkipNodeDefs, 31);
+    GenShaderUtil::checkImplementations(context, generatorSkipNodeTypes, generatorSkipNodeDefs, 30);
 }
 
 TEST_CASE("GenShader: MSL Unique Names", "[genmsl]")
diff --git a/source/MaterialXTest/MaterialXGenOsl/GenOsl.cpp b/source/MaterialXTest/MaterialXGenOsl/GenOsl.cpp
index 9fa3329fcb..f31c3d2a9b 100644
--- a/source/MaterialXTest/MaterialXGenOsl/GenOsl.cpp
+++ b/source/MaterialXTest/MaterialXGenOsl/GenOsl.cpp
@@ -89,7 +89,7 @@ TEST_CASE("GenShader: OSL Implementation Check", "[genosl]")
     generatorSkipNodeTypes.insert("light");
     mx::StringSet generatorSkipNodeDefs;
 
-    GenShaderUtil::checkImplementations(context, generatorSkipNodeTypes, generatorSkipNodeDefs, 32);
+    GenShaderUtil::checkImplementations(context, generatorSkipNodeTypes, generatorSkipNodeDefs, 31);
 }
 
 TEST_CASE("GenShader: OSL Unique Names", "[genosl]")
diff --git a/source/MaterialXTest/MaterialXGenShader/GenShaderUtil.cpp b/source/MaterialXTest/MaterialXGenShader/GenShaderUtil.cpp
index f71f6dc6a6..848348066c 100644
--- a/source/MaterialXTest/MaterialXGenShader/GenShaderUtil.cpp
+++ b/source/MaterialXTest/MaterialXGenShader/GenShaderUtil.cpp
@@ -97,7 +97,6 @@ void checkImplementations(mx::GenContext& context,
         "conical_edf",
         "measured_edf",
         "absorption_vdf",
-        "thin_surface",
         "geompropvalue",
         "surfacematerial",
         "volumematerial"

From 3f4d7cde93a5dd7b1ba8d385dd0be4ba0947dc75 Mon Sep 17 00:00:00 2001
From: ld-kerley <154285602+ld-kerley@users.noreply.github.com>
Date: Wed, 19 Jun 2024 10:48:03 -0700
Subject: [PATCH 31/48] Prefix MSL mod function name to avoid clash in Storm
 (#1892)

Using a `ND_modulo_vector2FA` node in a material causes the shader code generated by Storm to fail to compile when using Metal.

```
 > usdview mod_bug.usda
Warning: in _ValidateCompilation at line 229 of ../../pxr/imaging/hdSt/glslProgram.cpp -- Failed to compile shader (FRAGMENT_SHADER): program_source:3055:33: error: no matching function for call to 'mod'
    vec2 modulo_vector2FA_out = mod(multiply_vector2_out, modulo_vector2FA_in2);
                                ^~~
program_source:136:3: note: candidate template ignored: deduced conflicting types for parameter 'T' ('float2' (vector of 2 'float' values) vs. 'float')
T mod(T y, T x) { return fmod(y, x); }
  ^

Warning: in _ValidateCompilation at line 229 of ../../pxr/imaging/hdSt/glslProgram.cpp -- Failed to compile shader (FRAGMENT_SHADER): program_source:4312:33: error: no matching function for call to 'mod'
    vec2 modulo_vector2FA_out = mod(multiply_vector2_out, modulo_vector2FA_in2);
                                ^~~
program_source:136:3: note: candidate template ignored: deduced conflicting types for parameter 'T' ('float2' (vector of 2 'float' values) vs. 'float')
T mod(T y, T x) { return fmod(y, x); }
  ^

ERROR: Usdview encountered an error while rendering.
	Error in '&pxrInternal_v0_24__pxrReserved__::HdSt_DrawBatch::_GetDrawingProgram' at line 408 in file ../../pxr/imaging/hdSt/drawBatch.cpp : 'Failed to compile shader for prim /Root/Geo/Cube.'
```
[mod_bug.zip](https://github.com/user-attachments/files/15894967/mod_bug.zip)

What's happening here is that Storm declares `T mod(T y, T x) { return fmod(y, x); }` earlier in the shader code, so the MaterialX defined Metal code for `mod()` isn't seen by the compiler.

By just renaming `mod()` to `mx_mod()` in the Metal source code provided by MaterialX, we avoid this name conflict.  Using this `mx_` "namespace" seems like a reasonable, pragmatic solution.

Moving the `mx_mod()` function outside of the `#ifdef __DECL_GL_MATH_FUNCTIONS__` guard ensures it's always used.  I think previously outside of the Storm context Metal may have been using the built in `mod()` call which doesn't follow the same math. (see https://stackoverflow.com/questions/41169747/solving-odd-behavior-re-glsl-metal-shader-unintentional-coordinate-flipping)
---
 libraries/stdlib/genmsl/lib/mx_math.metal     | 12 +++++-----
 .../stdlib/genmsl/stdlib_genmsl_impl.mtlx     | 22 +++++++++----------
 2 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/libraries/stdlib/genmsl/lib/mx_math.metal b/libraries/stdlib/genmsl/lib/mx_math.metal
index f7e94d87f6..7c4851ea31 100644
--- a/libraries/stdlib/genmsl/lib/mx_math.metal
+++ b/libraries/stdlib/genmsl/lib/mx_math.metal
@@ -15,6 +15,12 @@ vec3 mx_square(vec3 x)
     return x*x;
 }
 
+template<class T1, class T2>
+T1 mx_mod(T1 x, T2 y)
+{
+    return x - y * floor(x/y);
+}
+
 #ifdef __DECL_GL_MATH_FUNCTIONS__
 
 float radians(float degree) { return (degree * M_PI_F / 180.0f); }
@@ -85,12 +91,6 @@ float4x4 inverse(float4x4 m)
     return ret;
 }
 
-template<class T1, class T2>
-T1 mod(T1 x, T2 y)
-{
-    return x - y * floor(x/y);
-}
-
 template <typename T>
 T atan(T y_over_x) { return ::atan(y_over_x); }
 
diff --git a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
index 13bb5f54b7..e18cc5a777 100644
--- a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
+++ b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
@@ -253,17 +253,17 @@
   <implementation name="IM_divide_matrix44_genmsl" nodedef="ND_divide_matrix44" target="genmsl" sourcecode="{{in1}} / {{in2}}" />
 
   <!-- <modulo> -->
-  <implementation name="IM_modulo_float_genmsl" nodedef="ND_modulo_float" target="genmsl" sourcecode="mod({{in1}}, {{in2}})" />
-  <implementation name="IM_modulo_color3_genmsl" nodedef="ND_modulo_color3" target="genmsl" sourcecode="mod({{in1}}, {{in2}})" />
-  <implementation name="IM_modulo_color3FA_genmsl" nodedef="ND_modulo_color3FA" target="genmsl" sourcecode="mod({{in1}}, {{in2}})" />
-  <implementation name="IM_modulo_color4_genmsl" nodedef="ND_modulo_color4" target="genmsl" sourcecode="mod({{in1}}, {{in2}})" />
-  <implementation name="IM_modulo_color4FA_genmsl" nodedef="ND_modulo_color4FA" target="genmsl" sourcecode="mod({{in1}}, {{in2}})" />
-  <implementation name="IM_modulo_vector2_genmsl" nodedef="ND_modulo_vector2" target="genmsl" sourcecode="mod({{in1}}, {{in2}})" />
-  <implementation name="IM_modulo_vector2FA_genmsl" nodedef="ND_modulo_vector2FA" target="genmsl" sourcecode="mod({{in1}}, {{in2}})" />
-  <implementation name="IM_modulo_vector3_genmsl" nodedef="ND_modulo_vector3" target="genmsl" sourcecode="mod({{in1}}, {{in2}})" />
-  <implementation name="IM_modulo_vector3FA_genmsl" nodedef="ND_modulo_vector3FA" target="genmsl" sourcecode="mod({{in1}}, {{in2}})" />
-  <implementation name="IM_modulo_vector4_genmsl" nodedef="ND_modulo_vector4" target="genmsl" sourcecode="mod({{in1}}, {{in2}})" />
-  <implementation name="IM_modulo_vector4FA_genmsl" nodedef="ND_modulo_vector4FA" target="genmsl" sourcecode="mod({{in1}}, {{in2}})" />
+  <implementation name="IM_modulo_float_genmsl" nodedef="ND_modulo_float" target="genmsl" sourcecode="mx_mod({{in1}}, {{in2}})" />
+  <implementation name="IM_modulo_color3_genmsl" nodedef="ND_modulo_color3" target="genmsl" sourcecode="mx_mod({{in1}}, {{in2}})" />
+  <implementation name="IM_modulo_color3FA_genmsl" nodedef="ND_modulo_color3FA" target="genmsl" sourcecode="mx_mod({{in1}}, {{in2}})" />
+  <implementation name="IM_modulo_color4_genmsl" nodedef="ND_modulo_color4" target="genmsl" sourcecode="mx_mod({{in1}}, {{in2}})" />
+  <implementation name="IM_modulo_color4FA_genmsl" nodedef="ND_modulo_color4FA" target="genmsl" sourcecode="mx_mod({{in1}}, {{in2}})" />
+  <implementation name="IM_modulo_vector2_genmsl" nodedef="ND_modulo_vector2" target="genmsl" sourcecode="mx_mod({{in1}}, {{in2}})" />
+  <implementation name="IM_modulo_vector2FA_genmsl" nodedef="ND_modulo_vector2FA" target="genmsl" sourcecode="mx_mod({{in1}}, {{in2}})" />
+  <implementation name="IM_modulo_vector3_genmsl" nodedef="ND_modulo_vector3" target="genmsl" sourcecode="mx_mod({{in1}}, {{in2}})" />
+  <implementation name="IM_modulo_vector3FA_genmsl" nodedef="ND_modulo_vector3FA" target="genmsl" sourcecode="mx_mod({{in1}}, {{in2}})" />
+  <implementation name="IM_modulo_vector4_genmsl" nodedef="ND_modulo_vector4" target="genmsl" sourcecode="mx_mod({{in1}}, {{in2}})" />
+  <implementation name="IM_modulo_vector4FA_genmsl" nodedef="ND_modulo_vector4FA" target="genmsl" sourcecode="mx_mod({{in1}}, {{in2}})" />
 
   <!-- <invert> -->
   <implementation name="IM_invert_float_genmsl" nodedef="ND_invert_float" target="genmsl" sourcecode="{{amount}} - {{in}}" />

From 86854e0915a456ea78f46407030ab9adf240a30d Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Wed, 19 Jun 2024 11:10:01 -0700
Subject: [PATCH 32/48] Restore windows-2022 in CI

This changelist restores windows-2022 builds to our GitHub Actions CI, as the stability of these runners appears to have recently improved.
---
 .github/workflows/main.yml | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 213ca8c51b..f2ae2afbbc 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -104,18 +104,18 @@ jobs:
           python: 3.7
           cmake_config: -G "Visual Studio 16 2019" -A "Win32" -DMATERIALX_BUILD_SHARED_LIBS=ON
 
-        - name: Windows_VS2019_x64_Python311
-          os: windows-2019
+        - name: Windows_VS2022_x64_Python311
+          os: windows-2022
           architecture: x64
           python: 3.11
-          cmake_config: -G "Visual Studio 16 2019" -A "x64"
+          cmake_config: -G "Visual Studio 17 2022" -A "x64"
           test_shaders: ON
 
-        - name: Windows_VS2019_x64_Python312
-          os: windows-2019
+        - name: Windows_VS2022_x64_Python312
+          os: windows-2022
           architecture: x64
           python: 3.12
-          cmake_config: -G "Visual Studio 16 2019" -A "x64"
+          cmake_config: -G "Visual Studio 17 2022" -A "x64"
           upload_shaders: ON
 
     steps:
@@ -383,7 +383,7 @@ jobs:
       fail-fast: false
       matrix:
         python-minor: ['7', '8', '9', '10', '11', '12']
-        os: ['ubuntu-latest', 'windows-2019', 'macos-13']
+        os: ['ubuntu-latest', 'windows-2022', 'macos-13']
 
     steps:
     - name: Sync Repository

From 600854bb42b5580ac17411271ee1e2f318456a9a Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Wed, 19 Jun 2024 12:44:48 -0700
Subject: [PATCH 33/48] Update JavaScript packages

This changelist updates all referenced JavaScript packages to their latest version via 'npm update'.
---
 javascript/MaterialXTest/package-lock.json | 1685 +++++++++++++-------
 javascript/MaterialXTest/package.json      |    6 +-
 javascript/MaterialXView/package-lock.json |  766 ++++++---
 javascript/MaterialXView/package.json      |    2 +-
 4 files changed, 1640 insertions(+), 819 deletions(-)

diff --git a/javascript/MaterialXTest/package-lock.json b/javascript/MaterialXTest/package-lock.json
index 9e22a2284b..4bd40a8468 100644
--- a/javascript/MaterialXTest/package-lock.json
+++ b/javascript/MaterialXTest/package-lock.json
@@ -9,9 +9,9 @@
       "version": "1.0.0",
       "license": "ISC",
       "devDependencies": {
-        "@babel/core": "^7.24.3",
-        "@babel/preset-env": "^7.24.3",
-        "@babel/register": "^7.23.7",
+        "@babel/core": "^7.24.7",
+        "@babel/preset-env": "^7.24.7",
+        "@babel/register": "^7.24.6",
         "chai": "^4.4.1",
         "copyfiles": "^2.4.1",
         "karma": "^6.4.3",
@@ -28,6 +28,7 @@
       "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
       "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.24"
@@ -37,12 +38,13 @@
       }
     },
     "node_modules/@babel/code-frame": {
-      "version": "7.24.2",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz",
-      "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+      "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/highlight": "^7.24.2",
+        "@babel/highlight": "^7.24.7",
         "picocolors": "^1.0.0"
       },
       "engines": {
@@ -50,30 +52,32 @@
       }
     },
     "node_modules/@babel/compat-data": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz",
-      "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz",
+      "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.24.3",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz",
-      "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz",
+      "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.24.2",
-        "@babel/generator": "^7.24.1",
-        "@babel/helper-compilation-targets": "^7.23.6",
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helpers": "^7.24.1",
-        "@babel/parser": "^7.24.1",
-        "@babel/template": "^7.24.0",
-        "@babel/traverse": "^7.24.1",
-        "@babel/types": "^7.24.0",
+        "@babel/code-frame": "^7.24.7",
+        "@babel/generator": "^7.24.7",
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helpers": "^7.24.7",
+        "@babel/parser": "^7.24.7",
+        "@babel/template": "^7.24.7",
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7",
         "convert-source-map": "^2.0.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
@@ -89,12 +93,13 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz",
-      "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz",
+      "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.24.0",
+        "@babel/types": "^7.24.7",
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25",
         "jsesc": "^2.5.1"
@@ -104,37 +109,41 @@
       }
     },
     "node_modules/@babel/helper-annotate-as-pure": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
-      "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
+      "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz",
-      "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz",
+      "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.22.15"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.23.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
-      "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz",
+      "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/compat-data": "^7.23.5",
-        "@babel/helper-validator-option": "^7.23.5",
+        "@babel/compat-data": "^7.24.7",
+        "@babel/helper-validator-option": "^7.24.7",
         "browserslist": "^4.22.2",
         "lru-cache": "^5.1.1",
         "semver": "^6.3.1"
@@ -144,19 +153,20 @@
       }
     },
     "node_modules/@babel/helper-create-class-features-plugin": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz",
-      "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-function-name": "^7.23.0",
-        "@babel/helper-member-expression-to-functions": "^7.23.0",
-        "@babel/helper-optimise-call-expression": "^7.22.5",
-        "@babel/helper-replace-supers": "^7.24.1",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.6",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz",
+      "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/helper-member-expression-to-functions": "^7.24.7",
+        "@babel/helper-optimise-call-expression": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/helper-split-export-declaration": "^7.24.7",
         "semver": "^6.3.1"
       },
       "engines": {
@@ -167,12 +177,13 @@
       }
     },
     "node_modules/@babel/helper-create-regexp-features-plugin": {
-      "version": "7.22.15",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz",
-      "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz",
+      "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
+        "@babel/helper-annotate-as-pure": "^7.24.7",
         "regexpu-core": "^5.3.1",
         "semver": "^6.3.1"
       },
@@ -184,10 +195,11 @@
       }
     },
     "node_modules/@babel/helper-define-polyfill-provider": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz",
-      "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==",
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
+      "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-compilation-targets": "^7.22.6",
         "@babel/helper-plugin-utils": "^7.22.5",
@@ -200,74 +212,85 @@
       }
     },
     "node_modules/@babel/helper-environment-visitor": {
-      "version": "7.22.20",
-      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
-      "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz",
+      "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==",
       "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.24.7"
+      },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-function-name": {
-      "version": "7.23.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
-      "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz",
+      "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/template": "^7.22.15",
-        "@babel/types": "^7.23.0"
+        "@babel/template": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-hoist-variables": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
-      "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz",
+      "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-member-expression-to-functions": {
-      "version": "7.23.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz",
-      "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz",
+      "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.23.0"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-module-imports": {
-      "version": "7.24.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz",
-      "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
+      "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.24.0"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-module-transforms": {
-      "version": "7.23.3",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
-      "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz",
+      "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-module-imports": "^7.22.15",
-        "@babel/helper-simple-access": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.6",
-        "@babel/helper-validator-identifier": "^7.22.20"
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-simple-access": "^7.24.7",
+        "@babel/helper-split-export-declaration": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -277,35 +300,38 @@
       }
     },
     "node_modules/@babel/helper-optimise-call-expression": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz",
-      "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
+      "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.24.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz",
-      "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz",
+      "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-remap-async-to-generator": {
-      "version": "7.22.20",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz",
-      "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz",
+      "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-wrap-function": "^7.22.20"
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-wrap-function": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -315,14 +341,15 @@
       }
     },
     "node_modules/@babel/helper-replace-supers": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz",
-      "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz",
+      "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-member-expression-to-functions": "^7.23.0",
-        "@babel/helper-optimise-call-expression": "^7.22.5"
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-member-expression-to-functions": "^7.24.7",
+        "@babel/helper-optimise-call-expression": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -332,103 +359,114 @@
       }
     },
     "node_modules/@babel/helper-simple-access": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
-      "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
+      "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz",
-      "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz",
+      "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-split-export-declaration": {
-      "version": "7.22.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
-      "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz",
+      "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-string-parser": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz",
-      "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz",
+      "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.22.20",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
-      "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+      "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-option": {
-      "version": "7.23.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
-      "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz",
+      "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-wrap-function": {
-      "version": "7.22.20",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz",
-      "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz",
+      "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-function-name": "^7.22.5",
-        "@babel/template": "^7.22.15",
-        "@babel/types": "^7.22.19"
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/template": "^7.24.7",
+        "@babel/traverse": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz",
-      "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz",
+      "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/template": "^7.24.0",
-        "@babel/traverse": "^7.24.1",
-        "@babel/types": "^7.24.0"
+        "@babel/template": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/highlight": {
-      "version": "7.24.2",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz",
-      "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+      "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-validator-identifier": "^7.22.20",
+        "@babel/helper-validator-identifier": "^7.24.7",
         "chalk": "^2.4.2",
         "js-tokens": "^4.0.0",
         "picocolors": "^1.0.0"
@@ -438,10 +476,11 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz",
-      "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz",
+      "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -449,13 +488,31 @@
         "node": ">=6.0.0"
       }
     },
+    "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz",
+      "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
     "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz",
-      "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz",
+      "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -465,14 +522,15 @@
       }
     },
     "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz",
-      "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz",
+      "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
-        "@babel/plugin-transform-optional-chaining": "^7.24.1"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
+        "@babel/plugin-transform-optional-chaining": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -482,13 +540,14 @@
       }
     },
     "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz",
-      "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz",
+      "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -502,6 +561,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
       "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       },
@@ -514,6 +574,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
       "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -526,6 +587,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
       "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.12.13"
       },
@@ -538,6 +600,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
       "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.14.5"
       },
@@ -553,6 +616,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
       "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -565,6 +629,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
       "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.3"
       },
@@ -573,12 +638,13 @@
       }
     },
     "node_modules/@babel/plugin-syntax-import-assertions": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz",
-      "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz",
+      "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -588,12 +654,13 @@
       }
     },
     "node_modules/@babel/plugin-syntax-import-attributes": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz",
-      "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz",
+      "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -607,6 +674,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
       "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.10.4"
       },
@@ -619,6 +687,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
       "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -631,6 +700,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
       "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.10.4"
       },
@@ -643,6 +713,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
       "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -655,6 +726,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
       "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.10.4"
       },
@@ -667,6 +739,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
       "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -679,6 +752,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
       "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -691,6 +765,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
       "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.8.0"
       },
@@ -703,6 +778,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
       "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.14.5"
       },
@@ -718,6 +794,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
       "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.14.5"
       },
@@ -733,6 +810,7 @@
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
       "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-create-regexp-features-plugin": "^7.18.6",
         "@babel/helper-plugin-utils": "^7.18.6"
@@ -745,12 +823,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-arrow-functions": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz",
-      "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz",
+      "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -760,14 +839,15 @@
       }
     },
     "node_modules/@babel/plugin-transform-async-generator-functions": {
-      "version": "7.24.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz",
-      "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz",
+      "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-remap-async-to-generator": "^7.22.20",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-remap-async-to-generator": "^7.24.7",
         "@babel/plugin-syntax-async-generators": "^7.8.4"
       },
       "engines": {
@@ -778,14 +858,15 @@
       }
     },
     "node_modules/@babel/plugin-transform-async-to-generator": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz",
-      "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz",
+      "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-module-imports": "^7.24.1",
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-remap-async-to-generator": "^7.22.20"
+        "@babel/helper-module-imports": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-remap-async-to-generator": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -795,12 +876,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-block-scoped-functions": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz",
-      "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz",
+      "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -810,12 +892,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-block-scoping": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz",
-      "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz",
+      "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -825,13 +908,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-class-properties": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz",
-      "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz",
+      "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.24.1",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -841,13 +925,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-class-static-block": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz",
-      "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz",
+      "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.24.1",
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-class-static-block": "^7.14.5"
       },
       "engines": {
@@ -858,18 +943,19 @@
       }
     },
     "node_modules/@babel/plugin-transform-classes": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz",
-      "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-compilation-targets": "^7.23.6",
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-function-name": "^7.23.0",
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-replace-supers": "^7.24.1",
-        "@babel/helper-split-export-declaration": "^7.22.6",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz",
+      "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.24.7",
+        "@babel/helper-split-export-declaration": "^7.24.7",
         "globals": "^11.1.0"
       },
       "engines": {
@@ -880,13 +966,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-computed-properties": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz",
-      "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz",
+      "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/template": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/template": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -896,12 +983,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-destructuring": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz",
-      "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz",
+      "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -911,13 +999,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-dotall-regex": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz",
-      "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz",
+      "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -927,12 +1016,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-duplicate-keys": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz",
-      "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz",
+      "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -942,12 +1032,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-dynamic-import": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz",
-      "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz",
+      "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-dynamic-import": "^7.8.3"
       },
       "engines": {
@@ -958,13 +1049,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz",
-      "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz",
+      "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -974,12 +1066,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-export-namespace-from": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz",
-      "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz",
+      "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
       },
       "engines": {
@@ -990,13 +1083,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-for-of": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz",
-      "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz",
+      "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1006,14 +1100,15 @@
       }
     },
     "node_modules/@babel/plugin-transform-function-name": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz",
-      "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz",
+      "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-compilation-targets": "^7.23.6",
-        "@babel/helper-function-name": "^7.23.0",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1023,12 +1118,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-json-strings": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz",
-      "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz",
+      "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-json-strings": "^7.8.3"
       },
       "engines": {
@@ -1039,12 +1135,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-literals": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz",
-      "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz",
+      "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1054,12 +1151,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-logical-assignment-operators": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz",
-      "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz",
+      "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
       },
       "engines": {
@@ -1070,12 +1168,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-member-expression-literals": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz",
-      "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz",
+      "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1085,13 +1184,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-amd": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz",
-      "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz",
+      "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1101,14 +1201,15 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-commonjs": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz",
-      "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz",
+      "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-simple-access": "^7.22.5"
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-simple-access": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1118,15 +1219,16 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-systemjs": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz",
-      "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz",
+      "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-hoist-variables": "^7.22.5",
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-validator-identifier": "^7.22.20"
+        "@babel/helper-hoist-variables": "^7.24.7",
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1136,13 +1238,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-modules-umd": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz",
-      "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz",
+      "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-module-transforms": "^7.23.3",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-module-transforms": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1152,13 +1255,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
-      "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz",
+      "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.5",
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1168,12 +1272,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-new-target": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz",
-      "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz",
+      "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1183,12 +1288,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz",
-      "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz",
+      "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
       },
       "engines": {
@@ -1199,12 +1305,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-numeric-separator": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz",
-      "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz",
+      "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-numeric-separator": "^7.10.4"
       },
       "engines": {
@@ -1215,15 +1322,16 @@
       }
     },
     "node_modules/@babel/plugin-transform-object-rest-spread": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz",
-      "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz",
+      "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-compilation-targets": "^7.23.6",
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-transform-parameters": "^7.24.1"
+        "@babel/plugin-transform-parameters": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1233,13 +1341,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-object-super": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz",
-      "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz",
+      "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-replace-supers": "^7.24.1"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-replace-supers": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1249,12 +1358,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-optional-catch-binding": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz",
-      "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz",
+      "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
       },
       "engines": {
@@ -1265,13 +1375,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-optional-chaining": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz",
-      "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz",
+      "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
         "@babel/plugin-syntax-optional-chaining": "^7.8.3"
       },
       "engines": {
@@ -1282,12 +1393,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-parameters": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz",
-      "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz",
+      "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1297,13 +1409,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-private-methods": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz",
-      "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz",
+      "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-class-features-plugin": "^7.24.1",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1313,14 +1426,15 @@
       }
     },
     "node_modules/@babel/plugin-transform-private-property-in-object": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz",
-      "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz",
+      "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-annotate-as-pure": "^7.22.5",
-        "@babel/helper-create-class-features-plugin": "^7.24.1",
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-annotate-as-pure": "^7.24.7",
+        "@babel/helper-create-class-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
       },
       "engines": {
@@ -1331,12 +1445,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-property-literals": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz",
-      "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz",
+      "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1346,12 +1461,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-regenerator": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz",
-      "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz",
+      "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
+        "@babel/helper-plugin-utils": "^7.24.7",
         "regenerator-transform": "^0.15.2"
       },
       "engines": {
@@ -1362,12 +1478,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-reserved-words": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz",
-      "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz",
+      "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1377,12 +1494,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-shorthand-properties": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz",
-      "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz",
+      "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1392,13 +1510,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-spread": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz",
-      "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz",
+      "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1408,12 +1527,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-sticky-regex": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz",
-      "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz",
+      "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1423,12 +1543,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-template-literals": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz",
-      "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz",
+      "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1438,12 +1559,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-typeof-symbol": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz",
-      "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz",
+      "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1453,12 +1575,13 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-escapes": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz",
-      "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz",
+      "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1468,13 +1591,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-property-regex": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz",
-      "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz",
+      "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1484,13 +1608,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-regex": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz",
-      "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz",
+      "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1500,13 +1625,14 @@
       }
     },
     "node_modules/@babel/plugin-transform-unicode-sets-regex": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz",
-      "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz",
+      "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-create-regexp-features-plugin": "^7.22.15",
-        "@babel/helper-plugin-utils": "^7.24.0"
+        "@babel/helper-create-regexp-features-plugin": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -1516,26 +1642,28 @@
       }
     },
     "node_modules/@babel/preset-env": {
-      "version": "7.24.3",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz",
-      "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/compat-data": "^7.24.1",
-        "@babel/helper-compilation-targets": "^7.23.6",
-        "@babel/helper-plugin-utils": "^7.24.0",
-        "@babel/helper-validator-option": "^7.23.5",
-        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1",
-        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1",
-        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz",
+      "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.24.7",
+        "@babel/helper-compilation-targets": "^7.24.7",
+        "@babel/helper-plugin-utils": "^7.24.7",
+        "@babel/helper-validator-option": "^7.24.7",
+        "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7",
+        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7",
+        "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7",
         "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
         "@babel/plugin-syntax-async-generators": "^7.8.4",
         "@babel/plugin-syntax-class-properties": "^7.12.13",
         "@babel/plugin-syntax-class-static-block": "^7.14.5",
         "@babel/plugin-syntax-dynamic-import": "^7.8.3",
         "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
-        "@babel/plugin-syntax-import-assertions": "^7.24.1",
-        "@babel/plugin-syntax-import-attributes": "^7.24.1",
+        "@babel/plugin-syntax-import-assertions": "^7.24.7",
+        "@babel/plugin-syntax-import-attributes": "^7.24.7",
         "@babel/plugin-syntax-import-meta": "^7.10.4",
         "@babel/plugin-syntax-json-strings": "^7.8.3",
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
@@ -1547,54 +1675,54 @@
         "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
         "@babel/plugin-syntax-top-level-await": "^7.14.5",
         "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
-        "@babel/plugin-transform-arrow-functions": "^7.24.1",
-        "@babel/plugin-transform-async-generator-functions": "^7.24.3",
-        "@babel/plugin-transform-async-to-generator": "^7.24.1",
-        "@babel/plugin-transform-block-scoped-functions": "^7.24.1",
-        "@babel/plugin-transform-block-scoping": "^7.24.1",
-        "@babel/plugin-transform-class-properties": "^7.24.1",
-        "@babel/plugin-transform-class-static-block": "^7.24.1",
-        "@babel/plugin-transform-classes": "^7.24.1",
-        "@babel/plugin-transform-computed-properties": "^7.24.1",
-        "@babel/plugin-transform-destructuring": "^7.24.1",
-        "@babel/plugin-transform-dotall-regex": "^7.24.1",
-        "@babel/plugin-transform-duplicate-keys": "^7.24.1",
-        "@babel/plugin-transform-dynamic-import": "^7.24.1",
-        "@babel/plugin-transform-exponentiation-operator": "^7.24.1",
-        "@babel/plugin-transform-export-namespace-from": "^7.24.1",
-        "@babel/plugin-transform-for-of": "^7.24.1",
-        "@babel/plugin-transform-function-name": "^7.24.1",
-        "@babel/plugin-transform-json-strings": "^7.24.1",
-        "@babel/plugin-transform-literals": "^7.24.1",
-        "@babel/plugin-transform-logical-assignment-operators": "^7.24.1",
-        "@babel/plugin-transform-member-expression-literals": "^7.24.1",
-        "@babel/plugin-transform-modules-amd": "^7.24.1",
-        "@babel/plugin-transform-modules-commonjs": "^7.24.1",
-        "@babel/plugin-transform-modules-systemjs": "^7.24.1",
-        "@babel/plugin-transform-modules-umd": "^7.24.1",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
-        "@babel/plugin-transform-new-target": "^7.24.1",
-        "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1",
-        "@babel/plugin-transform-numeric-separator": "^7.24.1",
-        "@babel/plugin-transform-object-rest-spread": "^7.24.1",
-        "@babel/plugin-transform-object-super": "^7.24.1",
-        "@babel/plugin-transform-optional-catch-binding": "^7.24.1",
-        "@babel/plugin-transform-optional-chaining": "^7.24.1",
-        "@babel/plugin-transform-parameters": "^7.24.1",
-        "@babel/plugin-transform-private-methods": "^7.24.1",
-        "@babel/plugin-transform-private-property-in-object": "^7.24.1",
-        "@babel/plugin-transform-property-literals": "^7.24.1",
-        "@babel/plugin-transform-regenerator": "^7.24.1",
-        "@babel/plugin-transform-reserved-words": "^7.24.1",
-        "@babel/plugin-transform-shorthand-properties": "^7.24.1",
-        "@babel/plugin-transform-spread": "^7.24.1",
-        "@babel/plugin-transform-sticky-regex": "^7.24.1",
-        "@babel/plugin-transform-template-literals": "^7.24.1",
-        "@babel/plugin-transform-typeof-symbol": "^7.24.1",
-        "@babel/plugin-transform-unicode-escapes": "^7.24.1",
-        "@babel/plugin-transform-unicode-property-regex": "^7.24.1",
-        "@babel/plugin-transform-unicode-regex": "^7.24.1",
-        "@babel/plugin-transform-unicode-sets-regex": "^7.24.1",
+        "@babel/plugin-transform-arrow-functions": "^7.24.7",
+        "@babel/plugin-transform-async-generator-functions": "^7.24.7",
+        "@babel/plugin-transform-async-to-generator": "^7.24.7",
+        "@babel/plugin-transform-block-scoped-functions": "^7.24.7",
+        "@babel/plugin-transform-block-scoping": "^7.24.7",
+        "@babel/plugin-transform-class-properties": "^7.24.7",
+        "@babel/plugin-transform-class-static-block": "^7.24.7",
+        "@babel/plugin-transform-classes": "^7.24.7",
+        "@babel/plugin-transform-computed-properties": "^7.24.7",
+        "@babel/plugin-transform-destructuring": "^7.24.7",
+        "@babel/plugin-transform-dotall-regex": "^7.24.7",
+        "@babel/plugin-transform-duplicate-keys": "^7.24.7",
+        "@babel/plugin-transform-dynamic-import": "^7.24.7",
+        "@babel/plugin-transform-exponentiation-operator": "^7.24.7",
+        "@babel/plugin-transform-export-namespace-from": "^7.24.7",
+        "@babel/plugin-transform-for-of": "^7.24.7",
+        "@babel/plugin-transform-function-name": "^7.24.7",
+        "@babel/plugin-transform-json-strings": "^7.24.7",
+        "@babel/plugin-transform-literals": "^7.24.7",
+        "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
+        "@babel/plugin-transform-member-expression-literals": "^7.24.7",
+        "@babel/plugin-transform-modules-amd": "^7.24.7",
+        "@babel/plugin-transform-modules-commonjs": "^7.24.7",
+        "@babel/plugin-transform-modules-systemjs": "^7.24.7",
+        "@babel/plugin-transform-modules-umd": "^7.24.7",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
+        "@babel/plugin-transform-new-target": "^7.24.7",
+        "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
+        "@babel/plugin-transform-numeric-separator": "^7.24.7",
+        "@babel/plugin-transform-object-rest-spread": "^7.24.7",
+        "@babel/plugin-transform-object-super": "^7.24.7",
+        "@babel/plugin-transform-optional-catch-binding": "^7.24.7",
+        "@babel/plugin-transform-optional-chaining": "^7.24.7",
+        "@babel/plugin-transform-parameters": "^7.24.7",
+        "@babel/plugin-transform-private-methods": "^7.24.7",
+        "@babel/plugin-transform-private-property-in-object": "^7.24.7",
+        "@babel/plugin-transform-property-literals": "^7.24.7",
+        "@babel/plugin-transform-regenerator": "^7.24.7",
+        "@babel/plugin-transform-reserved-words": "^7.24.7",
+        "@babel/plugin-transform-shorthand-properties": "^7.24.7",
+        "@babel/plugin-transform-spread": "^7.24.7",
+        "@babel/plugin-transform-sticky-regex": "^7.24.7",
+        "@babel/plugin-transform-template-literals": "^7.24.7",
+        "@babel/plugin-transform-typeof-symbol": "^7.24.7",
+        "@babel/plugin-transform-unicode-escapes": "^7.24.7",
+        "@babel/plugin-transform-unicode-property-regex": "^7.24.7",
+        "@babel/plugin-transform-unicode-regex": "^7.24.7",
+        "@babel/plugin-transform-unicode-sets-regex": "^7.24.7",
         "@babel/preset-modules": "0.1.6-no-external-plugins",
         "babel-plugin-polyfill-corejs2": "^0.4.10",
         "babel-plugin-polyfill-corejs3": "^0.10.4",
@@ -1614,6 +1742,7 @@
       "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
       "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-plugin-utils": "^7.0.0",
         "@babel/types": "^7.4.4",
@@ -1624,10 +1753,11 @@
       }
     },
     "node_modules/@babel/register": {
-      "version": "7.23.7",
-      "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz",
-      "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==",
+      "version": "7.24.6",
+      "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.24.6.tgz",
+      "integrity": "sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "clone-deep": "^4.0.1",
         "find-cache-dir": "^2.0.0",
@@ -1646,13 +1776,15 @@
       "version": "0.8.0",
       "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
       "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@babel/runtime": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz",
-      "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz",
+      "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "regenerator-runtime": "^0.14.0"
       },
@@ -1661,33 +1793,35 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.24.0",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz",
-      "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz",
+      "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/code-frame": "^7.23.5",
-        "@babel/parser": "^7.24.0",
-        "@babel/types": "^7.24.0"
+        "@babel/code-frame": "^7.24.7",
+        "@babel/parser": "^7.24.7",
+        "@babel/types": "^7.24.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.24.1",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz",
-      "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.24.1",
-        "@babel/generator": "^7.24.1",
-        "@babel/helper-environment-visitor": "^7.22.20",
-        "@babel/helper-function-name": "^7.23.0",
-        "@babel/helper-hoist-variables": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.6",
-        "@babel/parser": "^7.24.1",
-        "@babel/types": "^7.24.0",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz",
+      "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.24.7",
+        "@babel/generator": "^7.24.7",
+        "@babel/helper-environment-visitor": "^7.24.7",
+        "@babel/helper-function-name": "^7.24.7",
+        "@babel/helper-hoist-variables": "^7.24.7",
+        "@babel/helper-split-export-declaration": "^7.24.7",
+        "@babel/parser": "^7.24.7",
+        "@babel/types": "^7.24.7",
         "debug": "^4.3.1",
         "globals": "^11.1.0"
       },
@@ -1696,13 +1830,14 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.24.0",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz",
-      "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz",
+      "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-string-parser": "^7.23.4",
-        "@babel/helper-validator-identifier": "^7.22.20",
+        "@babel/helper-string-parser": "^7.24.7",
+        "@babel/helper-validator-identifier": "^7.24.7",
         "to-fast-properties": "^2.0.0"
       },
       "engines": {
@@ -1714,6 +1849,7 @@
       "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
       "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.1.90"
       }
@@ -1723,6 +1859,7 @@
       "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
       "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/set-array": "^1.2.1",
         "@jridgewell/sourcemap-codec": "^1.4.10",
@@ -1737,6 +1874,7 @@
       "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
       "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.0.0"
       }
@@ -1746,6 +1884,7 @@
       "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
       "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.0.0"
       }
@@ -1754,44 +1893,50 @@
       "version": "1.4.15",
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
       "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@jridgewell/trace-mapping": {
       "version": "0.3.25",
       "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
       "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/resolve-uri": "^3.1.0",
         "@jridgewell/sourcemap-codec": "^1.4.14"
       }
     },
     "node_modules/@socket.io/component-emitter": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
-      "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==",
-      "dev": true
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
+      "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/cookie": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
       "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/cors": {
       "version": "2.8.17",
       "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
       "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/node": "*"
       }
     },
     "node_modules/@types/node": {
-      "version": "20.12.2",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.2.tgz",
-      "integrity": "sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==",
+      "version": "20.14.6",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.6.tgz",
+      "integrity": "sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "undici-types": "~5.26.4"
       }
@@ -1801,6 +1946,7 @@
       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
       "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "mime-types": "~2.1.34",
         "negotiator": "0.6.3"
@@ -1814,6 +1960,7 @@
       "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
       "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -1823,6 +1970,7 @@
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
       "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -1832,6 +1980,7 @@
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-convert": "^1.9.0"
       },
@@ -1844,6 +1993,7 @@
       "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
       "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "normalize-path": "^3.0.0",
         "picomatch": "^2.0.4"
@@ -1856,25 +2006,28 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
       "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-      "dev": true
+      "dev": true,
+      "license": "Python-2.0"
     },
     "node_modules/assertion-error": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
       "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "*"
       }
     },
     "node_modules/babel-plugin-polyfill-corejs2": {
-      "version": "0.4.10",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz",
-      "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==",
+      "version": "0.4.11",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
+      "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/compat-data": "^7.22.6",
-        "@babel/helper-define-polyfill-provider": "^0.6.1",
+        "@babel/helper-define-polyfill-provider": "^0.6.2",
         "semver": "^6.3.1"
       },
       "peerDependencies": {
@@ -1886,6 +2039,7 @@
       "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz",
       "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/helper-define-polyfill-provider": "^0.6.1",
         "core-js-compat": "^3.36.1"
@@ -1895,12 +2049,13 @@
       }
     },
     "node_modules/babel-plugin-polyfill-regenerator": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz",
-      "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==",
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz",
+      "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "@babel/helper-define-polyfill-provider": "^0.6.1"
+        "@babel/helper-define-polyfill-provider": "^0.6.2"
       },
       "peerDependencies": {
         "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
@@ -1910,13 +2065,15 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/base64id": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
       "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "^4.5.0 || >= 5.9"
       }
@@ -1926,6 +2083,7 @@
       "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
       "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       },
@@ -1938,6 +2096,7 @@
       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
       "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "bytes": "3.1.2",
         "content-type": "~1.0.5",
@@ -1962,6 +2121,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
@@ -1970,25 +2130,28 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
     "node_modules/braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "fill-range": "^7.0.1"
+        "fill-range": "^7.1.1"
       },
       "engines": {
         "node": ">=8"
@@ -1998,12 +2161,13 @@
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
       "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/browserslist": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
-      "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
+      "version": "4.23.1",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz",
+      "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==",
       "dev": true,
       "funding": [
         {
@@ -2019,11 +2183,12 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
+      "license": "MIT",
       "dependencies": {
-        "caniuse-lite": "^1.0.30001587",
-        "electron-to-chromium": "^1.4.668",
+        "caniuse-lite": "^1.0.30001629",
+        "electron-to-chromium": "^1.4.796",
         "node-releases": "^2.0.14",
-        "update-browserslist-db": "^1.0.13"
+        "update-browserslist-db": "^1.0.16"
       },
       "bin": {
         "browserslist": "cli.js"
@@ -2036,13 +2201,15 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/bytes": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
       "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -2052,6 +2219,7 @@
       "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
       "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
@@ -2071,6 +2239,7 @@
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
       "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
@@ -2079,9 +2248,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001603",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001603.tgz",
-      "integrity": "sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q==",
+      "version": "1.0.30001636",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz",
+      "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==",
       "dev": true,
       "funding": [
         {
@@ -2096,13 +2265,15 @@
           "type": "github",
           "url": "https://github.com/sponsors/ai"
         }
-      ]
+      ],
+      "license": "CC-BY-4.0"
     },
     "node_modules/chai": {
       "version": "4.4.1",
       "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz",
       "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "assertion-error": "^1.1.0",
         "check-error": "^1.0.3",
@@ -2121,6 +2292,7 @@
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -2135,6 +2307,7 @@
       "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
       "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "get-func-name": "^2.0.2"
       },
@@ -2147,6 +2320,7 @@
       "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
       "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "anymatch": "~3.1.2",
         "braces": "~3.0.2",
@@ -2171,6 +2345,7 @@
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
       "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "string-width": "^4.2.0",
         "strip-ansi": "^6.0.0",
@@ -2182,6 +2357,7 @@
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -2191,6 +2367,7 @@
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^5.0.1"
       },
@@ -2203,6 +2380,7 @@
       "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
       "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-plain-object": "^2.0.4",
         "kind-of": "^6.0.2",
@@ -2217,6 +2395,7 @@
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-name": "1.1.3"
       }
@@ -2225,25 +2404,29 @@
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
       "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/commondir": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
       "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
       "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/connect": {
       "version": "3.7.0",
       "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
       "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "2.6.9",
         "finalhandler": "1.1.2",
@@ -2259,6 +2442,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
@@ -2267,13 +2451,15 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/content-type": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
       "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -2282,13 +2468,15 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
       "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/cookie": {
       "version": "0.4.2",
       "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
       "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -2298,6 +2486,7 @@
       "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz",
       "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "glob": "^7.0.5",
         "minimatch": "^3.0.3",
@@ -2313,10 +2502,11 @@
       }
     },
     "node_modules/core-js-compat": {
-      "version": "3.36.1",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz",
-      "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==",
+      "version": "3.37.1",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
+      "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "browserslist": "^4.23.0"
       },
@@ -2329,13 +2519,15 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
       "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/cors": {
       "version": "2.8.5",
       "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
       "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "object-assign": "^4",
         "vary": "^1"
@@ -2348,22 +2540,25 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
       "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/date-format": {
       "version": "4.0.14",
       "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz",
       "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4.0"
       }
     },
     "node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "version": "4.3.5",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+      "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "2.1.2"
       },
@@ -2381,6 +2576,7 @@
       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
       "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
@@ -2389,10 +2585,11 @@
       }
     },
     "node_modules/deep-eql": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
-      "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
+      "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "type-detect": "^4.0.0"
       },
@@ -2405,6 +2602,7 @@
       "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
       "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
@@ -2422,6 +2620,7 @@
       "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
       "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -2431,6 +2630,7 @@
       "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
       "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8",
         "npm": "1.2.8000 || >= 1.4.16"
@@ -2440,13 +2640,15 @@
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
       "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/diff": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
       "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "engines": {
         "node": ">=0.3.1"
       }
@@ -2456,6 +2658,7 @@
       "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
       "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "custom-event": "~1.0.0",
         "ent": "~2.2.0",
@@ -2467,34 +2670,39 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
       "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.723",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.723.tgz",
-      "integrity": "sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw==",
-      "dev": true
+      "version": "1.4.806",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.806.tgz",
+      "integrity": "sha512-nkoEX2QIB8kwCOtvtgwhXWy2IHVcOLQZu9Qo36uaGB835mdX/h8uLRlosL6QIhLVUnAiicXRW00PwaPZC74Nrg==",
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
       "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/encodeurl": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
       "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
     },
     "node_modules/engine.io": {
-      "version": "6.5.4",
-      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz",
-      "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==",
+      "version": "6.5.5",
+      "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz",
+      "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/cookie": "^0.4.1",
         "@types/cors": "^2.8.12",
@@ -2505,7 +2713,7 @@
         "cors": "~2.8.5",
         "debug": "~4.3.1",
         "engine.io-parser": "~5.2.1",
-        "ws": "~8.11.0"
+        "ws": "~8.17.1"
       },
       "engines": {
         "node": ">=10.2.0"
@@ -2516,6 +2724,7 @@
       "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz",
       "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10.0.0"
       }
@@ -2524,13 +2733,15 @@
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
       "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/es-define-property": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
       "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "get-intrinsic": "^1.2.4"
       },
@@ -2543,6 +2754,7 @@
       "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
       "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       }
@@ -2552,6 +2764,7 @@
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
       "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -2560,13 +2773,15 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/escape-string-regexp": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
       "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.8.0"
       }
@@ -2576,6 +2791,7 @@
       "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
       "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -2584,19 +2800,22 @@
       "version": "4.0.7",
       "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
       "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/extend": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
       "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "to-regex-range": "^5.0.1"
       },
@@ -2609,6 +2828,7 @@
       "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
       "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "2.6.9",
         "encodeurl": "~1.0.2",
@@ -2627,6 +2847,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
@@ -2635,13 +2856,15 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/finalhandler/node_modules/on-finished": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
       "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ee-first": "1.1.1"
       },
@@ -2654,6 +2877,7 @@
       "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
       "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "commondir": "^1.0.1",
         "make-dir": "^2.0.0",
@@ -2668,6 +2892,7 @@
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
       "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "locate-path": "^6.0.0",
         "path-exists": "^4.0.0"
@@ -2684,6 +2909,7 @@
       "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
       "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "bin": {
         "flat": "cli.js"
       }
@@ -2692,7 +2918,8 @@
       "version": "3.3.1",
       "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
       "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/follow-redirects": {
       "version": "1.15.6",
@@ -2705,6 +2932,7 @@
           "url": "https://github.com/sponsors/RubenVerborgh"
         }
       ],
+      "license": "MIT",
       "engines": {
         "node": ">=4.0"
       },
@@ -2719,6 +2947,7 @@
       "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
       "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.2.0",
         "jsonfile": "^4.0.0",
@@ -2732,7 +2961,8 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
       "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/fsevents": {
       "version": "2.3.3",
@@ -2740,6 +2970,7 @@
       "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
       "dev": true,
       "hasInstallScript": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
@@ -2753,6 +2984,7 @@
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
       "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
       "dev": true,
+      "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -2762,6 +2994,7 @@
       "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
       "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6.9.0"
       }
@@ -2771,6 +3004,7 @@
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
       "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
       "dev": true,
+      "license": "ISC",
       "engines": {
         "node": "6.* || 8.* || >= 10.*"
       }
@@ -2780,6 +3014,7 @@
       "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
       "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "*"
       }
@@ -2789,6 +3024,7 @@
       "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
       "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "es-errors": "^1.3.0",
         "function-bind": "^1.1.2",
@@ -2807,7 +3043,9 @@
       "version": "7.2.3",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -2828,6 +3066,7 @@
       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
       "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "is-glob": "^4.0.1"
       },
@@ -2840,6 +3079,7 @@
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
       "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -2849,6 +3089,7 @@
       "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
       "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "get-intrinsic": "^1.1.3"
       },
@@ -2860,13 +3101,15 @@
       "version": "4.2.11",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
       "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/has-flag": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
       "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -2876,6 +3119,7 @@
       "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
       "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "es-define-property": "^1.0.0"
       },
@@ -2888,6 +3132,7 @@
       "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
       "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -2900,6 +3145,7 @@
       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
       "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -2912,6 +3158,7 @@
       "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
       "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "function-bind": "^1.1.2"
       },
@@ -2924,6 +3171,7 @@
       "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
       "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "he": "bin/he"
       }
@@ -2933,6 +3181,7 @@
       "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
       "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "depd": "2.0.0",
         "inherits": "2.0.4",
@@ -2949,6 +3198,7 @@
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
       "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -2958,6 +3208,7 @@
       "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
       "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "eventemitter3": "^4.0.0",
         "follow-redirects": "^1.0.0",
@@ -2972,6 +3223,7 @@
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
       "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3"
       },
@@ -2983,7 +3235,9 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -2993,13 +3247,15 @@
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/is-binary-path": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
       "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "binary-extensions": "^2.0.0"
       },
@@ -3012,6 +3268,7 @@
       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
       "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "hasown": "^2.0.0"
       },
@@ -3024,6 +3281,7 @@
       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
       "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -3033,6 +3291,7 @@
       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -3042,6 +3301,7 @@
       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
       "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-extglob": "^2.1.1"
       },
@@ -3054,6 +3314,7 @@
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.12.0"
       }
@@ -3063,6 +3324,7 @@
       "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
       "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -3072,6 +3334,7 @@
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
       "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -3084,6 +3347,7 @@
       "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
       "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
@@ -3095,13 +3359,15 @@
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
       "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/isbinaryfile": {
       "version": "4.0.10",
       "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
       "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 8.0.0"
       },
@@ -3113,13 +3379,15 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
       "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/isobject": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
       "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -3128,13 +3396,15 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/js-yaml": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
       "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "argparse": "^2.0.1"
       },
@@ -3147,6 +3417,7 @@
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
       "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "jsesc": "bin/jsesc"
       },
@@ -3159,6 +3430,7 @@
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
       "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "json5": "lib/cli.js"
       },
@@ -3171,6 +3443,7 @@
       "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
       "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
       "dev": true,
+      "license": "MIT",
       "optionalDependencies": {
         "graceful-fs": "^4.1.6"
       }
@@ -3180,6 +3453,7 @@
       "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz",
       "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@colors/colors": "1.5.0",
         "body-parser": "^1.19.0",
@@ -3218,6 +3492,7 @@
       "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz",
       "integrity": "sha512-mqKCkHwzPMhgTYca10S90aCEX9+HjVjjrBFAsw36Zj7BlQNbokXXCAe6Ji04VUMsxcY5RLP7YphpfO06XOubdg==",
       "dev": true,
+      "license": "MIT",
       "peerDependencies": {
         "chai": "*",
         "karma": ">=0.10.9"
@@ -3228,6 +3503,7 @@
       "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz",
       "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "which": "^1.2.1"
       }
@@ -3237,6 +3513,7 @@
       "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz",
       "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "minimist": "^1.2.3"
       }
@@ -3246,6 +3523,7 @@
       "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz",
       "integrity": "sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "chalk": "^2.1.0",
         "log-symbols": "^2.1.0",
@@ -3260,6 +3538,7 @@
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
       "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "minimist": "^1.2.6"
       },
@@ -3272,6 +3551,7 @@
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
       "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -3281,6 +3561,7 @@
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
       "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "p-locate": "^5.0.0"
       },
@@ -3295,19 +3576,22 @@
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lodash.debounce": {
       "version": "4.0.8",
       "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
       "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/log-symbols": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
       "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "chalk": "^2.0.1"
       },
@@ -3320,6 +3604,7 @@
       "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz",
       "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "date-format": "^4.0.14",
         "debug": "^4.3.4",
@@ -3336,6 +3621,7 @@
       "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
       "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "get-func-name": "^2.0.1"
       }
@@ -3345,6 +3631,7 @@
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
       "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "yallist": "^3.0.2"
       }
@@ -3354,6 +3641,7 @@
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
       "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "pify": "^4.0.1",
         "semver": "^5.6.0"
@@ -3367,6 +3655,7 @@
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
       "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver"
       }
@@ -3376,6 +3665,7 @@
       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
       "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -3385,6 +3675,7 @@
       "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
       "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "mime": "cli.js"
       },
@@ -3397,6 +3688,7 @@
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -3406,6 +3698,7 @@
       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "mime-db": "1.52.0"
       },
@@ -3418,6 +3711,7 @@
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "brace-expansion": "^1.1.7"
       },
@@ -3430,6 +3724,7 @@
       "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
       "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
       "dev": true,
+      "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -3439,6 +3734,7 @@
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
       "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "mkdirp": "bin/cmd.js"
       },
@@ -3451,6 +3747,7 @@
       "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz",
       "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-colors": "4.1.1",
         "browser-stdout": "1.3.1",
@@ -3486,6 +3783,7 @@
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-convert": "^2.0.1"
       },
@@ -3501,6 +3799,7 @@
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
       "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "balanced-match": "^1.0.0"
       }
@@ -3510,6 +3809,7 @@
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
       "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
@@ -3526,6 +3826,7 @@
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
       "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -3544,6 +3845,7 @@
           "url": "https://paulmillr.com/funding/"
         }
       ],
+      "license": "MIT",
       "dependencies": {
         "anymatch": "~3.1.2",
         "braces": "~3.0.2",
@@ -3565,6 +3867,7 @@
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-name": "~1.1.4"
       },
@@ -3576,13 +3879,40 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/mocha/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/mocha/node_modules/debug/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/mocha/node_modules/escape-string-regexp": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
       "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
@@ -3594,7 +3924,9 @@
       "version": "8.1.0",
       "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
       "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -3614,6 +3946,7 @@
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -3623,6 +3956,7 @@
       "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
       "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "chalk": "^4.1.0",
         "is-unicode-supported": "^0.1.0"
@@ -3639,6 +3973,7 @@
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
       "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -3650,13 +3985,15 @@
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
       "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/mocha/node_modules/supports-color": {
       "version": "8.1.1",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
       "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -3671,13 +4008,15 @@
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/negotiator": {
       "version": "0.6.3",
       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
       "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -3686,13 +4025,15 @@
       "version": "2.0.14",
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
       "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/noms": {
       "version": "0.0.0",
       "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz",
       "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "inherits": "^2.0.1",
         "readable-stream": "~1.0.31"
@@ -3703,6 +4044,7 @@
       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
       "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -3712,6 +4054,7 @@
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
       "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -3721,6 +4064,7 @@
       "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
       "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
       "dev": true,
+      "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -3730,6 +4074,7 @@
       "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
       "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ee-first": "1.1.1"
       },
@@ -3742,6 +4087,7 @@
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "wrappy": "1"
       }
@@ -3751,6 +4097,7 @@
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
       "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "yocto-queue": "^0.1.0"
       },
@@ -3766,6 +4113,7 @@
       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
       "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "p-limit": "^3.0.2"
       },
@@ -3781,6 +4129,7 @@
       "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
       "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -3790,6 +4139,7 @@
       "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
       "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -3799,6 +4149,7 @@
       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
       "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -3808,6 +4159,7 @@
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
       "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -3816,28 +4168,32 @@
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/pathval": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
       "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": "*"
       }
     },
     "node_modules/picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
-      "dev": true
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/picomatch": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8.6"
       },
@@ -3850,6 +4206,7 @@
       "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
       "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -3859,6 +4216,7 @@
       "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
       "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 6"
       }
@@ -3868,6 +4226,7 @@
       "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
       "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "find-up": "^3.0.0"
       },
@@ -3880,6 +4239,7 @@
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
       "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "locate-path": "^3.0.0"
       },
@@ -3892,6 +4252,7 @@
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
       "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "p-locate": "^3.0.0",
         "path-exists": "^3.0.0"
@@ -3905,6 +4266,7 @@
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
       "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "p-try": "^2.0.0"
       },
@@ -3920,6 +4282,7 @@
       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
       "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "p-limit": "^2.0.0"
       },
@@ -3932,6 +4295,7 @@
       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
       "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -3940,13 +4304,15 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
       "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/qjobs": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
       "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.9"
       }
@@ -3956,6 +4322,7 @@
       "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
       "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "dependencies": {
         "side-channel": "^1.0.4"
       },
@@ -3971,6 +4338,7 @@
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safe-buffer": "^5.1.0"
       }
@@ -3980,6 +4348,7 @@
       "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
       "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -3989,6 +4358,7 @@
       "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
       "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "bytes": "3.1.2",
         "http-errors": "2.0.0",
@@ -4004,6 +4374,7 @@
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
       "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.1",
@@ -4016,6 +4387,7 @@
       "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
       "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "picomatch": "^2.2.1"
       },
@@ -4027,13 +4399,15 @@
       "version": "1.4.2",
       "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
       "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/regenerate-unicode-properties": {
       "version": "10.1.1",
       "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz",
       "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "regenerate": "^1.4.2"
       },
@@ -4045,13 +4419,15 @@
       "version": "0.14.1",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
       "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/regenerator-transform": {
       "version": "0.15.2",
       "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
       "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/runtime": "^7.8.4"
       }
@@ -4061,6 +4437,7 @@
       "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
       "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@babel/regjsgen": "^0.8.0",
         "regenerate": "^1.4.2",
@@ -4078,6 +4455,7 @@
       "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
       "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "jsesc": "~0.5.0"
       },
@@ -4099,6 +4477,7 @@
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
       "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -4107,13 +4486,15 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
       "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/resolve": {
       "version": "1.22.8",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
       "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-core-module": "^2.13.0",
         "path-parse": "^1.0.7",
@@ -4127,16 +4508,19 @@
       }
     },
     "node_modules/rfdc": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
-      "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==",
-      "dev": true
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+      "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/rimraf": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "glob": "^7.1.3"
       },
@@ -4165,19 +4549,22 @@
           "type": "consulting",
           "url": "https://feross.org/support"
         }
-      ]
+      ],
+      "license": "MIT"
     },
     "node_modules/safer-buffer": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/semver": {
       "version": "6.3.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
       "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "dev": true,
+      "license": "ISC",
       "bin": {
         "semver": "bin/semver.js"
       }
@@ -4187,6 +4574,7 @@
       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
       "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "dependencies": {
         "randombytes": "^2.1.0"
       }
@@ -4196,6 +4584,7 @@
       "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
       "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "define-data-property": "^1.1.4",
         "es-errors": "^1.3.0",
@@ -4212,13 +4601,15 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
       "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/shallow-clone": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
       "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "kind-of": "^6.0.2"
       },
@@ -4231,6 +4622,7 @@
       "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
       "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "es-errors": "^1.3.0",
@@ -4249,6 +4641,7 @@
       "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz",
       "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "accepts": "~1.3.4",
         "base64id": "~2.0.0",
@@ -4263,13 +4656,14 @@
       }
     },
     "node_modules/socket.io-adapter": {
-      "version": "2.5.4",
-      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz",
-      "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==",
+      "version": "2.5.5",
+      "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz",
+      "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "~4.3.4",
-        "ws": "~8.11.0"
+        "ws": "~8.17.1"
       }
     },
     "node_modules/socket.io-parser": {
@@ -4277,6 +4671,7 @@
       "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
       "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@socket.io/component-emitter": "~3.1.0",
         "debug": "~4.3.1"
@@ -4290,6 +4685,7 @@
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -4299,6 +4695,7 @@
       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
       "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "buffer-from": "^1.0.0",
         "source-map": "^0.6.0"
@@ -4309,6 +4706,7 @@
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
       "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -4318,6 +4716,7 @@
       "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz",
       "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "date-format": "^4.0.14",
         "debug": "^4.3.4",
@@ -4331,13 +4730,15 @@
       "version": "0.10.31",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
       "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/string-width": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -4352,6 +4753,7 @@
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -4361,6 +4763,7 @@
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^5.0.1"
       },
@@ -4373,6 +4776,7 @@
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
       "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^3.0.0"
       },
@@ -4385,6 +4789,7 @@
       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
       "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       },
@@ -4397,6 +4802,7 @@
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "has-flag": "^3.0.0"
       },
@@ -4409,6 +4815,7 @@
       "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -4421,6 +4828,7 @@
       "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
       "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "readable-stream": "~2.3.6",
         "xtend": "~4.0.1"
@@ -4430,13 +4838,15 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
       "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/through2/node_modules/readable-stream": {
       "version": "2.3.8",
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
       "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.3",
@@ -4451,13 +4861,15 @@
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/through2/node_modules/string_decoder": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
       "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safe-buffer": "~5.1.0"
       }
@@ -4467,6 +4879,7 @@
       "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
       "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=14.14"
       }
@@ -4476,6 +4889,7 @@
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
       "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -4485,6 +4899,7 @@
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
       "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-number": "^7.0.0"
       },
@@ -4497,6 +4912,7 @@
       "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
       "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.6"
       }
@@ -4506,6 +4922,7 @@
       "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
       "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -4515,6 +4932,7 @@
       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
       "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "media-typer": "0.3.0",
         "mime-types": "~2.1.24"
@@ -4524,9 +4942,9 @@
       }
     },
     "node_modules/ua-parser-js": {
-      "version": "0.7.37",
-      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz",
-      "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==",
+      "version": "0.7.38",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.38.tgz",
+      "integrity": "sha512-fYmIy7fKTSFAhG3fuPlubeGaMoAd6r0rSnfEsO5nEY55i26KSLt9EH7PLQiiqPUhNqYIJvSkTy1oArIcXAbPbA==",
       "dev": true,
       "funding": [
         {
@@ -4542,6 +4960,7 @@
           "url": "https://github.com/sponsors/faisalman"
         }
       ],
+      "license": "MIT",
       "engines": {
         "node": "*"
       }
@@ -4550,13 +4969,15 @@
       "version": "5.26.5",
       "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
       "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/unicode-canonical-property-names-ecmascript": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
       "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -4566,6 +4987,7 @@
       "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
       "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "unicode-canonical-property-names-ecmascript": "^2.0.0",
         "unicode-property-aliases-ecmascript": "^2.0.0"
@@ -4579,6 +5001,7 @@
       "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
       "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -4588,6 +5011,7 @@
       "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
       "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=4"
       }
@@ -4597,6 +5021,7 @@
       "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
       "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 4.0.0"
       }
@@ -4606,6 +5031,7 @@
       "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
       "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -4615,14 +5041,15 @@
       "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
       "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
     "node_modules/update-browserslist-db": {
-      "version": "1.0.13",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
-      "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+      "version": "1.0.16",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz",
+      "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==",
       "dev": true,
       "funding": [
         {
@@ -4638,9 +5065,10 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
+      "license": "MIT",
       "dependencies": {
-        "escalade": "^3.1.1",
-        "picocolors": "^1.0.0"
+        "escalade": "^3.1.2",
+        "picocolors": "^1.0.1"
       },
       "bin": {
         "update-browserslist-db": "cli.js"
@@ -4653,13 +5081,15 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
       "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/utils-merge": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
       "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4.0"
       }
@@ -4669,6 +5099,7 @@
       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
       "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -4678,6 +5109,7 @@
       "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
       "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -4687,6 +5119,7 @@
       "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
       "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -4698,13 +5131,15 @@
       "version": "6.2.1",
       "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
       "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
-      "dev": true
+      "dev": true,
+      "license": "Apache-2.0"
     },
     "node_modules/wrap-ansi": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -4722,6 +5157,7 @@
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -4731,6 +5167,7 @@
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
       "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-convert": "^2.0.1"
       },
@@ -4746,6 +5183,7 @@
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
       "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "color-name": "~1.1.4"
       },
@@ -4757,13 +5195,15 @@
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
       "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/wrap-ansi/node_modules/strip-ansi": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^5.0.1"
       },
@@ -4775,19 +5215,21 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/ws": {
-      "version": "8.11.0",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
-      "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
+      "version": "8.17.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+      "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10.0.0"
       },
       "peerDependencies": {
         "bufferutil": "^4.0.1",
-        "utf-8-validate": "^5.0.2"
+        "utf-8-validate": ">=5.0.2"
       },
       "peerDependenciesMeta": {
         "bufferutil": {
@@ -4803,6 +5245,7 @@
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
       "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.4"
       }
@@ -4812,6 +5255,7 @@
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
       "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
       "dev": true,
+      "license": "ISC",
       "engines": {
         "node": ">=10"
       }
@@ -4820,13 +5264,15 @@
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
       "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/yargs": {
       "version": "16.2.0",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
       "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "cliui": "^7.0.2",
         "escalade": "^3.1.1",
@@ -4845,6 +5291,7 @@
       "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
       "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
       "dev": true,
+      "license": "ISC",
       "engines": {
         "node": ">=10"
       }
@@ -4854,6 +5301,7 @@
       "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
       "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "camelcase": "^6.0.0",
         "decamelize": "^4.0.0",
@@ -4869,6 +5317,7 @@
       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
       "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
diff --git a/javascript/MaterialXTest/package.json b/javascript/MaterialXTest/package.json
index 6aede276a9..02f42e430f 100644
--- a/javascript/MaterialXTest/package.json
+++ b/javascript/MaterialXTest/package.json
@@ -16,9 +16,9 @@
   "author": "",
   "license": "ISC",
   "devDependencies": {
-    "@babel/core": "^7.24.3",
-    "@babel/preset-env": "^7.24.3",
-    "@babel/register": "^7.23.7",
+    "@babel/core": "^7.24.7",
+    "@babel/preset-env": "^7.24.7",
+    "@babel/register": "^7.24.6",
     "chai": "^4.4.1",
     "copyfiles": "^2.4.1",
     "karma": "^6.4.3",
diff --git a/javascript/MaterialXView/package-lock.json b/javascript/MaterialXView/package-lock.json
index 00f87c568b..cf4b120c32 100644
--- a/javascript/MaterialXView/package-lock.json
+++ b/javascript/MaterialXView/package-lock.json
@@ -11,7 +11,7 @@
       "dependencies": {
         "lil-gui": "^0.19.2",
         "three": "^0.152.2",
-        "webpack": "^5.91.0"
+        "webpack": "^5.92.1"
       },
       "devDependencies": {
         "copy-webpack-plugin": "^8.1.1",
@@ -25,6 +25,7 @@
       "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
       "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10.0.0"
       }
@@ -33,6 +34,7 @@
       "version": "0.3.5",
       "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
       "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/set-array": "^1.2.1",
         "@jridgewell/sourcemap-codec": "^1.4.10",
@@ -46,6 +48,7 @@
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
       "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.0.0"
       }
@@ -54,6 +57,7 @@
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
       "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.0.0"
       }
@@ -62,6 +66,7 @@
       "version": "0.3.6",
       "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
       "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/gen-mapping": "^0.3.5",
         "@jridgewell/trace-mapping": "^0.3.25"
@@ -70,12 +75,14 @@
     "node_modules/@jridgewell/sourcemap-codec": {
       "version": "1.4.15",
       "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
-      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+      "license": "MIT"
     },
     "node_modules/@jridgewell/trace-mapping": {
       "version": "0.3.25",
       "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
       "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/resolve-uri": "^3.1.0",
         "@jridgewell/sourcemap-codec": "^1.4.14"
@@ -85,13 +92,15 @@
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
       "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
       "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@nodelib/fs.stat": "2.0.5",
         "run-parallel": "^1.1.9"
@@ -105,6 +114,7 @@
       "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
       "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 8"
       }
@@ -114,6 +124,7 @@
       "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
       "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@nodelib/fs.scandir": "2.1.5",
         "fastq": "^1.6.0"
@@ -127,6 +138,7 @@
       "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
       "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/connect": "*",
         "@types/node": "*"
@@ -137,6 +149,7 @@
       "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
       "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/node": "*"
       }
@@ -146,6 +159,7 @@
       "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
       "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/node": "*"
       }
@@ -155,15 +169,17 @@
       "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
       "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/express-serve-static-core": "*",
         "@types/node": "*"
       }
     },
     "node_modules/@types/eslint": {
-      "version": "8.56.7",
-      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.7.tgz",
-      "integrity": "sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==",
+      "version": "8.56.10",
+      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
+      "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
+      "license": "MIT",
       "dependencies": {
         "@types/estree": "*",
         "@types/json-schema": "*"
@@ -173,6 +189,7 @@
       "version": "3.7.7",
       "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
       "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+      "license": "MIT",
       "dependencies": {
         "@types/eslint": "*",
         "@types/estree": "*"
@@ -181,13 +198,15 @@
     "node_modules/@types/estree": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
-      "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
+      "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+      "license": "MIT"
     },
     "node_modules/@types/express": {
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
       "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/body-parser": "*",
         "@types/express-serve-static-core": "^4.17.33",
@@ -196,10 +215,11 @@
       }
     },
     "node_modules/@types/express-serve-static-core": {
-      "version": "4.17.43",
-      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz",
-      "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==",
+      "version": "4.19.5",
+      "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz",
+      "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/node": "*",
         "@types/qs": "*",
@@ -211,19 +231,22 @@
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
       "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/http-errors": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
       "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/http-proxy": {
       "version": "1.17.14",
       "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz",
       "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/node": "*"
       }
@@ -231,18 +254,21 @@
     "node_modules/@types/json-schema": {
       "version": "7.0.15",
       "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="
+      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+      "license": "MIT"
     },
     "node_modules/@types/mime": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
       "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "20.12.2",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.2.tgz",
-      "integrity": "sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==",
+      "version": "20.14.6",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.6.tgz",
+      "integrity": "sha512-JbA0XIJPL1IiNnU7PFxDXyfAwcwVVrOoqyzzyQTyMeVhBzkJVMSkC1LlVsRQ2lpqiY4n6Bb9oCS6lzDKVQxbZw==",
+      "license": "MIT",
       "dependencies": {
         "undici-types": "~5.26.4"
       }
@@ -252,33 +278,38 @@
       "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
       "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/node": "*"
       }
     },
     "node_modules/@types/qs": {
-      "version": "6.9.14",
-      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz",
-      "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==",
-      "dev": true
+      "version": "6.9.15",
+      "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz",
+      "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==",
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/range-parser": {
       "version": "1.2.7",
       "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
       "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/retry": {
       "version": "0.12.0",
       "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
       "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/@types/send": {
       "version": "0.17.4",
       "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
       "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/mime": "^1",
         "@types/node": "*"
@@ -289,19 +320,21 @@
       "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
       "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/express": "*"
       }
     },
     "node_modules/@types/serve-static": {
-      "version": "1.15.5",
-      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz",
-      "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==",
+      "version": "1.15.7",
+      "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
+      "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/http-errors": "*",
-        "@types/mime": "*",
-        "@types/node": "*"
+        "@types/node": "*",
+        "@types/send": "*"
       }
     },
     "node_modules/@types/sockjs": {
@@ -309,6 +342,7 @@
       "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
       "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/node": "*"
       }
@@ -318,6 +352,7 @@
       "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz",
       "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/node": "*"
       }
@@ -326,6 +361,7 @@
       "version": "1.12.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz",
       "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==",
+      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/helper-numbers": "1.11.6",
         "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
@@ -334,22 +370,26 @@
     "node_modules/@webassemblyjs/floating-point-hex-parser": {
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
-      "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw=="
+      "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
+      "license": "MIT"
     },
     "node_modules/@webassemblyjs/helper-api-error": {
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
-      "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q=="
+      "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
+      "license": "MIT"
     },
     "node_modules/@webassemblyjs/helper-buffer": {
       "version": "1.12.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz",
-      "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw=="
+      "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==",
+      "license": "MIT"
     },
     "node_modules/@webassemblyjs/helper-numbers": {
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
       "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/floating-point-hex-parser": "1.11.6",
         "@webassemblyjs/helper-api-error": "1.11.6",
@@ -359,12 +399,14 @@
     "node_modules/@webassemblyjs/helper-wasm-bytecode": {
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
-      "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA=="
+      "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
+      "license": "MIT"
     },
     "node_modules/@webassemblyjs/helper-wasm-section": {
       "version": "1.12.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz",
       "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==",
+      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.12.1",
         "@webassemblyjs/helper-buffer": "1.12.1",
@@ -376,6 +418,7 @@
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
       "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+      "license": "MIT",
       "dependencies": {
         "@xtuc/ieee754": "^1.2.0"
       }
@@ -384,6 +427,7 @@
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
       "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
+      "license": "Apache-2.0",
       "dependencies": {
         "@xtuc/long": "4.2.2"
       }
@@ -391,12 +435,14 @@
     "node_modules/@webassemblyjs/utf8": {
       "version": "1.11.6",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
-      "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA=="
+      "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
+      "license": "MIT"
     },
     "node_modules/@webassemblyjs/wasm-edit": {
       "version": "1.12.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz",
       "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==",
+      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.12.1",
         "@webassemblyjs/helper-buffer": "1.12.1",
@@ -412,6 +458,7 @@
       "version": "1.12.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz",
       "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==",
+      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.12.1",
         "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
@@ -424,6 +471,7 @@
       "version": "1.12.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz",
       "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==",
+      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.12.1",
         "@webassemblyjs/helper-buffer": "1.12.1",
@@ -435,6 +483,7 @@
       "version": "1.12.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz",
       "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==",
+      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.12.1",
         "@webassemblyjs/helper-api-error": "1.11.6",
@@ -448,6 +497,7 @@
       "version": "1.12.1",
       "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz",
       "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==",
+      "license": "MIT",
       "dependencies": {
         "@webassemblyjs/ast": "1.12.1",
         "@xtuc/long": "4.2.2"
@@ -458,6 +508,7 @@
       "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
       "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
       "dev": true,
+      "license": "MIT",
       "peerDependencies": {
         "webpack": "4.x.x || 5.x.x",
         "webpack-cli": "4.x.x"
@@ -468,6 +519,7 @@
       "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz",
       "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "envinfo": "^7.7.3"
       },
@@ -480,6 +532,7 @@
       "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
       "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
       "dev": true,
+      "license": "MIT",
       "peerDependencies": {
         "webpack-cli": "4.x.x"
       },
@@ -492,18 +545,21 @@
     "node_modules/@xtuc/ieee754": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
-      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "license": "BSD-3-Clause"
     },
     "node_modules/@xtuc/long": {
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
-      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+      "license": "Apache-2.0"
     },
     "node_modules/accepts": {
       "version": "1.3.8",
       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
       "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "mime-types": "~2.1.34",
         "negotiator": "0.6.3"
@@ -513,9 +569,10 @@
       }
     },
     "node_modules/acorn": {
-      "version": "8.11.3",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
-      "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+      "version": "8.12.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz",
+      "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==",
+      "license": "MIT",
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -523,10 +580,11 @@
         "node": ">=0.4.0"
       }
     },
-    "node_modules/acorn-import-assertions": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
-      "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+    "node_modules/acorn-import-attributes": {
+      "version": "1.9.5",
+      "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
+      "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
+      "license": "MIT",
       "peerDependencies": {
         "acorn": "^8"
       }
@@ -535,6 +593,7 @@
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "license": "MIT",
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -551,6 +610,7 @@
       "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
       "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ajv": "^8.0.0"
       },
@@ -564,15 +624,16 @@
       }
     },
     "node_modules/ajv-formats/node_modules/ajv": {
-      "version": "8.12.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
-      "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+      "version": "8.16.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz",
+      "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "fast-deep-equal": "^3.1.1",
+        "fast-deep-equal": "^3.1.3",
         "json-schema-traverse": "^1.0.0",
         "require-from-string": "^2.0.2",
-        "uri-js": "^4.2.2"
+        "uri-js": "^4.4.1"
       },
       "funding": {
         "type": "github",
@@ -583,12 +644,14 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/ajv-keywords": {
       "version": "3.5.2",
       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
       "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "license": "MIT",
       "peerDependencies": {
         "ajv": "^6.9.1"
       }
@@ -601,6 +664,7 @@
       "engines": [
         "node >= 0.8.0"
       ],
+      "license": "Apache-2.0",
       "bin": {
         "ansi-html": "bin/ansi-html"
       }
@@ -610,6 +674,7 @@
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -619,6 +684,7 @@
       "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
       "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "normalize-path": "^3.0.0",
         "picomatch": "^2.0.4"
@@ -631,13 +697,15 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
       "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/array-union": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
       "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -646,19 +714,22 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/batch": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
       "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/binary-extensions": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
       "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       },
@@ -671,6 +742,7 @@
       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
       "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "bytes": "3.1.2",
         "content-type": "~1.0.5",
@@ -695,6 +767,7 @@
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
       "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -704,6 +777,7 @@
       "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz",
       "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "fast-deep-equal": "^3.1.3",
         "multicast-dns": "^7.2.5"
@@ -713,34 +787,37 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
       "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
     "node_modules/braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "fill-range": "^7.0.1"
+        "fill-range": "^7.1.1"
       },
       "engines": {
         "node": ">=8"
       }
     },
     "node_modules/browserslist": {
-      "version": "4.23.0",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
-      "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
+      "version": "4.23.1",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz",
+      "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==",
       "funding": [
         {
           "type": "opencollective",
@@ -755,11 +832,12 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
+      "license": "MIT",
       "dependencies": {
-        "caniuse-lite": "^1.0.30001587",
-        "electron-to-chromium": "^1.4.668",
+        "caniuse-lite": "^1.0.30001629",
+        "electron-to-chromium": "^1.4.796",
         "node-releases": "^2.0.14",
-        "update-browserslist-db": "^1.0.13"
+        "update-browserslist-db": "^1.0.16"
       },
       "bin": {
         "browserslist": "cli.js"
@@ -771,13 +849,15 @@
     "node_modules/buffer-from": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+      "license": "MIT"
     },
     "node_modules/bytes": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
       "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -787,6 +867,7 @@
       "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
       "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
@@ -806,15 +887,16 @@
       "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
       "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "pascal-case": "^3.1.2",
         "tslib": "^2.0.3"
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001603",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001603.tgz",
-      "integrity": "sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q==",
+      "version": "1.0.30001636",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz",
+      "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==",
       "funding": [
         {
           "type": "opencollective",
@@ -828,13 +910,15 @@
           "type": "github",
           "url": "https://github.com/sponsors/ai"
         }
-      ]
+      ],
+      "license": "CC-BY-4.0"
     },
     "node_modules/chokidar": {
       "version": "3.6.0",
       "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
       "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "anymatch": "~3.1.2",
         "braces": "~3.0.2",
@@ -855,9 +939,10 @@
       }
     },
     "node_modules/chrome-trace-event": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
-      "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+      "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.0"
       }
@@ -867,6 +952,7 @@
       "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz",
       "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "source-map": "~0.6.0"
       },
@@ -879,6 +965,7 @@
       "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
       "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-plain-object": "^2.0.4",
         "kind-of": "^6.0.2",
@@ -892,13 +979,15 @@
       "version": "2.0.20",
       "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
       "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/commander": {
       "version": "8.3.0",
       "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
       "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 12"
       }
@@ -908,6 +997,7 @@
       "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
       "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "mime-db": ">= 1.43.0 < 2"
       },
@@ -920,6 +1010,7 @@
       "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
       "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "accepts": "~1.3.5",
         "bytes": "3.0.0",
@@ -937,19 +1028,22 @@
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
       "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/connect-history-api-fallback": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
       "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.8"
       }
@@ -959,6 +1053,7 @@
       "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
       "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safe-buffer": "5.2.1"
       },
@@ -971,6 +1066,7 @@
       "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
       "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -980,6 +1076,7 @@
       "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
       "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -988,13 +1085,15 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
       "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/copy-webpack-plugin": {
       "version": "8.1.1",
       "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-8.1.1.tgz",
       "integrity": "sha512-rYM2uzRxrLRpcyPqGceRBDpxxUV8vcDqIKxAUKfcnFpcrPxT5+XvhTxv7XLjo5AvEJFPdAE3zCogG2JVahqgSQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "fast-glob": "^3.2.5",
         "glob-parent": "^5.1.1",
@@ -1019,13 +1118,15 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
       "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
       "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "path-key": "^3.1.0",
         "shebang-command": "^2.0.0",
@@ -1040,6 +1141,7 @@
       "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
       "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "boolbase": "^1.0.0",
         "css-what": "^6.0.1",
@@ -1056,6 +1158,7 @@
       "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
       "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "engines": {
         "node": ">= 6"
       },
@@ -1068,6 +1171,7 @@
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
       "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "2.0.0"
       }
@@ -1077,6 +1181,7 @@
       "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
       "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "execa": "^5.0.0"
       },
@@ -1089,6 +1194,7 @@
       "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
       "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "es-define-property": "^1.0.0",
         "es-errors": "^1.3.0",
@@ -1106,6 +1212,7 @@
       "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
       "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -1115,6 +1222,7 @@
       "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
       "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -1124,6 +1232,7 @@
       "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
       "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8",
         "npm": "1.2.8000 || >= 1.4.16"
@@ -1133,13 +1242,15 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
       "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/dir-glob": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
       "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "path-type": "^4.0.0"
       },
@@ -1152,6 +1263,7 @@
       "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
       "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@leichtgewicht/ip-codec": "^2.0.1"
       },
@@ -1164,6 +1276,7 @@
       "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
       "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "utila": "~0.4"
       }
@@ -1173,6 +1286,7 @@
       "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
       "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "domelementtype": "^2.0.1",
         "domhandler": "^4.2.0",
@@ -1192,13 +1306,15 @@
           "type": "github",
           "url": "https://github.com/sponsors/fb55"
         }
-      ]
+      ],
+      "license": "BSD-2-Clause"
     },
     "node_modules/domhandler": {
       "version": "4.3.1",
       "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
       "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "domelementtype": "^2.2.0"
       },
@@ -1214,6 +1330,7 @@
       "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
       "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "dom-serializer": "^1.0.1",
         "domelementtype": "^2.2.0",
@@ -1228,6 +1345,7 @@
       "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
       "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "no-case": "^3.0.4",
         "tslib": "^2.0.3"
@@ -1237,26 +1355,30 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
       "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.723",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.723.tgz",
-      "integrity": "sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw=="
+      "version": "1.4.806",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.806.tgz",
+      "integrity": "sha512-nkoEX2QIB8kwCOtvtgwhXWy2IHVcOLQZu9Qo36uaGB835mdX/h8uLRlosL6QIhLVUnAiicXRW00PwaPZC74Nrg==",
+      "license": "ISC"
     },
     "node_modules/encodeurl": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
       "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
     },
     "node_modules/enhanced-resolve": {
-      "version": "5.16.0",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz",
-      "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==",
+      "version": "5.17.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz",
+      "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==",
+      "license": "MIT",
       "dependencies": {
         "graceful-fs": "^4.2.4",
         "tapable": "^2.2.0"
@@ -1270,15 +1392,17 @@
       "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
       "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "funding": {
         "url": "https://github.com/fb55/entities?sponsor=1"
       }
     },
     "node_modules/envinfo": {
-      "version": "7.11.1",
-      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.1.tgz",
-      "integrity": "sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz",
+      "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "envinfo": "dist/cli.js"
       },
@@ -1291,6 +1415,7 @@
       "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
       "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "get-intrinsic": "^1.2.4"
       },
@@ -1303,19 +1428,22 @@
       "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
       "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       }
     },
     "node_modules/es-module-lexer": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz",
-      "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw=="
+      "version": "1.5.3",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz",
+      "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==",
+      "license": "MIT"
     },
     "node_modules/escalade": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
       "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -1324,12 +1452,14 @@
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/eslint-scope": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
       "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "license": "BSD-2-Clause",
       "dependencies": {
         "esrecurse": "^4.3.0",
         "estraverse": "^4.1.1"
@@ -1342,6 +1472,7 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
       "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "license": "BSD-2-Clause",
       "dependencies": {
         "estraverse": "^5.2.0"
       },
@@ -1353,6 +1484,7 @@
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
       "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "license": "BSD-2-Clause",
       "engines": {
         "node": ">=4.0"
       }
@@ -1361,6 +1493,7 @@
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
       "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "license": "BSD-2-Clause",
       "engines": {
         "node": ">=4.0"
       }
@@ -1370,6 +1503,7 @@
       "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
       "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -1378,12 +1512,14 @@
       "version": "4.0.7",
       "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
       "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/events": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
       "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "license": "MIT",
       "engines": {
         "node": ">=0.8.x"
       }
@@ -1393,6 +1529,7 @@
       "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
       "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "cross-spawn": "^7.0.3",
         "get-stream": "^6.0.0",
@@ -1416,6 +1553,7 @@
       "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz",
       "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "accepts": "~1.3.8",
         "array-flatten": "1.1.1",
@@ -1456,13 +1594,15 @@
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "license": "MIT"
     },
     "node_modules/fast-glob": {
       "version": "3.3.2",
       "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
       "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@nodelib/fs.stat": "^2.0.2",
         "@nodelib/fs.walk": "^1.2.3",
@@ -1477,13 +1617,15 @@
     "node_modules/fast-json-stable-stringify": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "license": "MIT"
     },
     "node_modules/fastest-levenshtein": {
       "version": "1.0.16",
       "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
       "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 4.9.1"
       }
@@ -1493,6 +1635,7 @@
       "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
       "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "reusify": "^1.0.4"
       }
@@ -1502,6 +1645,7 @@
       "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
       "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "websocket-driver": ">=0.5.1"
       },
@@ -1510,10 +1654,11 @@
       }
     },
     "node_modules/fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "to-regex-range": "^5.0.1"
       },
@@ -1526,6 +1671,7 @@
       "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
       "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "2.6.9",
         "encodeurl": "~1.0.2",
@@ -1544,6 +1690,7 @@
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
       "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "locate-path": "^5.0.0",
         "path-exists": "^4.0.0"
@@ -1557,6 +1704,7 @@
       "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
       "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "bin": {
         "flat": "cli.js"
       }
@@ -1572,6 +1720,7 @@
           "url": "https://github.com/sponsors/RubenVerborgh"
         }
       ],
+      "license": "MIT",
       "engines": {
         "node": ">=4.0"
       },
@@ -1586,6 +1735,7 @@
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
       "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -1595,21 +1745,24 @@
       "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
       "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
     },
     "node_modules/fs-monkey": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz",
-      "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==",
-      "dev": true
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
+      "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==",
+      "dev": true,
+      "license": "Unlicense"
     },
     "node_modules/fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
       "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/fsevents": {
       "version": "2.3.3",
@@ -1617,6 +1770,7 @@
       "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
       "dev": true,
       "hasInstallScript": true,
+      "license": "MIT",
       "optional": true,
       "os": [
         "darwin"
@@ -1630,6 +1784,7 @@
       "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
       "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
       "dev": true,
+      "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -1639,6 +1794,7 @@
       "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
       "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "es-errors": "^1.3.0",
         "function-bind": "^1.1.2",
@@ -1658,6 +1814,7 @@
       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
       "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
@@ -1669,7 +1826,9 @@
       "version": "7.2.3",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -1690,6 +1849,7 @@
       "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
       "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "is-glob": "^4.0.1"
       },
@@ -1700,13 +1860,15 @@
     "node_modules/glob-to-regexp": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
-      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+      "license": "BSD-2-Clause"
     },
     "node_modules/globby": {
       "version": "11.1.0",
       "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
       "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "array-union": "^2.1.0",
         "dir-glob": "^3.0.1",
@@ -1727,6 +1889,7 @@
       "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
       "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "get-intrinsic": "^1.1.3"
       },
@@ -1737,18 +1900,21 @@
     "node_modules/graceful-fs": {
       "version": "4.2.11",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
-      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+      "license": "ISC"
     },
     "node_modules/handle-thing": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
       "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/has-flag": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
       "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -1758,6 +1924,7 @@
       "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
       "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "es-define-property": "^1.0.0"
       },
@@ -1770,6 +1937,7 @@
       "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
       "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -1782,6 +1950,7 @@
       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
       "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -1794,6 +1963,7 @@
       "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
       "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "function-bind": "^1.1.2"
       },
@@ -1806,6 +1976,7 @@
       "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
       "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "he": "bin/he"
       }
@@ -1815,6 +1986,7 @@
       "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
       "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.1",
         "obuf": "^1.0.0",
@@ -1827,6 +1999,7 @@
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
       "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "core-util-is": "~1.0.0",
         "inherits": "~2.0.3",
@@ -1841,13 +2014,15 @@
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/hpack.js/node_modules/string_decoder": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
       "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safe-buffer": "~5.1.0"
       }
@@ -1866,13 +2041,15 @@
           "type": "patreon",
           "url": "https://patreon.com/mdevils"
         }
-      ]
+      ],
+      "license": "MIT"
     },
     "node_modules/html-minifier-terser": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
       "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "camel-case": "^4.1.2",
         "clean-css": "^5.2.2",
@@ -1894,6 +2071,7 @@
       "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz",
       "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/html-minifier-terser": "^6.0.0",
         "html-minifier-terser": "^6.0.2",
@@ -1933,6 +2111,7 @@
           "url": "https://github.com/sponsors/fb55"
         }
       ],
+      "license": "MIT",
       "dependencies": {
         "domelementtype": "^2.0.1",
         "domhandler": "^4.0.0",
@@ -1944,13 +2123,15 @@
       "version": "1.2.7",
       "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
       "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/http-errors": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
       "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "depd": "2.0.0",
         "inherits": "2.0.4",
@@ -1966,13 +2147,15 @@
       "version": "0.5.8",
       "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz",
       "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/http-proxy": {
       "version": "1.18.1",
       "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
       "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "eventemitter3": "^4.0.0",
         "follow-redirects": "^1.0.0",
@@ -1987,6 +2170,7 @@
       "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
       "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/http-proxy": "^1.17.8",
         "http-proxy": "^1.18.1",
@@ -2011,6 +2195,7 @@
       "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
       "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
       "dev": true,
+      "license": "Apache-2.0",
       "engines": {
         "node": ">=10.17.0"
       }
@@ -2020,6 +2205,7 @@
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
       "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3"
       },
@@ -2032,6 +2218,7 @@
       "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
       "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 4"
       }
@@ -2041,6 +2228,7 @@
       "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
       "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "pkg-dir": "^4.2.0",
         "resolve-cwd": "^3.0.0"
@@ -2059,7 +2247,9 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -2069,22 +2259,25 @@
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/interpret": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
       "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
     },
     "node_modules/ipaddr.js": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz",
-      "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
+      "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 10"
       }
@@ -2094,6 +2287,7 @@
       "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
       "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "binary-extensions": "^2.0.0"
       },
@@ -2106,6 +2300,7 @@
       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
       "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "hasown": "^2.0.0"
       },
@@ -2118,6 +2313,7 @@
       "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
       "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "is-docker": "cli.js"
       },
@@ -2133,6 +2329,7 @@
       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
       "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -2142,6 +2339,7 @@
       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
       "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-extglob": "^2.1.1"
       },
@@ -2154,6 +2352,7 @@
       "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.12.0"
       }
@@ -2163,6 +2362,7 @@
       "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
       "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
@@ -2175,6 +2375,7 @@
       "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
       "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "isobject": "^3.0.1"
       },
@@ -2187,6 +2388,7 @@
       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
       "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       },
@@ -2199,6 +2401,7 @@
       "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
       "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-docker": "^2.0.0"
       },
@@ -2210,19 +2413,22 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
       "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
       "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/isobject": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
       "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -2231,6 +2437,7 @@
       "version": "27.5.1",
       "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
       "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+      "license": "MIT",
       "dependencies": {
         "@types/node": "*",
         "merge-stream": "^2.0.0",
@@ -2243,27 +2450,31 @@
     "node_modules/json-parse-even-better-errors": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "license": "MIT"
     },
     "node_modules/json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "license": "MIT"
     },
     "node_modules/kind-of": {
       "version": "6.0.3",
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
       "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
     },
     "node_modules/launch-editor": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz",
-      "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==",
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz",
+      "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "picocolors": "^1.0.0",
         "shell-quote": "^1.8.1"
@@ -2272,12 +2483,14 @@
     "node_modules/lil-gui": {
       "version": "0.19.2",
       "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.19.2.tgz",
-      "integrity": "sha512-nU8j4ND702ouGfQZoaTN4dfXxacvGOAVK0DtmZBVcUYUAeYQXLQAjAN50igMHiba3T5jZyKEjXZU+Ntm1Qs6ZQ=="
+      "integrity": "sha512-nU8j4ND702ouGfQZoaTN4dfXxacvGOAVK0DtmZBVcUYUAeYQXLQAjAN50igMHiba3T5jZyKEjXZU+Ntm1Qs6ZQ==",
+      "license": "MIT"
     },
     "node_modules/loader-runner": {
       "version": "4.3.0",
       "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
       "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+      "license": "MIT",
       "engines": {
         "node": ">=6.11.5"
       }
@@ -2287,6 +2500,7 @@
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
       "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "p-locate": "^4.1.0"
       },
@@ -2298,13 +2512,15 @@
       "version": "4.17.21",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
       "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/lower-case": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
       "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "tslib": "^2.0.3"
       }
@@ -2314,6 +2530,7 @@
       "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
       "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -2323,6 +2540,7 @@
       "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
       "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
       "dev": true,
+      "license": "Unlicense",
       "dependencies": {
         "fs-monkey": "^1.0.4"
       },
@@ -2334,18 +2552,21 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
       "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/merge-stream": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "license": "MIT"
     },
     "node_modules/merge2": {
       "version": "1.4.1",
       "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
       "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 8"
       }
@@ -2355,17 +2576,19 @@
       "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
       "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
     },
     "node_modules/micromatch": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
-      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
+      "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "braces": "^3.0.2",
+        "braces": "^3.0.3",
         "picomatch": "^2.3.1"
       },
       "engines": {
@@ -2377,6 +2600,7 @@
       "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
       "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "mime": "cli.js"
       },
@@ -2388,6 +2612,7 @@
       "version": "1.52.0",
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
       "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -2396,6 +2621,7 @@
       "version": "2.1.35",
       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+      "license": "MIT",
       "dependencies": {
         "mime-db": "1.52.0"
       },
@@ -2408,6 +2634,7 @@
       "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
       "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -2416,13 +2643,15 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
       "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
       "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "brace-expansion": "^1.1.7"
       },
@@ -2434,13 +2663,15 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/multicast-dns": {
       "version": "7.2.5",
       "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
       "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "dns-packet": "^5.2.2",
         "thunky": "^1.0.2"
@@ -2454,6 +2685,7 @@
       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
       "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -2461,13 +2693,15 @@
     "node_modules/neo-async": {
       "version": "2.6.2",
       "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
-      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "license": "MIT"
     },
     "node_modules/no-case": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
       "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "lower-case": "^2.0.2",
         "tslib": "^2.0.3"
@@ -2478,6 +2712,7 @@
       "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
       "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
       "dev": true,
+      "license": "(BSD-3-Clause OR GPL-2.0)",
       "engines": {
         "node": ">= 6.13.0"
       }
@@ -2485,13 +2720,15 @@
     "node_modules/node-releases": {
       "version": "2.0.14",
       "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
-      "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
+      "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
+      "license": "MIT"
     },
     "node_modules/normalize-path": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
       "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -2501,6 +2738,7 @@
       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
       "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "path-key": "^3.0.0"
       },
@@ -2513,6 +2751,7 @@
       "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
       "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
       "dev": true,
+      "license": "BSD-2-Clause",
       "dependencies": {
         "boolbase": "^1.0.0"
       },
@@ -2525,6 +2764,7 @@
       "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
       "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
       "dev": true,
+      "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -2533,13 +2773,15 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
       "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/on-finished": {
       "version": "2.4.1",
       "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
       "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ee-first": "1.1.1"
       },
@@ -2552,6 +2794,7 @@
       "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
       "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -2561,6 +2804,7 @@
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "wrappy": "1"
       }
@@ -2570,6 +2814,7 @@
       "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
       "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "mimic-fn": "^2.1.0"
       },
@@ -2585,6 +2830,7 @@
       "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
       "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "define-lazy-prop": "^2.0.0",
         "is-docker": "^2.1.1",
@@ -2602,6 +2848,7 @@
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
       "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "yocto-queue": "^0.1.0"
       },
@@ -2617,6 +2864,7 @@
       "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
       "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "p-limit": "^2.2.0"
       },
@@ -2629,6 +2877,7 @@
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
       "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "p-try": "^2.0.0"
       },
@@ -2644,6 +2893,7 @@
       "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
       "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/retry": "0.12.0",
         "retry": "^0.13.1"
@@ -2657,6 +2907,7 @@
       "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
       "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -2666,6 +2917,7 @@
       "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
       "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "dot-case": "^3.0.4",
         "tslib": "^2.0.3"
@@ -2676,6 +2928,7 @@
       "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
       "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -2685,6 +2938,7 @@
       "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
       "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "no-case": "^3.0.4",
         "tslib": "^2.0.3"
@@ -2695,6 +2949,7 @@
       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
       "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -2704,6 +2959,7 @@
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
       "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -2713,6 +2969,7 @@
       "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
       "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -2721,33 +2978,38 @@
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/path-to-regexp": {
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
       "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/path-type": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
       "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
     },
     "node_modules/picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
+      "license": "ISC"
     },
     "node_modules/picomatch": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
       "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8.6"
       },
@@ -2760,6 +3022,7 @@
       "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
       "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "find-up": "^4.0.0"
       },
@@ -2772,6 +3035,7 @@
       "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
       "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "lodash": "^4.17.20",
         "renderkid": "^3.0.0"
@@ -2781,13 +3045,15 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
       "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/proxy-addr": {
       "version": "2.0.7",
       "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
       "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "forwarded": "0.2.0",
         "ipaddr.js": "1.9.1"
@@ -2801,6 +3067,7 @@
       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
       "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
@@ -2809,6 +3076,7 @@
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
       "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -2818,6 +3086,7 @@
       "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
       "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "dependencies": {
         "side-channel": "^1.0.4"
       },
@@ -2846,12 +3115,14 @@
           "type": "consulting",
           "url": "https://feross.org/support"
         }
-      ]
+      ],
+      "license": "MIT"
     },
     "node_modules/randombytes": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
       "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "license": "MIT",
       "dependencies": {
         "safe-buffer": "^5.1.0"
       }
@@ -2861,6 +3132,7 @@
       "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
       "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -2870,6 +3142,7 @@
       "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
       "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "bytes": "3.1.2",
         "http-errors": "2.0.0",
@@ -2885,6 +3158,7 @@
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
       "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -2894,6 +3168,7 @@
       "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
       "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "inherits": "^2.0.3",
         "string_decoder": "^1.1.1",
@@ -2908,6 +3183,7 @@
       "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
       "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "picomatch": "^2.2.1"
       },
@@ -2920,6 +3196,7 @@
       "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
       "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "resolve": "^1.9.0"
       },
@@ -2932,6 +3209,7 @@
       "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
       "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.10"
       }
@@ -2941,6 +3219,7 @@
       "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
       "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "css-select": "^4.1.3",
         "dom-converter": "^0.2.0",
@@ -2954,6 +3233,7 @@
       "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
       "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -2962,13 +3242,15 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
       "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/resolve": {
       "version": "1.22.8",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
       "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-core-module": "^2.13.0",
         "path-parse": "^1.0.7",
@@ -2986,6 +3268,7 @@
       "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
       "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "resolve-from": "^5.0.0"
       },
@@ -2998,6 +3281,7 @@
       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
       "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -3007,6 +3291,7 @@
       "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
       "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 4"
       }
@@ -3016,6 +3301,7 @@
       "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
       "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "iojs": ">=1.0.0",
         "node": ">=0.10.0"
@@ -3025,7 +3311,9 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "glob": "^7.1.3"
       },
@@ -3055,6 +3343,7 @@
           "url": "https://feross.org/support"
         }
       ],
+      "license": "MIT",
       "dependencies": {
         "queue-microtask": "^1.2.2"
       }
@@ -3076,18 +3365,21 @@
           "type": "consulting",
           "url": "https://feross.org/support"
         }
-      ]
+      ],
+      "license": "MIT"
     },
     "node_modules/safer-buffer": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/schema-utils": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
       "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "license": "MIT",
       "dependencies": {
         "@types/json-schema": "^7.0.8",
         "ajv": "^6.12.5",
@@ -3105,13 +3397,15 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
       "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/selfsigned": {
       "version": "2.4.1",
       "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
       "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/node-forge": "^1.3.0",
         "node-forge": "^1"
@@ -3125,6 +3419,7 @@
       "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
       "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "2.6.9",
         "depd": "2.0.0",
@@ -3148,13 +3443,15 @@
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
       "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/serialize-javascript": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
       "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
       "dev": true,
+      "license": "BSD-3-Clause",
       "dependencies": {
         "randombytes": "^2.1.0"
       }
@@ -3164,6 +3461,7 @@
       "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
       "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "accepts": "~1.3.4",
         "batch": "0.6.1",
@@ -3182,6 +3480,7 @@
       "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
       "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -3191,6 +3490,7 @@
       "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
       "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "depd": "~1.1.2",
         "inherits": "2.0.3",
@@ -3205,19 +3505,22 @@
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
       "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/serve-index/node_modules/setprototypeof": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
       "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/serve-index/node_modules/statuses": {
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
       "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.6"
       }
@@ -3227,6 +3530,7 @@
       "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
       "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "encodeurl": "~1.0.2",
         "escape-html": "~1.0.3",
@@ -3242,6 +3546,7 @@
       "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
       "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "define-data-property": "^1.1.4",
         "es-errors": "^1.3.0",
@@ -3258,13 +3563,15 @@
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
       "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/shallow-clone": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
       "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "kind-of": "^6.0.2"
       },
@@ -3277,6 +3584,7 @@
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
       "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "shebang-regex": "^3.0.0"
       },
@@ -3289,6 +3597,7 @@
       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
       "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -3298,6 +3607,7 @@
       "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
       "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
       "dev": true,
+      "license": "MIT",
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
       }
@@ -3307,6 +3617,7 @@
       "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
       "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "call-bind": "^1.0.7",
         "es-errors": "^1.3.0",
@@ -3324,13 +3635,15 @@
       "version": "3.0.7",
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
       "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/slash": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
       "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=8"
       }
@@ -3340,6 +3653,7 @@
       "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
       "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "faye-websocket": "^0.11.3",
         "uuid": "^8.3.2",
@@ -3350,6 +3664,7 @@
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
       "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "license": "BSD-3-Clause",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -3358,6 +3673,7 @@
       "version": "0.5.21",
       "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
       "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+      "license": "MIT",
       "dependencies": {
         "buffer-from": "^1.0.0",
         "source-map": "^0.6.0"
@@ -3368,6 +3684,7 @@
       "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
       "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "^4.1.0",
         "handle-thing": "^2.0.0",
@@ -3384,6 +3701,7 @@
       "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
       "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "debug": "^4.1.0",
         "detect-node": "^2.0.4",
@@ -3394,10 +3712,11 @@
       }
     },
     "node_modules/spdy-transport/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "version": "4.3.5",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+      "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "2.1.2"
       },
@@ -3414,13 +3733,15 @@
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/spdy/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "version": "4.3.5",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+      "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ms": "2.1.2"
       },
@@ -3437,13 +3758,15 @@
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/statuses": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
       "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -3453,6 +3776,7 @@
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
       "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "safe-buffer": "~5.2.0"
       }
@@ -3462,6 +3786,7 @@
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "ansi-regex": "^5.0.1"
       },
@@ -3474,6 +3799,7 @@
       "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
       "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
@@ -3482,6 +3808,7 @@
       "version": "8.1.1",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
       "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "license": "MIT",
       "dependencies": {
         "has-flag": "^4.0.0"
       },
@@ -3497,6 +3824,7 @@
       "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4"
       },
@@ -3508,14 +3836,16 @@
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
       "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+      "license": "MIT",
       "engines": {
         "node": ">=6"
       }
     },
     "node_modules/terser": {
-      "version": "5.30.1",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.1.tgz",
-      "integrity": "sha512-PJhOnRttZqqmIujxOQOMu4QuFGvh43lR7Youln3k6OJvmxwZ5FxK5rbCEh8XABRCpLf7ZnhrZuclCNCASsScnA==",
+      "version": "5.31.1",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz",
+      "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==",
+      "license": "BSD-2-Clause",
       "dependencies": {
         "@jridgewell/source-map": "^0.3.3",
         "acorn": "^8.8.2",
@@ -3533,6 +3863,7 @@
       "version": "5.3.10",
       "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
       "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
+      "license": "MIT",
       "dependencies": {
         "@jridgewell/trace-mapping": "^0.3.20",
         "jest-worker": "^27.4.5",
@@ -3566,6 +3897,7 @@
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
       "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+      "license": "BSD-3-Clause",
       "dependencies": {
         "randombytes": "^2.1.0"
       }
@@ -3573,24 +3905,28 @@
     "node_modules/terser/node_modules/commander": {
       "version": "2.20.3",
       "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "license": "MIT"
     },
     "node_modules/three": {
       "version": "0.152.2",
       "resolved": "https://registry.npmjs.org/three/-/three-0.152.2.tgz",
-      "integrity": "sha512-Ff9zIpSfkkqcBcpdiFo2f35vA9ZucO+N8TNacJOqaEE6DrB0eufItVMib8bK8Pcju/ZNT6a7blE1GhTpkdsILw=="
+      "integrity": "sha512-Ff9zIpSfkkqcBcpdiFo2f35vA9ZucO+N8TNacJOqaEE6DrB0eufItVMib8bK8Pcju/ZNT6a7blE1GhTpkdsILw==",
+      "license": "MIT"
     },
     "node_modules/thunky": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
       "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/to-regex-range": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
       "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "is-number": "^7.0.0"
       },
@@ -3603,21 +3939,24 @@
       "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
       "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=0.6"
       }
     },
     "node_modules/tslib": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
-      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
-      "dev": true
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
+      "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==",
+      "dev": true,
+      "license": "0BSD"
     },
     "node_modules/type-is": {
       "version": "1.6.18",
       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
       "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "media-typer": "0.3.0",
         "mime-types": "~2.1.24"
@@ -3629,21 +3968,23 @@
     "node_modules/undici-types": {
       "version": "5.26.5",
       "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
-      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+      "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+      "license": "MIT"
     },
     "node_modules/unpipe": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
       "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
     },
     "node_modules/update-browserslist-db": {
-      "version": "1.0.13",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
-      "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+      "version": "1.0.16",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz",
+      "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==",
       "funding": [
         {
           "type": "opencollective",
@@ -3658,9 +3999,10 @@
           "url": "https://github.com/sponsors/ai"
         }
       ],
+      "license": "MIT",
       "dependencies": {
-        "escalade": "^3.1.1",
-        "picocolors": "^1.0.0"
+        "escalade": "^3.1.2",
+        "picocolors": "^1.0.1"
       },
       "bin": {
         "update-browserslist-db": "cli.js"
@@ -3673,6 +4015,7 @@
       "version": "4.4.1",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "license": "BSD-2-Clause",
       "dependencies": {
         "punycode": "^2.1.0"
       }
@@ -3681,19 +4024,22 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
       "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/utila": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
       "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/utils-merge": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
       "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.4.0"
       }
@@ -3703,6 +4049,7 @@
       "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
       "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
       "dev": true,
+      "license": "MIT",
       "bin": {
         "uuid": "dist/bin/uuid"
       }
@@ -3712,6 +4059,7 @@
       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
       "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 0.8"
       }
@@ -3720,6 +4068,7 @@
       "version": "2.4.1",
       "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz",
       "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==",
+      "license": "MIT",
       "dependencies": {
         "glob-to-regexp": "^0.4.1",
         "graceful-fs": "^4.1.2"
@@ -3733,14 +4082,16 @@
       "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
       "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "minimalistic-assert": "^1.0.0"
       }
     },
     "node_modules/webpack": {
-      "version": "5.91.0",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz",
-      "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==",
+      "version": "5.92.1",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz",
+      "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==",
+      "license": "MIT",
       "dependencies": {
         "@types/eslint-scope": "^3.7.3",
         "@types/estree": "^1.0.5",
@@ -3748,10 +4099,10 @@
         "@webassemblyjs/wasm-edit": "^1.12.1",
         "@webassemblyjs/wasm-parser": "^1.12.1",
         "acorn": "^8.7.1",
-        "acorn-import-assertions": "^1.9.0",
+        "acorn-import-attributes": "^1.9.5",
         "browserslist": "^4.21.10",
         "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.16.0",
+        "enhanced-resolve": "^5.17.0",
         "es-module-lexer": "^1.2.1",
         "eslint-scope": "5.1.1",
         "events": "^3.2.0",
@@ -3788,6 +4139,7 @@
       "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz",
       "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@discoveryjs/json-ext": "^0.5.0",
         "@webpack-cli/configtest": "^1.2.0",
@@ -3835,6 +4187,7 @@
       "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
       "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">= 10"
       }
@@ -3844,6 +4197,7 @@
       "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
       "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "colorette": "^2.0.10",
         "memfs": "^3.4.3",
@@ -3863,15 +4217,16 @@
       }
     },
     "node_modules/webpack-dev-middleware/node_modules/ajv": {
-      "version": "8.12.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
-      "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+      "version": "8.16.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz",
+      "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "fast-deep-equal": "^3.1.1",
+        "fast-deep-equal": "^3.1.3",
         "json-schema-traverse": "^1.0.0",
         "require-from-string": "^2.0.2",
-        "uri-js": "^4.2.2"
+        "uri-js": "^4.4.1"
       },
       "funding": {
         "type": "github",
@@ -3883,6 +4238,7 @@
       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
       "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "fast-deep-equal": "^3.1.3"
       },
@@ -3894,13 +4250,15 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/webpack-dev-middleware/node_modules/schema-utils": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
       "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/json-schema": "^7.0.9",
         "ajv": "^8.9.0",
@@ -3920,6 +4278,7 @@
       "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz",
       "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/bonjour": "^3.5.9",
         "@types/connect-history-api-fallback": "^1.3.5",
@@ -3975,15 +4334,16 @@
       }
     },
     "node_modules/webpack-dev-server/node_modules/ajv": {
-      "version": "8.12.0",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
-      "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
+      "version": "8.16.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz",
+      "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
-        "fast-deep-equal": "^3.1.1",
+        "fast-deep-equal": "^3.1.3",
         "json-schema-traverse": "^1.0.0",
         "require-from-string": "^2.0.2",
-        "uri-js": "^4.2.2"
+        "uri-js": "^4.4.1"
       },
       "funding": {
         "type": "github",
@@ -3995,6 +4355,7 @@
       "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
       "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "fast-deep-equal": "^3.1.3"
       },
@@ -4006,13 +4367,15 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
       "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/webpack-dev-server/node_modules/schema-utils": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
       "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "@types/json-schema": "^7.0.9",
         "ajv": "^8.9.0",
@@ -4032,6 +4395,7 @@
       "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
       "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
       "dev": true,
+      "license": "MIT",
       "dependencies": {
         "clone-deep": "^4.0.1",
         "flat": "^5.0.2",
@@ -4045,6 +4409,7 @@
       "version": "3.2.3",
       "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
       "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+      "license": "MIT",
       "engines": {
         "node": ">=10.13.0"
       }
@@ -4054,6 +4419,7 @@
       "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
       "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
       "dev": true,
+      "license": "Apache-2.0",
       "dependencies": {
         "http-parser-js": ">=0.5.1",
         "safe-buffer": ">=5.1.0",
@@ -4068,6 +4434,7 @@
       "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
       "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
       "dev": true,
+      "license": "Apache-2.0",
       "engines": {
         "node": ">=0.8.0"
       }
@@ -4077,6 +4444,7 @@
       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
       "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
       "dev": true,
+      "license": "ISC",
       "dependencies": {
         "isexe": "^2.0.0"
       },
@@ -4091,19 +4459,22 @@
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
       "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
-      "dev": true
+      "dev": true,
+      "license": "MIT"
     },
     "node_modules/wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
-      "dev": true
+      "dev": true,
+      "license": "ISC"
     },
     "node_modules/ws": {
-      "version": "8.16.0",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
-      "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
+      "version": "8.17.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz",
+      "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10.0.0"
       },
@@ -4125,6 +4496,7 @@
       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
       "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
       "dev": true,
+      "license": "MIT",
       "engines": {
         "node": ">=10"
       },
diff --git a/javascript/MaterialXView/package.json b/javascript/MaterialXView/package.json
index d889a2b44d..df27cebb57 100644
--- a/javascript/MaterialXView/package.json
+++ b/javascript/MaterialXView/package.json
@@ -12,7 +12,7 @@
   "dependencies": {
     "lil-gui": "^0.19.2",
     "three": "^0.152.2",
-    "webpack": "^5.91.0"
+    "webpack": "^5.92.1"
   },
   "devDependencies": {
     "copy-webpack-plugin": "^8.1.1",

From 4713ec9ff9edcc33e6ec663e7d4c35e3ce68e385 Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Wed, 19 Jun 2024 14:43:20 -0700
Subject: [PATCH 34/48] Upgrade data libraries to 1.39

This changelist upgrades the documents in the MaterialX data libraries to v1.39, leveraging the `mxformat.py` script and making additional minor edits for clarity.
---
 libraries/bxdf/disney_brdf_2012.mtlx          |   2 +-
 libraries/bxdf/disney_brdf_2015.mtlx          |   2 +-
 libraries/bxdf/lama/lama_dielectric.mtlx      |   2 +-
 libraries/bxdf/standard_surface.mtlx          |  34 +-
 .../standard_surface_to_gltf_pbr.mtlx         |  39 +-
 .../translation/standard_surface_to_usd.mtlx  |  19 +-
 libraries/bxdf/usd_preview_surface.mtlx       |  34 +-
 libraries/cmlib/cmlib_defs.mtlx               |   2 +-
 libraries/cmlib/cmlib_ng.mtlx                 | 151 ++++----
 .../lights/genglsl/lights_genglsl_impl.mtlx   |   2 +-
 .../lights/genmsl/lights_genmsl_impl.mtlx     |   2 +-
 libraries/lights/lights_defs.mtlx             |   2 +-
 .../nprlib/genglsl/nprlib_genglsl_impl.mtlx   |   2 +-
 .../nprlib/genmdl/nprlib_genmdl_impl.mtlx     |   2 +-
 .../nprlib/genmsl/nprlib_genmsl_impl.mtlx     |   2 +-
 .../nprlib/genosl/nprlib_genosl_impl.mtlx     |   2 +-
 libraries/nprlib/nprlib_defs.mtlx             |   2 +-
 libraries/nprlib/nprlib_ng.mtlx               |   6 +-
 .../pbrlib/genglsl/pbrlib_genglsl_impl.mtlx   |   2 +-
 .../pbrlib/genmdl/pbrlib_genmdl_impl.mtlx     |   2 +-
 .../pbrlib/genmsl/pbrlib_genmsl_impl.mtlx     |   2 +-
 .../pbrlib/genosl/pbrlib_genosl_impl.mtlx     |   2 +-
 libraries/pbrlib/pbrlib_defs.mtlx             |   2 +-
 libraries/pbrlib/pbrlib_ng.mtlx               |   2 +-
 .../stdlib/genglsl/stdlib_genglsl_impl.mtlx   |  18 +-
 .../stdlib/genmdl/stdlib_genmdl_impl.mtlx     |  18 +-
 .../stdlib/genmsl/stdlib_genmsl_impl.mtlx     |  18 +-
 .../stdlib/genosl/stdlib_genosl_impl.mtlx     |  26 +-
 libraries/stdlib/stdlib_defs.mtlx             |  10 +-
 libraries/stdlib/stdlib_ng.mtlx               | 346 +++++++++++++-----
 libraries/targets/essl.mtlx                   |   2 +-
 libraries/targets/genglsl.mtlx                |   2 +-
 libraries/targets/genmdl.mtlx                 |   2 +-
 libraries/targets/genmsl.mtlx                 |   2 +-
 libraries/targets/genosl.mtlx                 |   2 +-
 35 files changed, 488 insertions(+), 277 deletions(-)

diff --git a/libraries/bxdf/disney_brdf_2012.mtlx b/libraries/bxdf/disney_brdf_2012.mtlx
index 1bf785ecd7..d65e7dbc55 100644
--- a/libraries/bxdf/disney_brdf_2012.mtlx
+++ b/libraries/bxdf/disney_brdf_2012.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <nodedef name="ND_disney_brdf_2012_surface" node="disney_brdf_2012" nodegroup="pbr">
     <input name="baseColor" type="color3" value="0.16, 0.16, 0.16" />
     <input name="metallic" type="float" value="0" />
diff --git a/libraries/bxdf/disney_brdf_2015.mtlx b/libraries/bxdf/disney_brdf_2015.mtlx
index 0eb6c90f9e..916c7d55af 100644
--- a/libraries/bxdf/disney_brdf_2015.mtlx
+++ b/libraries/bxdf/disney_brdf_2015.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <nodedef name="ND_disney_bsdf_2015_surface" node="disney_bsdf_2015" nodegroup="pbr">
     <input name="baseColor" type="color3" value="0.16, 0.16, 0.16" />
     <input name="metallic" type="float" value="0" />
diff --git a/libraries/bxdf/lama/lama_dielectric.mtlx b/libraries/bxdf/lama/lama_dielectric.mtlx
index 815c7e511c..5e98670dd7 100644
--- a/libraries/bxdf/lama/lama_dielectric.mtlx
+++ b/libraries/bxdf/lama/lama_dielectric.mtlx
@@ -51,7 +51,7 @@
       <input name="in2" type="float" nodename="ior_float" />
       <input name="which" type="integer" interfacename="fresnelMode" />
     </switch>
-      
+
     <!-- Roughness -->
     <subtract name="roughness_inverse" type="float">
       <input name="in1" type="float" value="1.0" />
diff --git a/libraries/bxdf/standard_surface.mtlx b/libraries/bxdf/standard_surface.mtlx
index c7de68929a..fe87f260b0 100644
--- a/libraries/bxdf/standard_surface.mtlx
+++ b/libraries/bxdf/standard_surface.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Autodesk Standard Surface node definition.
   -->
@@ -8,10 +8,11 @@
     <input name="base" type="float" value="1.0" uimin="0.0" uimax="1.0" uiname="Base" uifolder="Base"
            doc="Multiplier on the intensity of the diffuse reflection." />
     <input name="base_color" type="color3" value="0.8, 0.8, 0.8" uimin="0,0,0" uimax="1,1,1" uiname="Base Color" uifolder="Base"
-           doc="Color of the diffuse reflection." />    
+           doc="Color of the diffuse reflection." />
   </nodedef>
 
-  <nodedef name="ND_standard_surface_surfaceshader_100" node="standard_surface" nodegroup="pbr" version="1.0.0" doc="Autodesk standard surface shader">
+  <nodedef name="ND_standard_surface_surfaceshader_100" node="standard_surface" nodegroup="pbr" version="1.0.0"
+           doc="Autodesk standard surface shader">
     <input name="base" type="float" value="0.8" uimin="0.0" uimax="1.0" uiname="Base" uifolder="Base"
            doc="Multiplier on the intensity of the diffuse reflection." />
     <input name="base_color" type="color3" value="1.0, 1.0, 1.0" uimin="0,0,0" uimax="1,1,1" uiname="Base Color" uifolder="Base"
@@ -296,6 +297,8 @@
       <input name="tangent" type="vector3" nodename="main_tangent" />
       <input name="distribution" type="string" value="ggx" />
       <input name="scatter_mode" type="string" value="R" />
+      <input name="thinfilm_thickness" type="float" interfacename="thin_film_thickness" />
+      <input name="thinfilm_ior" type="float" interfacename="thin_film_IOR" />
     </dielectric_bsdf>
     <layer name="specular_layer" type="BSDF">
       <input name="top" type="BSDF" nodename="specular_bsdf" />
@@ -323,6 +326,8 @@
       <input name="normal" type="vector3" interfacename="normal" />
       <input name="tangent" type="vector3" nodename="main_tangent" />
       <input name="distribution" type="string" value="ggx" />
+      <input name="thinfilm_thickness" type="float" interfacename="thin_film_thickness" />
+      <input name="thinfilm_ior" type="float" interfacename="thin_film_IOR" />
     </conductor_bsdf>
     <mix name="metalness_mix" type="BSDF">
       <input name="fg" type="BSDF" nodename="metal_bsdf" />
@@ -330,16 +335,6 @@
       <input name="mix" type="float" interfacename="metalness" />
     </mix>
 
-    <!-- Thin-film Layer -->
-    <thin_film_bsdf name="thin_film_bsdf" type="BSDF">
-      <input name="thickness" type="float" interfacename="thin_film_thickness" />
-      <input name="ior" type="float" interfacename="thin_film_IOR" />
-    </thin_film_bsdf>
-    <layer name="thin_film_layer" type="BSDF">
-      <input name="top" type="BSDF" nodename="thin_film_bsdf" />
-      <input name="base" type="BSDF" nodename="metalness_mix" />
-    </layer>
-
     <!-- Coat Layer -->
     <mix name="coat_attenuation" type="color3">
       <input name="fg" type="color3" interfacename="coat_color" />
@@ -347,7 +342,7 @@
       <input name="mix" type="float" interfacename="coat" />
     </mix>
     <multiply name="thin_film_layer_attenuated" type="BSDF">
-      <input name="in1" type="BSDF" nodename="thin_film_layer" />
+      <input name="in1" type="BSDF" nodename="metalness_mix" />
       <input name="in2" type="color3" nodename="coat_attenuation" />
     </multiply>
     <roughness_anisotropy name="coat_roughness_vector" type="vector2">
@@ -401,8 +396,11 @@
       <input name="in1" type="EDF" nodename="emission_edf" />
       <input name="in2" type="color3" interfacename="coat_color" />
     </multiply>
+    <convert name="emission_color0" type="color3">
+      <input name="in" type="float" nodename="one_minus_coat_ior_to_F0" />
+    </convert>
     <generalized_schlick_edf name="coat_emission_edf" type="EDF">
-      <input name="color0" type="color3" nodename="one_minus_coat_ior_to_F0" channels="rrr" />
+      <input name="color0" type="color3" nodename="emission_color0" />
       <input name="color90" type="color3" value="0.0, 0.0, 0.0" />
       <input name="exponent" type="float" value="5.0" />
       <input name="base" type="EDF" nodename="coat_tinted_emission_edf" />
@@ -418,10 +416,14 @@
     <luminance name="opacity_luminance" type="color3">
       <input name="in" type="color3" interfacename="opacity" />
     </luminance>
+    <extract name="opacity_luminance_float" type="float">
+      <input name="in" type="color3" nodename="opacity_luminance" />
+      <input name="index" type="integer" value="0" />
+    </extract>
     <surface name="shader_constructor" type="surfaceshader">
       <input name="bsdf" type="BSDF" nodename="coat_layer" />
       <input name="edf" type="EDF" nodename="blended_coat_emission_edf" />
-      <input name="opacity" type="float" nodename="opacity_luminance" channels="r" />
+      <input name="opacity" type="float" nodename="opacity_luminance_float" />
     </surface>
 
     <!-- Output -->
diff --git a/libraries/bxdf/translation/standard_surface_to_gltf_pbr.mtlx b/libraries/bxdf/translation/standard_surface_to_gltf_pbr.mtlx
index 6cb6fcb3b5..461e918400 100644
--- a/libraries/bxdf/translation/standard_surface_to_gltf_pbr.mtlx
+++ b/libraries/bxdf/translation/standard_surface_to_gltf_pbr.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <nodedef name="ND_standard_surface_to_gltf_pbr" node="standard_surface_to_gltf_pbr" nodegroup="translation">
     <input name="base" type="float" value="1" />
@@ -33,10 +33,22 @@
 
   <nodegraph name="NG_standard_surface_to_gltf_pbr" nodedef="ND_standard_surface_to_gltf_pbr">
 
+    <!-- Constants -->
+    <divide name="constantOneThird" type="float">
+      <input name="in1" type="float" value="1" />
+      <input name="in2" type="float" value="3" />
+    </divide>
+    <convert name="constantOneThirdVector" type="vector3">
+      <input name="in" type="float" nodename="constantOneThird" />
+    </convert>
+
     <!-- Coat attenuation -->
-    <dotproduct name="has_coat_color" type="float">
-      <input name="in1" type="vector3" interfacename="coat_color" channels="rgb" />
-      <input name="in2" type="vector3" value="1,1,1" />
+    <convert name="coatColorVector" type="vector3">
+      <input name="in" type="color3" interfacename="coat_color" />
+    </convert>
+    <dotproduct name="hasCoatColor" type="float">
+      <input name="in1" type="vector3" nodename="coatColorVector" />
+      <input name="in2" type="vector3" value="1, 1, 1" />
     </dotproduct>
     <multiply name="scaledBaseColor" type="color3">
       <input name="in1" type="color3" interfacename="base_color" />
@@ -44,29 +56,28 @@
     </multiply>
     <mix name="coatAttenuation" type="color3">
       <input name="fg" type="color3" interfacename="coat_color" />
-      <input name="bg" type="color3" value="1.0, 1.0, 1.0" />
+      <input name="bg" type="color3" value="1, 1, 1" />
       <input name="mix" type="float" interfacename="coat" />
     </mix>
     <multiply name="mixedBaseColor" type="color3">
       <input name="in1" type="color3" nodename="scaledBaseColor" />
       <input name="in2" type="color3" nodename="coatAttenuation" />
     </multiply>
-    <divide name="constantOneThird" type="float">
-      <input name="in1" type="float" value="1" />
-      <input name="in2" type="float" value="3" />
-    </divide>
-    <multiply name="coatColor" type="color3">
+    <multiply name="coatColorScaled" type="color3">
       <input name="in1" type="color3" interfacename="coat_color" />
       <input name="in2" type="float" interfacename="coat" />
     </multiply>
+    <convert name="coatColorScaledVector" type="vector3">
+      <input name="in" type="color3" nodename="coatColorScaled" />
+    </convert>
     <dotproduct name="weightedCoat" type="float">
-      <input name="in1" type="vector3" nodename="coatColor" channels="rgb" />
-      <input name="in2" type="vector3" nodename="constantOneThird" channels="xxx" />
+      <input name="in1" type="vector3" nodename="coatColorScaledVector" />
+      <input name="in2" type="vector3" nodename="constantOneThirdVector" />
     </dotproduct>
 
     <!-- Metallic roughness -->
     <ifequal name="base_color" type="color3">
-      <input name="value1" type="float" nodename="has_coat_color" />
+      <input name="value1" type="float" nodename="hasCoatColor" />
       <input name="value2" type="float" value="0" />
       <input name="in1" type="color3" nodename="scaledBaseColor" />
       <input name="in2" type="color3" nodename="mixedBaseColor" />
@@ -103,7 +114,7 @@
 
     <!-- Clearcoat -->
     <ifequal name="clearcoat" type="float">
-      <input name="value1" type="float" nodename="has_coat_color" />
+      <input name="value1" type="float" nodename="hasCoatColor" />
       <input name="value2" type="float" value="0" />
       <input name="in1" type="float" interfacename="coat" />
       <input name="in2" type="float" nodename="weightedCoat" />
diff --git a/libraries/bxdf/translation/standard_surface_to_usd.mtlx b/libraries/bxdf/translation/standard_surface_to_usd.mtlx
index b6e28805dd..099465e369 100644
--- a/libraries/bxdf/translation/standard_surface_to_usd.mtlx
+++ b/libraries/bxdf/translation/standard_surface_to_usd.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <nodedef name="ND_standard_surface_to_UsdPreviewSurface" node="standard_surface_to_UsdPreviewSurface" nodegroup="translation">
     <input name="metalness" type="float" value="0" />
@@ -35,6 +35,9 @@
       <input name="in1" type="float" value="1" />
       <input name="in2" type="float" value="3" />
     </divide>
+    <convert name="constantOneThirdVector" type="vector3">
+      <input name="in" type="float" nodename="constantOneThird" />
+    </convert>
 
     <!-- Diffuse/Specular -->
     <dot name="metallic" type="float">
@@ -65,9 +68,12 @@
       <input name="in1" type="color3" interfacename="coat_color" />
       <input name="in2" type="float" interfacename="coat" />
     </multiply>
+    <convert name="coatColorVector" type="vector3">
+      <input name="in" type="color3" nodename="coatColor" />
+    </convert>
     <dotproduct name="clearcoat" type="float">
-      <input name="in1" type="vector3" nodename="coatColor" channels="rgb" />
-      <input name="in2" type="vector3" nodename="constantOneThird" channels="xxx" />
+      <input name="in1" type="vector3" nodename="coatColorVector" />
+      <input name="in2" type="vector3" nodename="constantOneThirdVector" />
     </dotproduct>
     <dot name="clearcoatRoughness" type="float">
       <input name="in" type="float" interfacename="coat_roughness" />
@@ -80,9 +86,12 @@
     </multiply>
 
     <!-- Opacity -->
+    <convert name="opacityVector" type="vector3">
+      <input name="in" type="color3" interfacename="opacity" />
+    </convert>
     <dotproduct name="opacity" type="float">
-      <input name="in1" type="vector3" interfacename="opacity" channels="rgb" />
-      <input name="in2" type="vector3" nodename="constantOneThird" channels="xxx" />
+      <input name="in1" type="vector3" nodename="opacityVector" />
+      <input name="in2" type="vector3" nodename="constantOneThirdVector" />
     </dotproduct>
 
     <!-- Normal Map -->
diff --git a/libraries/bxdf/usd_preview_surface.mtlx b/libraries/bxdf/usd_preview_surface.mtlx
index 6efb288184..7106da779b 100644
--- a/libraries/bxdf/usd_preview_surface.mtlx
+++ b/libraries/bxdf/usd_preview_surface.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!-- ======================================================================== -->
   <!-- USD Preview Surface node definitions                                     -->
@@ -300,11 +300,17 @@
       <input name="in1" type="color4" nodename="image_scale" />
       <input name="in2" type="color4" interfacename="bias" />
     </add>
-    <output name="r" type="float" nodename="image_bias" channels="r" />
-    <output name="g" type="float" nodename="image_bias" channels="g" />
-    <output name="b" type="float" nodename="image_bias" channels="b" />
-    <output name="a" type="float" nodename="image_bias" channels="a" />
-    <output name="rgb" type="color3" nodename="image_bias" channels="rgb" />
+    <separate4 name="image_bias_separate" type="multioutput">
+      <input name="in" type="color4" nodename="image_bias" />
+    </separate4>
+    <convert name="image_bias_color3" type="color3">
+      <input name="in" type="color4" nodename="image_bias" />
+    </convert>
+    <output name="r" type="float" nodename="image_bias_separate" output="outr" />
+    <output name="g" type="float" nodename="image_bias_separate" output="outg" />
+    <output name="b" type="float" nodename="image_bias_separate" output="outb" />
+    <output name="a" type="float" nodename="image_bias_separate" output="outa" />
+    <output name="rgb" type="color3" nodename="image_bias_color3" />
     <output name="rgba" type="color4" nodename="image_bias" />
   </nodegraph>
 
@@ -324,11 +330,17 @@
       <input name="in1" type="color4" nodename="image_scale" />
       <input name="in2" type="color4" interfacename="bias" />
     </add>
-    <output name="r" type="float" nodename="image_bias" channels="r" />
-    <output name="g" type="float" nodename="image_bias" channels="g" />
-    <output name="b" type="float" nodename="image_bias" channels="b" />
-    <output name="a" type="float" nodename="image_bias" channels="a" />
-    <output name="rgb" type="color3" nodename="image_bias" channels="rgb" />
+    <separate4 name="image_bias_separate" type="multioutput">
+      <input name="in" type="color4" nodename="image_bias" />
+    </separate4>
+    <convert name="image_bias_color3" type="color3">
+      <input name="in" type="color4" nodename="image_bias" />
+    </convert>
+    <output name="r" type="float" nodename="image_bias_separate" output="outr" />
+    <output name="g" type="float" nodename="image_bias_separate" output="outg" />
+    <output name="b" type="float" nodename="image_bias_separate" output="outb" />
+    <output name="a" type="float" nodename="image_bias_separate" output="outa" />
+    <output name="rgb" type="color3" nodename="image_bias_color3" />
   </nodegraph>
 
   <!-- Node: UsdPrimvarReader -->
diff --git a/libraries/cmlib/cmlib_defs.mtlx b/libraries/cmlib/cmlib_defs.mtlx
index bee30267ef..0f73109ea7 100644
--- a/libraries/cmlib/cmlib_defs.mtlx
+++ b/libraries/cmlib/cmlib_defs.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
diff --git a/libraries/cmlib/cmlib_ng.mtlx b/libraries/cmlib/cmlib_ng.mtlx
index 8045e80a4d..f6f844f48e 100644
--- a/libraries/cmlib/cmlib_ng.mtlx
+++ b/libraries/cmlib/cmlib_ng.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
@@ -26,12 +26,14 @@
     <g18_rec709_to_lin_rec709 name="transform" type="color3">
       <input name="in" type="color3" nodename="asColor3" />
     </g18_rec709_to_lin_rec709>
-    <combine4 name="asColor4" type="color4">
-      <input name="in1" type="float" nodename="transform" channels="r" />
-      <input name="in2" type="float" nodename="transform" channels="g" />
-      <input name="in3" type="float" nodename="transform" channels="b" />
-      <input name="in4" type="float" interfacename="in" channels="a" />
-    </combine4>
+    <extract name="alpha" type="float">
+      <input name="in" type="color4" interfacename="in" />
+      <input name="index" type="integer" value="3" />
+    </extract>
+    <combine2 name="asColor4" type="color4">
+      <input name="in1" type="color3" nodename="transform" />
+      <input name="in2" type="float" nodename="alpha" />
+    </combine2>
     <output name="out" type="color4" nodename="asColor4" />
   </nodegraph>
 
@@ -54,12 +56,14 @@
     <g22_rec709_to_lin_rec709 name="transform" type="color3">
       <input name="in" type="color3" nodename="asColor3" />
     </g22_rec709_to_lin_rec709>
-    <combine4 name="asColor4" type="color4">
-      <input name="in1" type="float" nodename="transform" channels="r" />
-      <input name="in2" type="float" nodename="transform" channels="g" />
-      <input name="in3" type="float" nodename="transform" channels="b" />
-      <input name="in4" type="float" interfacename="in" channels="a" />
-    </combine4>
+    <extract name="alpha" type="float">
+      <input name="in" type="color4" interfacename="in" />
+      <input name="index" type="integer" value="3" />
+    </extract>
+    <combine2 name="asColor4" type="color4">
+      <input name="in1" type="color3" nodename="transform" />
+      <input name="in2" type="float" nodename="alpha" />
+    </combine2>
     <output name="out" type="color4" nodename="asColor4" />
   </nodegraph>
 
@@ -82,12 +86,14 @@
     <rec709_display_to_lin_rec709 name="transform" type="color3">
       <input name="in" type="color3" nodename="asColor3" />
     </rec709_display_to_lin_rec709>
-    <combine4 name="asColor4" type="color4">
-      <input name="in1" type="float" nodename="transform" channels="r" />
-      <input name="in2" type="float" nodename="transform" channels="g" />
-      <input name="in3" type="float" nodename="transform" channels="b" />
-      <input name="in4" type="float" interfacename="in" channels="a" />
-    </combine4>
+    <extract name="alpha" type="float">
+      <input name="in" type="color4" interfacename="in" />
+      <input name="index" type="integer" value="3" />
+    </extract>
+    <combine2 name="asColor4" type="color4">
+      <input name="in1" type="color3" nodename="transform" />
+      <input name="in2" type="float" nodename="alpha" />
+    </combine2>
     <output name="out" type="color4" nodename="asColor4" />
   </nodegraph>
 
@@ -115,12 +121,14 @@
     <acescg_to_lin_rec709 name="transform" type="color3">
       <input name="in" type="color3" nodename="asColor3" />
     </acescg_to_lin_rec709>
-    <combine4 name="asColor4" type="color4">
-      <input name="in1" type="float" nodename="transform" channels="r" />
-      <input name="in2" type="float" nodename="transform" channels="g" />
-      <input name="in3" type="float" nodename="transform" channels="b" />
-      <input name="in4" type="float" interfacename="in" channels="a" />
-    </combine4>
+    <extract name="alpha" type="float">
+      <input name="in" type="color4" interfacename="in" />
+      <input name="index" type="integer" value="3" />
+    </extract>
+    <combine2 name="asColor4" type="color4">
+      <input name="in1" type="color3" nodename="transform" />
+      <input name="in2" type="float" nodename="alpha" />
+    </combine2>
     <output name="out" type="color4" nodename="asColor4" />
   </nodegraph>
 
@@ -146,12 +154,14 @@
     <g22_ap1_to_lin_rec709 name="transform" type="color3">
       <input name="in" type="color3" nodename="asColor3" />
     </g22_ap1_to_lin_rec709>
-    <combine4 name="asColor4" type="color4">
-      <input name="in1" type="float" nodename="transform" channels="r" />
-      <input name="in2" type="float" nodename="transform" channels="g" />
-      <input name="in3" type="float" nodename="transform" channels="b" />
-      <input name="in4" type="float" interfacename="in" channels="a" />
-    </combine4>
+    <extract name="alpha" type="float">
+      <input name="in" type="color4" interfacename="in" />
+      <input name="index" type="integer" value="3" />
+    </extract>
+    <combine2 name="asColor4" type="color4">
+      <input name="in1" type="color3" nodename="transform" />
+      <input name="in2" type="float" nodename="alpha" />
+    </combine2>
     <output name="out" type="color4" nodename="asColor4" />
   </nodegraph>
 
@@ -159,20 +169,23 @@
     <constant name="threshhold" type="float">
       <input name="value" type="float" value="0.04045" />
     </constant>
+    <separate3 name="colorSeparate" type="multioutput">
+      <input name="in" type="color3" interfacename="in" />
+    </separate3>
     <ifgreater name="isAboveR" type="float">
-      <input name="value1" type="float" interfacename="in" channels="r" />
+      <input name="value1" type="float" nodename="colorSeparate" output="outr" />
       <input name="value2" type="float" nodename="threshhold" />
       <input name="in1" type="float" value="1" />
       <input name="in2" type="float" value="0" />
     </ifgreater>
     <ifgreater name="isAboveG" type="float">
-      <input name="value1" type="float" interfacename="in" channels="g" />
+      <input name="value1" type="float" nodename="colorSeparate" output="outg" />
       <input name="value2" type="float" nodename="threshhold" />
       <input name="in1" type="float" value="1" />
       <input name="in2" type="float" value="0" />
     </ifgreater>
     <ifgreater name="isAboveB" type="float">
-      <input name="value1" type="float" interfacename="in" channels="b" />
+      <input name="value1" type="float" nodename="colorSeparate" output="outb" />
       <input name="value2" type="float" nodename="threshhold" />
       <input name="in1" type="float" value="1" />
       <input name="in2" type="float" value="0" />
@@ -217,12 +230,14 @@
     <srgb_texture_to_lin_rec709 name="transform" type="color3">
       <input name="in" type="color3" nodename="asColor3" />
     </srgb_texture_to_lin_rec709>
-    <combine4 name="asColor4" type="color4">
-      <input name="in1" type="float" nodename="transform" channels="r" />
-      <input name="in2" type="float" nodename="transform" channels="g" />
-      <input name="in3" type="float" nodename="transform" channels="b" />
-      <input name="in4" type="float" interfacename="in" channels="a" />
-    </combine4>
+    <extract name="alpha" type="float">
+      <input name="in" type="color4" interfacename="in" />
+      <input name="index" type="integer" value="3" />
+    </extract>
+    <combine2 name="asColor4" type="color4">
+      <input name="in1" type="color3" nodename="transform" />
+      <input name="in2" type="float" nodename="alpha" />
+    </combine2>
     <output name="out" type="color4" nodename="asColor4" />
   </nodegraph>
 
@@ -250,12 +265,14 @@
     <lin_adobergb_to_lin_rec709 name="transform" type="color3">
       <input name="in" type="color3" nodename="asColor3" />
     </lin_adobergb_to_lin_rec709>
-    <combine4 name="asColor4" type="color4">
-      <input name="in1" type="float" nodename="transform" channels="r" />
-      <input name="in2" type="float" nodename="transform" channels="g" />
-      <input name="in3" type="float" nodename="transform" channels="b" />
-      <input name="in4" type="float" interfacename="in" channels="a" />
-    </combine4>
+    <extract name="alpha" type="float">
+      <input name="in" type="color4" interfacename="in" />
+      <input name="index" type="integer" value="3" />
+    </extract>
+    <combine2 name="asColor4" type="color4">
+      <input name="in1" type="color3" nodename="transform" />
+      <input name="in2" type="float" nodename="alpha" />
+    </combine2>
     <output name="out" type="color4" nodename="asColor4" />
   </nodegraph>
 
@@ -285,12 +302,14 @@
     <adobergb_to_lin_rec709 name="transform" type="color3">
       <input name="in" type="color3" nodename="asColor3" />
     </adobergb_to_lin_rec709>
-    <combine4 name="asColor4" type="color4">
-      <input name="in1" type="float" nodename="transform" channels="r" />
-      <input name="in2" type="float" nodename="transform" channels="g" />
-      <input name="in3" type="float" nodename="transform" channels="b" />
-      <input name="in4" type="float" interfacename="in" channels="a" />
-    </combine4>
+    <extract name="alpha" type="float">
+      <input name="in" type="color4" interfacename="in" />
+      <input name="index" type="integer" value="3" />
+    </extract>
+    <combine2 name="asColor4" type="color4">
+      <input name="in1" type="color3" nodename="transform" />
+      <input name="in2" type="float" nodename="alpha" />
+    </combine2>
     <output name="out" type="color4" nodename="asColor4" />
   </nodegraph>
 
@@ -322,12 +341,14 @@
     <srgb_displayp3_to_lin_rec709 name="transform" type="color3">
       <input name="in" type="color3" nodename="asColor3" />
     </srgb_displayp3_to_lin_rec709>
-    <combine4 name="asColor4" type="color4">
-      <input name="in1" type="float" nodename="transform" channels="r" />
-      <input name="in2" type="float" nodename="transform" channels="g" />
-      <input name="in3" type="float" nodename="transform" channels="b" />
-      <input name="in4" type="float" interfacename="in" channels="a" />
-    </combine4>
+    <extract name="alpha" type="float">
+      <input name="in" type="color4" interfacename="in" />
+      <input name="index" type="integer" value="3" />
+    </extract>
+    <combine2 name="asColor4" type="color4">
+      <input name="in1" type="color3" nodename="transform" />
+      <input name="in2" type="float" nodename="alpha" />
+    </combine2>
     <output name="out" type="color4" nodename="asColor4" />
   </nodegraph>
 
@@ -355,12 +376,14 @@
     <lin_displayp3_to_lin_rec709 name="transform" type="color3">
       <input name="in" type="color3" nodename="asColor3" />
     </lin_displayp3_to_lin_rec709>
-    <combine4 name="asColor4" type="color4">
-      <input name="in1" type="float" nodename="transform" channels="r" />
-      <input name="in2" type="float" nodename="transform" channels="g" />
-      <input name="in3" type="float" nodename="transform" channels="b" />
-      <input name="in4" type="float" interfacename="in" channels="a" />
-    </combine4>
+    <extract name="alpha" type="float">
+      <input name="in" type="color4" interfacename="in" />
+      <input name="index" type="integer" value="3" />
+    </extract>
+    <combine2 name="asColor4" type="color4">
+      <input name="in1" type="color3" nodename="transform" />
+      <input name="in2" type="float" nodename="alpha" />
+    </combine2>
     <output name="out" type="color4" nodename="asColor4" />
   </nodegraph>
 
diff --git a/libraries/lights/genglsl/lights_genglsl_impl.mtlx b/libraries/lights/genglsl/lights_genglsl_impl.mtlx
index b51940d843..d9c2d0305b 100644
--- a/libraries/lights/genglsl/lights_genglsl_impl.mtlx
+++ b/libraries/lights/genglsl/lights_genglsl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!-- <point_light> -->
   <implementation name="IM_point_light_genglsl" nodedef="ND_point_light" file="mx_point_light.glsl" function="mx_point_light" target="genglsl" />
diff --git a/libraries/lights/genmsl/lights_genmsl_impl.mtlx b/libraries/lights/genmsl/lights_genmsl_impl.mtlx
index 90b4917a8a..deba24290a 100644
--- a/libraries/lights/genmsl/lights_genmsl_impl.mtlx
+++ b/libraries/lights/genmsl/lights_genmsl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!-- <point_light> -->
   <implementation name="IM_point_light_genmsl" nodedef="ND_point_light" file="mx_point_light.metal" function="mx_point_light" target="genmsl" />
diff --git a/libraries/lights/lights_defs.mtlx b/libraries/lights/lights_defs.mtlx
index e8748adedc..d0a3d49e5e 100644
--- a/libraries/lights/lights_defs.mtlx
+++ b/libraries/lights/lights_defs.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
diff --git a/libraries/nprlib/genglsl/nprlib_genglsl_impl.mtlx b/libraries/nprlib/genglsl/nprlib_genglsl_impl.mtlx
index 1a96f315e5..dd9700b340 100644
--- a/libraries/nprlib/genglsl/nprlib_genglsl_impl.mtlx
+++ b/libraries/nprlib/genglsl/nprlib_genglsl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
diff --git a/libraries/nprlib/genmdl/nprlib_genmdl_impl.mtlx b/libraries/nprlib/genmdl/nprlib_genmdl_impl.mtlx
index 1c1a728bf9..105751fd2b 100644
--- a/libraries/nprlib/genmdl/nprlib_genmdl_impl.mtlx
+++ b/libraries/nprlib/genmdl/nprlib_genmdl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
diff --git a/libraries/nprlib/genmsl/nprlib_genmsl_impl.mtlx b/libraries/nprlib/genmsl/nprlib_genmsl_impl.mtlx
index 615e9d8ce0..28e470b905 100644
--- a/libraries/nprlib/genmsl/nprlib_genmsl_impl.mtlx
+++ b/libraries/nprlib/genmsl/nprlib_genmsl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
diff --git a/libraries/nprlib/genosl/nprlib_genosl_impl.mtlx b/libraries/nprlib/genosl/nprlib_genosl_impl.mtlx
index 0b077b6406..9b3d3617ac 100644
--- a/libraries/nprlib/genosl/nprlib_genosl_impl.mtlx
+++ b/libraries/nprlib/genosl/nprlib_genosl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
diff --git a/libraries/nprlib/nprlib_defs.mtlx b/libraries/nprlib/nprlib_defs.mtlx
index f8770e3524..bb6d2e8ff0 100644
--- a/libraries/nprlib/nprlib_defs.mtlx
+++ b/libraries/nprlib/nprlib_defs.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
diff --git a/libraries/nprlib/nprlib_ng.mtlx b/libraries/nprlib/nprlib_ng.mtlx
index f3db3f51ff..e0a0d34e15 100644
--- a/libraries/nprlib/nprlib_ng.mtlx
+++ b/libraries/nprlib/nprlib_ng.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
@@ -48,10 +48,10 @@
     Node: <gooch_shade>
   -->
   <nodegraph name="NG_gooch_shade" type="color3" nodedef="ND_gooch_shade">
-    <normal name="normal" type="vector3" >
+    <normal name="normal" type="vector3">
       <input name="space" type="string" value="world" />
     </normal>
-    <viewdirection name="viewdir" type="vector3" >
+    <viewdirection name="viewdir" type="vector3">
       <input name="space" type="string" value="world" />
     </viewdirection>
     <normalize name="unit_normal" type="vector3">
diff --git a/libraries/pbrlib/genglsl/pbrlib_genglsl_impl.mtlx b/libraries/pbrlib/genglsl/pbrlib_genglsl_impl.mtlx
index 5980b1f02c..2a23886640 100644
--- a/libraries/pbrlib/genglsl/pbrlib_genglsl_impl.mtlx
+++ b/libraries/pbrlib/genglsl/pbrlib_genglsl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!-- <oren_nayar_diffuse_bsdf> -->
   <implementation name="IM_oren_nayar_diffuse_bsdf_genglsl" nodedef="ND_oren_nayar_diffuse_bsdf" file="mx_oren_nayar_diffuse_bsdf.glsl" function="mx_oren_nayar_diffuse_bsdf" target="genglsl" />
diff --git a/libraries/pbrlib/genmdl/pbrlib_genmdl_impl.mtlx b/libraries/pbrlib/genmdl/pbrlib_genmdl_impl.mtlx
index c0c3293ff1..86b19eaa71 100644
--- a/libraries/pbrlib/genmdl/pbrlib_genmdl_impl.mtlx
+++ b/libraries/pbrlib/genmdl/pbrlib_genmdl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!-- <oren_nayar_diffuse_bsdf> -->
   <implementation name="IM_oren_nayar_diffuse_bsdf_genmdl" nodedef="ND_oren_nayar_diffuse_bsdf" sourcecode="materialx::pbrlib_{{MDL_VERSION_SUFFIX}}::mx_oren_nayar_diffuse_bsdf(mxp_weight:{{weight}}, mxp_color:{{color}}, mxp_roughness:{{roughness}}, mxp_normal:{{normal}})" target="genmdl" />
diff --git a/libraries/pbrlib/genmsl/pbrlib_genmsl_impl.mtlx b/libraries/pbrlib/genmsl/pbrlib_genmsl_impl.mtlx
index 51f0ba14b8..e88a47a1dc 100644
--- a/libraries/pbrlib/genmsl/pbrlib_genmsl_impl.mtlx
+++ b/libraries/pbrlib/genmsl/pbrlib_genmsl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!-- <oren_nayar_diffuse_bsdf> -->
   <implementation name="IM_oren_nayar_diffuse_bsdf_genmsl" nodedef="ND_oren_nayar_diffuse_bsdf" file="../genglsl/mx_oren_nayar_diffuse_bsdf.glsl" function="mx_oren_nayar_diffuse_bsdf" target="genmsl" />
diff --git a/libraries/pbrlib/genosl/pbrlib_genosl_impl.mtlx b/libraries/pbrlib/genosl/pbrlib_genosl_impl.mtlx
index 69e4574e45..d3849a5ddb 100644
--- a/libraries/pbrlib/genosl/pbrlib_genosl_impl.mtlx
+++ b/libraries/pbrlib/genosl/pbrlib_genosl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!-- <oren_nayar_diffuse_bsdf> -->
   <implementation name="IM_oren_nayar_diffuse_bsdf_genosl" nodedef="ND_oren_nayar_diffuse_bsdf" sourcecode="{{weight}} * oren_nayar_diffuse_bsdf({{normal}}, {{color}}, {{roughness}})" target="genosl" />
diff --git a/libraries/pbrlib/pbrlib_defs.mtlx b/libraries/pbrlib/pbrlib_defs.mtlx
index 3664430a05..16892d9cfb 100644
--- a/libraries/pbrlib/pbrlib_defs.mtlx
+++ b/libraries/pbrlib/pbrlib_defs.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
diff --git a/libraries/pbrlib/pbrlib_ng.mtlx b/libraries/pbrlib/pbrlib_ng.mtlx
index cfc6273592..8e8678675f 100644
--- a/libraries/pbrlib/pbrlib_ng.mtlx
+++ b/libraries/pbrlib/pbrlib_ng.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
diff --git a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
index cd4b44d1a5..0c8f949e70 100644
--- a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
+++ b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
@@ -690,18 +690,18 @@
   <implementation name="IM_convert_integer_float_genglsl" nodedef="ND_convert_integer_float" target="genglsl" sourcecode="float({{in}})" />
 
   <!-- <combine2> -->
-  <implementation name="IM_combine2_vector2_genglsl" nodedef="ND_combine2_vector2" target="genglsl" sourcecode="vec2({{in1}},{{in2}})"/>
-  <implementation name="IM_combine2_color4CF_genglsl" nodedef="ND_combine2_color4CF" target="genglsl" sourcecode="vec4({{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}})"/>
-  <implementation name="IM_combine2_vector4VF_genglsl" nodedef="ND_combine2_vector4VF" target="genglsl" sourcecode="vec4({{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}})"/>
-  <implementation name="IM_combine2_vector4VV_genglsl" nodedef="ND_combine2_vector4VV" target="genglsl" sourcecode="vec4({{in1}}[0],{{in1}}[1],{{in2}}[0],{{in2}}[1])"/>
+  <implementation name="IM_combine2_vector2_genglsl" nodedef="ND_combine2_vector2" target="genglsl" sourcecode="vec2({{in1}},{{in2}})" />
+  <implementation name="IM_combine2_color4CF_genglsl" nodedef="ND_combine2_color4CF" target="genglsl" sourcecode="vec4({{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}})" />
+  <implementation name="IM_combine2_vector4VF_genglsl" nodedef="ND_combine2_vector4VF" target="genglsl" sourcecode="vec4({{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}})" />
+  <implementation name="IM_combine2_vector4VV_genglsl" nodedef="ND_combine2_vector4VV" target="genglsl" sourcecode="vec4({{in1}}[0],{{in1}}[1],{{in2}}[0],{{in2}}[1])" />
 
   <!-- <combine3> -->
-  <implementation name="IM_combine3_color3_genglsl" nodedef="ND_combine3_color3" target="genglsl" sourcecode="vec3({{in1}},{{in2}},{{in3}})"/>
-  <implementation name="IM_combine3_vector3_genglsl" nodedef="ND_combine3_vector3" target="genglsl" sourcecode="vec3({{in1}},{{in2}},{{in3}})"/>
+  <implementation name="IM_combine3_color3_genglsl" nodedef="ND_combine3_color3" target="genglsl" sourcecode="vec3({{in1}},{{in2}},{{in3}})" />
+  <implementation name="IM_combine3_vector3_genglsl" nodedef="ND_combine3_vector3" target="genglsl" sourcecode="vec3({{in1}},{{in2}},{{in3}})" />
 
   <!-- <combine4> -->
-  <implementation name="IM_combine4_color4_genglsl" nodedef="ND_combine4_color4" target="genglsl" sourcecode="vec4({{in1}},{{in2}},{{in3}},{{in4}})"/>
-  <implementation name="IM_combine4_vector4_genglsl" nodedef="ND_combine4_vector4" target="genglsl" sourcecode="vec4({{in1}},{{in2}},{{in3}},{{in4}})"/>
+  <implementation name="IM_combine4_color4_genglsl" nodedef="ND_combine4_color4" target="genglsl" sourcecode="vec4({{in1}},{{in2}},{{in3}},{{in4}})" />
+  <implementation name="IM_combine4_vector4_genglsl" nodedef="ND_combine4_vector4" target="genglsl" sourcecode="vec4({{in1}},{{in2}},{{in3}},{{in4}})" />
 
   <!-- <creatematrix> -->
   <implementation name="IM_creatematrix_vector3_matrix33_genglsl" nodedef="ND_creatematrix_vector3_matrix33" file="mx_creatematrix_vector3_matrix33.glsl" function="mx_creatematrix_vector3_matrix33" target="genglsl" />
diff --git a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
index 8f168e4768..297b69b1ee 100644
--- a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
+++ b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
@@ -700,18 +700,18 @@
   <implementation name="IM_convert_integer_float_genmdl" nodedef="ND_convert_integer_float" target="genmdl" sourcecode="float({{in}})" />
 
   <!-- <combine2> -->
-  <implementation name="IM_combine2_vector2_genmdl" nodedef="ND_combine2_vector2" target="genmdl" sourcecode="float2( {{in1}},{{in2}} )"/>
-  <implementation name="IM_combine2_color4CF_genmdl" nodedef="ND_combine2_color4CF" target="genmdl" sourcecode="color4( {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} )"/>
-  <implementation name="IM_combine2_vector4VF_genmdl" nodedef="ND_combine2_vector4VF" target="genmdl" sourcecode="float4( {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} )"/>
-  <implementation name="IM_combine2_vector4VV_genmdl" nodedef="ND_combine2_vector4VV" target="genmdl" sourcecode="float4( {{in1}}[0],{{in1}}[1],{{in2}}[0],{{in2}}[1] )"/>
+  <implementation name="IM_combine2_vector2_genmdl" nodedef="ND_combine2_vector2" target="genmdl" sourcecode="float2( {{in1}},{{in2}} )" />
+  <implementation name="IM_combine2_color4CF_genmdl" nodedef="ND_combine2_color4CF" target="genmdl" sourcecode="color4( {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} )" />
+  <implementation name="IM_combine2_vector4VF_genmdl" nodedef="ND_combine2_vector4VF" target="genmdl" sourcecode="float4( {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} )" />
+  <implementation name="IM_combine2_vector4VV_genmdl" nodedef="ND_combine2_vector4VV" target="genmdl" sourcecode="float4( {{in1}}[0],{{in1}}[1],{{in2}}[0],{{in2}}[1] )" />
 
   <!-- <combine3> -->
-  <implementation name="IM_combine3_color3_genmdl" nodedef="ND_combine3_color3" target="genmdl" sourcecode="color( {{in1}},{{in2}},{{in3}} )"/>
-  <implementation name="IM_combine3_vector3_genmdl" nodedef="ND_combine3_vector3" target="genmdl" sourcecode="float3( {{in1}},{{in2}},{{in3}} )"/>
+  <implementation name="IM_combine3_color3_genmdl" nodedef="ND_combine3_color3" target="genmdl" sourcecode="color( {{in1}},{{in2}},{{in3}} )" />
+  <implementation name="IM_combine3_vector3_genmdl" nodedef="ND_combine3_vector3" target="genmdl" sourcecode="float3( {{in1}},{{in2}},{{in3}} )" />
 
   <!-- <combine4> -->
-  <implementation name="IM_combine4_color4_genmdl" nodedef="ND_combine4_color4" target="genmdl" sourcecode="color4( {{in1}},{{in2}},{{in3}},{{in4}} )"/>
-  <implementation name="IM_combine4_vector4_genmdl" nodedef="ND_combine4_vector4" target="genmdl" sourcecode="float4( {{in1}},{{in2}},{{in3}},{{in4}} )"/>
+  <implementation name="IM_combine4_color4_genmdl" nodedef="ND_combine4_color4" target="genmdl" sourcecode="color4( {{in1}},{{in2}},{{in3}},{{in4}} )" />
+  <implementation name="IM_combine4_vector4_genmdl" nodedef="ND_combine4_vector4" target="genmdl" sourcecode="float4( {{in1}},{{in2}},{{in3}},{{in4}} )" />
 
   <!-- <creatematrix> -->
   <implementation name="IM_creatematrix_vector3_matrix33_genmdl" nodedef="ND_creatematrix_vector3_matrix33" sourcecode="materialx::stdlib_{{MDL_VERSION_SUFFIX}}::mx_creatematrix_vector3_matrix33({{in1}}, {{in2}}, {{in3}})" target="genmdl" />
diff --git a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
index e18cc5a777..4ebb3b5fca 100644
--- a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
+++ b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
@@ -690,18 +690,18 @@
   <implementation name="IM_convert_integer_float_genmsl" nodedef="ND_convert_integer_float" target="genmsl" sourcecode="float({{in}})" />
 
   <!-- <combine2> -->
-  <implementation name="IM_combine2_vector2_genmsl" nodedef="ND_combine2_vector2" target="genmsl" sourcecode="{ {{in1}},{{in2}} }"/>
-  <implementation name="IM_combine2_color4CF_genmsl" nodedef="ND_combine2_color4CF" target="genmsl" sourcecode="{ {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} }"/>
-  <implementation name="IM_combine2_vector4VF_genmsl" nodedef="ND_combine2_vector4VF" target="genmsl" sourcecode="{ {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} }"/>
-  <implementation name="IM_combine2_vector4VV_genmsl" nodedef="ND_combine2_vector4VV" target="genmsl" sourcecode="{ {{in1}}[0],{{in1}}[1],{{in2}}[0],{{in2}}[1] }"/>
+  <implementation name="IM_combine2_vector2_genmsl" nodedef="ND_combine2_vector2" target="genmsl" sourcecode="{ {{in1}},{{in2}} }" />
+  <implementation name="IM_combine2_color4CF_genmsl" nodedef="ND_combine2_color4CF" target="genmsl" sourcecode="{ {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} }" />
+  <implementation name="IM_combine2_vector4VF_genmsl" nodedef="ND_combine2_vector4VF" target="genmsl" sourcecode="{ {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} }" />
+  <implementation name="IM_combine2_vector4VV_genmsl" nodedef="ND_combine2_vector4VV" target="genmsl" sourcecode="{ {{in1}}[0],{{in1}}[1],{{in2}}[0],{{in2}}[1] }" />
 
   <!-- <combine3> -->
-  <implementation name="IM_combine3_color3_genmsl" nodedef="ND_combine3_color3" target="genmsl" sourcecode="{ {{in1}},{{in2}},{{in3}} }"/>
-  <implementation name="IM_combine3_vector3_genmsl" nodedef="ND_combine3_vector3" target="genmsl" sourcecode="{ {{in1}},{{in2}},{{in3}} }"/>
+  <implementation name="IM_combine3_color3_genmsl" nodedef="ND_combine3_color3" target="genmsl" sourcecode="{ {{in1}},{{in2}},{{in3}} }" />
+  <implementation name="IM_combine3_vector3_genmsl" nodedef="ND_combine3_vector3" target="genmsl" sourcecode="{ {{in1}},{{in2}},{{in3}} }" />
 
   <!-- <combine4> -->
-  <implementation name="IM_combine4_color4_genmsl" nodedef="ND_combine4_color4" target="genmsl" sourcecode="{ {{in1}},{{in2}},{{in3}},{{in4}} }"/>
-  <implementation name="IM_combine4_vector4_genmsl" nodedef="ND_combine4_vector4" target="genmsl" sourcecode="{ {{in1}},{{in2}},{{in3}},{{in4}} }"/>
+  <implementation name="IM_combine4_color4_genmsl" nodedef="ND_combine4_color4" target="genmsl" sourcecode="{ {{in1}},{{in2}},{{in3}},{{in4}} }" />
+  <implementation name="IM_combine4_vector4_genmsl" nodedef="ND_combine4_vector4" target="genmsl" sourcecode="{ {{in1}},{{in2}},{{in3}},{{in4}} }" />
 
   <!-- <creatematrix> -->
   <implementation name="IM_creatematrix_vector3_matrix33_genmsl" nodedef="ND_creatematrix_vector3_matrix33" file="../genglsl/mx_creatematrix_vector3_matrix33.glsl" function="mx_creatematrix_vector3_matrix33" target="genmsl" />
diff --git a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
index 0d68794430..65630f92ee 100644
--- a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
+++ b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
@@ -691,18 +691,18 @@
   <implementation name="IM_convert_integer_float_genosl" nodedef="ND_convert_integer_float" target="genosl" sourcecode="float({{in}})" />
 
   <!-- <combine2> -->
-  <implementation name="IM_combine2_vector2_genosl" nodedef="ND_combine2_vector2" target="genosl" sourcecode="{ {{in1}},{{in2}} }"/>
-  <implementation name="IM_combine2_color4CF_genosl" nodedef="ND_combine2_color4CF" target="genosl" sourcecode="{ color({{in1}}[0],{{in1}}[1],{{in1}}[2]),{{in2}} }"/>
-  <implementation name="IM_combine2_vector4VF_genosl" nodedef="ND_combine2_vector4VF" target="genosl" sourcecode="{ {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} }"/>
-  <implementation name="IM_combine2_vector4VV_genosl" nodedef="ND_combine2_vector4VV" target="genosl" sourcecode="{ {{in1}}.x,{{in1}}.y,{{in2}}.x,{{in2}}.y }"/>
+  <implementation name="IM_combine2_vector2_genosl" nodedef="ND_combine2_vector2" target="genosl" sourcecode="{ {{in1}},{{in2}} }" />
+  <implementation name="IM_combine2_color4CF_genosl" nodedef="ND_combine2_color4CF" target="genosl" sourcecode="{ color({{in1}}[0],{{in1}}[1],{{in1}}[2]),{{in2}} }" />
+  <implementation name="IM_combine2_vector4VF_genosl" nodedef="ND_combine2_vector4VF" target="genosl" sourcecode="{ {{in1}}[0],{{in1}}[1],{{in1}}[2],{{in2}} }" />
+  <implementation name="IM_combine2_vector4VV_genosl" nodedef="ND_combine2_vector4VV" target="genosl" sourcecode="{ {{in1}}.x,{{in1}}.y,{{in2}}.x,{{in2}}.y }" />
 
   <!-- <combine3> -->
-  <implementation name="IM_combine3_color3_genosl" nodedef="ND_combine3_color3" target="genosl" sourcecode="color( {{in1}},{{in2}},{{in3}} )"/>
-  <implementation name="IM_combine3_vector3_genosl" nodedef="ND_combine3_vector3" target="genosl" sourcecode="vector( {{in1}},{{in2}},{{in3}} )"/>
+  <implementation name="IM_combine3_color3_genosl" nodedef="ND_combine3_color3" target="genosl" sourcecode="color( {{in1}},{{in2}},{{in3}} )" />
+  <implementation name="IM_combine3_vector3_genosl" nodedef="ND_combine3_vector3" target="genosl" sourcecode="vector( {{in1}},{{in2}},{{in3}} )" />
 
   <!-- <combine4> -->
-  <implementation name="IM_combine4_color4_genosl" nodedef="ND_combine4_color4" target="genosl" sourcecode="{ color({{in1}},{{in2}},{{in3}}),{{in4}} }"/>
-  <implementation name="IM_combine4_vector4_genosl" nodedef="ND_combine4_vector4" target="genosl" sourcecode="{ {{in1}},{{in2}},{{in3}},{{in4}} }"/>
+  <implementation name="IM_combine4_color4_genosl" nodedef="ND_combine4_color4" target="genosl" sourcecode="{ color({{in1}},{{in2}},{{in3}}),{{in4}} }" />
+  <implementation name="IM_combine4_vector4_genosl" nodedef="ND_combine4_vector4" target="genosl" sourcecode="{ {{in1}},{{in2}},{{in3}},{{in4}} }" />
 
   <!-- <creatematrix> -->
   <implementation name="IM_creatematrix_vector3_matrix33_genosl" nodedef="ND_creatematrix_vector3_matrix33" file="mx_creatematrix.osl" function="mx_creatematrix_vector3_matrix33" target="genosl" />
@@ -711,10 +711,10 @@
 
   <!-- <extract> -->
   <implementation name="IM_extract_color3_genosl" nodedef="ND_extract_color3" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
-  <implementation name="IM_extract_color4_genosl" nodedef="ND_extract_color4" sourcecode="mx_extract({{in}}, {{index}})"  target="genosl" />
-  <implementation name="IM_extract_vector2_genosl" nodedef="ND_extract_vector2" sourcecode="mx_extract({{in}}, {{index}})"  target="genosl" />
-  <implementation name="IM_extract_vector3_genosl" nodedef="ND_extract_vector3" sourcecode="mx_extract({{in}}, {{index}})"  target="genosl" />
-  <implementation name="IM_extract_vector4_genosl" nodedef="ND_extract_vector4" sourcecode="mx_extract({{in}}, {{index}})"  target="genosl" />
+  <implementation name="IM_extract_color4_genosl" nodedef="ND_extract_color4" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
+  <implementation name="IM_extract_vector2_genosl" nodedef="ND_extract_vector2" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
+  <implementation name="IM_extract_vector3_genosl" nodedef="ND_extract_vector3" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
+  <implementation name="IM_extract_vector4_genosl" nodedef="ND_extract_vector4" sourcecode="mx_extract({{in}}, {{index}})" target="genosl" />
 
   <!-- ======================================================================== -->
   <!-- Convolution nodes                                                        -->
diff --git a/libraries/stdlib/stdlib_defs.mtlx b/libraries/stdlib/stdlib_defs.mtlx
index 3432892a0c..00a54dfab8 100644
--- a/libraries/stdlib/stdlib_defs.mtlx
+++ b/libraries/stdlib/stdlib_defs.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
@@ -3762,7 +3762,7 @@
   <nodedef name="ND_ifgreater_booleanI" node="ifgreater" nodegroup="conditional">
     <input name="value1" type="integer" value="1" />
     <input name="value2" type="integer" value="0" />
-   <output name="out" type="boolean" default="false" />
+    <output name="out" type="boolean" default="false" />
   </nodedef>
 
   <!--
@@ -3903,7 +3903,7 @@
   <nodedef name="ND_ifgreatereq_booleanI" node="ifgreatereq" nodegroup="conditional">
     <input name="value1" type="integer" value="1" />
     <input name="value2" type="integer" value="0" />
-   <output name="out" type="boolean" default="false" />
+    <output name="out" type="boolean" default="false" />
   </nodedef>
 
   <!--
@@ -4044,7 +4044,7 @@
   <nodedef name="ND_ifequal_booleanI" node="ifequal" nodegroup="conditional">
     <input name="value1" type="integer" value="1" />
     <input name="value2" type="integer" value="0" />
-   <output name="out" type="boolean" default="false" />
+    <output name="out" type="boolean" default="false" />
   </nodedef>
   <nodedef name="ND_ifequal_floatB" node="ifequal" nodegroup="conditional">
     <input name="value1" type="boolean" value="false" />
@@ -4112,7 +4112,7 @@
   <nodedef name="ND_ifequal_booleanB" node="ifequal" nodegroup="conditional">
     <input name="value1" type="boolean" value="false" />
     <input name="value2" type="boolean" value="false" />
-   <output name="out" type="boolean" default="false" />
+    <output name="out" type="boolean" default="false" />
   </nodedef>
 
   <!--
diff --git a/libraries/stdlib/stdlib_ng.mtlx b/libraries/stdlib/stdlib_ng.mtlx
index 6724a28e03..03ddc81681 100644
--- a/libraries/stdlib/stdlib_ng.mtlx
+++ b/libraries/stdlib/stdlib_ng.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Copyright Contributors to the MaterialX Project
     SPDX-License-Identifier: Apache-2.0
@@ -1318,7 +1318,10 @@
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="texcoord" type="vector2" interfacename="texcoord" />
     </noise2d>
-    <output name="out" type="color3" nodename="N_noise2d" channels="xyz" />
+    <convert name="N_convert" type="color3">
+      <input name="in" type="vector3" nodename="N_noise2d" />
+    </convert>
+    <output name="out" type="color3" nodename="N_convert" />
   </nodegraph>
   <nodegraph name="NG_noise2d_color4" nodedef="ND_noise2d_color4">
     <noise2d name="N_noise2d" type="vector4">
@@ -1326,43 +1329,61 @@
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="texcoord" type="vector2" interfacename="texcoord" />
     </noise2d>
-    <output name="out" type="color4" nodename="N_noise2d" channels="xyzw" />
+    <convert name="N_convert" type="color4">
+      <input name="in" type="vector4" nodename="N_noise2d" />
+    </convert>
+    <output name="out" type="color4" nodename="N_convert" />
   </nodegraph>
   <nodegraph name="NG_noise2d_color3FA" nodedef="ND_noise2d_color3FA">
+    <convert name="N_convert" type="vector3">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <noise2d name="N_noise2d" type="color3">
-      <input name="amplitude" type="vector3" interfacename="amplitude" channels="xxx" />
+      <input name="amplitude" type="vector3" nodename="N_convert" />
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="texcoord" type="vector2" interfacename="texcoord" />
     </noise2d>
     <output name="out" type="color3" nodename="N_noise2d" />
   </nodegraph>
   <nodegraph name="NG_noise2d_color4FA" nodedef="ND_noise2d_color4FA">
+    <convert name="N_convert" type="vector4">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <noise2d name="N_noise2d" type="color4">
-      <input name="amplitude" type="vector4" interfacename="amplitude" channels="xxxx" />
+      <input name="amplitude" type="vector4" nodename="N_convert" />
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="texcoord" type="vector2" interfacename="texcoord" />
     </noise2d>
     <output name="out" type="color4" nodename="N_noise2d" />
   </nodegraph>
   <nodegraph name="NG_noise2d_vector2FA" nodedef="ND_noise2d_vector2FA">
+    <convert name="N_convert" type="vector2">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <noise2d name="N_noise2d" type="vector2">
-      <input name="amplitude" type="vector2" interfacename="amplitude" channels="xx" />
+      <input name="amplitude" type="vector2" nodename="N_convert" />
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="texcoord" type="vector2" interfacename="texcoord" />
     </noise2d>
     <output name="out" type="vector2" nodename="N_noise2d" />
   </nodegraph>
   <nodegraph name="NG_noise2d_vector3FA" nodedef="ND_noise2d_vector3FA">
+    <convert name="N_convert" type="vector3">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <noise2d name="N_noise2d" type="vector3">
-      <input name="amplitude" type="vector3" interfacename="amplitude" channels="xxx" />
+      <input name="amplitude" type="vector3" nodename="N_convert" />
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="texcoord" type="vector2" interfacename="texcoord" />
     </noise2d>
     <output name="out" type="vector3" nodename="N_noise2d" />
   </nodegraph>
   <nodegraph name="NG_noise2d_vector4FA" nodedef="ND_noise2d_vector4FA">
+    <convert name="N_convert" type="vector4">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <noise2d name="N_noise2d" type="vector4">
-      <input name="amplitude" type="vector4" interfacename="amplitude" channels="xxxx" />
+      <input name="amplitude" type="vector4" nodename="N_convert" />
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="texcoord" type="vector2" interfacename="texcoord" />
     </noise2d>
@@ -1378,7 +1399,10 @@
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="position" type="vector3" interfacename="position" />
     </noise3d>
-    <output name="out" type="color3" nodename="N_noise3d" channels="xyz" />
+    <convert name="N_convert" type="color3">
+      <input name="in" type="vector3" nodename="N_noise3d" />
+    </convert>
+    <output name="out" type="color3" nodename="N_convert" />
   </nodegraph>
   <nodegraph name="NG_noise3d_color4" nodedef="ND_noise3d_color4">
     <noise3d name="N_noise3d" type="vector4">
@@ -1386,43 +1410,61 @@
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="position" type="vector3" interfacename="position" />
     </noise3d>
-    <output name="out" type="color4" nodename="N_noise3d" channels="xyzw" />
+    <convert name="N_convert" type="color4">
+      <input name="in" type="vector4" nodename="N_noise3d" />
+    </convert>
+    <output name="out" type="color4" nodename="N_convert" />
   </nodegraph>
   <nodegraph name="NG_noise3d_color3FA" nodedef="ND_noise3d_color3FA">
+    <convert name="N_convert" type="vector3">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <noise3d name="N_noise3d" type="color3">
-      <input name="amplitude" type="vector3" interfacename="amplitude" channels="xxx" />
+      <input name="amplitude" type="vector3" nodename="N_convert" />
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="position" type="vector3" interfacename="position" />
     </noise3d>
     <output name="out" type="color3" nodename="N_noise3d" />
   </nodegraph>
   <nodegraph name="NG_noise3d_color4FA" nodedef="ND_noise3d_color4FA">
+    <convert name="N_convert" type="vector4">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <noise3d name="N_noise3d" type="color4">
-      <input name="amplitude" type="vector4" interfacename="amplitude" channels="xxxx" />
+      <input name="amplitude" type="vector4" nodename="N_convert" />
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="position" type="vector3" interfacename="position" />
     </noise3d>
     <output name="out" type="color4" nodename="N_noise3d" />
   </nodegraph>
   <nodegraph name="NG_noise3d_vector2FA" nodedef="ND_noise3d_vector2FA">
+    <convert name="N_convert" type="vector2">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <noise3d name="N_noise3d" type="vector2">
-      <input name="amplitude" type="vector2" interfacename="amplitude" channels="xx" />
+      <input name="amplitude" type="vector2" nodename="N_convert" />
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="position" type="vector3" interfacename="position" />
     </noise3d>
     <output name="out" type="vector2" nodename="N_noise3d" />
   </nodegraph>
   <nodegraph name="NG_noise3d_vector3FA" nodedef="ND_noise3d_vector3FA">
+    <convert name="N_convert" type="vector3">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <noise3d name="N_noise3d" type="vector3">
-      <input name="amplitude" type="vector3" interfacename="amplitude" channels="xxx" />
+      <input name="amplitude" type="vector3" nodename="N_convert" />
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="position" type="vector3" interfacename="position" />
     </noise3d>
     <output name="out" type="vector3" nodename="N_noise3d" />
   </nodegraph>
   <nodegraph name="NG_noise3d_vector4FA" nodedef="ND_noise3d_vector4FA">
+    <convert name="N_convert" type="vector4">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <noise3d name="N_noise3d" type="vector4">
-      <input name="amplitude" type="vector4" interfacename="amplitude" channels="xxxx" />
+      <input name="amplitude" type="vector4" nodename="N_convert" />
       <input name="pivot" type="float" interfacename="pivot" />
       <input name="position" type="vector3" interfacename="position" />
     </noise3d>
@@ -1440,7 +1482,10 @@
       <input name="diminish" type="float" interfacename="diminish" />
       <input name="position" type="vector3" interfacename="position" />
     </fractal3d>
-    <output name="out" type="color3" nodename="N_fractal3d" channels="xyz" />
+    <convert name="N_convert" type="color3">
+      <input name="in" type="vector3" nodename="N_fractal3d" />
+    </convert>
+    <output name="out" type="color3" nodename="N_convert" />
   </nodegraph>
   <nodegraph name="NG_fractal3d_color4" nodedef="ND_fractal3d_color4">
     <fractal3d name="N_fractal3d" type="vector4">
@@ -1450,11 +1495,17 @@
       <input name="diminish" type="float" interfacename="diminish" />
       <input name="position" type="vector3" interfacename="position" />
     </fractal3d>
-    <output name="out" type="color4" nodename="N_fractal3d" channels="xyzw" />
+    <convert name="N_convert" type="color4">
+      <input name="in" type="vector4" nodename="N_fractal3d" />
+    </convert>
+    <output name="out" type="color4" nodename="N_convert" />
   </nodegraph>
   <nodegraph name="NG_fractal3d_color3FA" nodedef="ND_fractal3d_color3FA">
+    <convert name="N_convert" type="vector3">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <fractal3d name="N_fractal3d" type="color3">
-      <input name="amplitude" type="vector3" interfacename="amplitude" channels="xxx" />
+      <input name="amplitude" type="vector3" nodename="N_convert" />
       <input name="octaves" type="integer" interfacename="octaves" />
       <input name="lacunarity" type="float" interfacename="lacunarity" />
       <input name="diminish" type="float" interfacename="diminish" />
@@ -1463,8 +1514,11 @@
     <output name="out" type="color3" nodename="N_fractal3d" />
   </nodegraph>
   <nodegraph name="NG_fractal3d_color4FA" nodedef="ND_fractal3d_color4FA">
+    <convert name="N_convert" type="vector4">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <fractal3d name="N_fractal3d" type="color4">
-      <input name="amplitude" type="vector4" interfacename="amplitude" channels="xxxx" />
+      <input name="amplitude" type="vector4" nodename="N_convert" />
       <input name="octaves" type="integer" interfacename="octaves" />
       <input name="lacunarity" type="float" interfacename="lacunarity" />
       <input name="diminish" type="float" interfacename="diminish" />
@@ -1473,8 +1527,11 @@
     <output name="out" type="color4" nodename="N_fractal3d" />
   </nodegraph>
   <nodegraph name="NG_fractal3d_vector2FA" nodedef="ND_fractal3d_vector2FA">
+    <convert name="N_convert" type="vector2">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <fractal3d name="N_fractal3d" type="vector2">
-      <input name="amplitude" type="vector2" interfacename="amplitude" channels="xx" />
+      <input name="amplitude" type="vector2" nodename="N_convert" />
       <input name="octaves" type="integer" interfacename="octaves" />
       <input name="lacunarity" type="float" interfacename="lacunarity" />
       <input name="diminish" type="float" interfacename="diminish" />
@@ -1483,8 +1540,11 @@
     <output name="out" type="vector2" nodename="N_fractal3d" />
   </nodegraph>
   <nodegraph name="NG_fractal3d_vector3FA" nodedef="ND_fractal3d_vector3FA">
+    <convert name="N_convert" type="vector3">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <fractal3d name="N_fractal3d" type="vector3">
-      <input name="amplitude" type="vector3" interfacename="amplitude" channels="xxx" />
+      <input name="amplitude" type="vector3" nodename="N_convert" />
       <input name="octaves" type="integer" interfacename="octaves" />
       <input name="lacunarity" type="float" interfacename="lacunarity" />
       <input name="diminish" type="float" interfacename="diminish" />
@@ -1493,8 +1553,11 @@
     <output name="out" type="vector3" nodename="N_fractal3d" />
   </nodegraph>
   <nodegraph name="NG_fractal3d_vector4FA" nodedef="ND_fractal3d_vector4FA">
+    <convert name="N_convert" type="vector4">
+      <input name="in" type="float" interfacename="amplitude" />
+    </convert>
     <fractal3d name="N_fractal3d" type="vector4">
-      <input name="amplitude" type="vector4" interfacename="amplitude" channels="xxxx" />
+      <input name="amplitude" type="vector4" nodename="N_convert" />
       <input name="octaves" type="integer" interfacename="octaves" />
       <input name="lacunarity" type="float" interfacename="lacunarity" />
       <input name="diminish" type="float" interfacename="diminish" />
@@ -1895,21 +1958,30 @@
       <input name="in1" type="vector2" nodename="sample_double" />
       <input name="in2" type="float" interfacename="radius" />
     </subtract>
+    <separate2 name="sample_double_separate" type="multioutput">
+      <input name="in" type="vector2" nodename="sample_double" />
+    </separate2>
+    <separate2 name="sample_add_separate" type="multioutput">
+      <input name="in" type="vector2" nodename="sample_add" />
+    </separate2>
+    <separate2 name="sample_subtract_separate" type="multioutput">
+      <input name="in" type="vector2" nodename="sample_subtract" />
+    </separate2>
     <combine2 name="coord1" type="vector2">
-      <input name="in1" type="float" nodename="sample_add" channels="x" />
-      <input name="in2" type="float" nodename="sample_double" channels="y" />
+      <input name="in1" type="float" nodename="sample_add_separate" output="outx" />
+      <input name="in2" type="float" nodename="sample_double_separate" output="outy" />
     </combine2>
     <combine2 name="coord2" type="vector2">
-      <input name="in1" type="float" nodename="sample_subtract" channels="x" />
-      <input name="in2" type="float" nodename="sample_double" channels="y" />
+      <input name="in1" type="float" nodename="sample_subtract_separate" output="outx" />
+      <input name="in2" type="float" nodename="sample_double_separate" output="outy" />
     </combine2>
     <combine2 name="coord3" type="vector2">
-      <input name="in1" type="float" nodename="sample_double" channels="x" />
-      <input name="in2" type="float" nodename="sample_subtract" channels="y" />
+      <input name="in1" type="float" nodename="sample_double_separate" output="outx" />
+      <input name="in2" type="float" nodename="sample_subtract_separate" output="outy" />
     </combine2>
     <combine2 name="coord4" type="vector2">
-      <input name="in1" type="float" nodename="sample_double" channels="x" />
-      <input name="in2" type="float" nodename="sample_add" channels="y" />
+      <input name="in1" type="float" nodename="sample_double_separate" output="outx" />
+      <input name="in2" type="float" nodename="sample_add_separate" output="outy" />
     </combine2>
     <circle name="circle1" type="float">
       <input name="texcoord" type="vector2" nodename="coord1" />
@@ -1952,6 +2024,19 @@
     Uses formulas from Inigo Quilez SDF samples (iquilezles.org)
   -->
   <nodegraph name="NG_hexagon_float" nodedef="ND_hexagon_float">
+    <constant name="k" type="vector3">
+      <input name="value" type="vector3" value="-0.866025, 0.5, 0.57735" />
+    </constant>
+    <multiply name="minus_k" type="vector3">
+      <input name="in1" type="vector3" nodename="k" />
+      <input name="in2" type="float" value="-1.0" />
+    </multiply>
+    <separate3 name="k_separate" type="multioutput">
+      <input name="in" type="vector3" nodename="k" />
+    </separate3>
+    <separate3 name="minus_k_separate" type="multioutput">
+      <input name="in" type="vector3" nodename="minus_k" />
+    </separate3>
     <subtract name="delta" type="vector2">
       <input name="in1" type="vector2" interfacename="texcoord" />
       <input name="in2" type="vector2" interfacename="center" />
@@ -1959,32 +2044,28 @@
     <absval name="delta_abs" type="vector2">
       <input name="in" type="vector2" nodename="delta" />
     </absval>
+    <separate2 name="delta_abs_separate" type="multioutput">
+      <input name="in" type="vector2" nodename="delta_abs" />
+    </separate2>
     <combine2 name="p" type="vector2">
-      <input name="in1" type="float" nodename="delta_abs" channels="y" />
-      <input name="in2" type="float" nodename="delta_abs" channels="x" />
+      <input name="in1" type="float" nodename="delta_abs_separate" output="outy" />
+      <input name="in2" type="float" nodename="delta_abs_separate" output="outx" />
     </combine2>
-    <constant name="k" type="vector3">
-      <input name="value" type="vector3" value="-0.866025, 0.5, 0.57735" />
-    </constant>
     <multiply name="kz_r1" type="float">
-      <input name="in1" type="float" nodename="k" channels="z" />
+      <input name="in1" type="float" nodename="k_separate" output="outz" />
       <input name="in2" type="float" interfacename="radius" />
     </multiply>
-    <multiply name="minus_k" type="vector3">
-      <input name="in1" type="vector3" nodename="k" />
-      <input name="in2" type="float" value="-1.0" />
-    </multiply>
     <multiply name="minus_kz_r" type="float">
-      <input name="in1" type="float" nodename="minus_k" channels="z" />
+      <input name="in1" type="float" nodename="minus_k_separate" output="outz" />
       <input name="in2" type="float" interfacename="radius" />
     </multiply>
     <combine2 name="combine_mkx_ky" type="vector2">
-      <input name="in1" type="float" nodename="minus_k" channels="x" />
-      <input name="in2" type="float" nodename="k" channels="y" />
+      <input name="in1" type="float" nodename="minus_k_separate" output="outx" />
+      <input name="in2" type="float" nodename="k_separate" output="outy" />
     </combine2>
     <combine2 name="kxy" type="vector2">
-      <input name="in1" type="float" nodename="k" channels="x" />
-      <input name="in2" type="float" nodename="k" channels="y" />
+      <input name="in1" type="float" nodename="k_separate" output="outx" />
+      <input name="in2" type="float" nodename="k_separate" output="outy" />
     </combine2>
     <dotproduct name="dot_kxy_p" type="float">
       <input name="in1" type="vector2" nodename="kxy" />
@@ -2016,8 +2097,12 @@
       <input name="in1" type="vector2" nodename="multiply_min_comb" />
       <input name="in2" type="float" value="2" />
     </multiply>
+    <extract name="new_p2_x" type="float">
+      <input name="in" type="vector2" nodename="new_p2" />
+      <input name="index" type="integer" value="0" />
+    </extract>
     <clamp name="clamp" type="float">
-      <input name="in" type="float" nodename="new_p2" channels="x" />
+      <input name="in" type="float" nodename="new_p2_x" />
       <input name="low" type="float" nodename="minus_kz_r" />
       <input name="high" type="float" nodename="kz_r1" />
     </clamp>
@@ -2067,15 +2152,18 @@
       <input name="in1" type="vector2" nodename="texcoord_scale" />
       <input name="in2" type="vector2" interfacename="uvoffset" />
     </subtract>
+    <separate2 name="texcoord_bias_separate" type="multioutput">
+      <input name="in" type="vector2" nodename="texcoord_bias" />
+    </separate2>
     <subtract name="thick_to_size" type="float">
       <input name="in1" type="float" value="1.0" />
       <input name="in2" type="float" interfacename="thickness" />
     </subtract>
     <modulo name="mod_Y" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="y" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outy" />
     </modulo>
     <modulo name="mod_Y_row" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="y" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outy" />
       <input name="in2" type="float" value="2" />
     </modulo>
     <multiply name="mody_2" type="float">
@@ -2088,14 +2176,14 @@
       <input name="in1" type="float" value="0.5" />
     </ifgreater>
     <add name="shift_X" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="x" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outx" />
       <input name="in2" type="float" nodename="alt_rows_shift" />
     </add>
     <ifequal name="stagger_selection" type="float">
       <input name="value1" type="boolean" interfacename="staggered" />
       <input name="value2" type="boolean" value="true" />
       <input name="in1" type="float" nodename="shift_X" />
-      <input name="in2" type="float" nodename="texcoord_bias" channels="x" />
+      <input name="in2" type="float" nodename="texcoord_bias_separate" output="outx" />
     </ifequal>
     <modulo name="mod_X" type="float">
       <input name="in1" type="float" nodename="stagger_selection" />
@@ -2158,11 +2246,14 @@
       <input name="in1" type="vector2" nodename="texcoord_scale" />
       <input name="in2" type="vector2" interfacename="uvoffset" />
     </subtract>
+    <separate2 name="texcoord_bias_separate" type="multioutput">
+      <input name="in" type="vector2" nodename="texcoord_bias" />
+    </separate2>
     <modulo name="mod_Y" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="y" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outy" />
     </modulo>
     <modulo name="mod_Y_row" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="y" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outy" />
       <input name="in2" type="float" value="2" />
     </modulo>
     <multiply name="mody_2" type="float">
@@ -2175,14 +2266,14 @@
       <input name="in1" type="float" value="0.5" />
     </ifgreater>
     <add name="shift_X" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="x" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outx" />
       <input name="in2" type="float" nodename="alt_rows_shift" />
     </add>
     <ifequal name="stagger_selection" type="float">
       <input name="value1" type="boolean" interfacename="staggered" />
       <input name="value2" type="boolean" value="true" />
       <input name="in1" type="float" nodename="shift_X" />
-      <input name="in2" type="float" nodename="texcoord_bias" channels="x" />
+      <input name="in2" type="float" nodename="texcoord_bias_separate" output="outx" />
     </ifequal>
     <modulo name="mod_X" type="float">
       <input name="in1" type="float" nodename="stagger_selection" />
@@ -2243,6 +2334,9 @@
       <input name="in1" type="vector2" nodename="texcoord_scale" />
       <input name="in2" type="vector2" interfacename="uvoffset" />
     </subtract>
+    <separate2 name="texcoord_bias_separate" type="multioutput">
+      <input name="in" type="vector2" nodename="texcoord_bias" />
+    </separate2>
     <modulo name="mod_texcoord" type="vector2">
       <input name="in1" type="vector2" nodename="texcoord_bias" />
     </modulo>
@@ -2255,7 +2349,7 @@
       <input name="in2" type="float" value="1" />
     </subtract>
     <modulo name="stagg_Y" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="y" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outy" />
       <input name="in2" type="float" value="1.73205" />
     </modulo>
     <ifgreater name="delta_X" type="float">
@@ -2264,14 +2358,14 @@
       <input name="in1" type="float" value="0.5" />
     </ifgreater>
     <add name="shift_X" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="x" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outx" />
       <input name="in2" type="float" nodename="delta_X" />
     </add>
     <modulo name="mod_X_1" type="float">
       <input name="in1" type="float" nodename="shift_X" />
     </modulo>
     <modulo name="mod_Y_1" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="y" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outy" />
       <input name="in2" type="float" value="0.866025" />
     </modulo>
     <subtract name="coord_adj_1" type="float">
@@ -2352,6 +2446,9 @@
       <input name="in1" type="vector2" nodename="texcoord_scale" />
       <input name="in2" type="vector2" interfacename="uvoffset" />
     </subtract>
+    <separate2 name="texcoord_bias_separate" type="multioutput">
+      <input name="in" type="vector2" nodename="texcoord_bias" />
+    </separate2>
     <modulo name="mod_texcoord" type="vector2">
       <input name="in1" type="vector2" nodename="texcoord_bias" />
     </modulo>
@@ -2364,7 +2461,7 @@
       <input name="in2" type="float" value="1" />
     </subtract>
     <modulo name="stagg_Y" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="y" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outy" />
       <input name="in2" type="float" value="1" />
     </modulo>
     <ifgreater name="delta_X" type="float">
@@ -2373,14 +2470,14 @@
       <input name="in1" type="float" value="0.5" />
     </ifgreater>
     <add name="shift_X" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="x" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outx" />
       <input name="in2" type="float" nodename="delta_X" />
     </add>
     <modulo name="mod_X_1" type="float">
       <input name="in1" type="float" nodename="shift_X" />
     </modulo>
     <modulo name="mod_Y_1" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="y" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outy" />
       <input name="in2" type="float" value="0.5" />
     </modulo>
     <subtract name="coord_adj_1" type="float">
@@ -2461,6 +2558,9 @@
       <input name="in1" type="vector2" nodename="texcoord_scale" />
       <input name="in2" type="vector2" interfacename="uvoffset" />
     </subtract>
+    <separate2 name="texcoord_bias_separate" type="multioutput">
+      <input name="in" type="vector2" nodename="texcoord_bias" />
+    </separate2>
     <modulo name="mod_texcoord" type="vector2">
       <input name="in1" type="vector2" nodename="texcoord_bias" />
     </modulo>
@@ -2473,7 +2573,7 @@
       <input name="in2" type="float" value="1" />
     </subtract>
     <modulo name="stagg_Y" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="y" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outy" />
       <input name="in2" type="float" value="1.73205" />
     </modulo>
     <ifgreater name="delta_X" type="float">
@@ -2482,14 +2582,14 @@
       <input name="in1" type="float" value="0.5" />
     </ifgreater>
     <add name="shift_X" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="x" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outx" />
       <input name="in2" type="float" nodename="delta_X" />
     </add>
     <modulo name="mod_X_1" type="float">
       <input name="in1" type="float" nodename="shift_X" />
     </modulo>
     <modulo name="mod_Y_1" type="float">
-      <input name="in1" type="float" nodename="texcoord_bias" channels="y" />
+      <input name="in1" type="float" nodename="texcoord_bias_separate" output="outy" />
       <input name="in2" type="float" value="0.866025" />
     </modulo>
     <subtract name="coord_adj_1" type="float">
@@ -2799,60 +2899,114 @@
     to output 0-1.
   -->
   <nodegraph name="NG_smoothstep_color3" nodedef="ND_smoothstep_color3">
-    <smoothstep name="N_smoothstep" type="vector3">
-      <input name="in" type="vector3" interfacename="in" channels="rgb" />
-      <input name="low" type="vector3" interfacename="low" channels="rgb" />
-      <input name="high" type="vector3" interfacename="high" channels="rgb" />
+    <convert name="in_vector" type="vector3">
+      <input name="in" type="color3" interfacename="in" />
+    </convert>
+    <convert name="low_vector" type="vector3">
+      <input name="in" type="color3" interfacename="low" />
+    </convert>
+    <convert name="high_vector" type="vector3">
+      <input name="in" type="color3" interfacename="high" />
+    </convert>
+    <smoothstep name="smoothstep" type="vector3">
+      <input name="in" type="vector3" nodename="in_vector" />
+      <input name="low" type="vector3" nodename="low_vector" />
+      <input name="high" type="vector3" nodename="high_vector" />
     </smoothstep>
-    <output name="out" type="color3" nodename="N_smoothstep" channels="xyz" />
+    <convert name="smoothstep_color" type="color3">
+      <input name="in" type="vector3" nodename="smoothstep" />
+    </convert>
+    <output name="out" type="color3" nodename="smoothstep_color" />
   </nodegraph>
   <nodegraph name="NG_smoothstep_color4" nodedef="ND_smoothstep_color4">
-    <smoothstep name="N_smoothstep" type="vector4">
-      <input name="in" type="vector4" interfacename="in" channels="rgba" />
-      <input name="low" type="vector4" interfacename="low" channels="rgba" />
-      <input name="high" type="vector4" interfacename="high" channels="rgba" />
+    <convert name="in_vector" type="vector4">
+      <input name="in" type="color4" interfacename="in" />
+    </convert>
+    <convert name="low_vector" type="vector4">
+      <input name="in" type="color4" interfacename="low" />
+    </convert>
+    <convert name="high_vector" type="vector4">
+      <input name="in" type="color4" interfacename="high" />
+    </convert>
+    <smoothstep name="smoothstep" type="vector4">
+      <input name="in" type="vector4" nodename="in_vector" />
+      <input name="low" type="vector4" nodename="low_vector" />
+      <input name="high" type="vector4" nodename="high_vector" />
     </smoothstep>
-    <output name="out" type="color4" nodename="N_smoothstep" channels="xyzw" />
+    <convert name="smoothstep_color" type="color4">
+      <input name="in" type="vector4" nodename="smoothstep" />
+    </convert>
+    <output name="out" type="color4" nodename="smoothstep_color" />
   </nodegraph>
   <nodegraph name="NG_smoothstep_color3FA" nodedef="ND_smoothstep_color3FA">
-    <smoothstep name="N_smoothstep" type="color3">
+    <convert name="low_color" type="color3">
+      <input name="in" type="float" interfacename="low" />
+    </convert>
+    <convert name="high_color" type="color3">
+      <input name="in" type="float" interfacename="high" />
+    </convert>
+    <smoothstep name="smoothstep" type="color3">
       <input name="in" type="color3" interfacename="in" />
-      <input name="low" type="color3" interfacename="low" channels="xxx" />
-      <input name="high" type="color3" interfacename="high" channels="xxx" />
+      <input name="low" type="color3" nodename="low_color" />
+      <input name="high" type="color3" nodename="high_color" />
     </smoothstep>
-    <output name="out" type="color3" nodename="N_smoothstep" />
+    <output name="out" type="color3" nodename="smoothstep" />
   </nodegraph>
   <nodegraph name="NG_smoothstep_color4FA" nodedef="ND_smoothstep_color4FA">
-    <smoothstep name="N_smoothstep" type="color4">
+    <convert name="low_color" type="color4">
+      <input name="in" type="float" interfacename="low" />
+    </convert>
+    <convert name="high_color" type="color4">
+      <input name="in" type="float" interfacename="high" />
+    </convert>
+    <smoothstep name="smoothstep" type="color4">
       <input name="in" type="color4" interfacename="in" />
-      <input name="low" type="color4" interfacename="low" channels="xxxx" />
-      <input name="high" type="color4" interfacename="high" channels="xxxx" />
+      <input name="low" type="color4" nodename="low_color" />
+      <input name="high" type="color4" nodename="high_color" />
     </smoothstep>
-    <output name="out" type="color4" nodename="N_smoothstep" />
+    <output name="out" type="color4" nodename="smoothstep" />
   </nodegraph>
   <nodegraph name="NG_smoothstep_vector2FA" nodedef="ND_smoothstep_vector2FA">
-    <smoothstep name="N_smoothstep" type="vector2">
+    <convert name="low_vector" type="vector2">
+      <input name="in" type="float" interfacename="low" />
+    </convert>
+    <convert name="high_vector" type="vector2">
+      <input name="in" type="float" interfacename="high" />
+    </convert>
+    <smoothstep name="smoothstep" type="vector2">
       <input name="in" type="vector2" interfacename="in" />
-      <input name="low" type="vector2" interfacename="low" channels="xx" />
-      <input name="high" type="vector2" interfacename="high" channels="xx" />
+      <input name="low" type="vector2" nodename="low_vector" />
+      <input name="high" type="vector2" nodename="high_vector" />
     </smoothstep>
-    <output name="out" type="vector2" nodename="N_smoothstep" />
+    <output name="out" type="vector2" nodename="smoothstep" />
   </nodegraph>
   <nodegraph name="NG_smoothstep_vector3FA" nodedef="ND_smoothstep_vector3FA">
-    <smoothstep name="N_smoothstep" type="vector3">
+    <convert name="low_vector" type="vector3">
+      <input name="in" type="float" interfacename="low" />
+    </convert>
+    <convert name="high_vector" type="vector3">
+      <input name="in" type="float" interfacename="high" />
+    </convert>
+    <smoothstep name="smoothstep" type="vector3">
       <input name="in" type="vector3" interfacename="in" />
-      <input name="low" type="vector3" interfacename="low" channels="xxx" />
-      <input name="high" type="vector3" interfacename="high" channels="xxx" />
+      <input name="low" type="vector3" nodename="low_vector" />
+      <input name="high" type="vector3" nodename="high_vector" />
     </smoothstep>
-    <output name="out" type="vector3" nodename="N_smoothstep" />
+    <output name="out" type="vector3" nodename="smoothstep" />
   </nodegraph>
   <nodegraph name="NG_smoothstep_vector4FA" nodedef="ND_smoothstep_vector4FA">
-    <smoothstep name="N_smoothstep" type="vector4">
+    <convert name="low_vector" type="vector4">
+      <input name="in" type="float" interfacename="low" />
+    </convert>
+    <convert name="high_vector" type="vector4">
+      <input name="in" type="float" interfacename="high" />
+    </convert>
+    <smoothstep name="smoothstep" type="vector4">
       <input name="in" type="vector4" interfacename="in" />
-      <input name="low" type="vector4" interfacename="low" channels="xxxx" />
-      <input name="high" type="vector4" interfacename="high" channels="xxxx" />
+      <input name="low" type="vector4" nodename="low_vector" />
+      <input name="high" type="vector4" nodename="high_vector" />
     </smoothstep>
-    <output name="out" type="vector4" nodename="N_smoothstep" />
+    <output name="out" type="vector4" nodename="smoothstep" />
   </nodegraph>
 
   <!--
@@ -4168,7 +4322,7 @@
     <output name="outb" type="float" nodename="N_extract_2" />
   </nodegraph>
   <nodegraph name="NG_separate4_color4" nodedef="ND_separate4_color4">
-     <extract name="N_extract_0" type="float">
+    <extract name="N_extract_0" type="float">
       <input name="in" type="color4" interfacename="in" />
       <input name="index" type="integer" value="0" />
     </extract>
@@ -4190,7 +4344,7 @@
     <output name="outa" type="float" nodename="N_extract_3" />
   </nodegraph>
   <nodegraph name="NG_separate2_vector2" nodedef="ND_separate2_vector2">
-     <extract name="N_extract_0" type="float">
+    <extract name="N_extract_0" type="float">
       <input name="in" type="vector2" interfacename="in" />
       <input name="index" type="integer" value="0" />
     </extract>
@@ -4202,7 +4356,7 @@
     <output name="outy" type="float" nodename="N_extract_1" />
   </nodegraph>
   <nodegraph name="NG_separate3_vector3" nodedef="ND_separate3_vector3">
-     <extract name="N_extract_0" type="float">
+    <extract name="N_extract_0" type="float">
       <input name="in" type="vector3" interfacename="in" />
       <input name="index" type="integer" value="0" />
     </extract>
diff --git a/libraries/targets/essl.mtlx b/libraries/targets/essl.mtlx
index 1306d32fe7..03a1b5bc88 100644
--- a/libraries/targets/essl.mtlx
+++ b/libraries/targets/essl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!--
   Copyright Contributors to the MaterialX Project
diff --git a/libraries/targets/genglsl.mtlx b/libraries/targets/genglsl.mtlx
index 9bd382c482..820a43c248 100644
--- a/libraries/targets/genglsl.mtlx
+++ b/libraries/targets/genglsl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!--
     Copyright Contributors to the MaterialX Project
diff --git a/libraries/targets/genmdl.mtlx b/libraries/targets/genmdl.mtlx
index 04c7ec18bb..91ac5ff01c 100644
--- a/libraries/targets/genmdl.mtlx
+++ b/libraries/targets/genmdl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!--
     Copyright Contributors to the MaterialX Project
diff --git a/libraries/targets/genmsl.mtlx b/libraries/targets/genmsl.mtlx
index 4e0a206b00..0ad09cc142 100644
--- a/libraries/targets/genmsl.mtlx
+++ b/libraries/targets/genmsl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!--
     Copyright Contributors to the MaterialX Project
diff --git a/libraries/targets/genosl.mtlx b/libraries/targets/genosl.mtlx
index 314f065aa1..cae914fb1b 100644
--- a/libraries/targets/genosl.mtlx
+++ b/libraries/targets/genosl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!--
     Copyright Contributors to the MaterialX Project

From 537aa920d7e312cbb6b44ae6132abf39c3aa30e6 Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Sat, 22 Jun 2024 10:20:27 -0700
Subject: [PATCH 35/48] Upgrade resources to 1.39

This changelist upgrades the documents in the resources folder to v1.39, leveraging the `mxformat.py` script and making additional edits and deletions for clarity.
---
 resources/Lights/environment_map.mtlx         |  11 +-
 resources/Lights/goegap_split.mtlx            |   2 +-
 .../Lights/san_giuseppe_bridge_split.mtlx     |   2 +-
 resources/Lights/table_mountain_split.mtlx    |   2 +-
 .../Examples/GltfPbr/gltf_pbr_boombox.mtlx    |  11 +-
 .../Examples/GltfPbr/gltf_pbr_carpaint.mtlx   |   2 +-
 .../Examples/GltfPbr/gltf_pbr_default.mtlx    |   2 +-
 .../Examples/GltfPbr/gltf_pbr_glass.mtlx      |   2 +-
 .../Examples/GltfPbr/gltf_pbr_gold.mtlx       |   2 +-
 .../Examples/GltfPbr/gltf_pbr_plastic.mtlx    |   2 +-
 .../OpenPbr/open_pbr_aluminum_brushed.mtlx    |   2 +-
 .../Examples/OpenPbr/open_pbr_carpaint.mtlx   |   2 +-
 .../Examples/OpenPbr/open_pbr_default.mtlx    |   2 +-
 .../Examples/OpenPbr/open_pbr_glass.mtlx      |   2 +-
 .../Examples/OpenPbr/open_pbr_honey.mtlx      |   2 +-
 .../Examples/OpenPbr/open_pbr_ketchup.mtlx    |   2 +-
 .../Examples/OpenPbr/open_pbr_lightbulb.mtlx  |   2 +-
 .../Examples/OpenPbr/open_pbr_pearl.mtlx      |   2 +-
 .../Examples/OpenPbr/open_pbr_soapbubble.mtlx |   2 +-
 .../Examples/OpenPbr/open_pbr_velvet.mtlx     |   2 +-
 .../standard_surface_brass_tiled.mtlx         |   2 +-
 .../standard_surface_brick_procedural.mtlx    |   2 +-
 .../standard_surface_carpaint.mtlx            |   2 +-
 .../standard_surface_chess_set.mtlx           |   2 +-
 .../standard_surface_chrome.mtlx              |   2 +-
 .../standard_surface_copper.mtlx              |   2 +-
 .../standard_surface_default.mtlx             |   2 +-
 .../standard_surface_glass.mtlx               |   2 +-
 .../standard_surface_glass_tinted.mtlx        |   2 +-
 .../standard_surface_gold.mtlx                |   2 +-
 .../standard_surface_greysphere.mtlx          |   2 +-
 ...andard_surface_greysphere_calibration.mtlx |   2 +-
 .../standard_surface_jade.mtlx                |   2 +-
 .../standard_surface_look_brass_tiled.mtlx    |   2 +-
 .../standard_surface_look_wood_tiled.mtlx     |   2 +-
 .../standard_surface_marble_solid.mtlx        |   2 +-
 .../standard_surface_metal_brushed.mtlx       |   2 +-
 .../standard_surface_plastic.mtlx             |   2 +-
 .../standard_surface_thin_film.mtlx           |   2 +-
 .../standard_surface_velvet.mtlx              |   2 +-
 .../standard_surface_wood_tiled.mtlx          |   2 +-
 .../usd_preview_surface_brass_tiled.mtlx      |   2 +-
 .../usd_preview_surface_carpaint.mtlx         |   2 +-
 .../usd_preview_surface_default.mtlx          |   2 +-
 .../usd_preview_surface_glass.mtlx            |   2 +-
 .../usd_preview_surface_gold.mtlx             |   2 +-
 .../usd_preview_surface_plastic.mtlx          |   2 +-
 resources/Materials/TestSuite/_options.mtlx   |   2 +-
 .../libraries/metal/brass_wire_mesh.mtlx      |   2 +-
 .../metal/libraries/metal_definition.mtlx     |   2 +-
 .../TestSuite/lights/light_compound_test.mtlx |   2 +-
 .../TestSuite/lights/light_rig_test_1.mtlx    |   2 +-
 .../TestSuite/lights/light_rig_test_2.mtlx    |   2 +-
 .../TestSuite/locale/numericformat.mtlx       |   2 +-
 .../Materials/TestSuite/locale/utf8.mtlx      |   2 +-
 .../TestSuite/nprlib/edge_brighten.mtlx       |   2 +-
 .../TestSuite/nprlib/gooch_shade.mtlx         |   2 +-
 .../Materials/TestSuite/nprlib/starfield.mtlx |   2 +-
 .../TestSuite/nprlib/toon_shade.mtlx          |   6 +-
 .../TestSuite/pbrlib/bsdf/add_bsdf.mtlx       |   2 +-
 .../TestSuite/pbrlib/bsdf/blackbody.mtlx      |   2 +-
 .../TestSuite/pbrlib/bsdf/bsdf_graph.mtlx     |   2 +-
 .../TestSuite/pbrlib/bsdf/burley_diffuse.mtlx |   2 +-
 .../TestSuite/pbrlib/bsdf/conductor.mtlx      |   2 +-
 .../TestSuite/pbrlib/bsdf/dielectric.mtlx     |   2 +-
 .../pbrlib/bsdf/generalized_schlick.mtlx      |   2 +-
 .../TestSuite/pbrlib/bsdf/layer_bsdf.mtlx     |   2 +-
 .../TestSuite/pbrlib/bsdf/mix_bsdf.mtlx       |   2 +-
 .../TestSuite/pbrlib/bsdf/multiply_bsdf.mtlx  |   2 +-
 .../pbrlib/bsdf/oren_nayar_diffuse.mtlx       |   2 +-
 .../TestSuite/pbrlib/bsdf/thin_film_bsdf.mtlx | 106 ++------
 .../pbrlib/bsdf/translucent_bsdf.mtlx         |   2 +-
 .../TestSuite/pbrlib/bsdf/varying_ior.mtlx    |   8 +-
 .../pbrlib/bsdf/vertical_layering.mtlx        |   2 +-
 .../displacement/displaced_material.mtlx      |   2 +-
 .../pbrlib/displacement/displacement.mtlx     |   2 +-
 .../TestSuite/pbrlib/edf/add_edf.mtlx         |   2 +-
 .../TestSuite/pbrlib/edf/edf_graph.mtlx       |   2 +-
 .../pbrlib/edf/generalized_schlick_edf.mtlx   |   2 +-
 .../TestSuite/pbrlib/edf/mix_edf.mtlx         |   2 +-
 .../TestSuite/pbrlib/edf/multiply_edf.mtlx    |   2 +-
 .../pbrlib/multioutput/multioutput.mtlx       |  19 +-
 .../pbrlib/multioutput/multishaderoutput.mtlx |   2 +-
 .../pbrlib/surfaceshader/lama/lama_add.mtlx   |   2 +-
 .../surfaceshader/lama/lama_conductor.mtlx    |   2 +-
 .../surfaceshader/lama/lama_dielectric.mtlx   |   2 +-
 .../surfaceshader/lama/lama_diffuse.mtlx      |   2 +-
 .../surfaceshader/lama/lama_emission.mtlx     |   2 +-
 .../pbrlib/surfaceshader/lama/lama_layer.mtlx |  18 +-
 .../pbrlib/surfaceshader/lama/lama_mix.mtlx   |   2 +-
 .../pbrlib/surfaceshader/lama/lama_sheen.mtlx |   2 +-
 .../pbrlib/surfaceshader/lama/lama_sss.mtlx   |   2 +-
 .../surfaceshader/lama/lama_translucent.mtlx  |   2 +-
 .../surfaceshader/mapped_surfaceshader.mtlx   |   2 +-
 .../surfaceshader/network_surfaceshader.mtlx  |   6 +-
 .../nodegraph_surfaceshader.mtlx              |   2 +-
 .../normalmapped_surfaceshader.mtlx           |   2 +-
 .../pbrlib/surfaceshader/shader_ops.mtlx      |  18 +-
 .../TestSuite/pbrlib/surfaceshader/sheen.mtlx |   2 +-
 .../pbrlib/surfaceshader/subsurface.mtlx      |   2 +-
 .../pbrlib/surfaceshader/surface_ops.mtlx     |   2 +-
 .../surfacematerial_with_graph.mtlx           |   2 +-
 .../pbrlib/surfaceshader/usd_normal_map.mtlx  |   4 +-
 .../pbrlib/surfaceshader/usd_uv_texture.mtlx  |  13 +-
 .../stdlib/adjustment/adjustment.mtlx         |   2 +-
 .../TestSuite/stdlib/adjustment/hsvtorgb.mtlx |   2 +-
 .../stdlib/adjustment/smoothstep.mtlx         |   2 +-
 .../TestSuite/stdlib/application/syntax.mtlx  |  33 ---
 .../{timeFrame.mtlx => time_frame.mtlx}       |   2 +-
 .../application/unique_identifiers.mtlx       |  31 ---
 .../TestSuite/stdlib/channel/channel.mtlx     |   2 +-
 .../stdlib/channel/channels_attribute.mtlx    | 133 ----------
 .../TestSuite/stdlib/channel/swizzle.mtlx     | 248 ------------------
 .../color_management/color3_vec3_cm_test.mtlx |   2 +-
 .../color_management/color_management.mtlx    |  57 +++-
 .../color_management/filename_cm_test.mtlx    |   2 +-
 .../color_management/surface_colorspace.mtlx  |   2 +-
 .../stdlib/compositing/compositing.mtlx       |   2 +-
 .../conditional/conditional_if_float.mtlx     |   2 +-
 .../conditional/conditional_if_int.mtlx       |   2 +-
 .../conditional/conditional_switch.mtlx       |   2 +-
 .../TestSuite/stdlib/convert/convert.mtlx     |   2 +-
 .../TestSuite/stdlib/convolution/blur.mtlx    |   2 +-
 .../stdlib/convolution/heighttonormal.mtlx    |   2 +-
 .../definition/definition_from_nodegraph.mtlx |   2 +-
 .../definition_reduced_interface.mtlx         |   2 +-
 .../definition_using_definitions.mtlx         |   2 +-
 .../surfacematerial_definition.mtlx           |   2 +-
 .../stdlib/geometric/geompropvalue.mtlx       |   9 +-
 .../geometric/look_assignment_order.mtlx      |   2 +-
 .../TestSuite/stdlib/geometric/streams.mtlx   |  29 +-
 .../materials/material_node_discovery.mtlx    |   2 +-
 .../Materials/TestSuite/stdlib/math/math.mtlx |   2 +-
 .../TestSuite/stdlib/math/math_operators.mtlx |   2 +-
 .../TestSuite/stdlib/math/matrix.mtlx         |   2 +-
 .../TestSuite/stdlib/math/transform.mtlx      |  38 ++-
 .../Materials/TestSuite/stdlib/math/trig.mtlx |   2 +-
 .../TestSuite/stdlib/math/vector_math.mtlx    |  26 +-
 .../stdlib/nodegraphs/cascade_nodegraphs.mtlx |   2 +-
 .../nodegraphs/nodegraph_multioutput.mtlx     |   2 +-
 .../nodegraphs/nodegraph_nodegraph.mtlx       |   2 +-
 ...cematerial_nodegraph_to_surfaceshader.mtlx |   2 +-
 .../stdlib/nodegraphs/top_level_input.mtlx    |   2 +-
 .../stdlib/nodegraphs/topology_tests.mtlx     | 182 -------------
 .../TestSuite/stdlib/noise/noise.mtlx         |   2 +-
 .../TestSuite/stdlib/noise/procedural.mtlx    |  10 +-
 .../stdlib/noise/shared_function.mtlx         |   2 +-
 .../stdlib/organization/organization.mtlx     |   2 +-
 .../stdlib/procedural/linepattern.mtlx        |   2 +-
 .../stdlib/procedural/tiledshape.mtlx         |   2 +-
 .../TestSuite/stdlib/shader/surface.mtlx      |  14 +-
 .../TestSuite/stdlib/texture/image.mtlx       |   2 +-
 .../stdlib/texture/image_addressing.mtlx      |   2 +-
 .../stdlib/texture/image_codecs.mtlx          |   2 +-
 .../stdlib/texture/image_default.mtlx         |   2 +-
 .../stdlib/texture/image_transform.mtlx       |   2 +-
 .../TestSuite/stdlib/texture/ramp.mtlx        |   2 +-
 .../TestSuite/stdlib/texture/split.mtlx       |   2 +-
 .../TestSuite/stdlib/texture/texcoord.mtlx    |  25 --
 .../TestSuite/stdlib/texture/tiledimage.mtlx  |   2 +-
 .../TestSuite/stdlib/texture/tokenGraph.mtlx  |   2 +-
 .../stdlib/texture/triplanarprojection.mtlx   |   2 +-
 .../TestSuite/stdlib/units/constant_unit.mtlx |   2 +-
 .../stdlib/units/distance_units.mtlx          |   2 +-
 .../TestSuite/stdlib/units/image_unit.mtlx    |   2 +-
 .../stdlib/units/standard_surface_unit.mtlx   |   2 +-
 .../TestSuite/stdlib/units/texture_units.mtlx |   2 +-
 .../stdlib/units/tiledimage_unit.mtlx         |   2 +-
 .../stdlib/version/multiple_version_test.mtlx |   2 +-
 169 files changed, 368 insertions(+), 977 deletions(-)
 delete mode 100644 resources/Materials/TestSuite/stdlib/application/syntax.mtlx
 rename resources/Materials/TestSuite/stdlib/application/{timeFrame.mtlx => time_frame.mtlx} (97%)
 delete mode 100644 resources/Materials/TestSuite/stdlib/application/unique_identifiers.mtlx
 delete mode 100644 resources/Materials/TestSuite/stdlib/channel/channels_attribute.mtlx
 delete mode 100644 resources/Materials/TestSuite/stdlib/channel/swizzle.mtlx
 delete mode 100644 resources/Materials/TestSuite/stdlib/nodegraphs/topology_tests.mtlx
 delete mode 100644 resources/Materials/TestSuite/stdlib/texture/texcoord.mtlx

diff --git a/resources/Lights/environment_map.mtlx b/resources/Lights/environment_map.mtlx
index 01b33d74b4..1e294539d6 100644
--- a/resources/Lights/environment_map.mtlx
+++ b/resources/Lights/environment_map.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
 
   <nodegraph name="envMap">
 
@@ -7,9 +7,12 @@
     <viewdirection name="viewDir" type="vector3" />
 
     <!-- Compute longitude coordinate -->
+    <separate3 name="viewDirChannels" type="multioutput">
+      <input name="in" type="vector3" nodename="viewDir" />
+    </separate3>
     <atan2 name="angleXZ" type="float">
-      <input name="iny" type="float" nodename="viewDir" channels="x" />
-      <input name="inx" type="float" nodename="viewDir" channels="z" />
+      <input name="iny" type="float" nodename="viewDirChannels" output="outx" />
+      <input name="inx" type="float" nodename="viewDirChannels" output="outz" />
     </atan2>
     <multiply name="scaleXZ" type="float">
       <input name="in1" type="float" nodename="angleXZ" />
@@ -22,7 +25,7 @@
 
     <!-- Compute latitude coordinate -->
     <asin name="angleY" type="float">
-      <input name="in" type="float" nodename="viewDir" channels="y" />
+      <input name="in" type="float" nodename="viewDirChannels" output="outy" />
     </asin>
     <multiply name="scaleY" type="float">
       <input name="in1" type="float" nodename="angleY" />
diff --git a/resources/Lights/goegap_split.mtlx b/resources/Lights/goegap_split.mtlx
index e046df5bf4..f987f99cc9 100644
--- a/resources/Lights/goegap_split.mtlx
+++ b/resources/Lights/goegap_split.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <directional_light name="dir_light" type="lightshader">
     <input name="direction" type="vector3" value="0.43277, -0.725547, -0.535062" />
     <input name="color" type="color3" value="0.993688, 1, 0.993529" />
diff --git a/resources/Lights/san_giuseppe_bridge_split.mtlx b/resources/Lights/san_giuseppe_bridge_split.mtlx
index 570c7b4f70..31938e9484 100644
--- a/resources/Lights/san_giuseppe_bridge_split.mtlx
+++ b/resources/Lights/san_giuseppe_bridge_split.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <directional_light name="dir_light" type="lightshader">
     <input name="direction" type="vector3" value="0.514434, -0.479014, -0.711269" />
     <input name="color" type="color3" value="1, 0.894474, 0.567234" />
diff --git a/resources/Lights/table_mountain_split.mtlx b/resources/Lights/table_mountain_split.mtlx
index b16050465f..658b60b290 100644
--- a/resources/Lights/table_mountain_split.mtlx
+++ b/resources/Lights/table_mountain_split.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <directional_light name="dir_light" type="lightshader">
     <input name="direction" type="vector3" value="0.757663, -0.126589, -0.640251" />
     <input name="color" type="color3" value="1, 0.844753, 0.418417" />
diff --git a/resources/Materials/Examples/GltfPbr/gltf_pbr_boombox.mtlx b/resources/Materials/Examples/GltfPbr/gltf_pbr_boombox.mtlx
index 72d23a8c78..411f316672 100644
--- a/resources/Materials/Examples/GltfPbr/gltf_pbr_boombox.mtlx
+++ b/resources/Materials/Examples/GltfPbr/gltf_pbr_boombox.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709" fileprefix="boombox/">
+<materialx version="1.39" colorspace="lin_rec709" fileprefix="boombox/">
   <gltf_colorimage name="image_basecolor" type="multioutput">
     <input name="file" type="filename" value="BoomBox_baseColor.png" colorspace="srgb_texture" />
   </gltf_colorimage>
@@ -12,12 +12,15 @@
   <gltf_image name="image_emission" type="color3">
     <input name="file" type="filename" value="BoomBox_emissive.png" colorspace="srgb_texture" />
   </gltf_image>
+  <separate3 name="image_orm_channels" type="multioutput">
+    <input name="in" type="vector3" nodename="image_orm" />
+  </separate3>
   <gltf_pbr name="SR_boombox" type="surfaceshader">
     <input name="base_color" type="color3" nodename="image_basecolor" output="outcolor" />
     <input name="alpha" type="float" nodename="image_basecolor" output="outa" />
-    <input name="metallic" type="float" nodename="image_orm" channels="z" />
-    <input name="roughness" type="float" nodename="image_orm" channels="y" />
-    <input name="occlusion" type="float" nodename="image_orm" channels="x" />
+    <input name="metallic" type="float" nodename="image_orm_channels" output="outz" />
+    <input name="roughness" type="float" nodename="image_orm_channels" output="outy" />
+    <input name="occlusion" type="float" nodename="image_orm_channels" output="outx" />
     <input name="normal" type="vector3" nodename="image_normal" />
     <input name="emissive" type="color3" nodename="image_emission" />
   </gltf_pbr>
diff --git a/resources/Materials/Examples/GltfPbr/gltf_pbr_carpaint.mtlx b/resources/Materials/Examples/GltfPbr/gltf_pbr_carpaint.mtlx
index 9abae490bf..c6ec4bba41 100644
--- a/resources/Materials/Examples/GltfPbr/gltf_pbr_carpaint.mtlx
+++ b/resources/Materials/Examples/GltfPbr/gltf_pbr_carpaint.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <gltf_pbr name="SR_carpaint" type="surfaceshader">
     <input name="base_color" type="color3" value="0.0518895, 0.29606, 0.425324" />
     <input name="metallic" type="float" value="0" />
diff --git a/resources/Materials/Examples/GltfPbr/gltf_pbr_default.mtlx b/resources/Materials/Examples/GltfPbr/gltf_pbr_default.mtlx
index 98c90ce0c2..88d7031663 100644
--- a/resources/Materials/Examples/GltfPbr/gltf_pbr_default.mtlx
+++ b/resources/Materials/Examples/GltfPbr/gltf_pbr_default.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <gltf_pbr name="SR_default" type="surfaceshader">
     <input name="base_color" type="color3" value="1.0, 1.0, 1.0" />
     <input name="metallic" type="float" value="1" />
diff --git a/resources/Materials/Examples/GltfPbr/gltf_pbr_glass.mtlx b/resources/Materials/Examples/GltfPbr/gltf_pbr_glass.mtlx
index 24ff427fcf..3eb394c000 100644
--- a/resources/Materials/Examples/GltfPbr/gltf_pbr_glass.mtlx
+++ b/resources/Materials/Examples/GltfPbr/gltf_pbr_glass.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <gltf_pbr name="SR_glass" type="surfaceshader">
     <input name="metallic" type="float" value="0" />
     <input name="roughness" type="float" value="0.01" />
diff --git a/resources/Materials/Examples/GltfPbr/gltf_pbr_gold.mtlx b/resources/Materials/Examples/GltfPbr/gltf_pbr_gold.mtlx
index 6c0d79d74b..6d93c5d99e 100644
--- a/resources/Materials/Examples/GltfPbr/gltf_pbr_gold.mtlx
+++ b/resources/Materials/Examples/GltfPbr/gltf_pbr_gold.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <gltf_pbr name="SR_gold" type="surfaceshader">
     <input name="base_color" type="color3" value="0.944, 0.776, 0.373" />
     <input name="roughness" type="float" value="0.02" />
diff --git a/resources/Materials/Examples/GltfPbr/gltf_pbr_plastic.mtlx b/resources/Materials/Examples/GltfPbr/gltf_pbr_plastic.mtlx
index 860bc5ce6c..0a4c99cf83 100644
--- a/resources/Materials/Examples/GltfPbr/gltf_pbr_plastic.mtlx
+++ b/resources/Materials/Examples/GltfPbr/gltf_pbr_plastic.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <gltf_pbr name="SR_plastic" type="surfaceshader">
     <input name="base_color" type="color3" value="0.104704, 0.241883, 0.818" />
     <input name="metallic" type="float" value="0" />
diff --git a/resources/Materials/Examples/OpenPbr/open_pbr_aluminum_brushed.mtlx b/resources/Materials/Examples/OpenPbr/open_pbr_aluminum_brushed.mtlx
index 7f7072d416..daac59d65c 100644
--- a/resources/Materials/Examples/OpenPbr/open_pbr_aluminum_brushed.mtlx
+++ b/resources/Materials/Examples/OpenPbr/open_pbr_aluminum_brushed.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <surfacematerial name="Aluminum_Brushed" type="material">
     <input name="surfaceshader" type="surfaceshader" nodename="open_pbr_surface_surfaceshader" />
   </surfacematerial>
diff --git a/resources/Materials/Examples/OpenPbr/open_pbr_carpaint.mtlx b/resources/Materials/Examples/OpenPbr/open_pbr_carpaint.mtlx
index fd42fdf48d..0d98dc2fee 100644
--- a/resources/Materials/Examples/OpenPbr/open_pbr_carpaint.mtlx
+++ b/resources/Materials/Examples/OpenPbr/open_pbr_carpaint.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <surfacematerial name="Car_Paint" type="material">
     <input name="surfaceshader" type="surfaceshader" nodename="open_pbr_surface_surfaceshader" />
   </surfacematerial>
diff --git a/resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx b/resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx
index 8125541a99..2f541d82ba 100644
--- a/resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx
+++ b/resources/Materials/Examples/OpenPbr/open_pbr_default.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <surfacematerial name="Default" type="material">
     <input name="surfaceshader" type="surfaceshader" nodename="open_pbr_surface_surfaceshader" />
     <input name="displacementshader" type="displacementshader" value="" />
diff --git a/resources/Materials/Examples/OpenPbr/open_pbr_glass.mtlx b/resources/Materials/Examples/OpenPbr/open_pbr_glass.mtlx
index a661b9d1f6..f2e82e8e65 100644
--- a/resources/Materials/Examples/OpenPbr/open_pbr_glass.mtlx
+++ b/resources/Materials/Examples/OpenPbr/open_pbr_glass.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <surfacematerial name="Glass" type="material">
     <input name="surfaceshader" type="surfaceshader" nodename="open_pbr_surface_surfaceshader" />
   </surfacematerial>
diff --git a/resources/Materials/Examples/OpenPbr/open_pbr_honey.mtlx b/resources/Materials/Examples/OpenPbr/open_pbr_honey.mtlx
index 41e076d231..aff78bee1a 100644
--- a/resources/Materials/Examples/OpenPbr/open_pbr_honey.mtlx
+++ b/resources/Materials/Examples/OpenPbr/open_pbr_honey.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <surfacematerial name="Honey" type="material">
     <input name="surfaceshader" type="surfaceshader" nodename="open_pbr_surface_surfaceshader" />
   </surfacematerial>
diff --git a/resources/Materials/Examples/OpenPbr/open_pbr_ketchup.mtlx b/resources/Materials/Examples/OpenPbr/open_pbr_ketchup.mtlx
index cda2ebdf7e..78e2d0a833 100644
--- a/resources/Materials/Examples/OpenPbr/open_pbr_ketchup.mtlx
+++ b/resources/Materials/Examples/OpenPbr/open_pbr_ketchup.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <surfacematerial name="Ketchup" type="material">
     <input name="surfaceshader" type="surfaceshader" nodename="open_pbr_surface_surfaceshader" />
   </surfacematerial>
diff --git a/resources/Materials/Examples/OpenPbr/open_pbr_lightbulb.mtlx b/resources/Materials/Examples/OpenPbr/open_pbr_lightbulb.mtlx
index a915f842a4..7e1218cffd 100644
--- a/resources/Materials/Examples/OpenPbr/open_pbr_lightbulb.mtlx
+++ b/resources/Materials/Examples/OpenPbr/open_pbr_lightbulb.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <surfacematerial name="Light_Bulb" type="material">
     <input name="surfaceshader" type="surfaceshader" nodename="open_pbr_surface_surfaceshader" />
   </surfacematerial>
diff --git a/resources/Materials/Examples/OpenPbr/open_pbr_pearl.mtlx b/resources/Materials/Examples/OpenPbr/open_pbr_pearl.mtlx
index 83db774b8e..cc716420cb 100644
--- a/resources/Materials/Examples/OpenPbr/open_pbr_pearl.mtlx
+++ b/resources/Materials/Examples/OpenPbr/open_pbr_pearl.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <surfacematerial name="Pearl" type="material">
     <input name="surfaceshader" type="surfaceshader" nodename="open_pbr_surface_surfaceshader" />
   </surfacematerial>
diff --git a/resources/Materials/Examples/OpenPbr/open_pbr_soapbubble.mtlx b/resources/Materials/Examples/OpenPbr/open_pbr_soapbubble.mtlx
index af0faccb2a..7de701df4e 100644
--- a/resources/Materials/Examples/OpenPbr/open_pbr_soapbubble.mtlx
+++ b/resources/Materials/Examples/OpenPbr/open_pbr_soapbubble.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <surfacematerial name="Soap_Bubble" type="material">
     <input name="surfaceshader" type="surfaceshader" nodename="open_pbr_surface_surfaceshader" />
   </surfacematerial>
diff --git a/resources/Materials/Examples/OpenPbr/open_pbr_velvet.mtlx b/resources/Materials/Examples/OpenPbr/open_pbr_velvet.mtlx
index 6fbc907f3d..61c83e2ab2 100644
--- a/resources/Materials/Examples/OpenPbr/open_pbr_velvet.mtlx
+++ b/resources/Materials/Examples/OpenPbr/open_pbr_velvet.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <surfacematerial name="Velvet" type="material">
     <input name="surfaceshader" type="surfaceshader" nodename="open_pbr_surface_surfaceshader" />
   </surfacematerial>
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_brass_tiled.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_brass_tiled.mtlx
index bc59bf172d..f97a98fcd2 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_brass_tiled.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_brass_tiled.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709" fileprefix="../../../Images/">
+<materialx version="1.39" colorspace="lin_rec709" fileprefix="../../../Images/">
   <nodegraph name="NG_brass1">
     <tiledimage name="image_color" type="color3">
       <input name="file" type="filename" value="brass_color.jpg" colorspace="srgb_texture" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_brick_procedural.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_brick_procedural.mtlx
index 1d6f6da6fa..1728ba4899 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_brick_procedural.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_brick_procedural.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709" fileprefix="../../../Images/">
+<materialx version="1.39" colorspace="lin_rec709" fileprefix="../../../Images/">
   <nodegraph name="NG_BrickPattern">
     <input name="brick_color" type="color3" value="0.661876, 0.19088, 0" uiname="Brick Color" uifolder="Color" />
     <input name="hue_variation" type="float" value="0.083" uimin="0" uimax="1" uiname="Hue Variation" uifolder="Color" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_carpaint.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_carpaint.mtlx
index 45648a9e15..738970875b 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_carpaint.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_carpaint.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_carpaint" type="surfaceshader">
     <input name="base" type="float" value="0.5" />
     <input name="base_color" type="color3" value="0.1037792, 0.59212029, 0.85064936" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_chess_set.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_chess_set.mtlx
index 96e8a6580c..3cbaf02fac 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_chess_set.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_chess_set.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <!-- Chess Set geometry and material contributed by Side Effects, artwork by Moeen Sayed and Mujtaba Sayed. -->
 
   <!-- Bishop Black -->
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_chrome.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_chrome.mtlx
index e912343f81..81a5df6cad 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_chrome.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_chrome.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_chrome" type="surfaceshader">
     <input name="base" type="float" value="1" />
     <input name="base_color" type="color3" value="1.0, 1.0, 1.0" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_copper.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_copper.mtlx
index 0b3d9ab2ec..6eadaefa2e 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_copper.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_copper.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_copper" type="surfaceshader">
     <input name="base" type="float" value="1" />
     <input name="base_color" type="color3" value="1, 1, 1" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_default.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_default.mtlx
index 3d4f2bd79f..b4f09666c1 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_default.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_default.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_default" type="surfaceshader">
     <input name="base" type="float" value="1.0" />
     <input name="base_color" type="color3" value="0.8, 0.8, 0.8" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_glass.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_glass.mtlx
index 6021af114c..5a5461e791 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_glass.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_glass.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_glass" type="surfaceshader">
     <input name="base" type="float" value="0.0" />
     <input name="specular" type="float" value="1" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_glass_tinted.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_glass_tinted.mtlx
index 0248477d43..ef515a1bf1 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_glass_tinted.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_glass_tinted.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_glass_tinted" type="surfaceshader">
     <input name="base" type="float" value="0" />
     <input name="specular" type="float" value="1" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_gold.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_gold.mtlx
index 912c3d123d..d8f0e6bc6f 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_gold.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_gold.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_gold" type="surfaceshader">
     <input name="base" type="float" value="1" />
     <input name="base_color" type="color3" value="0.944, 0.776, 0.373" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_greysphere.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_greysphere.mtlx
index fe9be839e5..92a1c34190 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_greysphere.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_greysphere.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_greysphere" type="surfaceshader">
     <input name="base" type="float" value="1.0" />
     <input name="base_color" type="color3" value="0.18, 0.18, 0.18" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_greysphere_calibration.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_greysphere_calibration.mtlx
index 9e3ada7c17..584f440cd4 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_greysphere_calibration.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_greysphere_calibration.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709" fileprefix="../../../Images/">
+<materialx version="1.39" colorspace="lin_rec709" fileprefix="../../../Images/">
   <nodegraph name="NG_Greysphere_Calibration">
     <texcoord name="texcoord1" type="vector2" />
     <place2d name="place2d" type="vector2">
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_jade.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_jade.mtlx
index 76aa7a41e8..0becdec226 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_jade.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_jade.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_jade" type="surfaceshader">
     <input name="base" type="float" value="0.5" />
     <input name="base_color" type="color3" value="0.0603, 0.4398, 0.1916" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_look_brass_tiled.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_look_brass_tiled.mtlx
index 8c3a181aa6..510f1c27fd 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_look_brass_tiled.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_look_brass_tiled.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" xmlns:xi="http://www.w3.org/2001/XInclude">
+<materialx version="1.39" xmlns:xi="http://www.w3.org/2001/XInclude">
   <xi:include href="standard_surface_brass_tiled.mtlx" />
   <xi:include href="standard_surface_greysphere_calibration.mtlx" />
   <look name="Brass_Look">
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_look_wood_tiled.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_look_wood_tiled.mtlx
index 89979932d9..9a9073d09b 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_look_wood_tiled.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_look_wood_tiled.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" xmlns:xi="http://www.w3.org/2001/XInclude">
+<materialx version="1.39" xmlns:xi="http://www.w3.org/2001/XInclude">
   <xi:include href="standard_surface_wood_tiled.mtlx" />
   <xi:include href="standard_surface_greysphere_calibration.mtlx" />
   <look name="Wood_Look">
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_marble_solid.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_marble_solid.mtlx
index dd55fd9096..59c113197f 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_marble_solid.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_marble_solid.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <nodegraph name="NG_marble1">
     <input name="base_color_1" type="color3" value="0.8, 0.8, 0.8" uiname="Color 1" uifolder="Marble Color" />
     <input name="base_color_2" type="color3" value="0.1, 0.1, 0.3" uiname="Color 2" uifolder="Marble Color" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_metal_brushed.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_metal_brushed.mtlx
index 9fc27429a8..aabc1d0592 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_metal_brushed.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_metal_brushed.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_metal_brushed" type="surfaceshader">
     <input name="base" type="float" value="1" />
     <input name="base_color" type="color3" value="0.5, 0.5, 0.5" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_plastic.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_plastic.mtlx
index 5d693be7b7..2c16ff4e25 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_plastic.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_plastic.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_plastic" type="surfaceshader">
     <input name="base" type="float" value="1" />
     <input name="base_color" type="color3" value="0.10470402, 0.24188282, 0.81800002" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_thin_film.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_thin_film.mtlx
index 16d8112b73..7bda7f34b4 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_thin_film.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_thin_film.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_thin_film" type="surfaceshader">
     <input name="base" type="float" value="0.0" />
     <input name="base_color" type="color3" value="1, 1, 1" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_velvet.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_velvet.mtlx
index 9fa11d71f2..473578c949 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_velvet.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_velvet.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_velvet" type="surfaceshader">
     <input name="base" type="float" value="0.8" />
     <input name="base_color" type="color3" value="0.029, 0, 0.047" />
diff --git a/resources/Materials/Examples/StandardSurface/standard_surface_wood_tiled.mtlx b/resources/Materials/Examples/StandardSurface/standard_surface_wood_tiled.mtlx
index c030aa94ee..ed6690f071 100644
--- a/resources/Materials/Examples/StandardSurface/standard_surface_wood_tiled.mtlx
+++ b/resources/Materials/Examples/StandardSurface/standard_surface_wood_tiled.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <nodegraph name="NG_wood1" fileprefix="../../../Images/">
     <tiledimage name="image_color" type="color3">
       <input name="file" type="filename" value="wood_color.jpg" colorspace="srgb_texture" />
diff --git a/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_brass_tiled.mtlx b/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_brass_tiled.mtlx
index 59562e4ad0..85f6f3e139 100644
--- a/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_brass_tiled.mtlx
+++ b/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_brass_tiled.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <nodegraph name="NG_brass1" fileprefix="../../../Images/">
     <tiledimage name="image_color" type="color3">
       <input name="file" type="filename" value="brass_color.jpg" colorspace="srgb_texture" />
diff --git a/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_carpaint.mtlx b/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_carpaint.mtlx
index 551988af53..3fb1b00589 100644
--- a/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_carpaint.mtlx
+++ b/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_carpaint.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <UsdPreviewSurface name="SR_carpaint" type="surfaceshader">
     <input name="diffuseColor" type="color3" value="0.0518895, 0.29606, 0.425324" />
     <input name="roughness" type="float" value="0.4" />
diff --git a/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_default.mtlx b/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_default.mtlx
index be879c8c60..62317197b1 100644
--- a/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_default.mtlx
+++ b/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_default.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <UsdPreviewSurface name="SR_default" type="surfaceshader">
     <input name="diffuseColor" type="color3" value="0.18, 0.18, 0.18" />
     <input name="emissiveColor" type="color3" value="0, 0, 0" />
diff --git a/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_glass.mtlx b/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_glass.mtlx
index 2ef7d255a6..5cc6ab552e 100644
--- a/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_glass.mtlx
+++ b/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_glass.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <UsdPreviewSurface name="SR_glass" type="surfaceshader">
     <input name="diffuseColor" type="color3" value="0.0, 0.0, 0.0" />
     <input name="useSpecularWorkflow" type="integer" value="0" />
diff --git a/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_gold.mtlx b/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_gold.mtlx
index ecaf9914d3..c1e0e066c5 100644
--- a/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_gold.mtlx
+++ b/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_gold.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <UsdPreviewSurface name="SR_gold" type="surfaceshader">
     <input name="diffuseColor" type="color3" value="0.944, 0.776, 0.373" />
     <input name="metallic" type="float" value="1" />
diff --git a/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_plastic.mtlx b/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_plastic.mtlx
index b6b4a8c4ae..58fd5bf11c 100644
--- a/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_plastic.mtlx
+++ b/resources/Materials/Examples/UsdPreviewSurface/usd_preview_surface_plastic.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <UsdPreviewSurface name="SR_plastic" type="surfaceshader">
     <input name="diffuseColor" type="color3" value="0.10470402, 0.24188282, 0.81800002" />
     <input name="roughness" type="float" value="0.32467532157897949" />
diff --git a/resources/Materials/TestSuite/_options.mtlx b/resources/Materials/TestSuite/_options.mtlx
index 9b7dfd6b45..b437394775 100644
--- a/resources/Materials/TestSuite/_options.mtlx
+++ b/resources/Materials/TestSuite/_options.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Test suite options file which is parsed when the "render" category units tests are executed.
 
diff --git a/resources/Materials/TestSuite/libraries/metal/brass_wire_mesh.mtlx b/resources/Materials/TestSuite/libraries/metal/brass_wire_mesh.mtlx
index 8fb755c20e..ce3fb7108f 100644
--- a/resources/Materials/TestSuite/libraries/metal/brass_wire_mesh.mtlx
+++ b/resources/Materials/TestSuite/libraries/metal/brass_wire_mesh.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709" xmlns:xi="http://www.w3.org/2001/XInclude">
+<materialx version="1.39" colorspace="lin_rec709" xmlns:xi="http://www.w3.org/2001/XInclude">
   <xi:include href="libraries/metal_definition.mtlx" />
 
   <!-- Example using existing "test metal" definition -->
diff --git a/resources/Materials/TestSuite/libraries/metal/libraries/metal_definition.mtlx b/resources/Materials/TestSuite/libraries/metal/libraries/metal_definition.mtlx
index 3cf0d2dd0e..b95bff5148 100644
--- a/resources/Materials/TestSuite/libraries/metal/libraries/metal_definition.mtlx
+++ b/resources/Materials/TestSuite/libraries/metal/libraries/metal_definition.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--- Test metal node definition -->
   <nodedef name="ND_TestMetal" node="testmetal">
     <input name="MetalF0" type="color3" value="1, 1, 1" uiname="Color" uifolder="Basic Parameters" />
diff --git a/resources/Materials/TestSuite/lights/light_compound_test.mtlx b/resources/Materials/TestSuite/lights/light_compound_test.mtlx
index 151e78ce5d..be598b2d07 100644
--- a/resources/Materials/TestSuite/lights/light_compound_test.mtlx
+++ b/resources/Materials/TestSuite/lights/light_compound_test.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Node definition: <lightcompound>
   -->
diff --git a/resources/Materials/TestSuite/lights/light_rig_test_1.mtlx b/resources/Materials/TestSuite/lights/light_rig_test_1.mtlx
index 13172d74ed..f86312fa13 100644
--- a/resources/Materials/TestSuite/lights/light_rig_test_1.mtlx
+++ b/resources/Materials/TestSuite/lights/light_rig_test_1.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <directional_light name="headlight" type="lightshader">
     <input name="direction" type="vector3" value="0, 0, -1" />
     <input name="color" type="color3" value="1, 1, 1" />
diff --git a/resources/Materials/TestSuite/lights/light_rig_test_2.mtlx b/resources/Materials/TestSuite/lights/light_rig_test_2.mtlx
index 9daf057405..51e5ebb578 100644
--- a/resources/Materials/TestSuite/lights/light_rig_test_2.mtlx
+++ b/resources/Materials/TestSuite/lights/light_rig_test_2.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <point_light name="viewer_pointLight" type="lightshader">
     <input name="position" type="vector3" value="-3, -3, 3" />
     <input name="color" type="color3" value="1.0, 1.0, 1.0" />
diff --git a/resources/Materials/TestSuite/locale/numericformat.mtlx b/resources/Materials/TestSuite/locale/numericformat.mtlx
index a0995bff65..e9aa3603ce 100644
--- a/resources/Materials/TestSuite/locale/numericformat.mtlx
+++ b/resources/Materials/TestSuite/locale/numericformat.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <standard_surface name="SR_numberformats" type="surfaceshader">
     <input name="base_color" type="color3" value="0.18,0.18, 0.18" />
     <input name="specular_color" type="color3" value="0.05, 0.05,0.05" />
diff --git a/resources/Materials/TestSuite/locale/utf8.mtlx b/resources/Materials/TestSuite/locale/utf8.mtlx
index 38393d48de..dde51c7446 100644
--- a/resources/Materials/TestSuite/locale/utf8.mtlx
+++ b/resources/Materials/TestSuite/locale/utf8.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <standard_surface name="SR_Localetest" type="surfaceshader">
     <input name="base" type="float" value="1" />
     <input name="base_color" type="color3" value="0.18,0.18, 0.18" uiname="びまん性" />
diff --git a/resources/Materials/TestSuite/nprlib/edge_brighten.mtlx b/resources/Materials/TestSuite/nprlib/edge_brighten.mtlx
index 8ce3affd40..822ed6b8e9 100644
--- a/resources/Materials/TestSuite/nprlib/edge_brighten.mtlx
+++ b/resources/Materials/TestSuite/nprlib/edge_brighten.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <nodegraph name="edge_brighten">
     <facingratio name="facingratio_float" type="float">
       <input name="invert" type="boolean" value="true" />
diff --git a/resources/Materials/TestSuite/nprlib/gooch_shade.mtlx b/resources/Materials/TestSuite/nprlib/gooch_shade.mtlx
index 9e723e2de6..4a7049af9e 100644
--- a/resources/Materials/TestSuite/nprlib/gooch_shade.mtlx
+++ b/resources/Materials/TestSuite/nprlib/gooch_shade.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <gooch_shade name="default_gooch" type="color3">
     <input name="warm_color" type="color3" value="0.8, 0.8, 0.7" />
diff --git a/resources/Materials/TestSuite/nprlib/starfield.mtlx b/resources/Materials/TestSuite/nprlib/starfield.mtlx
index 6898054a6d..ae832fb474 100644
--- a/resources/Materials/TestSuite/nprlib/starfield.mtlx
+++ b/resources/Materials/TestSuite/nprlib/starfield.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <nodegraph name="starfield">
     <viewdirection name="viewDir" type="vector3" />
     <multiply name="multiply_vector3FA" type="vector3">
diff --git a/resources/Materials/TestSuite/nprlib/toon_shade.mtlx b/resources/Materials/TestSuite/nprlib/toon_shade.mtlx
index 1c93cad62d..b082a86d09 100644
--- a/resources/Materials/TestSuite/nprlib/toon_shade.mtlx
+++ b/resources/Materials/TestSuite/nprlib/toon_shade.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <surface_unlit name="surface_unlit" type="surfaceshader">
     <input name="emission_color" type="color3" nodename="toon_shade1" />
   </surface_unlit>
@@ -27,7 +27,7 @@
   </npr_test:toon_shade>
   <nodegraph name="NG_toon_sample" namespace="npr_test" nodedef="ND_toon_sample">
     <output name="output_color3" type="color3" nodename="multiply_color3" />
-    <normal name="normal" type="vector3" >
+    <normal name="normal" type="vector3">
       <input name="space" type="string" value="world" />
     </normal>
     <dotproduct name="NdotL" type="float">
@@ -49,7 +49,7 @@
       <input name="in" type="float" nodename="NdotL" />
       <input name="high" type="float" value="0.001" />
     </smoothstep>
-    <viewdirection name="viewdirection_vector3" type="vector3" >
+    <viewdirection name="viewdirection_vector3" type="vector3">
       <input name="space" type="string" value="world" />
     </viewdirection>
     <normalize name="unit_viewdirection" type="vector3">
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/add_bsdf.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/add_bsdf.mtlx
index d9152e761a..398b321de2 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/add_bsdf.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/add_bsdf.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="add_bsdf_test">
     <constant name="constant1" type="float">
       <input name="value" type="float" value="0.5" />
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/blackbody.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/blackbody.mtlx
index f2d9b193f3..4c7dee8028 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/blackbody.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/blackbody.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <nodegraph name="NG_blackbody">
     <input name="blackbody_temperature" type="float" value="5000.0" uimin="1500.0" uimax="25000.0" uistep="100.0" uiname="Blackbody Temperature Kelvin" />
     <blackbody name="blackbody_color_out" type="color3">
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/bsdf_graph.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/bsdf_graph.mtlx
index 1c8f62a454..d95d636e22 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/bsdf_graph.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/bsdf_graph.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Define a custom bsdf node.
   -->
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/burley_diffuse.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/burley_diffuse.mtlx
index faeb0504b7..97343b32e4 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/burley_diffuse.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/burley_diffuse.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="test_burley_diffuse">
     <burley_diffuse_bsdf name="burley_brdf1" type="BSDF">
       <input name="color" type="color3" value="0.6, 0.6, 0.6" />
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/conductor.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/conductor.mtlx
index 4e34fdc4a1..e2d5540350 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/conductor.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/conductor.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="test_conductor">
     <roughness_anisotropy name="roughness1" type="vector2">
       <input name="roughness" type="float" value="0.2" />
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/dielectric.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/dielectric.mtlx
index 6f6c3f03aa..c62ba5b35a 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/dielectric.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/dielectric.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="dielectric_bsdf">
     <dielectric_bsdf name="dielectric_R" type="BSDF">
       <input name="weight" type="float" value="1.0" />
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/generalized_schlick.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/generalized_schlick.mtlx
index 5f950337f2..05eb071558 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/generalized_schlick.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/generalized_schlick.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="schlick_bsdf">
     <generalized_schlick_bsdf name="schlick_R" type="BSDF">
       <input name="weight" type="float" value="1.0" />
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/layer_bsdf.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/layer_bsdf.mtlx
index e305b03fd8..ac2a7699f4 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/layer_bsdf.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/layer_bsdf.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="layer_bsdf_test1">
     <oren_nayar_diffuse_bsdf name="diffuse_brdf_1" type="BSDF" />
     <sheen_bsdf name="sheen_brdf_1" type="BSDF" />
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/mix_bsdf.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/mix_bsdf.mtlx
index abf840d3e7..84ab911cd0 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/mix_bsdf.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/mix_bsdf.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="mix_bsdf_test1">
     <oren_nayar_diffuse_bsdf name="diffuse_brdf1" type="BSDF">
       <input name="color" type="color3" value="0.96, 0.1, 0.1" />
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/multiply_bsdf.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/multiply_bsdf.mtlx
index 14728d27ac..215cf1cbee 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/multiply_bsdf.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/multiply_bsdf.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="multiply_bsdf_test">
     <oren_nayar_diffuse_bsdf name="diffuse_brdf1" type="BSDF">
       <input name="color" type="color3" value="0.96, 0.1, 0.1" />
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/oren_nayar_diffuse.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/oren_nayar_diffuse.mtlx
index 15f652283c..1262a8661e 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/oren_nayar_diffuse.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/oren_nayar_diffuse.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="oren_nayar_diffuse">
 
     <oren_nayar_diffuse_bsdf name="diffuse1" type="BSDF">
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/thin_film_bsdf.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/thin_film_bsdf.mtlx
index 68bd46b52f..8ebc444c3c 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/thin_film_bsdf.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/thin_film_bsdf.mtlx
@@ -1,25 +1,15 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
-
-  <!--
-  Leaving these unchanged as v1.38 documents to test the automatic upgrade of thin-film setups from 1.38 to 1.39.
-  -->
+<materialx version="1.39">
 
   <nodegraph name="thin_film_test1">
     <dielectric_bsdf name="dielectric_brdf_1" type="BSDF">
       <input name="ior" type="float" value="2.5" />
       <input name="roughness" type="vector2" value="0, 0" />
+      <input name="thinfilm_thickness" type="float" value="550" />
+      <input name="thinfilm_ior" type="float" value="1.5" />
     </dielectric_bsdf>
-    <thin_film_bsdf name="thin_film_brdf_1" type="BSDF">
-      <input name="thickness" type="float" value="550" />
-      <input name="ior" type="float" value="1.5" />
-    </thin_film_bsdf>
-    <layer name="layer_bsdf_1" type="BSDF">
-      <input name="top" type="BSDF" nodename="thin_film_brdf_1" />
-      <input name="base" type="BSDF" nodename="dielectric_brdf_1" />
-    </layer>
     <surface name="surface1" type="surfaceshader">
-      <input name="bsdf" type="BSDF" nodename="layer_bsdf_1" />
+      <input name="bsdf" type="BSDF" nodename="dielectric_brdf_1" />
     </surface>
     <output name="out" type="surfaceshader" nodename="surface1" />
   </nodegraph>
@@ -32,21 +22,15 @@
     <dielectric_bsdf name="dielectric_brdf_1" type="BSDF">
       <input name="ior" type="float" value="2.5" />
       <input name="roughness" type="vector2" value="0, 0" />
+      <input name="thinfilm_thickness" type="float" value="550" />
+      <input name="thinfilm_ior" type="float" value="1.5" />
     </dielectric_bsdf>
     <layer name="layer_bsdf_1" type="BSDF">
       <input name="top" type="BSDF" nodename="dielectric_brdf_1" />
       <input name="base" type="BSDF" nodename="diffuse_bsdf" />
     </layer>
-    <thin_film_bsdf name="thin_film_brdf_1" type="BSDF">
-      <input name="thickness" type="float" value="550" />
-      <input name="ior" type="float" value="1.5" />
-    </thin_film_bsdf>
-    <layer name="layer_bsdf_2" type="BSDF">
-      <input name="top" type="BSDF" nodename="thin_film_brdf_1" />
-      <input name="base" type="BSDF" nodename="layer_bsdf_1" />
-    </layer>
     <surface name="surface1" type="surfaceshader">
-      <input name="bsdf" type="BSDF" nodename="layer_bsdf_2" />
+      <input name="bsdf" type="BSDF" nodename="layer_bsdf_1" />
     </surface>
     <output name="out" type="surfaceshader" nodename="surface1" />
   </nodegraph>
@@ -55,21 +39,15 @@
     <dielectric_bsdf name="dielectric_brdf_1" type="BSDF">
       <input name="ior" type="float" value="2.5" />
       <input name="roughness" type="vector2" value="0, 0" />
+      <input name="thinfilm_thickness" type="float" value="550" />
+      <input name="thinfilm_ior" type="float" value="1.5" />
     </dielectric_bsdf>
-    <thin_film_bsdf name="thin_film_brdf_1" type="BSDF">
-      <input name="thickness" type="float" value="550" />
-      <input name="ior" type="float" value="1.5" />
-    </thin_film_bsdf>
-    <layer name="layer_bsdf_1" type="BSDF">
-      <input name="top" type="BSDF" nodename="thin_film_brdf_1" />
-      <input name="base" type="BSDF" nodename="dielectric_brdf_1" />
-    </layer>
     <oren_nayar_diffuse_bsdf name="diffuse_bsdf" type="BSDF">
       <input name="weight" type="float" value="0.5" />
       <input name="color" type="color3" value="1,1,1" />
     </oren_nayar_diffuse_bsdf>
     <layer name="layer_bsdf_2" type="BSDF">
-      <input name="top" type="BSDF" nodename="layer_bsdf_1" />
+      <input name="top" type="BSDF" nodename="dielectric_brdf_1" />
       <input name="base" type="BSDF" nodename="diffuse_bsdf" />
     </layer>
     <surface name="surface1" type="surfaceshader">
@@ -83,26 +61,22 @@
       <input name="tint" type="color3" value="1.0, 1.0, 1.0" />
       <input name="ior" type="float" value="1.5" />
       <input name="roughness" type="vector2" value="0.3, 0.3" />
+      <input name="thinfilm_thickness" type="float" value="550" />
+      <input name="thinfilm_ior" type="float" value="1.5" />
     </dielectric_bsdf>
     <dielectric_bsdf name="dielectric_brdf_2" type="BSDF">
       <input name="tint" type="color3" value="0.1, 1.0, 0.1" />
       <input name="ior" type="float" value="2.5" />
       <input name="roughness" type="vector2" value="0.0, 0.0" />
+      <input name="thinfilm_thickness" type="float" value="550" />
+      <input name="thinfilm_ior" type="float" value="1.5" />
     </dielectric_bsdf>
     <layer name="layer_bsdf_1" type="BSDF">
       <input name="top" type="BSDF" nodename="dielectric_brdf_2" />
       <input name="base" type="BSDF" nodename="dielectric_brdf_1" />
     </layer>
-    <thin_film_bsdf name="thin_film_brdf_1" type="BSDF">
-      <input name="thickness" type="float" value="550" />
-      <input name="ior" type="float" value="1.5" />
-    </thin_film_bsdf>
-    <layer name="layer_bsdf_2" type="BSDF">
-      <input name="top" type="BSDF" nodename="thin_film_brdf_1" />
-      <input name="base" type="BSDF" nodename="layer_bsdf_1" />
-    </layer>
     <surface name="surface1" type="surfaceshader">
-      <input name="bsdf" type="BSDF" nodename="layer_bsdf_2" />
+      <input name="bsdf" type="BSDF" nodename="layer_bsdf_1" />
     </surface>
     <output name="out" type="surfaceshader" nodename="surface1" />
   </nodegraph>
@@ -112,27 +86,23 @@
       <input name="tint" type="color3" value="1.0, 0.0, 0.0" />
       <input name="ior" type="float" value="1.5" />
       <input name="roughness" type="vector2" value="0.3, 0.3" />
+      <input name="thinfilm_thickness" type="float" value="550" />
+      <input name="thinfilm_ior" type="float" value="1.5" />
     </dielectric_bsdf>
     <dielectric_bsdf name="dielectric_brdf_2" type="BSDF">
       <input name="tint" type="color3" value="0.0, 1.0, 0.0" />
       <input name="ior" type="float" value="2.5" />
       <input name="roughness" type="vector2" value="0.3, 0.3" />
+      <input name="thinfilm_thickness" type="float" value="550" />
+      <input name="thinfilm_ior" type="float" value="1.5" />
     </dielectric_bsdf>
     <mix name="mix_bsdf_1" type="BSDF">
       <input name="fg" type="BSDF" nodename="dielectric_brdf_2" />
       <input name="bg" type="BSDF" nodename="dielectric_brdf_1" />
       <input name="mix" type="float" value="0.5" />
     </mix>
-    <thin_film_bsdf name="thin_film_brdf_1" type="BSDF">
-      <input name="thickness" type="float" value="550" />
-      <input name="ior" type="float" value="1.5" />
-    </thin_film_bsdf>
-    <layer name="layer_bsdf_1" type="BSDF">
-      <input name="top" type="BSDF" nodename="thin_film_brdf_1" />
-      <input name="base" type="BSDF" nodename="mix_bsdf_1" />
-    </layer>
     <surface name="surface1" type="surfaceshader">
-      <input name="bsdf" type="BSDF" nodename="layer_bsdf_1" />
+      <input name="bsdf" type="BSDF" nodename="mix_bsdf_1" />
     </surface>
     <output name="out" type="surfaceshader" nodename="surface1" />
   </nodegraph>
@@ -142,21 +112,15 @@
       <input name="tint" type="color3" value="1.0, 1.0, 1.0" />
       <input name="ior" type="float" value="2.5" />
       <input name="roughness" type="vector2" value="0.0, 0.0" />
+      <input name="thinfilm_thickness" type="float" value="550" />
+      <input name="thinfilm_ior" type="float" value="1.5" />
     </dielectric_bsdf>
     <multiply name="multiply_bsdf_1" type="BSDF">
       <input name="in1" type="BSDF" nodename="dielectric_brdf_1" />
       <input name="in2" type="float" value="0.8" />
     </multiply>
-    <thin_film_bsdf name="thin_film_brdf_1" type="BSDF">
-      <input name="thickness" type="float" value="550" />
-      <input name="ior" type="float" value="1.5" />
-    </thin_film_bsdf>
-    <layer name="layer_bsdf_1" type="BSDF">
-      <input name="top" type="BSDF" nodename="thin_film_brdf_1" />
-      <input name="base" type="BSDF" nodename="multiply_bsdf_1" />
-    </layer>
     <surface name="surface1" type="surfaceshader">
-      <input name="bsdf" type="BSDF" nodename="layer_bsdf_1" />
+      <input name="bsdf" type="BSDF" nodename="multiply_bsdf_1" />
     </surface>
     <output name="out" type="surfaceshader" nodename="surface1" />
   </nodegraph>
@@ -166,17 +130,11 @@
       <input name="ior" type="color3" value="0.18, 0.42, 1.37" />
       <input name="extinction" type="color3" value="3.42, 2.35, 1.77" />
       <input name="roughness" type="vector2" value="0.0, 0.0" />
+      <input name="thinfilm_thickness" type="float" value="550" />
+      <input name="thinfilm_ior" type="float" value="1.5" />
     </conductor_bsdf>
-    <thin_film_bsdf name="thin_film_brdf_1" type="BSDF">
-      <input name="thickness" type="float" value="550" />
-      <input name="ior" type="float" value="1.5" />
-    </thin_film_bsdf>
-    <layer name="layer_bsdf_1" type="BSDF">
-      <input name="top" type="BSDF" nodename="thin_film_brdf_1" />
-      <input name="base" type="BSDF" nodename="conductor_brdf_1" />
-    </layer>
     <surface name="surface1" type="surfaceshader">
-      <input name="bsdf" type="BSDF" nodename="layer_bsdf_1" />
+      <input name="bsdf" type="BSDF" nodename="conductor_brdf_1" />
     </surface>
     <output name="out" type="surfaceshader" nodename="surface1" />
   </nodegraph>
@@ -186,17 +144,11 @@
       <input name="color0" type="color3" value="0.04, 0.04, 0.04" />
       <input name="color90" type="color3" value="1.0, 1.0, 1.0" />
       <input name="roughness" type="vector2" value="0, 0" />
+      <input name="thinfilm_thickness" type="float" value="550" />
+      <input name="thinfilm_ior" type="float" value="1.5" />
     </generalized_schlick_bsdf>
-    <thin_film_bsdf name="thin_film_brdf_1" type="BSDF">
-      <input name="thickness" type="float" value="550" />
-      <input name="ior" type="float" value="1.5" />
-    </thin_film_bsdf>
-    <layer name="layer_bsdf_1" type="BSDF">
-      <input name="top" type="BSDF" nodename="thin_film_brdf_1" />
-      <input name="base" type="BSDF" nodename="generalized_schlick_brdf_1" />
-    </layer>
     <surface name="surface1" type="surfaceshader">
-      <input name="bsdf" type="BSDF" nodename="layer_bsdf_1" />
+      <input name="bsdf" type="BSDF" nodename="generalized_schlick_brdf_1" />
     </surface>
     <output name="out" type="surfaceshader" nodename="surface1" />
   </nodegraph>
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/translucent_bsdf.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/translucent_bsdf.mtlx
index 0609ab6b44..175b285405 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/translucent_bsdf.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/translucent_bsdf.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="translucent_bsdf">
     <translucent_bsdf name="translucent_bsdf" type="BSDF">
       <input name="weight" type="float" value="0.6" />
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/varying_ior.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/varying_ior.mtlx
index 98d29762c9..c501b7a689 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/varying_ior.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/varying_ior.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!-- Define a surface shader node using transmission IOR -->
   <nodedef name="ND_foo_surface" node="foo_surface">
     <input name="ior" type="float" value="1.33" />
@@ -28,8 +28,12 @@
 
   <!-- Use this shader with a varying connections to IOR from the outside -->
   <texcoord name="texcoord1" type="vector2" />
+  <extract name="texcoord1_x" type="float">
+    <input name="in" type="vector2" nodename="texcoord1" />
+    <input name="index" type="integer" value="0" />
+  </extract>
   <foo_surface name="varying_ior_test1" type="surfaceshader">
-    <input name="ior" type="float" nodename="texcoord1" channels="x" />
+    <input name="ior" type="float" nodename="texcoord1_x" />
   </foo_surface>
   <surfacematerial name="varying_ior_test1_mtrl" type="material">
     <input name="surfaceshader" type="surfaceshader" nodename="varying_ior_test1" />
diff --git a/resources/Materials/TestSuite/pbrlib/bsdf/vertical_layering.mtlx b/resources/Materials/TestSuite/pbrlib/bsdf/vertical_layering.mtlx
index 657b9a6462..b78ed0f278 100644
--- a/resources/Materials/TestSuite/pbrlib/bsdf/vertical_layering.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/bsdf/vertical_layering.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <nodegraph name="vertical_layering_ex1">
     <dielectric_bsdf name="dielectric_bsdf" type="BSDF" nodedef="ND_dielectric_bsdf">
diff --git a/resources/Materials/TestSuite/pbrlib/displacement/displaced_material.mtlx b/resources/Materials/TestSuite/pbrlib/displacement/displaced_material.mtlx
index d8132add91..2265ed2f2e 100644
--- a/resources/Materials/TestSuite/pbrlib/displacement/displaced_material.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/displacement/displaced_material.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <standard_surface name="surf" type="surfaceshader">
     <input name="base_color" type="color3" value="0.2, 0.2, 1.0" />
     <input name="specular_roughness" type="float" value="0.5" />
diff --git a/resources/Materials/TestSuite/pbrlib/displacement/displacement.mtlx b/resources/Materials/TestSuite/pbrlib/displacement/displacement.mtlx
index d0ef073583..ad6ae8d6bf 100644
--- a/resources/Materials/TestSuite/pbrlib/displacement/displacement.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/displacement/displacement.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="fractal3d_float" type="displacementshader">
     <position name="position1" type="vector3">
       <input name="space" type="string" value="object" />
diff --git a/resources/Materials/TestSuite/pbrlib/edf/add_edf.mtlx b/resources/Materials/TestSuite/pbrlib/edf/add_edf.mtlx
index 198f438405..f12be57531 100644
--- a/resources/Materials/TestSuite/pbrlib/edf/add_edf.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/edf/add_edf.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="add_edf_test">
     <uniform_edf name="edf1" type="EDF">
       <input name="color" type="color3" value="1.0, 0.0, 0.0" />
diff --git a/resources/Materials/TestSuite/pbrlib/edf/edf_graph.mtlx b/resources/Materials/TestSuite/pbrlib/edf/edf_graph.mtlx
index d8295a1ca9..5b33be4ff7 100644
--- a/resources/Materials/TestSuite/pbrlib/edf/edf_graph.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/edf/edf_graph.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Define a custom edf node.
   -->
diff --git a/resources/Materials/TestSuite/pbrlib/edf/generalized_schlick_edf.mtlx b/resources/Materials/TestSuite/pbrlib/edf/generalized_schlick_edf.mtlx
index a51be3274e..69ec36f076 100644
--- a/resources/Materials/TestSuite/pbrlib/edf/generalized_schlick_edf.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/edf/generalized_schlick_edf.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="generalized_schlick_edf_test">
     <uniform_edf name="uniform_edf_1" type="EDF">
       <input name="color" type="color3" value="1.0, 1.0, 1.0" />
diff --git a/resources/Materials/TestSuite/pbrlib/edf/mix_edf.mtlx b/resources/Materials/TestSuite/pbrlib/edf/mix_edf.mtlx
index 890285fcda..05f2a5ec72 100644
--- a/resources/Materials/TestSuite/pbrlib/edf/mix_edf.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/edf/mix_edf.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="mix_edf_test">
     <uniform_edf name="edf1" type="EDF">
       <input name="color" type="color3" value="1.0, 0.0, 0.0" />
diff --git a/resources/Materials/TestSuite/pbrlib/edf/multiply_edf.mtlx b/resources/Materials/TestSuite/pbrlib/edf/multiply_edf.mtlx
index 347921b242..7bed14fc39 100644
--- a/resources/Materials/TestSuite/pbrlib/edf/multiply_edf.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/edf/multiply_edf.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="multiply_edf_test">
     <uniform_edf name="edf1" type="EDF">
       <input name="color" type="color3" value="1.0, 0.0, 0.0" />
diff --git a/resources/Materials/TestSuite/pbrlib/multioutput/multioutput.mtlx b/resources/Materials/TestSuite/pbrlib/multioutput/multioutput.mtlx
index 7f92e0d47e..a645158d31 100644
--- a/resources/Materials/TestSuite/pbrlib/multioutput/multioutput.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/multioutput/multioutput.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!-- Test multioutput node artistic_ior connected directly to output -->
   <nodegraph name="multioutput_test2">
     <artistic_ior name="artistic_ior1" type="multioutput">
@@ -35,17 +35,16 @@
     <output name="colour" type="color3" />
     <output name="alpha" type="float" />
   </nodedef>
-  <nodegraph name="IM_color4split" nodedef="ND_color4split">
-    <swizzle name="swizz_color3" type="color3">
+  <nodegraph name="NG_color4split" nodedef="ND_color4split">
+    <convert name="in_colour" type="color3">
       <input name="in" type="color4" interfacename="in" />
-      <input name="channels" type="string" value="rgb" />
-    </swizzle>
-    <swizzle name="swizz_float" type="float">
+    </convert>
+    <extract name="in_alpha" type="float">
       <input name="in" type="color4" interfacename="in" />
-      <input name="channels" type="string" value="a" />
-    </swizzle>
-    <output name="colour" type="color3" nodename="swizz_color3" />
-    <output name="alpha" type="float" nodename="swizz_float" />
+      <input name="index" type="integer" value="3" />
+    </extract>
+    <output name="colour" type="color3" nodename="in_colour" />
+    <output name="alpha" type="float" nodename="in_alpha" />
   </nodegraph>
   <nodegraph name="multioutput_test4">
     <color4split name="color4split1" type="multioutput">
diff --git a/resources/Materials/TestSuite/pbrlib/multioutput/multishaderoutput.mtlx b/resources/Materials/TestSuite/pbrlib/multioutput/multishaderoutput.mtlx
index f6dacf6ed5..2a620c308a 100644
--- a/resources/Materials/TestSuite/pbrlib/multioutput/multishaderoutput.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/multioutput/multishaderoutput.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" xmlns:xi="http://www.w3.org/2001/XInclude">
+<materialx version="1.39" xmlns:xi="http://www.w3.org/2001/XInclude">
   <nodegraph name="NG_multi" nodedef="ND_multi">
     <burley_diffuse_bsdf name="burley_bsdf" type="BSDF">
       <input name="color" type="color3" interfacename="diffuse_color" />
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_add.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_add.mtlx
index 4dd9c18323..c1de5cf2da 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_add.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_add.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
 
   <!-- LamaConductor -->
   <LamaConductor name="LamaConductor" type="BSDF">
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_conductor.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_conductor.mtlx
index 8fd275c1de..ee0852899f 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_conductor.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_conductor.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
 
   <!-- LamaConductor -->
   <LamaConductor name="LamaConductor" type="BSDF">
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_dielectric.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_dielectric.mtlx
index df0cf64032..c8d96de210 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_dielectric.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_dielectric.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
 
   <!-- LamaDielectric -->
   <LamaDielectric name="LamaDielectric" type="BSDF">
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_diffuse.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_diffuse.mtlx
index efdf361d79..05676c948a 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_diffuse.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_diffuse.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
 
   <!-- LamaDiffuse -->
   <LamaDiffuse name="LamaDiffuse" type="BSDF">
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_emission.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_emission.mtlx
index ecd281562b..cae5722d1f 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_emission.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_emission.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
 
   <!-- LamaEmission -->
   <LamaEmission name="LamaEmission" type="EDF">
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_layer.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_layer.mtlx
index 7925d24c6d..c50fcf8393 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_layer.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_layer.mtlx
@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
 
   <!-- LamaLayer with BSDFs -->
-  
+
   <!-- LamaConductor -->
   <LamaConductor name="LamaConductor" type="BSDF">
     <input name="tint" type="color3" value="1, 1, 1" />
@@ -33,18 +33,18 @@
   </LamaDielectric>
 
   <LamaLayer name="LamaLayerBSDF" type="BSDF">
-      <input name="materialTop" type="BSDF" nodename="LamaDielectric" />
-      <input name="materialBase" type="BSDF" nodename="LamaConductor" />
-      <input name="topMix" type="float" value="1.0" />
-      <input name="topThickness" type="float" value="0.0" />
+    <input name="materialTop" type="BSDF" nodename="LamaDielectric" />
+    <input name="materialBase" type="BSDF" nodename="LamaConductor" />
+    <input name="topMix" type="float" value="1.0" />
+    <input name="topThickness" type="float" value="0.0" />
   </LamaLayer>
 
   <surface name="LamaLayerBSDFSurface" type="surfaceshader">
-      <input name="bsdf" type="BSDF" nodename="LamaLayerBSDF" />
+    <input name="bsdf" type="BSDF" nodename="LamaLayerBSDF" />
   </surface>
 
   <surfacematerial name="LamaLayerBSDFTest" type="material">
-      <input name="surfaceshader" type="surfaceshader" nodename="LamaLayerBSDFSurface" />
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaLayerBSDFSurface" />
   </surfacematerial>
-    
+
 </materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_mix.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_mix.mtlx
index 1b15af3a5c..038d662e22 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_mix.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_mix.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
 
   <!-- LamaConductor -->
   <LamaConductor name="LamaConductor" type="BSDF">
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sheen.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sheen.mtlx
index eea254e6a0..2107419a0a 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sheen.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sheen.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
 
   <!-- LamaSheen -->
   <LamaSheen name="LamaSheen" type="BSDF">
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sss.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sss.mtlx
index 5bf446d7d7..f7065de192 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sss.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_sss.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
 
   <!-- LamaSSS -->
   <LamaSSS name="LamaSSS" type="BSDF">
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_translucent.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_translucent.mtlx
index d07d6a9f93..a5d9b80bc3 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_translucent.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_translucent.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="acescg">
+<materialx version="1.39" colorspace="acescg">
 
   <!-- LamaTranslucent -->
   <LamaTranslucent name="LamaTranslucent" type="BSDF">
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/mapped_surfaceshader.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/mapped_surfaceshader.mtlx
index b11c458652..9df7199637 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/mapped_surfaceshader.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/mapped_surfaceshader.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!-- Basic color mapped test -->
   <nodegraph name="RedRamp">
     <ramp4 name="ramp4" type="color3">
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/network_surfaceshader.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/network_surfaceshader.mtlx
index fb5202b37c..0b27eafe9b 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/network_surfaceshader.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/network_surfaceshader.mtlx
@@ -1,9 +1,9 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodedef name="ND_network_surface" node="network_surface">
     <input name="base_color_filename" type="filename" value="" />
     <output name="out" type="surfaceshader" />
-  </nodedef>  
+  </nodedef>
   <nodegraph name="NG_network_surface" nodedef="ND_network_surface">
     <tiledimage name="base_color_image" type="color3">
       <input name="file" type="filename" interfacename="base_color_filename" />
@@ -15,7 +15,7 @@
   </nodegraph>
   <network_surface name="N_surfaceshader" type="surfaceshader">
     <input name="base_color_filename" type="filename" value="resources/Images/grid.png" colorspace="srgb_texture" />
-  </network_surface>  
+  </network_surface>
   <surfacematerial name="N_surfacematerial" type="material">
     <input name="surfaceshader" type="surfaceshader" nodename="N_surfaceshader" />
   </surfacematerial>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/nodegraph_surfaceshader.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/nodegraph_surfaceshader.mtlx
index 31abc3a36f..1270195787 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/nodegraph_surfaceshader.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/nodegraph_surfaceshader.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="lighting1">
     <surface name="surface1" type="surfaceshader">
       <input name="bsdf" type="BSDF" nodename="diffusebsdf1" />
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/normalmapped_surfaceshader.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/normalmapped_surfaceshader.mtlx
index 460f8a8998..e3c1eee089 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/normalmapped_surfaceshader.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/normalmapped_surfaceshader.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <standard_surface name="NormalMappedShader" type="surfaceshader">
     <input name="base" type="float" value="0.6" />
     <input name="metalness" type="float" value="1.0" />
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/shader_ops.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/shader_ops.mtlx
index 7af9393e04..6f3e1ecb0c 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/shader_ops.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/shader_ops.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!-- Define a node that implements a checker board pattern -->
   <!-- Using a graph for the implementation.                 -->
   <nodedef name="ND_checker_float" node="checker">
@@ -14,19 +14,19 @@
       <input name="in1" type="vector2" nodename="texcoord1" />
       <input name="in2" type="vector2" interfacename="scale" />
     </multiply>
-    <swizzle name="swizz_x" type="float">
+    <extract name="mult1_x" type="float">
       <input name="in" type="vector2" nodename="mult1" />
-      <input name="channels" type="string" value="x" />
-    </swizzle>
-    <swizzle name="swizz_y" type="float">
+      <input name="index" type="integer" value="0" />
+    </extract>
+    <extract name="mult1_y" type="float">
       <input name="in" type="vector2" nodename="mult1" />
-      <input name="channels" type="string" value="y" />
-    </swizzle>
+      <input name="index" type="integer" value="1" />
+    </extract>
     <floor name="floor1" type="float">
-      <input name="in" type="float" nodename="swizz_x" />
+      <input name="in" type="float" nodename="mult1_x" />
     </floor>
     <floor name="floor2" type="float">
-      <input name="in" type="float" nodename="swizz_y" />
+      <input name="in" type="float" nodename="mult1_y" />
     </floor>
     <add name="add1" type="float">
       <input name="in1" type="float" nodename="floor1" />
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/sheen.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/sheen.mtlx
index 8c9ba0e732..ba0695863e 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/sheen.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/sheen.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodedef name="ND_sheen_surface" node="sheen_surface">
     <input name="diffuse" type="float" value="1" />
     <input name="diffuse_color" type="color3" value="1.0, 1.0, 1.0" />
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/subsurface.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/subsurface.mtlx
index 56fdb903ec..b505feaef4 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/subsurface.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/subsurface.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <standard_surface name="SR_subsurface" type="surfaceshader">
     <input name="specular" type="float" value="0.0" />
     <input name="thin_walled" type="boolean" value="true" />
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/surface_ops.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/surface_ops.mtlx
index 87e27cf14d..8974d4f8d4 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/surface_ops.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/surface_ops.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="nodegraph1">
     <roughness_dual name="roughness_dual1" type="vector2">
       <input name="roughness" type="vector2" value="0.2000, 0.4000" />
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/surfacematerial_with_graph.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/surfacematerial_with_graph.mtlx
index 1ea487a503..ad15863fbd 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/surfacematerial_with_graph.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/surfacematerial_with_graph.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="NG_Blue">
     <standard_surface name="standard_surface" type="surfaceshader">
       <input name="base_color" type="color3" value="0.3, 0.3, 1" />
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_normal_map.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_normal_map.mtlx
index 36c2f82fca..1fccec6cbe 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_normal_map.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_normal_map.mtlx
@@ -1,11 +1,11 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <nodegraph name="NG_usd_normal_map">
     <tiledimage name="N_tiledimage" type="vector3" nodedef="ND_tiledimage_vector3">
       <input name="file" type="filename" value="resources/Images/mesh_wire_norm.png" />
       <input name="uvtiling" type="vector2" value="8.0, 8.0" />
     </tiledimage>
-    <normalmap name="N_normalmap" type="vector3" nodedef="ND_normalmap">
+    <normalmap name="N_normalmap" type="vector3" nodedef="ND_normalmap_float">
       <input name="in" type="vector3" nodename="N_tiledimage" />
       <input name="space" type="string" value="object" />
     </normalmap>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_uv_texture.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_uv_texture.mtlx
index 5ec661bffa..e8f63001dc 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_uv_texture.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_uv_texture.mtlx
@@ -1,21 +1,20 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!-- UsdUVTexture: version 2.2 test -->
   <UsdUVTexture name="UsdUVTexture22" type="multioutput" version="2.2">
     <input name="file" type="filename" value="resources/Images/brass_color.jpg" colorspace="srgb_texture" />
   </UsdUVTexture>
-  <swizzle name="extractColor" type="color3">
+  <convert name="extractColor" type="color3">
     <input name="in" type="color4" nodename="UsdUVTexture22" output="rgba" />
-    <input name="channels" type="string" value="rgb" />
-  </swizzle>
+  </convert>
   <UsdUVTexture name="UsdUVTexture22_rough" type="multioutput" version="2.2">
     <input name="file" type="filename" value="resources/Images/brass_roughness.jpg" />
   </UsdUVTexture>
-  <swizzle name="extractRoughness" type="float">
+  <extract name="extractRoughness" type="float">
     <input name="in" type="color4" nodename="UsdUVTexture22_rough" output="rgba" />
-    <input name="channels" type="string" value="r" />
-  </swizzle>
+    <input name="index" type="integer" value="0" />
+  </extract>
 
   <UsdPreviewSurface name="UsdPreviewSurface22" type="surfaceshader" nodedef="ND_UsdPreviewSurface_surfaceshader" version="2.3">
     <input name="diffuseColor" type="color3" nodename="extractColor" />
diff --git a/resources/Materials/TestSuite/stdlib/adjustment/adjustment.mtlx b/resources/Materials/TestSuite/stdlib/adjustment/adjustment.mtlx
index e5bf3ac186..83c4b95e9b 100644
--- a/resources/Materials/TestSuite/stdlib/adjustment/adjustment.mtlx
+++ b/resources/Materials/TestSuite/stdlib/adjustment/adjustment.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
   Basic adjustment function tests each test is in a separate graph for each variation in input type.
   - remap
diff --git a/resources/Materials/TestSuite/stdlib/adjustment/hsvtorgb.mtlx b/resources/Materials/TestSuite/stdlib/adjustment/hsvtorgb.mtlx
index fa6412c6a1..0bb19da6bf 100644
--- a/resources/Materials/TestSuite/stdlib/adjustment/hsvtorgb.mtlx
+++ b/resources/Materials/TestSuite/stdlib/adjustment/hsvtorgb.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
   Basic adjustment function tests each test is in a separate graph for each variation in input type.
   - rgbtohsv
diff --git a/resources/Materials/TestSuite/stdlib/adjustment/smoothstep.mtlx b/resources/Materials/TestSuite/stdlib/adjustment/smoothstep.mtlx
index e1fb76113b..afc64f1116 100644
--- a/resources/Materials/TestSuite/stdlib/adjustment/smoothstep.mtlx
+++ b/resources/Materials/TestSuite/stdlib/adjustment/smoothstep.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
     Basic adjustment function tests each test is in a separate graph for each variation in input type.
     - smoothstep
diff --git a/resources/Materials/TestSuite/stdlib/application/syntax.mtlx b/resources/Materials/TestSuite/stdlib/application/syntax.mtlx
deleted file mode 100644
index 4ec7d4b4fd..0000000000
--- a/resources/Materials/TestSuite/stdlib/application/syntax.mtlx
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0"?>
-<materialx version="1.38">
-  <nodegraph name="syntaxGraph">
-    <constant name="gl_consttant" type="float">
-      <input name="value" type="float" value="0.0" />
-    </constant>
-    <convert name="gl_consttant1" type="color3">
-      <input name="in" type="float" nodename="gl_consttant" />
-    </convert>
-    <output name="out_gl_constant" type="color3" nodename="gl_consttant1" />
-    <constant name="webgl_constant" type="float">
-      <input name="value" type="float" value="0.0" />
-    </constant>
-    <convert name="webgl_constant1" type="color3">
-      <input name="in" type="float" nodename="webgl_constant" />
-    </convert>
-    <output name="out_webgl_constant" type="color3" nodename="webgl_constant1" />
-    <constant name="_webgl_constant" type="float">
-      <input name="value" type="float" value="0.0" />
-    </constant>
-    <convert name="_webgl_constant1" type="color3">
-      <input name="in" type="float" nodename="_webgl_constant" />
-    </convert>
-    <output name="out__webgl_constant" type="color3" nodename="_webgl_constant1" />
-    <constant name="__doubleUnderScore" type="float">
-      <input name="value" type="float" value="0.0" />
-    </constant>
-    <convert name="__doubleUnderScore1" type="color3">
-      <input name="in" type="float" nodename="__doubleUnderScore" />
-    </convert>
-    <output name="out__doubleUnderScore" type="color3" nodename="__doubleUnderScore1" />
-  </nodegraph>
-</materialx>
diff --git a/resources/Materials/TestSuite/stdlib/application/timeFrame.mtlx b/resources/Materials/TestSuite/stdlib/application/time_frame.mtlx
similarity index 97%
rename from resources/Materials/TestSuite/stdlib/application/timeFrame.mtlx
rename to resources/Materials/TestSuite/stdlib/application/time_frame.mtlx
index a7c29a0ff4..ffacc6c616 100644
--- a/resources/Materials/TestSuite/stdlib/application/timeFrame.mtlx
+++ b/resources/Materials/TestSuite/stdlib/application/time_frame.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="timeGraph">
     <time name="time1" type="float">
       <input name="fps" type="float" value="36.0000" />
diff --git a/resources/Materials/TestSuite/stdlib/application/unique_identifiers.mtlx b/resources/Materials/TestSuite/stdlib/application/unique_identifiers.mtlx
deleted file mode 100644
index 6ae53de40a..0000000000
--- a/resources/Materials/TestSuite/stdlib/application/unique_identifiers.mtlx
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0"?>
-<materialx version="1.38">
-  <nodedef name="ND_blah2_float_float" node="blah2" version="1.0" isdefaultversion="true">
-    <input name="out1" type="float" value="1" />
-    <input name="out3" type="vector2" value="0, 0" />
-    <output name="out" type="float" value="0" />
-    <output name="out2" type="float" value="0" />
-  </nodedef>
-  <nodegraph name="NG_blah2_float_float" nodedef="ND_blah2_float_float">
-    <constant name="constant" type="float">
-      <input name="value" type="float" value="10" uniform="true" uivisible="true" />
-    </constant>
-    <multiply name="multiply" type="float">
-      <input name="in1" type="float" nodename="constant" uivisible="true" />
-      <input name="in2" type="float" nodename="swizzle" uivisible="true" />
-    </multiply>
-    <multiply name="multiply1" type="float">
-      <input name="in1" type="float" nodename="constant" uivisible="true" />
-      <input name="in2" type="float" interfacename="out1" uivisible="true" />
-    </multiply>
-    <swizzle name="swizzle" type="float">
-      <input name="in" type="vector2" interfacename="out3" uivisible="true" />
-    </swizzle>
-    <output name="out" type="float" nodename="multiply" />
-    <output name="out2" type="float" nodename="multiply1" />
-  </nodegraph>
-  <blah2 name="blah2" type="multioutput">
-    <output name="out" type="float" value="0" />
-  </blah2>
-  <output name="blah2_output" type="float" nodename="blah2" output="out" />
-</materialx>
diff --git a/resources/Materials/TestSuite/stdlib/channel/channel.mtlx b/resources/Materials/TestSuite/stdlib/channel/channel.mtlx
index c40483eab7..59dbd160eb 100644
--- a/resources/Materials/TestSuite/stdlib/channel/channel.mtlx
+++ b/resources/Materials/TestSuite/stdlib/channel/channel.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="combine_vector2">
     <combine2 name="combine1" type="vector2">
       <input name="in1" type="float" value="0.5000" />
diff --git a/resources/Materials/TestSuite/stdlib/channel/channels_attribute.mtlx b/resources/Materials/TestSuite/stdlib/channel/channels_attribute.mtlx
deleted file mode 100644
index 74138a6eb2..0000000000
--- a/resources/Materials/TestSuite/stdlib/channel/channels_attribute.mtlx
+++ /dev/null
@@ -1,133 +0,0 @@
-<?xml version="1.0"?>
-<materialx version="1.38">
-  <!--
-
-    Output test
-
-    -->
-  <nodegraph name="image4_to_color3_bgr_out">
-    <image name="image4" type="color4">
-      <input name="file" type="filename" value="resources/Lights/san_giuseppe_bridge.hdr" />
-    </image>
-    <output name="out" type="color3" nodename="image4" channels="bbb" />
-  </nodegraph>
-  <nodegraph name="image4_to_float_g_out">
-    <image name="image4" type="color4">
-      <input name="file" type="filename" value="resources/Lights/san_giuseppe_bridge.hdr" />
-    </image>
-    <output name="out" type="float" nodename="image4" channels="g" />
-  </nodegraph>
-  <nodegraph name="float_to_color4_rrrr_out">
-    <constant name="constant1" type="float">
-      <input name="value" type="float" value="1.0" />
-    </constant>
-    <output name="out" type="color4" nodename="constant1" channels="rrrr" />
-  </nodegraph>
-  <nodegraph name="color3_to_color4_bgr1_out">
-    <constant name="constant1" type="color3">
-      <input name="value" type="color3" value="0.5, 0.7, 1.0" />
-    </constant>
-    <output name="out" type="color4" nodename="constant1" channels="bgr1" />
-  </nodegraph>
-  <nodegraph name="color4_to_color3_bgr_out">
-    <constant name="constant1" type="color4">
-      <input name="value" type="color4" value="0.5, 0.7, 0.9, 1.0" />
-    </constant>
-    <output name="out" type="color3" nodename="constant1" channels="bgr" />
-  </nodegraph>
-  <nodegraph name="color4_to_float_g_out">
-    <constant name="constant1" type="color4">
-      <input name="value" type="color4" value="0.0, 0.5, 0.75, 1.0" />
-    </constant>
-    <output name="out" type="float" nodename="constant1" channels="g" />
-  </nodegraph>
-  <!--
-
-   Input tests
-
-    -->
-  <nodegraph name="image4_to_color3_bga_in">
-    <image name="image4" type="color4">
-      <input name="file" type="filename" value="resources/Lights/san_giuseppe_bridge.hdr" />
-      <input name="uaddressmode" type="string" value="constant" />
-      <input name="vaddressmode" type="string" value="clamp" />
-    </image>
-    <add name="add1" type="color3">
-      <input name="in1" type="color3" nodename="image4" channels="bgr" />
-      <input name="in2" type="color3" value="0.5, 0.5, 0.5" />
-    </add>
-    <output name="out" type="color3" nodename="add1" />
-  </nodegraph>
-  <nodegraph name="image4_to_float_g_in">
-    <image name="image4" type="color4">
-      <input name="file" type="filename" value="resources/Lights/san_giuseppe_bridge.hdr" />
-      <input name="uaddressmode" type="string" value="constant" />
-      <input name="vaddressmode" type="string" value="clamp" />
-    </image>
-    <add name="add1" type="float">
-      <input name="in1" type="float" nodename="image4" channels="g" />
-      <input name="in2" type="float" value="0.5" />
-    </add>
-    <output name="out" type="float" nodename="add1" />
-  </nodegraph>
-  <nodegraph name="float_to_color4_rrrr_in">
-    <constant name="constant1" type="float">
-      <input name="value" type="float" value="1.0" />
-    </constant>
-    <add name="add1" type="color4">
-      <input name="in1" type="color4" nodename="constant1" channels="rrrr" />
-      <input name="in2" type="color4" value="0.0, 0.0, 0.0, 0.0" />
-    </add>
-    <output name="out" type="color4" nodename="add1" />
-  </nodegraph>
-  <nodegraph name="color3_to_color4_bgr1_in">
-    <constant name="constant1" type="color3">
-      <input name="value" type="color3" value="0.5, 0.7, 1.0" />
-    </constant>
-    <add name="add1" type="color4">
-      <input name="in1" type="color4" nodename="constant1" channels="bgr1" />
-      <input name="in2" type="color4" value="0.1, 0.1, 0.1, 0.0" />
-    </add>
-    <output name="out" type="color4" nodename="add1" />
-  </nodegraph>
-  <nodegraph name="color4_to_color3_rga_in">
-    <constant name="constant1" type="color4">
-      <input name="value" type="color4" value="0.0, 0.5, 0.75, 1.0" />
-    </constant>
-    <add name="add1" type="color3">
-      <input name="in1" type="color3" nodename="constant1" channels="rga" />
-      <input name="in2" type="color3" value="0.5, 0.5, 0.5" />
-    </add>
-    <output name="out" type="color3" nodename="add1" />
-  </nodegraph>
-  <nodegraph name="color4_to_float_g_in">
-    <constant name="constant1" type="color4">
-      <input name="value" type="color4" value="0.0, 0.5, 0.75, 1.0" />
-    </constant>
-    <add name="add1" type="float">
-      <input name="in1" type="float" nodename="constant1" channels="g" />
-      <input name="in2" type="float" value="0.0" />
-    </add>
-    <output name="out" type="float" nodename="add1" />
-  </nodegraph>
-  <nodegraph name="value_connection_priority_in">
-    <constant name="constant1" type="color4">
-      <input name="value" type="color4" value="1.0, 1.0, 1.0, 1.0" />
-    </constant>
-    <add name="add1" type="float">
-      <input name="in1" type="float" value="0.0" nodename="constant1" channels="g" />
-      <input name="in2" type="float" value="0.0" />
-    </add>
-    <output name="out" type="float" nodename="add1" />
-  </nodegraph>
-  <nodegraph name="float_to_float_noop_in">
-    <constant name="constant1" type="float">
-      <input name="value" type="float" value="1.0" />
-    </constant>
-    <add name="add1" type="float">
-      <input name="in1" type="float" nodename="constant1" channels="r" />
-      <input name="in2" type="float" value="0.0" />
-    </add>
-    <output name="out" type="float" nodename="add1" />
-  </nodegraph>
-</materialx>
diff --git a/resources/Materials/TestSuite/stdlib/channel/swizzle.mtlx b/resources/Materials/TestSuite/stdlib/channel/swizzle.mtlx
deleted file mode 100644
index 873fb73ea8..0000000000
--- a/resources/Materials/TestSuite/stdlib/channel/swizzle.mtlx
+++ /dev/null
@@ -1,248 +0,0 @@
-<?xml version="1.0"?>
-<materialx version="1.38">
-  <nodegraph name="swizzle_float_color3">
-    <swizzle name="swizzle1" type="color3">
-      <input name="in" type="float" value="0.5000" />
-      <input name="channels" type="string" value="rrr" />
-    </swizzle>
-    <output name="out" type="color3" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_float_color4">
-    <swizzle name="swizzle1" type="color4">
-      <input name="in" type="float" value="0.5000" />
-      <input name="channels" type="string" value="rrrr" />
-    </swizzle>
-    <output name="out" type="color4" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_float_vector2">
-    <swizzle name="swizzle1" type="vector2">
-      <input name="in" type="float" value="0.5000" />
-      <input name="channels" type="string" value="rr" />
-    </swizzle>
-    <output name="out" type="vector2" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_float_vector3">
-    <swizzle name="swizzle1" type="vector3">
-      <input name="in" type="float" value="0.5000" />
-      <input name="channels" type="string" value="rrr" />
-    </swizzle>
-    <output name="out" type="vector3" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_float_vector4">
-    <swizzle name="swizzle1" type="vector4">
-      <input name="in" type="float" value="0.5000" />
-      <input name="channels" type="string" value="rrrr" />
-    </swizzle>
-    <output name="out" type="vector4" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_color3_float">
-    <swizzle name="swizzle1" type="float">
-      <input name="in" type="color3" value="0.0, 0.5000, 1.0000" />
-      <input name="channels" type="string" value="g" />
-    </swizzle>
-    <output name="out" type="float" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_color3_color3">
-    <swizzle name="swizzle1" type="color3">
-      <input name="in" type="color3" value="0.0, 0.5000, 1.0000" />
-      <input name="channels" type="string" value="bgr" />
-    </swizzle>
-    <output name="out" type="color3" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_color3_color4">
-    <swizzle name="swizzle1" type="color4">
-      <input name="in" type="color3" value="0.0, 0.5000, 1.0000" />
-      <input name="channels" type="string" value="bgrg" />
-    </swizzle>
-    <output name="out" type="color4" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_color3_vector2">
-    <swizzle name="swizzle1" type="vector2">
-      <input name="in" type="color3" value="0.0000, 0.5000, 1.0000" />
-      <input name="channels" type="string" value="br" />
-    </swizzle>
-    <output name="out" type="vector2" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_color3_vector3">
-    <swizzle name="swizzle1" type="vector3">
-      <input name="in" type="color3" value="0.0, 0.5000, 1.0000" />
-      <input name="channels" type="string" value="bgr" />
-    </swizzle>
-    <output name="out" type="vector3" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_color3_vector4">
-    <swizzle name="swizzle1" type="vector4">
-      <input name="in" type="color3" value="0.0, 0.5000, 1.0000" />
-      <input name="channels" type="string" value="bgrg" />
-    </swizzle>
-    <output name="out" type="vector4" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_color4_float">
-    <swizzle name="swizzle1" type="float">
-      <input name="in" type="color4" value="0.0, 0.2500, 0.7500, 1.0" />
-      <input name="channels" type="string" value="a" />
-    </swizzle>
-    <output name="out" type="float" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_color4_color3">
-    <swizzle name="swizzle1" type="color3">
-      <input name="in" type="color4" value="0.0, 0.2500, 0.7500, 1.0" />
-      <input name="channels" type="string" value="abg" />
-    </swizzle>
-    <output name="out" type="color3" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_color4_color4">
-    <swizzle name="swizzle1" type="color4">
-      <input name="in" type="color4" value="0.0, 0.2500, 0.7500, 1.0" />
-      <input name="channels" type="string" value="agrb" />
-    </swizzle>
-    <output name="out" type="color4" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_color4_vector2">
-    <swizzle name="swizzle1" type="vector2">
-      <input name="in" type="color4" value="0.0, 0.2500, 0.7500, 1.0" />
-      <input name="channels" type="string" value="ab" />
-    </swizzle>
-    <output name="out" type="vector2" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_color4_vector3">
-    <swizzle name="swizzle1" type="vector3">
-      <input name="in" type="color4" value="0.0, 0.2500, 0.7500, 1.0" />
-      <input name="channels" type="string" value="abg" />
-    </swizzle>
-    <output name="out" type="vector3" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_color4_vector4">
-    <swizzle name="swizzle1" type="vector4">
-      <input name="in" type="color4" value="0.0, 0.2500, 0.7500, 1.0" />
-      <input name="channels" type="string" value="agrb" />
-    </swizzle>
-    <output name="out" type="vector4" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector2_float">
-    <swizzle name="swizzle1" type="float">
-      <input name="in" type="vector2" value="0.0, 1.0000" />
-      <input name="channels" type="string" value="y" />
-    </swizzle>
-    <output name="out" type="float" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector2_color3">
-    <swizzle name="swizzle1" type="color3">
-      <input name="in" type="vector2" value="0.0, 1.0000" />
-      <input name="channels" type="string" value="yxy" />
-    </swizzle>
-    <output name="out" type="color3" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector2_color4">
-    <swizzle name="swizzle1" type="color4">
-      <input name="in" type="vector2" value="0.0, 1.0000" />
-      <input name="channels" type="string" value="xyxy" />
-    </swizzle>
-    <output name="out" type="color4" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector2_vector2">
-    <swizzle name="swizzle1" type="vector2">
-      <input name="in" type="vector2" value="0.0, 1.0000" />
-      <input name="channels" type="string" value="yx" />
-    </swizzle>
-    <output name="out" type="vector2" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector2_vector3">
-    <swizzle name="swizzle1" type="vector3">
-      <input name="in" type="vector2" value="0.0, 1.0000" />
-      <input name="channels" type="string" value="yxy" />
-    </swizzle>
-    <output name="out" type="vector3" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector2_vector4">
-    <swizzle name="swizzle1" type="vector4">
-      <input name="in" type="vector2" value="0.0, 1.0000" />
-      <input name="channels" type="string" value="xyxy" />
-    </swizzle>
-    <output name="out" type="vector4" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector3_float">
-    <swizzle name="swizzle1" type="float">
-      <input name="in" type="vector3" value="0.0, 0.5000, 1.0000" />
-      <input name="channels" type="string" value="y" />
-    </swizzle>
-    <output name="out" type="float" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector3_color3">
-    <swizzle name="swizzle1" type="color3">
-      <input name="in" type="vector3" value="0.0, 0.5000, 1.0000" />
-      <input name="channels" type="string" value="zyx" />
-    </swizzle>
-    <output name="out" type="color3" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector3_color4">
-    <swizzle name="swizzle1" type="color4">
-      <input name="in" type="vector3" value="0.0, 0.5000, 1.0000" />
-      <input name="channels" type="string" value="zyxy" />
-    </swizzle>
-    <output name="out" type="color4" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector3_vector2">
-    <swizzle name="swizzle1" type="vector2">
-      <input name="in" type="vector3" value="0.0, 0.5000, 1.0000" />
-      <input name="channels" type="string" value="zx" />
-    </swizzle>
-    <output name="out" type="vector2" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector3_vector3">
-    <swizzle name="swizzle1" type="vector3">
-      <input name="in" type="vector3" value="0.0, 0.5000, 1.0000" />
-      <input name="channels" type="string" value="zyx" />
-    </swizzle>
-    <output name="out" type="vector3" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector3_vector4">
-    <swizzle name="swizzle1" type="vector4">
-      <input name="in" type="vector3" value="0.0, 0.5000, 1.0000" />
-      <input name="channels" type="string" value="zyxy" />
-    </swizzle>
-    <output name="out" type="vector4" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector4_float">
-    <swizzle name="swizzle1" type="float">
-      <input name="in" type="vector4" value="0.0, 0.2500, 0.7500, 1.0" />
-      <input name="channels" type="string" value="w" />
-    </swizzle>
-    <output name="out" type="float" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector4_color3">
-    <swizzle name="swizzle1" type="color3">
-      <input name="in" type="vector4" value="0.0, 0.2500, 0.7500, 1.0" />
-      <input name="channels" type="string" value="wzy" />
-    </swizzle>
-    <output name="out" type="color3" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector4_color4">
-    <swizzle name="swizzle1" type="color4">
-      <input name="in" type="vector4" value="0.0, 0.2500, 0.7500, 1.0" />
-      <input name="channels" type="string" value="wyxz" />
-    </swizzle>
-    <output name="out" type="color4" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector4_vector2">
-    <swizzle name="swizzle1" type="vector2">
-      <input name="in" type="vector4" value="0.0, 0.2500, 0.7500, 1.0" />
-      <input name="channels" type="string" value="wz" />
-    </swizzle>
-    <output name="out" type="vector2" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector4_vector3">
-    <swizzle name="swizzle1" type="vector3">
-      <input name="in" type="vector4" value="0.0, 0.2500, 0.7500, 1.0" />
-      <input name="channels" type="string" value="wzy" />
-    </swizzle>
-    <output name="out" type="vector3" nodename="swizzle1" />
-  </nodegraph>
-  <nodegraph name="swizzle_vector4_vector4">
-    <swizzle name="swizzle1" type="vector4">
-      <input name="in" type="vector4" value="0.0, 0.2500, 0.7500, 1.0" />
-      <input name="channels" type="string" value="wyxz" />
-    </swizzle>
-    <output name="out" type="vector4" nodename="swizzle1" />
-  </nodegraph>
-</materialx>
diff --git a/resources/Materials/TestSuite/stdlib/color_management/color3_vec3_cm_test.mtlx b/resources/Materials/TestSuite/stdlib/color_management/color3_vec3_cm_test.mtlx
index bb670088fc..d1c1fd5626 100644
--- a/resources/Materials/TestSuite/stdlib/color_management/color3_vec3_cm_test.mtlx
+++ b/resources/Materials/TestSuite/stdlib/color_management/color3_vec3_cm_test.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <!-- create nodegraph to test cm conversion on image node before feeding to heighttonormal  -->
   <nodegraph name="height_to_normal_cm">
     <image name="b_image" type="color3">
diff --git a/resources/Materials/TestSuite/stdlib/color_management/color_management.mtlx b/resources/Materials/TestSuite/stdlib/color_management/color_management.mtlx
index ba0d23fdee..fb9825cd12 100644
--- a/resources/Materials/TestSuite/stdlib/color_management/color_management.mtlx
+++ b/resources/Materials/TestSuite/stdlib/color_management/color_management.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <nodegraph name="ng1">
     <image name="image_lin_rec709" type="color3">
       <input name="file" type="filename" value="resources/Images/grid.png" colorspace="lin_rec709" />
@@ -81,78 +81,111 @@
     <constant name="color_lin_rec709" type="color4">
       <input name="value" type="color4" value="0.5, 0.0, 0.0, 1.0" colorspace="lin_rec709" />
     </constant>
+    <convert name="color_lin_rec709_color3" type="color3">
+      <input name="in" type="color4" nodename="color_lin_rec709" />
+    </convert>
     <standard_surface name="color_lin_rec709_standard_surface" type="surfaceshader">
-      <input name="base_color" type="color3" nodename="color_lin_rec709" channels="rgb" />
+      <input name="base_color" type="color3" nodename="color_lin_rec709_color3" />
     </standard_surface>
     <output name="color_lin_rec709_output" type="surfaceshader" nodename="color_lin_rec709_standard_surface" />
     <constant name="color_gamma18" type="color4">
       <input name="value" type="color4" value="0.5, 0.0, 0.0, 1.0" colorspace="gamma18" />
     </constant>
+    <convert name="color_gamma18_color3" type="color3">
+      <input name="in" type="color4" nodename="color_gamma18" />
+    </convert>
     <standard_surface name="color_gamma18_standard_surface2" type="surfaceshader">
-      <input name="base_color" type="color3" nodename="color_gamma18" channels="rgb" />
+      <input name="base_color" type="color3" nodename="color_gamma18_color3" />
     </standard_surface>
     <output name="color_gamma18_output" type="surfaceshader" nodename="color_gamma18_standard_surface2" />
     <constant name="color_gamma22" type="color4">
       <input name="value" type="color4" value="0.5, 0.0, 0.0, 1.0" colorspace="gamma22" />
     </constant>
+    <convert name="color_gamma22_color3" type="color3">
+      <input name="in" type="color4" nodename="color_gamma22" />
+    </convert>
     <standard_surface name="color_gamma22_standard_surface3" type="surfaceshader">
-      <input name="base_color" type="color3" nodename="color_gamma22" channels="rgb" />
+      <input name="base_color" type="color3" nodename="color_gamma22_color3" />
     </standard_surface>
     <output name="color_gamma22_output" type="surfaceshader" nodename="color_gamma22_standard_surface3" />
     <constant name="color_gamma24" type="color4">
       <input name="value" type="color4" value="0.5, 0.0, 0.0, 1.0" colorspace="gamma24" />
     </constant>
+    <convert name="color_gamma24_color3" type="color3">
+      <input name="in" type="color4" nodename="color_gamma24" />
+    </convert>
     <standard_surface name="color_gamma24_standard_surface4" type="surfaceshader">
-      <input name="base_color" type="color3" nodename="color_gamma24" channels="rgb" />
+      <input name="base_color" type="color3" nodename="color_gamma24_color3" />
     </standard_surface>
     <output name="color_gamma24_output" type="surfaceshader" nodename="color_gamma24_standard_surface4" />
     <constant name="color_acescg" type="color4">
       <input name="value" type="color4" value="0.5, 0.0, 0.0, 1.0" colorspace="acescg" />
     </constant>
+    <convert name="color_acescg_color3" type="color3">
+      <input name="in" type="color4" nodename="color_acescg" />
+    </convert>
     <standard_surface name="color_acescg_standard_surface5" type="surfaceshader">
-      <input name="base_color" type="color3" nodename="color_acescg" channels="rgb" />
+      <input name="base_color" type="color3" nodename="color_acescg_color3" />
     </standard_surface>
     <output name="color_acescg_output" type="surfaceshader" nodename="color_acescg_standard_surface5" />
     <constant name="color_g22_ap1" type="color4">
       <input name="value" type="color4" value="0.5, 0.0, 0.0, 1.0" colorspace="g22_ap1" />
     </constant>
+    <convert name="color_g22_ap1_color3" type="color3">
+      <input name="in" type="color4" nodename="color_g22_ap1" />
+    </convert>
     <standard_surface name="color_g22_ap1_standard_surface5" type="surfaceshader">
-      <input name="base_color" type="color3" nodename="color_g22_ap1" channels="rgb" />
+      <input name="base_color" type="color3" nodename="color_g22_ap1_color3" />
     </standard_surface>
     <output name="color_g22_ap1_output" type="surfaceshader" nodename="color_g22_ap1_standard_surface5" />
     <constant name="color_srgb_texture" type="color4">
       <input name="value" type="color4" value="0.5, 0.0, 0.0, 1.0" colorspace="srgb_texture" />
     </constant>
+    <convert name="color_srgb_texture_color3" type="color3">
+      <input name="in" type="color4" nodename="color_srgb_texture" />
+    </convert>
     <standard_surface name="color_srgb_texture_standard_surface6" type="surfaceshader">
-      <input name="base_color" type="color3" nodename="color_srgb_texture" channels="rgb" />
+      <input name="base_color" type="color3" nodename="color_srgb_texture_color3" />
     </standard_surface>
     <output name="color_srgb_texture_output" type="surfaceshader" nodename="color_srgb_texture_standard_surface6" />
     <constant name="color_adobergb" type="color4">
       <input name="value" type="color4" value="0.5, 0.0, 0.0, 1.0" colorspace="adobergb" />
     </constant>
+    <convert name="color_adobergb_color3" type="color3">
+      <input name="in" type="color4" nodename="color_adobergb" />
+    </convert>
     <standard_surface name="color_adobergb_standard_surface7" type="surfaceshader">
-      <input name="base_color" type="color3" nodename="color_adobergb" channels="rgb" />
+      <input name="base_color" type="color3" nodename="color_adobergb_color3" />
     </standard_surface>
     <output name="color_adobergb_output" type="surfaceshader" nodename="color_adobergb_standard_surface7" />
     <constant name="color_lin_adobergb" type="color4">
       <input name="value" type="color4" value="0.5, 0.0, 0.0, 1.0" colorspace="lin_adobergb" />
     </constant>
+    <convert name="color_lin_adobergb_color3" type="color3">
+      <input name="in" type="color4" nodename="color_lin_adobergb" />
+    </convert>
     <standard_surface name="color_lin_adobergb_standard_surface8" type="surfaceshader">
-      <input name="base_color" type="color3" nodename="color_lin_adobergb" channels="rgb" />
+      <input name="base_color" type="color3" nodename="color_lin_adobergb_color3" />
     </standard_surface>
     <output name="color_lin_adobergb_output" type="surfaceshader" nodename="color_lin_adobergb_standard_surface8" />
     <constant name="color_srgb_displayp3" type="color4">
       <input name="value" type="color4" value="0.5, 0.0, 0.0, 1.0" colorspace="srgb_displayp3" />
     </constant>
+    <convert name="color_srgb_displayp3_color3" type="color3">
+      <input name="in" type="color4" nodename="color_srgb_displayp3" />
+    </convert>
     <standard_surface name="color_srgb_displayp3_standard_surface5" type="surfaceshader">
-      <input name="base_color" type="color3" nodename="color_srgb_displayp3" channels="rgb" />
+      <input name="base_color" type="color3" nodename="color_srgb_displayp3_color3" />
     </standard_surface>
     <output name="color_srgb_displayp3_output" type="surfaceshader" nodename="color_srgb_displayp3_standard_surface5" />
     <constant name="color_lin_displayp3" type="color4">
       <input name="value" type="color4" value="0.5, 0.0, 0.0, 1.0" colorspace="lin_displayp3" />
     </constant>
+    <convert name="color_lin_displayp3_color3" type="color3">
+      <input name="in" type="color4" nodename="color_lin_displayp3" />
+    </convert>
     <standard_surface name="color_lin_displayp3_standard_surface5" type="surfaceshader">
-      <input name="base_color" type="color3" nodename="color_lin_displayp3" channels="rgb" />
+      <input name="base_color" type="color3" nodename="color_lin_displayp3_color3" />
     </standard_surface>
     <output name="color_lin_displayp3_output" type="surfaceshader" nodename="color_lin_displayp3_standard_surface5" />
   </nodegraph>
diff --git a/resources/Materials/TestSuite/stdlib/color_management/filename_cm_test.mtlx b/resources/Materials/TestSuite/stdlib/color_management/filename_cm_test.mtlx
index 584b1f1415..0736be5eb1 100644
--- a/resources/Materials/TestSuite/stdlib/color_management/filename_cm_test.mtlx
+++ b/resources/Materials/TestSuite/stdlib/color_management/filename_cm_test.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <!-- create tm_retest node to wrap Image Node -->
   <nodedef name="ND_tm_retest" node="tm_retest">
     <input name="texture_file" type="filename" uniform="true" />
diff --git a/resources/Materials/TestSuite/stdlib/color_management/surface_colorspace.mtlx b/resources/Materials/TestSuite/stdlib/color_management/surface_colorspace.mtlx
index cd99ba50ce..7bbe254417 100644
--- a/resources/Materials/TestSuite/stdlib/color_management/surface_colorspace.mtlx
+++ b/resources/Materials/TestSuite/stdlib/color_management/surface_colorspace.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="srgb_texture">
+<materialx version="1.39" colorspace="srgb_texture">
   <nodedef name="ND_NodeA" node="NodeA">
     <input name="diffColor" type="color3" />
     <output name="out" type="surfaceshader" />
diff --git a/resources/Materials/TestSuite/stdlib/compositing/compositing.mtlx b/resources/Materials/TestSuite/stdlib/compositing/compositing.mtlx
index b125e70dca..4a2d032be6 100644
--- a/resources/Materials/TestSuite/stdlib/compositing/compositing.mtlx
+++ b/resources/Materials/TestSuite/stdlib/compositing/compositing.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
   Basic compositing function tests each test is in a separate graph for each variation in input type.
   - plus
diff --git a/resources/Materials/TestSuite/stdlib/conditional/conditional_if_float.mtlx b/resources/Materials/TestSuite/stdlib/conditional/conditional_if_float.mtlx
index 1cacea0be8..76dbc8584d 100644
--- a/resources/Materials/TestSuite/stdlib/conditional/conditional_if_float.mtlx
+++ b/resources/Materials/TestSuite/stdlib/conditional/conditional_if_float.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
   Basic conditional if* function tests each test is in a separate graph for each variation in input type.
   Tests are for floating point comparisons.
diff --git a/resources/Materials/TestSuite/stdlib/conditional/conditional_if_int.mtlx b/resources/Materials/TestSuite/stdlib/conditional/conditional_if_int.mtlx
index 1fdd8cb7b8..afc0306d15 100644
--- a/resources/Materials/TestSuite/stdlib/conditional/conditional_if_int.mtlx
+++ b/resources/Materials/TestSuite/stdlib/conditional/conditional_if_int.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
   Basic conditional if* function tests each test is in a separate graph for each variation in input type.
   Tests are for integer and boolean comparisons.
diff --git a/resources/Materials/TestSuite/stdlib/conditional/conditional_switch.mtlx b/resources/Materials/TestSuite/stdlib/conditional/conditional_switch.mtlx
index 7ed363e962..38f36a7290 100644
--- a/resources/Materials/TestSuite/stdlib/conditional/conditional_switch.mtlx
+++ b/resources/Materials/TestSuite/stdlib/conditional/conditional_switch.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
   Basic switch conditional function tests each test is in a separate graph for each variation in input type.
   -->
diff --git a/resources/Materials/TestSuite/stdlib/convert/convert.mtlx b/resources/Materials/TestSuite/stdlib/convert/convert.mtlx
index 8999ece9e0..377cb015df 100644
--- a/resources/Materials/TestSuite/stdlib/convert/convert.mtlx
+++ b/resources/Materials/TestSuite/stdlib/convert/convert.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!-- Tuple conversion tests to feed into surfaceshader conversions 
        Note that as surfaceshader performs most of the basic tuple
        conversions they are not added explicitly here. -->
diff --git a/resources/Materials/TestSuite/stdlib/convolution/blur.mtlx b/resources/Materials/TestSuite/stdlib/convolution/blur.mtlx
index e907bd31ea..05e83bc982 100644
--- a/resources/Materials/TestSuite/stdlib/convolution/blur.mtlx
+++ b/resources/Materials/TestSuite/stdlib/convolution/blur.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!---
      Blur unit test
   -->
diff --git a/resources/Materials/TestSuite/stdlib/convolution/heighttonormal.mtlx b/resources/Materials/TestSuite/stdlib/convolution/heighttonormal.mtlx
index 77d83680b8..024af3276d 100644
--- a/resources/Materials/TestSuite/stdlib/convolution/heighttonormal.mtlx
+++ b/resources/Materials/TestSuite/stdlib/convolution/heighttonormal.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="height_to_normal">
     <input name="file" type="filename" uniform="true" value="resources/Images/plain_heightmap.png" />
     <tiledimage name="tiledimage" type="float">
diff --git a/resources/Materials/TestSuite/stdlib/definition/definition_from_nodegraph.mtlx b/resources/Materials/TestSuite/stdlib/definition/definition_from_nodegraph.mtlx
index f1958c162e..11a4b3ce7d 100644
--- a/resources/Materials/TestSuite/stdlib/definition/definition_from_nodegraph.mtlx
+++ b/resources/Materials/TestSuite/stdlib/definition/definition_from_nodegraph.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="test_colorcorrect">
     <multiply name="AlphaGain" type="float">
       <input name="in1" type="float" nodename="inputAlpha" />
diff --git a/resources/Materials/TestSuite/stdlib/definition/definition_reduced_interface.mtlx b/resources/Materials/TestSuite/stdlib/definition/definition_reduced_interface.mtlx
index 7b1c09902d..0786653d80 100644
--- a/resources/Materials/TestSuite/stdlib/definition/definition_reduced_interface.mtlx
+++ b/resources/Materials/TestSuite/stdlib/definition/definition_reduced_interface.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709" fileprefix="../../../Images/">
+<materialx version="1.39" colorspace="lin_rec709" fileprefix="../../../Images/">
 
   <!-- 
     Test file for reduced interface:
diff --git a/resources/Materials/TestSuite/stdlib/definition/definition_using_definitions.mtlx b/resources/Materials/TestSuite/stdlib/definition/definition_using_definitions.mtlx
index ae11351fd9..e3503d68f6 100644
--- a/resources/Materials/TestSuite/stdlib/definition/definition_using_definitions.mtlx
+++ b/resources/Materials/TestSuite/stdlib/definition/definition_using_definitions.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709" xmlns:xi="http://www.w3.org/2001/XInclude">
+<materialx version="1.39" colorspace="lin_rec709" xmlns:xi="http://www.w3.org/2001/XInclude">
   <nodedef name="ND_layered" node="mylayered" version="1.0.1" isdefaultversion="true">
     <input name="surface_normal" type="vector3" value="1, 1, 1" defaultgeomprop="Nworld" />
     <input name="surface_cutout" type="color3" value="1, 1, 1" />
diff --git a/resources/Materials/TestSuite/stdlib/definition/surfacematerial_definition.mtlx b/resources/Materials/TestSuite/stdlib/definition/surfacematerial_definition.mtlx
index 8595608463..ee54399fbb 100644
--- a/resources/Materials/TestSuite/stdlib/definition/surfacematerial_definition.mtlx
+++ b/resources/Materials/TestSuite/stdlib/definition/surfacematerial_definition.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!-- Nodegraph definition with material node -->
   <nodedef name="ND_mymaterial" node="mymaterial" nodegroup="material" version="1.3" isdefaultversion="true">
     <output name="out" type="material" />
diff --git a/resources/Materials/TestSuite/stdlib/geometric/geompropvalue.mtlx b/resources/Materials/TestSuite/stdlib/geometric/geompropvalue.mtlx
index 208eb9a1fb..82d3ad5bb0 100644
--- a/resources/Materials/TestSuite/stdlib/geometric/geompropvalue.mtlx
+++ b/resources/Materials/TestSuite/stdlib/geometric/geompropvalue.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <output name="geompropvalue_integer_out" type="vector4" nodename="switch1" />
   <switch name="switch1" type="vector4">
     <input name="in1" type="vector4" value="0.0, 0.0, 0.0, 1.0" />
@@ -23,10 +23,9 @@
     <input name="geomprop" type="string" value="geompropvalue_bool" />
   </geompropvalue>
   <output name="geompropvalue_string_out" type="color3" nodename="swizzle1" />
-  <swizzle name="swizzle1" type="color3">
-    <input name="in" type="color3" value="0.5, 0.5, 0.5" />
-    <input name="channels" type="string" nodename="geompropvalue_string" />
-  </swizzle>
+  <constant name="swizzle1" type="color3">
+    <input name="value" type="color3" value="0.5, 0.5, 0.5" />
+  </constant>
   <geompropvalue name="geompropvalue_string" type="string">
     <input name="geomprop" type="string" value="geompropvalue_string" />
   </geompropvalue>
diff --git a/resources/Materials/TestSuite/stdlib/geometric/look_assignment_order.mtlx b/resources/Materials/TestSuite/stdlib/geometric/look_assignment_order.mtlx
index ec8537f56f..0a57def8a0 100644
--- a/resources/Materials/TestSuite/stdlib/geometric/look_assignment_order.mtlx
+++ b/resources/Materials/TestSuite/stdlib/geometric/look_assignment_order.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!-- Simple test to check look assignment order. The target geometry
        is assumed to be the default shader ball with the intended
        result being that the Preview mesh is "blue" and the Calibration mesh is
diff --git a/resources/Materials/TestSuite/stdlib/geometric/streams.mtlx b/resources/Materials/TestSuite/stdlib/geometric/streams.mtlx
index a0e6c518ff..41ae52dfc0 100644
--- a/resources/Materials/TestSuite/stdlib/geometric/streams.mtlx
+++ b/resources/Materials/TestSuite/stdlib/geometric/streams.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!-- Geometric node unit tests, also useful for debug visualization of geometric streams -->
   <normal name="normal_object" type="vector3">
     <input name="space" type="string" value="object" />
@@ -76,7 +76,15 @@
   <texcoord name="texcoord0" type="vector2">
     <input name="index" type="integer" value="0" />
   </texcoord>
-  <output name="texcoord0_output" type="vector3" nodename="texcoord0" channels="xy0" />
+  <separate2 name="separate" type="multioutput">
+    <input name="in" type="vector2" nodename="texcoord0" />
+  </separate2>
+  <combine3 name="swizzle" type="vector3">
+    <input name="in1" type="float" nodename="separate" output="outx" />
+    <input name="in2" type="float" nodename="separate" output="outy" />
+    <input name="in3" type="float" value="0" />
+  </combine3>
+  <output name="texcoord0_output" type="vector3" nodename="swizzle" />
   <texcoord name="texcoord0_vec3" type="vector3">
     <input name="index" type="integer" value="0" />
   </texcoord>
@@ -84,11 +92,24 @@
   <texcoord name="texcoord1" type="vector2">
     <input name="index" type="integer" value="1" />
   </texcoord>
-  <output name="texcoord1_output" type="vector3" nodename="texcoord1" channels="xy0" />
+  <separate2 name="separate2" type="multioutput">
+    <input name="in" type="vector2" nodename="texcoord1" />
+  </separate2>
+  <combine3 name="swizzle2" type="vector3">
+    <input name="in1" type="float" nodename="separate2" output="outx" />
+    <input name="in2" type="float" nodename="separate2" output="outy" />
+    <input name="in3" type="float" value="0" />
+  </combine3>
+  <output name="texcoord1_output" type="vector3" nodename="swizzle2" />
   <geomcolor name="color_float" type="float">
     <input name="index" type="integer" value="0" />
   </geomcolor>
-  <output name="color_float_output" type="vector3" nodename="color_float" channels="x00" />
+  <combine3 name="swizzle3" type="vector3">
+    <input name="in1" type="float" nodename="color_float" />
+    <input name="in2" type="float" value="0" />
+    <input name="in3" type="float" value="0" />
+  </combine3>
+  <output name="color_float_output" type="vector3" nodename="swizzle3" />
   <geomcolor name="color_vec3" type="color3">
     <input name="index" type="integer" value="0" />
   </geomcolor>
diff --git a/resources/Materials/TestSuite/stdlib/materials/material_node_discovery.mtlx b/resources/Materials/TestSuite/stdlib/materials/material_node_discovery.mtlx
index ad6ef8f1b6..7cf951eab2 100644
--- a/resources/Materials/TestSuite/stdlib/materials/material_node_discovery.mtlx
+++ b/resources/Materials/TestSuite/stdlib/materials/material_node_discovery.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodedef name="ND_material_def_material_1_0" node="material_def" version="1.0" isdefaultversion="true">
     <output name="out" type="material" />
   </nodedef>
diff --git a/resources/Materials/TestSuite/stdlib/math/math.mtlx b/resources/Materials/TestSuite/stdlib/math/math.mtlx
index 0969618369..1d0ca863d1 100644
--- a/resources/Materials/TestSuite/stdlib/math/math.mtlx
+++ b/resources/Materials/TestSuite/stdlib/math/math.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="ln_nodegraph">
     <ln name="ln1" type="float">
       <input name="in" type="float" nodename="constant1" />
diff --git a/resources/Materials/TestSuite/stdlib/math/math_operators.mtlx b/resources/Materials/TestSuite/stdlib/math/math_operators.mtlx
index d3745505d5..416ff6aced 100644
--- a/resources/Materials/TestSuite/stdlib/math/math_operators.mtlx
+++ b/resources/Materials/TestSuite/stdlib/math/math_operators.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="add_float">
     <add name="add1" type="float">
       <input name="in1" type="float" value="0.2000" />
diff --git a/resources/Materials/TestSuite/stdlib/math/matrix.mtlx b/resources/Materials/TestSuite/stdlib/math/matrix.mtlx
index 4bcb555739..4c0bed3559 100644
--- a/resources/Materials/TestSuite/stdlib/math/matrix.mtlx
+++ b/resources/Materials/TestSuite/stdlib/math/matrix.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="creatematrix_vector3_matrix33">
     <creatematrix name="creatematrix_vector3_matrix33" type="matrix33">
       <input name="in1" type="vector3" value="1, 0, 0" />
diff --git a/resources/Materials/TestSuite/stdlib/math/transform.mtlx b/resources/Materials/TestSuite/stdlib/math/transform.mtlx
index 042f320c84..90f862e492 100644
--- a/resources/Materials/TestSuite/stdlib/math/transform.mtlx
+++ b/resources/Materials/TestSuite/stdlib/math/transform.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!-- point space transform -->
   <nodegraph name="tf_point_vector3">
     <transformpoint name="transformpoint1" type="vector3">
@@ -68,11 +68,29 @@
     </position>
   </nodegraph>
   <nodegraph name="tf_matrix4_vector4">
+    <separate3 name="separate_normal" type="multioutput">
+      <input name="in" type="vector3" nodename="normal1" />
+    </separate3>
+    <combine4 name="combine_normal" type="vector4">
+      <input name="in1" type="float" nodename="separate_normal" output="outx" />
+      <input name="in2" type="float" nodename="separate_normal" output="outy" />
+      <input name="in3" type="float" nodename="separate_normal" output="outz" />
+      <input name="in4" type="float" value="0" />
+    </combine4>
     <transformmatrix name="transformvector1" type="vector4">
-      <input name="in" type="vector4" nodename="normal1" channels="xyz0" />
+      <input name="in" type="vector4" nodename="combine_normal" />
       <input name="mat" type="matrix44" value="0.5, 0.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0" />
     </transformmatrix>
-    <output name="out" type="vector4" nodename="transformvector1" channels="xyz1" />
+    <separate4 name="separate_vector" type="multioutput">
+      <input name="in" type="vector4" nodename="transformvector1" />
+    </separate4>
+    <combine4 name="combine_vector" type="vector4">
+      <input name="in1" type="float" nodename="separate_vector" output="outx" />
+      <input name="in2" type="float" nodename="separate_vector" output="outy" />
+      <input name="in3" type="float" nodename="separate_vector" output="outz" />
+      <input name="in4" type="float" value="1" />
+    </combine4>
+    <output name="out" type="vector4" nodename="combine_vector" />
     <normal name="normal1" type="vector3">
       <input name="space" type="string" value="object" />
     </normal>
@@ -101,13 +119,17 @@
     <transformmatrix name="N_transformpt" type="vector4">
       <input name="in" type="vector4" nodename="N_convtov4" />
       <input name="mat" type="matrix44" value="1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.0,0.0,0.0,1.0" />
-      <!--
-         />
-      -->
     </transformmatrix>
+    <convert name="in_vector3" type="vector3">
+      <input name="in" type="vector4" nodename="N_transformpt" />
+    </convert>
+    <extract name="in_alpha" type="float">
+      <input name="in" type="vector4" nodename="N_transformpt" />
+      <input name="index" type="integer" value="3" />
+    </extract>
     <divide name="N_convtov3" type="vector3">
-      <input name="in1" type="vector3" nodename="N_transformpt" channels="xyz" />
-      <input name="in2" type="float" nodename="N_transformpt" channels="w" />
+      <input name="in1" type="vector3" nodename="in_vector3" />
+      <input name="in2" type="float" nodename="in_alpha" />
     </divide>
     <output name="N_out_vec3" type="vector3" nodename="N_convtov3" />
   </nodegraph>
diff --git a/resources/Materials/TestSuite/stdlib/math/trig.mtlx b/resources/Materials/TestSuite/stdlib/math/trig.mtlx
index 5c52983757..bb17c6763f 100644
--- a/resources/Materials/TestSuite/stdlib/math/trig.mtlx
+++ b/resources/Materials/TestSuite/stdlib/math/trig.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="sin_nodegraph">
     <sin name="sin1" type="float">
       <input name="in" type="float" nodename="constant1" />
diff --git a/resources/Materials/TestSuite/stdlib/math/vector_math.mtlx b/resources/Materials/TestSuite/stdlib/math/vector_math.mtlx
index 57dac492da..d5fa59ed7f 100644
--- a/resources/Materials/TestSuite/stdlib/math/vector_math.mtlx
+++ b/resources/Materials/TestSuite/stdlib/math/vector_math.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="normalize_vector2">
     <normalize name="normalize1" type="vector2">
       <input name="in" type="vector2" value="1.0000, 0.5000" />
@@ -70,13 +70,16 @@
     </position>
     <output name="out" type="vector2" nodename="rotate1" />
     <rotate2d name="rotate1" type="vector2">
-      <input name="in" type="vector2" nodename="swizzle1" />
+      <input name="in" type="vector2" nodename="combine1" />
       <input name="amount" type="float" value="1.5708" unittype="angle" unit="radian" />
     </rotate2d>
-    <swizzle name="swizzle1" type="vector2">
+    <separate3 name="separate" type="multioutput">
       <input name="in" type="vector3" nodename="position1" />
-      <input name="channels" type="string" value="xy" />
-    </swizzle>
+    </separate3>
+    <combine2 name="combine1" type="vector2">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+    </combine2>
   </nodegraph>
   <nodegraph name="rotate_vector3">
     <position name="position1" type="vector3">
@@ -118,12 +121,17 @@
     <position name="position1" type="vector3">
       <input name="space" type="string" value="object" />
     </position>
-    <swizzle name="swizzle1" type="vector4">
+    <separate3 name="separate" type="multioutput">
       <input name="in" type="vector3" nodename="position1" />
-      <input name="channels" type="string" value="xyz1" />
-    </swizzle>
+    </separate3>
+    <combine4 name="combine1" type="vector4">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+      <input name="in3" type="float" nodename="separate" output="outz" />
+      <input name="in4" type="float" value="1" />
+    </combine4>
     <transformmatrix name="transformvector1" type="vector4">
-      <input name="in" type="vector4" nodename="swizzle1" />
+      <input name="in" type="vector4" nodename="combine1" />
       <input name="mat" type="matrix44" nodename="transpose1" />
     </transformmatrix>
     <transpose name="transpose1" type="matrix44">
diff --git a/resources/Materials/TestSuite/stdlib/nodegraphs/cascade_nodegraphs.mtlx b/resources/Materials/TestSuite/stdlib/nodegraphs/cascade_nodegraphs.mtlx
index cb8f7351e6..1d91cee3c1 100644
--- a/resources/Materials/TestSuite/stdlib/nodegraphs/cascade_nodegraphs.mtlx
+++ b/resources/Materials/TestSuite/stdlib/nodegraphs/cascade_nodegraphs.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="upstream3">
     <input name="file" type="filename" uniform="true" value="resources/Images/cloth.png" />
     <input name="file1" type="filename" uniform="true" value="resources/Images/grid.png" />
diff --git a/resources/Materials/TestSuite/stdlib/nodegraphs/nodegraph_multioutput.mtlx b/resources/Materials/TestSuite/stdlib/nodegraphs/nodegraph_multioutput.mtlx
index c5450d368c..d1ac44092d 100644
--- a/resources/Materials/TestSuite/stdlib/nodegraphs/nodegraph_multioutput.mtlx
+++ b/resources/Materials/TestSuite/stdlib/nodegraphs/nodegraph_multioutput.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="green_graph">
     <input name="in" type="color3" value="0, 1, 0" />
     <separate3 name="green_node" type="multioutput" nodedef="ND_separate3_color3">
diff --git a/resources/Materials/TestSuite/stdlib/nodegraphs/nodegraph_nodegraph.mtlx b/resources/Materials/TestSuite/stdlib/nodegraphs/nodegraph_nodegraph.mtlx
index 4e97a3fcb0..e3508c33ea 100644
--- a/resources/Materials/TestSuite/stdlib/nodegraphs/nodegraph_nodegraph.mtlx
+++ b/resources/Materials/TestSuite/stdlib/nodegraphs/nodegraph_nodegraph.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!-- Nodegraph to nodegraph connections -->
   <nodegraph name="upstream_graph">
     <input name="file" type="filename" value="resources/Images/grid.png" />
diff --git a/resources/Materials/TestSuite/stdlib/nodegraphs/surfacematerial_nodegraph_to_surfaceshader.mtlx b/resources/Materials/TestSuite/stdlib/nodegraphs/surfacematerial_nodegraph_to_surfaceshader.mtlx
index ffa197e9c6..aeaf1a38ed 100644
--- a/resources/Materials/TestSuite/stdlib/nodegraphs/surfacematerial_nodegraph_to_surfaceshader.mtlx
+++ b/resources/Materials/TestSuite/stdlib/nodegraphs/surfacematerial_nodegraph_to_surfaceshader.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!-- Test of surfacematerial in nodegraph to shader node traversal -->
   <standard_surface name="standard_surface" type="surfaceshader" version="1.0.1">
     <input name="base_color" type="color3" value="0.3,0.8,0.1" />
diff --git a/resources/Materials/TestSuite/stdlib/nodegraphs/top_level_input.mtlx b/resources/Materials/TestSuite/stdlib/nodegraphs/top_level_input.mtlx
index d92eae7f19..5ed87ac105 100644
--- a/resources/Materials/TestSuite/stdlib/nodegraphs/top_level_input.mtlx
+++ b/resources/Materials/TestSuite/stdlib/nodegraphs/top_level_input.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <surfacematerial name="surfacematerial" type="material" xpos="17.246376" ypos="-15.689655">
     <input name="surfaceshader" type="surfaceshader" nodename="surface_unlit" />
   </surfacematerial>
diff --git a/resources/Materials/TestSuite/stdlib/nodegraphs/topology_tests.mtlx b/resources/Materials/TestSuite/stdlib/nodegraphs/topology_tests.mtlx
deleted file mode 100644
index f54a3ed896..0000000000
--- a/resources/Materials/TestSuite/stdlib/nodegraphs/topology_tests.mtlx
+++ /dev/null
@@ -1,182 +0,0 @@
-<?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
-
-  <!-- Simple use of channels on output node -->
-  <nodegraph name="Ng1">
-    <constant name="constant" type="color3" nodedef="ND_constant_color3">
-      <input name="value" type="color3" value="0.263273, 0.263273, 0.263273" />
-    </constant>
-    <output name="float_output" type="float" nodename="constant" channels="g" />
-  </nodegraph>
-  <standard_surface name="Surf1" type="surfaceshader">
-    <input name="base" type="float" nodegraph="Ng1" output="float_output" />
-  </standard_surface>
-  <surfacematerial name="Channel1" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="Surf1" />
-  </surfacematerial>
-
-  <!-- Simple use of channels on node outside of graph -->
-  <nodegraph name="Ng2">
-    <constant name="constant" type="color3" nodedef="ND_constant_color3">
-      <input name="value" type="color3" value="0.263273, 0.263273, 0.263273" />
-    </constant>
-    <output name="color3_output" type="color3" nodename="constant" />
-  </nodegraph>
-  <standard_surface name="Surf2" type="surfaceshader">
-    <input name="base" type="float" nodegraph="Ng2" output="color3_output" channels="g" />
-  </standard_surface>
-  <surfacematerial name="Channel2" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="Surf2" />
-  </surfacematerial>
-
-  <!-- Devious use of a double channel to confuse the code -->
-  <nodegraph name="Ng3">
-    <constant name="constant" type="color3" nodedef="ND_constant_color3">
-      <input name="value" type="color3" value="0.263273, 0.263273, 0.263273" />
-    </constant>
-    <output name="color4_output" type="color4" nodename="constant" channels="rgb1" />
-  </nodegraph>
-  <standard_surface name="Surf3" type="surfaceshader">
-    <input name="base" type="float" nodegraph="Ng3" output="color4_output" channels="g" />
-  </standard_surface>
-  <surfacematerial name="Channel3" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="Surf3" />
-  </surfacematerial>
-
-  <!-- Even worse use of a double channel to confuse the code. We expect final channel to be "r" -->
-  <nodegraph name="Ng4">
-    <constant name="constant" type="color3" nodedef="ND_constant_color3">
-      <input name="value" type="color3" value="0.263273, 0.263273, 0.263273" />
-    </constant>
-    <output name="color4_output" type="color4" nodename="constant" channels="rrrr" />
-  </nodegraph>
-  <standard_surface name="Surf4" type="surfaceshader">
-    <input name="base" type="float" nodegraph="Ng4" output="color4_output" channels="g" />
-  </standard_surface>
-  <surfacematerial name="Channel4" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="Surf4" />
-  </surfacematerial>
-
-  <!-- Absence of a nodegraph does not influence flattened topology -->
-  <standard_surface name="Surf5" type="surfaceshader">
-    <input name="base" type="float" nodename="constant5" channels="g" />
-  </standard_surface>
-  <constant name="constant5" type="color3" nodedef="ND_constant_color3">
-    <input name="value" type="color3" value="0.263273, 0.263273, 0.263273" />
-  </constant>
-  <surfacematerial name="Channel5" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="Surf5" />
-  </surfacematerial>
-
-  <!-- Multi-output test -->
-  <nodegraph name="Ng6">
-    <artistic_ior name="ior6" type="multioutput">
-      <input name="edge_color" type="color3" value="0.7, 0.4, 0.1" colorspace="lin_rec709" />
-    </artistic_ior>
-    <output name="ior_output" type="color3" nodename="ior6" output="ior" />
-  </nodegraph>
-  <standard_surface name="Surf6" type="surfaceshader">
-    <input name="base_color" type="color3" nodegraph="Ng6" output="ior_output" />
-  </standard_surface>
-  <surfacematerial name="MultiOut6" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="Surf6" />
-  </surfacematerial>
-
-  <!-- Multi-output test no nodegraph -->
-  <artistic_ior name="ior7" type="multioutput">
-    <input name="edge_color" type="color3" value="0.7, 0.4, 0.1" colorspace="lin_rec709" />
-  </artistic_ior>
-  <standard_surface name="Surf7" type="surfaceshader">
-    <input name="base_color" type="color3" nodename="ior7" output="ior" />
-  </standard_surface>
-  <surfacematerial name="MultiOut7" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="Surf7" />
-  </surfacematerial>
-
-  <!-- Constant value on interface -->
-  <nodegraph name="Ng8">
-    <input name="ng_const" type="color3" value="0.263273, 0.263273, 0.263273" /> 
-    <constant name="constant" type="color3" nodedef="ND_constant_color3">
-      <input name="value" type="color3" interfacename="ng_const" />
-    </constant>
-    <output name="float_output" type="float" nodename="constant" channels="g" />
-  </nodegraph>
-  <standard_surface name="Surf8" type="surfaceshader">
-    <input name="base" type="float" nodegraph="Ng8" output="float_output" />
-  </standard_surface>
-  <surfacematerial name="Interface1" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="Surf8" />
-  </surfacematerial>
-
-  <!-- Chaining nodegraphs: -->
-  <nodegraph name="Ng9a">
-    <input name="ng_const" type="color3" value="0.263273, 0.263273, 0.263273" /> 
-    <constant name="constant" type="color3" nodedef="ND_constant_color3">
-      <input name="value" type="color3" interfacename="ng_const" />
-    </constant>
-    <output name="float_output" type="float" nodename="constant" channels="g" />
-  </nodegraph>
-  <add name="add9a" type="float" nodedef="ND_add_float">
-    <input name="in1" type="float" nodegraph="Ng9a" output="float_output" />
-  </add>
-  <nodegraph name="Ng9b">
-    <input name="ng_add" type="float" nodename="add9a" /> 
-    <add name="add9b" type="float" nodedef="ND_add_float">
-      <input name="in1" type="float" interfacename="ng_add" />
-    </add>
-    <output name="float_output" type="float" nodename="add9b" />
-  </nodegraph>
-  <standard_surface name="Surf9" type="surfaceshader">
-    <input name="base" type="float" nodegraph="Ng9b" output="float_output" />
-  </standard_surface>
-  <surfacematerial name="Interface2" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="Surf9" />
-  </surfacematerial>
-
-  <!-- Chaining nodegraphs without intermediate node: -->
-  <nodegraph name="Ng10a">
-    <input name="ng_const" type="color3" value="0.263273, 0.263273, 0.263273" /> 
-    <constant name="constant" type="color3" nodedef="ND_constant_color3">
-      <input name="value" type="color3" interfacename="ng_const" />
-    </constant>
-    <add name="add10a" type="float" nodedef="ND_add_float">
-      <input name="in1" type="float" nodename="constant" channels="g" />
-    </add>
-    <output name="float_output" type="float" nodename="add10a" />
-  </nodegraph>
-  <nodegraph name="Ng10b">
-    <input name="ng_add" type="float" nodegraph="Ng10a" output="float_output" /> 
-    <add name="add10b" type="float" nodedef="ND_add_float">
-      <input name="in1" type="float" interfacename="ng_add" />
-    </add>
-    <output name="float_output" type="float" nodename="add10b" />
-  </nodegraph>
-  <standard_surface name="Surf10" type="surfaceshader">
-    <input name="base" type="float" nodegraph="Ng10b" output="float_output" />
-  </standard_surface>
-  <surfacematerial name="Interface3" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="Surf10" />
-  </surfacematerial>
-
-  <surfacematerial name="MultiConnect1" type="material" nodedef="ND_surfacematerial">
-    <input name="surfaceshader" type="surfaceshader" nodename="Surf11" />
-  </surfacematerial>
-  <standard_surface name="Surf11" type="surfaceshader" nodedef="ND_standard_surface_surfaceshader">
-    <input name="base_color" type="color3" nodename="constant11a" />
-    <input name="opacity" type="color3" nodename="constant11a" />
-    <input name="subsurface" type="float" nodename="add11" />
-    <input name="transmission" type="float" nodename="constant11b" />
-    <input name="base" type="float" nodename="constant11b" />
-  </standard_surface>
-  <constant name="constant11a" type="color3" nodedef="ND_constant_color3">
-    <input name="value" type="color3" value="0.263273, 0.263273, 0.263273" />
-  </constant>
-  <constant name="constant11b" type="float" nodedef="ND_constant_float">
-    <input name="value" type="float" value="0.5" />
-  </constant>
-  <add name="add11" type="float" nodedef="ND_add_float">
-    <input name="in1" type="float" nodename="constant11b" />
-    <input name="in2" type="float" nodename="constant11b" />
-  </add>
-
-</materialx>
diff --git a/resources/Materials/TestSuite/stdlib/noise/noise.mtlx b/resources/Materials/TestSuite/stdlib/noise/noise.mtlx
index 9a43223c60..f36338d322 100644
--- a/resources/Materials/TestSuite/stdlib/noise/noise.mtlx
+++ b/resources/Materials/TestSuite/stdlib/noise/noise.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
 
   <!-- Shared Computations -->
   <texcoord name="texcoord" type="vector2" />
diff --git a/resources/Materials/TestSuite/stdlib/noise/procedural.mtlx b/resources/Materials/TestSuite/stdlib/noise/procedural.mtlx
index 5de65ff06d..ff374f3e82 100644
--- a/resources/Materials/TestSuite/stdlib/noise/procedural.mtlx
+++ b/resources/Materials/TestSuite/stdlib/noise/procedural.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="nodegraph1">
     <cellnoise3d name="cellnoise3d1" type="float">
       <input name="position" type="vector3" nodename="multiply1" />
@@ -82,15 +82,15 @@
       <input name="bg" type="color3" nodename="ramptb2" />
       <input name="mix" type="float" nodename="sin1" />
     </mix>
-    <swizzle name="swizzle1" type="float">
+    <extract name="texcoord1_y" type="float">
       <input name="in" type="vector2" nodename="texcoord1" />
-      <input name="channels" type="string" value="y" />
-    </swizzle>
+      <input name="index" type="integer" value="1" />
+    </extract>
     <sin name="sin1" type="float">
       <input name="in" type="float" nodename="multiply5" />
     </sin>
     <multiply name="multiply5" type="float">
-      <input name="in1" type="float" nodename="swizzle1" />
+      <input name="in1" type="float" nodename="texcoord1_y" />
       <input name="in2" type="float" value="30.0000" />
     </multiply>
     <cellnoise2d name="cellnoise2d1" type="float">
diff --git a/resources/Materials/TestSuite/stdlib/noise/shared_function.mtlx b/resources/Materials/TestSuite/stdlib/noise/shared_function.mtlx
index 59bddd7514..3fae0a8ee6 100644
--- a/resources/Materials/TestSuite/stdlib/noise/shared_function.mtlx
+++ b/resources/Materials/TestSuite/stdlib/noise/shared_function.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
       Test using noise2d for both color3 and vector3 in the same graph,
       since these share the same node implementation for GLSL.
diff --git a/resources/Materials/TestSuite/stdlib/organization/organization.mtlx b/resources/Materials/TestSuite/stdlib/organization/organization.mtlx
index 0f4c024848..c107ae1338 100644
--- a/resources/Materials/TestSuite/stdlib/organization/organization.mtlx
+++ b/resources/Materials/TestSuite/stdlib/organization/organization.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="dot_float">
     <dot name="dot1" type="float">
       <input name="in" type="float" nodename="constant1" />
diff --git a/resources/Materials/TestSuite/stdlib/procedural/linepattern.mtlx b/resources/Materials/TestSuite/stdlib/procedural/linepattern.mtlx
index 032abf129d..98d012c2cf 100644
--- a/resources/Materials/TestSuite/stdlib/procedural/linepattern.mtlx
+++ b/resources/Materials/TestSuite/stdlib/procedural/linepattern.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <grid name="grid_color3" type="color3">
     <input name="uvtiling" type="vector2" value="58, 58" />
     <input name="thickness" type="float" value="0.1" />
diff --git a/resources/Materials/TestSuite/stdlib/procedural/tiledshape.mtlx b/resources/Materials/TestSuite/stdlib/procedural/tiledshape.mtlx
index fe6e414535..da75aca4d3 100644
--- a/resources/Materials/TestSuite/stdlib/procedural/tiledshape.mtlx
+++ b/resources/Materials/TestSuite/stdlib/procedural/tiledshape.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <tiledcircles name="tiledcircles_color3" type="color3">
     <input name="uvtiling" type="vector2" value="29, 29" />
     <input name="size" type="float" value="0.8" />
diff --git a/resources/Materials/TestSuite/stdlib/shader/surface.mtlx b/resources/Materials/TestSuite/stdlib/shader/surface.mtlx
index 49122440d2..f2ff3657a4 100644
--- a/resources/Materials/TestSuite/stdlib/shader/surface.mtlx
+++ b/resources/Materials/TestSuite/stdlib/shader/surface.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
 
   <!-- Define a node that implements a checker board pattern -->
   <!-- Using a graph for the implementation.                 -->
@@ -15,14 +15,14 @@
       <input name="in1" type="vector2" nodename="texcoord1" />
       <input name="in2" type="vector2" interfacename="scale" />
     </multiply>
-    <swizzle name="swizz_x" type="float">
+    <extract name="swizz_x" type="float">
       <input name="in" type="vector2" nodename="mult1" />
-      <input name="channels" type="string" value="x" />
-    </swizzle>
-    <swizzle name="swizz_y" type="float">
+      <input name="index" type="integer" value="0" />
+    </extract>
+    <extract name="swizz_y" type="float">
       <input name="in" type="vector2" nodename="mult1" />
-      <input name="channels" type="string" value="y" />
-    </swizzle>
+      <input name="index" type="integer" value="1" />
+    </extract>
     <floor name="floor1" type="float">
       <input name="in" type="float" nodename="swizz_x" />
     </floor>
diff --git a/resources/Materials/TestSuite/stdlib/texture/image.mtlx b/resources/Materials/TestSuite/stdlib/texture/image.mtlx
index a6ac948580..d8dfb30eba 100644
--- a/resources/Materials/TestSuite/stdlib/texture/image.mtlx
+++ b/resources/Materials/TestSuite/stdlib/texture/image.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="srgb_texture">
+<materialx version="1.39" colorspace="srgb_texture">
   <!--
   Basic image unit test with one image node for each variation in input type.
   -->
diff --git a/resources/Materials/TestSuite/stdlib/texture/image_addressing.mtlx b/resources/Materials/TestSuite/stdlib/texture/image_addressing.mtlx
index 874b4ed13e..5f99395bce 100644
--- a/resources/Materials/TestSuite/stdlib/texture/image_addressing.mtlx
+++ b/resources/Materials/TestSuite/stdlib/texture/image_addressing.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="uclamp">
     <image name="image_number_1" type="color3">
       <input name="file" type="filename" value="resources/Images/grid.png" />
diff --git a/resources/Materials/TestSuite/stdlib/texture/image_codecs.mtlx b/resources/Materials/TestSuite/stdlib/texture/image_codecs.mtlx
index c9723a63dd..375d15d834 100644
--- a/resources/Materials/TestSuite/stdlib/texture/image_codecs.mtlx
+++ b/resources/Materials/TestSuite/stdlib/texture/image_codecs.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <image name="image4_bmp" type="color4">
     <input name="file" type="filename" value="resources/Images/cloth.bmp" />
   </image>
diff --git a/resources/Materials/TestSuite/stdlib/texture/image_default.mtlx b/resources/Materials/TestSuite/stdlib/texture/image_default.mtlx
index 89b99c3c39..a863a152d3 100644
--- a/resources/Materials/TestSuite/stdlib/texture/image_default.mtlx
+++ b/resources/Materials/TestSuite/stdlib/texture/image_default.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
+<materialx version="1.39" colorspace="lin_rec709">
   <!--
   Validation of default color fallbacks for missing image files.
   -->
diff --git a/resources/Materials/TestSuite/stdlib/texture/image_transform.mtlx b/resources/Materials/TestSuite/stdlib/texture/image_transform.mtlx
index a3afd60912..3b77f062da 100644
--- a/resources/Materials/TestSuite/stdlib/texture/image_transform.mtlx
+++ b/resources/Materials/TestSuite/stdlib/texture/image_transform.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="test_place2d_SRT">
     <texcoord name="texcoord1" type="vector2" />
     <place2d name="a_place2d" type="vector2">
diff --git a/resources/Materials/TestSuite/stdlib/texture/ramp.mtlx b/resources/Materials/TestSuite/stdlib/texture/ramp.mtlx
index 6dddba8877..e25f1b9edb 100644
--- a/resources/Materials/TestSuite/stdlib/texture/ramp.mtlx
+++ b/resources/Materials/TestSuite/stdlib/texture/ramp.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
   Basic ramp unit test :
   - Ramp (left-to-right)
diff --git a/resources/Materials/TestSuite/stdlib/texture/split.mtlx b/resources/Materials/TestSuite/stdlib/texture/split.mtlx
index 19c4be6ede..17bf6a46ab 100644
--- a/resources/Materials/TestSuite/stdlib/texture/split.mtlx
+++ b/resources/Materials/TestSuite/stdlib/texture/split.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
   Basic split node unit test :
   - Split (left-to-right)
diff --git a/resources/Materials/TestSuite/stdlib/texture/texcoord.mtlx b/resources/Materials/TestSuite/stdlib/texture/texcoord.mtlx
deleted file mode 100644
index 4fbf6d12d9..0000000000
--- a/resources/Materials/TestSuite/stdlib/texture/texcoord.mtlx
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0"?>
-<materialx version="1.38" colorspace="lin_rec709">
-  <!--
-  Test for texture coordinates. This test makes sure that two texture coordinate nodes with various
-  widths can coexist.
-  -->
-  <standard_surface name="standard_surface" type="surfaceshader" xpos="6.152174" ypos="-0.560345">
-    <input name="base" type="float" value="1" />
-    <input name="base_color" type="color3" nodename="swizzle_vector2_color3" />
-    <input name="specular_roughness" type="float" value="0.1" />
-    <input name="subsurface" type="float" value="0.4" />
-    <input name="subsurface_color" type="color3" nodename="swizzle_vector3_color3" />
-  </standard_surface>
-  <surfacematerial name="surfacematerial" type="material" xpos="8.695652" ypos="0.000000">
-    <input name="surfaceshader" type="surfaceshader" nodename="standard_surface" />
-  </surfacematerial>
-  <texcoord name="texcoord_vector2" type="vector2" xpos="1.666667" ypos="-1.405172" />
-  <texcoord name="texcoord_vector3" type="vector3" xpos="0.268116" ypos="1.068966" />
-  <swizzle name="swizzle_vector3_color3" type="color3" xpos="3.101449" ypos="0.698276">
-    <input name="in" type="vector3" nodename="texcoord_vector3" />
-  </swizzle>
-  <swizzle name="swizzle_vector2_color3" type="color3" xpos="4.260870" ypos="-2.896552">
-    <input name="in" type="vector2" nodename="texcoord_vector2" />
-  </swizzle>
-</materialx>
diff --git a/resources/Materials/TestSuite/stdlib/texture/tiledimage.mtlx b/resources/Materials/TestSuite/stdlib/texture/tiledimage.mtlx
index fa6a09cb9f..2dd6eec1d9 100644
--- a/resources/Materials/TestSuite/stdlib/texture/tiledimage.mtlx
+++ b/resources/Materials/TestSuite/stdlib/texture/tiledimage.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
   Basic tiled image unit test with one image node for each variation in input type.
   A scale and offset of 2,2 and 0.5,0.5 is applied to the texture coordinates
diff --git a/resources/Materials/TestSuite/stdlib/texture/tokenGraph.mtlx b/resources/Materials/TestSuite/stdlib/texture/tokenGraph.mtlx
index 773576466e..4b69c66918 100644
--- a/resources/Materials/TestSuite/stdlib/texture/tokenGraph.mtlx
+++ b/resources/Materials/TestSuite/stdlib/texture/tokenGraph.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!-- use tokens which are defined by the parent nodegraph -->
   <nodegraph name="Tokenized_Image_2k_png">
     <token name="Image_Resolution" type="string" value="2k" uiname="Image Resolution" />
diff --git a/resources/Materials/TestSuite/stdlib/texture/triplanarprojection.mtlx b/resources/Materials/TestSuite/stdlib/texture/triplanarprojection.mtlx
index 4ca06ab2b8..cf21da352b 100644
--- a/resources/Materials/TestSuite/stdlib/texture/triplanarprojection.mtlx
+++ b/resources/Materials/TestSuite/stdlib/texture/triplanarprojection.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
   Basic triplanar mapping unit test.
   -->
diff --git a/resources/Materials/TestSuite/stdlib/units/constant_unit.mtlx b/resources/Materials/TestSuite/stdlib/units/constant_unit.mtlx
index af2fdae138..01030d73b4 100644
--- a/resources/Materials/TestSuite/stdlib/units/constant_unit.mtlx
+++ b/resources/Materials/TestSuite/stdlib/units/constant_unit.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <multiply name="total_scale" type="vector2">
     <input name="in1" type="vector2" value="1.0, 1.0" />
     <input name="in2" type="float" value="10.0" unit="centimeter" unittype="distance" />
diff --git a/resources/Materials/TestSuite/stdlib/units/distance_units.mtlx b/resources/Materials/TestSuite/stdlib/units/distance_units.mtlx
index 5d908f7907..504c57d824 100644
--- a/resources/Materials/TestSuite/stdlib/units/distance_units.mtlx
+++ b/resources/Materials/TestSuite/stdlib/units/distance_units.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <constant name="worldscale" type="vector2">
     <input name="value" type="vector2" value="5.0, 5.0" unit="meter" unittype="distance" />
   </constant>
diff --git a/resources/Materials/TestSuite/stdlib/units/image_unit.mtlx b/resources/Materials/TestSuite/stdlib/units/image_unit.mtlx
index 413c6a0ec7..4ec1310ab9 100644
--- a/resources/Materials/TestSuite/stdlib/units/image_unit.mtlx
+++ b/resources/Materials/TestSuite/stdlib/units/image_unit.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
   Image unit test with one image node for each variation in input type which can support distance units.
   -->
diff --git a/resources/Materials/TestSuite/stdlib/units/standard_surface_unit.mtlx b/resources/Materials/TestSuite/stdlib/units/standard_surface_unit.mtlx
index ab0232e664..cda637f578 100644
--- a/resources/Materials/TestSuite/stdlib/units/standard_surface_unit.mtlx
+++ b/resources/Materials/TestSuite/stdlib/units/standard_surface_unit.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="NG_base">
     <constant name="realscale" type="float">
       <input name="value" type="float" value="1.25" unit="meter" unittype="distance" />
diff --git a/resources/Materials/TestSuite/stdlib/units/texture_units.mtlx b/resources/Materials/TestSuite/stdlib/units/texture_units.mtlx
index 6ffa768c7c..36c2f8d0fc 100644
--- a/resources/Materials/TestSuite/stdlib/units/texture_units.mtlx
+++ b/resources/Materials/TestSuite/stdlib/units/texture_units.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <nodegraph name="Unit_test_inputGraph" fileprefix="resources/Images/">
     <!-- opacity_output -->
     <output name="base_color_output" type="color3" nodename="base_color_image" />
diff --git a/resources/Materials/TestSuite/stdlib/units/tiledimage_unit.mtlx b/resources/Materials/TestSuite/stdlib/units/tiledimage_unit.mtlx
index 67a92daba9..bc6f7f0964 100644
--- a/resources/Materials/TestSuite/stdlib/units/tiledimage_unit.mtlx
+++ b/resources/Materials/TestSuite/stdlib/units/tiledimage_unit.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!--
   Basic tiled image unit test with one image node for each variation in input type.
   A scale and offset of 2,2 and 0.5,0.5 is applied to the texture coordinates
diff --git a/resources/Materials/TestSuite/stdlib/version/multiple_version_test.mtlx b/resources/Materials/TestSuite/stdlib/version/multiple_version_test.mtlx
index 029c84f43e..f066b634de 100644
--- a/resources/Materials/TestSuite/stdlib/version/multiple_version_test.mtlx
+++ b/resources/Materials/TestSuite/stdlib/version/multiple_version_test.mtlx
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<materialx version="1.38">
+<materialx version="1.39">
   <!-- Version 1. Non-default -->
   <nodedef name="ND_myimage_color3_v1" node="myimage" version="1.0" nodegroup="texture2d">
     <input name="file" type="filename" uniform="true" value="resources/Images/grid.png" />

From b26f19e75226163acea0e24b457e3d4649e04b64 Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Sat, 22 Jun 2024 17:07:42 -0700
Subject: [PATCH 36/48] Improvements to color space handling

- Add support for 'none' as a colorspace attribute, specifying that the given color should not be transformed.
- Add support for colorspace attributes on multi-output nodes (e.g. UsdUvTexture), which only affect color-typed outputs.
- Update the 'usd_normal_map.mtlx' and 'usd_uv_texture.mtlx' examples to demonstrate these new capabilities.
- Remove legacy references to colorspace 'none' for physical colors, as it's more accurate in practice to interpret these values as visible colors.
---
 documents/Specification/MaterialX.PBRSpec.md  |  4 +-
 libraries/pbrlib/pbrlib_defs.mtlx             |  4 +-
 .../pbrlib/surfaceshader/usd_normal_map.mtlx  | 29 +++++++------
 .../pbrlib/surfaceshader/usd_uv_texture.mtlx  | 42 ++++---------------
 .../color_management/surface_colorspace.mtlx  | 32 --------------
 source/MaterialXGenShader/ShaderGraph.cpp     | 16 ++++---
 6 files changed, 38 insertions(+), 89 deletions(-)
 delete mode 100644 resources/Materials/TestSuite/stdlib/color_management/surface_colorspace.mtlx

diff --git a/documents/Specification/MaterialX.PBRSpec.md b/documents/Specification/MaterialX.PBRSpec.md
index 64d6c40700..ee85ac4b24 100644
--- a/documents/Specification/MaterialX.PBRSpec.md
+++ b/documents/Specification/MaterialX.PBRSpec.md
@@ -198,8 +198,8 @@ The PBS nodes also make use of the following standard MaterialX types:
 
 
     * `weight` (float): Weight for this BSDF’s contribution, range [0.0, 1.0]. Defaults to 1.0.
-    * `ior `(color3): Index of refraction. Default is (0.18, 0.42, 1.37) with colorspace "none" (approximate IOR for gold).
-    * `extinction` (color3): Extinction coefficient. Default is (3.42, 2.35, 1.77) with colorspace "none" (approximate extinction coefficients for gold).
+    * `ior `(color3): Index of refraction. Default is (0.18, 0.42, 1.37) (approximate IOR for gold).
+    * `extinction` (color3): Extinction coefficient. Default is (3.42, 2.35, 1.77) (approximate extinction coefficients for gold).
     * `roughness` (vector2): Surface roughness. Defaults to (0.05, 0.05).
     * `thinfilm_thickness` (float): The thickness of an iridescent thin film layer applied over the base bsdf, expressed in nanometers. Defaults to 0.0, for no thin film.
     * `thinfilm_ior` (float): The index of refraction of the thin film layer. Defaults to 1.5.
diff --git a/libraries/pbrlib/pbrlib_defs.mtlx b/libraries/pbrlib/pbrlib_defs.mtlx
index 16892d9cfb..a64144b66f 100644
--- a/libraries/pbrlib/pbrlib_defs.mtlx
+++ b/libraries/pbrlib/pbrlib_defs.mtlx
@@ -79,8 +79,8 @@
   -->
   <nodedef name="ND_conductor_bsdf" node="conductor_bsdf" bsdf="R" nodegroup="pbr" doc="A reflection BSDF node based on a microfacet model and a Fresnel curve for conductors/metals.">
     <input name="weight" type="float" value="1.0" uimin="0.0" uimax="1.0" />
-    <input name="ior" type="color3" value="0.183, 0.421, 1.373" colorspace="none" />
-    <input name="extinction" type="color3" value="3.424, 2.346, 1.770" colorspace="none" />
+    <input name="ior" type="color3" value="0.183, 0.421, 1.373" />
+    <input name="extinction" type="color3" value="3.424, 2.346, 1.770" />
     <input name="roughness" type="vector2" value="0.05, 0.05" />
     <input name="thinfilm_thickness" type="float" value="0" unittype="distance" unit="nanometer" />
     <input name="thinfilm_ior" type="float" value="1.5" />
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_normal_map.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_normal_map.mtlx
index 1fccec6cbe..621fba621d 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_normal_map.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_normal_map.mtlx
@@ -1,18 +1,23 @@
 <?xml version="1.0"?>
 <materialx version="1.39" colorspace="lin_rec709">
-  <nodegraph name="NG_usd_normal_map">
-    <tiledimage name="N_tiledimage" type="vector3" nodedef="ND_tiledimage_vector3">
-      <input name="file" type="filename" value="resources/Images/mesh_wire_norm.png" />
-      <input name="uvtiling" type="vector2" value="8.0, 8.0" />
-    </tiledimage>
-    <normalmap name="N_normalmap" type="vector3" nodedef="ND_normalmap_float">
-      <input name="in" type="vector3" nodename="N_tiledimage" />
-      <input name="space" type="string" value="object" />
-    </normalmap>
-    <output name="out" type="vector3" nodename="N_normalmap" />
-  </nodegraph>
+  <texcoord name="N_texcoord" type="vector2" />
+  <multiply name="N_multiply" type="vector2">
+    <input name="in1" type="vector2" nodename="N_texcoord" />
+    <input name="in2" type="vector2" value="8, 8" />
+  </multiply>
+  <UsdUVTexture name="N_texture_normal" type="multioutput">
+    <input name="file" type="filename" value="resources/Images/mesh_wire_norm.png" colorspace="none" />
+    <input name="st" type="vector2" nodename="N_multiply" />
+  </UsdUVTexture>
+  <convert name="N_convert" type="vector3">
+    <input name="in" type="color3" nodename="N_texture_normal" output="rgb" />
+  </convert>
+  <normalmap name="N_normalmap" type="vector3">
+    <input name="in" type="vector3" nodename="N_convert" />
+    <input name="space" type="string" value="object" />
+  </normalmap>
   <UsdPreviewSurface name="N_surface" type="surfaceshader">
-    <input name="normal" type="vector3" output="out" nodegraph="NG_usd_normal_map" />
+    <input name="normal" type="vector3" nodename="N_normalmap" />
     <input name="diffuseColor" type="color3" value="1, 1, 1" />
     <input name="metallic" type="float" value="1" />
     <input name="roughness" type="float" value="0.001" />
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_uv_texture.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_uv_texture.mtlx
index e8f63001dc..ec6d378248 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_uv_texture.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/usd_uv_texture.mtlx
@@ -1,45 +1,17 @@
 <?xml version="1.0"?>
 <materialx version="1.39">
-
-  <!-- UsdUVTexture: version 2.2 test -->
-  <UsdUVTexture name="UsdUVTexture22" type="multioutput" version="2.2">
+  <UsdUVTexture name="texture_base_color" type="multioutput">
     <input name="file" type="filename" value="resources/Images/brass_color.jpg" colorspace="srgb_texture" />
   </UsdUVTexture>
-  <convert name="extractColor" type="color3">
-    <input name="in" type="color4" nodename="UsdUVTexture22" output="rgba" />
-  </convert>
-  <UsdUVTexture name="UsdUVTexture22_rough" type="multioutput" version="2.2">
+  <UsdUVTexture name="texture_roughness" type="multioutput">
     <input name="file" type="filename" value="resources/Images/brass_roughness.jpg" />
   </UsdUVTexture>
-  <extract name="extractRoughness" type="float">
-    <input name="in" type="color4" nodename="UsdUVTexture22_rough" output="rgba" />
-    <input name="index" type="integer" value="0" />
-  </extract>
-
-  <UsdPreviewSurface name="UsdPreviewSurface22" type="surfaceshader" nodedef="ND_UsdPreviewSurface_surfaceshader" version="2.3">
-    <input name="diffuseColor" type="color3" nodename="extractColor" />
-    <input name="roughness" type="float" nodename="extractRoughness" />
+  <UsdPreviewSurface name="UsdPreviewSurface" type="surfaceshader" nodedef="ND_UsdPreviewSurface_surfaceshader">
+    <input name="diffuseColor" type="color3" nodename="texture_base_color" output="rgb" />
+    <input name="roughness" type="float" nodename="texture_roughness" output="r" />
     <input name="metallic" type="float" value="1" />
   </UsdPreviewSurface>
-  <surfacematerial name="USDTexture_Tiled_Brass22" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="UsdPreviewSurface22" />
+  <surfacematerial name="TiledBrass" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="UsdPreviewSurface" />
   </surfacematerial>
-
-  <!-- UsdUVTexture: version 2.3 test. Default is currently 2.3 so no version specifier required -->
-  <UsdUVTexture name="UsdUVTexture23_rough" type="multioutput">
-    <input name="file" type="filename" value="resources/Images/brass_roughness.jpg" />
-  </UsdUVTexture>
-  <UsdUVTexture name="UsdUVTexture23" type="multioutput">
-    <input name="file" type="filename" value="resources/Images/brass_color.jpg" colorspace="srgb_texture" />
-  </UsdUVTexture>
-
-  <UsdPreviewSurface name="UsdPreviewSurface23" type="surfaceshader" nodedef="ND_UsdPreviewSurface_surfaceshader" version="2.3">
-    <input name="diffuseColor" type="color3" nodename="UsdUVTexture23" output="rgb" />
-    <input name="roughness" type="float" nodename="UsdUVTexture23_rough" output="r" />
-    <input name="metallic" type="float" value="1" />
-  </UsdPreviewSurface>
-  <surfacematerial name="USDTexture_Tiled_Brass23" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="UsdPreviewSurface23" />
-  </surfacematerial>
-
 </materialx>
diff --git a/resources/Materials/TestSuite/stdlib/color_management/surface_colorspace.mtlx b/resources/Materials/TestSuite/stdlib/color_management/surface_colorspace.mtlx
deleted file mode 100644
index 7bbe254417..0000000000
--- a/resources/Materials/TestSuite/stdlib/color_management/surface_colorspace.mtlx
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0"?>
-<materialx version="1.39" colorspace="srgb_texture">
-  <nodedef name="ND_NodeA" node="NodeA">
-    <input name="diffColor" type="color3" />
-    <output name="out" type="surfaceshader" />
-  </nodedef>
-  <nodedef name="ND_NodeB" node="NodeB" inherit="ND_NodeA">
-    <output name="out" type="surfaceshader" />
-  </nodedef>
-  <nodegraph name="NG_NodeA" nodedef="ND_NodeA">
-    <oren_nayar_diffuse_bsdf name="diffuseBsdf" type="BSDF">
-      <input name="color" type="color3" interfacename="diffColor" />
-    </oren_nayar_diffuse_bsdf>
-    <surface name="surfaceConstructor" type="surfaceshader">
-      <input name="bsdf" type="BSDF" nodename="diffuseBsdf" />
-    </surface>
-    <output name="out" type="surfaceshader" nodename="surfaceConstructor" />
-  </nodegraph>
-  <nodegraph name="NG_NodeB" nodedef="ND_NodeB" fileprefix="resources/Images/">
-    <tiledimage name="TI_diffColorEffect" type="color3">
-      <input name="file" type="filename" value="wood_color.jpg" />
-    </tiledimage>
-    <NodeA name="NodeA_instanceForNodeB" type="surfaceshader">
-      <input name="diffColor" type="color3" nodename="TI_diffColorEffect" />
-    </NodeA>
-    <output name="out" type="surfaceshader" nodename="NodeA_instanceForNodeB" />
-  </nodegraph>
-  <NodeB name="SR_test" type="surfaceshader" />
-  <surfacematerial name="M_test" type="material">
-    <input name="surfaceshader" type="surfaceshader" nodename="SR_test" />
-  </surfacematerial>
-</materialx>
diff --git a/source/MaterialXGenShader/ShaderGraph.cpp b/source/MaterialXGenShader/ShaderGraph.cpp
index f06c2496ff..0f39b46c32 100644
--- a/source/MaterialXGenShader/ShaderGraph.cpp
+++ b/source/MaterialXGenShader/ShaderGraph.cpp
@@ -633,14 +633,14 @@ void ShaderGraph::applyInputTransforms(ConstNodePtr node, ShaderNodePtr shaderNo
         if (input->hasValue() || input->hasInterfaceName())
         {
             string sourceColorSpace = input->getActiveColorSpace();
-            if (input->getType() == FILENAME_TYPE_STRING && node->isColorType())
+            if (input->getType() == FILENAME_TYPE_STRING && (node->isColorType() || node->isMultiOutputType()))
             {
                 // Adjust the source color space for filename interface names.
                 if (input->hasInterfaceName())
                 {
                     for (ConstNodePtr parentNode : context.getParentNodes())
                     {
-                        if (!parentNode->isColorType())
+                        if (!parentNode->isColorType() && !parentNode->isMultiOutputType())
                         {
                             InputPtr interfaceInput = parentNode->getInput(input->getInterfaceName());
                             string interfaceColorSpace = interfaceInput ? interfaceInput->getActiveColorSpace() : EMPTY_STRING;
@@ -652,9 +652,11 @@ void ShaderGraph::applyInputTransforms(ConstNodePtr node, ShaderNodePtr shaderNo
                     }
                 }
 
-                ShaderOutput* shaderOutput = shaderNode->getOutput();
-                populateColorTransformMap(colorManagementSystem, shaderOutput, sourceColorSpace, targetColorSpace, false);
-                populateUnitTransformMap(unitSystem, shaderOutput, input, targetDistanceUnit, false);
+                for (ShaderOutput* shaderOutput : shaderNode->getOutputs())
+                {
+                    populateColorTransformMap(colorManagementSystem, shaderOutput, sourceColorSpace, targetColorSpace, false);
+                    populateUnitTransformMap(unitSystem, shaderOutput, input, targetDistanceUnit, false);
+                }
             }
             else
             {
@@ -1069,7 +1071,9 @@ void ShaderGraph::populateColorTransformMap(ColorManagementSystemPtr colorManage
     if (!shaderPort ||
         sourceColorSpace.empty() ||
         targetColorSpace.empty() ||
-        sourceColorSpace == targetColorSpace)
+        sourceColorSpace == targetColorSpace ||
+        sourceColorSpace == "none" ||
+        targetColorSpace == "none")
     {
         return;
     }

From 328fde8c5f293c1e6d6b14df0877c533be059855 Mon Sep 17 00:00:00 2001
From: mkuo-lucasfilm <mkuo@lucasfilm.com>
Date: Mon, 24 Jun 2024 07:59:12 -0700
Subject: [PATCH 37/48] Adding LamaGeneralizedSchlick and LamaIridescence Nodes
 (#1897)

1. Added a LamaGeneralizedSchlick node to MaterialX (Renderman definition: https://rmanwiki.pixar.com/display/REN26/LamaGeneralizedSchlick)

2. Added a LamaIridescence node to MaterialX (Renderman definition: https://rmanwiki.pixar.com/display/REN26/LamaIridescence)
---
 .../bxdf/lama/lama_generalized_schlick.mtlx   | 198 ++++++++++++++++++
 libraries/bxdf/lama/lama_iridescence.mtlx     |  77 +++++++
 .../lama/lama_generalized_schlick.mtlx        |  28 +++
 .../surfaceshader/lama/lama_iridescence.mtlx  |  20 ++
 4 files changed, 323 insertions(+)
 create mode 100644 libraries/bxdf/lama/lama_generalized_schlick.mtlx
 create mode 100644 libraries/bxdf/lama/lama_iridescence.mtlx
 create mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_generalized_schlick.mtlx
 create mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_iridescence.mtlx

diff --git a/libraries/bxdf/lama/lama_generalized_schlick.mtlx b/libraries/bxdf/lama/lama_generalized_schlick.mtlx
new file mode 100644
index 0000000000..c8c5f40f5b
--- /dev/null
+++ b/libraries/bxdf/lama/lama_generalized_schlick.mtlx
@@ -0,0 +1,198 @@
+<?xml version="1.0"?>
+<materialx version="1.39" colorspace="acescg">
+  <nodedef name="ND_lama_generalized_schlick" node="LamaGeneralizedSchlick" nodegroup="pbr" doc="Lama generalized schlick" version="1.0" isdefaultversion="true">
+    <input name="reflectionTint" type="color3" value="1.0, 1.0, 1.0" uiname="Reflection Tint" uifolder="Main"
+           doc="Color multiplier for external reflection. It should be used with parcimony, as a non-white value breaks physicality." />
+    <input name="transmissionTint" type="color3" value="1.0, 1.0, 1.0" uiname="Transmission Tint" uifolder="Main"
+           doc="Color multiplier for rays going inside the medium (covers external transmission and internal reflection). It should be used with parcimony, as a non-white value breaks physicality. The prefered way to define the color of a dielectric is through the Interior attributes right below." />
+    <input name="fresnelMode" type="integer" uniform="true" enum="Scientific,Artistic" enumvalues="0,1" value="0" uiname="Fresnel Mode" uifolder="Main"
+           doc="Fresnel mode" />
+    <input name="IOR" type="vector3" value="1.5,1.5,1.5" uiname="IOR" uifolder="Main"
+           doc="Index of refraction (often denoted by eta), defining the color reflected by the surface in the normal direction." />
+    <input name="reflectivity" type="color3" value="0.04, 0.04, 0.04" uiname="Reflectivity" uifolder="Main"
+           doc="Color reflected by the surface in the normal direction." />
+    <input name="reflectivity90" type="color3" value="1.0, 1.0, 1.0" uiname="Reflectivity90" uifolder="Main"
+           doc="Color reflected by the surface at the grazing angle. Should be kept at 1,1,1 for most materials." />
+    <input name="reflectivityProfile" type="float" value="0.2" uiname="ReflectivityProfile" uifolder="Main"
+           doc="The inverse of the exponent to use for Schlick." />
+    <input name="roughness" type="float" value="0.1" uimin="0.0" uimax="1.0" uiname="Roughness" uifolder="Main"
+           doc="Micro-facet distribution roughness." />
+    <input name="normal" type="vector3" defaultgeomprop="Nworld" uiname="Normal" uifolder="Main"
+           doc="Shading normal, typically defined by bump or normal mapping. Defaults to the smooth surface normal if not set." />
+    <input name="anisotropy" type="float" value="0.0" uimin="-1.0" uimax="1.0" uiname="Anisotropy" uifolder="Anisotropy"
+           doc="Defines the amount of anisotropy, changing the co-tangent axis roughness from the original value to 1 (or to 0 with a negative value)." />
+    <input name="anisotropyDirection" type="vector3" defaultgeomprop="Tworld" uiname="Direction" uifolder="Anisotropy"
+           doc="Overrides the surface tangent as the anisotropy direction." />
+    <input name="anisotropyRotation" type="float" value="0.0" uiname="Rotation" uifolder="Anisotropy"
+           doc="Rotates the anisotropy direction (possibly overriden by the previous attribute) around the normal, from 0 to 360 degrees." />
+    <input name="absorptionColor" type="color3" value="1.0, 1.0, 1.0" uiname="Absorption Color" uifolder="Interior"
+           doc="Absorption color" />
+    <input name="absorptionRadius" type="float" value="1.0" uiname="Absorption Radius" uifolder="Interior"
+           doc="Absorption radius" />
+    <input name="scatterColor" type="color3" value="0.0, 0.0, 0.0" uiname="Scatter Color" uifolder="Interior"
+           doc="Scatter color" />
+    <input name="scatterAnisotropy" type="float" value="0.0" uimin="-1.0" uimax="1.0" uiname="Scatter Anisotropy" uifolder="Interior"
+           doc="Scatter anisotropy" />
+    <output name="out" type="BSDF" />
+  </nodedef>
+
+  <nodegraph name="IMPL_lama_generalized_schlick" nodedef="ND_lama_generalized_schlick">
+
+    <!-- Dielectric IOR -->
+    <extract name="ior_float" type="float">
+      <input name="in" type="vector3" interfacename="IOR" />
+      <input name="index" type="integer" value="0" />
+    </extract>
+
+    <!-- Color0 -->
+    <convert name="convert_ior" type="color3">
+      <input name="in" type="vector3" interfacename="IOR" />
+    </convert>
+    <add name="ior_plus_one" type="color3">
+      <input name="in1" type="color3" nodename="convert_ior" />
+      <input name="in2" type="float" value="1" />
+    </add>
+    <subtract name="ior_sub_one" type="color3">
+      <input name="in1" type="color3" nodename="convert_ior" />
+      <input name="in2" type="float" value="1" />
+    </subtract>
+    <divide name="ior_divide" type="color3">
+      <input name="in1" type="color3" nodename="ior_sub_one" />
+      <input name="in2" type="color3" nodename="ior_plus_one" />
+    </divide>
+    <multiply name="ior_multiply" type="color3">
+      <input name="in1" type="color3" nodename="ior_divide" />
+      <input name="in2" type="color3" nodename="ior_divide" />
+    </multiply>
+    <multiply name="ior_reflection_tint" type="color3">
+      <input name="in1" type="color3" nodename="ior_multiply" />
+      <input name="in2" type="color3" interfacename="reflectionTint" />
+    </multiply>
+    <multiply name="reflectivity_reflection_tint" type="color3">
+      <input name="in1" type="color3" interfacename="reflectivity" />
+      <input name="in2" type="color3" interfacename="reflectionTint" />
+    </multiply>
+    <switch name="fresnel_mode_switch_reflection" type="color3">
+      <input name="in1" type="color3" nodename="ior_reflection_tint" />
+      <input name="in2" type="color3" nodename="reflectivity_reflection_tint" />
+      <input name="which" type="integer" interfacename="fresnelMode" />
+    </switch>
+
+    <!-- Color90 -->
+    <multiply name="reflectivity90_reflection_tint" type="color3">
+      <input name="in1" type="color3" interfacename="reflectivity90" />
+      <input name="in2" type="color3" interfacename="reflectionTint" />
+    </multiply>
+
+    <!-- Exponent -->
+    <divide name="exponent" type="float">
+      <input name="in1" type="float" value="1" />
+      <input name="in2" type="float" interfacename="reflectivityProfile" />
+    </divide>
+
+    <!-- Roughness -->
+    <subtract name="roughness_inverse" type="float">
+      <input name="in1" type="float" value="1.0" />
+      <input name="in2" type="float" interfacename="roughness" />
+    </subtract>
+    <ifgreatereq name="delta" type="float">
+      <input name="in1" type="float" nodename="roughness_inverse" />
+      <input name="in2" type="float" interfacename="roughness" />
+      <input name="value1" type="float" interfacename="anisotropy" />
+      <input name="value2" type="float" value="0" />
+    </ifgreatereq>
+    <multiply name="roughness_additional" type="float">
+      <input name="in1" type="float" interfacename="anisotropy" />
+      <input name="in2" type="float" nodename="delta" />
+    </multiply>
+    <add name="roughness_bitangent" type="float">
+      <input name="in1" type="float" interfacename="roughness" />
+      <input name="in2" type="float" nodename="roughness_additional" />
+    </add>
+    <clamp name="roughness_bitangent_clamped" type="float">
+      <input name="in" type="float" nodename="roughness_bitangent" />
+    </clamp>
+    <combine2 name="roughness_linear" type="vector2">
+      <input name="in1" type="float" interfacename="roughness" />
+      <input name="in2" type="float" nodename="roughness_bitangent_clamped" />
+    </combine2>
+    <power name="roughness_anisotropic_squared" type="vector2">
+      <input name="in1" type="vector2" nodename="roughness_linear" />
+      <input name="in2" type="float" value="2" />
+    </power>
+    <max name="roughness_anisotropic_squared_clamped" type="vector2">
+      <input name="in1" type="vector2" nodename="roughness_anisotropic_squared" />
+      <input name="in2" type="float" value="0.000001" />
+    </max>
+
+    <!-- Tangent -->
+    <multiply name="tangent_rotate_degree" type="float">
+      <input name="in1" type="float" interfacename="anisotropyRotation" />
+      <input name="in2" type="float" value="-360" />
+    </multiply>
+    <rotate3d name="tangent_rotate" type="vector3">
+      <input name="in" type="vector3" interfacename="anisotropyDirection" />
+      <input name="amount" type="float" nodename="tangent_rotate_degree" />
+      <input name="axis" type="vector3" interfacename="normal" />
+    </rotate3d>
+    <normalize name="tangent_rotate_normalize" type="vector3">
+      <input name="in" type="vector3" nodename="tangent_rotate" />
+    </normalize>
+
+    <!-- Interior -->
+    <divide name="absorption" type="color3">
+      <input name="in1" type="color3" interfacename="absorptionColor" />
+      <input name="in2" type="float" interfacename="absorptionRadius" />
+    </divide>
+    <convert name="absorption_vector" type="vector3">
+      <input name="in" type="color3" nodename="absorption" />
+    </convert>
+    <convert name="scatter_vector" type="vector3">
+      <input name="in" type="color3" interfacename="scatterColor" />
+    </convert>
+    <anisotropic_vdf name="interior_vdf" type="VDF">
+      <input name="absorption" type="vector3" nodename="absorption_vector" />
+      <input name="scattering" type="vector3" nodename="scatter_vector" />
+      <input name="anisotropy" type="float" interfacename="scatterAnisotropy" />
+    </anisotropic_vdf>
+
+    <!-- BTDF -->
+    <dielectric_bsdf name="transmission_bsdf" type="BSDF">
+      <input name="weight" type="float" value="1.0" />
+      <input name="tint" type="color3" interfacename="transmissionTint" />
+      <input name="ior" type="float" nodename="ior_float" />
+      <input name="roughness" type="vector2" nodename="roughness_anisotropic_squared_clamped" />
+      <input name="normal" type="vector3" interfacename="normal" />
+      <input name="tangent" type="vector3" nodename="tangent_rotate_normalize" />
+      <input name="distribution" type="string" value="ggx" />
+      <input name="scatter_mode" type="string" value="T" />
+    </dielectric_bsdf>
+    <layer name="transmission_layer" type="BSDF">
+      <input name="top" type="BSDF" nodename="transmission_bsdf" />
+      <input name="base" type="VDF" nodename="interior_vdf" />
+    </layer>
+
+    <!-- BRDF -->
+    <generalized_schlick_bsdf name="reflection_generalized_schlick_bsdf" type="BSDF">
+      <input name="weight" type="float" value="1.0" />
+      <input name="color0" type="color3" nodename="fresnel_mode_switch_reflection" />
+      <input name="color90" type="color3" nodename="reflectivity90_reflection_tint" />
+      <input name="exponent" type="float" nodename="exponent" />
+      <input name="roughness" type="vector2" nodename="roughness_anisotropic_squared_clamped" />
+      <input name="normal" type="vector3" interfacename="normal" />
+      <input name="tangent" type="vector3" nodename="tangent_rotate_normalize" />
+      <input name="distribution" type="string" value="ggx" />
+      <input name="scatter_mode" type="string" value="R" />
+    </generalized_schlick_bsdf>
+
+    <!-- BSDF -->
+    <layer name="generalized_schlick_bsdf" type="BSDF">
+      <input name="top" type="BSDF" nodename="reflection_generalized_schlick_bsdf" />
+      <input name="base" type="BSDF" nodename="transmission_layer" />
+    </layer>
+
+    <!-- Output -->
+    <output name="out" type="BSDF" nodename="generalized_schlick_bsdf" />
+
+  </nodegraph>
+</materialx>
diff --git a/libraries/bxdf/lama/lama_iridescence.mtlx b/libraries/bxdf/lama/lama_iridescence.mtlx
new file mode 100644
index 0000000000..914f70ae1b
--- /dev/null
+++ b/libraries/bxdf/lama/lama_iridescence.mtlx
@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+<materialx version="1.39" colorspace="acescg">
+  <nodedef name="ND_lama_iridescence" node="LamaIridescence" nodegroup="pbr" doc="Lama iridescence" version="1.0" isdefaultversion="true">
+    <input name="roughness" type="float" value="0.01" uimin="0.0" uimax="1.0" uiname="Roughness" uifolder="Main"
+           doc="Micro-facet distribution roughness." />
+    <input name="anisotropy" type="float" value="0.0" uimin="-1.0" uimax="1.0" uiname="Anisotropy" uifolder="Anisotropy"
+           doc="Defines the amount of anisotropy, changing the co-tangent axis roughness from the original value to 1 (or to 0 with a negative value)." />
+    <input name="relativeFilmThickness" type="float" value="0.5" uimin="0.0" uimax="1.0" uiname="relativeFilmThickness" uifolder="Main"
+           doc="Relative thin film thickness in the range from 0 to 1 will be scaled to the minimum and maximum thickness, respectively." />
+    <input name="minFilmThickness" type="float" value="400.0" uiname="minFilmThickness" uifolder="Main"
+           doc="Minimum thin film thickness in nanometers, driving the iridescent effect." />
+    <input name="maxFilmThickness" type="float" value="800.0" uiname="maxFilmThickness" uifolder="Main"
+           doc="Maximum thin film thickness in nanometers, driving the iridescent effect." />
+    <input name="filmIOR" type="float" value="1.3" uiname="filmIOR" uifolder="Main"
+           doc="Thin film index of refraction, driving the iridescent effect." />
+    <output name="out" type="BSDF" />
+  </nodedef>
+
+  <nodegraph name="IMPL_lama_iridescence" nodedef="ND_lama_iridescence">
+
+    <!-- Roughness -->
+    <subtract name="roughness_inverse" type="float">
+      <input name="in1" type="float" value="1.0" />
+      <input name="in2" type="float" interfacename="roughness" />
+    </subtract>
+    <ifgreatereq name="delta" type="float">
+      <input name="in1" type="float" nodename="roughness_inverse" />
+      <input name="in2" type="float" interfacename="roughness" />
+      <input name="value1" type="float" interfacename="anisotropy" />
+      <input name="value2" type="float" value="0" />
+    </ifgreatereq>
+    <multiply name="roughness_additional" type="float">
+      <input name="in1" type="float" interfacename="anisotropy" />
+      <input name="in2" type="float" nodename="delta" />
+    </multiply>
+    <add name="roughness_bitangent" type="float">
+      <input name="in1" type="float" interfacename="roughness" />
+      <input name="in2" type="float" nodename="roughness_additional" />
+    </add>
+    <clamp name="roughness_bitangent_clamped" type="float">
+      <input name="in" type="float" nodename="roughness_bitangent" />
+    </clamp>
+    <combine2 name="roughness_linear" type="vector2">
+      <input name="in1" type="float" interfacename="roughness" />
+      <input name="in2" type="float" nodename="roughness_bitangent_clamped" />
+    </combine2>
+    <power name="roughness_anisotropic_squared" type="vector2">
+      <input name="in1" type="vector2" nodename="roughness_linear" />
+      <input name="in2" type="float" value="2" />
+    </power>
+    <max name="roughness_anisotropic_squared_clamped" type="vector2">
+      <input name="in1" type="vector2" nodename="roughness_anisotropic_squared" />
+      <input name="in2" type="float" value="0.000001" />
+    </max>
+
+    <!-- Thinfilm Thickness -->
+    <mix name="thinfilm_thickness" type="float">
+      <input name="fg" type="float" interfacename="maxFilmThickness" />
+      <input name="bg" type="float" interfacename="minFilmThickness" />
+      <input name="mix" type="float" interfacename="relativeFilmThickness" />
+    </mix>
+
+    <!-- BSDF -->
+    <dielectric_bsdf name="iridescence_bsdf" type="BSDF">
+      <input name="roughness" type="vector2" nodename="roughness_anisotropic_squared_clamped" />
+      <input name="ior" type="float" value="1.0" />
+      <input name="thinfilm_thickness" type="float" nodename="thinfilm_thickness" />
+      <input name="thinfilm_ior" type="float" interfacename="filmIOR" />
+      <input name="distribution" type="string" value="ggx" />
+      <input name="scatter_mode" type="string" value="RT" />
+    </dielectric_bsdf>
+
+    <!-- Output -->
+    <output name="out" type="BSDF" nodename="iridescence_bsdf" />
+
+  </nodegraph>
+</materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_generalized_schlick.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_generalized_schlick.mtlx
new file mode 100644
index 0000000000..0a6cff3c53
--- /dev/null
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_generalized_schlick.mtlx
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<materialx version="1.38" colorspace="acescg">
+
+  <!-- LamaGeneralizedSchlick -->
+  <LamaGeneralizedSchlick name="LamaGeneralizedSchlick" type="BSDF">
+    <input name="reflectionTint" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="transmissionTint" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="fresnelMode" type="integer" value="0" />
+    <input name="IOR" type="vector3" value="1.5,1.5,1.5" />
+    <input name="reflectivity" type="color3" value="0.04, 0.04, 0.04" />
+    <input name="reflectivity90" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="reflectivityProfile" type="float" value="0.2" />
+    <input name="roughness" type="float" value="0.1" />
+    <input name="anisotropy" type="float" value="0.0" />
+    <input name="anisotropyRotation" type="float" value="0.0" />
+    <input name="absorptionColor" type="color3" value="1.0, 1.0, 1.0" />
+    <input name="absorptionRadius" type="float" value="1.0" />
+    <input name="scatterColor" type="color3" value="0.0, 0.0, 0.0" />
+    <input name="scatterAnisotropy" type="float" value="0.0" />
+  </LamaGeneralizedSchlick>
+  <surface name="LamaGeneralizedSchlickSurface" type="surfaceshader">
+    <input name="bsdf" type="BSDF" nodename="LamaGeneralizedSchlick" />
+  </surface>
+  <surfacematerial name="LamaGeneralizedSchlickTest" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaGeneralizedSchlickSurface" />
+  </surfacematerial>
+
+</materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_iridescence.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_iridescence.mtlx
new file mode 100644
index 0000000000..a6bc228773
--- /dev/null
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_iridescence.mtlx
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<materialx version="1.38" colorspace="acescg">
+
+  <!-- LamaIridescence -->
+  <LamaIridescence name="LamaIridescence" type="BSDF">
+    <input name="roughness" type="float" value="0.01" />
+    <input name="anisotropy" type="float" value="0.0" />
+    <input name="relativeFilmThickness" type="float" value="0.5" />
+    <input name="minFilmThickness" type="float" value="400.0" />
+    <input name="maxFilmThickness" type="float" value="800.0" />
+    <input name="filmIOR" type="float" value="1.3" />
+  </LamaIridescence>
+  <surface name="LamaIridescenceSurface" type="surfaceshader">
+    <input name="bsdf" type="BSDF" nodename="LamaIridescence" />
+  </surface>
+  <surfacematerial name="LamaIridescenceTest" type="material">
+    <input name="surfaceshader" type="surfaceshader" nodename="LamaIridescenceSurface" />
+  </surfacematerial>
+
+</materialx>

From 66ac446459d47ceb0e9e5206e79e632854cc0a79 Mon Sep 17 00:00:00 2001
From: Malia Kuo <mkuo@lucasfilm.com>
Date: Tue, 25 Jun 2024 10:20:57 -0700
Subject: [PATCH 38/48] Adding LamaSurface Node (#1901)

Adding initial support for LamaSurface node (pixar renderman definition: https://rmanwiki.pixar.com/display/REN26/LamaSurface)
- LamaSurface has two inputs of BSDF type and one input of float type, and returns a surfacematerial
- LamaSurface node example is commented out, as there's an issue with the shader generation process, which doesn't yet support the notion of a custom node that returns a surfacematerial
---
 libraries/bxdf/lama/lama_surface.mtlx         | 28 ++++++++++++++++
 .../surfaceshader/lama/lama_surface.mtlx      | 33 +++++++++++++++++++
 2 files changed, 61 insertions(+)
 create mode 100644 libraries/bxdf/lama/lama_surface.mtlx
 create mode 100644 resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_surface.mtlx

diff --git a/libraries/bxdf/lama/lama_surface.mtlx b/libraries/bxdf/lama/lama_surface.mtlx
new file mode 100644
index 0000000000..4ffa9a63df
--- /dev/null
+++ b/libraries/bxdf/lama/lama_surface.mtlx
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<materialx version="1.39" colorspace="acescg">
+  <nodedef name="ND_lama_surface" node="LamaSurface" nodegroup="pbr" version="1.0" isdefaultversion="true">
+    <input name="materialFront" uiname="Material Front" type="BSDF" 
+           doc="This is the material that defines the front facing result." />
+    <input name="materialBack" uiname="Material Back" type="BSDF" 
+           doc="This is the material that defines the back facing result." />
+    <input name="presence" type="float" value="1.0"
+           doc="This connection allows you to define the visibility of a surface using a pattern connection." />
+    <output name="out" type="material" />
+  </nodedef>
+
+  <nodegraph name="NG_lama_surface" nodedef="ND_lama_surface">
+    <surface name="front" type="surfaceshader">
+      <input name="bsdf" type="BSDF" interfacename="materialFront" />
+      <input name="opacity" type="float" interfacename="presence" />
+    </surface>
+    <surface name="back" type="surfaceshader">
+      <input name="bsdf" type="BSDF" interfacename="materialBack" />
+      <input name="opacity" type="float" interfacename="presence" />
+    </surface>
+    <surfacematerial name="surface_material" type="material">
+      <input name="surfaceshader" type="surfaceshader" nodename="front" />
+      <input name="backsurfaceshader" type="surfaceshader" nodename="back" />
+    </surfacematerial>
+    <output name="out" type="material" nodename="surface_material" />
+  </nodegraph>
+</materialx>
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_surface.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_surface.mtlx
new file mode 100644
index 0000000000..8a50c2d8a1
--- /dev/null
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/lama/lama_surface.mtlx
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<materialx version="1.39" colorspace="acescg">
+
+  <!-- LamaConductor -->
+  <LamaConductor name="LamaConductor" type="BSDF">
+    <input name="tint" type="color3" value="1, 1, 1" />
+    <input name="fresnelMode" type="integer" value="0" />
+    <input name="IOR" type="vector3" value="0.180000007153,0.419999986887,1.37000000477" />
+    <input name="extinction" type="vector3" value="3.42000007629,2.34999990463,1.76999998093" />
+    <input name="reflectivity" type="color3" value="0.9450, 0.7772, 0.3737" />
+    <input name="edgeColor" type="color3" value="0.9979, 0.9813, 0.7523" />
+    <input name="roughness" type="float" value="0.1" />
+    <input name="anisotropy" type="float" value="0.0" />
+    <input name="anisotropyRotation" type="float" value="0.0" />
+  </LamaConductor>
+
+  <!-- LamaDiffuse -->
+  <LamaDiffuse name="LamaDiffuse" type="BSDF">
+    <input name="color" type="color3" value="0.1, 0.2, 0.3" />
+    <input name="roughness" type="float" value="0.5" />
+    <input name="energyCompensation" type="float" value="1.0" />
+  </LamaDiffuse>
+
+  <!-- LamaSurface -->
+  <!--
+  <LamaSurface name="LamaSurface" type="material">
+    <input name="materialFront" type="BSDF" nodename="LamaDiffuse" />
+    <input name="materialBack" type="BSDF" nodename="LamaConductor" />
+    <input name="presence" type="float" value="1.0" />
+  </LamaSurface>
+  -->
+
+</materialx>

From 723cebd6fd081f2570b721fc6fe23347b7bcaea5 Mon Sep 17 00:00:00 2001
From: ld-kerley <154285602+ld-kerley@users.noreply.github.com>
Date: Tue, 25 Jun 2024 10:21:53 -0700
Subject: [PATCH 39/48] Add logical operator node definitions (#1896)

When experimenting with some of the `<convert>` nodes I found I really wanted a logcical `<not>` to implement `ND_convert_integer_boolean` as a nodegraph using `<ifequal>`.

We actually have these logical operators in the RealityKit MaterialX nodes already (recently shared publicly at WWDC 2024), so I thought it might be useful to propose we add them to the standard library.
---
 .../Specification/MaterialX.Specification.md  | 29 +++++++++++++
 .../stdlib/genglsl/stdlib_genglsl_impl.mtlx   |  8 ++++
 .../stdlib/genmdl/stdlib_genmdl_impl.mtlx     |  8 ++++
 .../stdlib/genmsl/stdlib_genmsl_impl.mtlx     |  8 ++++
 .../stdlib/genosl/stdlib_genosl_impl.mtlx     |  8 ++++
 libraries/stdlib/stdlib_defs.mtlx             | 43 +++++++++++++++++++
 libraries/stdlib/stdlib_ng.mtlx               | 32 ++++++++++++++
 .../stdlib/conditional/conditional_logic.mtlx | 34 +++++++++++++++
 8 files changed, 170 insertions(+)
 create mode 100644 resources/Materials/TestSuite/stdlib/conditional/conditional_logic.mtlx

diff --git a/documents/Specification/MaterialX.Specification.md b/documents/Specification/MaterialX.Specification.md
index caee116334..1233be4ce7 100644
--- a/documents/Specification/MaterialX.Specification.md
+++ b/documents/Specification/MaterialX.Specification.md
@@ -61,6 +61,7 @@ This document describes the core MaterialX specification.  Companion documents [
 
  [Standard Operator Nodes](#standard-operator-nodes)  
   [Math Nodes](#math-nodes)  
+  [Logical Operator Nodes](#logical-operator-nodes)  
   [Adjustment Nodes](#adjustment-nodes)  
   [Compositing Nodes](#compositing-nodes)  
   [Conditional Nodes](#conditional-nodes)  
@@ -1499,6 +1500,34 @@ Math nodes have one or two spatially-varying inputs, and are used to perform a m
     * `in` (any type): the nodename to be connected to the Dot node's "in" input.  Unlike inputs on other node types, the &lt;dot> node's input is specifically disallowed to provide a `channels` attribute: input data can only be passed through unmodified.
 
 
+### Logical Operator Nodes
+
+Logical operator nodes have one or two boolean typed inputs, and are used to construct higher level logical flow through the nodegraph.
+
+<a id="node-and"> </a>
+
+* **`and`**: logically And the two input boolean values.
+  * `in1` (boolean): the value or nodename for the first input; the default is false.
+  * `in2` (boolean): the value or nodename for the second input; the default is false.
+
+<a id="node-or"> </a>
+
+* **`or`**: logically Inclusive Or the two input boolean values.
+  * `in1` (boolean): the value or nodename for the first input; the default is false.
+  * `in2` (boolean): the value or nodename for the second input; the default is false.
+
+<a id="node-xor"> </a>
+
+* **`xor`**: logically Exclusive Or the two input boolean values.
+  * `in1` (boolean): the value or nodename for the first input; the default is false.
+  * `in2` (boolean): the value or nodename for the second input; the default is false.
+
+<a id="node-not"> </a>
+
+* **`not`**: logically Not the input boolean value.
+  * `in1` (boolean): the value or nodename for the first input; the default is false.
+  * `in2` (boolean): the value or nodename for the second input; the default is false.
+
 
 ### Adjustment Nodes
 
diff --git a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
index 0c8f949e70..bf11d8f4e8 100644
--- a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
+++ b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
@@ -730,6 +730,14 @@
   <!-- <heighttonormal> -->
   <implementation name="IM_heighttonormal_vector3_genglsl" nodedef="ND_heighttonormal_vector3" target="genglsl" />
 
+  <!-- ======================================================================== -->
+  <!-- Logical operator nodes                                                   -->
+  <!-- ======================================================================== -->
+
+  <implementation name="IM_logical_and_genglsl" nodedef="ND_logical_and" target="genglsl" sourcecode="{{in1}} && {{in2}}"/>
+  <implementation name="IM_logical_or_genglsl" nodedef="ND_logical_or" target="genglsl" sourcecode="{{in1}} || {{in2}}"/>
+  <implementation name="IM_logical_not_genglsl" nodedef="ND_logical_not" target="genglsl" sourcecode="!{{in}}"/>
+
   <!-- ======================================================================== -->
   <!-- Organization nodes                                                       -->
   <!-- ======================================================================== -->
diff --git a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
index 297b69b1ee..b09bc7cac9 100644
--- a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
+++ b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
@@ -740,6 +740,14 @@
   <!-- <heighttonormal> -->
   <implementation name="IM_heighttonormal_vector3_genmdl" nodedef="ND_heighttonormal_vector3" target="genmdl" />
 
+  <!-- ======================================================================== -->
+  <!-- Logical operator nodes                                                   -->
+  <!-- ======================================================================== -->
+
+  <implementation name="IM_logical_and_genmdl" nodedef="ND_logical_and" target="genmdl" sourcecode="{{in1}} && {{in2}}"/>
+  <implementation name="IM_logical_or_genmdl" nodedef="ND_logical_or" target="genmdl" sourcecode="{{in1}} || {{in2}}"/>
+  <implementation name="IM_logical_not_genmdl" nodedef="ND_logical_not" target="genmdl" sourcecode="!{{in}}"/>
+
   <!-- ======================================================================== -->
   <!-- Organization nodes                                                       -->
   <!-- ======================================================================== -->
diff --git a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
index 4ebb3b5fca..51b678b702 100644
--- a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
+++ b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
@@ -730,6 +730,14 @@
   <!-- <heighttonormal> -->
   <implementation name="IM_heighttonormal_vector3_genmsl" nodedef="ND_heighttonormal_vector3" target="genmsl" />
 
+  <!-- ======================================================================== -->
+  <!-- Logical operator nodes                                                   -->
+  <!-- ======================================================================== -->
+
+  <implementation name="IM_logical_and_genmsl" nodedef="ND_logical_and" target="genmsl" sourcecode="{{in1}} && {{in2}}"/>
+  <implementation name="IM_logical_or_genmsl" nodedef="ND_logical_or" target="genmsl" sourcecode="{{in1}} || {{in2}}"/>
+  <implementation name="IM_logical_not_genmsl" nodedef="ND_logical_not" target="genmsl" sourcecode="!{{in}}"/>
+
   <!-- ======================================================================== -->
   <!-- Organization nodes                                                       -->
   <!-- ======================================================================== -->
diff --git a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
index 65630f92ee..c0537324f4 100644
--- a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
+++ b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
@@ -731,6 +731,14 @@
   <!-- <heighttonormal> -->
   <implementation name="IM_heighttonormal_vector3_genosl" nodedef="ND_heighttonormal_vector3" file="mx_heighttonormal_vector3.osl" function="mx_heighttonormal_vector3" target="genosl" />
 
+  <!-- ======================================================================== -->
+  <!-- Logical operator nodes                                                   -->
+  <!-- ======================================================================== -->
+
+  <implementation name="IM_logical_and_genosl" nodedef="ND_logical_and" target="genosl" sourcecode="{{in1}} && {{in2}}"/>
+  <implementation name="IM_logical_or_genosl" nodedef="ND_logical_or" target="genosl" sourcecode="{{in1}} || {{in2}}"/>
+  <implementation name="IM_logical_not_genosl" nodedef="ND_logical_not" target="genosl" sourcecode="!{{in}}"/>
+
   <!-- ======================================================================== -->
   <!-- Organization nodes                                                       -->
   <!-- ======================================================================== -->
diff --git a/libraries/stdlib/stdlib_defs.mtlx b/libraries/stdlib/stdlib_defs.mtlx
index 00a54dfab8..24541d3812 100644
--- a/libraries/stdlib/stdlib_defs.mtlx
+++ b/libraries/stdlib/stdlib_defs.mtlx
@@ -4666,6 +4666,49 @@
     <output name="out" type="vector3" default="0.5, 0.5, 1.0" />
   </nodedef>
 
+  <!-- ======================================================================== -->
+  <!-- Logical operator nodes                                                   -->
+  <!-- ======================================================================== -->
+
+  <!--
+    Node: <and>
+    Logical And operation for two boolean values.
+  -->
+  <nodedef name="ND_logical_and" node="and" nodegroup="conditional">
+    <input name="in1" type="boolean" value="false" />
+    <input name="in2" type="boolean" value="false" />
+    <output name="out" type="boolean" defaultinput="in1" />
+  </nodedef>
+
+  <!--
+    Node: <or>
+    Logical Inclusive Or operation for two boolean values.
+  -->
+  <nodedef name="ND_logical_or" node="or" nodegroup="conditional">
+    <input name="in1" type="boolean" value="false" />
+    <input name="in2" type="boolean" value="false" />
+    <output name="out" type="boolean" defaultinput="in1" />
+  </nodedef>
+
+  <!--
+    Node: <xor>
+    Logical Exclusive Or operation for two boolean values.
+  -->
+  <nodedef name="ND_logical_xor" node="xor" nodegroup="conditional">
+    <input name="in1" type="boolean" value="false" />
+    <input name="in2" type="boolean" value="false" />
+    <output name="out" type="boolean" defaultinput="in1" />
+  </nodedef>
+
+  <!--
+    Node: <not>
+    Returns logical Not of input.
+  -->
+  <nodedef name="ND_logical_not" node="not" nodegroup="conditional">
+    <input name="in" type="boolean" value="false" />
+    <output name="out" type="boolean" default="true"/>
+  </nodedef>
+
   <!-- ======================================================================== -->
   <!-- Organization nodes                                                       -->
   <!-- ======================================================================== -->
diff --git a/libraries/stdlib/stdlib_ng.mtlx b/libraries/stdlib/stdlib_ng.mtlx
index 03ddc81681..37a4360c7b 100644
--- a/libraries/stdlib/stdlib_ng.mtlx
+++ b/libraries/stdlib/stdlib_ng.mtlx
@@ -5409,4 +5409,36 @@
     <output name="out" type="matrix44" nodename="ifgreater_1" />
   </nodegraph>
 
+
+  <!-- ======================================================================== -->
+  <!-- Logical operator nodes                                                   -->
+  <!-- ======================================================================== -->
+
+  <!--
+    Node: <xor>
+    Logical XOR operation for two boolean values.
+  -->
+  <nodegraph name="NG_logical_xor" nodedef="ND_logical_xor">
+    <not name="not_in1" type="boolean">
+      <input name="in" type="boolean" interfacename="in1"/>
+    </not>
+    <not name="not_in2" type="boolean">
+      <input name="in" type="boolean" interfacename="in2"/>
+    </not>
+    <and name="in1_and_not_in2" type="boolean">
+      <input name="in1" type="boolean" interfacename="in1" />
+      <input name="in2" type="boolean" nodename="not_in2" />
+    </and>
+    <and name="in2_and_not_in1" type="boolean">
+      <input name="in1" type="boolean" interfacename="in2" />
+      <input name="in2" type="boolean" nodename="not_in1" />
+    </and>
+    <or name="or" type="boolean">
+      <input name="in1" type="boolean" nodename="in1_and_not_in2"/>
+      <input name="in2" type="boolean" nodename="in2_and_not_in1"/>
+    </or>
+    <output name="out" type="boolean" nodename="or" />
+  </nodegraph>
+
+
 </materialx>
diff --git a/resources/Materials/TestSuite/stdlib/conditional/conditional_logic.mtlx b/resources/Materials/TestSuite/stdlib/conditional/conditional_logic.mtlx
new file mode 100644
index 0000000000..d931b5bf6e
--- /dev/null
+++ b/resources/Materials/TestSuite/stdlib/conditional/conditional_logic.mtlx
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<materialx version="1.38">
+  <!--
+  Basic conditional logic function tests each test is in a separate graph.
+  -->
+  <nodegraph name="and_boolean">
+    <and name="and" type="boolean">
+      <input name="in1" type="boolean" value="true" />
+      <input name="in2" type="boolean" value="true" />
+    </and>
+    <output name="out" type="boolean" nodename="and" />
+  </nodegraph>
+  <nodegraph name="or_boolean">
+    <or name="or" type="boolean">
+      <input name="in1" type="boolean" value="true" />
+      <input name="in2" type="boolean" value="false" />
+    </or>
+    <output name="out" type="boolean" nodename="or" />
+  </nodegraph>
+  <nodegraph name="xor_boolean">
+    <xor name="xor" type="boolean">
+      <input name="in1" type="boolean" value="true" />
+      <input name="in2" type="boolean" value="false" />
+    </xor>
+    <output name="out" type="boolean" nodename="xor" />
+  </nodegraph>
+  <nodegraph name="and_boolean">
+    <not name="not" type="boolean">
+      <input name="in" type="boolean" value="false" />
+    </not>
+    <output name="out" type="boolean" nodename="not" />
+  </nodegraph>
+
+</materialx>

From 47c68d9fe273708bcc90040e99c68ba5c2921a6b Mon Sep 17 00:00:00 2001
From: Pablo Delgado <private@pablode.com>
Date: Tue, 25 Jun 2024 22:34:49 +0200
Subject: [PATCH 40/48] Change subsurface_bsdf radius from vector3 to color3
 (#1834)

This was changed in the 1.39 spec, but is not reflected in the code yet.
---
 libraries/bxdf/lama/lama_sss.mtlx                   | 13 +++++--------
 libraries/bxdf/open_pbr_surface.mtlx                |  9 +++------
 libraries/bxdf/standard_surface.mtlx                |  9 +++------
 .../pbrlib/genosl/legacy/mx_subsurface_bsdf.osl     |  2 +-
 libraries/pbrlib/genosl/mx_subsurface_bsdf.osl      |  2 +-
 libraries/pbrlib/pbrlib_defs.mtlx                   |  2 +-
 .../TestSuite/pbrlib/surfaceshader/surface_ops.mtlx |  2 +-
 source/MaterialXCore/Version.cpp                    | 12 ++++++++++++
 source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl |  4 ++--
 9 files changed, 29 insertions(+), 26 deletions(-)

diff --git a/libraries/bxdf/lama/lama_sss.mtlx b/libraries/bxdf/lama/lama_sss.mtlx
index 1646a09570..ded26871ff 100644
--- a/libraries/bxdf/lama/lama_sss.mtlx
+++ b/libraries/bxdf/lama/lama_sss.mtlx
@@ -45,15 +45,12 @@
   <nodegraph name="IMPL_lama_sss" nodedef="ND_lama_sss">
 
     <!-- DMFP -->
-    <convert name="subsurface_radius_vector" type="vector3">
-      <input name="in" type="color3" interfacename="sssRadius" />
-    </convert>
-    <multiply name="subsurface_radius_scaled" type="vector3">
-      <input name="in1" type="vector3" nodename="subsurface_radius_vector" />
+    <multiply name="subsurface_radius_scaled" type="color3">
+      <input name="in1" type="color3" interfacename="sssRadius" />
       <input name="in2" type="float" interfacename="sssScale" />
     </multiply>
-    <multiply name="subsurface_multiply_unitlength" type="vector3">
-      <input name="in1" type="vector3" nodename="subsurface_radius_scaled" />
+    <multiply name="subsurface_multiply_unitlength" type="color3">
+      <input name="in1" type="color3" nodename="subsurface_radius_scaled" />
       <input name="in2" type="float" interfacename="sssUnitLength" />
     </multiply>
 
@@ -61,7 +58,7 @@
     <subsurface_bsdf name="subsurface_bsdf" type="BSDF">
       <input name="weight" type="float" value="1.0" />
       <input name="color" type="color3" interfacename="color" />
-      <input name="radius" type="vector3" nodename="subsurface_multiply_unitlength" />
+      <input name="radius" type="color3" nodename="subsurface_multiply_unitlength" />
       <input name="anisotropy" type="float" interfacename="sssAnisotropy" />
       <input name="normal" type="vector3" interfacename="normal" />
     </subsurface_bsdf>
diff --git a/libraries/bxdf/open_pbr_surface.mtlx b/libraries/bxdf/open_pbr_surface.mtlx
index 665e369f4b..edd44a5858 100644
--- a/libraries/bxdf/open_pbr_surface.mtlx
+++ b/libraries/bxdf/open_pbr_surface.mtlx
@@ -177,16 +177,13 @@
     </mix>
 
     <!-- Subsurface (non-thin-walled) -->
-    <convert name="subsurface_radius_vector" type="vector3">
-      <input name="in" type="color3" interfacename="subsurface_radius_scale" />
-    </convert>
-    <multiply name="subsurface_radius_scaled" type="vector3">
-      <input name="in1" type="vector3" nodename="subsurface_radius_vector" />
+    <multiply name="subsurface_radius_scaled" type="color3">
+      <input name="in1" type="color3" interfacename="subsurface_radius_scale" />
       <input name="in2" type="float" interfacename="subsurface_radius" />
     </multiply>
     <subsurface_bsdf name="subsurface_bsdf" type="BSDF">
       <input name="color" type="color3" nodename="subsurface_color_nonnegative" />
-      <input name="radius" type="vector3" nodename="subsurface_radius_scaled" />
+      <input name="radius" type="color3" nodename="subsurface_radius_scaled" />
       <input name="anisotropy" type="float" interfacename="subsurface_scatter_anisotropy" />
       <input name="normal" type="vector3" interfacename="geometry_normal" />
     </subsurface_bsdf>
diff --git a/libraries/bxdf/standard_surface.mtlx b/libraries/bxdf/standard_surface.mtlx
index fe87f260b0..20ef806699 100644
--- a/libraries/bxdf/standard_surface.mtlx
+++ b/libraries/bxdf/standard_surface.mtlx
@@ -230,17 +230,14 @@
       <input name="color" type="color3" nodename="coat_affected_subsurface_color" />
       <input name="normal" type="vector3" interfacename="normal" />
     </translucent_bsdf>
-    <convert name="subsurface_radius_vector" type="vector3">
-      <input name="in" type="color3" interfacename="subsurface_radius" />
-    </convert>
-    <multiply name="subsurface_radius_scaled" type="vector3">
-      <input name="in1" type="vector3" nodename="subsurface_radius_vector" />
+    <multiply name="subsurface_radius_scaled" type="color3">
+      <input name="in1" type="color3" interfacename="subsurface_radius" />
       <input name="in2" type="float" interfacename="subsurface_scale" />
     </multiply>
     <subsurface_bsdf name="subsurface_bsdf" type="BSDF">
       <input name="weight" type="float" value="1.0" />
       <input name="color" type="color3" nodename="coat_affected_subsurface_color" />
-      <input name="radius" type="vector3" nodename="subsurface_radius_scaled" />
+      <input name="radius" type="color3" nodename="subsurface_radius_scaled" />
       <input name="anisotropy" type="float" interfacename="subsurface_anisotropy" />
       <input name="normal" type="vector3" interfacename="normal" />
     </subsurface_bsdf>
diff --git a/libraries/pbrlib/genosl/legacy/mx_subsurface_bsdf.osl b/libraries/pbrlib/genosl/legacy/mx_subsurface_bsdf.osl
index 17a4aff2cb..da0e3cc12a 100644
--- a/libraries/pbrlib/genosl/legacy/mx_subsurface_bsdf.osl
+++ b/libraries/pbrlib/genosl/legacy/mx_subsurface_bsdf.osl
@@ -1,4 +1,4 @@
-void mx_subsurface_bsdf(float weight, color _color, vector radius, float anisotropy, normal N, output BSDF bsdf)
+void mx_subsurface_bsdf(float weight, color _color, color radius, float anisotropy, normal N, output BSDF bsdf)
 {
     // TODO: Subsurface closure is not supported by vanilla OSL.
     bsdf.response = _color * weight * diffuse(N);
diff --git a/libraries/pbrlib/genosl/mx_subsurface_bsdf.osl b/libraries/pbrlib/genosl/mx_subsurface_bsdf.osl
index 826eee2bd6..d3e520b137 100644
--- a/libraries/pbrlib/genosl/mx_subsurface_bsdf.osl
+++ b/libraries/pbrlib/genosl/mx_subsurface_bsdf.osl
@@ -1,4 +1,4 @@
-void mx_subsurface_bsdf(float weight, color _color, vector radius, float anisotropy, normal N, output BSDF bsdf)
+void mx_subsurface_bsdf(float weight, color _color, color radius, float anisotropy, normal N, output BSDF bsdf)
 {
     // TODO: Subsurface closure is not supported by vanilla OSL.
     bsdf = _color * weight * diffuse(N);
diff --git a/libraries/pbrlib/pbrlib_defs.mtlx b/libraries/pbrlib/pbrlib_defs.mtlx
index a64144b66f..2e71f80611 100644
--- a/libraries/pbrlib/pbrlib_defs.mtlx
+++ b/libraries/pbrlib/pbrlib_defs.mtlx
@@ -117,7 +117,7 @@
   <nodedef name="ND_subsurface_bsdf" node="subsurface_bsdf" bsdf="R" nodegroup="pbr" doc="A subsurface scattering BSDF for true subsurface scattering.">
     <input name="weight" type="float" value="1.0" uimin="0.0" uimax="1.0" />
     <input name="color" type="color3" value="0.18, 0.18, 0.18" />
-    <input name="radius" type="vector3" value="1.0, 1.0, 1.0" />
+    <input name="radius" type="color3" value="1.0, 1.0, 1.0" />
     <input name="anisotropy" type="float" value="0.0" />
     <input name="normal" type="vector3" defaultgeomprop="Nworld" />
     <output name="out" type="BSDF" />
diff --git a/resources/Materials/TestSuite/pbrlib/surfaceshader/surface_ops.mtlx b/resources/Materials/TestSuite/pbrlib/surfaceshader/surface_ops.mtlx
index 8974d4f8d4..825491a45b 100644
--- a/resources/Materials/TestSuite/pbrlib/surfaceshader/surface_ops.mtlx
+++ b/resources/Materials/TestSuite/pbrlib/surfaceshader/surface_ops.mtlx
@@ -7,7 +7,7 @@
     <subsurface_bsdf name="subsurface_brdf1" type="BSDF">
       <input name="weight" type="float" value="1.0" />
       <input name="color" type="color3" value="0.18, 0.18, 0.18" />
-      <input name="radius" type="vector3" value="1.0, 1.0, 1.0" />
+      <input name="radius" type="color3" value="1.0, 1.0, 1.0" />
       <input name="anisotropy" type="float" value="0.0" />
       <input name="normal" type="vector3" value="0.0, 0.0, 0.0" />
     </subsurface_bsdf>
diff --git a/source/MaterialXCore/Version.cpp b/source/MaterialXCore/Version.cpp
index 5fd7829d56..9c0022bd6a 100644
--- a/source/MaterialXCore/Version.cpp
+++ b/source/MaterialXCore/Version.cpp
@@ -1130,6 +1130,18 @@ void Document::upgradeVersion()
                     unusedNodes.push_back(top);
                 }
             }
+            else if (nodeCategory == "subsurface_bsdf")
+            {
+                InputPtr radiusInput = node->getInput("radius");
+                if (radiusInput && radiusInput->getType() == "vector3")
+                {
+                    GraphElementPtr graph = node->getAncestorOfType<GraphElement>();
+                    NodePtr convertNode = graph->addNode("convert", graph->createValidChildName("convert"), "color3");
+                    copyInputWithBindings(node, "radius", convertNode, "in");
+                    radiusInput->setConnectedNode(convertNode);
+                    radiusInput->setType("color3");
+                }
+            }
             else if (nodeCategory == "switch")
             {
                 // Upgrade switch nodes from 5 to 10 inputs, handling the fallback behavior for
diff --git a/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl b/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl
index 5e2e74e733..ef2e090a49 100644
--- a/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl
+++ b/source/MaterialXGenMdl/mdl/materialx/pbrlib_1_6.mdl
@@ -333,7 +333,7 @@ export material mx_generalized_schlick_bsdf(
 export material mx_subsurface_bsdf(
     float  mxp_weight    = 1.0 [[ anno::unused() ]],
     color  mxp_color     = color(0.18),
-    float3 mxp_radius    = float3(1.0), // TODO: should probably be a color in MTLX Spec
+    color  mxp_radius    = color(1.0),
     float  mxp_anisotropy = 0.0,
     float3 mxp_normal    = state::normal() [[ anno::unused() ]]
 ) [[ 
@@ -357,7 +357,7 @@ export material mx_subsurface_bsdf(
     color alpha = 
         (white - albedo_sq) / (white - mxp_anisotropy * albedo_sq);
 
-    color radius_inv = white/color(mxp_radius);
+    color radius_inv = white / mxp_radius;
 
     color sigma_s = alpha * radius_inv;
     color sigma_a = radius_inv - sigma_s;

From 7f41da2bb5c950be6b9ee84070994c9d8fc32685 Mon Sep 17 00:00:00 2001
From: ld-kerley <154285602+ld-kerley@users.noreply.github.com>
Date: Tue, 25 Jun 2024 14:38:15 -0700
Subject: [PATCH 41/48] Fix CMake targets relative pathing (#1904)

Introduced with the monolithic build PR #1725 the cmake export targets no longer had relative paths.

An errant additional `target_include_directories` slipped in.
---
 CMakeLists.txt | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ecb1952635..4505ab106b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -345,10 +345,6 @@ function(mx_add_library MATERIALX_MODULE_NAME)
         set_property(GLOBAL APPEND PROPERTY MATERIALX_MODULES ${MATERIALX_MODULE_NAME})
     endif()
 
-    target_include_directories(${TARGET_NAME} PUBLIC
-            $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../>
-            $<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}>)
-
     target_compile_definitions(${TARGET_NAME} PRIVATE "-D${args_EXPORT_DEFINE}")
 
     if(NOT SKBUILD)

From 9b4b66e09c5c1980266bc75e316def30fb451175 Mon Sep 17 00:00:00 2001
From: ld-kerley <154285602+ld-kerley@users.noreply.github.com>
Date: Thu, 27 Jun 2024 06:38:54 -0700
Subject: [PATCH 42/48] Add extra Convert nodes (#1905)

Related to #1895

Fills out more of the "missing" convert nodes.

Notably this moves a lot of the implementations to nodegraphs, to reduce the maintenance going forward and to ensure all shader generation targets are aligned.
---
 .../Specification/MaterialX.Specification.md  |  19 +-
 .../stdlib/genglsl/stdlib_genglsl_impl.mtlx   |  15 -
 .../stdlib/genmdl/stdlib_genmdl_impl.mtlx     |  15 -
 .../stdlib/genmsl/stdlib_genmsl_impl.mtlx     |  15 -
 .../stdlib/genosl/stdlib_genosl_impl.mtlx     |  15 -
 libraries/stdlib/stdlib_defs.mtlx             | 122 +++++-
 libraries/stdlib/stdlib_ng.mtlx               | 375 +++++++++++++++++-
 source/MaterialXCore/Node.cpp                 |   2 +-
 8 files changed, 493 insertions(+), 85 deletions(-)

diff --git a/documents/Specification/MaterialX.Specification.md b/documents/Specification/MaterialX.Specification.md
index 1233be4ce7..e6f4bae531 100644
--- a/documents/Specification/MaterialX.Specification.md
+++ b/documents/Specification/MaterialX.Specification.md
@@ -1806,8 +1806,8 @@ Channel nodes are used to perform channel manipulations and data type conversion
 
 <a id="node-convert"> </a>
 
-* **`convert`**: convert a stream from one data type to another.  Only certain unambiguous and commonly-needed conversions are supported; see list below.
-    * `in` (boolean or integer or float or color<em>N</em> or vector<em>N</em> or string): the input value or nodename
+* **`convert`**: convert a stream from one data type to another.  Only certain unambiguous conversions are supported; see list below.
+    * `in` (boolean or integer or float or color<em>N</em> or vector<em>N</em>): the input value or nodename
 
 <a id="node-combine2"> </a>
 <a id="node-combine3"> </a>
@@ -1853,18 +1853,17 @@ Channel nodes are used to perform channel manipulations and data type conversion
 
 The following input/output data type conversions are supported by **`convert`**:
 
-* float to color<em>N</em>/vector<em>N</em>: copy the input value to all channels of the output
-* color<em>N</em> to vector<em>N</em> / vector<em>N</em> to color<em>N</em>, where _N_ is the same for in and out: straight copy of channel values
-* color3 to color4: copy RGB, set output alpha to 1.0
-* color4 to color3: drop alpha channel
 * boolean or integer to float: output is 0.0 or 1.0
-* vector2 to vector3, or vector3 to vector4: copy incoming channels and append an additional channel with value 1.0
-* vector3 to vector2, or vector4 to vector3: drop the last channel
-* string to filename: no change in value
+* boolean to integer: output is 0 or 1
+* integer to boolean: true for any non-zero input value
+* float/integer/boolean to color<em>N</em>/vector<em>N</em>: copy the input value to all channels of the output
+* color<em>N</em> / vector<em>N</em> to color<em>M</em> / vector<em>M</em>
+  * if _N_ is the same as _M_, then channels are directly copied. 
+  * if _N_ is larger than _M_, then channels the first _N_ channels are used.
+  * if _N_ is smaller than _M_, then channels are directly copied and additional channels are populated with 0, aside from the fourth channel which is populated with 1
 
 Table of allowable input/output types for **`combine2`**, **`combine3`**, **`combine4`**:
 
-
 | Operator | `type` | `in1` | `in2` | `in3` | `in4` | Output |
 | --- | --- | --- | --- | --- | --- | --- |
 | `combine2` | `vector2` | `float` "x" | `float` "y" | n/a | n/a | "xy" |
diff --git a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
index bf11d8f4e8..2c8d697c89 100644
--- a/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
+++ b/libraries/stdlib/genglsl/stdlib_genglsl_impl.mtlx
@@ -671,21 +671,6 @@
   <!-- ======================================================================== -->
 
   <!-- <convert> -->
-  <implementation name="IM_convert_float_color3_genglsl" nodedef="ND_convert_float_color3" target="genglsl" sourcecode="vec3({{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_float_color4_genglsl" nodedef="ND_convert_float_color4" target="genglsl" sourcecode="vec4({{in}},{{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_float_vector2_genglsl" nodedef="ND_convert_float_vector2" target="genglsl" sourcecode="vec2({{in}},{{in}})" />
-  <implementation name="IM_convert_float_vector3_genglsl" nodedef="ND_convert_float_vector3" target="genglsl" sourcecode="vec3({{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_float_vector4_genglsl" nodedef="ND_convert_float_vector4" target="genglsl" sourcecode="vec4({{in}},{{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_vector2_vector3_genglsl" nodedef="ND_convert_vector2_vector3" target="genglsl" sourcecode="vec3({{in}}[0],{{in}}[1],0)" />
-  <implementation name="IM_convert_vector3_vector2_genglsl" nodedef="ND_convert_vector3_vector2" target="genglsl" sourcecode="vec2({{in}}[0],{{in}}[1])" />
-  <implementation name="IM_convert_vector3_color3_genglsl" nodedef="ND_convert_vector3_color3" target="genglsl" sourcecode="{{in}}" />
-  <implementation name="IM_convert_vector3_vector4_genglsl" nodedef="ND_convert_vector3_vector4" target="genglsl" sourcecode="vec4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
-  <implementation name="IM_convert_vector4_vector3_genglsl" nodedef="ND_convert_vector4_vector3" target="genglsl" sourcecode="vec3({{in}}[0],{{in}}[1],{{in}}[2])" />
-  <implementation name="IM_convert_vector4_color4_genglsl" nodedef="ND_convert_vector4_color4" target="genglsl" sourcecode="{{in}}" />
-  <implementation name="IM_convert_color3_vector3_genglsl" nodedef="ND_convert_color3_vector3" target="genglsl" sourcecode="{{in}}" />
-  <implementation name="IM_convert_color4_vector4_genglsl" nodedef="ND_convert_color4_vector4" target="genglsl" sourcecode="{{in}}" />
-  <implementation name="IM_convert_color3_color4_genglsl" nodedef="ND_convert_color3_color4" target="genglsl" sourcecode="vec4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
-  <implementation name="IM_convert_color4_color3_genglsl" nodedef="ND_convert_color4_color3" target="genglsl" sourcecode="vec3({{in}}[0],{{in}}[1],{{in}}[2])" />
   <implementation name="IM_convert_boolean_float_genglsl" nodedef="ND_convert_boolean_float" target="genglsl" sourcecode="float({{in}})" />
   <implementation name="IM_convert_integer_float_genglsl" nodedef="ND_convert_integer_float" target="genglsl" sourcecode="float({{in}})" />
 
diff --git a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
index b09bc7cac9..32bf05aeac 100644
--- a/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
+++ b/libraries/stdlib/genmdl/stdlib_genmdl_impl.mtlx
@@ -681,21 +681,6 @@
   <!-- ======================================================================== -->
 
   <!-- <convert> -->
-  <implementation name="IM_convert_float_color3_genmdl" nodedef="ND_convert_float_color3" target="genmdl" sourcecode="color({{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_float_color4_genmdl" nodedef="ND_convert_float_color4" target="genmdl" sourcecode="color4({{in}},{{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_float_vector2_genmdl" nodedef="ND_convert_float_vector2" target="genmdl" sourcecode="float2({{in}},{{in}})" />
-  <implementation name="IM_convert_float_vector3_genmdl" nodedef="ND_convert_float_vector3" target="genmdl" sourcecode="float3({{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_float_vector4_genmdl" nodedef="ND_convert_float_vector4" target="genmdl" sourcecode="float4({{in}},{{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_vector2_vector3_genmdl" nodedef="ND_convert_vector2_vector3" target="genmdl" sourcecode="float3({{in}}[0],{{in}}[1],0)" />
-  <implementation name="IM_convert_vector3_color3_genmdl" nodedef="ND_convert_vector3_color3" target="genmdl" sourcecode="color({{in}})" />
-  <implementation name="IM_convert_vector3_vector2_genmdl" nodedef="ND_convert_vector3_vector2" target="genmdl" sourcecode="float2({{in}}[0],{{in}}[1])" />
-  <implementation name="IM_convert_vector3_vector4_genmdl" nodedef="ND_convert_vector3_vector4" target="genmdl" sourcecode="float4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
-  <implementation name="IM_convert_vector4_color4_genmdl" nodedef="ND_convert_vector4_color4" target="genmdl" sourcecode="color4({{in}}[0],{{in}}[1],{{in}}[2],{{in}}[3])" />
-  <implementation name="IM_convert_vector4_vector3_genmdl" nodedef="ND_convert_vector4_vector3" target="genmdl" sourcecode="float3({{in}}[0],{{in}}[1],{{in}}[2])" />
-  <implementation name="IM_convert_color3_vector3_genmdl" nodedef="ND_convert_color3_vector3" target="genmdl" sourcecode="float3({{in}})" />
-  <implementation name="IM_convert_color4_vector4_genmdl" nodedef="ND_convert_color4_vector4" target="genmdl" sourcecode="float4({{in}})" />
-  <implementation name="IM_convert_color3_color4_genmdl" nodedef="ND_convert_color3_color4" target="genmdl" sourcecode="color4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
-  <implementation name="IM_convert_color4_color3_genmdl" nodedef="ND_convert_color4_color3" target="genmdl" sourcecode="color({{in}}[0],{{in}}[1],{{in}}[2])" />
   <implementation name="IM_convert_boolean_float_genmdl" nodedef="ND_convert_boolean_float" target="genmdl" sourcecode="float({{in}})" />
   <implementation name="IM_convert_integer_float_genmdl" nodedef="ND_convert_integer_float" target="genmdl" sourcecode="float({{in}})" />
 
diff --git a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
index 51b678b702..f6454c13ac 100644
--- a/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
+++ b/libraries/stdlib/genmsl/stdlib_genmsl_impl.mtlx
@@ -671,21 +671,6 @@
   <!-- ======================================================================== -->
 
   <!-- <convert> -->
-  <implementation name="IM_convert_float_color3_genmsl" nodedef="ND_convert_float_color3" target="genmsl" sourcecode="vec3({{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_float_color4_genmsl" nodedef="ND_convert_float_color4" target="genmsl" sourcecode="vec4({{in}},{{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_float_vector2_genmsl" nodedef="ND_convert_float_vector2" target="genmsl" sourcecode="vec2({{in}},{{in}})" />
-  <implementation name="IM_convert_float_vector3_genmsl" nodedef="ND_convert_float_vector3" target="genmsl" sourcecode="vec3({{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_float_vector4_genmsl" nodedef="ND_convert_float_vector4" target="genmsl" sourcecode="vec4({{in}},{{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_vector2_vector3_genmsl" nodedef="ND_convert_vector2_vector3" target="genmsl" sourcecode="vec3({{in}}[0],{{in}}[1],0)" />
-  <implementation name="IM_convert_vector3_vector2_genmsl" nodedef="ND_convert_vector3_vector2" target="genmsl" sourcecode="vec2({{in}}[0],{{in}}[1])" />
-  <implementation name="IM_convert_vector3_color3_genmsl" nodedef="ND_convert_vector3_color3" target="genmsl" sourcecode="{{in}}" />
-  <implementation name="IM_convert_vector3_vector4_genmsl" nodedef="ND_convert_vector3_vector4" target="genmsl" sourcecode="vec4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
-  <implementation name="IM_convert_vector4_vector3_genmsl" nodedef="ND_convert_vector4_vector3" target="genmsl" sourcecode="vec3({{in}}[0],{{in}}[1],{{in}}[2])" />
-  <implementation name="IM_convert_vector4_color4_genmsl" nodedef="ND_convert_vector4_color4" target="genmsl" sourcecode="{{in}}" />
-  <implementation name="IM_convert_color3_vector3_genmsl" nodedef="ND_convert_color3_vector3" target="genmsl" sourcecode="{{in}}" />
-  <implementation name="IM_convert_color4_vector4_genmsl" nodedef="ND_convert_color4_vector4" target="genmsl" sourcecode="{{in}}" />
-  <implementation name="IM_convert_color3_color4_genmsl" nodedef="ND_convert_color3_color4" target="genmsl" sourcecode="vec4({{in}}[0],{{in}}[1],{{in}}[2],1)" />
-  <implementation name="IM_convert_color4_color3_genmsl" nodedef="ND_convert_color4_color3" target="genmsl" sourcecode="vec3({{in}}[0],{{in}}[1],{{in}}[2])" />
   <implementation name="IM_convert_boolean_float_genmsl" nodedef="ND_convert_boolean_float" target="genmsl" sourcecode="float({{in}})" />
   <implementation name="IM_convert_integer_float_genmsl" nodedef="ND_convert_integer_float" target="genmsl" sourcecode="float({{in}})" />
 
diff --git a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
index c0537324f4..716e1072d7 100644
--- a/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
+++ b/libraries/stdlib/genosl/stdlib_genosl_impl.mtlx
@@ -672,21 +672,6 @@
   <!-- ======================================================================== -->
 
   <!-- <convert> -->
-  <implementation name="IM_convert_float_color3_genosl" nodedef="ND_convert_float_color3" target="genosl" sourcecode="color({{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_float_color4_genosl" nodedef="ND_convert_float_color4" target="genosl" sourcecode="{ color({{in}},{{in}},{{in}}),{{in}}}" />
-  <implementation name="IM_convert_float_vector2_genosl" nodedef="ND_convert_float_vector2" target="genosl" sourcecode="{ {{in}},{{in}} }" />
-  <implementation name="IM_convert_float_vector3_genosl" nodedef="ND_convert_float_vector3" target="genosl" sourcecode="vector({{in}},{{in}},{{in}})" />
-  <implementation name="IM_convert_float_vector4_genosl" nodedef="ND_convert_float_vector4" target="genosl" sourcecode="{ {{in}},{{in}},{{in}},{{in}} }" />
-  <implementation name="IM_convert_vector2_vector3_genosl" nodedef="ND_convert_vector2_vector3" target="genosl" sourcecode="vector({{in}}.x,{{in}}.y,0)" />
-  <implementation name="IM_convert_vector3_vector2_genosl" nodedef="ND_convert_vector3_vector2" target="genosl" sourcecode="{ {{in}}[0],{{in}}[1] }" />
-  <implementation name="IM_convert_vector3_color3_genosl" nodedef="ND_convert_vector3_color3" target="genosl" sourcecode="color({{in}})" />
-  <implementation name="IM_convert_vector3_vector4_genosl" nodedef="ND_convert_vector3_vector4" target="genosl" sourcecode="{ {{in}}[0],{{in}}[1],{{in}}[2],1 }" />
-  <implementation name="IM_convert_vector4_vector3_genosl" nodedef="ND_convert_vector4_vector3" target="genosl" sourcecode="vector({{in}}.x,{{in}}.y,{{in}}.z)" />
-  <implementation name="IM_convert_vector4_color4_genosl" nodedef="ND_convert_vector4_color4" target="genosl" sourcecode="{ color({{in}}.x,{{in}}.y,{{in}}.z), {{in}}.w }" />
-  <implementation name="IM_convert_color3_vector3_genosl" nodedef="ND_convert_color3_vector3" target="genosl" sourcecode="vector({{in}})" />
-  <implementation name="IM_convert_color4_vector4_genosl" nodedef="ND_convert_color4_vector4" target="genosl" sourcecode="{ {{in}}.rgb[0],{{in}}.rgb[1],{{in}}.rgb[2],{{in}}.a }" />
-  <implementation name="IM_convert_color3_color4_genosl" nodedef="ND_convert_color3_color4" target="genosl" sourcecode="{ color({{in}}[0],{{in}}[1],{{in}}[2]),1 }" />
-  <implementation name="IM_convert_color4_color3_genosl" nodedef="ND_convert_color4_color3" target="genosl" sourcecode="color({{in}}.rgb[0],{{in}}.rgb[1],{{in}}.rgb[2])" />
   <implementation name="IM_convert_boolean_float_genosl" nodedef="ND_convert_boolean_float" target="genosl" sourcecode="float({{in}})" />
   <implementation name="IM_convert_integer_float_genosl" nodedef="ND_convert_integer_float" target="genosl" sourcecode="float({{in}})" />
 
diff --git a/libraries/stdlib/stdlib_defs.mtlx b/libraries/stdlib/stdlib_defs.mtlx
index 24541d3812..c9c3fc8431 100644
--- a/libraries/stdlib/stdlib_defs.mtlx
+++ b/libraries/stdlib/stdlib_defs.mtlx
@@ -4373,14 +4373,66 @@
     <input name="in" type="float" value="0.0" />
     <output name="out" type="vector4" default="0.0, 0.0, 0.0, 0.0" />
   </nodedef>
+
+  <nodedef name="ND_convert_color3_color4" node="convert" nodegroup="channel">
+    <input name="in" type="color3" value="0.0, 0.0, 0.0" />
+    <output name="out" type="color4" default="0.0, 0.0, 0.0, 0.0" />
+  </nodedef>
+  <nodedef name="ND_convert_color3_vector2" node="convert" nodegroup="channel">
+    <input name="in" type="color3" value="0.0, 0.0, 0.0" />
+    <output name="out" type="vector2" default="0.0, 0.0" />
+  </nodedef>
+  <nodedef name="ND_convert_color3_vector3" node="convert" nodegroup="channel">
+    <input name="in" type="color3" value="0.0, 0.0, 0.0" />
+    <output name="out" type="vector3" default="0.0, 0.0, 0.0" />
+  </nodedef>
+  <nodedef name="ND_convert_color3_vector4" node="convert" nodegroup="channel">
+    <input name="in" type="color3" value="0.0, 0.0, 0.0" />
+    <output name="out" type="vector4" default="0.0, 0.0, 0.0, 0.0" />
+  </nodedef>
+
+  <nodedef name="ND_convert_color4_color3" node="convert" nodegroup="channel">
+    <input name="in" type="color4" value="0.0, 0.0, 0.0, 0.0" />
+    <output name="out" type="color3" default="0.0, 0.0, 0.0" />
+  </nodedef>
+  <nodedef name="ND_convert_color4_vector2" node="convert" nodegroup="channel">
+    <input name="in" type="color4" value="0.0, 0.0, 0.0, 0.0" />
+    <output name="out" type="vector2" default="0.0, 0.0" />
+  </nodedef>
+  <nodedef name="ND_convert_color4_vector3" node="convert" nodegroup="channel">
+    <input name="in" type="color4" value="0.0, 0.0, 0.0, 0.0" />
+    <output name="out" type="vector3" default="0.0, 0.0, 0.0" />
+  </nodedef>
+  <nodedef name="ND_convert_color4_vector4" node="convert" nodegroup="channel">
+    <input name="in" type="color4" value="0.0, 0.0, 0.0, 0.0" />
+    <output name="out" type="vector4" default="0.0, 0.0, 0.0, 0.0" />
+  </nodedef>
+
+  <nodedef name="ND_convert_vector2_color3" node="convert" nodegroup="channel">
+    <input name="in" type="vector2" value="0.0, 0.0" />
+    <output name="out" type="color3" default="0.0, 0.0, 0.0" />
+  </nodedef>
+  <nodedef name="ND_convert_vector2_color4" node="convert" nodegroup="channel">
+    <input name="in" type="vector2" value="0.0, 0.0" />
+    <output name="out" type="color4" default="0.0, 0.0, 0.0, 0.0" />
+  </nodedef>
   <nodedef name="ND_convert_vector2_vector3" node="convert" nodegroup="channel">
     <input name="in" type="vector2" value="0.0, 0.0" />
     <output name="out" type="vector3" default="0.0, 0.0, 0.0" />
   </nodedef>
+  <nodedef name="ND_convert_vector2_vector4" node="convert" nodegroup="channel">
+    <input name="in" type="vector2" value="0.0, 0.0" />
+    <output name="out" type="vector4" default="0.0, 0.0, 0.0, 0.0" />
+  </nodedef>
+
   <nodedef name="ND_convert_vector3_color3" node="convert" nodegroup="channel">
     <input name="in" type="vector3" value="0.0, 0.0, 0.0" />
     <output name="out" type="color3" default="0.0, 0.0, 0.0" />
   </nodedef>
+  <nodedef name="ND_convert_vector3_color4" node="convert" nodegroup="channel">
+    <input name="in" type="vector3" value="0.0, 0.0, 0.0" />
+    <output name="out" type="color4" default="0.0, 0.0, 0.0, 0.0" />
+  </nodedef>
   <nodedef name="ND_convert_vector3_vector2" node="convert" nodegroup="channel">
     <input name="in" type="vector3" value="0.0, 0.0, 0.0" />
     <output name="out" type="vector2" default="0.0, 0.0" />
@@ -4389,38 +4441,82 @@
     <input name="in" type="vector3" value="0.0, 0.0, 0.0" />
     <output name="out" type="vector4" default="0.0, 0.0, 0.0, 0.0" />
   </nodedef>
+
+  <nodedef name="ND_convert_vector4_color3" node="convert" nodegroup="channel">
+    <input name="in" type="vector4" value="0.0, 0.0, 0.0, 0.0" />
+    <output name="out" type="color3" default="0.0, 0.0, 0.0" />
+  </nodedef>
   <nodedef name="ND_convert_vector4_color4" node="convert" nodegroup="channel">
     <input name="in" type="vector4" value="0.0, 0.0, 0.0, 0.0" />
     <output name="out" type="color4" default="0.0, 0.0, 0.0, 0.0" />
   </nodedef>
+  <nodedef name="ND_convert_vector4_vector2" node="convert" nodegroup="channel">
+    <input name="in" type="vector4" value="0.0, 0.0, 0.0, 0.0" />
+    <output name="out" type="vector2" default="0.0, 0.0" />
+  </nodedef>
   <nodedef name="ND_convert_vector4_vector3" node="convert" nodegroup="channel">
     <input name="in" type="vector4" value="0.0, 0.0, 0.0, 0.0" />
     <output name="out" type="vector3" default="0.0, 0.0, 0.0" />
   </nodedef>
-  <nodedef name="ND_convert_color3_vector3" node="convert" nodegroup="channel">
-    <input name="in" type="color3" value="0.0, 0.0, 0.0" />
-    <output name="out" type="vector3" default="0.0, 0.0, 0.0" />
+
+  <nodedef name="ND_convert_boolean_float" node="convert" nodegroup="channel">
+    <input name="in" type="boolean" value="false" />
+    <output name="out" type="float" default="0.0" />
   </nodedef>
-  <nodedef name="ND_convert_color4_vector4" node="convert" nodegroup="channel">
-    <input name="in" type="color4" value="0.0, 0.0, 0.0, 0.0" />
-    <output name="out" type="vector4" default="0.0, 0.0, 0.0, 0.0" />
+  <nodedef name="ND_convert_boolean_color3" node="convert" nodegroup="channel">
+    <input name="in" type="boolean" value="false" />
+    <output name="out" type="color3" default="0.0, 0.0, 0.0" />
   </nodedef>
-  <nodedef name="ND_convert_color3_color4" node="convert" nodegroup="channel">
-    <input name="in" type="color3" value="0.0, 0.0, 0.0" />
+  <nodedef name="ND_convert_boolean_color4" node="convert" nodegroup="channel">
+    <input name="in" type="boolean" value="false" />
     <output name="out" type="color4" default="0.0, 0.0, 0.0, 0.0" />
   </nodedef>
-  <nodedef name="ND_convert_color4_color3" node="convert" nodegroup="channel">
-    <input name="in" type="color4" value="0.0, 0.0, 0.0, 0.0" />
-    <output name="out" type="color3" default="0.0, 0.0, 0.0" />
+  <nodedef name="ND_convert_boolean_vector2" node="convert" nodegroup="channel">
+    <input name="in" type="boolean" value="false" />
+    <output name="out" type="vector2" default="0.0, 0.0" />
   </nodedef>
-  <nodedef name="ND_convert_boolean_float" node="convert" nodegroup="channel">
+  <nodedef name="ND_convert_boolean_vector3" node="convert" nodegroup="channel">
     <input name="in" type="boolean" value="false" />
-    <output name="out" type="float" default="0.0" />
+    <output name="out" type="vector3" default="0.0, 0.0, 0.0" />
+  </nodedef>
+  <nodedef name="ND_convert_boolean_vector4" node="convert" nodegroup="channel">
+    <input name="in" type="boolean" value="false" />
+    <output name="out" type="vector4" default="0.0, 0.0, 0.0, 0.0" />
   </nodedef>
+  <nodedef name="ND_convert_boolean_integer" node="convert" nodegroup="channel">
+    <input name="in" type="boolean" value="false" />
+    <output name="out" type="integer" default="0" />
+  </nodedef>
+
   <nodedef name="ND_convert_integer_float" node="convert" nodegroup="channel">
     <input name="in" type="integer" value="0" />
     <output name="out" type="float" default="0.0" />
   </nodedef>
+  <nodedef name="ND_convert_integer_color3" node="convert" nodegroup="channel">
+    <input name="in" type="integer" value="0" />
+    <output name="out" type="color3" default="0.0, 0.0, 0.0" />
+  </nodedef>
+  <nodedef name="ND_convert_integer_color4" node="convert" nodegroup="channel">
+    <input name="in" type="integer" value="0" />
+    <output name="out" type="color4" default="0.0, 0.0, 0.0, 0.0" />
+  </nodedef>
+  <nodedef name="ND_convert_integer_vector2" node="convert" nodegroup="channel">
+    <input name="in" type="integer" value="0" />
+    <output name="out" type="vector2" default="0.0, 0.0" />
+  </nodedef>
+  <nodedef name="ND_convert_integer_vector3" node="convert" nodegroup="channel">
+    <input name="in" type="integer" value="0" />
+    <output name="out" type="vector3" default="0.0, 0.0, 0.0" />
+  </nodedef>
+  <nodedef name="ND_convert_integer_vector4" node="convert" nodegroup="channel">
+    <input name="in" type="integer" value="0" />
+    <output name="out" type="vector4" default="0.0, 0.0, 0.0, 0.0" />
+  </nodedef>
+  <nodedef name="ND_convert_integer_boolean" node="convert" nodegroup="channel">
+    <input name="in" type="integer" value="0" />
+    <output name="out" type="boolean" default="false" />
+  </nodedef>
+
   <nodedef name="ND_convert_color3_surfaceshader" node="convert" version="1.0" isdefaultversion="true" nodegroup="shader" doc="Convert color3 to shader">
     <input name="in" type="color3" value="0, 0, 0" />
     <output name="out" type="surfaceshader" />
diff --git a/libraries/stdlib/stdlib_ng.mtlx b/libraries/stdlib/stdlib_ng.mtlx
index 37a4360c7b..b8eaeabfd4 100644
--- a/libraries/stdlib/stdlib_ng.mtlx
+++ b/libraries/stdlib/stdlib_ng.mtlx
@@ -4208,6 +4208,380 @@
     Convert a stream from one type to another; only certain unambiguous conversion
     types are supported.
   -->
+  <nodegraph name="NG_convert_float_color3" nodedef="ND_convert_float_color3">
+    <combine3 name="combine" type="color3">
+      <input name="in1" type="float" interfacename="in" />
+      <input name="in2" type="float" interfacename="in" />
+      <input name="in3" type="float" interfacename="in" />
+    </combine3>
+    <output name="out" type="color3" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_float_color4" nodedef="ND_convert_float_color4">
+    <combine4 name="combine" type="color4">
+      <input name="in1" type="float" interfacename="in" />
+      <input name="in2" type="float" interfacename="in" />
+      <input name="in3" type="float" interfacename="in" />
+      <input name="in4" type="float" interfacename="in" />
+    </combine4>
+    <output name="out" type="color4" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_float_vector2" nodedef="ND_convert_float_vector2">
+    <combine2 name="combine" type="vector2">
+      <input name="in1" type="float" interfacename="in" />
+      <input name="in2" type="float" interfacename="in" />
+    </combine2>
+    <output name="out" type="vector2" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_float_vector3" nodedef="ND_convert_float_vector3">
+    <combine3 name="combine" type="vector3">
+      <input name="in1" type="float" interfacename="in" />
+      <input name="in2" type="float" interfacename="in" />
+      <input name="in3" type="float" interfacename="in" />
+    </combine3>
+    <output name="out" type="vector3" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_float_vector4" nodedef="ND_convert_float_vector4">
+    <combine4 name="combine" type="vector4">
+      <input name="in1" type="float" interfacename="in" />
+      <input name="in2" type="float" interfacename="in" />
+      <input name="in3" type="float" interfacename="in" />
+      <input name="in4" type="float" interfacename="in" />
+    </combine4>
+    <output name="out" type="vector4" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_color3_color4" nodedef="ND_convert_color3_color4">
+    <separate3 name="separate" type="multioutput">
+      <input name="in" type="color3" interfacename="in" />
+    </separate3>
+    <combine4 name="combine" type="color4">
+      <input name="in1" type="float" nodename="separate" output="outr" />
+      <input name="in2" type="float" nodename="separate" output="outg" />
+      <input name="in3" type="float" nodename="separate" output="outb" />
+      <input name="in4" type="float" value="1.0" />
+    </combine4>
+    <output name="out" type="color4" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_color3_vector2" nodedef="ND_convert_color3_vector2">
+    <separate3 name="separate" type="multioutput">
+      <input name="in" type="color3" interfacename="in" />
+    </separate3>
+    <combine2 name="combine" type="vector2">
+      <input name="in1" type="float" nodename="separate" output="outr" />
+      <input name="in2" type="float" nodename="separate" output="outg" />
+    </combine2>
+    <output name="out" type="vector2" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_color3_vector3" nodedef="ND_convert_color3_vector3">
+    <separate3 name="separate" type="multioutput">
+      <input name="in" type="color3" interfacename="in" />
+    </separate3>
+    <combine3 name="combine" type="vector3">
+      <input name="in1" type="float" nodename="separate" output="outr" />
+      <input name="in2" type="float" nodename="separate" output="outg" />
+      <input name="in3" type="float" nodename="separate" output="outb" />
+    </combine3>
+    <output name="out" type="vector3" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_color3_vector4" nodedef="ND_convert_color3_vector4">
+    <separate3 name="separate" type="multioutput">
+      <input name="in" type="color3" interfacename="in" />
+    </separate3>
+    <combine4 name="combine" type="vector4">
+      <input name="in1" type="float" nodename="separate" output="outr" />
+      <input name="in2" type="float" nodename="separate" output="outg" />
+      <input name="in3" type="float" nodename="separate" output="outb" />
+      <input name="in4" type="float" value="1.0" />
+    </combine4>
+    <output name="out" type="vector4" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_color4_color3" nodedef="ND_convert_color4_color3">
+    <separate4 name="separate" type="multioutput">
+      <input name="in" type="color4" interfacename="in" />
+    </separate4>
+    <combine3 name="combine" type="color3">
+      <input name="in1" type="float" nodename="separate" output="outr" />
+      <input name="in2" type="float" nodename="separate" output="outg" />
+      <input name="in3" type="float" nodename="separate" output="outb" />
+    </combine3>
+    <output name="out" type="color3" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_color4_vector2" nodedef="ND_convert_color4_vector2">
+    <separate4 name="separate" type="multioutput">
+      <input name="in" type="color4" interfacename="in" />
+    </separate4>
+    <combine2 name="combine" type="vector2">
+      <input name="in1" type="float" nodename="separate" output="outr" />
+      <input name="in2" type="float" nodename="separate" output="outg" />
+    </combine2>
+    <output name="out" type="vector2" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_color4_vector3" nodedef="ND_convert_color4_vector3">
+    <separate4 name="separate" type="multioutput">
+      <input name="in" type="color4" interfacename="in" />
+    </separate4>
+    <combine3 name="combine" type="vector3">
+      <input name="in1" type="float" nodename="separate" output="outr" />
+      <input name="in2" type="float" nodename="separate" output="outg" />
+      <input name="in3" type="float" nodename="separate" output="outb" />
+    </combine3>
+    <output name="out" type="vector3" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_color4_vector4" nodedef="ND_convert_color4_vector4">
+    <separate4 name="separate" type="multioutput">
+      <input name="in" type="color4" interfacename="in" />
+    </separate4>
+    <combine4 name="combine" type="vector4">
+      <input name="in1" type="float" nodename="separate" output="outr" />
+      <input name="in2" type="float" nodename="separate" output="outg" />
+      <input name="in3" type="float" nodename="separate" output="outb" />
+      <input name="in4" type="float" nodename="separate" output="outa" />
+    </combine4>
+    <output name="out" type="vector4" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_vector2_color3" nodedef="ND_convert_vector2_color3">
+    <separate2 name="separate" type="multioutput">
+      <input name="in" type="vector2" interfacename="in" />
+    </separate2>
+    <combine3 name="combine" type="color3">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+      <input name="in3" type="float" value="0.0" />
+    </combine3>
+    <output name="out" type="color3" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_vector2_color4" nodedef="ND_convert_vector2_color4">
+    <separate2 name="separate" type="multioutput">
+      <input name="in" type="vector2" interfacename="in" />
+    </separate2>
+    <combine4 name="combine" type="color4">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+      <input name="in3" type="float" value="0.0" />
+      <input name="in4" type="float" value="1.0" />
+    </combine4>
+    <output name="out" type="color4" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_vector2_vector3" nodedef="ND_convert_vector2_vector3">
+    <separate2 name="separate" type="multioutput">
+      <input name="in" type="vector2" interfacename="in" />
+    </separate2>
+    <combine3 name="combine" type="vector3">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+      <input name="in3" type="float" value="0.0" />
+    </combine3>
+    <output name="out" type="vector3" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_vector2_vector4" nodedef="ND_convert_vector2_vector4">
+    <separate2 name="separate" type="multioutput">
+      <input name="in" type="vector2" interfacename="in" />
+    </separate2>
+    <combine4 name="combine" type="vector4">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+      <input name="in3" type="float" value="0.0" />
+      <input name="in4" type="float" value="1.0" />
+    </combine4>
+    <output name="out" type="vector4" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_vector3_color3" nodedef="ND_convert_vector3_color3">
+    <separate3 name="separate" type="multioutput">
+      <input name="in" type="vector3" interfacename="in" />
+    </separate3>
+    <combine3 name="combine" type="color3">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+      <input name="in3" type="float" nodename="separate" output="outz" />
+    </combine3>
+    <output name="out" type="color3" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_vector3_color4" nodedef="ND_convert_vector3_color4">
+    <separate3 name="separate" type="multioutput">
+      <input name="in" type="vector3" interfacename="in" />
+    </separate3>
+    <combine4 name="combine" type="color4">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+      <input name="in3" type="float" nodename="separate" output="outz" />
+      <input name="in4" type="float" value="1.0" />
+    </combine4>
+    <output name="out" type="color4" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_vector3_vector2" nodedef="ND_convert_vector3_vector2">
+    <separate3 name="separate" type="multioutput">
+      <input name="in" type="vector3" interfacename="in" />
+    </separate3>
+    <combine2 name="combine" type="vector2">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+    </combine2>
+    <output name="out" type="vector2" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_vector3_vector4" nodedef="ND_convert_vector3_vector4">
+    <separate3 name="separate" type="multioutput">
+      <input name="in" type="vector3" interfacename="in" />
+    </separate3>
+    <combine4 name="combine" type="vector4">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+      <input name="in3" type="float" nodename="separate" output="outz" />
+      <input name="in4" type="float" value="1.0" />
+    </combine4>
+    <output name="out" type="vector4" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_vector4_color3" nodedef="ND_convert_vector4_color3">
+    <separate4 name="separate" type="multioutput">
+      <input name="in" type="vector4" interfacename="in" />
+    </separate4>
+    <combine3 name="combine" type="color3">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+      <input name="in3" type="float" nodename="separate" output="outz" />
+    </combine3>
+    <output name="out" type="color3" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_vector4_color4" nodedef="ND_convert_vector4_color4">
+    <separate4 name="separate" type="multioutput">
+      <input name="in" type="vector4" interfacename="in" />
+    </separate4>
+    <combine4 name="combine" type="color4">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+      <input name="in3" type="float" nodename="separate" output="outz" />
+      <input name="in4" type="float" nodename="separate" output="outw" />
+    </combine4>
+    <output name="out" type="color4" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_vector4_vector2" nodedef="ND_convert_vector4_vector2">
+    <separate4 name="separate" type="multioutput">
+      <input name="in" type="vector4" interfacename="in" />
+    </separate4>
+    <combine2 name="combine" type="vector2">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+    </combine2>
+    <output name="out" type="vector2" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_vector4_vector3" nodedef="ND_convert_vector4_vector3">
+    <separate4 name="separate" type="multioutput">
+      <input name="in" type="vector4" interfacename="in" />
+    </separate4>
+    <combine3 name="combine" type="vector3">
+      <input name="in1" type="float" nodename="separate" output="outx" />
+      <input name="in2" type="float" nodename="separate" output="outy" />
+      <input name="in3" type="float" nodename="separate" output="outz" />
+    </combine3>
+    <output name="out" type="vector3" nodename="combine" />
+  </nodegraph>
+  <nodegraph name="NG_convert_boolean_color3" nodedef="ND_convert_boolean_color3">
+    <convert name="convert_to_float" type="float">
+      <input name="in" type="boolean" interfacename="in" />
+    </convert>
+    <convert name="convert" type="color3">
+      <input name="in" type="float" nodename="convert_to_float" />
+    </convert>
+    <output name="out" type="color3" nodename="convert" />
+  </nodegraph>
+  <nodegraph name="NG_convert_boolean_color4" nodedef="ND_convert_boolean_color4">
+    <convert name="convert_to_float" type="float">
+      <input name="in" type="boolean" interfacename="in" />
+    </convert>
+    <convert name="convert" type="color4">
+      <input name="in" type="float" nodename="convert_to_float" />
+    </convert>
+    <output name="out" type="color4" nodename="convert" />
+  </nodegraph>
+  <nodegraph name="NG_convert_boolean_vector2" nodedef="ND_convert_boolean_vector2">
+    <convert name="convert_to_float" type="float">
+      <input name="in" type="boolean" interfacename="in" />
+    </convert>
+    <convert name="convert" type="vector2">
+      <input name="in" type="float" nodename="convert_to_float" />
+    </convert>
+    <output name="out" type="vector2" nodename="convert" />
+  </nodegraph>
+  <nodegraph name="NG_convert_boolean_vector3" nodedef="ND_convert_boolean_vector3">
+    <convert name="convert_to_float" type="float">
+      <input name="in" type="boolean" interfacename="in" />
+    </convert>
+    <convert name="convert" type="vector3">
+      <input name="in" type="float" nodename="convert_to_float" />
+    </convert>
+    <output name="out" type="vector3" nodename="convert" />
+  </nodegraph>
+  <nodegraph name="NG_convert_boolean_vector4" nodedef="ND_convert_boolean_vector4">
+    <convert name="convert_to_float" type="float">
+      <input name="in" type="boolean" interfacename="in" />
+    </convert>
+    <convert name="convert" type="vector4">
+      <input name="in" type="float" nodename="convert_to_float" />
+    </convert>
+    <output name="out" type="vector4" nodename="convert" />
+  </nodegraph>
+  <nodegraph name="NG_convert_boolean_integer" nodedef="ND_convert_boolean_integer">
+    <ifequal name="ifequal" type="integer">
+      <input name="value1" type="boolean" interfacename="in" />
+      <input name="value2" type="boolean" value="true" />
+      <input name="in1" type="integer" value="1" />
+      <input name="in2" type="integer" value="0" />
+    </ifequal>
+    <output name="out" type="integer" nodename="ifequal" />
+  </nodegraph>
+  <nodegraph name="NG_convert_integer_color3" nodedef="ND_convert_integer_color3">
+    <convert name="convert_to_float" type="float">
+      <input name="in" type="integer" interfacename="in" />
+    </convert>
+    <convert name="convert" type="color3">
+      <input name="in" type="float" nodename="convert_to_float" />
+    </convert>
+    <output name="out" type="color3" nodename="convert" />
+  </nodegraph>
+  <nodegraph name="NG_convert_integer_color4" nodedef="ND_convert_integer_color4">
+    <convert name="convert_to_float" type="float">
+      <input name="in" type="integer" interfacename="in" />
+    </convert>
+    <convert name="convert" type="color4">
+      <input name="in" type="float" nodename="convert_to_float" />
+    </convert>
+    <output name="out" type="color4" nodename="convert" />
+  </nodegraph>
+  <nodegraph name="NG_convert_integer_vector2" nodedef="ND_convert_integer_vector2">
+    <convert name="convert_to_float" type="float">
+      <input name="in" type="integer" interfacename="in" />
+    </convert>
+    <convert name="convert" type="vector2">
+      <input name="in" type="float" nodename="convert_to_float" />
+    </convert>
+    <output name="out" type="vector2" nodename="convert" />
+  </nodegraph>
+  <nodegraph name="NG_convert_integer_vector3" nodedef="ND_convert_integer_vector3">
+    <convert name="convert_to_float" type="float">
+      <input name="in" type="integer" interfacename="in" />
+    </convert>
+    <convert name="convert" type="vector3">
+      <input name="in" type="float" nodename="convert_to_float" />
+    </convert>
+    <output name="out" type="vector3" nodename="convert" />
+  </nodegraph>
+  <nodegraph name="NG_convert_integer_vector4" nodedef="ND_convert_integer_vector4">
+    <convert name="convert_to_float" type="float">
+      <input name="in" type="integer" interfacename="in" />
+    </convert>
+    <convert name="convert" type="vector4">
+      <input name="in" type="float" nodename="convert_to_float" />
+    </convert>
+    <output name="out" type="vector4" nodename="convert" />
+  </nodegraph>
+  <nodegraph name="NG_convert_integer_boolean" nodedef="ND_convert_integer_boolean">
+    <ifequal name="ifequal" type="boolean">
+      <input name="value1" type="integer" interfacename="in" />
+      <input name="value2" type="integer" value="0" />
+    </ifequal>
+    <not name="not" type="boolean">
+      <input name="in" type="boolean" nodename="ifequal" />
+    </not>
+    <output name="out" type="boolean" nodename="not" />
+  </nodegraph>
   <nodegraph name="NG_convert_color3_surfaceshader" nodedef="ND_convert_color3_surfaceshader">
     <surface_unlit name="surface" type="surfaceshader">
       <input name="emission_color" type="color3" interfacename="in" />
@@ -5440,5 +5814,4 @@
     <output name="out" type="boolean" nodename="or" />
   </nodegraph>
 
-
 </materialx>
diff --git a/source/MaterialXCore/Node.cpp b/source/MaterialXCore/Node.cpp
index 223452878d..7694bb6c6b 100644
--- a/source/MaterialXCore/Node.cpp
+++ b/source/MaterialXCore/Node.cpp
@@ -366,8 +366,8 @@ void GraphElement::flattenSubgraphs(const string& target, NodePredicate filter)
                                     }
                                 }
                             }
+                            destInput->removeAttribute(ValueElement::INTERFACE_NAME_ATTRIBUTE);
                         }
-                        destInput->removeAttribute(ValueElement::INTERFACE_NAME_ATTRIBUTE);
                     }
                 }
             }

From 8e050bfa34f83c0344e946d2ab2bf1acbd0cb7eb Mon Sep 17 00:00:00 2001
From: Simo Virokannas <38055305+virokannas@users.noreply.github.com>
Date: Fri, 28 Jun 2024 14:55:57 -0400
Subject: [PATCH 43/48] Add uiScale option to the Graph Editor (#1586)

The branch has an additional command line variable for MaterialXGraphEditor, --uiScale, that will override the automatic calculation and application of DPI scaling.

Using this flag on MacOS with a retina display, will result in a normal-sized UI.
---
 source/MaterialXGraphEditor/Main.cpp | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/source/MaterialXGraphEditor/Main.cpp b/source/MaterialXGraphEditor/Main.cpp
index 5bbcbdad66..38c755cdd9 100644
--- a/source/MaterialXGraphEditor/Main.cpp
+++ b/source/MaterialXGraphEditor/Main.cpp
@@ -29,6 +29,7 @@ const std::string options =
     "    --mesh [FILENAME]              Specify the filename of the OBJ or glTF mesh to be displayed in the graph editor\n"
     "    --path [FILEPATH]              Specify an additional data search path location (e.g. '/projects/MaterialX').  This absolute path will be queried when locating data libraries, XInclude references, and referenced images.\n"
     "    --library [FILEPATH]           Specify an additional data library folder (e.g. 'vendorlib', 'studiolib').  This relative path will be appended to each location in the data search path when loading data libraries.\n"
+    "    --uiScale [FACTOR]             Manually specify a UI scaling factor\n"
     "    --captureFilename [FILENAME]   Specify the filename to which the first rendered frame should be written\n"
     "    --help                         Display the complete list of command-line options\n";
 
@@ -65,6 +66,7 @@ int main(int argc, char* const argv[])
     mx::FilePathVec libraryFolders;
     int viewWidth = 256;
     int viewHeight = 256;
+    float uiScale = 0.0f;
     std::string captureFilename;
 
     for (size_t i = 0; i < tokens.size(); i++)
@@ -96,6 +98,10 @@ int main(int argc, char* const argv[])
         {
             parseToken(nextToken, "integer", viewHeight);
         }
+        else if (token == "--uiScale")
+        {
+            parseToken(nextToken, "float", uiScale);
+        }
         else if (token == "--captureFilename")
         {
             parseToken(nextToken, "string", captureFilename);
@@ -199,9 +205,12 @@ int main(int argc, char* const argv[])
         float xscale = 1.0f, yscale = 1.0f;
         glfwGetMonitorContentScale(monitor, &xscale, &yscale);
         ImGuiStyle& style = ImGui::GetStyle();
-        float dpiScale = xscale > yscale ? xscale : yscale;
-        style.ScaleAllSizes(dpiScale);
-        graph->setFontScale(dpiScale);
+        if (uiScale <= 0.0f)
+        {
+            uiScale = (xscale > yscale) ? xscale : yscale;
+        }
+        style.ScaleAllSizes(uiScale);
+        graph->setFontScale(uiScale);
     }
 
     // Create editor config and context.

From 8c26c7eeb37ba29ef08821fd1a503823e444b8ec Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Fri, 28 Jun 2024 14:33:50 -0700
Subject: [PATCH 44/48] Update OpenPBR to v1.1

---
 libraries/bxdf/open_pbr_surface.mtlx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libraries/bxdf/open_pbr_surface.mtlx b/libraries/bxdf/open_pbr_surface.mtlx
index edd44a5858..8186482cf8 100644
--- a/libraries/bxdf/open_pbr_surface.mtlx
+++ b/libraries/bxdf/open_pbr_surface.mtlx
@@ -3,7 +3,7 @@
   <!--
     OpenPBR Surface node definition
   -->
-  <nodedef name="ND_open_pbr_surface_surfaceshader" node="open_pbr_surface" nodegroup="pbr" version="1.0" isdefaultversion="true"
+  <nodedef name="ND_open_pbr_surface_surfaceshader" node="open_pbr_surface" nodegroup="pbr" version="1.1" isdefaultversion="true"
            doc="OpenPBR Surface Shading Model" uiname="OpenPBR Surface">
     <input name="base_weight" type="float" value="1.0" uimin="0.0" uimax="1.0" uiname="Base Weight" uifolder="Base"
            doc="Multiplier on the intensity of the reflection from the diffuse and metallic base." />

From b1a3e425621804bf477c9c9b1aba9520f9cb6261 Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Sun, 30 Jun 2024 10:31:28 -0700
Subject: [PATCH 45/48] Updates to PBR specification (#1910)

- Add new physically based shading functionality for OpenPBR in MaterialX 1.39.
- Add names and dates to footnotes for improved organization and clarity.
- Update links to the latest locations of online papers.
- Minor improvements to formatting and spacing.
---
 documents/Specification/MaterialX.PBRSpec.md | 196 +++++++++----------
 1 file changed, 93 insertions(+), 103 deletions(-)

diff --git a/documents/Specification/MaterialX.PBRSpec.md b/documents/Specification/MaterialX.PBRSpec.md
index ee85ac4b24..32cef574c6 100644
--- a/documents/Specification/MaterialX.PBRSpec.md
+++ b/documents/Specification/MaterialX.PBRSpec.md
@@ -9,13 +9,13 @@ MaterialX Physically Based Shading Nodes v1.39
 Niklas Harrysson - Lumiere Software  
 Doug Smythe - Industrial Light & Magic  
 Jonathan Stone - Lucasfilm Advanced Development Group  
-April 28, 2024
+June 29, 2024
 
 # Introduction
 
-The [**MaterialX Specification**](./MaterialX.Specification.md) describes a number of standard nodes that may be used to construct node graphs for the processing of images, procedurally-generated values, coordinates and other data.  With the addition of user-defined custom nodes, it is possible to describe complete rendering shaders using node graphs. Up to this point, there has been no standardization of the specific shader-semantic nodes used in these node graph shaders, although with the widespread shift toward physically-based shading, it appears that the industry is settling upon a number of specific BSDF and other functions with standardized parameters and functionality.
+The [MaterialX Specification](./MaterialX.Specification.md) describes a number of standard nodes that may be used to construct node graphs for the processing of images, procedurally-generated values, coordinates and other data. With the addition of user-defined custom nodes, it is possible to describe complete rendering shaders using node graphs. Up to this point, there has been no standardization of the specific shader-semantic nodes used in these node graph shaders, although with the widespread shift toward physically-based shading, it appears that the industry is settling upon a number of specific BSDF and other functions with standardized parameters and functionality.
 
-This document describes a number of shader-semantic nodes implementing widely-used surface scattering, emission and volume distribution functions and utility nodes useful in constructing complex layered rendering shaders using node graphs.  These nodes in combination with other nodes may be used with the MaterialX shader generation (ShaderGen[^1]) system.
+This document describes a number of shader-semantic nodes implementing widely-used surface scattering, emission and volume distribution functions and utility nodes useful in constructing complex layered rendering shaders using node graphs. These nodes in combination with other nodes may be used with the [MaterialX Shader Generation](../DeveloperGuide/ShaderGeneration.md) system.
 
 
 ## Table of Contents
@@ -89,11 +89,11 @@ In our surface shading model the scattering and emission of light is controlled
 
 Another important property is the **index of refraction** (IOR), which describes how light is propagated through a medium. It controls how much a light ray is bent when crossing the interface between two media of different refractive indices. It also determines the amount of light that is reflected and transmitted when reaching the interface, as described by the Fresnel equations.
 
-A surface shader is represented with the data type `surfaceshader`. In the PBS library there is a [&lt;surface> node](#node-surface) that constructs a surface shader from a BSDF and an EDF. Since there are nodes to combine and modify them, you can easily build surface shaders from different combinations of distribution functions. Inputs on the distribution function nodes can be connected, and nodes from the standard library can be combined into complex calculations, giving flexibility for the artist to author material variations over the surfaces.
+A surface shader is represented with the data type `surfaceshader`. In the PBS library there is a [&lt;surface>](#node-surface) node that constructs a surface shader from a BSDF and an EDF. Since there are nodes to combine and modify them, you can easily build surface shaders from different combinations of distribution functions. Inputs on the distribution function nodes can be connected, and nodes from the standard library can be combined into complex calculations, giving flexibility for the artist to author material variations over the surfaces.
 
-It is common for shading models to differentiate between closed surfaces and thin-walled surfaces. A closed surface represents a closed watertight interface with a solid interior. A typical example is a solid glass object. A thin-walled surface on the other hand has an infinitely thin volume, as with a sheet of paper or a soap bubble. For a closed surface there can be no backside visible if the material is opaque. In the case of a transparent closed surface a backside hit is treated as light exiting the closed interface. For a thin-walled surface both the front and back side are visible and it can either have the same material on both sides or different materials on each side. If the material is transparent in this case the thin wall makes the light transmit without refraction or scattering. By default the [&lt;surface> node](#node-surface) constructs a surface shader for a closed surface, but there is a boolean switch to make it thin-walled.
+It is common for shading models to differentiate between closed surfaces and thin-walled surfaces. A closed surface represents a closed watertight interface with a solid interior. A typical example is a solid glass object. A thin-walled surface on the other hand has an infinitely thin volume, as with a sheet of paper or a soap bubble. For a closed surface there can be no backside visible if the material is opaque. In the case of a transparent closed surface a backside hit is treated as light exiting the closed interface. For a thin-walled surface both the front and back side are visible and it can either have the same material on both sides or different materials on each side. If the material is transparent in this case the thin wall makes the light transmit without refraction or scattering. By default the [&lt;surface>](#node-surface) node constructs a surface shader for a closed surface, but there is a boolean switch to make it thin-walled.
 
-In order to assign different shaders to each side of a thin-walled object the [&lt;surfacematerial> node](./MaterialX.Specification.md#node-surfacematerial) in the standard library has an input to connect an extra backside surface shader. If any of the sides of a &lt;surfacematerial> has a thin-walled shader connected, both sides are considered to be thin-walled. Hence the thin-walled property takes precedence to avoid ambiguity between the sides. If only one side has a shader connected this is used for both sides. If both sides are connected but none of the shaders are thin-walled the front shader is used. The thin-walled property also takes precedence in the case of mixing surface shaders. If any of the shaders involved in the mix is thin-walled, both shaders are considered to be thin-walled.
+In order to assign different shaders to each side of a thin-walled object the [&lt;surfacematerial>](./MaterialX.Specification.md#node-surfacematerial) node in the standard library has an input to connect an extra backside surface shader. If any of the sides of a &lt;surfacematerial> has a thin-walled shader connected, both sides are considered to be thin-walled. Hence the thin-walled property takes precedence to avoid ambiguity between the sides. If only one side has a shader connected this is used for both sides. If both sides are connected but none of the shaders are thin-walled the front shader is used. The thin-walled property also takes precedence in the case of mixing surface shaders. If any of the shaders involved in the mix is thin-walled, both shaders are considered to be thin-walled.
 
 Note that in order to have surface shaders set for both sides the geometry has to be set as double-sided. Geometry sidedness is a property not handled by MaterialX and needs to be set elsewhere.
 
@@ -104,8 +104,8 @@ In order to simplify authoring of complex materials, our model supports the noti
 
 
 
-* Horizontal Layering: A simple way of layering is using per-shading-point linear mixing of different BSDFs where a mix factor is given per BSDF controlling its contribution. Since the weight is calculated per shading point it can be used as a mask to hide contributions on different parts of a surface. The weight can also be calculated dependent on view angle to simulate approximate Fresnel behavior. This type of layering can be done both on a BSDF level and on a surface shader level. The latter is useful for mixing complete shaders which internally contain many BSDFs, e.g. to put dirt over a car paint, grease over a rusty metal or adding decals to a plastic surface. We refer to this type of layering as **horizontal layering** and the [&lt;mix> node](#node-mix) in the PBS library can be used to achieve this (see below).
-* Vertical Layering: A more physically correct form of layering is also supported where a top BSDF layer is placed over another base BSDF layer, and the light not reflected by the top layer is assumed to be transmitted to the base layer; for example, adding a dielectric coating layer over a substrate. The refraction index and roughness of the coating will then affect the attenuation of light reaching the substrate. The substrate can be a transmissive BSDF to transmit the light further, or a reflective BSDF to reflect the light back up through the coating. The substrate can in turn be a reflective BSDF to simulate multiple specular lobes. We refer to this type of layering as **vertical layering** and it can be achieved using the [&lt;layer> node](#node-layer) in the PBS library. See [&lt;dielectric_bsdf>](#node-dielectric-bsdf) and [&lt;sheen_bsdf>](#node-sheen-bsdf) below.
+* Horizontal Layering: A simple way of layering is using per-shading-point linear mixing of different BSDFs where a mix factor is given per BSDF controlling its contribution. Since the weight is calculated per shading point it can be used as a mask to hide contributions on different parts of a surface. The weight can also be calculated dependent on view angle to simulate approximate Fresnel behavior. This type of layering can be done both on a BSDF level and on a surface shader level. The latter is useful for mixing complete shaders which internally contain many BSDFs, e.g. to put dirt over a car paint, grease over a rusty metal or adding decals to a plastic surface. We refer to this type of layering as **horizontal layering** and the [&lt;mix>](#node-mix) node in the PBS library can be used to achieve this (see below).
+* Vertical Layering: A more physically correct form of layering is also supported where a top BSDF layer is placed over another base BSDF layer, and the light not reflected by the top layer is assumed to be transmitted to the base layer; for example, adding a dielectric coating layer over a substrate. The refraction index and roughness of the coating will then affect the attenuation of light reaching the substrate. The substrate can be a transmissive BSDF to transmit the light further, or a reflective BSDF to reflect the light back up through the coating. The substrate can in turn be a reflective BSDF to simulate multiple specular lobes. We refer to this type of layering as **vertical layering** and it can be achieved using the [&lt;layer>](#node-layer) node in the PBS library. See [&lt;dielectric_bsdf>](#node-dielectric-bsdf) and [&lt;sheen_bsdf>](#node-sheen-bsdf) below.
 * Shader Input Blending: Calculating and blending many BSDFs or separate surface shaders can be expensive. In some situations good results can be achieved by blending the texture/value inputs instead, before any illumination calculations. Typically one would use this with an über-shader that can simulate many different materials, and by masking or blending its inputs over the surface you get the appearance of having multiple layers, but with less expensive texture or value blending. Examples of this are given in the main [MaterialX Specification "Pre-Shader Compositing Example"](./MaterialX.Specification.md#example-pre-shader-compositing-material).
 
 
@@ -120,16 +120,16 @@ In our volume shader model the scattering of light in a participating medium is
 
 Light can also be emitted from a volume. This is represented by an EDF analog to emission from surfaces, but in this context the emission is given as radiance per distance traveled through the medium. The unit for this is _Wm<sup>−3</sup>sr<sup>−1</sup>_. The emission distribution is oriented along the current direction.
 
-The [&lt;volume> node](#node-volume) in the PBS library constructs a volume shader from individual VDF and EDF components. There are also nodes to construct various VDFs, as well as nodes to combine them to build more complex ones.
+The [&lt;volume>](#node-volume) node in the PBS library constructs a volume shader from individual VDF and EDF components. There are also nodes to construct various VDFs, as well as nodes to combine them to build more complex ones.
 
-VDFs can also be used to describe the interior of a surface. A typical example would be to model how light is absorbed or scattered when transmitted through colored glass or turbid water. This is done by layering a BSDF for the surface transmission over the VDF using a [&lt;layer> node](#node-layer).
+VDFs can also be used to describe the interior of a surface. A typical example would be to model how light is absorbed or scattered when transmitted through colored glass or turbid water. This is done by layering a BSDF for the surface transmission over the VDF using a [&lt;layer>](#node-layer) node.
 
 
 ## Lights
 
 Light sources can be divided into environment lights and local lights. Environment lights represent contributions coming from infinitely far away. All other lights are local lights and have a position and extent in space.
 
-Local lights are specified as light shaders assigned to a locator, modeling an explicit light source, or in the form of emissive geometry using an emissive surface shader. The [&lt;light> node](#node-light) in the PBS library constructs a light shader from an EDF. There are also nodes to construct various EDFs as well as nodes to combine them to build more complex ones. Emissive properties of surface shaders are also modelled using EDFs; see the [**EDF Nodes**](#edf-nodes) section below for more information.
+Local lights are specified as light shaders assigned to a locator, modeling an explicit light source, or in the form of emissive geometry using an emissive surface shader. The [&lt;light>](#node-light) node in the PBS library constructs a light shader from an EDF. There are also nodes to construct various EDFs as well as nodes to combine them to build more complex ones. Emissive properties of surface shaders are also modelled using EDFs; see the [**EDF Nodes**](#edf-nodes) section below for more information.
 
 Light contributions coming from far away are handled by environment lights. These are typically photographically-captured or procedurally-generated images that surround the whole scene. This category of lights also includes sources like the sun, where the long distance traveled makes the light essentially directional and without falloff. For all shading points, an environment is seen as being infinitely far away.
 
@@ -158,19 +158,16 @@ The PBS nodes also make use of the following standard MaterialX types:
 
 <a id="node-oren-nayar-diffuse-bsdf"> </a>
 
-* **`oren_nayar_diffuse_bsdf`**: Constructs a diffuse reflection BSDF based on the Oren-Nayar reflectance model[^2]. A roughness of 0.0 gives Lambertian reflectance.
-
-
+* **`oren_nayar_diffuse_bsdf`**: Constructs a diffuse reflection BSDF based on the Oren-Nayar reflectance model. A `roughness` of 0.0 gives Lambertian reflectance. An `energy_compensation` boolean selects between classic Oren-Nayar behavior[^Oren1994] and the energy-compensated Oren-Nayar in OpenPBR[^Andersson2024].
     * `weight` (float): Weight for this BSDF’s contribution, range [0.0, 1.0]. Defaults to 1.0.
     * `color` (color3): Diffuse reflectivity (albedo). Defaults to (0.18, 0.18, 0.18).
     * `roughness `(float): Surface roughness, range [0.0, 1.0]. Defaults to 0.0.
     * `normal` (vector3): Normal vector of the surface. Defaults to world space normal.
+    * `energy_compensation` (uniform boolean): Set to `true` to enable energy compensation. Defaults to `false`.
 
 <a id="node-burley-diffuse-bsdf"> </a>
 
-* **`burley_diffuse_bsdf`**: Constructs a diffuse reflection BSDF based on the corresponding component of the Disney Principled model[^3].
-
-
+* **`burley_diffuse_bsdf`**: Constructs a diffuse reflection BSDF based on the corresponding component of the Disney Principled model[^Burley2012].
     * `weight` (float): Weight for this BSDF’s contribution, range [0.0, 1.0]. Defaults to 1.0.
     * `color` (color3): Diffuse reflectivity (albedo). Defaults to (0.18, 0.18, 0.18).
     * `roughness` (float): Surface roughness, range [0.0, 1.0]. Defaults to 0.0.
@@ -178,52 +175,46 @@ The PBS nodes also make use of the following standard MaterialX types:
 
 <a id="node-dielectric-bsdf"> </a>
 
-* **`dielectric_bsdf`**: Constructs a reflection and/or transmission BSDF based on a microfacet reflectance model and a Fresnel curve for dielectrics[^4]. If reflection scattering is enabled the node may be layered vertically over a base BSDF for the surface beneath the dielectric layer. By chaining multiple &lt;dielectric_bsdf> nodes you can describe a surface with multiple specular lobes. If transmission scattering is enabled the node may be layered over a VDF describing the surface interior to handle absorption and scattering inside the medium, useful for colored glass, turbid water, etc.
-
-
+* **`dielectric_bsdf`**: Constructs a reflection and/or transmission BSDF based on a microfacet reflectance model and a Fresnel curve for dielectrics[^Walter2007]. If reflection scattering is enabled the node may be layered vertically over a base BSDF for the surface beneath the dielectric layer. By chaining multiple &lt;dielectric_bsdf> nodes you can describe a surface with multiple specular lobes. If transmission scattering is enabled the node may be layered over a VDF describing the surface interior to handle absorption and scattering inside the medium, useful for colored glass, turbid water, etc.
     * `weight` (float): Weight for this BSDF’s contribution, range [0.0, 1.0]. Defaults to 1.0.
     * `tint` (color3): Color weight to tint the reflected and transmitted light. Defaults to (1.0, 1.0, 1.0). Note that changing the tint gives non-physical results and should only be done when needed for artistic purposes.
     * `ior` (float): Index of refraction of the surface. Defaults to 1.5. If set to 0.0 the Fresnel curve is disabled and reflectivity is controlled only by weight and tint.
     * `roughness` (vector2): Surface roughness. Defaults to (0.05, 0.05).
-    * `thinfilm_thickness` (float): The thickness of an iridescent thin film layer applied over the base bsdf[^5], expressed in nanometers. Defaults to 0.0, for no thin film.
+    * `thinfilm_thickness` (float): The thickness of an iridescent thin film layer[^Belcour2017] applied over the base bsdf, expressed in nanometers. Defaults to 0.0, for no thin film.
     * `thinfilm_ior` (float): The index of refraction of the thin film layer. Defaults to 1.5.
     * `normal` (vector3): Normal vector of the surface. Defaults to world space normal.
     * `tangent` (vector3): Tangent vector of the surface. Defaults to world space tangent.
-    * `distribution` (uniform string): Microfacet distribution type. Defaults to "ggx".
-    * `scatter_mode` (uniform string): Scattering mode, specifying whether the BSDF supports reflection "R", transmission "T" or both reflection and transmission "RT". With "RT", reflection and transmission occur both when entering and leaving a surface, with their respective intensities controlled by the Fresnel curve. Depending on the IOR and incident angle, it is possible for total internal reflection to occur, generating no transmission even if "T" or "RT" is selected. Defaults to "R".
+    * `distribution` (uniform string): Microfacet distribution type. Defaults to `ggx`.
+    * `scatter_mode` (uniform string): Scattering mode, specifying whether the BSDF supports reflection `R`, transmission `T` or both reflection and transmission `RT`. With `RT`, reflection and transmission occur both when entering and leaving a surface, with their respective intensities controlled by the Fresnel curve. Depending on the IOR and incident angle, it is possible for total internal reflection to occur, generating no transmission even if `T` or `RT` is selected. Defaults to `R`.
 
 <a id="node-conductor-bsdf"> </a>
 
-* **`conductor_bsdf`**: Constructs a reflection BSDF based on a microfacet reflectance model[^6]. Uses a Fresnel curve with complex refraction index for conductors/metals. If an artistic parametrization[^7] is needed the [&lt;artistic_ior> utility node](#node-artistic-ior) can be connected to handle this.
-
-
+* **`conductor_bsdf`**: Constructs a reflection BSDF based on a microfacet reflectance model[^Burley2012]. Uses a Fresnel curve with complex refraction index for conductors/metals. If an artistic parametrization[^Gulbrandsen2014] is needed the [&lt;artistic_ior>](#node-artistic-ior) utility node can be connected to handle this.
     * `weight` (float): Weight for this BSDF’s contribution, range [0.0, 1.0]. Defaults to 1.0.
-    * `ior `(color3): Index of refraction. Default is (0.18, 0.42, 1.37) (approximate IOR for gold).
-    * `extinction` (color3): Extinction coefficient. Default is (3.42, 2.35, 1.77) (approximate extinction coefficients for gold).
+    * `ior `(color3): Index of refraction. Defaults to (0.18, 0.42, 1.37) (approximate IOR for gold).
+    * `extinction` (color3): Extinction coefficient. Defaults to (3.42, 2.35, 1.77) (approximate extinction coefficients for gold).
     * `roughness` (vector2): Surface roughness. Defaults to (0.05, 0.05).
-    * `thinfilm_thickness` (float): The thickness of an iridescent thin film layer applied over the base bsdf, expressed in nanometers. Defaults to 0.0, for no thin film.
+    * `thinfilm_thickness` (float): The thickness of an iridescent thin film layer[^Belcour2017] applied over the base bsdf, expressed in nanometers. Defaults to 0.0, for no thin film.
     * `thinfilm_ior` (float): The index of refraction of the thin film layer. Defaults to 1.5.
     * `normal` (vector3): Normal vector of the surface. Defaults to world space normal.
     * `tangent` (vector3): Tangent vector of the surface. Defaults to world space tangent.
-    * `distribution` (uniform string): Microfacet distribution type. Defaults to "ggx".
+    * `distribution` (uniform string): Microfacet distribution type. Defaults to `ggx`.
 
 <a id="node-generalized-schlick-bsdf"> </a>
 
-* **`generalized_schlick_bsdf`**: Constructs a reflection and/or transmission BSDF based on a microfacet model and a generalized Schlick Fresnel curve[^8]. If reflection scattering is enabled the node may be layered vertically over a base BSDF for the surface beneath the dielectric layer. By chaining multiple &lt;generalized_schlick_bsdf> nodes you can describe a surface with multiple specular lobes. If transmission scattering is enabled the node may be layered over a VDF describing the surface interior to handle absorption and scattering inside the medium, useful for colored glass, turbid water, etc.
-
-
+* **`generalized_schlick_bsdf`**: Constructs a reflection and/or transmission BSDF based on a microfacet model and a generalized Schlick Fresnel curve[^Hoffman2023]. If reflection scattering is enabled the node may be layered vertically over a base BSDF for the surface beneath the dielectric layer. By chaining multiple &lt;generalized_schlick_bsdf> nodes you can describe a surface with multiple specular lobes. If transmission scattering is enabled the node may be layered over a VDF describing the surface interior to handle absorption and scattering inside the medium, useful for colored glass, turbid water, etc.
     * `weight` (float): Weight for this BSDF’s contribution, range [0.0, 1.0]. Defaults to 1.0.
     * `color0` (color3): Reflectivity per color component at facing angles. Defaults to (1.0, 1.0, 1.0).
-    * `color82` (color3): A multiplier on the reflectivity per color component at 82 degrees, useful for capturing the "dip" in the reflectance curve of metallic surfaces. Defaults to (1.0, 1.0, 1.0), which effectively disables "color82" for backward compatibility[^9].
+    * `color82` (color3): A multiplier on the reflectivity per color component at 82 degrees, useful for capturing the "dip" in the reflectance curve of metallic surfaces. Defaults to (1.0, 1.0, 1.0), which effectively disables "color82" for backward compatibility.
     * `color90` (color3): Reflectivity per color component at grazing angles. Defaults to (1.0, 1.0, 1.0).
     * `exponent` (float): Exponent for the Schlick blending between `color0` and `color90`. Defaults to 5.0.
     * `roughness` (vector2): Surface roughness. Defaults to (0.05, 0.05).
-    * `thinfilm_thickness` (float): The thickness of an iridescent thin film layer applied over the base bsdf, expressed in nanometers. Defaults to 0.0, for no thin film.
+    * `thinfilm_thickness` (float): The thickness of an iridescent thin film layer[^Belcour2017] applied over the base bsdf, expressed in nanometers. Defaults to 0.0, for no thin film.
     * `thinfilm_ior` (float): The index of refraction of the thin film layer. Defaults to 1.5.
     * `normal` (vector3): Normal vector of the surface. Defaults to world space normal.
     * `tangent` (vector3): Tangent vector of the surface. Defaults to world space tangent.
-    * `distribution` (uniform string): Microfacet distribution type. Defaults to "ggx".
-    * `scatter_mode` (uniform string): Scattering mode, specifying whether the BSDF supports reflection "R", transmission "T" or both reflection and transmission "RT". With "RT", reflection and transmission occur both when entering and leaving a surface, with their respective intensities controlled by the Fresnel curve. Depending on the IOR and incident angle, it is possible for total internal reflection to occur, generating no transmission even if "T" or "RT" is selected. Defaults to "R".
+    * `distribution` (uniform string): Microfacet distribution type. Defaults to `ggx`.
+    * `scatter_mode` (uniform string): Scattering mode, specifying whether the BSDF supports reflection `R`, transmission `T` or both reflection and transmission `RT`. With `RT`, reflection and transmission occur both when entering and leaving a surface, with their respective intensities controlled by the Fresnel curve. Depending on the IOR and incident angle, it is possible for total internal reflection to occur, generating no transmission even if `T` or `RT` is selected. Defaults to `R`.
 
 <a id="node-translucent-bsdf"> </a>
 
@@ -234,23 +225,21 @@ The PBS nodes also make use of the following standard MaterialX types:
 
 <a id="node-subsurface-bsdf"> </a>
 
-* **`subsurface_bsdf`**: Constructs a subsurface scattering BSDF for subsurface scattering within a homogeneous medium. The parameterization is chosen to match random walk Monte Carlo methods as well as approximate empirical methods[^10]. Note that this category of subsurface scattering can be defined more rigorously as a BSDF vertically layered over an [<anisotropic_vdf>](#node-anisotropic-vdf), and we expect these two descriptions of the scattering-surface distribution function to be unified in future versions of MaterialX.
-
+* **`subsurface_bsdf`**: Constructs a subsurface scattering BSDF for subsurface scattering within a homogeneous medium. The parameterization is chosen to match random walk Monte Carlo methods as well as approximate empirical methods[^Christensen2015]. Note that this category of subsurface scattering can be defined more rigorously as a BSDF vertically layered over an [<anisotropic_vdf>](#node-anisotropic-vdf), and we expect these two descriptions of the scattering-surface distribution function to be unified in future versions of MaterialX.
     * `weight` (float): Weight for this BSDF’s contribution, range [0.0, 1.0]. Defaults to 1.0.
     * `color` (color3): Diffuse reflectivity (albedo). Defaults to (0.18, 0.18, 0.18).
-    * `radius` (color3): Sets the average distance that light might propagate below the surface before scattering back out. This is also known as the mean free path of the material. The radius can be set for each color component separately.  Default is (1, 1, 1).
+    * `radius` (color3): Sets the average distance that light might propagate below the surface before scattering back out. This is also known as the mean free path of the material. The radius can be set for each color component separately. Defaults to (1, 1, 1).
     * `anisotropy` (float): Anisotropy factor, controlling the scattering direction, range [-1.0, 1.0]. Negative values give backwards scattering, positive values give forward scattering, and a value of zero gives uniform scattering. Defaults to 0.0.
     * `normal` (vector3): Normal vector of the surface. Defaults to world space normal.
 
 <a id="node-sheen-bsdf"> </a>
 
-* **`sheen_bsdf`**: Constructs a microfacet BSDF for the back-scattering properties of cloth-like materials. This node may be layered vertically over a base BSDF using a [&lt;layer> node](#node-layer). All energy that is not reflected will be transmitted to the base layer[^11].
-
-
+* **`sheen_bsdf`**: Constructs a microfacet BSDF for the back-scattering properties of cloth-like materials. This node may be layered vertically over a base BSDF using a [&lt;layer>](#node-layer) node. All energy that is not reflected will be transmitted to the base layer. A `mode` option selects between two available sheen models, Conty-Kulla[^Conty2017] and Zeltner[^Zeltner2022].
     * `weight` (float): Weight for this BSDF’s contribution, range [0.0, 1.0]. Defaults to 1.0.
     * `color` (color3): Sheen reflectivity. Defaults to (1.0, 1.0, 1.0).
     * `roughness` (float): Surface roughness, range [0.0, 1.0]. Defaults to 0.3.
     * `normal` (vector3): Normal vector of the surface. Defaults to world space normal.
+    * `mode` (uniform string): Selects between `conty_kulla` and `zeltner` sheen models. Defaults to `conty_kulla`.
 
 
 ## EDF Nodes
@@ -258,30 +247,28 @@ The PBS nodes also make use of the following standard MaterialX types:
 <a id="node-uniform-edf"> </a>
 
 * **`uniform_edf`**: Constructs an EDF emitting light uniformly in all directions.
-    * `color` (color3): Radiant emittance of light leaving the surface.  Default is (1, 1, 1).
+    * `color` (color3): Radiant emittance of light leaving the surface. Defaults to (1, 1, 1).
 
 <a id="node-conical-edf"> </a>
 
 * **`conical_edf`**: Constructs an EDF emitting light inside a cone around the normal direction.
-    * `color` (color3): Radiant emittance of light leaving the surface.  Default is (1, 1, 1).
+    * `color` (color3): Radiant emittance of light leaving the surface. Defaults to (1, 1, 1).
     * `normal` (vector3): Normal vector of the surface. Defaults to world space normal.
     * `inner_angle` (uniform float): Angle of inner cone where intensity falloff starts (given in degrees). Defaults to 60.
     * `outer_angle` (uniform float): Angle of outer cone where intensity goes to zero (given in degrees). If set to a smaller value than inner angle no falloff will occur within the cone. Defaults to 0.
 
 <a id="node-measured-edf"> </a>
 
-* **`measured_edf`**: Constructs an EDF emitting light according to a measured IES light profile[^12].
-
-
-    * `color` (color3): Radiant emittance of light leaving the surface.  Default is (1, 1, 1).
+* **`measured_edf`**: Constructs an EDF emitting light according to a measured IES light profile.
+    * `color` (color3): Radiant emittance of light leaving the surface. Defaults to (1, 1, 1).
     * `normal` (vector3): Normal vector of the surface. Defaults to world space normal.
-    * `file` (uniform filename): Path to a file containing IES light profile data.  Default is "".
+    * `file` (uniform filename): Path to a file containing IES light profile data. Defaults to "".
 
 <a id="node-generalized-schlick-edf"> </a>
 
 * **`generalized_schlick_edf`**: Adds a directionally varying factor to an EDF. Scales the emission distribution of the base EDF according to a generalized Schlick Fresnel curve.
-    * `color0` (color3): Scale factor for emittance at facing angles. Default is (1, 1, 1).
-    * `color90` (color3): Scale factor for emittance at grazing angles. Default is (1, 1, 1).
+    * `color0` (color3): Scale factor for emittance at facing angles. Defaults to (1, 1, 1).
+    * `color90` (color3): Scale factor for emittance at grazing angles. Defaults to (1, 1, 1).
     * `exponent` (float): Exponent for the Schlick blending between `color0` and `color90`. Defaults to 5.0.
     * `base` (EDF): The base EDF to be modified. Defaults to "".
 
@@ -291,14 +278,13 @@ The PBS nodes also make use of the following standard MaterialX types:
 <a id="node-absorption-vdf"> </a>
 
 * **`absorption_vdf`**: Constructs a VDF for pure light absorption.
-    * `absorption` (color3): Absorption rate for the medium (rate per distance traveled in the medium, given in _m<sup>−1</sup>_). Set for each color component/wavelength separately. Default is (0, 0, 0).
+    * `absorption` (color3): Absorption rate for the medium (rate per distance traveled in the medium, given in _m<sup>−1</sup>_). Set for each color component/wavelength separately. Defaults to (0, 0, 0).
 
 <a id="node-anisotropic-vdf"> </a>
 
-* **`anisotropic_vdf`**: Constructs a VDF scattering light for a participating medium, based on the Henyey-Greenstein phase function[^13]. Forward, backward and uniform scattering is supported and controlled by the anisotropy input.
-
-    * `absorption` (color3): Absorption rate for the medium (rate per distance traveled in the medium, given in _m<sup>−1</sup>_). Set for each color component/wavelength separately. Default is (0, 0, 0).
-    * `scattering` (color3): Scattering rate for the medium (rate per distance traveled in the medium, given in _m<sup>−1</sup>_). Set for each color component/wavelength separately. Default is (0, 0, 0).
+* **`anisotropic_vdf`**: Constructs a VDF scattering light for a participating medium, based on the Henyey-Greenstein phase function[^Pharr2023]. Forward, backward and uniform scattering is supported and controlled by the anisotropy input.
+    * `absorption` (color3): Absorption rate for the medium (rate per distance traveled in the medium, given in _m<sup>−1</sup>_). Set for each color component/wavelength separately. Defaults to (0, 0, 0).
+    * `scattering` (color3): Scattering rate for the medium (rate per distance traveled in the medium, given in _m<sup>−1</sup>_). Set for each color component/wavelength separately. Defaults to (0, 0, 0).
     * `anisotropy` (float): Anisotropy factor, controlling the scattering direction, range [-1.0, 1.0]. Negative values give backwards scattering, positive values give forward scattering, and a value of 0.0 (the default) gives uniform scattering.
 
 
@@ -306,22 +292,22 @@ The PBS nodes also make use of the following standard MaterialX types:
 
 <a id="node-surface"> </a>
 
-* **`surface`**: Constructs a surface shader describing light scattering and emission for surfaces. By default the node will construct a shader for a closed surface, representing an interface to a solid volume. In this mode refraction and scattering is enabled for any transmissive BSDFs connected to this surface. By setting thin_walled to "true" the node will instead construct a thin-walled surface, representing a surface with an infinitely thin volume. In thin-walled mode refraction and scattering will be disabled. Thin-walled mode must be enabled to construct a double-sided material with different surface shaders on the front and back side of geometry (using [&lt;surfacematerial>](./MaterialX.Specification.md#node-surfacematerial) in the standard library).  Output type "surfaceshader".
-    * `bsdf` (BSDF): Bidirectional scattering distribution function for the surface.  Default is "".
-    * `edf` (EDF): Emission distribution function for the surface.  If unconnected, then no emission will occur.
+* **`surface`**: Constructs a surface shader describing light scattering and emission for surfaces. By default the node will construct a shader for a closed surface, representing an interface to a solid volume. In this mode refraction and scattering is enabled for any transmissive BSDFs connected to this surface. By setting thin_walled to "true" the node will instead construct a thin-walled surface, representing a surface with an infinitely thin volume. In thin-walled mode refraction and scattering will be disabled. Thin-walled mode must be enabled to construct a double-sided material with different surface shaders on the front and back side of geometry (using [&lt;surfacematerial>](./MaterialX.Specification.md#node-surfacematerial) in the standard library). Output type "surfaceshader".
+    * `bsdf` (BSDF): Bidirectional scattering distribution function for the surface. Defaults to "".
+    * `edf` (EDF): Emission distribution function for the surface. If unconnected, then no emission will occur.
     * `opacity` (float): Cutout opacity for the surface. Defaults to 1.0.
-    * `thin_walled` (boolean): Set to "true" to make the surface thin-walled.  Default is "false".
+    * `thin_walled` (boolean): Set to `true` to make the surface thin-walled. Defaults to `false`.
 
 <a id="node-volume"> </a>
 
-* **`volume`**: Constructs a volume shader describing a participating medium.  Output type "volumeshader".
-    * `vdf` (VDF): Volume distribution function for the medium.  Default is "".
-    * `edf` (EDF): Emission distribution function for the medium.  If unconnected, then no emission will occur.
+* **`volume`**: Constructs a volume shader describing a participating medium. Output type "volumeshader".
+    * `vdf` (VDF): Volume distribution function for the medium. Defaults to "".
+    * `edf` (EDF): Emission distribution function for the medium. If unconnected, then no emission will occur.
 
 <a id="node-light"> </a>
 
 * **`light`**: Constructs a light shader describing an explicit light source. The light shader will emit light according to the connected EDF. If the shader is attached to geometry both sides will be considered for light emission and the EDF controls if light is emitted from both sides or not. Output type "lightshader".
-    * `edf` (EDF): Emission distribution function for the light source.  Default is no emission.
+    * `edf` (EDF): Emission distribution function for the light source. Defaults to no emission.
     * `intensity` (color3): Intensity multiplier for the EDF’s emittance. Defaults to (1.0, 1.0, 1.0).
     * `exposure` (float): Exposure control for the EDF’s emittance. Defaults to 0.0.
 
@@ -334,55 +320,55 @@ Note that the standard library includes definitions for [**`displacement`**](./M
 <a id="node-mix"> </a>
 
 * **`mix`**: Mix two same-type distribution functions according to a weight. Performs horizontal layering by linear interpolation between the two inputs, using the function "bg∗(1−mix) + fg∗mix".
-    * `bg` (BSDF or EDF or VDF): The first distribution function.  Defaults to "".
-    * `fg` (same type as `bg`): The second distribution function.  Defaults to "".
-    * `mix` (float): The mixing weight, range [0.0, 1.0].  Default is 0.
+    * `bg` (BSDF or EDF or VDF): The first distribution function. Defaults to "".
+    * `fg` (same type as `bg`): The second distribution function. Defaults to "".
+    * `mix` (float): The mixing weight, range [0.0, 1.0]. Defaults to 0.
 
 <a id="node-layer"> </a>
 
 * **`layer`**: Vertically layer a layerable BSDF such as [&lt;dielectric_bsdf>](#node-dielectric-bsdf), [&lt;generalized_schlick_bsdf>](#node-generalized-schlick-bsdf) or [&lt;sheen_bsdf>](#node-sheen-bsdf) over a BSDF or VDF. The implementation is target specific, but a standard way of handling this is by albedo scaling, using the function "base*(1-reflectance(top)) + top", where the reflectance function calculates the directional albedo of a given BSDF.
-    * `top` (BSDF): The top BSDF.  Defaults to "".
-    * `base` (BSDF or VDF): The base BSDF or VDF.  Defaults to "".
+    * `top` (BSDF): The top BSDF. Defaults to "".
+    * `base` (BSDF or VDF): The base BSDF or VDF. Defaults to "".
 
 <a id="node-add"> </a>
 
 * **`add`**: Additively blend two distribution functions of the same type.
-    * `in1` (BSDF or EDF or VDF): The first distribution function.  Defaults to "".
-    * `in2` (same type as `in1`): The second distribution function.  Defaults to "".
+    * `in1` (BSDF or EDF or VDF): The first distribution function. Defaults to "".
+    * `in2` (same type as `in1`): The second distribution function. Defaults to "".
 
 <a id="node-multiply"> </a>
 
 * **`multiply`**: Multiply the contribution of a distribution function by a scaling weight. The weight is either a float to attenuate the channels uniformly, or a color which can attenuate the channels separately. To be energy conserving the scaling weight should be no more than 1.0 in any channel.
-    * `in1` (BSDF or EDF or VDF): The distribution function to scale.  Defaults to "".
-    * `in2` (float or color3): The scaling weight.  Default is 1.0.
+    * `in1` (BSDF or EDF or VDF): The distribution function to scale. Defaults to "".
+    * `in2` (float or color3): The scaling weight. Defaults to 1.0.
 
 <a id="node-roughness-anisotropy"> </a>
 
-* **`roughness_anisotropy`**: Calculates anisotropic surface roughness from a scalar roughness and anisotropy parameterization. An anisotropy value above 0.0 stretches the roughness in the direction of the surface's "tangent" vector. An anisotropy value of 0.0 gives isotropic roughness. The roughness value is squared to achieve a more linear roughness look over the input range [0,1].  Output type "vector2".
+* **`roughness_anisotropy`**: Calculates anisotropic surface roughness from a scalar roughness and anisotropy parameterization. An anisotropy value above 0.0 stretches the roughness in the direction of the surface's "tangent" vector. An anisotropy value of 0.0 gives isotropic roughness. The roughness value is squared to achieve a more linear roughness look over the input range [0,1]. Output type `vector2`.
     * `roughness` (float): Roughness value, range [0.0, 1.0]. Defaults to 0.0.
     * `anisotropy` (float): Amount of anisotropy, range [0.0, 1.0]. Defaults to 0.0.
 
 <a id="node-roughness-dual"> </a>
 
-* **`roughness_dual`**: Calculates anisotropic surface roughness from a dual surface roughness parameterization. The roughness is squared to achieve a more linear roughness look over the input range [0,1].  Output type "vector2".
+* **`roughness_dual`**: Calculates anisotropic surface roughness from a dual surface roughness parameterization. The roughness is squared to achieve a more linear roughness look over the input range [0,1]. Output type `vector2`.
     * `roughness` (vector2): Roughness in x and y directions, range [0.0, 1.0]. Defaults to (0.0, 0.0).
 
 <a id="node-glossiness-anisotropy"> </a>
 
-* **`glossiness_anisotropy`**: Calculates anisotropic surface roughness from a scalar glossiness and anisotropy parameterization. This node gives the same result as roughness anisotropy except that the glossiness value is an inverted roughness value. To be used as a convenience for shading models using the glossiness parameterization.  Output type "vector2".
+* **`glossiness_anisotropy`**: Calculates anisotropic surface roughness from a scalar glossiness and anisotropy parameterization. This node gives the same result as roughness anisotropy except that the glossiness value is an inverted roughness value. To be used as a convenience for shading models using the glossiness parameterization. Output type `vector2`.
     * `glossiness` (float): Roughness value, range [0.0, 1.0]. Defaults to 0.0.
     * `anisotropy` (float): Amount of anisotropy, range [0.0, 1.0]. Defaults to 0.0.
 
 <a id="node-blackbody"> </a>
 
-* **`blackbody`**: Returns the radiant emittance of a blackbody radiator with the given temperature.  Output type "color3".
-    * `temperature` (float): Temperature in Kelvin.  Default is 5000.
+* **`blackbody`**: Returns the radiant emittance of a blackbody radiator with the given temperature. Output type `color3`.
+    * `temperature` (float): Temperature in Kelvin. Defaults to 5000.
 
 <a id="node-artistic-ior"> </a>
 
-* **`artistic_ior`**: Converts the artistic parameterization reflectivity and edge_color to complex IOR values. To be used with the [&lt;conductor_bsdf> node](#node-conductor-bsdf).
-    * `reflectivity` (color3): Reflectivity per color component at facing angles.  Default is (0.947, 0.776, 0.371).
-    * `edge_color` (color3): Reflectivity per color component at grazing angles.  Default is (1.0, 0.982, 0.753).
+* **`artistic_ior`**: Converts the artistic parameterization reflectivity and edge_color to complex IOR values. To be used with the [&lt;conductor_bsdf>](#node-conductor-bsdf) node.
+    * `reflectivity` (color3): Reflectivity per color component at facing angles. Defaults to (0.947, 0.776, 0.371).
+    * `edge_color` (color3): Reflectivity per color component at grazing angles. Defaults to (1.0, 0.982, 0.753).
     * `ior` (**output**, vector3): Computed index of refraction.
     * `extinction` (**output**, vector3): Computed extinction coefficient.
 
@@ -395,7 +381,7 @@ This section contains examples of shading model implementations using the Materi
 
 ## Autodesk Standard Surface
 
-This is a surface shading model used in Autodesk products created by the Solid Angle team for the Arnold renderer. It is an über shader built from ten different BSDF layers[^14].
+This is a surface shading model used in Autodesk products created by the Solid Angle team for the Arnold renderer. It is an über shader built from ten different BSDF layers[^Georgiev2019].
 
 A MaterialX definition and nodegraph implementation of Autodesk Standard Surface can be found here:  
 [https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/bxdf/standard_surface.mtlx](https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/bxdf/standard_surface.mtlx)
@@ -403,7 +389,7 @@ A MaterialX definition and nodegraph implementation of Autodesk Standard Surface
 
 ## UsdPreviewSurface
 
-This is a shading model proposed by Pixar for USD[^15]. It is meant to model a physically based surface that strikes a balance between expressiveness and reliable interchange between current day DCC’s and game engines and other real-time rendering clients.
+This is a shading model proposed by Pixar for USD[^Pixar2019]. It is meant to model a physically based surface that strikes a balance between expressiveness and reliable interchange between current day DCC’s and game engines and other real-time rendering clients.
 
 A MaterialX definition and nodegraph implementation of UsdPreviewSurface can be found here:  
 [https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/bxdf/usd_preview_surface.mtlx](https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/bxdf/usd_preview_surface.mtlx)
@@ -417,9 +403,18 @@ A MaterialX definition and nodegraph implementation of glTF PBR can be found her
 [https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/bxdf/gltf_pbr.mtlx](https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/bxdf/gltf_pbr.mtlx)
 
 
+## OpenPBR Surface
+
+This is an open surface shading model that was designed as a collaboration between Adobe, Autodesk, and other companies in the industry, and is currently maintained as a subproject of MaterialX within the Academy Software Foundation[^Andersson2024].
+
+A MaterialX definition and nodegraph implementation of OpenPBR Surface can be found here:  
+[https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/bxdf/open_pbr_surface.mtlx](https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/bxdf/open_pbr_surface.mtlx)
+
+
+
 # Shading Translation Graphs
 
-The MaterialX PBS Library includes a number of nodegraphs that can be used to approximately translate the input parameters for one shading model into values to drive the inputs of a different shading model, to produce the same visual results to the degree the differences between the shading models allow.  Currently, the library includes translation graphs for:
+The MaterialX PBS Library includes a number of nodegraphs that can be used to approximately translate the input parameters for one shading model into values to drive the inputs of a different shading model, to produce the same visual results to the degree the differences between the shading models allow. Currently, the library includes translation graphs for:
 
 * Autodesk Standard Surface to UsdPreviewSurface
 * Autodesk Standard Surface to glTF
@@ -427,33 +422,28 @@ The MaterialX PBS Library includes a number of nodegraphs that can be used to ap
 
 # References
 
-[^1]: <https://github.com/materialx/MaterialX/blob/master/documents/DeveloperGuide/ShaderGeneration.md>
-
-[^2]: M. Oren, S.K. Nayar, **Diffuse reflectance from rough surfaces**, <https://ieeexplore.ieee.org/abstract/document/341163>, 1993
-
-[^3]: Brent Burley, **Physically-Based Shading at Disney**, <https://media.disneyanimation.com/uploads/production/publication\_asset/48/asset/s2012\_pbs\_disney\_brdf\_notes\_v3.pdf>, 2012
-
-[^4]: Bruce Walter et al., **Microfacet Models for Refraction through Rough Surfaces**, <https://www.cs.cornell.edu/\~srm/publications/EGSR07-btdf.pdf>, 2007
+[^Andersson2024]: Andersson et al., **OpenPBR Surface Specification**, <https://academysoftwarefoundation.github.io/OpenPBR/>, 2024.
 
-[^5]: Laurent Belcour, Pascal Barla, **A Practical Extension to Microfacet Theory for the Modeling of Varying Iridescence**, <https://belcour.github.io/blog/research/2017/05/01/brdf-thin-film.html>, 2017
+[^Belcour2017]: Laurent Belcour, Pascal Barla, **A Practical Extension to Microfacet Theory for the Modeling of Varying Iridescence**, <https://belcour.github.io/blog/research/publication/2017/05/01/brdf-thin-film.html>, 2017
 
-[^6]: Brent Burley, **Physically-Based Shading at Disney**, <https://disney-animation.s3.amazonaws.com/library/s2012_pbs_disney_brdf_notes_v2.pdf>, 2012
+[^Burley2012]: Brent Burley, **Physically-Based Shading at Disney**, <https://media.disneyanimation.com/uploads/production/publication_asset/48/asset/s2012_pbs_disney_brdf_notes_v3.pdf>, 2012
 
-[^7]: Ole Gulbrandsen, **Artist Friendly Metallic Fresnel**, <http://jcgt.org/published/0003/04/03/paper.pdf>, 2014
+[^Christensen2015]: Per H. Christensen, Brent Burley, **Approximate Reflectance Profiles for Efficient Subsurface Scattering**, <http://graphics.pixar.com/library/ApproxBSSRDF/> 2015
 
-[^8]: Sony Pictures Imageworks, **Revisiting Physically Based Shading at Imageworks**, <https://blog.selfshadow.com/publications/s2017-shading-course/imageworks/s2017\_pbs\_imageworks\_slides.pdf>
+[^Conty2017]: Alejandro Conty, Christopher Kulla, **Production Friendly Microfacet Sheen BRDF**, <https://fpsunflower.github.io/ckulla/data/s2017_pbs_imageworks_sheen.pdf>, 2017
 
-[^9]: Naty Hoffman, **Generalization of Adobe's Fresnel Model**, <https://renderwonk.com/publications/wp-generalization-adobe/gen-adobe.pdf> 2023
+[^Georgiev2019]: Iliyan Georgiev et al., **Autodesk Standard Surface**, <https://autodesk.github.io/standard-surface/>, 2019.
 
-[^10]: Pixar, **Approximate Reflectance Profiles for Efficient Subsurface Scattering**, <http://graphics.pixar.com/library/ApproxBSSRDF/> 2015
+[^Gulbrandsen2014]: Ole Gulbrandsen, **Artist Friendly Metallic Fresnel**, <http://jcgt.org/published/0003/04/03/paper.pdf>, 2014
 
-[^11]: Sony Pictures Imageworks, **Production Friendly Microfacet Sheen BRDF**, <https://blog.selfshadow.com/publications/s2017-shading-course/imageworks/s2017\_pbs\_imageworks\_sheen.pdf>
+[^Hoffman2023]: Naty Hoffman, **Generalization of Adobe's Fresnel Model**, <https://renderwonk.com/publications/wp-generalization-adobe/gen-adobe.pdf> 2023
 
-[^12]: **Standard File Format for Electronic Transfer of Photometric Data**, <https://www.ies.org/product/standard-file-format-for-electronic-transfer-of-photometric-data/>
+[^Oren1994]: Michael Oren, Shree K. Nayar, **Generalization of Lambert’s Reflectance Model**, <https://www1.cs.columbia.edu/CAVE/publications/pdfs/Oren_SIGGRAPH94.pdf>, 1994
 
-[^13]: Matt Pharr, Wenzel Jakob, Greg Humphreys, **Physically Based Rendering: From Theory To Implementation**, Chapter 11.2, <http://www.pbr-book.org/3ed-2018/Volume\_Scattering/Phase\_Functions.html>
+[^Pharr2023]: Matt Pharr et al., **Physically Based Rendering: From Theory To Implementation**, <https://www.pbr-book.org/>, 2023
 
-[^14]: Autodesk, **A Surface Standard**, <https://github.com/Autodesk/standard-surface>, 2019.
+[^Pixar2019]: Pixar Animation Studios, **UsdPreviewSurface Specification**, <https://openusd.org/release/spec_usdpreviewsurface.html>, 2019.
 
-[^15]: Pixar, **UsdPreviewSurface Proposal**, <<https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html>, 2018.
+[^Walter2007]: Bruce Walter et al., **Microfacet Models for Refraction through Rough Surfaces**, <https://www.graphics.cornell.edu/~bjw/microfacetbsdf.pdf>, 2007
 
+[^Zeltner2022]: Tizian Zeltner et al., **Practical Multiple-Scattering Sheen Using Linearly Transformed Cosines**, <https://tizianzeltner.com/projects/Zeltner2022Practical/>, 2022

From ad0615bfa6cfdce26f5f66f68da834e97bd27db1 Mon Sep 17 00:00:00 2001
From: HudsonHN <hudsonhannguyen@gmail.com>
Date: Sun, 30 Jun 2024 10:56:46 -0700
Subject: [PATCH 46/48] Fix keyboard input focus in Graph Editor (#1596)

Changed IsWindowFocused flags for inputs mentioned in #1424 to prevent all panels from responding.
---
 source/MaterialXGraphEditor/Graph.cpp | 77 ++++++++++++++-------------
 1 file changed, 40 insertions(+), 37 deletions(-)

diff --git a/source/MaterialXGraphEditor/Graph.cpp b/source/MaterialXGraphEditor/Graph.cpp
index 9b84698c4b..f2382e288e 100644
--- a/source/MaterialXGraphEditor/Graph.cpp
+++ b/source/MaterialXGraphEditor/Graph.cpp
@@ -3622,7 +3622,7 @@ void Graph::showHelp() const
 
 void Graph::addNodePopup(bool cursor)
 {
-    bool open_AddPopup = ImGui::IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows) && ImGui::IsKeyReleased(ImGuiKey_Tab);
+    bool open_AddPopup = ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow) && ImGui::IsKeyReleased(ImGuiKey_Tab);
     static char input[32]{ "" };
     if (open_AddPopup)
     {
@@ -4068,55 +4068,58 @@ void Graph::drawGraph(ImVec2 mousePos)
         _initial = false;
         _autoLayout = false;
 
+        // Start the session with content centered
+        if (ImGui::GetFrameCount() == 2)
+        {
+            ed::NavigateToContent(0.0f);
+        }
+
         // Delete selected nodes and their links if delete key is pressed
         // or if the shortcut for cut is used
-        if (ImGui::IsKeyReleased(ImGuiKey_Delete) || _isCut)
+        if (ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow))
         {
-            if (selectedNodes.size() > 0)
+            if (ImGui::IsKeyReleased(ImGuiKey_Delete) || _isCut)
             {
-                _frameCount = ImGui::GetFrameCount();
-                _renderer->setMaterialCompilation(true);
-                for (ed::NodeId id : selectedNodes)
+                if (selectedNodes.size() > 0)
                 {
-
-                    if (int(id.Get()) > 0)
+                    _frameCount = ImGui::GetFrameCount();
+                    _renderer->setMaterialCompilation(true);
+                    for (ed::NodeId id : selectedNodes)
                     {
-                        int pos = findNode(int(id.Get()));
-                        if (pos >= 0 && !readOnly())
-                        {
-                            deleteNode(_graphNodes[pos]);
-                            _delete = true;
-                            ed::DeselectNode(id);
-                            ed::DeleteNode(id);
-                            _currUiNode = nullptr;
-                        }
-                        else if (readOnly())
+
+                        if (int(id.Get()) > 0)
                         {
-                            _popup = true;
+                            int pos = findNode(int(id.Get()));
+                            if (pos >= 0 && !readOnly())
+                            {
+                                deleteNode(_graphNodes[pos]);
+                                _delete = true;
+                                ed::DeselectNode(id);
+                                ed::DeleteNode(id);
+                                _currUiNode = nullptr;
+                            }
+                            else if (readOnly())
+                            {
+                                _popup = true;
+                            }
                         }
                     }
+                    linkGraph();
                 }
-                linkGraph();
+                _isCut = false;
             }
-            _isCut = false;
-        }
-
-        // Start the session with content centered
-        if (ImGui::GetFrameCount() == 2)
-        {
-            ed::NavigateToContent(0.0f);
-        }
 
-        // Hotkey to frame selected node(s)
-        if (ImGui::IsKeyReleased(ImGuiKey_F) && !_fileDialogSave.isOpened())
-        {
-            ed::NavigateToSelection();
-        }
+            // Hotkey to frame selected node(s)
+            if (ImGui::IsKeyReleased(ImGuiKey_F) && !_fileDialogSave.isOpened())
+            {
+                ed::NavigateToSelection();
+            }
 
-        // Go back up from inside a subgraph
-        if (ImGui::IsKeyReleased(ImGuiKey_U) && (!ImGui::IsPopupOpen("add node")) && (!ImGui::IsPopupOpen("search")) && !_fileDialogSave.isOpened())
-        {
-            upNodeGraph();
+            // Go back up from inside a subgraph
+            if (ImGui::IsKeyReleased(ImGuiKey_U) && (!ImGui::IsPopupOpen("add node")) && (!ImGui::IsPopupOpen("search")) && !_fileDialogSave.isOpened())
+            {
+                upNodeGraph();
+            }
         }
 
         // Add new link

From 5b4f6599671121cd03b93e609c91c6ce5a73c4b6 Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Sun, 30 Jun 2024 14:26:18 -0700
Subject: [PATCH 47/48] Add support for GCC 14

This changelist adds a GCC 14 build to GitHub CI, and updates compiler warning settings as needed for external libraries such as stb_image.

Additional minor formatting updates have been made to CMakeLists.txt files for consistency.
---
 .github/workflows/main.yml                 | 4 ++--
 source/MaterialXCore/CMakeLists.txt        | 7 ++-----
 source/MaterialXFormat/CMakeLists.txt      | 4 +---
 source/MaterialXGenGlsl/CMakeLists.txt     | 4 +---
 source/MaterialXGenMdl/CMakeLists.txt      | 5 +----
 source/MaterialXGenMsl/CMakeLists.txt      | 4 +---
 source/MaterialXGenOsl/CMakeLists.txt      | 4 +---
 source/MaterialXGenShader/CMakeLists.txt   | 4 +---
 source/MaterialXGraphEditor/CMakeLists.txt | 4 ++--
 source/MaterialXRender/CMakeLists.txt      | 7 ++++---
 source/MaterialXRenderGlsl/CMakeLists.txt  | 6 +-----
 source/MaterialXRenderHw/CMakeLists.txt    | 4 +---
 source/MaterialXRenderMsl/CMakeLists.txt   | 6 +-----
 source/MaterialXRenderOsl/CMakeLists.txt   | 4 +---
 source/MaterialXView/CMakeLists.txt        | 2 +-
 source/PyMaterialX/CMakeLists.txt          | 3 +--
 16 files changed, 22 insertions(+), 50 deletions(-)

diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index f2ae2afbbc..d96309b0c2 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -32,10 +32,10 @@ jobs:
           python: 3.11
           build_javascript: ON
 
-        - name: Linux_GCC_13_Python312
+        - name: Linux_GCC_14_Python312
           os: ubuntu-24.04
           compiler: gcc
-          compiler_version: "13"
+          compiler_version: "14"
           python: 3.12
           static_analysis: ON
           cmake_config: -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
diff --git a/source/MaterialXCore/CMakeLists.txt b/source/MaterialXCore/CMakeLists.txt
index 8fc8767061..c3c845afda 100644
--- a/source/MaterialXCore/CMakeLists.txt
+++ b/source/MaterialXCore/CMakeLists.txt
@@ -1,4 +1,3 @@
-
 configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Generated.h.in ${CMAKE_CURRENT_BINARY_DIR}/Generated.h)
 
 file(GLOB materialx_source "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
@@ -10,11 +9,9 @@ mx_add_library(MaterialXCore
     HEADER_FILES
         ${materialx_headers}
     EXPORT_DEFINE
-        MATERIALX_CORE_EXPORTS
-)
+        MATERIALX_CORE_EXPORTS)
 
 # Need to add the binary directory to find the Generated.h file generated above.
 target_include_directories(${TARGET_NAME}
         PUBLIC
-        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../>
-)
+        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/../>)
diff --git a/source/MaterialXFormat/CMakeLists.txt b/source/MaterialXFormat/CMakeLists.txt
index e884e6bcbc..b58ab0b166 100644
--- a/source/MaterialXFormat/CMakeLists.txt
+++ b/source/MaterialXFormat/CMakeLists.txt
@@ -1,4 +1,3 @@
-
 file(GLOB_RECURSE materialx_source "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
 file(GLOB_RECURSE materialx_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h*")
 
@@ -10,5 +9,4 @@ mx_add_library(MaterialXFormat
     LIBRARIES
         MaterialXCore
     EXPORT_DEFINE
-        MATERIALX_FORMAT_EXPORTS
-)
+        MATERIALX_FORMAT_EXPORTS)
diff --git a/source/MaterialXGenGlsl/CMakeLists.txt b/source/MaterialXGenGlsl/CMakeLists.txt
index 469d495e56..bd03965b62 100644
--- a/source/MaterialXGenGlsl/CMakeLists.txt
+++ b/source/MaterialXGenGlsl/CMakeLists.txt
@@ -1,4 +1,3 @@
-
 file(GLOB_RECURSE materialx_source "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
 file(GLOB_RECURSE materialx_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h*")
 
@@ -11,5 +10,4 @@ mx_add_library(MaterialXGenGlsl
         MaterialXGenShader
         MaterialXCore
     EXPORT_DEFINE
-        MATERIALX_GENGLSL_EXPORTS
-)
+        MATERIALX_GENGLSL_EXPORTS)
diff --git a/source/MaterialXGenMdl/CMakeLists.txt b/source/MaterialXGenMdl/CMakeLists.txt
index ed11b30182..25e1e218a6 100644
--- a/source/MaterialXGenMdl/CMakeLists.txt
+++ b/source/MaterialXGenMdl/CMakeLists.txt
@@ -1,4 +1,3 @@
-
 file(GLOB_RECURSE materialx_source "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
 file(GLOB_RECURSE materialx_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h*")
 
@@ -11,6 +10,4 @@ mx_add_library(MaterialXGenMdl
         MaterialXGenShader
         MaterialXCore
     EXPORT_DEFINE
-        MATERIALX_GENMDL_EXPORTS
-)
-
+        MATERIALX_GENMDL_EXPORTS)
diff --git a/source/MaterialXGenMsl/CMakeLists.txt b/source/MaterialXGenMsl/CMakeLists.txt
index 5f59f975e9..9dbfd666f7 100644
--- a/source/MaterialXGenMsl/CMakeLists.txt
+++ b/source/MaterialXGenMsl/CMakeLists.txt
@@ -1,4 +1,3 @@
-
 file(GLOB_RECURSE materialx_source "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
 file(GLOB_RECURSE materialx_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h*")
 
@@ -11,5 +10,4 @@ mx_add_library(MaterialXGenMsl
         MaterialXGenShader
         MaterialXCore
     EXPORT_DEFINE
-        MATERIALX_GENMSL_EXPORTS
-)
+        MATERIALX_GENMSL_EXPORTS)
diff --git a/source/MaterialXGenOsl/CMakeLists.txt b/source/MaterialXGenOsl/CMakeLists.txt
index 35a416df12..398f390c64 100644
--- a/source/MaterialXGenOsl/CMakeLists.txt
+++ b/source/MaterialXGenOsl/CMakeLists.txt
@@ -1,4 +1,3 @@
-
 file(GLOB_RECURSE materialx_source "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
 file(GLOB_RECURSE materialx_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h*")
 
@@ -11,5 +10,4 @@ mx_add_library(MaterialXGenOsl
         MaterialXGenShader
         MaterialXCore
     EXPORT_DEFINE
-        MATERIALX_GENOSL_EXPORTS
-)
+        MATERIALX_GENOSL_EXPORTS)
diff --git a/source/MaterialXGenShader/CMakeLists.txt b/source/MaterialXGenShader/CMakeLists.txt
index 597adba5fb..ebdf814234 100644
--- a/source/MaterialXGenShader/CMakeLists.txt
+++ b/source/MaterialXGenShader/CMakeLists.txt
@@ -1,4 +1,3 @@
-
 file(GLOB_RECURSE materialx_source "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
 file(GLOB_RECURSE materialx_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h*")
 
@@ -11,5 +10,4 @@ mx_add_library(MaterialXGenShader
         MaterialXFormat
         MaterialXCore
     EXPORT_DEFINE
-        MATERIALX_GENSHADER_EXPORTS
-)
+        MATERIALX_GENSHADER_EXPORTS)
diff --git a/source/MaterialXGraphEditor/CMakeLists.txt b/source/MaterialXGraphEditor/CMakeLists.txt
index 7521ba9261..495213bfb6 100644
--- a/source/MaterialXGraphEditor/CMakeLists.txt
+++ b/source/MaterialXGraphEditor/CMakeLists.txt
@@ -80,10 +80,10 @@ set(MATERIALX_LIBRARIES
     MaterialXGenGlsl
     MaterialXRenderGlsl)
 
-if (APPLE)
+if(APPLE)
     find_library(CORE_FOUNDATION Foundation REQUIRED)
     list(APPEND MATERIALX_LIBRARIES ${CORE_FOUNDATION})
-endif ()
+endif()
 
 target_link_libraries(
     MaterialXGraphEditor
diff --git a/source/MaterialXRender/CMakeLists.txt b/source/MaterialXRender/CMakeLists.txt
index c0326153a4..d96fc203e7 100644
--- a/source/MaterialXRender/CMakeLists.txt
+++ b/source/MaterialXRender/CMakeLists.txt
@@ -1,4 +1,3 @@
-
 file(GLOB_RECURSE materialx_source "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
 file(GLOB_RECURSE materialx_inlined "${CMAKE_CURRENT_SOURCE_DIR}/*.inl")
 file(GLOB_RECURSE materialx_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h*")
@@ -15,11 +14,13 @@ mx_add_library(MaterialXRender
     LIBRARIES
         MaterialXGenShader
     EXPORT_DEFINE
-        MATERIALX_RENDER_EXPORTS
-)
+        MATERIALX_RENDER_EXPORTS)
 
 if(UNIX)
     target_compile_options(${TARGET_NAME} PRIVATE -Wno-unused-function)
+    if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
+        target_compile_options(${TARGET_NAME} PRIVATE -Wno-stringop-overflow)
+    endif()
 endif()
 
 if(MATERIALX_BUILD_OIIO)
diff --git a/source/MaterialXRenderGlsl/CMakeLists.txt b/source/MaterialXRenderGlsl/CMakeLists.txt
index 81c6bb75ad..2f0cefde1f 100644
--- a/source/MaterialXRenderGlsl/CMakeLists.txt
+++ b/source/MaterialXRenderGlsl/CMakeLists.txt
@@ -1,4 +1,3 @@
-
 file(GLOB_RECURSE materialx_source "${CMAKE_CURRENT_SOURCE_DIR}/*.c*")
 file(GLOB_RECURSE materialx_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h*")
 
@@ -24,7 +23,6 @@ elseif(UNIX)
     find_package(OpenGL REQUIRED)
 endif()
 
-
 mx_add_library(MaterialXRenderGlsl
     SOURCE_FILES
         ${materialx_source}
@@ -35,9 +33,7 @@ mx_add_library(MaterialXRenderGlsl
         MaterialXGenGlsl
     EXPORT_DEFINE
         MATERIALX_RENDERGLSL_EXPORTS
-    ADD_OBJECTIVE_C_CODE
-)
-
+    ADD_OBJECTIVE_C_CODE)
 
 if(APPLE)
     target_compile_definitions(${TARGET_NAME} PRIVATE -DGL_SILENCE_DEPRECATION)
diff --git a/source/MaterialXRenderHw/CMakeLists.txt b/source/MaterialXRenderHw/CMakeLists.txt
index 0a314e0749..ac9b20e2bf 100644
--- a/source/MaterialXRenderHw/CMakeLists.txt
+++ b/source/MaterialXRenderHw/CMakeLists.txt
@@ -15,7 +15,6 @@ elseif(UNIX)
     endif()
 endif()
 
-
 mx_add_library(MaterialXRenderHw
     SOURCE_FILES
         ${materialx_source}
@@ -25,8 +24,7 @@ mx_add_library(MaterialXRenderHw
         MaterialXRender
     EXPORT_DEFINE
         MATERIALX_RENDERHW_EXPORTS
-    ADD_OBJECTIVE_C_CODE
-)
+    ADD_OBJECTIVE_C_CODE)
 
 if(APPLE)
     target_link_libraries(
diff --git a/source/MaterialXRenderMsl/CMakeLists.txt b/source/MaterialXRenderMsl/CMakeLists.txt
index dedadb5a57..7807251ad9 100644
--- a/source/MaterialXRenderMsl/CMakeLists.txt
+++ b/source/MaterialXRenderMsl/CMakeLists.txt
@@ -1,4 +1,3 @@
-
 file(GLOB_RECURSE materialx_source "${CMAKE_CURRENT_SOURCE_DIR}/*.m*")
 file(GLOB_RECURSE materialx_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h*")
 
@@ -22,7 +21,6 @@ elseif(UNIX)
     find_package(OpenGL REQUIRED)
 endif()
 
-
 mx_add_library(MaterialXRenderMsl
     SOURCE_FILES
         ${materialx_source}
@@ -33,9 +31,7 @@ mx_add_library(MaterialXRenderMsl
         MaterialXGenMsl
     EXPORT_DEFINE
         MATERIALX_RENDERMSL_EXPORTS
-    ADD_OBJECTIVE_C_CODE
-)
-
+    ADD_OBJECTIVE_C_CODE)
 
 if(APPLE)
     target_compile_definitions(${TARGET_NAME} PRIVATE -DGL_SILENCE_DEPRECATION)
diff --git a/source/MaterialXRenderOsl/CMakeLists.txt b/source/MaterialXRenderOsl/CMakeLists.txt
index 04d735061a..033558fcaa 100644
--- a/source/MaterialXRenderOsl/CMakeLists.txt
+++ b/source/MaterialXRenderOsl/CMakeLists.txt
@@ -1,4 +1,3 @@
-
 file(GLOB_RECURSE materialx_source "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
 file(GLOB_RECURSE materialx_headers "${CMAKE_CURRENT_SOURCE_DIR}/*.h*")
 
@@ -10,5 +9,4 @@ mx_add_library(MaterialXRenderOsl
     LIBRARIES
         MaterialXRender
     EXPORT_DEFINE
-        MATERIALX_RENDEROSL_EXPORTS
-)
+        MATERIALX_RENDEROSL_EXPORTS)
diff --git a/source/MaterialXView/CMakeLists.txt b/source/MaterialXView/CMakeLists.txt
index 9be0ab9ec0..e33a148bb3 100644
--- a/source/MaterialXView/CMakeLists.txt
+++ b/source/MaterialXView/CMakeLists.txt
@@ -68,7 +68,7 @@ else()
     elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
         add_compile_options(-Wno-deprecated)
     elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
-        add_compile_options(-Wno-format-truncation -Wno-use-after-free)
+        add_compile_options(-Wno-format-truncation -Wno-stringop-overflow -Wno-use-after-free)
     endif()
 
     # Disable NanoGUI compiler modifications for Clang
diff --git a/source/PyMaterialX/CMakeLists.txt b/source/PyMaterialX/CMakeLists.txt
index 2bbe2c9506..78fd9b58c4 100644
--- a/source/PyMaterialX/CMakeLists.txt
+++ b/source/PyMaterialX/CMakeLists.txt
@@ -1,8 +1,7 @@
 include_directories(
     ${EXTERNAL_INCLUDE_DIRS}
     ${CMAKE_CURRENT_SOURCE_DIR}/../
-    ${CMAKE_CURRENT_SOURCE_DIR}
-)
+    ${CMAKE_CURRENT_SOURCE_DIR})
 
 # Apply Python version and location requests from the user.
 set(PYBIND11_PYTHON_VERSION ${MATERIALX_PYTHON_VERSION})

From 57163b567b43065fc077c8801d599bf482e099ec Mon Sep 17 00:00:00 2001
From: Jonathan Stone <jstone@lucasfilm.com>
Date: Sun, 30 Jun 2024 18:44:23 -0700
Subject: [PATCH 48/48] Updates to NPR specification

- Add a References section for clarity.
- Remove the `lightdirection` node pending an initial implementation.
- Additional minor formatting improvements.
---
 documents/Specification/MaterialX.NPRSpec.md | 30 +++++++++++---------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/documents/Specification/MaterialX.NPRSpec.md b/documents/Specification/MaterialX.NPRSpec.md
index f519a9da61..ef32dde91c 100644
--- a/documents/Specification/MaterialX.NPRSpec.md
+++ b/documents/Specification/MaterialX.NPRSpec.md
@@ -5,10 +5,10 @@ MaterialX NPR Shading Nodes v1.39
 
 # MaterialX NPR Shading Nodes
 
-**Version 1.39**
-Doug Smythe - Industrial Light & Magic
-Jonathan Stone - Lucasfilm Advanced Development Group
-May 1, 2024
+**Version 1.39**  
+Doug Smythe - Industrial Light & Magic  
+Jonathan Stone - Lucasfilm Advanced Development Group  
+July 1, 2024
 
 # Introduction
 
@@ -24,9 +24,10 @@ This document describes a number of MaterialX nodes primarily applicable to non-
  [NPR Utility Nodes](#npr-utility-nodes)  
  [NPR Shading Nodes](#npr-shading-nodes)  
 
+**[References](#references)**
 
 
-## MaterialX NPR Library
+# MaterialX NPR Library
 
 
 ## NPR Application Nodes
@@ -35,13 +36,8 @@ This document describes a number of MaterialX nodes primarily applicable to non-
 
 * **`viewdirection`**: the current scene view direction (e.g. from the viewing/camera position to the current shading position).  If `viewdirection` is used in a PBR shading context, it should be noted that this would be the same as the incident ray direction for primary ("camera") rays but **not** for secondary/reflection rays.  This node must be of type vector3.
 
-    * `space` (uniform string):  the space in which to return the view vector direction, defaults to "world". 
+    * `space` (uniform string):  the space in which to return the view vector direction, defaults to `world`. 
 
-<a id="node-lightdirection"> </a>
-
-* **`lightdirection`**: the predominant incoming light direction, as defined by the shading environment.  This node must be of type vector3.
-
-    * `space` (uniform string):  the space in which to return the lighting vector direction, defaults to "world". 
 
 
 ## NPR Utility Nodes
@@ -61,9 +57,15 @@ This document describes a number of MaterialX nodes primarily applicable to non-
 
 <a id="node-gooch-shade"> </a>
 
-* **`gooch_shade`**: Compute Gooch Shading ([https://en.wikipedia.org/wiki/Gooch_shading](https://en.wikipedia.org/wiki/Gooch_shading) [https://users.cs.northwestern.edu/~ago820/SIG98/gooch98.pdf](https://users.cs.northwestern.edu/~ago820/SIG98/gooch98.pdf)).  Output type "surfaceshader".
-    * `warm_color` (color3): the "warm" color for shading, defaults to (0.8, 0.8, 0.7) in the "lin_rec709" colorspace.
-    * `cool_color` (color3): the "cool" color for shading, defaults to (0.3, 0.3, 0.8) in the "lin_rec709" colorspace.
+* **`gooch_shade`**: Computes the single-pass shading portion of the Gooch[^Gooch1998] lighting model.  Output type `surfaceshader`.
+    * `warm_color` (color3): the "warm" color for shading, defaults to (0.8, 0.8, 0.7) in the `lin_rec709` colorspace.
+    * `cool_color` (color3): the "cool" color for shading, defaults to (0.3, 0.3, 0.8) in the `lin_rec709` colorspace.
     * `specular_intensity` (float): the intensity of the specular component. Defaults to 1.0.
     * `shininess` (float): the specular power typically ranging from 1 to 256, defaults to 64.
     * `light_direction` (vector3): the incoming predominant lighting direction in world space, defaults to (1.0, -0.5, -0.5).
+
+
+
+# References
+
+[^Gooch1998]: Gooch et al., **A Non-Photorealistic Lighting Model For Automatic Technical Illustration**, <https://users.cs.northwestern.edu/~ago820/SIG98/gooch98.pdf>, 1998.