<?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.29 (Ruby 2.6.10) -->


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

]>


<rfc ipr="trust200902" docName="draft-ietf-jmap-refplus-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="JMAP Enhanced Result References">JMAP Enhanced Result References</title>

    <author initials="M." surname="De Gennaro" fullname="Mauro De Gennaro">
      <organization abbrev="Stalwart Labs">Stalwart Labs LLC</organization>
      <address>
        <postal>
          <street>1309 Coffeen Avenue, Suite 1200</street>
          <city>Sheridan</city>
          <region>WY</region>
          <code>82801</code>
          <country>USA</country>
        </postal>
        <email>mauro@stalw.art</email>
        <uri>https://stalw.art</uri>
      </address>
    </author>

    <date year="2025" month="December" day="19"/>

    
    <workgroup>JMAP</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 40?>

<t>This document specifies an extension to the JSON Meta Application Protocol (JMAP) that enhances the result reference mechanism defined in <xref target="RFC8620"/>. The extension allows result references to be used in additional contexts beyond method call arguments, specifically within object properties during JMAP /set operations and within FilterCondition objects used in /query operations. Additionally, this specification extends result references to support JSON Path expressions (<xref target="RFC9535"/>) as an alternative to JSON Pointer (<xref target="RFC6901"/>), providing more expressive query capabilities for extracting values from previous method call results. These enhancements enable more efficient data reuse patterns across JMAP method calls, reducing the need for multiple round trips between client and server.</t>



    </abstract>



  </front>

  <middle>


<?line 44?>

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

<t>JMAP (<xref target="RFC8620"/> — JSON Meta Application Protocol) is a generic protocol for synchronizing data, such as mail, calendars or contacts, between a client and a server. It is optimized for mobile and web environments, and aims to provide a consistent interface to different data types.</t>

<t>One of JMAP's core design principles is its ability to build efficient request chains that minimize the number of round trips between client and server. This is achieved through the result reference mechanism defined in <xref section="3.7" sectionFormat="of" target="RFC8620"/>, which allows method call arguments to reference the results of previous method calls within the same request. When processing a request, the server executes method calls sequentially, and any argument prefixed with "#" (an octothorpe) is resolved by extracting the specified value from a previous method call's result before the current method is executed.</t>

<t>Since the publication of JMAP Core (<xref target="RFC8620"/>) and JMAP for Mail (<xref target="RFC8621"/>), the JMAP ecosystem has expanded significantly with the definition of multiple additional data types and extensions, including JMAP for Calendars (<xref target="I-D.ietf-jmap-calendars"/>), JMAP for Contacts (<xref target="RFC9610"/>), and others. This growth has revealed practical limitations in the current result reference mechanism. Many real-world use cases require creating JMAP objects that incorporate data from other JMAP objects. For example, when creating a CalendarEvent, it is often necessary to copy "Participant" or "Location" objects from an existing event. Similarly, when creating Email objects, reusing attachment information or recipient lists from other messages would be beneficial.</t>

<t>The current result reference mechanism, however, is limited to method call arguments. This restriction prevents result references from being used within the object structures passed to /set methods for creating or updating records, or within FilterCondition objects used in /query methods. These limitations force clients to either make additional round trips to fetch intermediate data or to duplicate data within the request, both of which reduce efficiency.</t>

<t>Furthermore, JMAP Core exclusively uses JSON Pointer (<xref target="RFC6901"/>) syntax for navigating result structures. While JSON Pointer is simple and efficient, it has limited expressive power for certain selection patterns. JSON Path (<xref target="RFC9535"/>), a more recent standard, provides a richer query language for extracting values from JSON structures, including support for filters, array slicing, and more sophisticated selection patterns.</t>

<t>Therefore, this document aims to extend the result references defined in <xref target="RFC8620"/> to be usable in multiple additional contexts, specifically within JMAP /set method calls for object property values and within FilterCondition objects used in /query methods. Additionally, this specification defines support for JSON Path (<xref target="RFC9535"/>) expressions as an optional alternative to JSON Pointer, enabling more powerful value extraction capabilities while maintaining backward compatibility with existing implementations.</t>

<section anchor="notational-conventions"><name>Notational Conventions</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="addition-to-the-capabilities-object"><name>Addition to the Capabilities Object</name>

<t>The capabilities object is returned as part of the JMAP Session object; see <xref section="2" sectionFormat="of" target="RFC8620"/>. This document defines one additional capability URI.</t>

<section anchor="urnietfparamsjmaprefplus"><name>urn:ietf:params:jmap:refplus</name>

<t>This capability indicates that the server supports enhanced result references as defined in this specification. When this capability is present, clients may use result references within /set method object properties and FilterCondition objects, in addition to the standard method call argument usage defined in <xref target="RFC8620"/>.</t>

<t>The value of this property in an account's "capabilities" property is an object that <bcp14>MUST</bcp14> contain the following information on server capabilities and permissions for that account:</t>

<dl newline="true">
  <dt><strong>jsonPath</strong>: <spanx style="verb">Boolean</spanx></dt>
  <dd>
    <t>Whether the server supports JSON Path expressions in result references. If true, result references may use JSON Path (<xref target="RFC9535"/>) syntax in addition to JSON Pointer (<xref target="RFC6901"/>) syntax. If false or absent, only JSON Pointer syntax is supported.</t>
  </dd>
</dl>

<t>The value of this property in the JMAP Session "accountCapabilities" property is an empty object.</t>

</section>
</section>
</section>
<section anchor="enhanced-result-references"><name>Enhanced Result References</name>

<t>Enhanced result references extend the existing result reference mechanism defined in <xref section="3.7" sectionFormat="of" target="RFC8620"/> to enable broader applicability and more expressive value extraction. Specifically, enhanced result references support two key extensions to the base mechanism:</t>

<t>First, enhanced result references may be used in additional contexts beyond method call arguments. They may be used anywhere within a "Foo" object when creating or updating such an object via the Foo/set method, allowing property values to be derived from previous method call results. They may also be used within FilterCondition objects in Foo/query method calls, enabling dynamic query construction based on prior results.</t>

<t>Second, enhanced result references optionally support JSON Path (<xref target="RFC9535"/>) expressions as an alternative to JSON Pointer (<xref target="RFC6901"/>) for extracting values from result structures. JSON Path provides more sophisticated query capabilities, including array filtering, recursive descent, and complex selection patterns, while JSON Pointer remains the baseline requirement for all implementations.</t>

