<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.39 (Ruby 4.0.6) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-yuyou-moq-conditional-filtering-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="Conditional Range Filters">Conditional Range Filters for Media over QUIC Transport</title>

    <author initials="Y." surname="You" fullname="Yu You">
      <organization>Nokia</organization>
      <address>
        <email>yu.you@nokia.com</email>
      </address>
    </author>
    <author initials="S." surname="Gül" fullname="Serhan Gül">
      <organization>Nokia</organization>
      <address>
        <email>serhan.guel@nokia.com</email>
      </address>
    </author>
    <author initials="A." surname="Begen" fullname="Ali Cengiz Begen">
      <organization>Networked Media</organization>
      <address>
        <email>ali.begen@networked.media</email>
      </address>
    </author>
    <author initials="A." surname="Sarker" fullname="ANM Zaheduzzaman Sarker">
      <organization>Nokia</organization>
      <address>
        <email>zaheduzzaman.sarker@nokia.com</email>
      </address>
    </author>

    <date year="2026" month="September" day="14"/>

    <area>Web and Internet Transport</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>media over quic</keyword> <keyword>range filter</keyword> <keyword>moq</keyword> <keyword>moqt</keyword>

    <abstract>


<?line 56?>
<t>In Media over QUIC Transport (MOQT), subscribers can use Range Filters
to select specific subgroups, objects, or priorities within a subscribed
track. However, these subscription filters are static once established
and can only be modified through explicit subscriber control signaling.
This document proposes an extension to the Range Filter design that
binds conditional evaluation logic directly to specific Range Filter
sets. By introducing dynamic conditions to Range Filter configurations,
a relay can autonomously adapt the intra-track forwarding behavior based
on real-time network conditions, avoiding the round-trip delay of
explicit subscriber update signaling.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://yuyou.github.io/conditional_filtering/"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-yuyou-moq-conditional-filtering/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/yuyou/conditional_filtering"/>.</t>
    </note>


  </front>

  <middle>


<?line 68?>

<section anchor="introduction"><name>Introduction</name>

<t>Media over QUIC Transport (MOQT) supports subscription filters in
SUBSCRIBE requests to indicate which objects within a track are to be
forwarded. Range Filters allow subscribers to restrict delivery based on
subgroup identifiers, object identifiers, publisher priorities, or
specific metadata properties.</t>

<t>However, current MOQT subscription filters are static once established.
If a subscriber wishes to change the adaptation policy (e.g., dropping
an enhancement subgroup due to network congestion), it requires a
closed-loop procedure: detecting the throughput drop, computing a new
filter, signaling via REQUEST_UPDATE, and waiting for the relay to apply
it. This reaction delay introduces a risk of temporary overdelivery and
queue build-up.</t>

<t>The Top Tracks Filter defined by MOQT performs dynamic inter-track
selection by ranking tracks within a namespace according to a Track or
Object Property. This document is complementary to that mechanism. It
performs intra-track selection among Range Filter SetIDs according to
downstream network conditions. When both mechanisms are used, the Top
Tracks Filter first selects tracks and conditional Range Filters then
select Objects within those tracks, consistent with the filter ordering
defined by MOQT.</t>

<t>This document extends Range Filters with conditional logic that allows
relays to evaluate pre-authorized conditions and determine which SetIDs
remain active at runtime. It defines a new RANGE_FILTER_CONDITION
parameter that explicitly binds a specific Range Filter SetID to a
condition. If the condition for a particular SetID is met, the relay
keeps that SetID active in the Range Filter expression; otherwise, that
SetID is ignored. This enables autonomous, relay-side intra-track
adaptation without requiring further signaling from the subscriber.</t>

</section>
<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>
<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

<?line -18?>

</section>
<section anchor="the-inline-rangefiltercondition-parameter"><name>The Inline RANGE_FILTER_CONDITION Parameter</name>

<t>The inline design for conditional filtering embeds all necessary
algorithm configuration fields directly within a new message parameter,
making it a self-contained solution for intra-track adaptation.</t>

<section anchor="relationship-to-existing-setid"><name>Relationship to Existing SetID</name>

<t>Range Filters in MOQT (Section 5.1.3 of <xref target="I-D.ietf-moq-transport"/>)
already define a SetID field (8 bits) within each filter parameter
(SUBGROUP_FILTER, OBJECTID_FILTER, PRIORITY_FILTER,
OBJECT_PROPERTY_FILTER, TRACK_PROPERTY_FILTER). Filter parameters
sharing the same SetID are combined with logical AND, and different
SetID groups are combined with logical OR.</t>

<t>This document does not redefine SetID. RANGE_FILTER_CONDITION references
an existing SetID value to bind conditional evaluation logic to a
specific filter group that was already declared in the same message.</t>

</section>
<section anchor="parameter-definition"><name>Parameter Definition</name>

<t>To enable conditional functionality, this document introduces a new
Message Parameter: RANGE_FILTER_CONDITION. This parameter applies
conditional activation rules to an intra-track filter set identified by
a SetID.</t>

<t>The parameter <bcp14>MAY</bcp14> appear in SUBSCRIBE, PUBLISH_OK, or REQUEST_UPDATE
messages. Multiple instances <bcp14>MAY</bcp14> be present, each referencing a
different SetID. The same SetID <bcp14>MUST NOT</bcp14> appear in more than one
RANGE_FILTER_CONDITION within the same message. The parameter <bcp14>MAY</bcp14> also
appear in SUBSCRIBE_TRACKS, where it is inherited as an initial parameter
of each resulting subscription, as specified for Subscription parameters by MOQT.</t>

<t>The RANGE_FILTER_CONDITION parameter has the following wire format:</t>

<figure><artwork><![CDATA[
RANGE_FILTER_CONDITION {
  Set ID (8),
  Algorithm ID (vi64),
  Throughput threshold (vi64),
  Set throughput fraction (vi64),
  Activate switching (vi64),
  Set rank (8)
}
]]></artwork></figure>
<t>The fields are defined as follows:</t>

