<?xml version="1.0"?>
<materialx version="1.38">

    <!-- Node: normal map decoder
    applies a 2x-1 to an existing normal.-->
    <nodedef name="ND_normal_map_decode" node="normal_map_decode" nodegroup="math">
        <input name="in" type="vector3" value="0.5,0.5,1.0" />
        <output name="out" type="vector3" />
    </nodedef>

    <!--
    Node: <constant>
    A constant value. When exposed as a public parameter, this is a way to create a
    value that can be accessed in multiple places in the opgraph.
    -->
    <nodedef name="ND_constant_matrix22" node="constant" nodegroup="procedural">
        <input name="value" type="matrix22" value="1.0,0.0, 0.0,1.0" />
        <output name="out" type="matrix22" default="1.0,0.0, 0.0,1.0" />
    </nodedef>

    <!--
    Node: <divide>
    Divide an incoming float/color/vector by the "in2" value/stream; dividing a channel
    value by 0 results in floating-point "NaN".  Or, multiply one matrix by the
    inverse of a second matrix.
    -->
    <nodedef name="ND_divide_matrix22" node="divide" nodegroup="math">
        <input name="in1" type="matrix22" value="1.0,0.0, 0.0,1.0" />
        <input name="in2" type="matrix22" value="1.0,0.0, 0.0,1.0" />
        <output name="out" type="matrix22" defaultinput="in1" />
    </nodedef>
    
    <!--
    Node: <multiply>
    Multiply the incoming float/color/vector by the "in2" value/stream, or multiply
    two matrices.
    -->
    <nodedef name="ND_multiply_matrix22" node="multiply" nodegroup="math">
        <input name="in1" type="matrix22" value="1.0,0.0, 0.0,1.0" />
        <input name="in2" type="matrix22" value="1.0,0.0, 0.0,1.0" />
        <output name="out" type="matrix22" defaultinput="in1" />
    </nodedef>
    <!--
    Node: <subtract>
    Subtract "in2" value/stream from the incoming float/color/vector/matrix.
    -->
    <nodedef name="ND_subtract_matrix22" node="subtract" nodegroup="math">
        <input name="in1" type="matrix22" value="1.0,0.0, 0.0,1.0" />
        <input name="in2" type="matrix22" value="0.0,0.0, 0.0,0.0" />
        <output name="out" type="matrix22" defaultinput="in1" />
    </nodedef>

    <nodedef name="ND_subtract_matrix22FA" node="subtract" nodegroup="math">
        <input name="in1" type="matrix22" value="1.0,0.0, 0.0,1.0" />
        <input name="in2" type="float" value="0.0" />
        <output name="out" type="matrix22" defaultinput="in1" />
    </nodedef>

    <!--
    Node: <add>
    Add "in2" value/stream to the incoming float/color/vector/matrix.
    -->
    <nodedef name="ND_add_matrix22FA" node="add" nodegroup="math">
        <input name="in1" type="matrix22" value="1.0,0.0, 0.0,1.0" />
        <input name="in2" type="float" value="0.0" />
        <output name="out" type="matrix22" defaultinput="in1" />
    </nodedef>

    <nodedef name="ND_add_matrix22" node="add" nodegroup="math">
        <input name="in1" type="matrix22" value="1.0,0.0, 0.0,0.0" />
        <input name="in2" type="matrix22" value="0.0,0.0, 0.0,0.0" />
        <output name="out" type="matrix22" defaultinput="in1" />
    </nodedef>
    <!--
    Node: <determinant>
    Output the determinant of the incoming matrix.
    -->
    <nodedef name="ND_determinant_matrix22" node="determinant" nodegroup="math">
        <input name="in" type="matrix22" value="1.0,0.0, 0.0,1.0" />
        <output name="out" type="float" default="1.0" />
    </nodedef>

    <!--
    Node: <transpose>
    Output the transpose of the incoming matrix.
    -->
    <nodedef name="ND_transpose_matrix22" node="transpose" nodegroup="math">
        <input name="in" type="matrix22" value="1.0,0.0, 0.0,1.0" />
        <output name="out" type="matrix22" defaultinput="in" />
    </nodedef>

    <!--
    Node: <tile value>
    Takes a 2x2 matrix and vector2, returns a color3.
    -->
    <nodedef name="ND_tile_value_matrix22_color3" node="tile" nodegroup="realitykit_test"
        target="realitykit_test">
        <input name="in" type="matrix22" value="0.0,0.0, 0.0,0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="color3" default="0.0, 0.0, 0.0" />
    </nodedef>

    <!--
    Node: <invertmatrix>
    Invert an incoming 2x2 matrix.
    -->
    <nodedef name="ND_invertmatrix_matrix22" node="invertmatrix" nodegroup="math">
        <input name="in" type="matrix22" value="1.0,0.0, 0.0,1.0" />
        <output name="out" type="matrix22" defaultinput="in" />
    </nodedef>

    <!--
    Node: <transformmatrix>
    Transform a vector by a matrix.
    -->
    <nodedef name="ND_transformmatrix_vector2" node="transformmatrix" nodegroup="math">
        <input name="in" type="vector2" value="0.0, 0.0" />
        <input name="mat" type="matrix22" value="1.0,0.0, 0.0,1.0" />
        <output name="out" type="vector2" defaultinput="in" />
    </nodedef>

    <!--
    Node: <image>
    Samples data from a single image, or from a layer within a multi-layer image.
    -->
    <nodedef name="ND_image_half" node="image" nodegroup="texture2d">
        <input name="file" type="filename" value="" uiname="Filename" uniform="true" />
        <input name="layer" type="string" value="" uiname="Layer" uniform="true" />
        <input name="default" type="half" value="0.0" uiname="Default Color" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" uiname="Texture Coordinates" />
        <input name="uaddressmode" type="string" value="periodic" enum="constant,clamp,periodic,mirror"
            uiname="Address Mode U" uniform="true" />
        <input name="vaddressmode" type="string" value="periodic" enum="constant,clamp,periodic,mirror"
            uiname="Address Mode V" uniform="true" />
        <input name="filtertype" type="string" value="linear" enum="closest,linear,cubic"
            uiname="Filter Type" uniform="true" />
        <input name="framerange" type="string" value="" uiname="Frame Range" uniform="true" />
        <input name="frameoffset" type="integer" value="0" uiname="Frame Offset" uniform="true" />
        <input name="frameendaction" type="string" value="constant"
            enum="constant,clamp,periodic,mirror" uiname="Frame End Action" uniform="true" />
        <output name="out" type="half" default="0.0" />
    </nodedef>

    <!--
    Node: <tiledimage> Supplemental Node
    Samples data from a single image, with provisions for tiling and offsetting the image
    across uv space.
    -->
    <nodedef name="ND_tiledimage_half" node="tiledimage" nodegroup="texture2d">
        <input name="file" type="filename" value="" uniform="true" />
        <input name="default" type="half" value="0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <input name="uvtiling" type="vector2" value="1.0, 1.0" />
        <input name="uvoffset" type="vector2" value="0.0, 0.0" />
        <input name="realworldimagesize" type="vector2" value="1.0, 1.0" unittype="distance" />
        <input name="realworldtilesize" type="vector2" value="1.0, 1.0" unittype="distance" />
        <input name="filtertype" type="string" value="linear" enum="closest,linear,cubic" uniform="true" />
        <input name="framerange" type="string" value="" uniform="true" />
        <input name="frameoffset" type="integer" value="0" uniform="true" />
        <input name="frameendaction" type="string" value="constant"
            enum="constant,clamp,periodic,mirror" uniform="true" />
        <output name="out" type="half" default="0.0" />
    </nodedef>

    <!--
    Node: <constant>
    A constant value. When exposed as a public parameter, this is a way to create a
    value that can be accessed in multiple places in the opgraph.
    -->
    <nodedef name="ND_constant_half" node="constant" nodegroup="procedural">
        <input name="value" type="half" value="0.0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>

    <nodedef name="ND_constant_half2" node="constant" nodegroup="procedural">
        <input name="value" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" default="0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_constant_half3" node="constant" nodegroup="procedural">
        <input name="value" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" default="0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_constant_half4" node="constant" nodegroup="procedural">
        <input name="value" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>

    <!--
    Node: <ramplr>
    A left-to-right bilinear value ramp.
    -->
    <nodedef name="ND_ramplr_half" node="ramplr" nodegroup="procedural2d">
        <input name="valuel" type="half" value="0.0" />
        <input name="valuer" type="half" value="0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <nodedef name="ND_ramplr_half2" node="ramplr" nodegroup="procedural2d">
        <input name="valuel" type="half2" value="0.0, 0.0" />
        <input name="valuer" type="half2" value="0.0, 0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half2" default="0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_ramplr_half3" node="ramplr" nodegroup="procedural2d">
        <input name="valuel" type="half3" value="0.0, 0.0, 0.0" />
        <input name="valuer" type="half3" value="0.0, 0.0, 0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half3" default="0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_ramplr_half4" node="ramplr" nodegroup="procedural2d">
        <input name="valuel" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="valuer" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>

    <!--
    Node: <ramptb>
    A top-to-bottom bilinear value ramp.
    -->
    <nodedef name="ND_ramptb_half" node="ramptb" nodegroup="procedural2d">
        <input name="valuet" type="half" value="0.0" />
        <input name="valueb" type="half" value="0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <nodedef name="ND_ramptb_half2" node="ramptb" nodegroup="procedural2d">
        <input name="valuet" type="half2" value="0.0, 0.0" />
        <input name="valueb" type="half2" value="0.0, 0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half2" default="0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_ramptb_half3" node="ramptb" nodegroup="procedural2d">
        <input name="valuet" type="half3" value="0.0, 0.0, 0.0" />
        <input name="valueb" type="half3" value="0.0, 0.0, 0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half3" default="0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_ramptb_half4" node="ramptb" nodegroup="procedural2d">
        <input name="valuet" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="valueb" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>

    <!--
    Node: <splitlr>
    A left-right split matte, split at a specified u value.
    -->
    <nodedef name="ND_splitlr_half" node="splitlr" nodegroup="procedural2d">
        <input name="valuel" type="half" value="0.0" uiname="Left" />
        <input name="valuer" type="half" value="0.0" uiname="Right" />
        <input name="center" type="float" value="0.5" uiname="Center" uimin="0.0" uimax="1.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <nodedef name="ND_splitlr_half2" node="splitlr" nodegroup="procedural2d">
        <input name="valuel" type="half2" value="0.0, 0.0" uiname="Left" />
        <input name="valuer" type="half2" value="0.0, 0.0" uiname="Right" />
        <input name="center" type="float" value="0.5" uiname="Center" uimin="0.0" uimax="1.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half2" default="0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_splitlr_half3" node="splitlr" nodegroup="procedural2d">
        <input name="valuel" type="half3" value="0.0, 0.0, 0.0" uiname="Left" />
        <input name="valuer" type="half3" value="0.0, 0.0, 0.0" uiname="Right" />
        <input name="center" type="float" value="0.5" uiname="Center" uimin="0.0" uimax="1.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half3" default="0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_splitlr_half4" node="splitlr" nodegroup="procedural2d">
        <input name="valuel" type="half4" value="0.0, 0.0, 0.0, 0.0" uiname="Left" />
        <input name="valuer" type="half4" value="0.0, 0.0, 0.0, 0.0" uiname="Right" />
        <input name="center" type="float" value="0.5" uiname="Center" uimin="0.0" uimax="1.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>
    <!--
    Node: <splittb>
    A top-bottom split matte, split at a specified v value.
    -->
    <nodedef name="ND_splittb_half" node="splittb" nodegroup="procedural2d">
        <input name="valuet" type="half" value="0.0" uiname="Top" />
        <input name="valueb" type="half" value="0.0" uiname="Bottom" />
        <input name="center" type="float" value="0.5" uiname="Center" uimin="0.0" uimax="1.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <nodedef name="ND_splittb_half2" node="splittb" nodegroup="procedural2d">
        <input name="valuet" type="half2" value="0.0, 0.0" uiname="Top" />
        <input name="valueb" type="half2" value="0.0, 0.0" uiname="Bottom" />
        <input name="center" type="float" value="0.5" uiname="Center" uimin="0.0" uimax="1.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half2" default="0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_splittb_half3" node="splittb" nodegroup="procedural2d">
        <input name="valuet" type="half3" value="0.0, 0.0, 0.0" uiname="Top" />
        <input name="valueb" type="half3" value="0.0, 0.0, 0.0" uiname="Bottom" />
        <input name="center" type="float" value="0.5" uiname="Center" uimin="0.0" uimax="1.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half3" default="0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_splittb_half4" node="splittb" nodegroup="procedural2d">
        <input name="valuet" type="half4" value="0.0, 0.0, 0.0, 0.0" uiname="Top" />
        <input name="valueb" type="half4" value="0.0, 0.0, 0.0, 0.0" uiname="Bottom" />
        <input name="center" type="float" value="0.5" uiname="Center" uimin="0.0" uimax="1.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>

    <!-- ramp -->
    <nodedef name="ND_ramp4_half" node="ramp4" nodegroup="procedural2d">
        <input name="valuetl" type="half" value="0.0" />
        <input name="valuetr" type="half" value="0.0" />
        <input name="valuebl" type="half" value="0.0" />
        <input name="valuebr" type="half" value="0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <nodegraph name="NG_ramp4_half" nodedef="ND_ramp4_half">
        <clamp name="N_txclamp_half" type="vector2">
            <input name="in" type="vector2" interfacename="texcoord" />
        </clamp>
        <extract name="N_s_float" type="float">
            <input name="in" type="vector2" nodename="N_txclamp_half" />
            <input name="index" type="integer" value="0" />
        </extract>
        <extract name="N_t_float" type="float">
            <input name="in" type="vector2" nodename="N_txclamp_half" />
            <input name="index" type="integer" value="1" />
        </extract>
        <convert name="N_s_half" type="half">
            <input name="in" type="float" nodename="N_s_float" />
        </convert>
        <convert name="N_t_half" type="half">
            <input name="in" type="float" nodename="N_t_float" />
        </convert>
        <mix name="N_mixtop_half" type="half">
            <input name="bg" type="half" interfacename="valuetl" />
            <input name="fg" type="half" interfacename="valuetr" />
            <input name="mix" type="half" nodename="N_s_half" />
        </mix>
        <mix name="N_mixbot_half" type="half">
            <input name="bg" type="half" interfacename="valuebl" />
            <input name="fg" type="half" interfacename="valuebr" />
            <input name="mix" type="half" nodename="N_s_half" />
        </mix>
        <mix name="N_mix_half" type="half">
            <input name="bg" type="half" nodename="N_mixbot_half" />
            <input name="fg" type="half" nodename="N_mixtop_half" />
            <input name="mix" type="half" nodename="N_t_half" />
        </mix>
        <output name="out" type="half" nodename="N_mix_half" />
    </nodegraph>

    <nodedef name="ND_ramp4_half2" node="ramp4" nodegroup="procedural2d">
        <input name="valuetl" type="half2" value="0.0, 0.0" />
        <input name="valuetr" type="half2" value="0.0, 0.0" />
        <input name="valuebl" type="half2" value="0.0, 0.0" />
        <input name="valuebr" type="half2" value="0.0, 0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="vector2" default="0.0, 0.0" />
    </nodedef>

    <nodegraph name="NG_ramp4_half2" nodedef="ND_ramp4_half2">
        <clamp name="N_txclamp_half2" type="vector2">
            <input name="in" type="vector2" interfacename="texcoord" />
        </clamp>
        <extract name="N_s_float" type="float">
            <input name="in" type="vector2" nodename="N_txclamp_half2" />
            <input name="index" type="integer" value="0" />
        </extract>
        <extract name="N_t_float" type="float">
            <input name="in" type="vector2" nodename="N_txclamp_half2" />
            <input name="index" type="integer" value="1" />
        </extract>
        <mix name="N_mixtop_half2" type="half2">
            <input name="bg" type="half2" interfacename="valuetl" />
            <input name="fg" type="half2" interfacename="valuetr" />
            <input name="mix" type="float" nodename="N_s_float" />
        </mix>
        <mix name="N_mixbot_half2" type="half2">
            <input name="bg" type="half2" interfacename="valuebl" />
            <input name="fg" type="half2" interfacename="valuebr" />
            <input name="mix" type="float" nodename="N_s_float" />
        </mix>
        <mix name="N_mix_half2" type="half2">
            <input name="bg" type="half2" nodename="N_mixbot_half2" />
            <input name="fg" type="half2" nodename="N_mixtop_half2" />
            <input name="mix" type="float" nodename="N_t_float" />
        </mix>
        <output name="out" type="half2" nodename="N_mix_float" />
    </nodegraph>


    <nodedef name="ND_ramp4_half3" node="ramp4" nodegroup="procedural2d">
        <input name="valuetl" type="half3" value="0.0, 0.0, 0.0" />
        <input name="valuetr" type="half3" value="0.0, 0.0, 0.0" />
        <input name="valuebl" type="half3" value="0.0, 0.0, 0.0" />
        <input name="valuebr" type="half3" value="0.0, 0.0, 0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half3" default="0.0, 0.0, 0.0" />
    </nodedef>

    <nodegraph name="NG_ramp4_half3" nodedef="ND_ramp4_half3">
        <clamp name="N_txclamp_half3" type="vector2">
            <input name="in" type="vector2" interfacename="texcoord" />
        </clamp>
        <extract name="N_s_float" type="float">
            <input name="in" type="vector2" nodename="N_txclamp_half3" />
            <input name="index" type="integer" value="0" />
        </extract>
        <extract name="N_t_float" type="float">
            <input name="in" type="vector2" nodename="N_txclamp_half3" />
            <input name="index" type="integer" value="1" />
        </extract>
        <mix name="N_mixtop_half3" type="half3">
            <input name="bg" type="half3" interfacename="valuetl" />
            <input name="fg" type="half3" interfacename="valuetr" />
            <input name="mix" type="float" nodename="N_s_float" />
        </mix>
        <mix name="N_mixbot_half3" type="half3">
            <input name="bg" type="half3" interfacename="valuebl" />
            <input name="fg" type="half3" interfacename="valuebr" />
            <input name="mix" type="float" nodename="N_s_float" />
        </mix>
        <mix name="N_mix_half3" type="half3">
            <input name="bg" type="half3" nodename="N_mixbot_half3" />
            <input name="fg" type="half3" nodename="N_mixtop_half3" />
            <input name="mix" type="float" nodename="N_t_float" />
        </mix>
        <output name="out" type="half3" nodename="N_mix_float" />
    </nodegraph>

    <nodedef name="ND_ramp4_half4" node="ramp4" nodegroup="procedural2d">
        <input name="valuetl" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="valuetr" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="valuebl" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="valuebr" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="texcoord" type="vector2" defaultgeomprop="UV0" />
        <output name="out" type="half4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>

    <nodegraph name="NG_ramp4_half4" nodedef="ND_ramp4_half4">
        <clamp name="N_txclamp_half4" type="vector2">
            <input name="in" type="vector2" interfacename="texcoord" />
        </clamp>
        <extract name="N_s_float" type="float">
            <input name="in" type="vector2" nodename="N_txclamp_half4" />
            <input name="index" type="integer" value="0" />
        </extract>
        <extract name="N_t_float" type="float">
            <input name="in" type="vector2" nodename="N_txclamp_half4" />
            <input name="index" type="integer" value="1" />
        </extract>
        <mix name="N_mixtop_half4" type="half4">
            <input name="bg" type="half4" interfacename="valuetl" />
            <input name="fg" type="half4" interfacename="valuetr" />
            <input name="mix" type="float" nodename="N_s_float" />
        </mix>
        <mix name="N_mixbot_half4" type="half4">
            <input name="bg" type="half4" interfacename="valuebl" />
            <input name="fg" type="half4" interfacename="valuebr" />
            <input name="mix" type="float" nodename="N_s_float" />
        </mix>
        <mix name="N_mix_half4" type="half4">
            <input name="bg" type="half4" nodename="N_mixbot_half4" />
            <input name="fg" type="half4" nodename="N_mixtop_half4" />
            <input name="mix" type="float" nodename="N_t_float" />
        </mix>
        <output name="out" type="half4" nodename="N_mix_float" />
    </nodegraph>

    <!--
    Node: <geompropvalue>
    The value of the specified geometric property for the current geometry.
    -->
    <nodedef name="ND_geompropvalue_half" node="geompropvalue" nodegroup="geometric">
        <input name="geomprop" type="string" value="" uniform="true" />
        <input name="default" type="half" value="0.0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <!--
    Node: <add>
    Add "in2" value/stream to the incoming half/color/vector/matrix.
    -->
    <nodedef name="ND_add_half" node="add" nodegroup="math">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_add_half2" node="add" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_add_half3" node="add" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_add_half4" node="add" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_add_half2FA" node="add" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_add_half3FA" node="add" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_add_half4FA" node="add" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>

    <!--
    Node: <subtract>
    Subtract "in2" value/stream from the incoming half/float/color/vector/matrix.
    -->
    <nodedef name="ND_subtract_half" node="subtract" nodegroup="math">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_subtract_half2" node="subtract" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_subtract_half3" node="subtract" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_subtract_half4" node="subtract" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_subtract_half2FA" node="subtract" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_subtract_half3FA" node="subtract" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_subtract_half4FA" node="subtract" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>

    <!--
    Node: <multiply>
    Multiply the incoming half/float/color/vector by the "in2" value/stream, or multiply
    two matrices.
    -->
    <nodedef name="ND_multiply_half" node="multiply" nodegroup="math">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_multiply_half2" node="multiply" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="1.0, 1.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_multiply_half3" node="multiply" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="1.0, 1.0, 1.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_multiply_half4" node="multiply" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="1.0, 1.0, 1.0, 1.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_multiply_half2FA" node="multiply" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_multiply_half3FA" node="multiply" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_multiply_half4FA" node="multiply" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>

    <nodedef name="ND_multiply_matrix44_vector4" node="multiply" nodegroup="math">
        <input name="in1" type="matrix44" value="1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1" />
        <input name="in2" type="vector4" value="1,1,1,1" />
        <output name="out" type="vector4" defaultinput="in1" />
    </nodedef>
    <!--
    Node: <divide>
    Divide an incoming half/float/color/vector by the "in2" value/stream; dividing a channel
    value by 0 results in floating-point "NaN".  Or, multiply one matrix by the
    inverse of a second matrix.
    -->
    <nodedef name="ND_divide_half" node="divide" nodegroup="math">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_divide_half2" node="divide" nodegroup="math">
        <input name="in1" type="half2" value="0.0" />
        <input name="in2" type="half2" value="1.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_divide_half3" node="divide" nodegroup="math">
        <input name="in1" type="half3" value="0.0" />
        <input name="in2" type="half3" value="1.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_divide_half4" node="divide" nodegroup="math">
        <input name="in1" type="half4" value="0.0" />
        <input name="in2" type="half4" value="1.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>

    <nodedef name="ND_divide_half2FA" node="divide" nodegroup="math" apple_availability="visionOS 3.0; iOS 19.0; macOS 16.0">
      <input name="in1" type="half2" value="0.0, 0.0" />
      <input name="in2" type="half" value="1.0" />
      <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_divide_half3FA" node="divide" nodegroup="math" apple_availability="visionOS 3.0; iOS 19.0; macOS 16.0">
      <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
      <input name="in2" type="half" value="1.0" />
      <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_divide_half4FA" node="divide" nodegroup="math" apple_availability="visionOS 3.0; iOS 19.0; macOS 16.0">
      <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
      <input name="in2" type="half" value="1.0" />
      <output name="out" type="half4" defaultinput="in1" />
    </nodedef>

    <implementation name="IMP_divide_half2FA" nodedef="ND_divide_half2FA" function="ND_divide_half2FA"/>
    <implementation name="IMP_divide_half3FA" nodedef="ND_divide_half3FA" function="ND_divide_half3FA"/>
    <implementation name="IMP_divide_half4FA" nodedef="ND_divide_half4FA" function="ND_divide_half4FA"/>
    
    <!--
    Node: <modulo>
    The remaining fraction after dividing one half/float/color/vector by another and
    subtracting the integer portion. The modula "in2" value cannot be 0.
    -->
    <nodedef name="ND_modulo_half" node="modulo" nodegroup="math">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_modulo_half2" node="modulo" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="1.0, 1.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_modulo_half3" node="modulo" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="1.0, 1.0, 1.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_modulo_half4" node="modulo" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="1.0, 1.0, 1.0, 1.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_modulo_half2FA" node="modulo" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_modulo_half3FA" node="modulo" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_modulo_half4FA" node="modulo" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <!--
    Node: <absval>
    The per-channel absolute value of the incoming half/float/color/vector.
    -->
    <nodedef name="ND_absval_half" node="absval" nodegroup="math"
        apple_availability="macOS deprecated 16.0; iOS deprecated 19.0; visionOS deprecated 3.0"
    >
        <input name="in" type="half" value="0.0" />
        <input name="low" type="half" value="0.0" />
        <input name="high" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_absval_half2" node="absval" nodegroup="math"
        apple_availability="macOS deprecated 16.0; iOS deprecated 19.0; visionOS deprecated 3.0"
    >
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="low" type="half2" value="0.0, 0.0" />
        <input name="high" type="half2" value="1.0, 1.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_absval_half3" node="absval" nodegroup="math"
        apple_availability="macOS deprecated 16.0; iOS deprecated 19.0; visionOS deprecated 3.0"
    >
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="low" type="half3" value="0.0, 0.0, 0.0" />
        <input name="high" type="half3" value="1.0, 1.0, 1.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_absval_half4" node="absval" nodegroup="math"
        apple_availability="macOS deprecated 16.0; iOS deprecated 19.0; visionOS deprecated 3.0"
    >
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="low" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="high" type="half4" value="1.0, 1.0, 1.0, 1.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    
    <nodedef name="ND_absval_half_v2" node="absval" nodegroup="math" isdefaultversion="true"
        apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_absval_half2_v2" node="absval" nodegroup="math" isdefaultversion="true"
        apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_absval_half3_v2" node="absval" nodegroup="math" isdefaultversion="true"
        apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_absval_half4_v2" node="absval" nodegroup="math" isdefaultversion="true"
        apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>

    <implementation name="IMP_absval_half_v2" nodedef="ND_absval_half_v2" function="ND_absval_half_v2"/>
    <implementation name="IMP_absval_half2_v2" nodedef="ND_absval_half2_v2" function="ND_absval_half2_v2"/>
    <implementation name="IMP_absval_half3_v2" nodedef="ND_absval_half3_v2" function="ND_absval_half3_v2"/>
    <implementation name="IMP_absval_half4_v2" nodedef="ND_absval_half4_v2" function="ND_absval_half4_v2"/>
    <!--
    Node: <floor>
    Find the nearest integer less than or equal to the parameter.
    -->
    <nodedef name="ND_floor_half" node="floor" nodegroup="math">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_floor_half2" node="floor" nodegroup="math">
        <input name="in" type="half2" value="0.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_floor_half3" node="floor" nodegroup="math">
        <input name="in" type="half3" value="0.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_floor_half4" node="floor" nodegroup="math">
        <input name="in" type="half4" value="0.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <!--
    Node: <ceil>
    Find the nearest integer greater than or equal to the parameter.
    -->
    <nodedef name="ND_ceil_half" node="ceil" nodegroup="math">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <!--
    Node: <ceil>
    Find the nearest integer greater than or equal to the parameter.
    -->
    <nodedef name="ND_ceil_half2" node="ceil" nodegroup="math">
        <input name="in" type="half2" value="0.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <!--
    Node: <ceil>
    Find the nearest integer greater than or equal to the parameter.
    -->
    <nodedef name="ND_ceil_half3" node="ceil" nodegroup="math">
        <input name="in" type="half3" value="0.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <!--
    Node: <ceil>
    Find the nearest integer greater than or equal to the parameter.
    -->
    <nodedef name="ND_ceil_half4" node="ceil" nodegroup="math">
        <input name="in" type="half4" value="0.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <!--
    Node: <round>
    Round incoming half/float/color/vector values.
    -->
    <nodedef name="ND_round_half" node="round" nodegroup="math">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_round_half2" node="round" nodegroup="math">
        <input name="in" type="half2" value="0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_round_half3" node="round" nodegroup="math">
        <input name="in" type="half3" value="0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_round_half4" node="round" nodegroup="math">
        <input name="in" type="half4" value="0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <!--
    Node: <power>
    Raise incoming half/float/color/vector values to the "in2" power.
    -->
    <nodedef name="ND_power_half" node="power" nodegroup="math">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_power_half2" node="power" nodegroup="math">
        <input name="in1" type="half2" value="0.0" />
        <input name="in2" type="half2" value="1.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_power_half3" node="power" nodegroup="math">
        <input name="in1" type="half3" value="0.0" />
        <input name="in2" type="half3" value="1.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_power_half4" node="power" nodegroup="math">
        <input name="in1" type="half4" value="0.0" />
        <input name="in2" type="half4" value="1.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <!--
    Node: <safepower> Supplemental Node
    Raise incoming half/float/color/vector values to the "in2" power.
    -->
    <nodedef name="ND_safepower_half" node="safepower" nodegroup="math">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_safepower_half2" node="safepower" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="1.0, 1.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_safepower_half3" node="safepower" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="1.0, 1.0, 1.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_safepower_half4" node="safepower" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="1.0, 1.0, 1.0, 1.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_safepower_half2FA" node="safepower" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_safepower_half3FA" node="safepower" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_safepower_half4FA" node="safepower" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half" value="1.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <!--
    Nodes: <sin>, <cos>, <tan>, <asin>, <acos>, <atan2>
    Standard trigonometric functions; angles are given in radians.
    -->
    <nodedef name="ND_sin_half" node="sin" nodegroup="math">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_cos_half" node="cos" nodegroup="math">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_tan_half" node="tan" nodegroup="math">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_asin_half" node="asin" nodegroup="math">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_acos_half" node="acos" nodegroup="math">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_atan2_half" node="atan2" nodegroup="math">
        <input name="iny" type="half" value="0.0" />
        <input name="inx" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_sin_half2" node="sin" nodegroup="math">
        <input name="in" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_cos_half2" node="cos" nodegroup="math">
        <input name="in" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_tan_half2" node="tan" nodegroup="math">
        <input name="in" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_asin_half2" node="asin" nodegroup="math">
        <input name="in" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_acos_half2" node="acos" nodegroup="math">
        <input name="in" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_atan2_half2" node="atan2" nodegroup="math">
        <input name="iny" type="half2" value="1.0, 1.0" />
        <input name="inx" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_sin_half3" node="sin" nodegroup="math">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_cos_half3" node="cos" nodegroup="math">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_tan_half3" node="tan" nodegroup="math">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_asin_half3" node="asin" nodegroup="math">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_acos_half3" node="acos" nodegroup="math">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_atan2_half3" node="atan2" nodegroup="math">
        <input name="iny" type="half3" value="1.0, 1.0, 1.0" />
        <input name="inx" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_sin_half4" node="sin" nodegroup="math">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_cos_half4" node="cos" nodegroup="math">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_tan_half4" node="tan" nodegroup="math">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_asin_half4" node="asin" nodegroup="math">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_acos_half4" node="acos" nodegroup="math">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_atan2_half4" node="atan2" nodegroup="math">
        <input name="iny" type="half4" value="1.0, 1.0, 1.0, 1.0" />
        <input name="inx" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <!--
    Nodes: <sqrt>, <ln>, <exp>
    Standard math functions.
    -->
    <nodedef name="ND_sqrt_half" node="sqrt" nodegroup="math">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_ln_half" node="ln" nodegroup="math">
        <input name="in" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_exp_half" node="exp" nodegroup="math">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_sqrt_half2" node="sqrt" nodegroup="math">
        <input name="in" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_ln_half2" node="ln" nodegroup="math">
        <input name="in" type="half2" value="1.0, 1.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_exp_half2" node="exp" nodegroup="math">
        <input name="in" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_sqrt_half3" node="sqrt" nodegroup="math">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_ln_half3" node="ln" nodegroup="math">
        <input name="in" type="half3" value="1.0, 1.0, 1.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_exp_half3" node="exp" nodegroup="math">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_sqrt_half4" node="sqrt" nodegroup="math">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_ln_half4" node="ln" nodegroup="math">
        <input name="in" type="half4" value="1.0, 1.0, 1.0, 1.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_exp_half4" node="exp" nodegroup="math">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <!--
    Node: <sign>
    Sign of eachinput channel: -1, 0 or +1
    -->
    <nodedef name="ND_sign_half" node="sign" nodegroup="math">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_sign_half2" node="sign" nodegroup="math">
        <input name="in" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_sign_half3" node="sign" nodegroup="math">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_sign_half4" node="sign" nodegroup="math">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <!--
    Node: <clamp>
    Clamp incoming value to a specified range of values.
    -->
    <nodedef name="ND_clamp_half" node="clamp" nodegroup="math">
        <input name="in" type="half" value="0.0" />
        <input name="low" type="half" value="0.0" />
        <input name="high" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_clamp_half2" node="clamp" nodegroup="math">
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="low" type="half2" value="0.0, 0.0" />
        <input name="high" type="half2" value="1.0, 1.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_clamp_half3" node="clamp" nodegroup="math">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="low" type="half3" value="0.0, 0.0, 0.0" />
        <input name="high" type="half3" value="1.0, 1.0, 1.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_clamp_half4" node="clamp" nodegroup="math">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="low" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="high" type="half4" value="1.0, 1.0, 1.0, 1.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_clamp_half2FA" node="clamp" nodegroup="math">
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="low" type="float" value="0.0" />
        <input name="high" type="float" value="1.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_clamp_half3FA" node="clamp" nodegroup="math">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="low" type="float" value="0.0" />
        <input name="high" type="float" value="1.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_clamp_half4FA" node="clamp" nodegroup="math">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="low" type="float" value="0.0" />
        <input name="high" type="float" value="1.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <!--
    Node: <min>
    Select the minimum among incoming values.
    -->
    <nodedef name="ND_min_half" node="min" nodegroup="math">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_min_half2" node="min" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_min_half3" node="min" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_min_half4" node="min" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_min_half2FA" node="min" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="float" value="0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_min_half3FA" node="min" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="float" value="0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_min_half4FA" node="min" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="float" value="0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <!--
    Node: <max>
    Select the maximum among incoming values.
    -->
    <nodedef name="ND_max_half" node="max" nodegroup="math">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_max_half2" node="max" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_max_half3" node="max" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_max_half4" node="max" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_max_half2FA" node="max" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="float" value="0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_max_half3FA" node="max" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="float" value="0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_max_half4FA" node="max" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="float" value="0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>

    <!--
    Node: <normalize>
    Outputs the normalized vector from the incoming vector stream.
    -->
    <nodedef name="ND_normalize_half2" node="normalize" nodegroup="math">
        <input name="in" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_normalize_half3" node="normalize" nodegroup="math">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_normalize_half4" node="normalize" nodegroup="math">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <!--
    Node: <magnitude>
    Outputs the float magnitude (vector length) of the incoming vector stream.
    -->
    <nodedef name="ND_magnitude_half2" node="magnitude" nodegroup="math">
        <input name="in" type="half2" value="0.0, 0.0" />
        <output name="out" type="float" default="0.0" />
    </nodedef>
    <nodedef name="ND_magnitude_half3" node="magnitude" nodegroup="math">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="float" default="0.0" />
    </nodedef>
    <nodedef name="ND_magnitude_half4" node="magnitude" nodegroup="math">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="float" default="0.0" />
    </nodedef>
    <nodedef name="ND_magnitude_half2_half" node="magnitude" nodegroup="math" apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in" type="half2" value="0.0, 0.0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <nodedef name="ND_magnitude_half3_half" node="magnitude" nodegroup="math" apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <nodedef name="ND_magnitude_half4_half" node="magnitude" nodegroup="math" apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>

    <implementation name="IMP_magnitude_half2_half" nodedef="ND_magnitude_half2_half" function="ND_magnitude_half2_half"/>
    <implementation name="IMP_magnitude_half3_half" nodedef="ND_magnitude_half3_half" function="ND_magnitude_half3_half"/>
    <implementation name="IMP_magnitude_half4_half" nodedef="ND_magnitude_half4_half" function="ND_magnitude_half4_half"/>    

    <!--
    Node: <dotproduct>
    Perform a dot product of two 2-4 channel vectors
    -->
    <nodedef name="ND_dotproduct_half2" node="dotproduct" nodegroup="math">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <output name="out" type="float" default="0.0" />
    </nodedef>
    <nodedef name="ND_dotproduct_half3" node="dotproduct" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="float" default="0.0" />
    </nodedef>
    <nodedef name="ND_dotproduct_half4" node="dotproduct" nodegroup="math">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="float" default="0.0" />
    </nodedef>

    <nodedef name="ND_dotproduct_half2_half" node="dotproduct" nodegroup="math" apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <nodedef name="ND_dotproduct_half3_half" node="dotproduct" nodegroup="math" apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <nodedef name="ND_dotproduct_half4_half" node="dotproduct" nodegroup="math" apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>

    <implementation name="IMP_dotproduct_half2_half" nodedef="ND_dotproduct_half2_half" function="ND_dotproduct_half2_half"/>
    <implementation name="IMP_dotproduct_half3_half" nodedef="ND_dotproduct_half3_half" function="ND_dotproduct_half3_half"/>
    <implementation name="IMP_dotproduct_half4_half" nodedef="ND_dotproduct_half4_half" function="ND_dotproduct_half4_half"/>

    <!--
    Node: <crossproduct>
    Perform a cross product of two vectors
    -->
    <nodedef name="ND_crossproduct_half3" node="crossproduct" nodegroup="math">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>

    <!--
    Node: <remap>
    Remap a value from one range of half/float/color/vector values to another.
    -->
    <nodedef name="ND_remap_half" node="remap" nodegroup="adjustment">
        <input name="in" type="half" value="0.0" />
        <input name="inlow" type="half" value="0.0" />
        <input name="inhigh" type="half" value="1.0" />
        <input name="outlow" type="half" value="0.0" />
        <input name="outhigh" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_remap_half2" node="remap" nodegroup="adjustment">
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="inlow" type="half2" value="0.0, 0.0" />
        <input name="inhigh" type="half2" value="1.0, 1.0" />
        <input name="outlow" type="half2" value="0.0, 0.0" />
        <input name="outhigh" type="half2" value="1.0, 1.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_remap_half3" node="remap" nodegroup="adjustment">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="inlow" type="half3" value="0.0, 0.0, 0.0" />
        <input name="inhigh" type="half3" value="1.0, 1.0, 1.0" />
        <input name="outlow" type="half3" value="0.0, 0.0, 0.0" />
        <input name="outhigh" type="half3" value="1.0, 1.0, 1.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_remap_half4" node="remap" nodegroup="adjustment">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="inlow" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="inhigh" type="half4" value="1.0, 1.0, 1.0, 1.0" />
        <input name="outlow" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="outhigh" type="half4" value="1.0, 1.0, 1.0, 1.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_remap_half2FA" node="remap" nodegroup="adjustment">
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="inlow" type="float" value="0.0" />
        <input name="inhigh" type="float" value="1.0" />
        <input name="outlow" type="float" value="0.0" />
        <input name="outhigh" type="float" value="1.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_remap_half3FA" node="remap" nodegroup="adjustment">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="inlow" type="float" value="0.0" />
        <input name="inhigh" type="float" value="1.0" />
        <input name="outlow" type="float" value="0.0" />
        <input name="outhigh" type="float" value="1.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_remap_half4FA" node="remap" nodegroup="adjustment">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="inlow" type="float" value="0.0" />
        <input name="inhigh" type="float" value="1.0" />
        <input name="outlow" type="float" value="0.0" />
        <input name="outhigh" type="float" value="1.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <!--
    Node: <smoothstep>
    Outputs a smooth (hermite-interpolated) remapping of input values from low-high
    to output 0-1.
    -->
    <nodedef name="ND_smoothstep_half" node="smoothstep" nodegroup="adjustment">
        <input name="in" type="half" value="0.0" />
        <input name="low" type="half" value="0.0" />
        <input name="high" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_smoothstep_half2" node="smoothstep" nodegroup="adjustment">
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="low" type="half2" value="0.0, 0.0" />
        <input name="high" type="half2" value="1.0, 1.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_smoothstep_half3" node="smoothstep" nodegroup="adjustment">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="low" type="half3" value="0.0, 0.0, 0.0" />
        <input name="high" type="half3" value="1.0, 1.0, 1.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_smoothstep_half4" node="smoothstep" nodegroup="adjustment">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="low" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="high" type="half4" value="1.0, 1.0, 1.0, 1.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_smoothstep_half2FA" node="smoothstep" nodegroup="adjustment">
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="low" type="float" value="0.0" />
        <input name="high" type="float" value="1.0" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_smoothstep_half3FA" node="smoothstep" nodegroup="adjustment">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="low" type="float" value="0.0" />
        <input name="high" type="float" value="1.0" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_smoothstep_half4FA" node="smoothstep" nodegroup="adjustment">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="low" type="float" value="0.0" />
        <input name="high" type="float" value="1.0" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>
    <!--
    Node: <plus>
    Add two 1-4 channel inputs, with optional mixing between the bg input and the result.
    -->
    <nodedef name="ND_plus_half" node="plus" nodegroup="compositing">
        <input name="fg" type="half" value="0.0" />
        <input name="bg" type="half" value="0.0" />
        <input name="mix" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="bg" />
    </nodedef>
    <!--
    Node: <minus>
    Subtract two 1-4 channel inputs, with optional mixing between the bg input and the result.
    -->
    <nodedef name="ND_minus_half" node="minus" nodegroup="compositing">
        <input name="fg" type="half" value="0.0" />
        <input name="bg" type="half" value="0.0" />
        <input name="mix" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="bg" />
    </nodedef>
    <!--
    Node: <difference>
    Absolute-value difference of two 1-4 channel inputs, with optional mixing between
    the bg input and the result.
    -->
    <nodedef name="ND_difference_half" node="difference" nodegroup="compositing">
        <input name="fg" type="half" value="0.0" />
        <input name="bg" type="half" value="0.0" />
        <input name="mix" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="bg" />
    </nodedef>
    <!--
    Node: <burn>
    Take two 1-4 channel inputs and apply the same operator to all channels: 1-(1-B)/F
    -->
    <nodedef name="ND_burn_half" node="burn" nodegroup="compositing">
        <input name="fg" type="half" value="0.0" />
        <input name="bg" type="half" value="0.0" />
        <input name="mix" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="bg" />
    </nodedef>
    <!--
    Node: <dodge>
    Take two 1-4 channel inputs and apply the same operator to all channels: B/(1-F)
    -->
    <nodedef name="ND_dodge_half" node="dodge" nodegroup="compositing">
        <input name="fg" type="half" value="0.0" />
        <input name="bg" type="half" value="0.0" />
        <input name="mix" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="bg" />
    </nodedef>
    <!--
    Node: <screen>
    Take two 1-4 channel inputs and apply the same operator to all channels: 1-(1-F)*(1-B)
    -->
    <nodedef name="ND_screen_half" node="screen" nodegroup="compositing">
        <input name="fg" type="half" value="0.0" />
        <input name="bg" type="half" value="0.0" />
        <input name="mix" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="bg" />
    </nodedef>
    <!--
    Node: <overlay>
    Take two 1-4 channel inputs and apply the same operator to all channels:
    2FB if F<0.5;
    1-(1-F)(1-B) if F>=0.5
    -->
    <nodedef name="ND_overlay_half" node="overlay" nodegroup="compositing">
        <input name="fg" type="half" value="0.0" />
        <input name="bg" type="half" value="0.0" />
        <input name="mix" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="bg" />
    </nodedef>
    <!--
    Node: <inside>
    Take one 1-4 channel input "in" plus a separate half "mask" input and apply the same
    operator to all channels: in * mask
    -->
    <nodedef name="ND_inside_half" node="inside" nodegroup="compositing">
        <input name="in" type="half" value="0.0" />
        <input name="mask" type="half" value="1.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <!--
    Node: <outside>
    Take one 1-4 channel input "in" plus a separate half "mask" input and apply the same
    operator to all channels: in * (1-mask)
    -->
    <nodedef name="ND_outside_half" node="outside" nodegroup="compositing">
        <input name="in" type="half" value="0.0" />
        <input name="mask" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <!--
    Node: <mix>
    Mix two inputs according to an input mix amount.
    -->
    <nodedef name="ND_mix_half" node="mix" nodegroup="compositing">
        <input name="fg" type="half" value="0.0" />
        <input name="bg" type="half" value="0.0" />
        <input name="mix" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="bg" />
    </nodedef>
    <nodedef name="ND_mix_half2" node="mix" nodegroup="compositing">
        <input name="fg" type="half2" value="0.0, 0.0" />
        <input name="bg" type="half2" value="0.0, 0.0" />
        <input name="mix" type="float" value="0.0" />
        <output name="out" type="half2" defaultinput="bg" />
    </nodedef>
    <nodedef name="ND_mix_half3" node="mix" nodegroup="compositing">
        <input name="fg" type="half3" value="0.0, 0.0, 0.0" />
        <input name="bg" type="half3" value="0.0, 0.0, 0.0" />
        <input name="mix" type="float" value="0.0" />
        <output name="out" type="half3" defaultinput="bg" />
    </nodedef>
    <nodedef name="ND_mix_half4" node="mix" nodegroup="compositing">
        <input name="fg" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="bg" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="mix" type="float" value="0.0" />
        <output name="out" type="half4" defaultinput="bg" />
    </nodedef>

    <nodedef name="ND_mix_half_half2" node="mix" nodegroup="compositing" apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="fg" type="half2" value="0.0, 0.0" />
        <input name="bg" type="half2" value="0.0, 0.0" />
        <input name="mix" type="half" value="0.0" />
        <output name="out" type="half2" defaultinput="bg" />
    </nodedef>
    <nodedef name="ND_mix_half_half3" node="mix" nodegroup="compositing" apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="fg" type="half3" value="0.0, 0.0, 0.0" />
        <input name="bg" type="half3" value="0.0, 0.0, 0.0" />
        <input name="mix" type="half" value="0.0" />
        <output name="out" type="half3" defaultinput="bg" />
    </nodedef>
    <nodedef name="ND_mix_half_half4" node="mix" nodegroup="compositing" apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="fg" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="bg" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="mix" type="half" value="0.0" />
        <output name="out" type="half4" defaultinput="bg" />
    </nodedef>

    <implementation name="IMP_mix_half_half2" nodedef="ND_mix_half_half2" function="ND_mix_half_half2"/>
    <implementation name="IMP_mix_half_half3" nodedef="ND_mix_half_half3" function="ND_mix_half_half3"/>
    <implementation name="IMP_mix_half_half4" nodedef="ND_mix_half_half4" function="ND_mix_half_half4"/>

    <!--
    Node: <ifgreater>
    Output the value of in1 if value1>value2, or the value of in2 if value1<=value2.
    -->
    <nodedef name="ND_ifgreater_half" node="ifgreater" nodegroup="conditional">
        <input name="value1" type="half" value="1.0" />
        <input name="value2" type="half" value="0.0" />
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreater_half2" node="ifgreater" nodegroup="conditional">
        <input name="value1" type="float" value="1.0" />
        <input name="value2" type="float" value="0.0" />
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreater_half3" node="ifgreater" nodegroup="conditional">
        <input name="value1" type="float" value="1.0" />
        <input name="value2" type="float" value="0.0" />
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreater_half4" node="ifgreater" nodegroup="conditional">
        <input name="value1" type="float" value="1.0" />
        <input name="value2" type="float" value="0.0" />
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreater_halfI" node="ifgreater" nodegroup="conditional">
        <input name="value1" type="integer" value="1" />
        <input name="value2" type="integer" value="0" />
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreater_half2I" node="ifgreater" nodegroup="conditional">
        <input name="value1" type="integer" value="1" />
        <input name="value2" type="integer" value="0" />
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreater_half3I" node="ifgreater" nodegroup="conditional">
        <input name="value1" type="integer" value="1" />
        <input name="value2" type="integer" value="0" />
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreater_half4I" node="ifgreater" nodegroup="conditional">
        <input name="value1" type="integer" value="1" />
        <input name="value2" type="integer" value="0" />
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <!--
    Node: <ifgreatereq>
    Output the value of in1 if value1>=value2, or the value of in2 if value1<value2.
    -->
    <nodedef name="ND_ifgreatereq_half" node="ifgreatereq" nodegroup="conditional">
        <input name="value1" type="half" value="1.0" />
        <input name="value2" type="half" value="0.0" />
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreatereq_half2" node="ifgreatereq" nodegroup="conditional">
        <input name="value1" type="float" value="1.0" />
        <input name="value2" type="float" value="0.0" />
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreatereq_half3" node="ifgreatereq" nodegroup="conditional">
        <input name="value1" type="float" value="1.0" />
        <input name="value2" type="float" value="0.0" />
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreatereq_half4" node="ifgreatereq" nodegroup="conditional">
        <input name="value1" type="float" value="1.0" />
        <input name="value2" type="float" value="0.0" />
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreatereq_halfI" node="ifgreatereq" nodegroup="conditional">
        <input name="value1" type="integer" value="1" />
        <input name="value2" type="integer" value="0" />
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreatereq_half2I" node="ifgreatereq" nodegroup="conditional">
        <input name="value1" type="integer" value="1" />
        <input name="value2" type="integer" value="0" />
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreatereq_half3I" node="ifgreatereq" nodegroup="conditional">
        <input name="value1" type="integer" value="1" />
        <input name="value2" type="integer" value="0" />
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifgreatereq_half4I" node="ifgreatereq" nodegroup="conditional">
        <input name="value1" type="integer" value="1" />
        <input name="value2" type="integer" value="0" />
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>

    <!--
    Node: <ifequal>
    Output the value of in1 if value1==value2, or the value of in2 if value1!=value2.
    -->
    <nodedef name="ND_ifequal_half" node="ifequal" nodegroup="conditional">
        <input name="value1" type="half" value="0.0" />
        <input name="value2" type="half" value="0.0" />
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifequal_half2" node="ifequal" nodegroup="conditional">
        <input name="value1" type="float" value="0.0" />
        <input name="value2" type="float" value="0.0" />
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifequal_half3" node="ifequal" nodegroup="conditional">
        <input name="value1" type="float" value="0.0" />
        <input name="value2" type="float" value="0.0" />
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifequal_half4" node="ifequal" nodegroup="conditional">
        <input name="value1" type="float" value="0.0" />
        <input name="value2" type="float" value="0.0" />
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifequal_halfI" node="ifequal" nodegroup="conditional">
        <input name="value1" type="integer" value="0" />
        <input name="value2" type="integer" value="0" />
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifequal_half2I" node="ifequal" nodegroup="conditional">
        <input name="value1" type="integer" value="0" />
        <input name="value2" type="integer" value="0" />
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifequal_half3I" node="ifequal" nodegroup="conditional">
        <input name="value1" type="integer" value="0" />
        <input name="value2" type="integer" value="0" />
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifequal_half4I" node="ifequal" nodegroup="conditional">
        <input name="value1" type="integer" value="0" />
        <input name="value2" type="integer" value="0" />
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifequal_halfB" node="ifequal" nodegroup="conditional">
        <input name="value1" type="boolean" value="false" />
        <input name="value2" type="boolean" value="false" />
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifequal_half2B" node="ifequal" nodegroup="conditional">
        <input name="value1" type="boolean" value="false" />
        <input name="value2" type="boolean" value="false" />
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifequal_half3B" node="ifequal" nodegroup="conditional">
        <input name="value1" type="boolean" value="false" />
        <input name="value2" type="boolean" value="false" />
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_ifequal_half4B" node="ifequal" nodegroup="conditional">
        <input name="value1" type="boolean" value="false" />
        <input name="value2" type="boolean" value="false" />
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>
    <!--
    Node: <switch>
    Pass on the value of one of five input streams, according to the value of a selector parameter.
    -->
    <nodedef name="ND_switch_halfH" node="switch" nodegroup="conditional">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <input name="in3" type="half" value="0.0" />
        <input name="in4" type="half" value="0.0" />
        <input name="in5" type="half" value="0.0" />
        <input name="in6" type="half" value="0.0" />
        <input name="in7" type="half" value="0.0" />
        <input name="in8" type="half" value="0.0" />
        <input name="in9" type="half" value="0.0" />
        <input name="in10" type="half" value="0.0" />
        <input name="which" type="half" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_switch_half" node="switch" nodegroup="conditional">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <input name="in3" type="half" value="0.0" />
        <input name="in4" type="half" value="0.0" />
        <input name="in5" type="half" value="0.0" />
        <input name="in6" type="half" value="0.0" />
        <input name="in7" type="half" value="0.0" />
        <input name="in8" type="half" value="0.0" />
        <input name="in9" type="half" value="0.0" />
        <input name="in10" type="half" value="0.0" />
        <input name="which" type="float" value="0.0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_switch_halfI" node="switch" nodegroup="conditional">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <input name="in3" type="half" value="0.0" />
        <input name="in4" type="half" value="0.0" />
        <input name="in5" type="half" value="0.0" />
        <input name="in6" type="half" value="0.0" />
        <input name="in7" type="half" value="0.0" />
        <input name="in8" type="half" value="0.0" />
        <input name="in9" type="half" value="0.0" />
        <input name="in10" type="half" value="0.0" />
        <input name="which" type="integer" value="0" />
        <output name="out" type="half" defaultinput="in1" />
    </nodedef>

    <nodedef name="ND_switch_half2" node="switch" nodegroup="conditional">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <input name="in3" type="half2" value="0.0, 0.0" />
        <input name="in4" type="half2" value="0.0, 0.0" />
        <input name="in5" type="half2" value="0.0, 0.0" />
        <input name="in6" type="half2" value="0.0, 0.0" />
        <input name="in7" type="half2" value="0.0, 0.0" />
        <input name="in8" type="half2" value="0.0, 0.0" />
        <input name="in9" type="half2" value="0.0, 0.0" />
        <input name="in10" type="half2" value="0.0, 0.0" />
        <input name="which" type="half" value="0.0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_switch_half3" node="switch" nodegroup="conditional">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in3" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in4" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in5" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in6" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in7" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in8" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in9" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in10" type="half3" value="0.0, 0.0, 0.0" />
        <input name="which" type="half" value="0.0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_switch_half4" node="switch" nodegroup="conditional">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in3" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in4" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in5" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in6" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in7" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in8" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in9" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in10" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="which" type="half" value="0.0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>

    <nodedef name="ND_switch_half2I" node="switch" nodegroup="conditional">
        <input name="in1" type="half2" value="0.0, 0.0" />
        <input name="in2" type="half2" value="0.0, 0.0" />
        <input name="in3" type="half2" value="0.0, 0.0" />
        <input name="in4" type="half2" value="0.0, 0.0" />
        <input name="in5" type="half2" value="0.0, 0.0" />
        <input name="in6" type="half2" value="0.0, 0.0" />
        <input name="in7" type="half2" value="0.0, 0.0" />
        <input name="in8" type="half2" value="0.0, 0.0" />
        <input name="in9" type="half2" value="0.0, 0.0" />
        <input name="in10" type="half2" value="0.0, 0.0" />
        <input name="which" type="integer" value="0" />
        <output name="out" type="half2" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_switch_half3I" node="switch" nodegroup="conditional">
        <input name="in1" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in2" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in3" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in4" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in5" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in6" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in7" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in8" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in9" type="half3" value="0.0, 0.0, 0.0" />
        <input name="in10" type="half3" value="0.0, 0.0, 0.0" />
        <input name="which" type="integer" value="0" />
        <output name="out" type="half3" defaultinput="in1" />
    </nodedef>
    <nodedef name="ND_switch_half4I" node="switch" nodegroup="conditional">
        <input name="in1" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in2" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in3" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in4" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in5" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in6" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in7" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in8" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in9" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="in10" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="which" type="integer" value="0" />
        <output name="out" type="half4" defaultinput="in1" />
    </nodedef>

    <!--
    Node: <convert>
    Convert a stream from one type to another; only certain unambiguous conversion
    types are supported.
    -->
    <nodedef name="ND_convert_half_color3" node="convert" nodegroup="channel">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="color3" default="0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_convert_half_color4" node="convert" nodegroup="channel">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="color4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_convert_half_vector2" node="convert" nodegroup="channel">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="vector2" default="0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_convert_half_vector3" node="convert" nodegroup="channel">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="vector3" default="0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_convert_half_vector4" node="convert" nodegroup="channel">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="vector4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_convert_boolean_half" node="convert" nodegroup="channel">
        <input name="in" type="boolean" value="false" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <nodedef name="ND_convert_integer_half" node="convert" nodegroup="channel">
        <input name="in" type="integer" value="0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>

    <nodedef name="ND_convert_half_float" node="convert" nodegroup="channel">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="float" default="0.0" />
    </nodedef>
    <nodedef name="ND_convert_float_half" node="convert" nodegroup="channel">
        <input name="in" type="float" value="0.0" />
        <output name="out" type="half" default="0.0" />
    </nodedef>

    <nodedef name="ND_convert_half2_vector2" node="convert" nodegroup="channel">
        <input name="in" type="half2" value="0.0,0.0" />
        <output name="out" type="vector2" default="0.0,0.0" />
    </nodedef>
    <nodedef name="ND_convert_vector2_half2" node="convert" nodegroup="channel">
        <input name="in" type="vector2" value="0.0,0.0" />
        <output name="out" type="half2" default="0.0,0.0" />
    </nodedef>

    <nodedef name="ND_convert_half3_color3" node="convert" nodegroup="channel">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="out" type="color3" default="0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_convert_color3_half3" node="convert" nodegroup="channel">
        <input name="in" type="color3" value="0.0, 0.0, 0.0" />
        <output name="out" type="half3" default="0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_convert_half3_vector3" node="convert" nodegroup="channel">
        <input name="in" type="half3" value="0.0,0.0,0.0" />
        <output name="out" type="vector3" default="0.0,0.0,0.0" />
    </nodedef>
    <nodedef name="ND_convert_vector3_half3" node="convert" nodegroup="channel">
        <input name="in" type="vector3" value="0.0,0.0,0.0" />
        <output name="out" type="half3" default="0.0,0.0,0.0" />
    </nodedef>

    <nodedef name="ND_convert_half4_vector4" node="convert" nodegroup="channel">
        <input name="in" type="half4" 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_vector4_half4" node="convert" nodegroup="channel">
        <input name="in" type="vector4" value="0.0,0.0,0.0,0.0" />
        <output name="out" type="half4" default="0.0,0.0,0.0,0.0" />
    </nodedef>
    <nodedef name="ND_convert_half4_color4" node="convert" nodegroup="channel">
        <input name="in" type="half4" 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_color4_half4" node="convert" nodegroup="channel">
        <input name="in" type="color4" value="0.0,0.0,0.0,0.0" />
        <output name="out" type="half4" default="0.0,0.0,0.0,0.0" />
    </nodedef>

    <nodedef name="ND_convert_float_integer" node="convert" nodegroup="channel">
        <input name="in" type="float" value="0.0" />
        <output name="out" type="integer" default="0" />
    </nodedef>

    <nodedef name="ND_convert_half_integer" node="convert" nodegroup="channel">
        <input name="in" type="half" value="0.0" />
        <output name="out" type="integer" default="0" />
    </nodedef>

    <!--
    Node: <swizzle>
    Perform an arbitrary permutation of the channels of the input stream, returning a new
    stream of the specified type. Individual channels may be replicated or omitted, and the output
    stream may have a different number of channels than the input.
    -->
    <!-- from type: half -->
    <nodedef name="ND_swizzle_half_color3" node="swizzle" nodegroup="channel">
        <input name="in" type="half" value="0.0" />
        <input name="channels" type="string" value="rrr" uniform="true" />
        <output name="out" type="color3" default="0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_swizzle_half_color4" node="swizzle" nodegroup="channel">
        <input name="in" type="half" value="0.0" />
        <input name="channels" type="string" value="rrrr" uniform="true" />
        <output name="out" type="color4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_swizzle_half_half2" node="swizzle" nodegroup="channel">
        <input name="in" type="half" value="0.0" />
        <input name="channels" type="string" value="xx" uniform="true" />
        <output name="out" type="half2" default="0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_swizzle_half_half3" node="swizzle" nodegroup="channel">
        <input name="in" type="half" value="0.0" />
        <input name="channels" type="string" value="xxx" uniform="true" />
        <output name="out" type="half3" default="0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_swizzle_half_half4" node="swizzle" nodegroup="channel">
        <input name="in" type="half" value="0.0" />
        <input name="channels" type="string" value="xxxx" uniform="true" />
        <output name="out" type="half4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>

    <!-- Swizzle: half2 to T -->
    <nodedef name="ND_swizzle_half2_half" node="swizzle" nodegroup="channel">
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="channels" type="string" value="x" uniform="true" />
        <output name="out" type="half" default="0.0" />
    </nodedef>

    <nodedef name="ND_swizzle_half2_half2" node="swizzle" nodegroup="channel">
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="channels" type="string" value="xx" uniform="true" />
        <output name="out" type="half2" default="0.0, 0.0" />
    </nodedef>

    <nodedef name="ND_swizzle_half2_half3" node="swizzle" nodegroup="channel">
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="channels" type="string" value="xxx" uniform="true" />
        <output name="out" type="half3" default="0.0, 0.0, 0.0" />
    </nodedef>

    <nodedef name="ND_swizzle_half2_half4" node="swizzle" nodegroup="channel">
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="channels" type="string" value="xxxx" uniform="true" />
        <output name="out" type="half4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>

    <!-- Swizzle: half3 to T -->
    <nodedef name="ND_swizzle_half3_half" node="swizzle" nodegroup="channel">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="x" uniform="true" />
        <output name="out" type="half" default="0.0" />
    </nodedef>

    <nodedef name="ND_swizzle_half3_half2" node="swizzle" nodegroup="channel">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="xx" uniform="true" />
        <output name="out" type="half2" default="0.0, 0.0" />
    </nodedef>

    <nodedef name="ND_swizzle_half3_half3" node="swizzle" nodegroup="channel">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="xxx" uniform="true" />
        <output name="out" type="half3" default="0.0, 0.0, 0.0" />
    </nodedef>

    <nodedef name="ND_swizzle_half3_half4" node="swizzle" nodegroup="channel">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="xxxx" uniform="true" />
        <output name="out" type="half4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>

    <nodedef name="ND_swizzle_half3_color3" node="swizzle" nodegroup="channel" apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="xxx" uniform="true" />
        <output name="out" type="color3" default="0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_swizzle_half3_color4" node="swizzle" nodegroup="channel" apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="xxxx" uniform="true" />
        <output name="out" type="color4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>

    <implementation name="IMP_swizzle_half3_color3" nodedef="ND_swizzle_half3_color3" />
    <implementation name="IMP_swizzle_half3_color4" nodedef="ND_swizzle_half3_color4" />

    <!-- Swizzle: half4 to T -->
    <nodedef name="ND_swizzle_half4_half" node="swizzle" nodegroup="channel">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="x" uniform="true" />
        <output name="out" type="half" default="0.0" />
    </nodedef>

    <nodedef name="ND_swizzle_half4_half2" node="swizzle" nodegroup="channel">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="xx" uniform="true" />
        <output name="out" type="half2" default="0.0, 0.0" />
    </nodedef>

    <nodedef name="ND_swizzle_half4_half3" node="swizzle" nodegroup="channel">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="xxx" uniform="true" />
        <output name="out" type="half3" default="0.0, 0.0, 0.0" />
    </nodedef>

    <nodedef name="ND_swizzle_half4_half4" node="swizzle" nodegroup="channel">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="xxxx" uniform="true" />
        <output name="out" type="half4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>

    <nodedef name="ND_swizzle_half4_color3" node="swizzle" nodegroup="channel" apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="xxx" uniform="true" />
        <output name="out" type="color3" default="0.0, 0.0, 0.0" />
    </nodedef>
    <nodedef name="ND_swizzle_half4_color4" node="swizzle" nodegroup="channel" apple_availability="macOS 16.0; iOS 19.0; visionOS 3.0">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="xxxx" uniform="true" />
        <output name="out" type="color4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>

    <implementation name="IMP_swizzle_half4_color3" nodedef="ND_swizzle_half4_color3" />
    <implementation name="IMP_swizzle_half4_color4" nodedef="ND_swizzle_half4_color4" />

    <!-- from type: color3 -->
    <nodedef name="ND_swizzle_color3_half" node="swizzle" nodegroup="channel">
        <input name="in" type="color3" value="0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="r" uniform="true" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <!-- from type: color4 -->
    <nodedef name="ND_swizzle_color4_half" node="swizzle" nodegroup="channel">
        <input name="in" type="color4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="r" uniform="true" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <!-- from type: half2 -->
    <nodedef name="ND_swizzle_vector2_half" node="swizzle" nodegroup="channel">
        <input name="in" type="vector2" value="0.0, 0.0" />
        <input name="channels" type="string" value="x" uniform="true" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <!-- from type: vector3 -->
    <nodedef name="ND_swizzle_vector3_half" node="swizzle" nodegroup="channel">
        <input name="in" type="vector3" value="0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="x" uniform="true" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <!-- from type: vector4 -->
    <nodedef name="ND_swizzle_vector4_half" node="swizzle" nodegroup="channel">
        <input name="in" type="vector4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="channels" type="string" value="x" uniform="true" />
        <output name="out" type="half" default="0.0" />
    </nodedef>
    <!--
    Node: <combine3>
    Combine the channels from two streams into the same number of channels of a single
    output stream of a specified compatible type.
    -->
    <nodedef name="ND_combine3_half3" node="combine3" nodegroup="channel">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <input name="in3" type="half" value="0.0" />
        <output name="out" type="half3" default="0.0, 0.0, 0.0" />
    </nodedef>

    <nodedef name="ND_combine2_half2" node="combine2" nodegroup="channel">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <output name="out" type="half2" default="0.0, 0.0" />
    </nodedef>

    <nodedef name="ND_combine4_half4" node="combine4" nodegroup="channel">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <input name="in3" type="half" value="0.0" />
        <input name="in4" type="half" value="0.0" />
        <output name="out" type="half4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>

    <nodedef name="ND_combine3_color3H" node="combine3" nodegroup="channel">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <input name="in3" type="half" value="0.0" />
        <output name="out" type="color3" default="0.0, 0.0, 0.0" />
    </nodedef>

    <nodedef name="ND_combine4_color4H" node="combine4" nodegroup="channel">
        <input name="in1" type="half" value="0.0" />
        <input name="in2" type="half" value="0.0" />
        <input name="in3" type="half" value="0.0" />
        <input name="in4" type="half" value="0.0" />
        <output name="out" type="color4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>

    <!-- Separate  -->

    <!-- ND_separate2_half2 -->
    <nodedef name="ND_separate2_half2" node="separate2" nodegroup="channel">
        <input name="in" type="half2" value="0.0, 0.0" />
        <output name="outx" type="half" default="0.0" />
        <output name="outy" type="half" default="0.0" />
    </nodedef>

    <nodegraph name="NG_separate2_half2" nodedef="ND_separate2_half2">
        <swizzle name="N_x_half2" type="half">
            <input name="in" type="half2" interfacename="in" />
            <input name="channels" type="string" value="x" />
        </swizzle>
        <swizzle name="N_y_half2" type="half">
            <input name="in" type="half2" interfacename="in" />
            <input name="channels" type="string" value="y" />
        </swizzle>
        <output name="outx" type="half" nodename="N_x_half2" />
        <output name="outy" type="half" nodename="N_y_half2" />
    </nodegraph>

    <!-- ND_separate3_half3 -->
    <nodedef name="ND_separate3_half3" node="separate3" nodegroup="channel">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <output name="outx" type="half" default="0.0" />
        <output name="outy" type="half" default="0.0" />
        <output name="outz" type="half" default="0.0" />
    </nodedef>

    <nodegraph name="NG_separate3_half3" nodedef="ND_separate3_half3">
        <swizzle name="N_x_half3" type="half">
            <input name="in" type="half3" interfacename="in" />
            <input name="channels" type="string" value="x" />
        </swizzle>
        <swizzle name="N_y_half3" type="half">
            <input name="in" type="half3" interfacename="in" />
            <input name="channels" type="string" value="y" />
        </swizzle>
        <swizzle name="N_z_half3" type="half">
            <input name="in" type="half3" interfacename="in" />
            <input name="channels" type="string" value="z" />
        </swizzle>
        <output name="outx" type="half" nodename="N_x_half3" />
        <output name="outy" type="half" nodename="N_y_half3" />
        <output name="outz" type="half" nodename="N_z_half3" />
    </nodegraph>

    <!-- ND_separate4_half4 -->
    <nodedef name="ND_separate4_half4" node="separate4" nodegroup="channel">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="outx" type="half" default="0.0" />
        <output name="outy" type="half" default="0.0" />
        <output name="outz" type="half" default="0.0" />
        <output name="outw" type="half" default="0.0" />
    </nodedef>

    <nodegraph name="NG_separate4_half4" nodedef="ND_separate4_half4">
        <swizzle name="N_x_half4" type="half">
            <input name="in" type="half4" interfacename="in" />
            <input name="channels" type="string" value="x" />
        </swizzle>
        <swizzle name="N_y_half4" type="half">
            <input name="in" type="half4" interfacename="in" />
            <input name="channels" type="string" value="y" />
        </swizzle>
        <swizzle name="N_z_half4" type="half">
            <input name="in" type="half4" interfacename="in" />
            <input name="channels" type="string" value="z" />
        </swizzle>
        <swizzle name="N_w_half4" type="half">
            <input name="in" type="half4" interfacename="in" />
            <input name="channels" type="string" value="w" />
        </swizzle>
        <output name="outx" type="half" nodename="N_x_half4" />
        <output name="outy" type="half" nodename="N_y_half4" />
        <output name="outz" type="half" nodename="N_z_half4" />
        <output name="outw" type="half" nodename="N_w_half4" />
    </nodegraph>

    <!-- ND_separate3_color3H // the non-"H" version returns float values, this one returns half values -->
    <nodedef name="ND_separate3_color3H" node="separate3" nodegroup="channel">
        <input name="in" type="color3" value="0.0, 0.0, 0.0" />
        <output name="outr" type="half" default="0.0" />
        <output name="outg" type="half" default="0.0" />
        <output name="outb" type="half" default="0.0" />
    </nodedef>

    <nodegraph name="NG_separate3_color3H" nodedef="ND_separate3_color3H">
        <swizzle name="N_r_color3" type="half">
            <input name="in" type="color3" interfacename="in" />
            <input name="channels" type="string" value="r" />
        </swizzle>
        <swizzle name="N_g_color3" type="half">
            <input name="in" type="color3" interfacename="in" />
            <input name="channels" type="string" value="g" />
        </swizzle>
        <swizzle name="N_b_color3" type="half">
            <input name="in" type="color3" interfacename="in" />
            <input name="channels" type="string" value="b" />
        </swizzle>
        <output name="outr" type="half" nodename="N_r_color3" />
        <output name="outg" type="half" nodename="N_g_color3" />
        <output name="outb" type="half" nodename="N_b_color3" />
    </nodegraph>

    <!-- ND_separate4_color4H // the non-"H" version returns float values, this one returns half values -->
    <nodedef name="ND_separate4_color4H" node="separate4" nodegroup="channel">
        <input name="in" type="color4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="outr" type="half" default="0.0" />
        <output name="outg" type="half" default="0.0" />
        <output name="outb" type="half" default="0.0" />
        <output name="outa" type="half" default="0.0" />
    </nodedef>

    <nodegraph name="NG_separate4_color4H" nodedef="ND_separate4_color4H">
        <swizzle name="N_r_color4" type="half">
            <input name="in" type="color4" interfacename="in" />
            <input name="channels" type="string" value="r" />
        </swizzle>
        <swizzle name="N_g_color4" type="half">
            <input name="in" type="color4" interfacename="in" />
            <input name="channels" type="string" value="g" />
        </swizzle>
        <swizzle name="N_b_color4" type="half">
            <input name="in" type="color4" interfacename="in" />
            <input name="channels" type="string" value="b" />
        </swizzle>
        <swizzle name="N_a_color4" type="half">
            <input name="in" type="color4" interfacename="in" />
            <input name="channels" type="string" value="a" />
        </swizzle>
        <output name="outr" type="half" nodename="N_r_color4" />
        <output name="outg" type="half" nodename="N_g_color4" />
        <output name="outb" type="half" nodename="N_b_color4" />
        <output name="outa" type="half" nodename="N_a_color4" />
    </nodegraph>

    <!-- ND_separate2_color4CF -->
    <nodedef name="ND_separate2_color4CF" node="separate4" nodegroup="channel">
        <input name="in" type="color4" value="0.0, 0.0, 0.0, 0.0" />
        <output name="outrgb" type="color3" default="0.0, 0.0, 0.0" />
        <output name="outa" type="float" default="0.0" />
    </nodedef>

    <nodegraph name="NG_separate2_color4CF" nodedef="ND_separate2_color4CF">
        <swizzle name="N_rgb_color3" type="color3">
            <input name="in" type="color4" interfacename="in" />
            <input name="channels" type="string" value="rgb" />
        </swizzle>
        <swizzle name="N_a_half" type="half">
            <input name="in" type="color4" interfacename="in" />
            <input name="channels" type="string" value="a" />
        </swizzle>
        <convert name="N_a_float" type="float">
            <input name="in" type="half" nodename="N_a_half"/>
        </convert>
        <output name="outrgb" type="color3" nodename="N_rgb_color3" />
        <output name="outa" type="float" nodename="N_a_float" />
    </nodegraph>

    <!-- ND_extract_half2 -->
    <nodedef name="ND_extract_half2" node="extract" nodegroup="channel">
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="index" type="integer" value="0" uimin="0" uimax="1" uniform="true" />
        <output name="out" type="half" default="0.0" />
    </nodedef>

    <nodegraph name="NG_extract_half2" nodedef="ND_extract_half2">
        <swizzle name="N_x_half2" type="half">
            <input name="in" type="half2" interfacename="in" />
            <input name="channels" type="string" value="x" />
        </swizzle>
        <swizzle name="N_y_half2" type="half">
            <input name="in" type="half2" interfacename="in" />
            <input name="channels" type="string" value="y" />
        </swizzle>
        <switch name="N_sw_half2" type="half">
            <input name="in1" type="half" nodename="N_x_half2" />
            <input name="in2" type="half" nodename="N_y_half2" />
            <input name="which" type="integer" interfacename="index" />
        </switch>
        <output name="out" type="half" nodename="N_sw_half2" />
    </nodegraph>

    <!-- ND_extract_half3 -->
    <nodedef name="ND_extract_half3" node="extract" nodegroup="channel">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="index" type="integer" value="0" uimin="0" uimax="2" uniform="true" />
        <output name="out" type="half" default="0.0" />
    </nodedef>

    <nodegraph name="NG_extract_half3" nodedef="ND_extract_half3">
        <swizzle name="N_x_half3" type="half">
            <input name="in" type="half3" interfacename="in" />
            <input name="channels" type="string" value="x" />
        </swizzle>
        <swizzle name="N_y_half3" type="half">
            <input name="in" type="half3" interfacename="in" />
            <input name="channels" type="string" value="y" />
        </swizzle>
        <swizzle name="N_z_half3" type="half">
            <input name="in" type="half3" interfacename="in" />
            <input name="channels" type="string" value="z" />
        </swizzle>
        <switch name="N_sw_half3" type="half">
            <input name="in1" type="half" nodename="N_x_half3" />
            <input name="in2" type="half" nodename="N_y_half3" />
            <input name="in3" type="half" nodename="N_z_half3" />
            <input name="which" type="integer" interfacename="index" />
        </switch>
        <output name="out" type="half" nodename="N_sw_half3" />
    </nodegraph>

    <!-- ND_extract_half4 -->
    <nodedef name="ND_extract_half4" node="extract" nodegroup="channel">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="index" type="integer" value="0" uimin="0" uimax="3" uniform="true" />
        <output name="out" type="half" default="0.0" />
    </nodedef>

    <nodegraph name="NG_extract_half4" nodedef="ND_extract_half4">
        <swizzle name="N_x_half4" type="half">
            <input name="in" type="half4" interfacename="in" />
            <input name="channels" type="string" value="x" />
        </swizzle>
        <swizzle name="N_y_half4" type="half">
            <input name="in" type="half4" interfacename="in" />
            <input name="channels" type="string" value="y" />
        </swizzle>
        <swizzle name="N_z_half4" type="half">
            <input name="in" type="half4" interfacename="in" />
            <input name="channels" type="string" value="z" />
        </swizzle>
        <swizzle name="N_w_half4" type="half">
            <input name="in" type="half4" interfacename="in" />
            <input name="channels" type="string" value="w" />
        </swizzle>
        <switch name="N_sw_half4" type="half">
            <input name="in1" type="half" nodename="N_x_half4" />
            <input name="in2" type="half" nodename="N_y_half4" />
            <input name="in3" type="half" nodename="N_z_half4" />
            <input name="in4" type="half" nodename="N_w_half4" />
            <input name="which" type="integer" interfacename="index" />
        </switch>
        <output name="out" type="half" nodename="N_sw_half4" />
    </nodegraph>

    <!-- Contrast -->

    <nodedef name="ND_contrast_half" node="contrast" nodegroup="adjustment">
        <input name="in" type="half" value="0.0" />
        <input name="amount" type="half" value="1.0" />
        <input name="pivot" type="half" value="0.5" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>

    <nodegraph name="NG_contrast_half" nodedef="ND_contrast_half">
        <subtract name="N_sub_half" type="half">
            <input name="in1" type="half" interfacename="in" />
            <input name="in2" type="half" interfacename="pivot" />
        </subtract>
        <multiply name="N_mul_half" type="half">
            <input name="in1" type="half" nodename="N_sub_half" />
            <input name="in2" type="half" interfacename="amount" />
        </multiply>
        <add name="N_add_half" type="half">
            <input name="in1" type="half" nodename="N_mul_half" />
            <input name="in2" type="half" interfacename="pivot" />
        </add>
        <output name="out" type="half" nodename="N_add_half" />
    </nodegraph>

    <nodedef name="ND_contrast_half2" node="contrast" nodegroup="adjustment">
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="amount" type="half2" value="1.0, 1.0" />
        <input name="pivot" type="half2" value="0.5, 0.5" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>

    <nodegraph name="NG_contrast_half2" nodedef="ND_contrast_half2">
        <subtract name="N_sub_half2" type="half2">
            <input name="in1" type="half2" interfacename="in" />
            <input name="in2" type="half2" interfacename="pivot" />
        </subtract>
        <multiply name="N_mul_half2" type="half2">
            <input name="in1" type="half2" nodename="N_sub_half2" />
            <input name="in2" type="half2" interfacename="amount" />
        </multiply>
        <add name="N_add_half2" type="half2">
            <input name="in1" type="half2" nodename="N_mul_half2" />
            <input name="in2" type="half2" interfacename="pivot" />
        </add>
        <output name="out" type="half2" nodename="N_add_half2" />
    </nodegraph>

    <nodedef name="ND_contrast_half3" node="contrast" nodegroup="adjustment">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="amount" type="half3" value="1.0, 1.0, 1.0" />
        <input name="pivot" type="half3" value="0.5, 0.5, 0.5" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>

    <nodegraph name="NG_contrast_half3" nodedef="ND_contrast_half3">
        <subtract name="N_sub_half3" type="half3">
            <input name="in1" type="half3" interfacename="in" />
            <input name="in2" type="half3" interfacename="pivot" />
        </subtract>
        <multiply name="N_mul_half3" type="half3">
            <input name="in1" type="half3" nodename="N_sub_half3" />
            <input name="in2" type="half3" interfacename="amount" />
        </multiply>
        <add name="N_add_half3" type="half3">
            <input name="in1" type="half3" nodename="N_mul_half3" />
            <input name="in2" type="half3" interfacename="pivot" />
        </add>
        <output name="out" type="half3" nodename="N_add_half3" />
    </nodegraph>

    <nodedef name="ND_contrast_half4" node="contrast" nodegroup="adjustment">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="amount" type="half4" value="1.0, 1.0, 1.0, 1.0" />
        <input name="pivot" type="half4" value="0.5, 0.5, 0.5, 0.5" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>

    <nodegraph name="NG_contrast_half4" nodedef="ND_contrast_half4">
        <subtract name="N_sub_half4" type="half4">
            <input name="in1" type="half4" interfacename="in" />
            <input name="in2" type="half4" interfacename="pivot" />
        </subtract>
        <multiply name="N_mul_half4" type="half4">
            <input name="in1" type="half4" nodename="N_sub_half4" />
            <input name="in2" type="half4" interfacename="amount" />
        </multiply>
        <add name="N_add_half4" type="half4">
            <input name="in1" type="half4" nodename="N_mul_half4" />
            <input name="in2" type="half4" interfacename="pivot" />
        </add>
        <output name="out" type="half4" nodename="N_add_half4" />
    </nodegraph>

    <nodedef name="ND_contrast_half2FA" node="contrast" nodegroup="adjustment">
        <input name="in" type="half2" value="0.0, 0.0" />
        <input name="amount" type="half" value="1.0" />
        <input name="pivot" type="half" value="0.5" />
        <output name="out" type="half2" defaultinput="in" />
    </nodedef>

    <nodegraph name="NG_contrast_half2FA" nodedef="ND_contrast_half2FA">
        <subtract name="N_sub_half2FA" type="half2">
            <input name="in1" type="half2" interfacename="in" />
            <input name="in2" type="half" interfacename="pivot" />
        </subtract>
        <multiply name="N_mul_half2FA" type="half2">
            <input name="in1" type="half2" nodename="N_sub_half2FA" />
            <input name="in2" type="half" interfacename="amount" />
        </multiply>
        <add name="N_add_half2FA" type="half2">
            <input name="in1" type="half2" nodename="N_mul_half2FA" />
            <input name="in2" type="half" interfacename="pivot" />
        </add>
        <output name="out" type="half2" nodename="N_add_half2FA" />
    </nodegraph>

    <nodedef name="ND_contrast_half3FA" node="contrast" nodegroup="adjustment">
        <input name="in" type="half3" value="0.0, 0.0, 0.0" />
        <input name="amount" type="half" value="1.0" />
        <input name="pivot" type="half" value="0.5" />
        <output name="out" type="half3" defaultinput="in" />
    </nodedef>

    <nodegraph name="NG_contrast_half3FA" nodedef="ND_contrast_half3FA">
        <subtract name="N_sub_half3FA" type="half3">
            <input name="in1" type="half3" interfacename="in" />
            <input name="in2" type="half" interfacename="pivot" />
        </subtract>
        <multiply name="N_mul_half3FA" type="half3">
            <input name="in1" type="half3" nodename="N_sub_half3FA" />
            <input name="in2" type="half" interfacename="amount" />
        </multiply>
        <add name="N_add_half3FA" type="half3">
            <input name="in1" type="half3" nodename="N_mul_half3FA" />
            <input name="in2" type="half" interfacename="pivot" />
        </add>
        <output name="out" type="half3" nodename="N_add_half3FA" />
    </nodegraph>

    <nodedef name="ND_contrast_half4FA" node="contrast" nodegroup="adjustment">
        <input name="in" type="half4" value="0.0, 0.0, 0.0, 0.0" />
        <input name="amount" type="half" value="1.0" />
        <input name="pivot" type="half" value="0.5" />
        <output name="out" type="half4" defaultinput="in" />
    </nodedef>

    <nodegraph name="NG_contrast_half4FA" nodedef="ND_contrast_half4FA">
        <subtract name="N_sub_half4FA" type="half4">
            <input name="in1" type="half4" interfacename="in" />
            <input name="in2" type="half" interfacename="pivot" />
        </subtract>
        <multiply name="N_mul_half4FA" type="half4">
            <input name="in1" type="half4" nodename="N_sub_half4FA" />
            <input name="in2" type="half" interfacename="amount" />
        </multiply>
        <add name="N_add_half4FA" type="half4">
            <input name="in1" type="half4" nodename="N_mul_half4FA" />
            <input name="in2" type="half" interfacename="pivot" />
        </add>
        <output name="out" type="half4" nodename="N_add_half4FA" />
    </nodegraph>

    <!--
    Node: <blur>
    A gaussian-falloff blur.
    -->
    <nodedef name="ND_blur_half" node="blur" nodegroup="convolution2d">
        <input name="in" type="half" value="0.0" />
        <input name="size" type="half" value="0.0" />
        <input name="filtertype" type="string" value="box" enum="box,gaussian" uniform="true" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <!--
    Node: <dot>
    No-op; passes its input to the output unchanged.
    -->
    <nodedef name="ND_dot_half" node="dot" nodegroup="organization">
        <input name="in" type="half" value="0.0" />
        <input name="note" type="string" value="" uniform="true" />
        <output name="out" type="half" defaultinput="in" />
    </nodedef>
    <nodedef name="ND_dot_realitykit_geometry_modifier" node="dot" nodegroup="organization">
        <input name="in" type="vertex" value="" />
        <input name="note" type="string" value="" uniform="true" />
        <output name="out" type="vertex" defaultinput="in" />
    </nodedef>

    <!-- ======================================================================== -->
    <!-- Supplemental Texture nodes                                               -->
    <!-- ======================================================================== -->

    <!--
    <tiledimage>
    -->
    <nodegraph name="NG_tiledimage_half" nodedef="ND_tiledimage_half">
        <multiply name="N_mult_float" type="vector2">
            <input name="in1" type="vector2" interfacename="texcoord" />
            <input name="in2" type="vector2" interfacename="uvtiling" />
        </multiply>
        <subtract name="N_sub_float" type="vector2">
            <input name="in1" type="vector2" nodename="N_mult_float" />
            <input name="in2" type="vector2" interfacename="uvoffset" />
        </subtract>
        <divide name="N_divtilesize_float" type="vector2">
            <input name="in1" type="vector2" nodename="N_sub_float" />
            <input name="in2" type="vector2" interfacename="realworldimagesize" />
        </divide>
        <multiply name="N_multtilesize_float" type="vector2">
            <input name="in1" type="vector2" nodename="N_divtilesize_float" />
            <input name="in2" type="vector2" interfacename="realworldtilesize" />
        </multiply>
        <image name="N_img_half" type="half">
            <input name="file" type="filename" interfacename="file" />
            <input name="default" type="half" interfacename="default" />
            <input name="texcoord" type="vector2" nodename="N_multtilesize_float" />
            <input name="uaddressmode" type="string" value="periodic" />
            <input name="vaddressmode" type="string" value="periodic" />
            <input name="filtertype" type="string" interfacename="filtertype" />
            <input name="framerange" type="string" interfacename="framerange" />
            <input name="frameoffset" type="integer" interfacename="frameoffset" />
            <input name="frameendaction" type="string" interfacename="frameendaction" />
        </image>
        <output name="out" type="half" nodename="N_img_half" />
    </nodegraph>

    <!-- ======================================================================== -->
    <!-- Normal Map Decoder (2x - 1)                                              -->
    <!-- ======================================================================== -->


    <nodegraph name="NG_normal_map_decode" nodedef="ND_normal_map_decode">
        <multiply name="multiply" type="vector3">
            <input name="in1" type="vector3" interfacename="in" />
            <input name="in2" type="float" value="2.0" />
        </multiply>
        <subtract name="subtract" type="vector3">
            <input name="in1" type="vector3" nodename="multiply" />
            <input name="in2" type="float" value="1.0" />
        </subtract>

        <output name="out" type="vector3" nodename="subtract" />
    </nodegraph>


    <nodedef name="ND_combine2_integer2" node="combine2" nodegroup="channel">
        <input name="in1" type="integer" value="0" />
        <input name="in2" type="integer" value="0" />
        <output name="out" type="integer2" default="0, 0" />
    </nodedef>

    <nodedef name="ND_combine3_integer3" node="combine3" nodegroup="channel">
        <input name="in1" type="integer" value="0" />
        <input name="in2" type="integer" value="0" />
        <input name="in3" type="integer" value="0" />
        <output name="out" type="integer3" default="0, 0, 0" />
    </nodedef>

    <nodedef name="ND_combine4_integer4" node="combine4" nodegroup="channel">
        <input name="in1" type="integer" value="0" />
        <input name="in2" type="integer" value="0" />
        <input name="in3" type="integer" value="0" />
        <input name="in4" type="integer" value="0" />
        <output name="out" type="integer4" default="0, 0, 0, 0" />
    </nodedef>

    <nodedef name="ND_separate2_integer2" node="separate2" nodegroup="channel">
        <input name="in" type="integer2" value="0, 0" />
        <output name="outx" type="integer" default="0" />
        <output name="outy" type="integer" default="0" />
    </nodedef>

    <nodedef name="ND_separate3_integer3" node="separate3" nodegroup="channel">
        <input name="in" type="integer3" value="0, 0, 0" />
        <output name="outx" type="integer" default="0" />
        <output name="outy" type="integer" default="0" />
        <output name="outz" type="integer" default="0" />
    </nodedef>

    <nodedef name="ND_separate4_integer4" node="separate4" nodegroup="channel">
        <input name="in" type="integer4" value="0, 0, 0, 0" />
        <output name="outx" type="integer" default="0" />
        <output name="outy" type="integer" default="0" />
        <output name="outz" type="integer" default="0" />
        <output name="outw" type="integer" default="0" />
    </nodedef>

    <nodedef name="ND_constant_integer2" node="constant" nodegroup="procedural">
        <input name="value" type="integer2" value="0, 0" />
        <output name="out" type="integer2" default="0, 0" />
    </nodedef>

    <nodedef name="ND_constant_integer3" node="constant" nodegroup="procedural">
        <input name="value" type="integer3" value="0, 0, 0" />
        <output name="out" type="integer3" default="0, 0, 0" />
    </nodedef>

    <nodedef name="ND_constant_integer4" node="constant" nodegroup="procedural">
        <input name="value" type="integer4" value="0, 0, 0, 0" />
        <output name="out" type="integer4" default="0, 0, 0, 0" />
    </nodedef>

    <!--
    Node: <texcoord>
    The full 2D or 3D texture coordinates associated with the currently processed data.
    -->
    <nodedef name="ND_texcoord_vector4" node="texcoord" nodegroup="geometric">
        <input name="index" type="integer" value="0" uniform="true" />
        <output name="out" type="vector4" default="0.0, 0.0, 0.0, 0.0" />
    </nodedef>
    <implementation name="IMP_texcoord_vector4" nodedef="ND_texcoord_vector4" function="ND_texcoord_vector4_surface" function_body_filename="texcoord" target="realitykit_surface_shader"/>
    <implementation name="IMP_texcoord_vector4" nodedef="ND_texcoord_vector4" function="ND_texcoord_vector4_geometry" function_body_filename="texcoord" target="realitykit_geometry_modifier"/>

</materialx>