<t>The syntax and resolution mechanism for enhanced result references follows the same fundamental pattern as standard result references, with extensions to accommodate the new contexts and optional JSON Path support. Backward compatibility is maintained: clients that do not use enhanced result references, and servers that do not advertise the <spanx style="verb">urn:ietf:params:jmap:refplus</spanx> capability, interoperate normally using the base result reference mechanism from <xref target="RFC8620"/>.</t>

<section anchor="json-path-support"><name>JSON Path Support</name>

<t>JSON Path (<xref target="RFC9535"/>) is a query language for JSON that provides powerful capabilities for selecting and extracting values from JSON structures. While JSON Pointer (<xref target="RFC6901"/>) provides a simple notation for referencing a specific value within a JSON document using a sequence of reference tokens, JSON Path offers a more expressive syntax that supports complex queries including filters, recursive descent, array slicing, and wildcard selections.</t>

<section anchor="comparison-with-json-pointer"><name>Comparison with JSON Pointer</name>

<t>The key differences between JSON Pointer and JSON Path include:</t>

<t><list style="symbols">
  <t>JSON Pointer uses a simple path syntax with "/" separators and identifies exactly one value. JSON Path uses a richer syntax with multiple selector types and can return zero, one, or multiple values.</t>
  <t>JSON Pointer is deterministic and always produces the same result for a given document. JSON Path queries may be order-dependent when multiple values match.</t>
  <t>JSON Pointer has no conditional or filtering capabilities. JSON Path supports filter expressions, enabling selection based on value predicates.</t>
  <t>JSON Pointer requires exact knowledge of the structure. JSON Path supports recursive descent (..) allowing queries to find values at any depth.</t>
</list></t>

</section>
<section anchor="support-and-capabilities"><name>Support and Capabilities</name>

<t>Enhanced result references extend the base result reference mechanism to optionally support JSON Path expressions. This support is indicated by the "jsonPath" property in the account capabilities being set to true. Servers <bcp14>MAY</bcp14> implement JSON Path support, as it can be more resource-intensive than JSON Pointer due to the potential for complex query evaluation.</t>

<t>When a server supports JSON Path, enhanced result references may use JSON Path syntax as an alternative to JSON Pointer syntax in the "path" property of a ResultReference object. To indicate that a path should be interpreted as a JSON Path expression rather than a JSON Pointer, the path <bcp14>MUST</bcp14> begin with "$" (dollar sign), which is the root node identifier in JSON Path syntax. Paths not beginning with "$" are interpreted as JSON Pointer expressions following the rules in <xref target="RFC8620"/>.</t>

</section>
<section anchor="validation-requirements"><name>Validation Requirements</name>

<t>If the JSON Path expression is syntactically invalid according to <xref target="RFC9535"/>, the server <bcp14>MUST</bcp14> reject the method call with an "invalidResultReference" error. The error description <bcp14>SHOULD</bcp14> indicate the syntax error where possible.</t>

<t>If a client attempts to use a JSON Path expression (path beginning with "$") but the server does not support JSON Path (jsonPath capability is false or absent), the server <bcp14>MUST</bcp14> reject the method call with an "invalidResultReference" error. The error description <bcp14>SHOULD</bcp14> indicate that JSON Path is not supported.</t>

<t>Servers supporting JSON Path <bcp14>MUST</bcp14> implement the complete JSON Path specification as defined in <xref target="RFC9535"/>, including all standard function extensions. This requirement ensures consistent behaviour across implementations and guarantees that clients can rely on the full expressiveness of the JSON Path query language when composing requests. However, servers <bcp14>MAY</bcp14> limit the complexity of JSON Path expressions for security or performance reasons, for example by restricting maximum expression length, maximum result set size, or computational complexity. If a server rejects a valid JSON Path expression due to such limitations, it <bcp14>SHOULD</bcp14> return an "invalidResultReference" error with a description indicating the specific limitation encountered.</t>

</section>
</section>
<section anchor="resolution-algorithm"><name>Resolution Algorithm</name>

<t>This section defines the algorithm for resolving enhanced result references, which extends the base resolution mechanism defined in <xref section="3.7" sectionFormat="of" target="RFC8620"/> to handle both JSON Path expressions and extended JSON Pointer expressions (including wildcard support).</t>

<t>When processing a ResultReference object, the server <bcp14>MUST</bcp14> follow these steps:</t>

<t><list style="numbers" type="1">
  <t>Resolve the "resultOf" and "name" properties to identify the target method response, as defined in <xref section="3.7" sectionFormat="of" target="RFC8620"/>.</t>
  <t>Identify the second element of the method response array (the arguments object) as the target JSON structure for path evaluation.</t>
  <t>Determine whether the "path" property uses JSON Path or JSON Pointer syntax:
  <list style="symbols">
      <t>If the path begins with "$" (dollar sign), treat it as a JSON Path expression.</t>
      <t>Otherwise, treat it as a JSON Pointer expression.</t>
    </list></t>
  <t>Evaluate the path expression against the target JSON structure according to the appropriate specification (<xref target="RFC9535"/> for JSON Path, <xref target="RFC6901"/> for JSON Pointer).</t>
  <t>Apply the type-specific resolution rules defined in this section to produce the final resolved value.</t>
</list></t>

<section anchor="resolving-json-path-references"><name>Resolving JSON Path References</name>

<t>When processing a ResultReference with a JSON Path expression, the server <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Apply the JSON Path expression (the "path" value) to the arguments object of the identified response.</t>
  <t>Evaluate the JSON Path expression according to <xref target="RFC9535"/> to produce a nodelist.</t>
  <t>Determine the expected type of the property being set and resolve the nodelist according to the following type-specific rules.</t>
</list></t>

<t>The nodelist produced by JSON Path evaluation <bcp14>MUST</bcp14> be resolved according to the expected type of the target property:</t>

<t>For properties that expect <strong>JSON primitive types</strong> (String, Boolean, Number as defined in <xref target="RFC8259"/>, or null) or a <strong>single JMAP object</strong> type:</t>

<t><list style="symbols">
  <t>If the nodelist contains exactly one node, use that node's value as the resolved value.</t>
  <t>If the nodelist contains zero nodes, use null as the resolved value.</t>
  <t>If the nodelist contains more than one node, the result reference resolution fails with an "invalidResultReference" error.</t>
</list></t>