<dl>
  <dt>Set ID (8 bits):</dt>
  <dd>
    <t>Identifies the Range Filter set being made conditional. This value
<bcp14>MUST</bcp14> match a SetID used in at least one Range Filter parameter in the
same message. The field is 8 bits, consistent with the SetID encoding
defined in MOQT Range Filters.</t>
  </dd>
  <dt>Algorithm ID (vi64):</dt>
  <dd>
    <t>Identifies the conditional evaluation algorithm to be used. This
document defines Algorithm 0. Other algorithms <bcp14>MAY</bcp14> be defined in
future specifications.</t>
  </dd>
  <dt>Throughput threshold (vi64):</dt>
  <dd>
    <t>Algorithm 0 specific. The minimum estimated downstream throughput in
kbps required for the relay to keep this SetID active in the Range
Filter OR-combination. When bandwidth is constrained, the relay
determines which conditional SetIDs remain active according to the
bandwidth allocation algorithm (<xref target="bandwidth-allocation"/>).</t>
  </dd>
  <dt>Set throughput fraction (vi64):</dt>
  <dd>
    <t>Algorithm 0 specific. Relative weight for bandwidth allocation,
expressed as an integer 1 &lt;= N &lt;= 10. Each conditional SetID receives
bandwidth proportional to its fraction: <spanx style="verb">target = B_total x fraction /
sum_F</spanx>. Fractions are relative weights, not absolute percentages. For
example, fractions of 6, 4, 3 (sum_F = 13) allocate approximately 46%,
31%, and 23% respectively. This allows conditional SetIDs to be added
or removed without requiring other conditional SetIDs to update their
fractions.</t>
  </dd>
  <dt>Activate switching (vi64):</dt>
  <dd>
    <t>Controls whether conditional evaluation is active for this SetID.
When set to 0, the relay ignores the conditional state for this SetID
and includes it in the base MOQT OR-combination exactly as ordinary
Range Filters do. When set to a non-zero value N, the relay activates
condition-based admission for conditionally bound SetIDs as soon as at
least N RANGE_FILTER_CONDITION entries for this subscription have been
received. Activation takes effect at the next Group boundary.</t>
  </dd>
  <dt>Set rank (8 bits):</dt>
  <dd>
    <t>Degradation priority when estimated bandwidth is constrained,
expressed as an 8-bit unsigned integer in the range 1-255. The default
value is 1. Values of 0 and outside this range <bcp14>MUST</bcp14> result in a
REQUEST_ERROR with error code INVALID_FILTER. Lower values indicate
higher priority (protected from degradation). When bandwidth is
sufficient, all conditional SetIDs remain active. When bandwidth is
constrained, lower-priority conditional SetIDs (higher numeric rank)
are deactivated first, while higher-priority conditional SetIDs
maintain their target allocation.</t>
  </dd>
</dl>

</section>
<section anchor="conditional-set-assignment-design"><name>Alternative 1: Reference Design</name>

<t>The inline parameter design described in <xref target="parameter-definition"/> embeds
all algorithm fields directly in RANGE_FILTER_CONDITION. This produces a
self-contained parameter but duplicates the algorithm parameter
structure that Sender-Side Track Switching (SSTS) <xref target="SSTS"/> defines in
its SWITCHING-SET-ASSIGNMENT parameter, which has an identical set of
fields (Algorithm ID, Throughput threshold, Set throughput fraction,
Activate switching, Set rank).</t>

<t>A more composable design separates the algorithm configuration from the
filter binding. Under this design, a single common parameter
"CONDITIONAL-SET-ASSIGNMENT" carries the algorithm fields and is
shared by both intra-track conditional filtering and inter-track SSTS
switching. RANGE_FILTER_CONDITION is then reduced to a binding that maps
a Range Filter SetID to a Conditional set ID:</t>

<figure><artwork><![CDATA[
CONDITIONAL-SET-ASSIGNMENT {
  Conditional set ID (vi64),
  Algorithm ID (vi64),
  Throughput threshold (vi64),
  Set throughput fraction (vi64),
  Activate switching (vi64),
  Set rank (8)
}

RANGE_FILTER_CONDITION {
  Set ID (8),
  Conditional set ID (vi64)
}
]]></artwork></figure>
<t>CONDITIONAL-SET-ASSIGNMENT replaces the SWITCHING-SET-ASSIGNMENT
parameter currently defined in SSTS. The fields and semantics are
identical; only the name and scope change. For SSTS use, the subscriber
assigns a subscription to a conditional set by including
CONDITIONAL-SET-ASSIGNMENT in SUBSCRIBE or PUBLISH_OK, exactly as it
would have used SWITCHING-SET-ASSIGNMENT. For intra-track conditional
filtering, the subscriber additionally includes one
RANGE_FILTER_CONDITION per SetID to bind each Range Filter group to a
Conditional set ID.</t>

<t>This design has the following properties:</t>

<t><list style="symbols">
  <t>Algorithm parameters are defined once in CONDITIONAL-SET-ASSIGNMENT
and shared across use cases. Multiple RANGE_FILTER_CONDITION entries
can reference the same Conditional set ID if they share algorithm
configuration, or different IDs if they require different thresholds
or ranks.</t>
  <t>RANGE_FILTER_CONDITION becomes a lightweight binding with a fixed,
minimal wire footprint (one 8-bit SetID and one varint).</t>
  <t>A single relay implementation handles both conditional intra-track
filtering and inter-track SSTS switching through the same
CONDITIONAL-SET-ASSIGNMENT evaluation logic.</t>
  <t>Future algorithms defined for SSTS are automatically available for
conditional intra-track filtering without any changes to this
specification.</t>
</list></t>

<t>The trade-off is that the subscriber must include two parameter types
"CONDITIONAL-SET-ASSIGNMENT" and "RANGE_FILTER_CONDITION", rather
than one, and the relay must correlate them. This is a minor
implementation cost relative to the elimination of duplicated parameter
definitions across two specifications.</t>

