<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.19 (Ruby 3.3.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-cbor-cddl-modules-03" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.0 -->
  <front>
    <title abbrev="CDDL Module Structure">CDDL Module Structure</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cddl-modules-03"/>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann">
      <organization>Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <author initials="B." surname="Moran" fullname="Brendan Moran">
      <organization>Arm Limited</organization>
      <address>
        <email>brendan.moran.ietf@gmail.com</email>
      </address>
    </author>
    <date year="2024" month="September" day="02"/>
    <area>Applications and Real-Time</area>
    <workgroup>CBOR Maintenance and Extensions</workgroup>
    <keyword>Concise Data Definition Language</keyword>
    <abstract>
      <?line 59?>

<t>At the time of writing,
the Concise Data Definition Language (CDDL) is defined by
RFC 8610 and RFC 9165.
The latter has used the extension point provided in RFC 8610,
the <em>control operator</em>.</t>
      <t>As CDDL is being used in larger projects, the need for
features has become known that cannot be easily
mapped into this single extension point.</t>
      <t>The present document defines a backward- and forward-compatible
way to add a module structure to CDDL.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://cbor-wg.github.io/cddl-modules/draft-ietf-cbor-cddl-modules.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-cbor-cddl-modules/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        CBOR Maintenance and Extensions Working Group mailing list (<eref target="mailto:cbor@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/cbor/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/cbor/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/cbor-wg/cddl-modules"/>.</t>
    </note>
  </front>
  <middle>
    <?line 77?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>At the time of writing,
the Concise Data Definition Language (CDDL) is defined by
RFC 8610 and RFC 9165.
The latter has used the extension point provided in RFC 8610,
the <em>control operator</em>.</t>
      <t>As CDDL is being used in larger projects, the need for
features has become known that cannot be easily
mapped into this single extension point.</t>
      <t>The present document defines a backward- and forward-compatible
way to add a module structure to CDDL.</t>
      <t>The functionality of the present document is considered a core part of
what has colloquially been called CDDL 2.0, and is intended to be used
with (and orthogonal to) other recent specifications such as a small
set of CDDL grammar updates <xref target="I-D.ietf-cbor-update-8610-grammar"/> and an additional exercise of
the control operator extension point <xref target="I-D.ietf-cbor-cddl-more-control"/> (a follow-up to
<xref target="RFC9165"/>).</t>
      <section anchor="conventions-and-definitions">
        <name>Conventions and Definitions</name>
        <t>The Terminology from <xref target="RFC8610"/> applies.</t>
        <t>Some examples use CDDL definitions from <xref target="RFC9052"/>.</t>
        <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>
    <section anchor="module-superstructure">
      <name>Module superstructure</name>
      <dl>
        <dt><em>Compatibility</em>:</dt>
        <dd>
          <t>bidirectional (both backward and forward)</t>
        </dd>
      </dl>
      <t>Originally, CDDL was used for small data models that could be
expressed in a few lines.  As the size of data models that need to be
expressed in CDDL has increased, the need to modularize and re-use
components is increasing.</t>
      <t>CDDL as documented in <xref target="RFC8610"/> (<em>basic CDDL</em>) has been designed with a crude form of composition:
Concatenating a number of CDDL snippets creates a valid CDDL data
model unless there is a name collision (<em>identical</em> redefinition is
allowed to facilitate this approach).
With larger models, managing the overall name space to avoid collisions
becomes more pressing.</t>
      <t>In CDDL's original composition model,
the knowledge which CDDL snippets need to be concatenated in order to
obtain the desired data model lives entirely outside the CDDL snippets.
With the module structure defined in the present document, rule sets are
packaged as modules and referenced from other
modules, providing methods for control of namespace pollution.</t>
      <t>Further work may be expended on
unambiguous referencing into evolving specifications ("versioning")
and selection of alternatives (as was emulated with snippets in
<xref section="11" sectionFormat="of" target="RFC8428"/>.  Note that one approach for expressing
variants is demonstrated in <xref target="useful"/> based on <xref section="4" sectionFormat="of" target="RFC9165"/>).
Potential further work is outlined in Sections <xref target="I-D.bormann-cbor-cddl-2-draft" section="4" sectionFormat="bare"/> and <xref target="I-D.bormann-cbor-cddl-2-draft" section="A.2" sectionFormat="bare"/> of <xref target="I-D.bormann-cbor-cddl-2-draft"/>.</t>
      <section anchor="compatibility">
        <name>Compatibility</name>
        <t>To achieve the module structure in a way that is friendly to
existing environments that operate with CDDL and basic CDDL
implementations, we add a super-syntax (similar to the way pragmas
are often added to a language), by carrying them in <em>directives</em>.
Directives are parsed as comments in basic CDDL, so that each module
source file can at the same time be basic CDDL on its own.
This enables forward compatibility: a single file can be designed to
serve both as valid basic CDDL and as a module with directives that
specify how additional rule definitions are to be imported from other
source files.</t>
        <t>This bidirectional compatibility is useful to allow CDDL model
designers to start using directives before the bulk of the tools that
process CDDL has been updated to implement the present specification.</t>
      </section>
      <section anchor="namespacing">
        <name>Namespacing</name>
        <t>When importing rules from other modules, there is the potential for
name collisions.  This is exacerbated when the modules evolve, which
may lead to the introduction of a name into an imported module that is
also used (likely in a different way) in the importing module.</t>
        <t>To be able to manage names in such a way that collisions can be
avoided, we introduce means to prepend a prefix to the names of rules
being imported: the "as" clause.</t>
      </section>
      <section anchor="directives-the-module">
        <name>"Directives", the "module"</name>
        <t>This specification introduces <em>directives</em> into CDDL.
A single CDDL file becomes a <em>module</em> by processing the (zero or more)
directives in it.</t>
        <t>The semantics of the module are independent of the module(s) using it,
however, importing a module may involve transforming its rule names
into a new namespace (<xref target="namespacing"/>).</t>
        <t>Directives are parsed as comments in basic CDDL, so they do not interfere
with forward compatibility.</t>
        <t>In the CDDL module structure, lines that start with the prefix <tt>;#</tt> are
parsed as directives.</t>
      </section>
      <section anchor="naming-and-finding-modules">
        <name>Naming and Finding Modules</name>
        <t>We assume that module names are filenames taken from one of several
source directories available to the CDDL module structure processor via the
environment.
This avoids the need to nail down brittle pathnames or (partial?) URIs
into the CDDL files.</t>
        <t>The exact way how these source directories and possibly a precedence
between them are established is intentionally not fully defined in
this specification; it is expected that this will be specified in the
context of the models just as the way they are intended to be used
will be.  (A more formal structure may follow later.)</t>
        <t>In the module structure implementation that is part of the CDDL Tool
described in <xref target="cddlc-tool"/>, the set of sources is
determined from an environment variable, <tt>CDDL_INCLUDE_PATH</tt>, which is
modeled after usual command-line search paths.
It is a colon-separated list of pathnames to directories, with one
special feature: an empty element points to the tool's own collection.
This collection contains fragments of extracted CDDL from published
RFCs, using names such as <tt>rfc9052</tt>.</t>
        <t>(Future versions might augment this with Web extractors and/or ways to
extract CDDL modules from sites such as github and from Internet-Drafts; see
<xref section="A.2" sectionFormat="of" target="I-D.bormann-cbor-cddl-2-draft"/> for some design considerations.)</t>
        <t>The default <tt>CDDL_INCLUDE_PATH</tt> is:</t>
        <artwork><![CDATA[
.:
]]></artwork>
        <t>That is: files are found in the current directory (<tt>.</tt>) and, if not
found there, cddlc’s collection.</t>
        <t>In the examples that follow, a cddlc command line will be shown
(starting with an isolated <tt>$</tt> sign as in a shell command) with the
module-structured CDDL input; the
resulting basic CDDL will be shown separately.</t>
      </section>
      <section anchor="directives">
        <name>Basic Set of Directives</name>
        <t>Two groups of directives are defined at this point:</t>
        <ul spacing="normal">
          <li>
            <t><tt>include</tt>, which includes all the rules from a module (which
includes the ones imported/included there, transitively), or
specific explicitly selected rules (clause ending in "from");</t>
          </li>
          <li>
            <t><tt>import</tt>, which is similar to <tt>include</tt> but includes only those
 rules from the module that are
 referenced from the importing module, implicitly or explicitly
 (clause ending in "from"), including the
 rules that are referenced from these rules, transitively.</t>
          </li>
        </ul>
        <t>The <tt>include</tt> function is more useful for composing a single model
from parts controlled by one author, while the <tt>import</tt> function is
more about treating a module as a library:</t>
        <t>The way an <tt>import</tt> works is shown by this simple example:</t>
        <artwork><![CDATA[
$ cddlc -2tcddl -
start = COSE_Key
;# import rfc9052

]]></artwork>
        <t>This results in the following CDDL 1.0 specification:</t>
        <sourcecode type="cddl"><![CDATA[
start = COSE_Key
COSE_Key = {
  1 => tstr / int,
  ? 2 => bstr,
  ? 3 => tstr / int,
  ? 4 => [+ tstr / int],
  ? 5 => bstr,
  * label => values,
}
label = int / tstr
values = any

]]></sourcecode>
        <t>This is appropriate for using libraries that are well known to the
importing specification.
However, if it is not acceptable that the library can pollute the
namespace of the importing module, the import directive can specify a
namespace prefix ("as" clause):</t>
        <artwork><![CDATA[
$ cddlc -2tcddl -
start = cose.COSE_Key
;# import rfc9052 as cose

]]></artwork>
        <t>This results in the following CDDL 1.0 specification:</t>
        <sourcecode type="cddl"><![CDATA[
start = cose.COSE_Key
cose.COSE_Key = {
  1 => tstr / int,
  ? 2 => bstr,
  ? 3 => tstr / int,
  ? 4 => [+ tstr / int],
  ? 5 => bstr,
  * cose.label => cose.values,
}
cose.label = int / tstr
cose.values = any

]]></sourcecode>
        <t>Note how the imported names are prefixed with <tt>cose.</tt> as specified in
the import directive, but CDDL prelude (<xref section="D" sectionFormat="of" target="RFC8610"/>) names
such as <tt>tstr</tt> and <tt>any</tt> are not.</t>
      </section>
      <section anchor="explicit-selection-of-names">
        <name>Explicit selection of names</name>
        <t>Both <tt>import</tt> and <tt>include</tt> directives can be augmented by an explicit
mentioning of rule names (clause ending in "from") or a wild-card
"<tt>*</tt>" for all rules.</t>
        <section numbered="false" anchor="include">
          <name><tt>include</tt></name>
          <t>Starting with <tt>include</tt>:</t>
          <artwork><![CDATA[
$ cddlc -2tcddl -
mydata = {* label => values}
;# include label, values from rfc9052

]]></artwork>
          <t>With <tt>include</tt>,
only exactly the rules mentioned are included:</t>
          <sourcecode type="cddl"><![CDATA[
mydata = {* label => values}
label = int / tstr
values = any

]]></sourcecode>
          <t>The module from which rules are explicitly imported can be namespaced:</t>
          <artwork><![CDATA[
$ cddlc -2tcddl -
mydata = {* label => values}
;# include cose.label, cose.values from rfc9052 as cose

]]></artwork>
          <t>Again, only exactly the rules mentioned are included:</t>
          <sourcecode type="cddl"><![CDATA[
mydata = {* label => values}
cose.label = int / tstr
cose.values = any

]]></sourcecode>
        </section>
        <section numbered="false" anchor="import">
          <name><tt>import</tt></name>
          <t>Both examples would work exactly the same with <tt>import</tt>, as the
included rules do not reference anything else from the included
module.</t>
          <t>An import however also draws in the transitive closure of the rules
referenced:</t>
          <artwork><![CDATA[
$ cddlc -2tcddl -
mydata = {Fritz: cose.empty_or_serialized_map}
;# import cose.empty_or_serialized_map from rfc9052 as cose

]]></artwork>
          <t>The transitive closure of the rules mentioned is included:</t>
          <sourcecode type="cddl"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

mydata = {Fritz: cose.empty_or_serialized_map}
cose.empty_or_serialized_map = bstr .cbor cose.header_map / bstr .\
                                                               size 0
cose.header_map = {
  cose.Generic_Headers,
  * cose.label => cose.values,
}
cose.Generic_Headers = (
  ? 1 => int / tstr,
  ? 2 => [+ cose.label],
  ? 3 => tstr / int,
  ? 4 => bstr,
  ? (5 => bstr // 6 => bstr),
  )
cose.label = int / tstr
cose.values = any
]]></sourcecode>
          <t>The <tt>import</tt> statement can also request an alias for an imported name:</t>
          <artwork><![CDATA[
$ cddlc -2tcddl -
mydata = {Fritz: cose.empty_or_serialized_map}
;# import empty_or_serialized_map from rfc9052 as cose

]]></artwork>
          <t>Note how an additional rule provides an alias for