<t>For properties that expect an <strong>array type</strong> (denoted as "A[]" in <xref section="1.1" sectionFormat="of" target="RFC8620"/>, where A[] is an array of values of type A):</t>

<t><list style="symbols">
  <t>Map the nodelist to an array containing the value of each node in the nodelist, in the order specified by <xref target="RFC9535"/>.</t>
  <t>If the nodelist contains zero nodes, use an empty array as the resolved value.</t>
  <t>If the nodelist contains one or more nodes, use an array containing all node values as the resolved value.</t>
</list></t>

<t>For properties that expect a <strong>map type</strong> (denoted as "A[B]" in <xref section="1.1" sectionFormat="of" target="RFC8620"/>, where the keys are of type A and the values are of type B):</t>

<t><list style="symbols">
  <t>If the nodelist contains exactly one node and that node's value is a JSON object conforming to the A[B] type, use that object as the resolved value.</t>
  <t>If the nodelist contains zero nodes, use an empty object {} as the resolved value.</t>
  <t>If the nodelist contains more than one node, or if the single node's value is not a JSON object, the result reference resolution fails with an "invalidResultReference" error.</t>
</list></t>

</section>
<section anchor="resolving-json-pointer-references"><name>Resolving JSON Pointer References</name>

<t>JSON Pointer expressions, as defined in <xref target="RFC6901"/>, provide a deterministic path to a single value within a JSON structure. However, <xref target="RFC8620"/> extends JSON Pointer syntax to support wildcards ("*") in certain contexts, allowing a single pointer to match multiple values. This extension is maintained in enhanced result references.</t>

<t>When processing a ResultReference with a JSON Pointer expression, the server <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Apply the JSON Pointer expression (the "path" value) to the arguments object of the identified response.</t>
  <t>Evaluate the JSON Pointer expression according to <xref target="RFC6901"/>, with wildcard extensions as defined in <xref target="RFC8620"/>.</t>
  <t>Determine the expected type of the property being set and resolve according to the following type-specific rules.</t>
</list></t>

<t>The result produced by JSON Pointer evaluation (which may be a single value or multiple values when wildcards are used) <bcp14>MUST</bcp14> be resolved according to the expected type of the target property:</t>

<t>For properties that expect <strong>JSON primitive types</strong> (String, Boolean, Number as defined in <xref target="RFC8259"/>, or null) or a <strong>single JMAP object</strong> type:</t>

<t><list style="symbols">
  <t>If the pointer identifies exactly one value, use that value as the resolved value.</t>
  <t>If the pointer contains wildcards and matches zero values, use null as the resolved value.</t>
  <t>If the pointer contains wildcards and matches more than one value, the result reference resolution fails with an "invalidResultReference" error.</t>
  <t>If the pointer does not contain wildcards and does not match any value, the result reference resolution fails with an "invalidResultReference" error (per <xref target="RFC6901"/>).</t>
</list></t>

<t>For properties that expect an <strong>array type</strong> (denoted as "A[]" in <xref section="1.1" sectionFormat="of" target="RFC8620"/>, where A[] is an array of values of type A):</t>

<t><list style="symbols">
  <t>If the pointer identifies a single value that is already an array, use that array as the resolved value.</t>
  <t>If the pointer contains wildcards and matches multiple values, collect all matched values into an array in the order they appear in the document structure.</t>
  <t>If the pointer contains wildcards and matches zero values, use an empty array as the resolved value.</t>
  <t>If the pointer identifies a single value that is not an array, create an array containing that single value as the resolved value.</t>
</list></t>

<t>For properties that expect a <strong>map type</strong> (denoted as "A[B]" in <xref section="1.1" sectionFormat="of" target="RFC8620"/>, where the keys are of type A and the values are of type B):</t>

<t><list style="symbols">
  <t>If the pointer identifies exactly one value and that value is a JSON object conforming to the A[B] type, use that object as the resolved value.</t>
  <t>If the pointer contains wildcards and matches zero values, use an empty object {} as the resolved value.</t>
  <t>If the pointer contains wildcards and matches more than one value, or if the single identified value is not a JSON object, the result reference resolution fails with an "invalidResultReference" error.</t>
</list></t>

</section>
<section anchor="type-validation"><name>Type Validation</name>

<t>After applying the type-specific resolution rules, the server <bcp14>MUST</bcp14> validate that the resolved value conforms to the expected type for the property. If type validation fails after resolution, the server <bcp14>MUST</bcp14> reject the operation with an "invalidProperties" error (for /set operations) or an "invalidArguments" error (for /query operations).</t>

</section>
</section>
<section anchor="usage-in-set-methods"><name>Usage in /set Methods</name>

<t>Enhanced result references may be used anywhere within object property values when creating or updating objects via the Foo/set method. This enables efficient reuse of data from previous method calls when constructing new objects or modifying existing ones.</t>

<t>To use an enhanced result reference within an object property, the property name is prefixed with "#" (an octothorpe), and the value is set to a ResultReference object as defined in <xref section="3.7" sectionFormat="of" target="RFC8620"/>. This follows the same pattern as using result references in method call arguments. For example, to set a property "participants" to a value from a previous result, the object would include a property "#participants" with a ResultReference value.</t>

<t>Enhanced result references may be used at any depth within the object structure, not just at the top level. For nested objects and arrays, result references can be applied to properties at any level of nesting. The server <bcp14>MUST</bcp14> recursively process all levels of object and array nesting to resolve all result references before validating the complete object structure.</t>

<t>When processing a Foo/set method call, the server <bcp14>MUST</bcp14> examine all objects in the "create" and "update" arguments for properties with names beginning with "#". For each such property found, the server <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Remove the "#" prefix to determine the actual property name.</t>
  <t>Resolve the ResultReference value following the resolution algorithm defined in <xref section="3.7" sectionFormat="of" target="RFC8620"/>, with the extensions defined in this specification.</t>
  <t>Set the actual property to the resolved value.</t>
  <t>Remove the property with the "#" prefix from the object.</t>
</list></t>

<t>If a result reference fails to resolve, the server <bcp14>MUST</bcp14> reject the creation or update of that specific object with a SetError of type "invalidResultReference". The SetError <bcp14>SHOULD</bcp14> include a description indicating which property reference failed and why.</t>

<t>If an object contains both a property name with "#" prefix and the same property name without the prefix (e.g., both "#participants" and "participants"), the server <bcp14>MUST</bcp14> reject the creation or update with a SetError of type "invalidProperties", as this represents an ambiguous specification.</t>