</section>
<section anchor="conditional-filter-set-design"><name>Alternative 2: Self-Contained Design</name>

<t>The reference-based design maps existing SetIDs to dynamic conditions. A
second alternative is a self-contained design that introduces a new
parameter, CONDITIONAL_FILTER_SET, which explicitly carries a list of
alternative filter configurations for a single subscription.</t>

<t>In this design, the relay interprets the provided configurations as
mutually exclusive alternatives. The relay monitors the specified metric
and autonomously selects and applies exactly one configuration from the
set whose condition is satisfied.</t>

<section anchor="parameter-definition-1"><name>Parameter Definition</name>

<t>The CONDITIONAL_FILTER_SET parameter (Type 0x44) has the following
structure:</t>

<figure><artwork><![CDATA[
CONDITIONAL_FILTER_SET {
  Parameter Type (vi64) = 0x44,
  Set ID (vi64),
  Switching Metric (vi64),
  Switching Offset (uint8),
  Configuration Count (vi64),
  Configuration (..) ...,
}
]]></artwork></figure>
<t><list style="symbols">
  <t>Set ID: Uniquely identifies the conditional filter set within the
session scope, allowing it to be updated or removed via
REQUEST_UPDATE.</t>
  <t>Switching Metric: Identifies the relay-observable metric used for
selection, such as throughput (kbps), RTT (ms), or ECN marking rate.</t>
  <t>Switching Offset: Specifies the switching point. A value of 0
indicates an immediate "hard switch." A non-zero value indicates a
"soft switch," where the new configuration is applied starting from a
future Subgroup ID (Current ID + Offset).</t>
  <t>Configuration Count: The number of alternative filter configurations
included in this set.</t>
</list></t>

<t>Each Configuration entry within the set defines a specific threshold and
the filters to apply when active:</t>

<figure><artwork><![CDATA[
Configuration {
  Config ID (vi64),
  Metric Threshold (vi64),
  Filter Parameter Count (vi64),
  Filter Parameters (..) ...,
}
]]></artwork></figure>
<t><list style="symbols">
  <t>Config ID: An identifier for the specific configuration within the
set.</t>
  <t>Metric Threshold: The condition value for the selected Switching
Metric. For throughput, the relay selects the configuration with the
highest threshold that does not exceed the currently observed metric.</t>
  <t>Filter Parameters: A list of standard MOQT filter parameters (e.g.,
SUBGROUP_FILTER, OBJECTID_FILTER) to be applied when this
configuration is active.</t>
</list></t>

<t>Unlike the OR-preserving design, this model uses set-replacement logic.
If RTT is the metric and three configurations are defined with
thresholds of 80ms, 150ms, and 250ms, the relay selects only the one
that matches the current RTT range, stripping all other data</t>

</section>
</section>
<section anchor="summary-of-design-alternatives"><name>Summary of Design Alternatives</name>

<t>This draft explores three distinct architectural approaches for
conditional filtering.</t>

<t><list style="numbers" type="1">
  <t><strong>Inline Design:</strong> Embeds algorithm parameters directly into a new
message parameter that activates or deactivates existing Range
Filter SetIDs based on real-time metrics.</t>
  <t><strong>Reference-Based Design:</strong> Reuses the common algorithm structure
from SSTS by mapping standard Range Filter SetIDs to shared
conditional logic configurations.</t>
  <t><strong>Self-Contained Design:</strong> Defines an independent parameter carrying
an internal list of mutually exclusive filter profiles and their
corresponding metric thresholds.</t>
</list></t>

<t>The <strong>Inline Design</strong> is suggested as the option requiring the <strong>least
changes</strong> to the current MOQT specification. It functions as a <strong>purely
additive</strong> message parameter that references existing <spanx style="verb">SetID</spanx> values
already defined in the base protocol, thereby avoiding the need to
modify existing parameters or reorganize the structures of other
extensions like SSTS.</t>

</section>
</section>
<section anchor="relay-evaluation-and-bandwidth-allocation"><name>Relay Evaluation and Bandwidth Allocation</name>

<t>Most of the text in this section is adapted from Sender-Side Track
Switching for Media over QUIC Transport <xref target="SSTS"/>, specifically the
"Bandwidth Allocation Algorithm" material at
&lt;https://github.com/wilaw/moq-transport/blob/patch-1/draft-ietf-moq-tran
sport.md#bandwidth-allocation-allocation-algorithm&gt;.</t>

<section anchor="general-behavior"><name>General Behavior</name>

<t>With this parameter, the subscriber pre-authorizes the relay to
autonomously adjust intra-track forwarding within the subscribed track.</t>

<t>When RANGE_FILTER_CONDITION entries are present and activate switching
is non-zero, the relay evaluates each conditionally bound SetID at each
permitted switching point (Group boundary) and determines whether that
SetID remains active. The relay then applies the standard MOQT
OR-combination across all active conditional SetIDs together with any
unconditional SetIDs. In other words, RANGE_FILTER_CONDITION changes
whether a SetID participates in the OR expression; it does not change
the meaning of SetID itself.</t>

<t>When activate switching is 0 for all conditional SetIDs, or no
RANGE_FILTER_CONDITION is present, the relay applies the standard MOQT
Range Filter OR-combination behavior unchanged.</t>

</section>
<section anchor="algorithm-0-throughput-based-conditional-set-admission"><name>Algorithm 0: Throughput-Based Conditional Set Admission</name>

<section anchor="relay-state"><name>Relay State</name>

<t>The relay maintains the following state for each subscription that
carries one or more RANGE_FILTER_CONDITION parameters with Algorithm ID
0:</t>

<t><list style="symbols">
  <t><spanx style="verb">B_total</spanx>: Estimated downstream bandwidth capacity for the subscriber
connection. The relay <bcp14>MUST</bcp14> maintain a bandwidth estimate per
downstream subscriber. The measurement interval <bcp14>SHOULD</bcp14> be at least the
Group duration of the subscribed track. The estimate is obtained from
the QUIC congestion control state (e.g., pacing rate, congestion
window, smoothed RTT) and <bcp14>MAY</bcp14> be supplemented by external sources. The
exact mechanism is implementation-specific.</t>
  <t><spanx style="verb">sum_F</spanx>: Sum of all Set throughput fraction values across all