<tt>empty_or_serialized_map</tt> that does not have the namespace prefix:</t>
          <sourcecode type="cddl"><![CDATA[=============== NOTE: '\' line wrapping per RFC 8792 ================

mydata = {Fritz: cose.empty_or_serialized_map}
empty_or_serialized_map = cose.empty_or_serialized_map
cose.empty_or_serialized_map = bstr .cbor cose.header_map / bstr .\
                                                               size 0
cose.header_map = {
  cose.Generic_Headers,
  * cose.label => cose.values,
}
cose.Generic_Headers = (
  ? 1 => int / tstr,
  ? 2 => [+ cose.label],
  ? 3 => tstr / int,
  ? 4 => bstr,
  ? (5 => bstr // 6 => bstr),
  )
cose.label = int / tstr
cose.values = any
]]></sourcecode>
        </section>
      </section>
      <section anchor="tool-support-for-command-line-control">
        <name>Tool Support for Command-Line Control</name>
        <t>Tools may provide a convenient way to initiate the processing of
directives from the command line.</t>
        <t>A tool may provide a way to specify a root for the module tree from the command line:</t>
        <artwork><![CDATA[
$ cddlc -2tcddl -icose=rfc9052 -scose.COSE_Key
]]></artwork>
        <t>The command line argument <tt>-icose=rfc9052</tt> is a shortcut for</t>
        <artwork><![CDATA[
;# import rfc9052 as cose
]]></artwork>
        <t>Together with the start (root) rule name, <tt>cose.COSE_Key</tt>, supplied by
<tt>-scose.COSE_Key</tt>, this results in the following CDDL 1.0
specification:</t>
        <sourcecode type="cddl"><![CDATA[
$.start.$ = cose.COSE_Key
cose.COSE_Key = {
  1 => tstr / int,
  ? 2 => bstr,
  ? 3 => tstr / int,
  ? 4 => [+ tstr / int],
  ? 5 => bstr,
  * cose.label => cose.values,
}
cose.label = int / tstr
cose.values = any

]]></sourcecode>
        <t>In other words, the module synthesized from the command line had an
empty CDDL file, which therefore was not provided (no <tt>–</tt> was given on
the command line).</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The module structure specified in this document is not believed to
create additional security considerations beyond the general security
considerations in <xref section="5" sectionFormat="of" target="RFC8610"/>.</t>
      <t>Implementations that employ the module structure defined in this
document need to ascertain the provenance of the modules they combine
into the CDDL models they employ operationally.
This specification does not define how the source directories accessed
via the CDDL_INCLUDE_PATH are populated; this process needs to undergo
the same care and scrutiny as any other introduction of source code
into a build environment; the possibility of supply-chain attacks on
the modules imported needs to be considered.</t>
      <t>Specifically, implementations that rely on model-based input
validation for enforcing certain properties of the data structure
ingested (which, if not validated, could lead to malfunctions such as
crashes and remote code execution) need to be particularly careful
about the data models they apply, including their provenance and
potential changes of these properties that upgrades to the referenced
modules may (inadvertently or as part of an attack) cause.
More generally speaking, implementations should strive to be robust
against limitations of the model-based input validation mechanisms and
their implementations that they employ.</t>
      <t>In applications that dynamically acquire models and dereference module
references in these, the security considerations of dereferenceable
identifiers apply (see <xref target="I-D.bormann-t2trg-deref-id"/> for a more extensive discussion of
dereferenceable identifiers).</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz"/>
            <author fullname="C. Vigano" initials="C." surname="Vigano"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049). Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC9165">
          <front>
            <title>Additional Control Operators for the Concise Data Definition Language (CDDL)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="December" year="2021"/>
            <abstract>
              <t>The Concise Data Definition Language (CDDL), standardized in RFC 8610, provides "control operators" as its main language extension point.</t>
              <t>The present document defines a number of control operators that were not yet ready at the time RFC 8610 was completed:,, and for the construction of constants; / for including ABNF (RFC 5234 and RFC 7405) in CDDL specifications; and for indicating the use of a non-basic feature in an instance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9165"/>
          <seriesInfo name="DOI" value="10.17487/RFC9165"/>
        </reference>
        <referencegroup anchor="STD68" target="https://www.rfc-editor.org/info/std68">
          <reference anchor="RFC5234" target="https://www.rfc-editor.org/info/rfc5234">
            <front>
              <title>Augmented BNF for Syntax Specifications: ABNF</title>
              <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
              <author fullname="P. Overell" initials="P." surname="Overell"/>
              <date month="January" year="2008"/>
              <abstract>
                <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
              </abstract>
            </front>
            <seriesInfo name="STD" value="68"/>
            <seriesInfo name="RFC" value="5234"/>
            <seriesInfo name="DOI" value="10.17487/RFC5234"/>
          </reference>
        </referencegroup>
        <reference anchor="RFC7405">
          <front>
            <title>Case-Sensitive String Support in ABNF</title>
            <author fullname="P. Kyzivat" initials="P." surname="Kyzivat"/>
            <date month="December" year="2014"/>
            <abstract>
              <t>This document extends the base definition of ABNF (Augmented Backus-Naur Form) to include a way to specify US-ASCII string literals that are matched in a case-sensitive manner.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7405"/>
          <seriesInfo name="DOI" value="10.17487/RFC7405"/>
        </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 anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-cbor-update-8610-grammar">
          <front>
            <title>Updates to the CDDL grammar of RFC 8610</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="24" month="June" year="2024"/>
            <abstract>
              <t>   The Concise Data Definition Language (CDDL), as defined in RFC 8610
   and RFC 9165, provides an easy and unambiguous way to express
   structures for protocol messages and data formats that are
   represented in CBOR or JSON.

   The present document updates RFC 8610 by addressing errata and making
   other small fixes for the ABNF grammar defined for CDDL there.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-update-8610-grammar-06"/>
        </reference>
        <reference anchor="I-D.ietf-cbor-cddl-more-control">
          <front>
            <title>More Control Operators for CDDL</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="21" month="July" year="2024"/>
            <abstract>
              <t>   The Concise Data Definition Language (CDDL), standardized in RFC
   8610, provides "control operators" as its main language extension
   point.  RFCs have added to this extension point both in an
   application-specific and a more general way.

   The present document defines a number of additional generally
   applicable control operators for text conversion (Bytes, Integers,
   JSON, Printf-style formatting) and for an operation on text.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cddl-more-control-06"/>
        </reference>
        <reference anchor="I-D.bormann-cbor-cddl-2-draft">
          <front>
            <title>CDDL 2.0 and beyond -- a draft plan</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="27" month="August" year="2024"/>
            <abstract>
              <t>   The Concise Data Definition Language (CDDL) today is defined by
   RFC 8610 and RFC 9165.  The latter (as well as some more application
   specific specifications such as RFC 9090) have used the extension
   point provided in RFC 8610, the control operator.

   As CDDL is used in larger projects, feature requirements become known
   that cannot be easily mapped into this single extension point.
   Hence, there is a need for evolution of the base CDDL specification
   itself.

   The present document provides a roadmap towards a "CDDL 2.0".  It is
   based on draft-bormann-cbor-cddl-freezer, but is more selective in
   what potential features it takes up and more detailed in their
   discussion.  It is intended to serve as a basis for prototypical
   implementations of CDDL 2.0.  This document is intended to evolve
   over time; it might spawn specific documents and then retire or
   eventually be published as a roadmap document.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-cbor-cddl-2-draft-05"/>
        </reference>
        <reference anchor="I-D.bormann-t2trg-deref-id">
          <front>
            <title>The "dereferenceable identifier" pattern</title>
            <author fullname="Carsten Bormann" initials="C." surname="Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Christian Amsüss" initials="C." surname="Amsüss">
         </author>
            <date day="1" month="September" year="2024"/>
            <abstract>
              <t>   In a protocol or an application environment, it is often important to
   be able to create unambiguous identifiers for some meaning (concept
   or some entity).

   Due to the simplicity of creating URIs, these have become popular for
   this purpose.  Beyond the purpose of identifiers to be uniquely
   associated with a meaning, some of these URIs are in principle
   _dereferenceable_, so something can be placed that can be retrieved
   when encountering such a URI.


   // The present revision -04 includes a few clarifications.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-t2trg-deref-id-04"/>
        </reference>
        <reference anchor="useful" target="https://github.com/cbor-wg/cddl/wiki/Useful-CDDL">
          <front>
            <title>Useful CDDL</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="cddlc" target="https://github.com/cabo/cddlc">
          <front>
            <title>CDDL conversion utilities</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="RFC9052">
          <front>
            <title>CBOR Object Signing and Encryption (COSE): Structures and Process</title>
            <author fullname="J. Schaad" initials="J." surname="Schaad"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>Concise Binary Object Representation (CBOR) is a data format designed for small code size and small message size. There is a need to be able to define basic security services for this data format. This document defines the CBOR Object Signing and Encryption (COSE) protocol. This specification describes how to create and process signatures, message authentication codes, and encryption using CBOR for serialization. This specification additionally describes how to represent cryptographic keys using CBOR.</t>
              <t>This document, along with RFC 9053, obsoletes RFC 8152.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="96"/>
          <seriesInfo name="RFC" value="9052"/>
          <seriesInfo name="DOI" value="10.17487/RFC9052"/>
        </reference>
        <reference anchor="RFC8428">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author fullname="C. Jennings" initials="C." surname="Jennings"/>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby"/>
            <author fullname="J. Arkko" initials="J." surname="Arkko"/>
            <author fullname="A. Keranen" initials="A." surname="Keranen"/>
            <author fullname="C. Bormann" initials="C." surname="Bormann"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This specification defines a format for representing simple sensor measurements and device parameters in Sensor Measurement Lists (SenML). Representations are defined in JavaScript Object Notation (JSON), Concise Binary Object Representation (CBOR), Extensible Markup Language (XML), and Efficient XML Interchange (EXI), which share the common SenML data model. A simple sensor, such as a temperature sensor, could use one of these media types in protocols such as HTTP or the Constrained Application Protocol (CoAP) to transport the measurements of the sensor or to be configured.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8428"/>
          <seriesInfo name="DOI" value="10.17487/RFC8428"/>
        </reference>
      </references>
    </references>
    <?line 522?>