<t>The resolved value <bcp14>MUST</bcp14> be of a type appropriate for the property being set. If the resolved value does not match the expected type for the property, the server <bcp14>MUST</bcp14> reject the creation or update with a SetError of type "invalidProperties". Type validation occurs after result reference resolution but before other property validation.</t>

<section anchor="usage-in-patch-objects"><name>Usage in Patch Objects</name>

<t>Enhanced result references may also be used as values within patch objects, as defined in <xref section="5.3" sectionFormat="of" target="RFC8620"/>. A patch object is used to update specific properties of an existing object without having to send the entire object. When using result references in patch objects, special syntax rules apply:</t>

<t>The patch object key (the path to the property being patched) <bcp14>MUST</bcp14> be a JSON Pointer as specified in <xref target="RFC6901"/>, and <bcp14>MUST</bcp14> be prefixed with "#" to indicate that the value is a result reference. For example, to patch a property "locations/a1/coordinates" with a value from a previous result, the patch object would include a key "#locations/a1/coordinates" with a ResultReference value.</t>

<t>The value associated with the prefixed JSON Pointer key is a ResultReference object. This ResultReference may use either JSON Pointer or JSON Path (if supported by the server) in its "path" property to extract the value from the previous method result.</t>

<t>When processing patch objects, the server <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Identify keys in the patch object that begin with "#".</t>
  <t>Remove the "#" prefix to obtain the JSON Pointer path to be patched.</t>
  <t>Resolve the ResultReference value according to the resolution algorithm.</t>
  <t>Apply the resolved value to the location specified by the JSON Pointer path in the target object.</t>
</list></t>

<t>If a result reference in a patch object fails to resolve, the server <bcp14>MUST</bcp14> reject the update with a SetError of type "invalidResultReference".</t>

<t>It is important to note that while the patch object key (the path) <bcp14>MUST</bcp14> use JSON Pointer syntax, the ResultReference value's "path" property may use either JSON Pointer or JSON Path syntax (if the server supports JSON Path).</t>

</section>
</section>
<section anchor="usage-in-filtercondition-objects"><name>Usage in FilterCondition Objects</name>

<t>Enhanced result references may be used within FilterCondition objects in Foo/query method calls. This enables dynamic query construction where filter criteria are derived from the results of previous method calls in the same request.</t>

<t>To use an enhanced result reference within a FilterCondition, the filter property name is prefixed with "#" (an octothorpe), and the value is set to a ResultReference object. For example, to filter based on a dynamically determined mailbox id, the FilterCondition would include "#inMailbox" rather than "inMailbox".</t>

<t>When processing a Foo/query method call, the server <bcp14>MUST</bcp14> examine the "filter" argument and any nested FilterCondition objects for properties with names beginning with "#". For each such property found, the server <bcp14>MUST</bcp14>:</t>

<t><list style="numbers" type="1">
  <t>Remove the "#" prefix to determine the actual filter property name.</t>
  <t>Resolve the ResultReference value following the resolution algorithm defined in <xref section="3.7" sectionFormat="of" target="RFC8620"/>, with the extensions defined in this specification.</t>
  <t>Replace the property with "#" prefix with a property of the actual name, having the resolved value.</t>
</list></t>

<t>If a result reference in a FilterCondition fails to resolve, the server <bcp14>MUST</bcp14> reject the entire query method call with an error response of type "invalidResultReference". The error response <bcp14>SHOULD</bcp14> include a description indicating which filter property reference failed and why.</t>

<t>If a FilterCondition contains both a property name with "#" prefix and the same property name without the prefix (e.g., both "#inMailbox" and "inMailbox"), the server <bcp14>MUST</bcp14> reject the query with an "invalidArguments" error, as this represents an ambiguous filter specification.</t>

<t>The resolved value <bcp14>MUST</bcp14> be of a type appropriate for the filter property being set. If the resolved value does not match the expected type for that filter property, the server <bcp14>MUST</bcp14> reject the query with an "invalidArguments" error.</t>

<t>Enhanced result references in FilterConditions support the full range of filter compositions defined by JMAP specifications, including nested FilterCondition objects combined with FilterOperators. The server <bcp14>MUST</bcp14> recursively process all levels of FilterCondition nesting to resolve all result references before evaluating the query.</t>

</section>
</section>
<section anchor="implementation-considerations-for-intermediate-layers"><name>Implementation Considerations for Intermediate Layers</name>

<t>A design goal of enhanced result references is that reference resolution can be performed as a purely syntactical transformation, independent of the semantics of specific JMAP method calls. This property enables reference resolution to be implemented in a generic layer of the JMAP server or in an intermediary proxy without requiring knowledge of the internal structure or behaviour of individual methods.</t>

<section anchor="method-agnostic-resolution"><name>Method-Agnostic Resolution</name>

<t>Reference resolution operates exclusively on JSON structures and does not require understanding of the types, properties, or semantics defined by specific JMAP specifications. The resolution process treats method call arguments and responses as opaque JSON documents, applying JSON Pointer or JSON Path expressions to extract values without interpreting their meaning.</t>

<t>The type-specific resolution rules defined in this specification (determining whether a resolved value should be treated as a single value, an array, or a map) are applied by the JMAP method implementation layer, not by the reference resolution layer. This separation ensures that a proxy or generic preprocessing component need not possess knowledge of individual method signatures or property type definitions.</t>

</section>
<section anchor="recommended-architecture"><name>Recommended Architecture</name>

<t>Implementations <bcp14>MAY</bcp14> separate reference resolution into two distinct phases:</t>

<t><list style="symbols">
  <t><strong>Syntactic Resolution Phase</strong>: A generic reference resolution layer (which may be a proxy, a preprocessing component, or a dedicated part of the JMAP server) identifies all ResultReference objects within the request. For each reference, it evaluates the corresponding JSON Pointer or JSON Path expression against the appropriate previous method result, producing a nodelist as defined in <xref target="RFC9535"/> or a single value as defined in <xref target="RFC6901"/>. The resolution layer then replaces the ResultReference object with the extracted value or values using an internal representation suitable for communication with the method execution layer.</t>
  <t><strong>Method Execution Phase</strong>: The JMAP server component responsible for executing specific method calls receives the request with result references replaced by their resolved values. The method implementation applies the type-specific interpretation rules defined in this specification, validating that the resolved values conform to the expected types for each property.</t>
</list></t>