registered RANGE_FILTER_CONDITION entries for this subscription.
Updated when entries are added or removed.</t>
  <t><spanx style="verb">set.threshold</spanx>: The Throughput threshold for each conditional SetID.</t>
  <t><spanx style="verb">set.fraction</spanx>: The Set throughput fraction for each conditional
SetID.</t>
  <t><spanx style="verb">set.rank</spanx>: The Set rank for each conditional SetID.</t>
  <t><spanx style="verb">active_set_ids</spanx>: The set of conditional SetIDs currently admitted
into the MOQT OR-combination for this subscription.</t>
</list></t>

</section>
<section anchor="bandwidth-allocation"><name>Bandwidth Allocation Algorithm</name>

<t>On a periodic update interval or at a minimum at each Group boundary,
the relay executes the following algorithm to determine which
conditional SetIDs remain active:</t>

<figure><artwork><![CDATA[
active_set_ids = {}
reserved_bw = 0
B_available = B_total
for each set in ascending rank order:
  set.target     = B_total x set.fraction / sum_F
  B_available    = max(0, B_total - reserved_bw)
  if set.threshold <= min(set.target, B_available):
    active_set_ids += set.set_id
    reserved_bw += set.threshold
]]></artwork></figure>
<t>The relay then forwards Objects that pass the Range Filters associated
with any SetID in <spanx style="verb">active_set_ids</spanx>, combined using the standard MOQT OR
semantics, together with any unconditional SetIDs. If no conditional
SetID satisfies its threshold, the relay forwards only the unconditional
SetIDs, if any. If the subscription contains no unconditional SetIDs,
the relay <bcp14>MAY</bcp14> forward no Objects; this behavior <bcp14>SHOULD</bcp14> be documented by
the relay implementation.</t>

<t>The rank ordering ensures higher-priority conditional SetIDs (lower rank
value) are admitted first. The use of <spanx style="verb">reserved_bw</spanx> makes admission
monotonic: once a higher-priority conditional SetID has been admitted,
lower-priority SetIDs are evaluated only against the bandwidth that
remains after honoring those earlier admissions. Lower-priority
conditional SetIDs therefore absorb any shortfall by being deactivated
from the OR-combination.</t>

</section>
<section anchor="relay-procedure"><name>Relay Procedure</name>

<t>When the relay receives a subscription with one or more
RANGE_FILTER_CONDITION parameters:</t>

<t><list style="numbers" type="1">
  <t>Register each conditional SetID and its associated Algorithm
parameters.</t>
  <t>Store <spanx style="verb">B_total</spanx>, <spanx style="verb">sum_F</spanx>, <spanx style="verb">set.threshold</spanx>, <spanx style="verb">set.fraction</spanx>,
<spanx style="verb">set.rank</spanx>, and <spanx style="verb">active_set_ids</spanx> as subscription state.</t>
  <t>If activate switching is non-zero and the number of registered
RANGE_FILTER_CONDITION entries for this subscription is &gt;= the
activate switching value, begin active SetID admission by applying
the bandwidth allocation algorithm (<xref target="bandwidth-allocation"/>) at the
next Group boundary.</t>
</list></t>

<t>When a REQUEST_UPDATE is received:</t>

<t><list style="symbols">
  <t>A RANGE_FILTER_CONDITION with Length = 0 removes the conditional state
for the referenced SetID.</t>
  <t>A RANGE_FILTER_CONDITION with non-zero Length replaces the entire
conditional state for the referenced SetID.</t>
  <t>Conditional SetIDs not referenced in REQUEST_UPDATE remain unchanged.</t>
</list></t>

<t>When the subscription is terminated (PUBLISH_DONE or cancellation), the
relay removes all associated RANGE_FILTER_CONDITION state.</t>

</section>
</section>
</section>
<section anchor="example-or-preserving-conditional-layer-admission"><name>Example: OR-Preserving Conditional Layer Admission</name>

<t>A subscriber receives a scalable video track containing three subgroups:
Subgroup 0 (base layer), Subgroup 1 (enhancement layer 1), and Subgroup
2 (enhancement layer 2).</t>

<t>The subscriber defines three SetID groups that remain OR-combined in the
normal MOQT sense. The base layer is always included. Conditional
evaluation determines which enhancement layers stay active at any given
time.</t>

<section anchor="step-1-define-the-range-filters"><name>Step 1: Define the Range Filters</name>

<t>Using the standard MOQT SUBGROUP_FILTER parameter (SetID is 8 bits per
MOQT Section 5.1.3):</t>

<t><list style="symbols">
  <t>SUBGROUP_FILTER (SetID = 0): Range 0-0. Delivers the base layer. This
SetID is unconditional.</t>
  <t>SUBGROUP_FILTER (SetID = 1): Range 1-1. Delivers enhancement layer 1.</t>
  <t>SUBGROUP_FILTER (SetID = 2): Range 2-2. Delivers enhancement layer 2.</t>
</list></t>

</section>
<section anchor="step-2-bind-conditions-with-rangefiltercondition-algorithm-0"><name>Step 2: Bind Conditions with RANGE_FILTER_CONDITION (Algorithm 0)</name>

<figure><artwork><![CDATA[
RANGE_FILTER_CONDITION (SetID=1):
  Algorithm ID           = 0
  Throughput threshold   = 2000  (kbps)
  Set throughput fraction = 6
  Activate switching     = 2
  Set rank               = 1

RANGE_FILTER_CONDITION (SetID=2):
  Algorithm ID           = 0
  Throughput threshold   = 2500  (kbps)
  Set throughput fraction = 4
  Activate switching     = 2
  Set rank               = 2
]]></artwork></figure>
<t>Activate switching = 2 means condition-based admission activates once
both conditional RANGE_FILTER_CONDITION entries are registered. sum_F =
6 + 4 = 10.</t>