<section anchor="abnf-specification">
      <name>ABNF Specification</name>
      <t>This section specifies the grammar employed by the module structure
directives using the ABNF language defined in <xref target="STD68"/> and
<xref target="RFC7405"/>.</t>
      <sourcecode type="abnf"><![CDATA[
directive = ";#" RS (%s"import" / %s"include") RS [from-clause]
                    filename [as-clause] CRLF
from-clause = 1*(id-or-all [","] RS) %s"from" RS
as-clause = RS %s"as" RS id
filename = 1*("-" / "." / %x30-39 / %x41-5a / "_" / %x61-7a)
id = ("$" / %x40-5a / "_" / %x61-7a)
     *("$" / %x30-39 / %x40-5a / "_" / %x61-7a)
id-or-all = id / "*"
RS = 1*WS
WS = SP
SP = %x20
CRLF = %x0A / %x0D.0A
]]></sourcecode>
    </section>
    <section anchor="cddlc-tool">
      <name>A CDDL Tool that Implements CDDL Module Structure</name>
      <t>This appendix is for information only.</t>
      <t>A CDDL conversion tool is available <xref target="cddlc"/> that can process
module-structured CDDL models into basic CDDL models; the latter can
then be processed by other CDDL tools such as the one described in
<xref section="F" sectionFormat="of" target="RFC8610"/>.</t>
      <t>A typical command line involving both tools mentioned might be:</t>
      <artwork><![CDATA[
cddlc -2 -tcddl mytestfile.cddl | cddl - gp 10
]]></artwork>
      <t>The CDDL conversion tool can be installed on a system with a modern