<t>The internal representation used between these phases is an implementation detail and is not specified by this document. Implementations might, for example, represent resolved nodelists as JSON arrays internally, with the method execution layer extracting single values or validating map structures as appropriate. Alternatively, implementations might use other internal data structures suited to their architecture.</t>

</section>
</section>
<section anchor="examples"><name>Examples</name>

<t>This section provides additional examples demonstrating the use of enhanced result references in various contexts.</t>

<section anchor="usage-in-set"><name>Usage in /set</name>

<t>Example using JSON Path (assuming server supports jsonPath capability):</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["CalendarEvent/query", {
    "accountId": "a1",
    "filter": {
      "uid": "meeting-template-001"
    }
  }, "c0"],
  ["CalendarEvent/get", {
    "accountId": "a1",
    "#ids": {
      "resultOf": "c0",
      "name": "CalendarEvent/query",
      "path": "/ids"
    },
    "properties": ["participants", "locations"]
  }, "c1"],
  ["CalendarEvent/set", {
    "accountId": "a1",
    "create": {
      "new-event": {
        "calendarIds": {"cal-1": true},
        "title": "Team Sync",
        "start": "2025-11-01T14:00:00Z",
        "duration": "PT1H",
        "#participants": {
          "resultOf": "c1",
          "name": "CalendarEvent/get",
          "path": "$.list[0].participants"
        },
        "#locations": {
          "resultOf": "c1",
          "name": "CalendarEvent/get",
          "path": "$.list[0].locations"
        }
      }
    }
  }, "c2"]
]
]]></sourcecode></figure>

<t>In this example, the new calendar event reuses the participants and locations from a template event retrieved in previous calls. The server would resolve the result references before creating the event, effectively copying those complex object values without requiring the client to extract and reformat them.</t>

</section>
<section anchor="usage-in-set-patch-objects"><name>Usage in /set patch objects</name>

<t>Example of using result references in a patch object (assuming server supports jsonPath capability):</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["CalendarEvent/get", {
    "accountId": "a1",
    "ids": ["event-template"],
    "properties": [ "locations", 
                    "organizerCalendarAddress",
                    "participants"]
  }, "c0"],
  ["CalendarEvent/set", {
    "accountId": "a1",
    "update": {
      "event-123": {
        "#locations/a1": {
          "resultOf": "c0",
          "name": "CalendarEvent/get",
          "path": "$.list[0].locations.loc1"
        },
        "#organizerCalendarAddress": {
          "resultOf": "c0",
          "name": "CalendarEvent/get",
          "path": "$.list[0].organizerCalendarAddress"
        },
        "#participants/p1": {
          "resultOf": "c0",
          "name": "CalendarEvent/get",
          "path": "$.list[0].participants[?@.roles.chair]"
        }
      }
    }
  }, "c1"]
]
]]></sourcecode></figure>

<t>In this example, the patch object updates specific properties of event-123 using values extracted from a template event. The patch updates a single location entry ("locations/a1"), copies the organizer's calendar address, and adds a participant ("participants/p1") by extracting a participant with the "chair" role from the template using a JSON Path filter expression. The patch keys "#locations/a1", "#organizerCalendarAddress", and "#participants/p1" use JSON Pointer syntax (prefixed with "#"), while the ResultReference path properties use a mix of JSON Path expressions (including the filter expression for selecting the chair participant) and simple paths.</t>

</section>
<section anchor="usage-in-query-filtercondition"><name>Usage in /query FilterCondition</name>

<t>Example using JSON Path for array extraction (assuming server supports jsonPath capability):</t>

<figure><sourcecode type="json"><![CDATA[
[
  ["Mailbox/query", {
    "accountId": "a1",
    "filter": {
      "role": "inbox"
    }
  }, "c0"],
  ["Email/query", {
    "accountId": "a1",
    "filter": {
      "#inMailboxOtherThan": {
        "resultOf": "c0",
        "name": "Mailbox/query",
        "path": "$.ids[0]"
      },
      "from": "boss@example.com"
    },
    "sort": [{"property": "receivedAt", "isAscending": false}],
    "limit": 50
  }, "c1"]
]
]]></sourcecode></figure>

<t>In this example, the Email/query uses a dynamically resolved mailbox id from the previous Mailbox/query call. The JSON Path expression <spanx style="verb">$.ids[0]</spanx> extracts the first mailbox id from the query result. The server resolves this reference before executing the email query, effectively filtering emails that are not in the user's inbox and are from a specific sender.</t>

</section>
<section anchor="extracting-multiple-values-with-json-path"><name>Extracting Multiple Values with JSON Path</name>

<t>Example demonstrating JSON Path for extracting multiple values:</t>

<figure><artwork><![CDATA[
[
  ["Email/get", {
    "accountId": "a1",
    "ids": ["template-email-id"],
    "properties": ["attachments"],
    "bodyProperties": ["blobId", "name", "type"]
  }, "c0"],
  ["Email/set", {
    "accountId": "a1",
    "create": {
      "new-email": {
        "mailboxIds": {
          "inbox-id": true
        },
        "subject": "Quarterly Reports",
        "from": [{"email": "sender@example.com"}],
        "to": [{"email": "recipient@example.com"}],
        "#attachments": {
          "resultOf": "c0",
          "name": "Email/get",
          "path": "$.list[0].attachments[?@.name && 
                @.name.toLowerCase().endsWith('.pdf')]"
        }
      }
    }
  }, "c1"]
]
]]></artwork></figure>

<t>In this example, the JSON Path expression <spanx style="verb">$.list[0].attachments[?@.name &amp;&amp; @.name.toLowerCase().endsWith('.pdf')]</spanx> extracts all EmailBodyPart objects from the attachments array that have a "name" property ending with ".pdf" (case-insensitive). The result would be an array of EmailBodyPart objects (each containing <spanx style="verb">blobId</spanx>, <spanx style="verb">name</spanx> and <spanx style="verb">type</spanx>) that is then used to populate the attachments property of the new email, effectively copying only the PDF attachments from the template email.</t>

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

<t>The security considerations described in <xref target="RFC8620"/> and <xref target="RFC9535"/> apply to this specification. This section discusses additional security implications introduced by allowing result references to be used in object properties and FilterCondition objects, and by supporting JSON Path expressions.</t>

<section anchor="denial-of-service-considerations"><name>Denial of Service Considerations</name>

<t>Enhanced result references, particularly when combined with JSON Path support, introduce additional denial of service (DoS) vectors that implementations must address.</t>