</section>
<section anchor="result"><name>Result</name>

<t>The relay applies the bandwidth allocation algorithm at each Group
boundary:</t>

<t><list style="symbols">
  <t>B_total = 7000 kbps: SetID=1 is allocated <spanx style="verb">7000 * 6 / 10 = 4200</spanx>,
which satisfies its 2000 kbps threshold. The remaining budget is 5000
kbps. SetID=2 is then allocated <spanx style="verb">7000 * 4 / 10 = 2800</spanx>, which
satisfies its 2500 kbps threshold. The relay therefore forwards SetID
0, SetID 1, and SetID 2.</t>
</list></t>

<t>Note: The subscriber should set fractions and thresholds such that, at
the expected B_total, each desired layer's threshold is within its
allocated fraction. The example above illustrates the mechanics; real
deployments may calibrate threshold and fraction values so the intended
set of layers remains active at expected bandwidth levels.</t>

<t>In a typical deployment:</t>

<t><list style="symbols">
  <t>B_total = 7000 kbps: The relay keeps SetID=1 and SetID=2 active.
Combined with unconditional SetID=0, subgroups 0, 1, and 2 are
forwarded.</t>
  <t>B_total = 4000 kbps: The relay keeps SetID=1 active but not SetID=2.
Combined with unconditional SetID=0, subgroups 0 and 1 are forwarded.</t>
  <t>B_total = 1500 kbps: No conditional enhancement SetID is admitted. The
relay still forwards the unconditional base layer in SetID=0.</t>
</list></t>

<t>By structuring the SetIDs as independently admitted OR terms evaluated
against bandwidth thresholds, the subscriber eliminates round-trip
signaling delays while preserving the existing SetID combination
semantics.</t>

</section>
</section>
<section anchor="call-flow"><name>Call flow</name>

<t><list style="numbers" type="1">
  <t>A typical SUBSCRIBE workflow for conditional range-filter evaluation.</t>
  <t>A publisher-initiated subscription workflow based on SUBSCRIBE_TRACKS
and Namespace Prefix Matching.</t>
  <t>A publisher-initiated subscription workflow where
RANGE_FILTER_CONDITION is carried in PUBLISH_OK.</t>
</list></t>

<section anchor="typical-subscribe-workflow"><name>Typical SUBSCRIBE workflow</name>

<figure><artwork><![CDATA[
+------------+                               +-------+
| Subscriber |                               | Relay |
+------------+                               +-------+
  |                                              |
  |    SUBSCRIBE (Standard Range Filters,        |
  |               RANGE_FILTER_CONDITIONs)       |
  |--------------------------------------------->|
  |                                              |
  |                  SUBSCRIBE_OK                |
  |<---------------------------------------------|
  |                                              |
  |                              +-----------------------------+
  |                              | 1. Measure B_total          |
  |                              | 2. Evaluate Conditions      |
  |                              | 3. Admit Active SetIDs      |
  |                              +-----------------------------+
  |                                              |
  |    Forward Objects (Active SetIDs)           |
  |<=============================================|
  |                                              |
  ~             Bandwidth Fluctuates             ~
  |                                              |
  |                              +-----------------------------+
  |                              | Group Boundary Re-eval:     |
  |                              | Update active SetIDs        |
  |                              +-----------------------------+
  |                                              |
  |    Forward Objects (Updated Active SetIDs)   |
  |    (w/ PRIOR_SUBGROUP_ID_GAP if skipped)     |
  |<=============================================|
  |                                              |
]]></artwork></figure>
<t><list style="symbols">
  <t><strong>Initial setup</strong>: The subscriber sends SUBSCRIBE with multiple SetID
groups (using standard Range Filters) and binds them using
RANGE_FILTER_CONDITION.</t>
  <t><strong>Continuous evaluation</strong>: The relay autonomously executes the
evaluation loop (measuring throughput, comparing thresholds, and
admitting or deactivating conditional SetIDs).</t>
  <t><strong>Dynamic adaptation</strong>: At the next group boundary, the relay can
deactivate lower-priority conditional SetIDs and, when subgroups are
skipped, uses PRIOR_SUBGROUP_ID_GAP to make intentional omissions
explicit.</t>
</list></t>

</section>
<section anchor="standard-publisher-initiated-subscribetracks-workflow-v19"><name>Standard Publisher-initiated SUBSCRIBE_TRACKS workflow (V19)</name>

<t>The following call flow illustrates a publisher-initiated subscription
workflow based on SUBSCRIBE_TRACKS and Namespace Prefix Matching.</t>

<figure><artwork><![CDATA[
+------------+                +-------+                  +-----------+
| Subscriber |                | Relay |                  | Publisher |
+------------+                +-------+                  +-----------+
  |                               |                            |
  | SUBSCRIBE_TRACKS              |                            |
  | (Track Namespace Prefix)      |                            |
  |                               |                            |
  |------------------------------>|                            |
  |                               | Namespace Prefix Matching  |
  |                               | against authorized tracks  |
  |                               |--------------------------->|
  |                               |<---------------------------|
  |                               | Matched Track List         |
  |                               |                            |
  |                               | PUBLISH (Track A)          |
  |<==============================|============================|
  | PUBLISH_OK (or REQUEST_OK)    |                            |
  |==============================>|============================|
  |                               | PUBLISH (Track B)          |
  |<==============================|============================|
  | PUBLISH_OK (or REQUEST_OK)    |                            |
  |==============================>|============================|
  |                               |                            |
  |<==== Objects (Filtered) ======|============================|
  |    (with PRIOR_GAP prop)      |                            |
]]></artwork></figure>
<t><list style="symbols">
  <t><strong>Discovery and matching</strong>: The subscriber requests a Track Namespace
Prefix on a bidirectional stream using SUBSCRIBE_TRACKS. The relay or
publisher performs Namespace Prefix Matching across known authorized
tracks.</t>
  <t><strong>Publisher-initiated delivery</strong>: For each matched track, the