Ruby (Ruby version ≥ 3.0) via:</t>
      <artwork><![CDATA[
gem install cddlc
]]></artwork>
      <t>The present document assumes the use of <tt>cddlc</tt> of at least version 0.2.5.</t>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1bSXMbSXa+569Igz0xAAcFLqLUEjSaboqUphnWZpEKxVgh
E4lCAqhRoQpdWUUKotkxV5998m0O9h8Z/5P+Jf7ee1kbCEqaxXNwWBHdRFVu
L9/yvSWzgiBQF0N9R6k8ymM71J2j4+Nn+nk6KWKrT/OsCPMisx1lxuPMXtze
riZpmJgFZphkZpoHkc2nQThOsyCcTOJgwQNcEJvculy5PLNmMdQnT86eqi1d
LCf0fqjv39vbxTM9DVVo8qF2+USFaeJs4gp0wIJWGQwGJYfLZRyhU4RmbZKJ
fm1NHJxFC5BzmWYfZllaLInixy9f6+cmSnKbmCS03PfJRzw5GtpRH+wK/SdD
pQN9lCZh5Kw+NrnRx3YaJREtoJ+ZZFaYmVUXNilAnNZfPb3WCxPF6Ens+J4Y
M0izGb2fRfm8GPuW4HK20+QVdRB2ocM8z5duuLPjOw5k5CBKW0N2Psf7wTxf
xBCUKfJ5mtEOAvyntUjtyGQOJOvHabYwScItoHKo3yTRhc1clP/3f+b6cWYX
6HT2zyfcgcRoQd6r1OVTE871nTu7Bwe73BZG+WroB8iLdIJ1joP9+3fuPvBv
iiTP0Ou3lhZd8cvlPE3Q71cHD4KD/b1gf+9+cO/Og/09brTCydCM0+/zTxHx
cW0fWDCZmAQamplqFyaJPrGeDPVhttDPokWU20lzxrEMGyxo2IAY+P2MWgZh
ulBKJcSVHIwgtr1+ekR6CjLAXXl+sHfvLp5TbCeNidTTs+N794fajJOp3qIe
d/fvHEjfbw9270pLEBpnlYqSaT39ltYnwfFABDkWYTRkOQXDP9lsqP0PJd1r
iYspBURgMMvMYmHQ2f+40dmrR2YDT3q1h33f9yYF+wHTJrsvn9Z65/t5Ngsm
NrPTIJoAEugX+hTOTot4yIzPTTYj3Sk122s0+L3TtIady+hDtPOGBwaEPTJY
wEpea/+auofDZjtjFXbECgwjLvIohjlb90UKoGC8fOjlu3t3n3hD4gqCANKD
6pswV+rdv+D3XvC+/iUUHOY6n1sQsrA6nerLDOsms74sjIYv4YzuEvE9HTlw
D612osdiICDnT38k+Qrm0ROp34AbzzA1QCO3mZ4bRwyf8HK2xCO9TIFUepml
F9EEjVFST1hTd+7VQKdLm5k8zc4HSrblhKkga2yxIVkBk8TEzIzm/b0Nc9fn
aRKLRig3D51aQ67CMWFjCzZb/SFJLxN0NTlsOknSHA3aGhfFsteFWS55/jxF
LyzqsGZ8YzueONr8EitYbBDuqFjwD+YeHIQem/DDpckmATMOZPED6FjC9sax
5TkuzUpjMTOZYIQgJ8GcuDlqoe0PRAsWETQEGrGlT4hbE3QCSU2dIIqmRcLv
DVRvRbqQbyITeyM3F5Gp0NIhrFIvTZZjhLokBhHbwjSO0x+LyMTxCqwCFIf4
iQEslP3Bbp/3hsnYHZGAQTJ4SmJSl1Bw3aUOaQYfMCOa0N7TKUjKdGZDosQt
bRhNK8fqCuC6If65BdZSzhJJsqDHldJ/66urEnOur5kQADE4Gcn2ITWbsdJj
S8SEdSW7oaWYr8QjTNg1EBr2fwmQA9mqbt27vu5BJltbZFZw0HVIUFuWE2mc
wdVESRqnsxUwNF3wGhAjEUzxBPykUqekm/ajWSzhN4l3st1JPVk9FphwfT2Q
yRFIaIoknO48f3N61unLX/3iJf9+/eSf3py8fnJMv09/OHz2rPqhfI/TH16+
eXZc/6pHHr18/vzJi2MZjLe69Up1nh/+riPC77x8dXby8sXhsw7ZJVtNpWVG
dBgKQfqRQQtz0janJtaFWTQWW3589OpPf9w7wPb+Adiwv7f3ANyRh/t73x7g
4XJuE1ktTaCJ8giRrhQZLDQCs0BZoJ3LKDcx4AAa5OZk7NA0C3ZtvyPOvB/q
X4/D5d7Bb/wL2nDrZcmz1kvm2c03NwYLEze82rBMxc3W+zVOt+k9/F3rueR7
4+Wvv4sBPjrYu//dbxBGKB83uwIaX6GKerTpH1h05KGJnNZqe6gQpkSTCGbq
7ak7huFWsNZEtZ5SL7NoFiUEFH3R3svSH6CP2DLF2QxyNnYehNMihqOxyn4k
hPLYDruzl5p24gbsAsh4XfSJPduNORj0WcnaszARBGJREiKAx9uGk0B/BluT
0bS0EwQloFYRPCMgTHInqMZD4QSgQjyhqbVblqntuXs+RteQFz7vebcDyISu
RzNyqIyHgNqsmFjiyoL2wws6tvKhIi9tKK4n542uSbEYAylL/HNJBHUHaURV
zk7mAjDv4Zg4o5gzukgAJMw3GGBE/ShaZTiPGO+650B+4Bbg/Bxbr5EGvZUh
0BMmIcombcBiYtkwtyxF5A34e0u78W5Y5NGH/0zMjEgnRqcIg0jqvLRbmpCx
wFykILiixClxzU4v2AOR/ITdJyLCXzp4D1GtJq9kyT7jOnl1OCUEMZfzCN6j
zataP8gBePaK7ACdIB7Qno5zw+BlWVrkEms9gyZegD5iV2aBPmmRk9+UsKq5
lOcJvb/hycugyq+y7o/7OuP+RDBAU4FbHxCVEVb6uZzX0ilEiqxvIh6BPany
Pfo+zCIBLCw8LhwDGV/l96YsCxHFEhIoiJNg9dMiY49MWSxkuOKo6ONSHDoi
jALDxtGsSAtXUUCLcJxkL9L4gp7WHHm348NgtHV6iqh3NhYwIVJMDI+QcBqC
ztgnAYZdFDFLh22lkmGUwPue+rF7ezT8O/IOB/v34Qy1fpGyggINYLuVkvLm
PSaACHUBazfesid2ASIRVFdmLMkC7HhMWIGJdL3kAa3o8y72/a+wIPQBOjlt
8g4TQzviUtLVBA4zEAMOB/s0UyuzYW/egl4K9up/cPWwmnAe2Qu7WbcYMjmQ
JA5EFCxEkF1MkSUwMXKMJja5iLI0WTC2Ca84DrLCa0E30FiDmIooIKEBItK+
vrQ+UmWPErgVmj7qrkOCCyTQHDVbJmWZGSS0jmon2DFl+hgohmiAGpJ09PpI
MuC0s2zlQWNBmzn3TgeKgTzguHrgcAIxqhO7ABrIZjCkJrqvXSrbs6QCwizl
0iKD0k8jMC6kKFHSJUfQxDkTNL6eg4QfYWLEDwMEWhEZvxmTDXp/p8OmvIbE
EEkUqgXGtsZ9SMHZDNJj/wnKBbQb63Hs6uoMgCVSc4H3o8S+VhphTTPKZeBo
hoqNoAtwmeVtrGhwwnEYSalVy8239kbqJJbBoiPPICQzNCq/x8xRq8spfyiI
FU3ix3ZK0E78HhfxhzIlydPUu3AFcw3JX1Uum/2mRPmsMpUitsCzBTjYi3rh
0Y2MvWVBbxEwem4QcRnjac0UXQFo5TF5ndrIkVO2PShFJsw7Uo6PANRsLLhF
K9VW6gQebV9ckyJwja2ZlKYSNRI5BkXxlgysJqkF6PXCGzg8NJScg6tuHH0g
p8QYMImmDM45mWCv9DX1vmWWASMK1INUmiMh8tpWfAMNkhSsRpR60161FTtx
Cqgu6y1gy9YkrAgQEDkPzIFf0+hjuVtZAdtkASjJ6Ms9DrlLx7iODmODzYHO
Tm38HYneOrKHjlqDSE7Wm/pQ0+X0dq2N28JbyaoPS7NlxWPbLaMRo7dlpW2C
KK+gZWTT/WSzFNEDxyw91dD1iIDDZ2fOgrEIsVyp8V6IhiF7wiwiWbVau67n
LSjK+wqmDtTP+g0ZVhhBqhQlrF0afixxFFHKQCegwOxWoksIgy4b3r97dZXU
xiLp7F8GtEhBJ6mmUgqneKR/kvhvhEqJ66rIad2V9SXqF7UTOLksQyqvSqOH
WyMfIpX01fwfMAYwm6B+T8Fl+i1ZkGu7VYYFCMO5YuENy1MjWkosII2Qp9x8
gF0LYiSchzjL4W2Jp0IDIlUaemHgDr1x3brXUqmgRheRoX6q4aK932FDc628
JcHkYDlS23EW5XlMksrn3rQy3aUiDjDru55+8/rEi78iooZ9LjiEjBTsUdDF
gboNuwEnEXW7aAyYYYtG9EkhKOw3v7QCdwvml4XIxoCKua1rQuJUMJRUBG4E
v+pYWOU37PYh9FdAFW8Z/ufsrPHqMkI2MbZl/yqapgOb3H5sWhJlh78vXE7q
UYYkrKtifJtqVTw3UL17KKkIF8njhrzI4KQgxOck2aBXKfPNkKwVOVWBmS+w
1fI4gxNsF0OurrgOHJB7vL4W0PM1MBEOuRwMybmwVPp2wHJDeTRHulDAvh5x
Nnry4ujZm+Mn568Oz34YeV9E0zCnyIimVMEtXCHuH7g1CbiS4KzJ0JU0DGpz
kksyCYeQJoGz2A47PYicCawVEZxt6FBfrBiWI0EMeVSpzg6Z8sUSgYb1Hp5L
ca40HWLDLzkSYzckQYo3jvoFpzjI4MipI+5ksAI90Amqmpf1SubUsvAaqhDP
gzIBW6G6rD2OsmlIJfgRLKX7tGCJ+mQG6Vg0m0OvipmPR1gxsbu3dlwumGZs
NjswRyiekzCcW5pQ4CMQ5LONpeVQQGor1HpCoJrYPDimXME9hEQscqHDJXkP
wOHmjEJqLlRVlACtqvVKIE+ae8a57tQUcb5JSSDooVI//fSTGgz5DwawDg8F
QwQf0yKpUtqwyDj0KOW+0t3RYNSjrcB/Tcn+lQzgIKsv5yc//+E/XEuypUlV
5VC2HbG7PukejSqVlN1FjQtU8FNd9hskVKm3UEkjlaRy9M1IMzu4KkRR+9zG
lcb3Kl/jE+qgsmevQFGyLPKH3AMhKDhHqzTC+BYhurSPmLzeY+51Kobc8LRX
W7X3ul73UK0I5zKVI2DW7EnbV5eIWiIl2xDkt61HURLGxcTWVi/PjuulxOhG
MFzFFl2JVnXdmws65JrLcG3HN1Xi5BgkIpriFRI7PoUpkZ3QPI7CKAf6SxEA
42ThrgR72oqvhlg6REun91DI5+UamKUbyWa1OSQWeU0r14jzOZ2ead3cXwOq
WasojKAea0WVTUEzh2DlFqSs4J9ohls30fdU+cixpqdcf9PizgulzVPvtes9
lwc9xBT2WD5Pk5IPV8o4XvQxriRsgoEwEFeWhWI+6pPCCR/VM69jSdhK/jcX
U7yYGafgOd2raIelnMbG0Tgz2WooJJPzhRlWc1GphBMnsZPxqjxrI4MvDd+j
zzfe4IP9nH7oQElY+EgfvTx9cv6PdqUebnlpaQ/bMtInBWKorkQpARKimC12
b7DbDj9kWTlqv7FS+QPvriDKPf3oNzoHSOgdiinoOPM7vU8v6bhWHu9s6nNA
L9/9qvH+vTTcbQ7eRpgxtjG9ujBxAX1Q18q/ojEYSRMoacQ7utJQYrVkplwJ
WyIWyDme8c5OpBM1tfCScNCfjrLjVbUBrKXZP1Q5ydSHahTZmTC0y1yC3rmv
rngt4KRRyo2sVKpOQ3wodNPY6rc11PE8ZRHENGbxmUG3kTv2vqg+dJA2uF2H
JO+h8/e/rS61l209/b20ihetVIufav1qNjaVrNGtpWlcefX5Q12uqFMokU1Z
0B3xNCM+nWsE8WqTuPsM6sxZTEKQR1lrFfgcV2EPslef6lbxG5E84iBqBFI5
XyQtBYQ+8bjdrkXL8Fu9L/nfx1S7qyCMp66QuOGNfe3Ph4cCrRTi+mXVQjIi
UhpfB/HMutWFkLcxFFpMghD5tOqMtkcdtmby4Owo+Cx6qyZIXQ2LRM6O7ORa
qdNWRFR1u9VGFis+/YA+3sCgazYVmUDa+r5F3NcaBL9tLdhX7Jo58WQXXUYf
nisUwXB+JpFF034+S9LXgmLl/ZlUiSiEAM5e6xilUmQvzgprJn81z2oD6zdt
r8W9dfA5nCG36ev/Heb9uRYvmiZ2sK5obCRV5H7Jp7t8MNKkmovuXhPL6E7S
dFXFlLIzX1iqQiSiAqECHWbEzjaCNT9MVQXOw7J2qn0JTXPJFOnRZQXfdXAF
p5G6Iqv8kZQn68jsK4T+NIvyT3Jla8D57HmanTsL1xtHn+zkfGGW1w0v87l+
n1WFsy8T3lAIOcL+jD58FdmfJfYRexY9oEt0Ms/cGmSa3LjjG/nwfletN4vD
47e/tQnmDc9/4Fb3tZ5qbRhm7LLLYydaK3PDicJB1tO+/5I7rV1ut/KiemdH
3ysfetTa+3ON6GpIJbX8UQchxKRzXUb23rk4Om/n6gIfVZHiZvZHTJHzBac4
MnKu2zwg4Nuof3M1/Us0tIoI2pex2NX5a4CutQ81umWZkYSSk9RKjDk3/gR0
PfT7K3T7drX+3Lj/N4m/g0mkaaxPiyUrIqn7kS9MPqOaz5EkrxtiNhnpuFzr
9Y1LlnRRL/JnY3ymSOelcrHFNg940mnzQKfyMc2KEzkYrkyuLeJnrnIUnaWp
0N6sPGTWbp72NvuNiGWPSnMLXDuHqP1CqyhmspncwRu1x4+khIvUO8vDgqmT
ZW9PgSR6SmdWLjqUBzKS0nRpj706ku37IL+kD87dFXzTkW8Uj9bIH/Ul+f9i
aqVuTa2+GTAlg2/+D6ZXJ4k/oeZrnv3WYcMqoVoRoc5mdQJe0iU9gbj6+Kcs
pXHZjk/m6eIN4Wt1SbubpHr08x/+fcRNMxhCQteA1hegQ0O1pU9tWGR0VeCo
VWRuBdz1ycja4U3ztqgvJYA5dNeF703IRbemH3Hlau2SNkatUqkt6xkhYKOr
WuvavJkD6dV5JFWf21de/E0SvExXX3Gxi05myt2U53XGhTarrpcRj/13O61z
XyfHU2DvGNOtndpV1x3Rw9Mid3f82dpg0/l35TaFwipJ33TEF4Z8bVL5g0h9
4zxAcvl0KbezHvoqs7+2QTvlA5siAZNnqaqi/JCG8c2vMCuQga64PIg/otTr
tx88afTlTnlsPS6Q+DbPth76qxl0IBmVV9wZYVZBOCc2mzw34QdXamzJ3zpU
KsmVG4H+Djxdwy75x5dYo02aIBcA/e3DQG6K8amA4js9wnm+dkYf2fAluVL6
VInDz8hW9wE4UKmv5aIzQjwyPzbQ8tBE+5npuoXcly0vkCxMXJZlqwMkWIxx
8+q24IKCMeInXYYP+b5fr3kjkg+LQ7oHG/NFLCogK1/aLSlsah/dWV+tFbWj
rKnVWFfVF2cgEdqV37GzTS4wQ4vlLDMTW5331UlXeauRfWw3SswEaRzNKwV4
U5+mmlLmPWyBL448J1jzMEBHDktrPtDnMDeECjdIHIUQKJsSnmTpuHC5MpR0
I+SO6est3715wNyUvm5If2Fp05FbsAyUMGijMjXsWc69TPMLQ4l9V/CpopGw
0h+LKKuOt0nA/KGTz439TbfqRelLnS0PkTcDJ50m1dNQBVfJ3WCAdOZE4rrr
ELRcXck3Vv580cipg/+I4oIgxYWFc2LMam1S3ZiUP57QJ4cvDjf4jKZHmLNn
kp5GFJ18Dn0MQ9fQEYY9fvFUnzZxb/Pt9vZNd0FL7wBKhyRnXOUnJiIWqd9t
wv1mjFhUF4OYnPJ2Y9M1gHX0BZ58pqL8E3+Px16HYhl6U8+KKKDzcKujX5/q
7i9cR8Crg3CBHiSl7/So9R35/kCKh+/5k6L1f+UtFv3OuLKjPnr97KlqDMV6
e9vdaBKkWUB1xXedfuc95u/RglyIxIOqJkB3rI0mKrnjVzRR1TI8UycgYjsD
Jvnjnd3gzgP+dbAX3DXUci4t9/aCb00PGkd5SucbeXmwu7ET72a76tWYdHP/
ejeItSbUvt1RIJYIfHuq3tKv01fq9BX+/uLj/q4ipvDv3UOeZ/d4sHsogdhh
fV9DLLMKFPy1xfVPlPXVVuMix7pWeh00ZTU7koy++jSTTCjhM7/DG18VcuIR
Na8Z+Tsj0K7y07bSN992ku0xhJ1s4wBbXouL9Z/1YTLCMC6D+kn9gSG7cB4m
VznL6rs/KtbNay3NKwtP2xEXMqnVkiCuHbzK1TY+YKeioixRV7bkFsa4zJnK
jEkHkjMtVvQhM6nkgJ//VUsqpWdLvbdb14M38tYXfQn95Wu3lO8KrOCcF+VH
HMSpLFGvC3Ciy/8vp/j53/5L3xns9uhW11A+FJzxvWaeTXI7WfzGR3lyGU04
WPB3a0imqP+I3VxOnh8eqVxpd7A/uCsx+GFYfgTBKolsuqzKIqE2sbOcUb88
fgkYrT6XGKj/ATwdlj2PPwAA

-->

</rfc>