<section anchor="computational-complexity-of-json-path"><name>Computational Complexity of JSON Path</name>

<t>JSON Path expressions can be significantly more computationally expensive to evaluate than JSON Pointer references. Servers supporting JSON Path <bcp14>MUST</bcp14> implement appropriate safeguards against excessive resource consumption:</t>

<t><list style="symbols">
  <t>Servers <bcp14>SHOULD</bcp14> enforce limits on the complexity of JSON Path expressions, such as maximum expression length, maximum nesting depth of selectors, or maximum number of filter predicates.</t>
  <t>Servers <bcp14>SHOULD</bcp14> enforce timeouts on JSON Path evaluation to prevent indefinitely long computations.</t>
  <t>Servers <bcp14>SHOULD</bcp14> limit the size of nodelists that can be produced by a single JSON Path expression. An expression that matches a very large number of nodes could consume excessive memory.</t>
  <t>Servers <bcp14>SHOULD</bcp14> consider the cumulative cost of evaluating multiple result references in a single request. An attacker might attempt to overwhelm the server by including many complex JSON Path expressions in a single request.</t>
</list></t>

<t>Servers that implement these limitations <bcp14>MUST</bcp14> return an "invalidResultReference" error when a limit is exceeded, with a description that indicates the nature of the limitation where possible without revealing sensitive operational details.</t>

</section>
<section anchor="resource-exhaustion-through-reference-chains"><name>Resource Exhaustion Through Reference Chains</name>

<t>Enhanced result references enable longer and more complex chains of dependent method calls within a single request. While this is a design goal that improves efficiency, it also creates opportunities for resource exhaustion:</t>

<t><list style="symbols">
  <t>An attacker might construct requests with deeply nested result reference dependencies that require the server to maintain large amounts of intermediate state.</t>
  <t>The expanded use of result references in /set operations means that a single method call might need to resolve many result references across complex nested object structures.</t>
  <t>Result references in FilterCondition objects might require repeated evaluation of the same reference multiple times during query execution.</t>
</list></t>

<t>Servers <bcp14>SHOULD</bcp14> enforce reasonable limits on the complexity of result reference usage, such as:</t>

<t><list style="symbols">
  <t>Maximum number of result references per request</t>
  <t>Maximum number of result references per method call</t>
  <t>Maximum depth of property nesting when resolving result references in /set operations</t>
  <t>Maximum number of FilterCondition objects containing result references in a single query</t>
</list></t>

<t>These limits <bcp14>SHOULD</bcp14> be documented and consistent with other JMAP request limits defined in <xref target="RFC8620"/>.</t>

</section>
<section anchor="algorithmic-complexity-attacks"><name>Algorithmic Complexity Attacks</name>

<t>Certain combinations of JSON Path expressions and data structures can exhibit pathological performance characteristics. For example:</t>

<t><list style="symbols">
  <t>Recursive descent (..) combined with wildcard selectors on deeply nested structures can produce very large intermediate results.</t>
  <t>Filter expressions with complex predicates applied to large arrays can require substantial computation.</t>
  <t>JSON Path expressions that produce large nodelists, when used multiple times within a single request, can cause quadratic or worse time complexity.</t>
</list></t>

<t>Servers <bcp14>SHOULD</bcp14> implement query cost analysis and impose limits on expensive operations. When possible, servers <bcp14>SHOULD</bcp14> detect potentially problematic patterns before full evaluation and reject them proactively.</t>

</section>
</section>
<section anchor="data-integrity-and-validation-concerns"><name>Data Integrity and Validation Concerns</name>

<t>The use of result references in /set operations creates additional considerations for data validation and integrity.</t>

<section anchor="type-confusion"><name>Type Confusion</name>

<t>Result references resolve to values of arbitrary JSON types. When these values are used to populate object properties or filter conditions, type mismatches can occur. While this specification requires servers to validate types after resolution, implementations must be careful to avoid type confusion vulnerabilities:</t>

<t><list style="symbols">
  <t>Type validation <bcp14>MUST</bcp14> occur after result reference resolution but before the value is used in any security-sensitive operation.</t>
  <t>Servers <bcp14>MUST NOT</bcp14> make assumptions about the type of a resolved value based on the context. The value type must be explicitly checked.</t>
  <t>String-to-number or string-to-boolean coercions <bcp14>MUST NOT</bcp14> be performed automatically, as these can lead to unexpected behavior and potential security issues.</t>
</list></t>

</section>
<section anchor="injection-attacks"><name>Injection Attacks</name>

<t>When result references are used to populate FilterCondition properties, there is a potential for filter injection attacks. Consider a scenario where a result reference is used to set a filter property that expects a simple string value, but the resolution produces a complex object or an array:</t>

<t><list style="symbols">
  <t>Servers <bcp14>MUST</bcp14> validate that resolved values match the expected type and structure for the property or filter being populated.</t>
  <t>Servers <bcp14>MUST NOT</bcp14> attempt to serialize complex objects to strings or perform other automatic conversions that might enable injection attacks.</t>
  <t>When a resolved value is used in a filter that performs string matching or other operations, the server <bcp14>MUST</bcp14> ensure that the value is properly sanitized and does not alter the semantic meaning of the filter.</t>
</list></t>

</section>
<section anchor="circular-reference-prevention"><name>Circular Reference Prevention</name>

<t>While JMAP's sequential processing model prevents direct circular references (a method cannot reference a method that comes after it), enhanced result references in nested object structures could potentially create complex data copying patterns that consume excessive memory or lead to unexpected behavior. Servers <bcp14>SHOULD</bcp14> implement safeguards against pathological data copying patterns.</t>

</section>
</section>
<section anchor="privacy-considerations"><name>Privacy Considerations</name>

<t>Enhanced result references can affect user privacy in several ways:</t>

<section anchor="data-leakage-across-contexts"><name>Data Leakage Across Contexts</name>

<t>The ability to copy data from one JMAP object to another using result references creates potential for unintended data leakage. For example:</t>

<t><list style="symbols">
  <t>Private or sensitive data from one context might be inadvertently copied into a more widely shared context.</t>
  <t>Metadata or structural information might be leaked through the types and structures of resolved values.</t>
</list></t>

<t>Implementations <bcp14>SHOULD</bcp14> provide mechanisms for administrators and users to understand and control how data flows between different contexts through result references.</t>