publisher (directly or through the relay) initiates a new stream and
sends PUBLISH. The subscriber accepts each stream with PUBLISH_OK (or
REQUEST_OK), establishing the subscription.</t>
  <t><strong>Filter refinement</strong>: In this workflow, SUBSCRIBE_TRACKS <bcp14>MAY</bcp14> carry
Range Filter parameters and RANGE_FILTER_CONDITION parameters. Each
condition references a Range Filter SetID declared in the same
SUBSCRIBE_TRACKS message. The parameters become initial parameters of
each resulting subscription and limit delivered Objects either
statically or through runtime condition evaluation.</t>
</list></t>

</section>
<section anchor="publisher-initiated-workflow-with-rangefiltercondition"><name>Publisher-initiated workflow with RANGE_FILTER_CONDITION</name>

<t>The following call flow illustrates a publisher-initiated workflow where
the subscriber returns RANGE_FILTER_CONDITION in PUBLISH_OK.</t>

<figure><artwork><![CDATA[
+------------+                +-------+                  +-----------+
| Subscriber |                | Relay |                  | Publisher |
+------------+                +-------+                  +-----------+
  |                               |                            |
  | SUBSCRIBE_TRACKS              |                            |
  | (Track Namespace Prefix)      |                            |
  |------------------------------>|                            |
  |                               | Namespace Prefix Matching  |
  |                               | against authorized tracks  |
  |                               |--------------------------->|
  |                               |<---------------------------|
  |                               | Matched Track List         |
  |                               |                            |
  |                               | PUBLISH (Track A)          |
  |<==============================|============================|
  | PUBLISH_OK                    |                            |
  |   + Range Filters             |                            |
  |   + RANGE_FILTER_CONDITION    |                            |
  |==============================>|============================|
  |                               | Apply returned conditions  |
  |                               | before forwarding objects  |
  |<==== Objects (filtered) ==================================>|
  |                               |                            |
  |                               | PUBLISH (Track B)          |
  |<==============================|============================|
  | PUBLISH_OK                    |                            |
  |   + Range Filters             |                            |
  |   + RANGE_FILTER_CONDITION    |                            |
  |==============================>|============================|
  |                               | Apply returned conditions  |
  |                               | before forwarding objects  |
  |<==== Objects (filtered) ==================================>|
  |                               |                            |
]]></artwork></figure>
<t><list style="symbols">
  <t><strong>No filter parameters in SUBSCRIBE_TRACKS</strong>: The subscriber requests
only a Track Namespace Prefix.</t>
  <t><strong>Filters and conditions conveyed in acceptance</strong>: For each received
PUBLISH stream, the subscriber responds with PUBLISH_OK carrying the
Range Filters and RANGE_FILTER_CONDITION parameters. Each condition
references a Range Filter SetID in that PUBLISH_OK message.</t>
  <t><strong>Per-track activation</strong>: The relay applies the returned conditions to
that accepted stream and forwards only objects that satisfy the
resulting active SetID combination.</t>
</list></t>

</section>
</section>
<section anchor="design-rationale"><name>Design Rationale</name>

<section anchor="or-preserving-admission-versus-set-replacement"><name>OR-Preserving Admission Versus Set Replacement</name>

<t>Two high-level designs are possible for conditional intra-track
filtering.</t>

<t>In a set-replacement design, the relay interprets conditional SetIDs as
mutually exclusive alternatives and selects exactly one active SetID.
That model can be convenient for layered examples, but it changes the
base MOQT meaning of SetID because SetIDs no longer behave as
OR-combined filter groups once conditional logic is enabled.</t>

<t>The inline design instead uses an OR-preserving admission design. Under this
model, conditional logic determines only whether a SetID participates in
the existing OR expression at a given switching point. The AND semantics
within a SetID and the OR semantics across SetIDs remain unchanged. This
preserves compatibility with existing Range Filter processing, avoids
introducing a special-case interpretation of SetID, and lets
unconditional and conditional SetIDs coexist naturally in the same
subscription.</t>

<t>The main trade-off is that subscribers describe adaptation as
incremental admission or removal of OR terms, rather than as a single
explicit "current SetID". That requires examples and algorithms to be
phrased in terms of active SetID combinations. This document prefers
that trade-off because it keeps the extension additive and avoids
redefining core MOQT Range Filter behavior.</t>

</section>
<section anchor="alternative-embedding-conditions-in-existing-range-filter-parameters"><name>Alternative: Embedding Conditions in Existing Range Filter Parameters</name>

<t>An alternative design would embed the conditional evaluation fields
(Algorithm ID, Throughput threshold, Set throughput fraction, Activate
switching, Set rank) directly into the existing Range Filter parameters
SUBGROUP_FILTER, OBJECTID_FILTER, PRIORITY_FILTER,
OBJECT_PROPERTY_FILTER, and TRACK_PROPERTY_FILTER, rather than
introducing a separate RANGE_FILTER_CONDITION parameter.</t>

<t>Under this approach, a subscriber would signal the condition inline with
the filter that it governs, for example:</t>

<figure><artwork><![CDATA[
SUBGROUP_FILTER {
  Type=0x25, Length, [SetID], Range...,
  [Algorithm ID (vi64)],
  [Throughput threshold (vi64)],
  ...
}
]]></artwork></figure>
<t>This approach is not adopted for the following reasons.</t>

<t><strong>SetID is a grouping mechanism, not a per-filter attribute.</strong> A single
SetID typically comprises multiple Range Filter parameters that are
AND-combined (e.g., a SUBGROUP_FILTER and an OBJECTID_FILTER with the
same SetID). The conditional activation logic applies to the entire
SetID group, not to any individual filter within it. Embedding condition
fields in each Range Filter parameter would require either repeating the
fields identically across every parameter sharing the same SetID, or
designating one parameter as the canonical carrier while others are
implicitly governed by it. Both approaches introduce ambiguity and
implementation complexity without benefit.</t>

<t><strong>Modifying base MOQT parameters raises the change bar.</strong>
SUBGROUP_FILTER and related parameters are defined and registered in the
MOQT base specification (<xref target="I-D.ietf-moq-transport"/>, Section 15.7).
Extending their wire format would require a change to or an update of
that specification rather than a new parameter registration. A
standalone parameter type, by contrast, is a purely additive change.</t>

<t><strong>Separation of concerns is architecturally preferable.</strong> Range Filter
parameters define the <em>content selection criterion</em> (which subgroup IDs,
object IDs, priorities, or property values pass). The
RANGE_FILTER_CONDITION parameter defines the <em>activation condition</em>
(under what network state the SetID is active). Keeping these concerns
in separate parameters preserves the ability to use Range Filters
independently of any conditional logic, and allows future algorithms to
be introduced without touching the base filter format.</t>

<t>For these reasons, RANGE_FILTER_CONDITION is defined as a standalone
parameter that references an existing SetID by value.</t>

</section>
<section anchor="handling-filtered-subgroups-prior-subgroup-id-gap"><name>Handling Filtered Subgroups: Prior Subgroup ID Gap</name>

<t>When a relay dynamically filters out a subgroup due to network
conditions, a subscriber receiving the stream might notice a numerical
leap in Group IDs or Object IDs. To explicitly communicate that these
missing objects were intentionally skipped by a conditional filter
rather than lost to network congestion, we propose a new
PRIOR_SUBGROUP_ID_GAP Object Property.</t>

<t><list style="symbols">
  <t><strong>Prior Subgroup ID Gap (Property Type: 0x40):</strong> A variable-length
integer containing the number of Subgroups prior to the current
Subgroup ID (within the current Group) that do not and will never
exist because they were conditionally filtered out.</t>
</list></t>

<t>If a relay drops Subgroup 1 but continues forwarding Subgroup 0 and
Subgroup 2, it injects PRIOR_SUBGROUP_ID_GAP = 1 into the first Object
of Subgroup 2. Relays <bcp14>MUST</bcp14> be permitted to modify this specific gap
property to support dynamic conditional filtering.</t>

</section>
<section anchor="extension-negotiation"><name>Extension negotiation</name>

<t>Per Section 10.3 of <xref target="I-D.ietf-moq-transport"/>, the SETUP message
allows endpoints to agree on the initial configuration before any other
control messages are exchanged. Extensions that modify control message
semantics, such as RANGE_FILTER_CONDITION, <bcp14>MUST</bcp14> be negotiated through
Setup Options before use.</t>

<t>The Setup Options defined in this section are intended for the inline
design of this extension. Alternative designs, such as the
reference-based design (<xref target="conditional-set-assignment-design"/>) or the
self-contained design (<xref target="conditional-filter-set-design"/>), may instead
rely on Setup Options defined in the Sender-Side Track Switching (SSTS)
extension <xref target="SSTS"/> or require different identifiers for their respective
parameters.</t>

<t>This document defines two new Setup Options: RANGE_FILTER_CONDITION and
MAX_CONDITIONAL_FILTERS.</t>

<dl>
  <dt>RANGE_FILTER_CONDITION (Type 0x0A):</dt>
  <dd>
    <t>Declares support for the RANGE_FILTER_CONDITION message parameter
defined in <xref target="parameter-definition"/>. The value is a variable-length
integer identifying the version of the conditional filtering algorithm
set the endpoint is willing to use. The value indicates the highest
Algorithm ID the endpoint is capable of evaluating. An endpoint that
includes this option can process RANGE_FILTER_CONDITION parameters for
any Algorithm ID up to and including the advertised value. If not
present, the endpoint does not support this extension.</t>
  </dd>
  <dt>MAX_CONDITIONAL_FILTERS (Type 0x0B):</dt>
  <dd>
    <t>Limits the peer's total number of RANGE_FILTER_CONDITION parameters
allowed concurrently for a given subscription or fetch. The default
value is 0, so if not specified, the peer <bcp14>MUST NOT</bcp14> send any
RANGE_FILTER_CONDITION parameters. If this limit is exceeded, an
endpoint <bcp14>MUST</bcp14> reject this with REQUEST_ERROR with error code
INVALID_FILTER.</t>
  </dd>
</dl>

<t>An endpoint that wishes to send RANGE_FILTER_CONDITION parameters <bcp14>MUST</bcp14>
verify that the peer's SETUP message includes a RANGE_FILTER_CONDITION
Setup Option with a value greater than or equal to the Algorithm ID it
intends to use, and a MAX_CONDITIONAL_FILTERS value greater than zero.</t>

<t>Because RANGE_FILTER_CONDITION binds to Range Filter SetIDs, an endpoint
that sends RANGE_FILTER_CONDITION <bcp14>MUST</bcp14> also ensure that the
MAX_FILTER_RANGES Setup Option (Section 10.3.1.6 of
<xref target="I-D.ietf-moq-transport"/>) has been negotiated with a non-zero value;
otherwise Range Filters themselves would not be permitted and the
referenced SetIDs could not be established.</t>

<t>Endpoints that do not support this extension will not include the
RANGE_FILTER_CONDITION Setup Option in their SETUP message. As required
by Section 10.3 of <xref target="I-D.ietf-moq-transport"/>, endpoints <bcp14>MUST</bcp14> ignore
unknown Setup Options, so a peer that receives these options from an
endpoint that does not recognize them simply ignores them and does not
send RANGE_FILTER_CONDITION parameters in that session.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>This extension relies on the existing security framework of MOQT.
Conditional filter evaluation must be computationally lightweight to
prevent denial-of-service attacks against relays. A malicious subscriber
could attempt to overwhelm a relay with highly complex
RANGE_FILTER_CONDITION thresholds or excessive conditional SetIDs.
Relays <bcp14>SHOULD</bcp14> implement rate limiting on the maximum number of
conditionally bound SetIDs a subscriber can declare in a single session.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t><list style="symbols">
  <t>A new Setup Option Type for RANGE_FILTER_CONDITION (suggested value:
  0x0A) in the "MOQ Setup Options" registry (Section 15.4 of
<xref target="I-D.ietf-moq-transport"/>), with Specification Required policy.</t>
  <t>A new Setup Option Type for MAX_CONDITIONAL_FILTERS (suggested value:
  0x0B) in the "MOQ Setup Options" registry (Section 15.4 of
<xref target="I-D.ietf-moq-transport"/>), with Specification Required policy.</t>
  <t>A new Message Parameter Type for RANGE_FILTER_CONDITION in the "MOQT