</section>
<section anchor="audit-and-logging"><name>Audit and Logging</name>

<t>The use of result references can obscure the true source of data in audit logs. When an object is created or modified using result references, audit logs <bcp14>SHOULD</bcp14> record not just the final object state but also information about which data was derived from result references. This enables proper forensic analysis and compliance with data protection regulations.</t>

</section>
</section>
<section anchor="implementation-considerations"><name>Implementation Considerations</name>

<t>Implementers should be aware of several security-relevant implementation challenges:</t>

<section anchor="parser-security"><name>Parser Security</name>

<t>JSON Path parsers are complex and may contain vulnerabilities. Servers implementing JSON Path support <bcp14>SHOULD</bcp14>:</t>

<t><list style="symbols">
  <t>Use well-tested, maintained JSON Path libraries rather than custom implementations.</t>
  <t>Keep JSON Path libraries up to date with security patches.</t>
  <t>Consider sandboxing or isolating JSON Path evaluation from critical server components.</t>
</list></t>

</section>
<section anchor="cache-security"><name>Cache Security</name>

<t>To improve performance, servers might cache the results of result reference resolution. Such caches <bcp14>MUST</bcp14> respect all security boundaries:</t>

<t><list style="symbols">
  <t>Cached results <bcp14>MUST NOT</bcp14> be shared across different users or security contexts.</t>
  <t>Cache entries <bcp14>MUST</bcp14> be invalidated when relevant access control policies change.</t>
  <t>Cache implementations <bcp14>MUST</bcp14> be resistant to timing attacks that might reveal the presence or contents of cached data.</t>
</list></t>

</section>
<section anchor="backward-compatibility"><name>Backward Compatibility</name>

<t>Servers that support enhanced result references <bcp14>MUST</bcp14> continue to correctly handle requests from clients that do not use this extension. In particular:</t>

<t><list style="symbols">
  <t>Servers <bcp14>MUST</bcp14> correctly reject enhanced result references from clients that have not included the <spanx style="verb">urn:ietf:params:jmap:refplus</spanx> capability in the "using" property of the request.</t>
  <t>The presence of properties with "#" prefixes in contexts where standard JMAP does not allow result references <bcp14>MUST</bcp14> be handled appropriately (typically as invalid property names).</t>
</list></t>

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

<section anchor="jmap-capability-registration-for-refplus"><name>JMAP Capability Registration for "refplus"</name>

<t>IANA will register the "refplus" JMAP Capability as follows:</t>

<t><strong>Capability Name:</strong> urn:ietf:params:jmap:refplus<br />
<strong>Specification document:</strong> this document<br />
<strong>Intended use:</strong> common<br />
<strong>Change Controller:</strong> IETF<br />
<strong>Security and privacy considerations:</strong> this document, <xref target="security-considerations"></xref></t>

</section>
</section>


  </middle>

  <back>


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

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



<reference anchor="RFC8620">
  <front>
    <title>The JSON Meta Application Protocol (JMAP)</title>
    <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="July" year="2019"/>
    <abstract>
      <t>This document specifies a protocol for clients to efficiently query, fetch, and modify JSON-based data objects, with support for push notification of changes and fast resynchronisation and for out-of- band binary data upload/download.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8620"/>
  <seriesInfo name="DOI" value="10.17487/RFC8620"/>
</reference>

<reference anchor="RFC8621">
  <front>
    <title>The JSON Meta Application Protocol (JMAP) for Mail</title>
    <author fullname="N. Jenkins" initials="N." surname="Jenkins"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="August" year="2019"/>
    <abstract>
      <t>This document specifies a data model for synchronising email data with a server using the JSON Meta Application Protocol (JMAP). Clients can use this to efficiently search, access, organise, and send messages, and to get push notifications for fast resynchronisation when new messages are delivered or a change is made in another client.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8621"/>
  <seriesInfo name="DOI" value="10.17487/RFC8621"/>
</reference>

<reference anchor="RFC9535">
  <front>
    <title>JSONPath: Query Expressions for JSON</title>
    <author fullname="S. Gössner" initials="S." role="editor" surname="Gössner"/>
    <author fullname="G. Normington" initials="G." role="editor" surname="Normington"/>
    <author fullname="C. Bormann" initials="C." role="editor" surname="Bormann"/>
    <date month="February" year="2024"/>
    <abstract>
      <t>JSONPath defines a string syntax for selecting and extracting JSON (RFC 8259) values from within a given JSON value.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9535"/>
  <seriesInfo name="DOI" value="10.17487/RFC9535"/>
</reference>

<reference anchor="RFC6901">
  <front>
    <title>JavaScript Object Notation (JSON) Pointer</title>
    <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan"/>
    <author fullname="K. Zyp" initials="K." surname="Zyp"/>
    <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
    <date month="April" year="2013"/>
    <abstract>
      <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6901"/>
  <seriesInfo name="DOI" value="10.17487/RFC6901"/>
</reference>

<reference anchor="RFC8259">
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
    <date month="December" year="2017"/>
    <abstract>
      <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
      <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="90"/>
  <seriesInfo name="RFC" value="8259"/>
  <seriesInfo name="DOI" value="10.17487/RFC8259"/>
</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="RFC9610">
  <front>
    <title>JSON Meta Application Protocol (JMAP) for Contacts</title>
    <author fullname="N. Jenkins" initials="N." role="editor" surname="Jenkins"/>
    <date month="December" year="2024"/>
    <abstract>
      <t>This document specifies a data model for synchronising contact data with a server using the JSON Meta Application Protocol (JMAP).</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9610"/>
  <seriesInfo name="DOI" value="10.17487/RFC9610"/>
</reference>


<reference anchor="I-D.ietf-jmap-calendars">
   <front>
      <title>JSON Meta Application Protocol (JMAP) for Calendars</title>
      <author fullname="Neil Jenkins" initials="N." surname="Jenkins">
         <organization>Fastmail</organization>
      </author>
      <author fullname="Michael Douglass" initials="M." surname="Douglass">
         <organization>Spherical Cow Group</organization>
      </author>
      <date day="4" month="November" year="2025"/>
      <abstract>
	 <t>   This document specifies a data model for synchronizing calendar data
   with a server using JMAP.  Clients can use this to efficiently read,
   write, and share calendars and events, receive push notifications for
   changes or event reminders, and keep track of changes made by others
   in a multi-user environment.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-jmap-calendars-26"/>
   
</reference>




    </references>

</references>


<?line 599?>

<section anchor="changes"><name>Changes</name>

<t>[[This section to be removed by RFC Editor]]</t>

<t><strong>draft-ietf-jmap-refplus-01</strong></t>

<t><list style="symbols">
  <t>Changed <bcp14>SHOULD</bcp14> to <bcp14>MUST</bcp14> implement the complete JSON Path specification.</t>
  <t>Added Implementation Considerations for Intermediate Layers section.</t>
</list></t>

<t><strong>draft-ietf-jmap-refplus-00</strong></t>

<t><list style="symbols">
  <t>Initial version</t>
</list></t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAHGQRWkAA+V963IbR5bmfzxFLTQxJhkARMp2j42dmG6akrY5K1kaUR5H
r6xYJaoSRFlAFaayihTsUMc+xD7APss+yj7Jnlve6gKClto7EzvRMaZQVXk5
eS7fOXny5HQ6HdV5vdbz5J+fn79MnhQrVaQ6S15p06xr+M9SVxp+MSO1WFT6
5u73sjIt1AYazCq1rKe5rpfTnzdqO630crtuzPT0bGSaxSY3Ji+L17stvHr5
5PXTUapqfV1Wu3li6mzUbDP4t5kno3JhyrXGv0f5tponddWY+tHp6benj0bv
9e62rDJooah1Veh6+hh7HZlaFdl/V+uygNZ3MCp46/11VTZbnsBom8+TN3WZ
ThJTVjUMzcBfuw3+8XY0Uk29Kqv5KJmOEvi/vIBxPJ8lj3XyX3RRqKqkn3ma
z1VTle1HZXU9T65qtb5VVZ08UwuTPHt2QY8sHaOn9MTAOHQ9T86+PP02uSiX
S62L5PxGF42eJFdNXuvkDOZN76Z5DYS6Wukqz1RBP1X6Ggg6T378C79RZjC6
bx59A/TmfzdFjdT94eqcftAbla/nyQbH/yeDo5nBcOhRUwF5VnW9NfOHD/2j
UVFWG1XnNxpIk7x6evHNHx6dzu0f7qcz+9MZ//Tt119+Pbd/8E9/+PaU38I/
5MNHX387t3+MRnmxbHX27R/OuDP8A366nD6eee5K1VoXmapgpQYejEbT6RTI
D2RWKUzm9So3CXBrs9FFnZitTvNlrk2iikR/qHWB7JnUZVKvdPLPVy++T57r
WiXn2+06B1bFhy+rElioXCdHyFPH8KaqE82iYei7isWjsuKRbHQKj3OzSTK9
zAuQoLxIfv1VSPjx4yx5DZ/5/tV6Xd6aTjsGB7bQSWO4BZVlOQ5JrWGdQRQ+
1AYe78oigx6Bl7MEyLBOVHVNs0Vm5/niz7vkNq9X0Eq5+FmndbKtyq2uaqRF
BpxQXLPMPzS6TvAJTR7plNkPn+ZrEL8L6I5GIQ0ZN7yH/9boahd8PEvO3YjX
uwnQCtbCDYnaIBpkA1M3zXYLcsvr8lLVK3h9C28aGtkRERS57ePH40TRkioc
YUH8hA3wh2WOakPeR1aE9yc4/5s8w3lvykq7luFDnkaqtmqRr3OiEHApDhVZ
Cr+4UesGf63KDbSjb/KyMdES8HQMrbPRlltoUeAfarHW0usSKJEjZ4IeVPAZ
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
kifuoWO91y3j5UVPFGlu+5WWESJafRbFDLCiLxgQEzIID6+LC4RwVu/kVUup
if7v10Sss0xP7o1Tx+pQHTuJ95N783GMTcjpzceRmy9U4CiL7h9aTYoH2Yo6
NR1RZV0hCY+t6YIRwNriVBhHDszHIcSgeOcsaWuuTX69qqOT2RM/Hj9RKzPG
VX/gVAE3CSp5vp/XwqJNoWwZYXVLZkzPC7GFCSV8lpz7Sh7YafsQPU2I4lC8
yeSoTCk4QbsoNLyLwxymAg1P+PcJ08O0Tlz7ilG+wp+QDplpQzE3j6clAWgf
CMZCORVpLXtWoSfnCfwbOTnP6iCI4ytjmg37ZnG0sqfaA+Yg/vWvf6VHozej
JHkzjqrjc8RpPEl+pQuObG3Jy2w8h3+cjSf8s8SZ5vIa/NLk9MpGE9iZYkmL
NazX9PT0bEzvfIT//3GSjNPT8dtJT8fXur6z2wd5ZsJOK3tEe07tTuzvdFYb
fuudmn2JQsTw0kNslIco3Xh0Cs/fxLvPk2CrafzWzumsf07mgDlJykgwq0Lf
Tqm4fvAjvihNXzIN8N/TszHd86U/Tvx7dE8Z9vFaq00CyCIdB08BkFfY8PjR
6aOvp2dn09Oz12dfzU9P4X//LXwxaxib4bsvX5/9OXwW79GHo2wvylnw2eDC
0NKHr9ml+bsZKp03p29nUYfu1XDafm/udxmQ782PZhT+1/H7I2CTtyh0gBvF
xviw80rqDkr3fJEE5w0a2R/xEycl7zq2e5lW1Ny3dcX31uSFx0POvXXhBY5S
V0FAdTBE4FIiybrxJRp6uUSFSB4h3pvBj0vjyoW46qOxS+Q9W4J+XAIn8KDY
R2NvHl/Z9OV/RvuHXjOCnt2zY97aBvu8avMQ7cXK682YKOg0JGuOjtYJ1cwk
CXgx4MqyugZn8hdd2bGcZxki5Ih3Iy4OhMjprgF9fIjukgy3QHfx3M4efRnr
rmjjfK98nn5u+cS/zgZUxiABf48RDnbeP9Zw8R5ufx8ihn2++eOfZlWJR+Xw
qq3q7Z167+wOvRdJo1xjOZRK49hKBFyUiveZenUh6zvux3bg/Dq3467xusfk
KMogwZA9aDXrRril+sJ4Va14ueRmrCyj6KQnGLTYXrLj1i1Y8fs+J5EIPE6Q
2n5T1k3N1hf1CLBTlzGcOKVPtARwso/35XaIDsMN7cQnR53t2eNJsMPfdny3
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
AA==

-->

</rfc>