Message Parameters" registry.</t>
  <t>A new Object Property Type for PRIOR_SUBGROUP_ID_GAP (suggested
  value: 0x40) in the "MOQ Properties" registry.</t>
</list></t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">




<reference anchor="I-D.ietf-moq-transport">
   <front>
      <title>Media over QUIC Transport</title>
      <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
         <organization>Cisco</organization>
      </author>
      <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
         <organization>Google</organization>
      </author>
      <author fullname="Ian Swett" initials="I." surname="Swett">
         <organization>Google</organization>
      </author>
      <author fullname="Alan Frindell" initials="A." surname="Frindell">
         <organization>Meta</organization>
      </author>
      <date day="8" month="September" year="2026"/>
      <abstract>
	 <t>   This document defines Media over QUIC Transport (MOQT), a publish/
   subscribe protocol that runs over QUIC and WebTransport.  MOQT
   leverages the features of these transports, such as streams,
   datagrams, priorities, and partial reliability.  MOQT operates both
   point-to-point and through intermediate relays, enabling scalable
   low-latency delivery.  Despite its name, MOQT is media agnostic and
   can be used for a wide range of use cases.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-21"/>
   
</reference>
<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>



    </references>

    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="SSTS" target="https://github.com/wilaw/moqt-ssts/blob/main/draft-wilaw-moq-moqt-ssts.md">
  <front>
    <title>Sender-Side Track Switching for Media over QUIC Transport</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

</references>


<?line 892?>

<section anchor="change-log"><name>Change Log</name>

<t>RFC Editor's Note: Please remove this section prior to publication of a
final version of this document.</t>

<section anchor="draft-yuyou-moq-conditional-filtering-00"><name>draft-yuyou-moq-conditional-filtering-00</name>

<t><list style="symbols">
  <t>Define RANGE_FILTER_CONDITION for conditional admission of Range
Filter SetIDs based on downstream throughput.</t>
  <t>Preserve the existing AND-within-SetID and OR-across-SetIDs semantics.</t>
  <t>Define relay evaluation at Group boundaries and an associated
bandwidth allocation algorithm.</t>
  <t>Define use with SUBSCRIBE, SUBSCRIBE_TRACKS, PUBLISH_OK, and
REQUEST_UPDATE.</t>
  <t>Define PRIOR_SUBGROUP_ID_GAP to identify subgroups omitted by
conditional filtering.</t>
  <t>Clarify that conditional Range Filters provide intra-track adaptation
and complement the inter-track selection performed by Top Tracks
Filters.</t>
</list></t>

</section>
</section>
<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>IETF MOQ Working Group.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+1961IcR7rg/3yKXBwTC3J3C7Dk8TCWzwBCMscSaACN1zsx
IVV3ZUMdVVe16wJqy/Kz7IPsr90X2++Wt+oqQPbsWUfsEGELuqvy8uV3v+V4
PFZN1uRmT28clkWaNVlZJLk+S4pLo59leWOqWs/LSr80aZbo8tpU+q+vjw/1
RZUU9bKsmg2VTKeVub5thA01SxpzWVarPV03qUrLWZEsYNK0SubNeNWuyna8
KH8cz/wI4zm9mxWX4+0dlS2rPd1Ubd3sbm//aXtX1e10kdU1PNqsljDS8dHF
MwWv16ao25qeNQoW9YVKKpPA4r43U50UqT4uYNTCNOEObsrq3WVVtkt4jjd6
aje6od6ZFXyf7imtx3rhwfBjm83os4q2ysvlh8of7b+NujZFa/DlwQm05i1s
fA/LgP3q5/gkfr5Ishw+h3H+kplmPimrS/w4qWZX8PFV0yzrvYcP8Sn8KLs2
E/vYQ/zg4bQqb2rzEN5/iO9dZs1VO93TBO+HAazfOFjDUzkcVd3saTs8PT3h
dydZ2f/eQ5W0zVVZEZTgP62zAk7hh4n+oWzpbz7wH1r3AawyKbKfEhxqT5+U
77KEPje861U7gXn/UuDnk1m5iAc+n+jn//t/5sHI56a6Sgr/6R3D1/T45LI1
+dAc+xN9YC5NEUyyn2f60BSX2U/BV52ZTIPoZFImmXDOJM8mU3ztL4V9aLKQ
h+J5zxP4sgonPnmp/3tyZdL2p5+SBewzeOKOnf4UvDap6bVgx6ooqwW8ek04
ejx+SihExNhYAtlTKivm4XPn5xfnezSJcI9zU6SmGp9nqUHCmr3T5zdZAzgJ
6Hwr++BBkurSBCgnyAbre3gDuH2DGNyM67qpH07zcooYXzxk3kHf03LdM5NF
qtRkMlFqPB7rZFrDRmaNOi6GV6E3X57+9WJrpIGt1LMqmyLbmwGY29rErEw1
JeBObmaNrpdmls2zGb5ExF2PdDn9D/gKf6n0ssrKCijF1BpgAaDQiR8/Vbiq
dxP9bXljYEEj3VwZmEweWOJhCk+pgeDhiwagP9NlMTMa6DOZ5lkNB6uQp+FK
yyJf6akBppPCogD9mitY0+WVNu+XeTbLmmBvGmi4qcpc19klkDEc0kRdXGW1
BsbcLkzRwNrLZVnDymFk874Bporrgb3DKiOA6NTgIPB50qhpVqS1DhiENtdJ
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
Jav+vuQb2Oj0Jur/AHTM2ojkngAA

-->

</rfc>

