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


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

]>


<rfc ipr="trust200902" docName="draft-trimplayer-portcast-00" category="info" submissionType="independent" tocDepth="3" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="PortCast">PortCast: A JSON-Based Interchange Format and Sync API for Portable Podcast Listener Data</title>

    <author initials="" surname="Trimplayer Editors" fullname="Trimplayer Editors">
      <organization>Trimplayer</organization>
      <address>
        <email>trimplayerapp@gmail.com</email>
        <uri>https://trimplayer.com/</uri>
      </address>
    </author>

    <date year="2026" month="May" day="28"/>

    <area>Applications</area>
    
    <keyword>podcast</keyword> <keyword>opml</keyword> <keyword>subscription</keyword> <keyword>synchronization</keyword> <keyword>listener</keyword>

    <abstract>


<?line 76?>

<t>PortCast defines an open JSON-based interchange format, and an optional
HTTPS synchronisation API, for moving a podcast listener's data --
subscriptions, listening history, playback position, queue, bookmarks,
and per-feed preferences -- between independent podcast applications
without a central service. It builds on identifiers already present in
RSS (item GUID, feed URL) and the Podcast Namespace
(podcast:guid) so that implementations can interoperate without
inventing a new identity namespace. This document specifies the file
format (v0.1) and a federated synchronisation API (v0.2) that reuses
the same data model.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://portcast.org/"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-trimplayer-portcast/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/Trim-Player/PortCast"/>.</t>
    </note>


  </front>

  <middle>


<?line 89?>

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

<t>A listener's relationship with their podcasts -- which shows they
follow, where they stopped in an unfinished episode, the clip they
bookmarked at 23:04 -- currently lives inside whichever application they
happen to use. Switching applications restarts that relationship from
zero. OPML <xref target="OPML2.0"/> solves the subscription case, but everything else
(playback position, completion state, queue, bookmarks, per-feed
preferences) is lost on every migration.</t>

<t>This document specifies PortCast, a protocol whose goal is simple: a
listener <bcp14>SHOULD</bcp14> be able to leave any podcast application and arrive at
any other application with the relationship to their podcasts intact.
PortCast defines a JSON document format (file mode, <xref target="document-container"/>
through <xref target="extensions"/>) and an optional HTTPS API (API mode,
<xref target="live-sync-api"/>) that exposes the same entities for incremental
synchronisation. The two modes share a single data model; file mode is
the interoperability floor that every conforming implementation can
fall back to.</t>

<t>PortCast is intentionally federated. There is no central directory,
registry, or authority. Each application exposes its own endpoint on
its own domain, or produces its own files. The editors of this
specification commit to not operating a central service.</t>

<section anchor="design-goals"><name>Design goals</name>

<t><list style="numbers" type="1">
  <t><strong>Listener-owned.</strong> The document is produced by the user, for the
user. No vendor lock-in, no proprietary identifiers required.</t>
  <t><strong>Interoperable identity.</strong> Use open identifiers already present in
RSS (item GUID, feed URL) rather than inventing a new namespace.
Implementations <bcp14>MAY</bcp14> add their own identifiers in a namespaced
extension block.</t>
  <t><strong>Lossless within the model.</strong> A conforming export captures
everything the protocol defines. Anything outside the model goes in
<spanx style="verb">extensions</spanx> so it round-trips through implementations that do not
understand it.</t>
  <t><strong>Partial and incremental.</strong> Every entity carries an <spanx style="verb">updatedAt</spanx>
timestamp, so a future synchronisation profile can ship deltas. The
v0.1 file format is a full snapshot, but the data model is
synchronisation-friendly.</t>
  <t><strong>Human-readable.</strong> A listener <bcp14>SHOULD</bcp14> be able to open the file in a
text editor and recognise what it says about them.</t>
  <t><strong>Versioned.</strong> The document declares its protocol version;
implementations can negotiate behaviour.</t>
</list></t>

</section>
</section>
<section anchor="terminology-and-conformance"><name>Terminology and conformance</name>

<section anchor="requirements-language"><name>Requirements language</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="defined-roles"><name>Defined roles</name>

<t>A <strong>producer</strong> is software that writes a PortCast document or serves
PortCast API responses.</t>

<t>A <strong>consumer</strong> is software that reads a PortCast document or calls a
PortCast API.</t>

<t>A <strong>conforming producer</strong> <bcp14>MUST</bcp14> write a document that validates against
the JSON Schemas published with this specification. A <strong>conforming
consumer</strong> <bcp14>MUST</bcp14> accept any document that validates against those
schemas, and <bcp14>MUST NOT</bcp14> reject a document because of unrecognised keys
inside an <spanx style="verb">extensions</spanx> object (<xref target="extensions"/>).</t>

</section>
</section>
<section anchor="document-container"><name>Document container</name>

<t>A PortCast document is a single JSON object <xref target="RFC8259"/>, encoded in
UTF-8 without a byte order mark, with the following top-level shape:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "portcast": "0.1.0",
  "generatedAt": "2026-05-26T14:00:00Z",
  "generator": { "name": "Trimplayer", "version": "3.4.1" },
  "owner": { "displayName": "Jonathan", "email": "user@example.com" },
  "subscriptions": [ ],
  "episodes":      [ ],
  "queue":         [ ],
  "bookmarks":     [ ],
  "preferences":   { },
  "extensions":    { }
}
]]></sourcecode></figure>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Required</ttcol>
      <ttcol align='left'>Notes</ttcol>
      <c><spanx style="verb">portcast</spanx></c>
      <c>yes</c>
      <c>Semantic-versioned string. The version of this spec.</c>
      <c><spanx style="verb">generatedAt</spanx></c>
      <c>yes</c>
      <c>RFC 3339 <xref target="RFC3339"/> timestamp in UTC.</c>
      <c><spanx style="verb">generator</spanx></c>
      <c>yes</c>
      <c>Producing application identifier.</c>
      <c><spanx style="verb">owner</spanx></c>
      <c>no</c>
      <c>Optional listener identity. Producers <bcp14>SHOULD</bcp14> let users opt out.</c>
      <c><spanx style="verb">subscriptions</spanx></c>
      <c>yes</c>
      <c>Array of <spanx style="verb">Subscription</spanx>. <bcp14>MAY</bcp14> be empty.</c>
      <c><spanx style="verb">episodes</spanx></c>
      <c>yes</c>
      <c>Array of <spanx style="verb">EpisodeState</spanx>. <bcp14>MAY</bcp14> be empty.</c>
      <c><spanx style="verb">queue</spanx></c>
      <c>no</c>
      <c>Ordered array of <spanx style="verb">QueueItem</spanx>.</c>
      <c><spanx style="verb">bookmarks</spanx></c>
      <c>no</c>
      <c>Array of <spanx style="verb">Bookmark</spanx>.</c>
      <c><spanx style="verb">preferences</spanx></c>
      <c>no</c>
      <c><spanx style="verb">Preferences</spanx> object.</c>
      <c><spanx style="verb">extensions</spanx></c>
      <c>no</c>
      <c>Namespaced extension data (<xref target="extensions"/>).</c>
</texttable>

<t>The file extension <bcp14>SHOULD</bcp14> be <spanx style="verb">.portcast.json</spanx> and the IANA media type
<bcp14>SHOULD</bcp14> be <spanx style="verb">application/vnd.portcast+json</spanx> (see <xref target="iana-considerations"/>).</t>

</section>
<section anchor="identity-model"><name>Identity model</name>

<t>Identity is the heart of an interoperability protocol. PortCast
identifies entities at two levels.</t>

<section anchor="podcast-identity"><name>Podcast identity</name>

<t>A <spanx style="verb">Subscription</spanx> <bcp14>MUST</bcp14> carry at least one of:</t>

<t><list style="symbols">
  <t><spanx style="verb">feedUrl</spanx> -- the canonical RSS or Atom URL of the show.</t>
  <t><spanx style="verb">podcastGuid</spanx> -- the Podcast Namespace <spanx style="verb">&lt;podcast:guid&gt;</spanx> value
<xref target="PODCAST-NAMESPACE"/> when the feed publishes one. This is the
strongest identifier and <bcp14>SHOULD</bcp14> be preferred when matching across
applications.</t>
</list></t>

<t>A subscription <bcp14>SHOULD</bcp14> include both when both are available.
Producers <bcp14>MAY</bcp14> also carry directory-specific identifiers (e.g., Apple
Podcasts, Podcast Index) under <spanx style="verb">Subscription.identifiers.*</spanx>; these are
advisory and not required for matching.</t>

</section>
<section anchor="episode-identity"><name>Episode identity</name>

<t>An <spanx style="verb">EpisodeState</spanx> <bcp14>MUST</bcp14> carry at least one of:</t>

<t><list style="symbols">
  <t><spanx style="verb">guid</spanx> -- the RSS <spanx style="verb">&lt;item&gt;&lt;guid&gt;</spanx> value (preferred).</t>
  <t><spanx style="verb">enclosureUrl</spanx> -- the media URL from <spanx style="verb">&lt;enclosure url="..."&gt;</spanx>.</t>
</list></t>

<t>It <bcp14>MUST</bcp14> also carry a <spanx style="verb">subscriptionRef</spanx> (either <spanx style="verb">podcastGuid</spanx> or
<spanx style="verb">feedUrl</spanx>) that matches one of the document's <spanx style="verb">subscriptions[]</spanx>
entries. If neither a <spanx style="verb">guid</spanx> nor an <spanx style="verb">enclosureUrl</spanx> is known, an episode
state <bcp14>MAY</bcp14> use a stable <spanx style="verb">(subscriptionRef, publishedAt, title)</spanx> tuple,
but consumers are not required to match by it.</t>

</section>
</section>
<section anchor="subscriptions"><name>Subscriptions</name>

<figure><sourcecode type="json"><![CDATA[
{
  "subscriptionId": "01HXYZ...",
  "feedUrl": "https://example.com/feed.xml",
  "podcastGuid": "917393e3-1b1e-5cef-ace4-edaa54e1f810",
  "title": "Example Podcast",
  "author": "Jane Doe",
  "imageUrl": "https://example.com/cover.jpg",
  "subscribedAt": "2024-06-01T09:14:00Z",
  "unsubscribedAt": null,
  "tags": ["tech", "weekly-listen"],
  "notificationsEnabled": true,
  "identifiers": {
    "applePodcastsId": "1500000000",
    "podcastIndexId": "920666"
  },
  "updatedAt": "2026-05-26T14:00:00Z"
}
]]></sourcecode></figure>

<t><spanx style="verb">unsubscribedAt</spanx> is set when the listener has stopped following the
show but the producer still wishes to convey historical context.
Consumers <bcp14>MAY</bcp14> discard unsubscribed entries on import. <spanx style="verb">tags</spanx> are
free-form, listener-applied labels.</t>

</section>
<section anchor="episode-state"><name>Episode state</name>

<figure><sourcecode type="json"><![CDATA[
{
  "episodeStateId": "01HXYZ...",
  "subscriptionRef": { "podcastGuid": "917393e3-..." },
  "guid": "https://example.com/ep/42",
  "enclosureUrl": "https://example.com/audio/ep42.mp3",
  "title": "Episode 42",
  "publishedAt": "2026-05-20T07:00:00Z",
  "durationSeconds": 3287,

  "status": "in_progress",
  "positionSeconds": 1245.2,
  "playCount": 1,
  "completedAt": null,
  "firstPlayedAt": "2026-05-22T18:30:00Z",
  "lastPlayedAt": "2026-05-25T08:11:00Z",
  "rating": null,
  "starred": false,
  "hidden": false,

  "events": [
    { "type": "play",  "at": "2026-05-22T18:30:00Z", "positionSeconds": 0 },
    { "type": "pause", "at": "2026-05-22T19:05:12Z", "positionSeconds": 2112 }
  ],

  "updatedAt": "2026-05-25T08:11:00Z"
}
]]></sourcecode></figure>

<section anchor="status-values"><name>status values</name>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Meaning</ttcol>
      <c><spanx style="verb">unplayed</spanx></c>
      <c>Listener has never started this episode.</c>
      <c><spanx style="verb">in_progress</spanx></c>
      <c>Listener started but did not finish.</c>
      <c><spanx style="verb">completed</spanx></c>
      <c>Listener reached the end or marked complete.</c>
      <c><spanx style="verb">archived</spanx></c>
      <c>Listener explicitly dismissed without listening.</c>
</texttable>

<t><spanx style="verb">positionSeconds</spanx> is <bcp14>REQUIRED</bcp14> when <spanx style="verb">status</spanx> is <spanx style="verb">in_progress</spanx> and <bcp14>SHOULD</bcp14>
be zero or omitted otherwise. Producers <bcp14>SHOULD</bcp14> record a small tolerance
(for example, treating the episode as completed if the listener reached
within 30 seconds of the end).</t>

</section>
<section anchor="playback-events"><name>Playback events</name>

<t>The <spanx style="verb">events</spanx> array is <bcp14>OPTIONAL</bcp14>. Each event has a <spanx style="verb">type</spanx> from the set
{<spanx style="verb">play</spanx>, <spanx style="verb">pause</spanx>, <spanx style="verb">seek</spanx>, <spanx style="verb">complete</spanx>, <spanx style="verb">speed_change</spanx>, <spanx style="verb">bookmark</spanx>} and
attaches its own typed fields. Producers <bcp14>MAY</bcp14> include a subset; consumers
<bcp14>MAY</bcp14> ignore events they do not understand. Producers that do not track
event-level history can omit <spanx style="verb">events</spanx> entirely; the top-level fields
(<spanx style="verb">positionSeconds</spanx>, <spanx style="verb">playCount</spanx>, <spanx style="verb">lastPlayedAt</spanx>) are still sufficient
for everyday "where did I leave off" portability.</t>

</section>
</section>
<section anchor="queue"><name>Queue</name>

<figure><sourcecode type="json"><![CDATA[
{
  "queue": [
    { "position": 1, "episodeRef": { "guid": "https://example.com/ep/42" },
      "addedAt": "2026-05-25T09:00:00Z", "source": "manual" },
    { "position": 2, "episodeRef": { "enclosureUrl": "https://.../ep43.mp3" },
      "addedAt": "2026-05-25T09:01:00Z", "source": "auto" }
  ]
}
]]></sourcecode></figure>

<t><spanx style="verb">position</spanx> is 1-based and <bcp14>MUST</bcp14> be unique within the queue. <spanx style="verb">source</spanx> is
free-form (e.g., <spanx style="verb">manual</spanx>, <spanx style="verb">auto</spanx>, <spanx style="verb">smart-playlist:Morning Commute</spanx>).</t>

</section>
<section anchor="bookmarks"><name>Bookmarks</name>

<figure><sourcecode type="json"><![CDATA[
{
  "bookmarkId": "01HXYZ...",
  "episodeRef": { "guid": "https://example.com/ep/42" },
  "atSeconds": 1384.0,
  "endSeconds": 1421.5,
  "label": "Great quote about feed ownership",
  "note": "Quote starts at 'and if you can't take it with you...'",
  "createdAt": "2026-05-25T08:23:00Z",
  "updatedAt": "2026-05-25T08:23:00Z"
}
]]></sourcecode></figure>

<t><spanx style="verb">endSeconds</spanx> is <bcp14>OPTIONAL</bcp14>; its presence promotes a bookmark to a <em>clip</em>.</t>

</section>
<section anchor="preferences"><name>Preferences</name>

<figure><sourcecode type="json"><![CDATA[
{
  "preferences": {
    "global": {
      "playbackRate": 1.2,
      "skipForwardSeconds": 30,
      "skipBackwardSeconds": 15,
      "trimSilence": true,
      "boostVoice": false
    },
    "perFeed": {
      "917393e3-1b1e-5cef-ace4-edaa54e1f810": {
        "playbackRate": 1.0,
        "skipIntroSeconds": 90,
        "skipOutroSeconds": 60,
        "autoDownload": "latest-3"
      }
    }
  }
}
]]></sourcecode></figure>

<t><spanx style="verb">perFeed</spanx> keys are <spanx style="verb">podcastGuid</spanx> when available, otherwise <spanx style="verb">feedUrl</spanx>.
Per-feed values override <spanx style="verb">global</spanx>.</t>

</section>
<section anchor="extensions"><name>Extensions</name>

<t>Anything outside this specification lives under an <spanx style="verb">extensions</spanx> object,
keyed by reverse-DNS namespace:</t>

<figure><sourcecode type="json"><![CDATA[
"extensions": {
  "com.trimplayer.skips": [
    { "episodeGuid": "...", "skippedRanges": [[12.0, 47.5]] }
  ],
  "fm.overcast.smart-speed": { "secondsSaved": 18421 }
}
]]></sourcecode></figure>

<t>Consumers <bcp14>MUST</bcp14> preserve <spanx style="verb">extensions</spanx> on round-trip even if they do not
understand a namespace. This is what keeps a multi-application journey
lossless.</t>

</section>
<section anchor="versioning"><name>Versioning</name>

<t><spanx style="verb">portcast</spanx> is a semantic-versioned string. Consumers:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> accept any document whose <spanx style="verb">portcast</spanx> major version they support.</t>
  <t><bcp14>MAY</bcp14> warn the listener when a minor version is newer than they
understand.</t>
  <t><bcp14>MUST NOT</bcp14> silently drop fields they do not recognise; preserve them
under <spanx style="verb">extensions._unknown</spanx> if necessary.</t>
</list></t>

</section>
<section anchor="live-sync-api"><name>Live sync API (v0.2 -- Draft)</name>

<t>The file format defined above (v0.1) is the interoperability floor.
v0.2 introduces an optional API mode: the same entities, exposed over
HTTPS so clients can synchronise incrementally without a full
re-export. The wire payloads in API mode reuse the v0.1 schemas; no new
entity shapes are introduced.</t>

<t>A conforming v0.2 implementation <bcp14>MAY</bcp14> implement file mode, API mode, or
both. Clients <bcp14>MUST</bcp14> assume nothing beyond what a server advertises in
its discovery document (<xref target="discovery"/>).</t>

<section anchor="operating-modes"><name>Operating modes</name>

<texttable>
      <ttcol align='left'>Mode</ttcol>
      <ttcol align='left'>Transport</ttcol>
      <ttcol align='left'>Use case</ttcol>
      <c>File</c>
      <c>User-supplied <spanx style="verb">.portcast.json</spanx></c>
      <c>One-shot migration, archival, manual transfer</c>
      <c>API</c>
      <c>HTTPS endpoints on the application's domain</c>
      <c>Live sync between two installed applications</c>
</texttable>

<t>File mode is the interoperability floor: every API-mode server <bcp14>SHOULD</bcp14>
implement at least <spanx style="verb">GET /portcast/v1/export</spanx>, which returns the same
document a file export would produce.</t>

</section>
<section anchor="discovery"><name>Discovery</name>

<t>A PortCast server <bcp14>SHOULD</bcp14> publish a discovery document at
<spanx style="verb">/.well-known/portcast</spanx> <xref target="RFC8615"/>:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "portcast": "0.2.0",
  "base": "https://example.app/portcast/v1",
  "auth": {
    "type": "oauth2",
    "authorizationEndpoint": "https://example.app/oauth/authorize",
    "tokenEndpoint": "https://example.app/oauth/token",
    "scopes": ["portcast.read", "portcast.write", "portcast.history"]
  },
  "capabilities": [
    "export",
    "subscriptions.read", "subscriptions.write",
    "episodes.read", "episodes.write",
    "queue.read", "queue.write",
    "bookmarks.read", "bookmarks.write",
    "preferences.read", "preferences.write",
    "events", "deltas", "webhooks"
  ]
}
]]></sourcecode></figure>

<t><spanx style="verb">capabilities</spanx> is a flat string set. A read-only server omits <spanx style="verb">*.write</spanx>
entries. A server that does not track per-event history omits <spanx style="verb">events</spanx>.
A server that does not implement delta synchronisation omits <spanx style="verb">deltas</spanx>
and clients fall back to fetching full collections.</t>

</section>
<section anchor="versioning-and-content-type"><name>Versioning and content type</name>

<t>Endpoints live under <spanx style="verb">/portcast/v1/...</spanx>. The <spanx style="verb">v1</spanx> is the API major
version and is independent of the specification version declared inside
payloads. Servers <bcp14>MUST</bcp14> set <spanx style="verb">Content-Type: application/vnd.portcast+json</spanx>
on responses; clients <bcp14>SHOULD</bcp14> send a matching <spanx style="verb">Accept</spanx> header.
Backwards-compatible additions (new optional fields, new capability
strings) <bcp14>MUST NOT</bcp14> bump the API major version.</t>

</section>
<section anchor="authentication"><name>Authentication</name>

<t>Implementations <bcp14>MUST</bcp14> use one of:</t>

<t><list style="symbols">
  <t>OAuth 2.0 <xref target="RFC6749"/>, with scopes drawn from <spanx style="verb">portcast.read</spanx>,
<spanx style="verb">portcast.write</spanx>, <spanx style="verb">portcast.history</spanx>. The <spanx style="verb">portcast.history</spanx> scope
covers event-level playback data (<xref target="playback-events"/>) and is
treated as more sensitive than basic read.</t>
  <t>Bearer token <xref target="RFC6750"/>, appropriate for self-hosted or single-user
deployments.</t>
</list></t>

<t>Credentials <bcp14>MUST NOT</bcp14> appear in URL query strings. Servers <bcp14>MUST</bcp14> reject
requests over plain HTTP.</t>

</section>
<section anchor="endpoints"><name>Endpoints</name>

<texttable>
      <ttcol align='left'>Method</ttcol>
      <ttcol align='left'>Path</ttcol>
      <ttcol align='left'>Body / Returns</ttcol>
      <c>GET</c>
      <c><spanx style="verb">/portcast/v1/export</spanx></c>
      <c>Full PortCast document (= v0.1 file)</c>
      <c>POST</c>
      <c><spanx style="verb">/portcast/v1/import</spanx></c>
      <c>Body: full or partial PortCast document; server upserts each entity</c>
      <c>GET</c>
      <c><spanx style="verb">/portcast/v1/subscriptions</spanx></c>
      <c><spanx style="verb">{ subscriptions, deletions?, syncedAt, nextCursor? }</spanx></c>
      <c>GET</c>
      <c><spanx style="verb">/portcast/v1/subscriptions/{ref}</spanx></c>
      <c>A <spanx style="verb">Subscription</spanx></c>
      <c>PUT</c>
      <c><spanx style="verb">/portcast/v1/subscriptions/{ref}</spanx></c>
      <c>Body: <spanx style="verb">Subscription</spanx></c>
      <c>DELETE</c>
      <c><spanx style="verb">/portcast/v1/subscriptions/{ref}</spanx></c>
      <c>Unsubscribe</c>
      <c>GET</c>
      <c><spanx style="verb">/portcast/v1/episodes</spanx></c>
      <c><spanx style="verb">{ episodes, deletions?, syncedAt, nextCursor? }</spanx></c>
      <c>POST</c>
      <c><spanx style="verb">/portcast/v1/episodes</spanx></c>
      <c>Body: <spanx style="verb">{ episodes: [...] }</spanx>; upsert</c>
      <c>GET</c>
      <c><spanx style="verb">/portcast/v1/queue</spanx></c>
      <c><spanx style="verb">{ queue }</spanx></c>
      <c>PUT</c>
      <c><spanx style="verb">/portcast/v1/queue</spanx></c>
      <c>Body: <spanx style="verb">{ queue }</spanx>; replaces in full</c>
      <c>GET</c>
      <c><spanx style="verb">/portcast/v1/bookmarks</spanx></c>
      <c><spanx style="verb">{ bookmarks, deletions?, syncedAt, nextCursor? }</spanx></c>
      <c>POST</c>
      <c><spanx style="verb">/portcast/v1/bookmarks</spanx></c>
      <c>Body: <spanx style="verb">Bookmark</spanx></c>
      <c>DELETE</c>
      <c><spanx style="verb">/portcast/v1/bookmarks/{bookmarkId}</spanx></c>
      <c>&#160;</c>
      <c>GET</c>
      <c><spanx style="verb">/portcast/v1/preferences</spanx></c>
      <c><spanx style="verb">Preferences</spanx></c>
      <c>PUT</c>
      <c><spanx style="verb">/portcast/v1/preferences</spanx></c>
      <c>Body: <spanx style="verb">Preferences</spanx></c>
</texttable>

<t><spanx style="verb">{ref}</spanx> in subscription paths is the URL-encoded <spanx style="verb">podcastGuid</spanx> when
known, otherwise the URL-encoded <spanx style="verb">feedUrl</spanx>. Servers <bcp14>MUST</bcp14> accept either
form. Episodes are intentionally not addressed by path because RSS
GUIDs do not round-trip cleanly through URL encoding.</t>

</section>
<section anchor="delta-sync"><name>Delta sync</name>

<t>Collection endpoints (<spanx style="verb">subscriptions</spanx>, <spanx style="verb">episodes</spanx>, <spanx style="verb">bookmarks</spanx>) <bcp14>MUST</bcp14>
accept <spanx style="verb">?since=&lt;RFC 3339 timestamp&gt;</spanx> when the server advertises the
<spanx style="verb">deltas</spanx> capability. The response then contains only entities whose
<spanx style="verb">updatedAt &gt; since</spanx>, a <spanx style="verb">deletions</spanx> array of refs for entities removed
since that timestamp, and a <spanx style="verb">syncedAt</spanx> timestamp the client persists
for the next round.</t>

<t>Servers <bcp14>SHOULD</bcp14> retain deletion tombstones for at least 30 days. Clients
that have been offline longer <bcp14>SHOULD</bcp14> discard their cached <spanx style="verb">syncedAt</spanx>
and perform a full pull.</t>

</section>
<section anchor="pagination"><name>Pagination</name>

<t>Endpoints that may return large collections support cursor-based
pagination. The response carries <spanx style="verb">nextCursor</spanx> when more pages exist;
the client passes <spanx style="verb">?cursor=&lt;value&gt;</spanx> to fetch the next page. Cursors are
opaque strings. <spanx style="verb">since</spanx> and <spanx style="verb">cursor</spanx> <bcp14>MAY</bcp14> be combined.</t>

</section>
<section anchor="conditional-updates"><name>Conditional updates</name>

<t>Writes <bcp14>SHOULD</bcp14> use <spanx style="verb">If-Match: &lt;updatedAt&gt;</spanx> for optimistic concurrency.
Servers <bcp14>MUST</bcp14> respond <spanx style="verb">412 Precondition Failed</spanx> if the resource's
current <spanx style="verb">updatedAt</spanx> is newer than the supplied value. This prevents two
clients clobbering each other's position updates on the same episode.</t>

</section>
<section anchor="api-errors"><name>Errors</name>

<t>Errors are JSON, with HTTP status reflecting the class:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "error": {
    "code": "subscription_not_found",
    "message": "No subscription matched podcastGuid=917393e3-...",
    "ref": { "podcastGuid": "917393e3-..." }
  }
}
]]></sourcecode></figure>

<t>The initial set of <spanx style="verb">code</spanx> values is registered in
<xref target="iana-error-codes"/>. Servers <bcp14>MAY</bcp14> define additional codes under a
reverse-DNS prefix (e.g., <spanx style="verb">com.example.quota_exceeded</spanx>); such
vendor-prefixed codes do not require IANA registration.</t>

</section>
<section anchor="webhooks-optional"><name>Webhooks (optional)</name>

<t>Servers advertising the <spanx style="verb">webhooks</spanx> capability accept registrations at
<spanx style="verb">POST /portcast/v1/webhooks</spanx> with body:</t>

<figure><sourcecode type="json"><![CDATA[
{
  "url": "https://client.example/portcast/hook",
  "events": ["episode.updated", "subscription.added",
             "subscription.removed", "queue.updated"],
  "secret": "<shared secret, >= 32 bytes>"
}
]]></sourcecode></figure>

<t>Webhook deliveries carry <spanx style="verb">X-PortCast-Signature: sha256=&lt;hex&gt;</spanx> computed
over the raw request body with the registration secret as the HMAC
key. Receivers <bcp14>MUST</bcp14> verify the signature and <bcp14>SHOULD</bcp14> respond 2xx within
5 seconds. Servers <bcp14>SHOULD</bcp14> retry failed deliveries with exponential
backoff for at least 24 hours.</t>

<t>Webhooks are an optimisation; the baseline pattern is client-driven
polling with <spanx style="verb">?since=</spanx>.</t>

</section>
<section anchor="capability-fallback"><name>Capability fallback</name>

<t>A client that needs a capability the server does not advertise <bcp14>SHOULD</bcp14>
fall back to <spanx style="verb">GET /portcast/v1/export</spanx> and process the returned
document as a file-mode import. This guarantees a baseline
interoperability floor even for minimal server implementations.</t>

</section>
<section anchor="federation"><name>Federation</name>

<t>PortCast is intentionally federated. Each application exposes its own
endpoint on its own domain; there is no central directory or hub. A
client connecting a new account typically:</t>

<t><list style="numbers" type="1">
  <t>Asks the listener for the application's domain.</t>
  <t>Fetches <spanx style="verb">https://&lt;domain&gt;/.well-known/portcast</spanx>.</t>
  <t>Runs the OAuth dance against the endpoints declared there.</t>
  <t>Begins delta-synchronising.</t>
</list></t>

<t>Servers <bcp14>MUST NOT</bcp14> require registration with any central authority to be
considered conforming.</t>

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

<section anchor="sensitivity-of-the-data"><name>Sensitivity of the data</name>

<t>A PortCast document is a detailed record of personal listening
behaviour: which shows a listener follows, when they started or
finished an episode, which passages they bookmarked, and (when
event-level history is included) the moment-to-moment shape of their
attention. Implementers <bcp14>MUST</bcp14> treat PortCast documents and API
responses as personal data of comparable sensitivity to browser history
or messaging metadata.</t>

</section>
<section anchor="producer-requirements"><name>Producer requirements</name>

<t>Producers:</t>

<t><list style="symbols">
  <t><bcp14>SHOULD</bcp14> let the listener choose whether to include <spanx style="verb">owner</spanx>.</t>
  <t><bcp14>SHOULD</bcp14> let the listener choose whether to include event-level history
(<xref target="playback-events"/>).</t>
  <t><bcp14>SHOULD NOT</bcp14> include device identifiers, IP addresses, geolocation, or
third-party analytics identifiers in any PortCast field, including
inside <spanx style="verb">extensions</spanx>.</t>
  <t><bcp14>MUST NOT</bcp14> embed the listener's account credentials, API keys, OAuth
tokens, or session cookies anywhere in a PortCast document.</t>
  <t><bcp14>SHOULD</bcp14> warn the listener before transmitting a PortCast document to
a third party.</t>
</list></t>

</section>
<section anchor="consumer-requirements"><name>Consumer requirements</name>

<t>Consumers <bcp14>SHOULD</bcp14> treat an imported document as personal data, not as
shareable telemetry. Consumers <bcp14>MUST NOT</bcp14> retransmit a received document
to third parties without explicit listener consent. Consumers <bcp14>SHOULD</bcp14>
make it possible for the listener to delete imported data on demand.</t>

</section>
<section anchor="api-transport-security"><name>Transport and storage (API mode)</name>

<t>In API mode (<xref target="live-sync-api"/>):</t>

<t><list style="symbols">
  <t>Servers <bcp14>MUST</bcp14> require TLS; plain HTTP <bcp14>MUST</bcp14> be refused.</t>
  <t>Credentials <bcp14>MUST NOT</bcp14> appear in URL query strings or path components;
they <bcp14>MUST</bcp14> be carried in HTTP request headers.</t>
  <t>Servers <bcp14>MUST</bcp14> scope OAuth tokens to a single listener account.</t>
  <t>Servers <bcp14>SHOULD</bcp14> support per-client token revocation.</t>
  <t>The <spanx style="verb">portcast.history</spanx> scope <bcp14>SHOULD</bcp14> be requested separately from
<spanx style="verb">portcast.read</spanx>.</t>
</list></t>

</section>
<section anchor="threat-model-and-out-of-scope-risks"><name>Threat model and out-of-scope risks</name>

<t>PortCast does not, in v0.1, define a signing or sealing mechanism: a
document cannot be cryptographically attributed to the producer that
wrote it. Consumers <bcp14>SHOULD</bcp14> treat the source of a document as
out-of-band-authenticated (e.g., the listener manually selected the
file or authorised the OAuth client). Adding a signed manifest is
listed as a future work item.</t>

<t>PortCast does not protect against a malicious application that has
been granted access to a listener's data; access control is the
responsibility of the producing or hosting application, not the
protocol. Consumers <bcp14>SHOULD</bcp14> apply input validation to imported
documents (notably to URL fields and <spanx style="verb">extensions</spanx> content) consistent
with their platform's safe-handling guidance.</t>

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

<t>This document requests four IANA actions.</t>

<section anchor="media-type-registration"><name>Media type registration</name>

<t>IANA is requested to register the following media type per <xref target="RFC6838"/>:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Value</ttcol>
      <c>Type name</c>
      <c>application</c>
      <c>Subtype name</c>
      <c>vnd.portcast+json</c>
      <c>Required parameters</c>
      <c>none</c>
      <c>Optional parameters</c>
      <c>none</c>
      <c>Encoding considerations</c>
      <c>binary; PortCast documents are UTF-8 encoded JSON</c>
      <c>Security considerations</c>
      <c>See <xref target="security-considerations"/> of this document</c>
      <c>Interoperability cons.</c>
      <c>See <xref target="versioning"/> of this document</c>
      <c>Published specification</c>
      <c>This document</c>
      <c>Applications that use it</c>
      <c>Podcast applications, subscription importers and exporters, listener-data synchronisation services</c>
      <c>Fragment identifier</c>
      <c>JSON Pointer syntax <xref target="RFC6901"/></c>
      <c>Restrictions on use</c>
      <c>none</c>
      <c>Provisional registration</c>
      <c>yes (until RFC publication)</c>
      <c>Author / change controller</c>
      <c>The editors of this specification</c>
      <c>Intended usage</c>
      <c>COMMON</c>
</texttable>

<t>The file extension <spanx style="verb">.portcast.json</spanx> is the <bcp14>RECOMMENDED</bcp14> extension; the
<spanx style="verb">+json</spanx> structured-syntax suffix indicates the underlying JSON
serialization.</t>

</section>
<section anchor="well-known-uri-registration"><name>Well-known URI registration</name>

<t>IANA is requested to register a new entry in the "Well-Known URIs"
registry per <xref target="RFC8615"/>:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Value</ttcol>
      <c>URI suffix</c>
      <c>portcast</c>
      <c>Change controller</c>
      <c>The editors of this specification</c>
      <c>Specification document</c>
      <c>This document (<xref target="discovery"/>)</c>
      <c>Related information</c>
      <c>The resource is a JSON object describing a PortCast API endpoint (its base URL, authentication scheme, and capability set)</c>
      <c>Status</c>
      <c>provisional</c>
</texttable>

</section>
<section anchor="oauth-20-scope-registration"><name>OAuth 2.0 scope registration</name>

<t>IANA is requested to register the following OAuth 2.0 scopes per
<xref target="RFC6749"/> and <xref target="RFC8809"/>:</t>

<texttable>
      <ttcol align='left'>Scope name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>portcast.read</c>
      <c>Read subscriptions, episode state (excluding event history), queue, bookmarks, and preferences</c>
      <c>portcast.write</c>
      <c>Create, update, and delete the same entities the <spanx style="verb">portcast.read</spanx> scope grants visibility into</c>
      <c>portcast.history</c>
      <c>Read or write event-level playback history (<xref target="playback-events"/>). <bcp14>MUST</bcp14> be requested separately from <spanx style="verb">portcast.read</spanx></c>
</texttable>

<t>Change controller: the editors of this specification.</t>

</section>
<section anchor="iana-error-codes"><name>PortCast error code registry</name>

<t>This document establishes a new IANA registry titled "PortCast Error
Codes" with the following structure:</t>

<texttable>
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Type / notes</ttcol>
      <c><spanx style="verb">code</spanx></c>
      <c>A short, lowercase, underscore-separated identifier returned in API error responses (<xref target="api-errors"/>)</c>
      <c><spanx style="verb">description</spanx></c>
      <c>A one-sentence summary of when the error is returned</c>
      <c><spanx style="verb">reference</spanx></c>
      <c>The document defining the code</c>
</texttable>

<t>The registration policy is Specification Required <xref target="RFC8126"/>. Initial
contents:</t>

<texttable>
      <ttcol align='left'>Code</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>unauthorized</c>
      <c>The request lacks valid authentication credentials</c>
      <c>This document</c>
      <c>forbidden</c>
      <c>The credentials do not grant access to the resource</c>
      <c>This document</c>
      <c>not_found</c>
      <c>The referenced entity does not exist</c>
      <c>This document</c>
      <c>conflict</c>
      <c>The request conflicts with current server state</c>
      <c>This document</c>
      <c>precondition_failed</c>
      <c>An <spanx style="verb">If-Match</spanx> precondition was not satisfied (<xref target="conditional-updates"/>)</c>
      <c>This document</c>
      <c>invalid_request</c>
      <c>The request body or parameters are malformed</c>
      <c>This document</c>
      <c>unsupported_capability</c>
      <c>The client asked for a capability the server does not advertise</c>
      <c>This document</c>
      <c>rate_limited</c>
      <c>The client has exceeded a server-defined rate limit</c>
      <c>This document</c>
      <c>internal_error</c>
      <c>The server encountered an unexpected error</c>
      <c>This document</c>
</texttable>

</section>
</section>


  </middle>

  <back>


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

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



<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="RFC3339">
  <front>
    <title>Date and Time on the Internet: Timestamps</title>
    <author fullname="G. Klyne" initials="G." surname="Klyne"/>
    <author fullname="C. Newman" initials="C." surname="Newman"/>
    <date month="July" year="2002"/>
    <abstract>
      <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="3339"/>
  <seriesInfo name="DOI" value="10.17487/RFC3339"/>
</reference>
<reference anchor="RFC6749">
  <front>
    <title>The OAuth 2.0 Authorization Framework</title>
    <author fullname="D. Hardt" initials="D." role="editor" surname="Hardt"/>
    <date month="October" year="2012"/>
    <abstract>
      <t>The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. This specification replaces and obsoletes the OAuth 1.0 protocol described in RFC 5849. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6749"/>
  <seriesInfo name="DOI" value="10.17487/RFC6749"/>
</reference>
<reference anchor="RFC6750">
  <front>
    <title>The OAuth 2.0 Authorization Framework: Bearer Token Usage</title>
    <author fullname="M. Jones" initials="M." surname="Jones"/>
    <author fullname="D. Hardt" initials="D." surname="Hardt"/>
    <date month="October" year="2012"/>
    <abstract>
      <t>This specification describes how to use bearer tokens in HTTP requests to access OAuth 2.0 protected resources. Any party in possession of a bearer token (a "bearer") can use it to get access to the associated resources (without demonstrating possession of a cryptographic key). To prevent misuse, bearer tokens need to be protected from disclosure in storage and in transport. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6750"/>
  <seriesInfo name="DOI" value="10.17487/RFC6750"/>
</reference>
<reference anchor="RFC6838">
  <front>
    <title>Media Type Specifications and Registration Procedures</title>
    <author fullname="N. Freed" initials="N." surname="Freed"/>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <author fullname="T. Hansen" initials="T." surname="Hansen"/>
    <date month="January" year="2013"/>
    <abstract>
      <t>This document defines procedures for the specification and registration of media types for use in HTTP, MIME, and other Internet protocols. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="13"/>
  <seriesInfo name="RFC" value="6838"/>
  <seriesInfo name="DOI" value="10.17487/RFC6838"/>
</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="RFC8126">
  <front>
    <title>Guidelines for Writing an IANA Considerations Section in RFCs</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <author fullname="T. Narten" initials="T." surname="Narten"/>
    <date month="June" year="2017"/>
    <abstract>
      <t>Many protocols make use of points of extensibility that use constants to identify various protocol parameters. To ensure that the values in these fields do not have conflicting uses and to promote interoperability, their allocations are often coordinated by a central record keeper. For IETF protocols, that role is filled by the Internet Assigned Numbers Authority (IANA).</t>
      <t>To make assignments in a given registry prudently, guidance describing the conditions under which new values should be assigned, as well as when and how modifications to existing values can be made, is needed. This document defines a framework for the documentation of these guidelines by specification authors, in order to assure that the provided guidance for the IANA Considerations is clear and addresses the various issues that are likely in the operation of a registry.</t>
      <t>This is the third edition of this document; it obsoletes RFC 5226.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="26"/>
  <seriesInfo name="RFC" value="8126"/>
  <seriesInfo name="DOI" value="10.17487/RFC8126"/>
</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>
<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="RFC8615">
  <front>
    <title>Well-Known Uniform Resource Identifiers (URIs)</title>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <date month="May" year="2019"/>
    <abstract>
      <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
      <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8615"/>
  <seriesInfo name="DOI" value="10.17487/RFC8615"/>
</reference>
<reference anchor="RFC8809">
  <front>
    <title>Registries for Web Authentication (WebAuthn)</title>
    <author fullname="J. Hodges" initials="J." surname="Hodges"/>
    <author fullname="G. Mandyam" initials="G." surname="Mandyam"/>
    <author fullname="M. Jones" initials="M." surname="Jones"/>
    <date month="August" year="2020"/>
    <abstract>
      <t>This specification defines IANA registries for W3C Web Authentication (WebAuthn) attestation statement format identifiers and extension identifiers.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8809"/>
  <seriesInfo name="DOI" value="10.17487/RFC8809"/>
</reference>

<reference anchor="PODCAST-NAMESPACE" target="https://podcastindex.org/namespace/1.0#guid">
  <front>
    <title>The 'podcast' Namespace - podcast:guid element</title>
    <author >
      <organization>Podcasting 2.0 Project</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="JSON-SCHEMA-2020-12" target="https://json-schema.org/draft/2020-12/schema">
  <front>
    <title>JSON Schema: A Media Type for Describing JSON Documents (Draft 2020-12)</title>
    <author initials="A." surname="Wright">
      <organization></organization>
    </author>
    <author initials="H." surname="Andrews">
      <organization></organization>
    </author>
    <author initials="B." surname="Hutton">
      <organization></organization>
    </author>
    <author initials="G." surname="Dennis">
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

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



<reference anchor="RFC4846">
  <front>
    <title>Independent Submissions to the RFC Editor</title>
    <author fullname="J. Klensin" initials="J." role="editor" surname="Klensin"/>
    <author fullname="D. Thaler" initials="D." role="editor" surname="Thaler"/>
    <date month="July" year="2007"/>
    <abstract>
      <t>There is a long-standing tradition in the Internet community, predating the Internet Engineering Task Force (IETF) by many years, of use of the RFC Series to publish materials that are not rooted in the IETF standards process and its review and approval mechanisms. These documents, known as "Independent Submissions", serve a number of important functions for the Internet community, both inside and outside of the community of active IETF participants. This document discusses the Independent Submission model and some reasons why it is important. It then describes editorial and processing norms that can be used for Independent Submissions as the community goes forward into new relationships between the IETF community and its primary technical publisher. This memo provides information for the Internet community.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4846"/>
  <seriesInfo name="DOI" value="10.17487/RFC4846"/>
</reference>
<reference anchor="RFC5378">
  <front>
    <title>Rights Contributors Provide to the IETF Trust</title>
    <author fullname="S. Bradner" initials="S." role="editor" surname="Bradner"/>
    <author fullname="J. Contreras" initials="J." role="editor" surname="Contreras"/>
    <date month="November" year="2008"/>
    <abstract>
      <t>The IETF policies about rights in Contributions to the IETF are designed to ensure that such Contributions can be made available to the IETF and Internet communities while permitting the authors to retain as many rights as possible. This memo details the IETF policies on rights in Contributions to the IETF. It also describes the objectives that the policies are designed to meet. This memo obsoletes RFCs 3978 and 4748 and, with BCP 79 and RFC 5377, replaces Section 10 of RFC 2026. 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="78"/>
  <seriesInfo name="RFC" value="5378"/>
  <seriesInfo name="DOI" value="10.17487/RFC5378"/>
</reference>
<reference anchor="RFC5744">
  <front>
    <title>Procedures for Rights Handling in the RFC Independent Submission Stream</title>
    <author fullname="R. Braden" initials="R." surname="Braden"/>
    <author fullname="J. Halpern" initials="J." surname="Halpern"/>
    <date month="December" year="2009"/>
    <abstract>
      <t>This document specifies the procedures by which authors of RFC Independent Submission documents grant the community "incoming" rights for copying and using the text. It also specifies the "outgoing" rights the community grants to readers and users of those documents, and it requests that the IETF Trust manage the outgoing rights to effect this result. This memo provides information for the Internet community.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5744"/>
  <seriesInfo name="DOI" value="10.17487/RFC5744"/>
</reference>
<reference anchor="RFC7033">
  <front>
    <title>WebFinger</title>
    <author fullname="P. Jones" initials="P." surname="Jones"/>
    <author fullname="G. Salgueiro" initials="G." surname="Salgueiro"/>
    <author fullname="M. Jones" initials="M." surname="Jones"/>
    <author fullname="J. Smarr" initials="J." surname="Smarr"/>
    <date month="September" year="2013"/>
    <abstract>
      <t>This specification defines the WebFinger protocol, which can be used to discover information about people or other entities on the Internet using standard HTTP methods. WebFinger discovers information for a URI that might not be usable as a locator otherwise, such as account or email URIs.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7033"/>
  <seriesInfo name="DOI" value="10.17487/RFC7033"/>
</reference>

<reference anchor="OPML2.0" target="http://opml.org/spec2.opml">
  <front>
    <title>OPML 2.0 Specification</title>
    <author initials="D." surname="Winer">
      <organization></organization>
    </author>
    <date year="2007" month="October"/>
  </front>
</reference>


    </references>

</references>


<?line 750?>

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

<t>PortCast builds on a long tradition of attempts to make a listener's
relationship with their podcasts portable. The editors thank
Dave Winer for OPML, which has carried podcast subscriptions across
applications for two decades and which inspired the goal of doing the
same for the rest of a listener's data. The editors also thank the
Podcast Namespace project for <spanx style="verb">&lt;podcast:guid&gt;</spanx>, which makes
cross-application show identity tractable, and the podcast-application
development community for feedback on early drafts.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA6196XbbSJLufzxFXvlHSXUJiNTiRXa5RiXLXZrrRW3J3dPT
p44BEkkKJRDgAKBkjkr9LPMs82Q3vojMRIKLt7JOt4vEkhkZGXtEBsMwDJqs
yfWReh4odV5WzUlSN0fqWP37xds34S9JrVN1VjS6Gl0lxUSrl2U1TRqVFKm6
WBQjdXx+psZlZV5OhrmmD+mIBlGvsrrRha7Ui6RJgmQ4rPTNkZsjSMtRkUxp
5rRKxk3YVNl0licLXYUzegQjhP1+MEoaPSmrxZHKinEZZLPqSDXVvG72+v0n
/b2gbiqdTHE31TNN/xRNUM+H06yus7JoFjPdvZfQ47S82SzPaGh6pA6u9eK2
rNIjWkOoZgI8fy5n05w/0ID1qMpmeF4u0NKvqrLI/jtx13Kz3CC40cVcY7hJ
1lzNh0fqktYWnvPidt36lcppbUD2VdPM6qPdXbvuqKwmuwEtjbD8IcnLgtaw
0HUwyzBoU47kK3+klTVXR2qfvtX0eqXHtb1bL6bt1yCZN1dlxYuk/ytCSi2A
CdLVaZo1ZVXzPdmXDTcJuMQu3H+Ib+ppkuXYIXs1mc3+bYKL0aic8iPzKmuX
3D6I+7Togukru2H8vXt5sjcYPDEf9/f37ceHjw7aj4d9+/Hx/mP78Ul/YD4+
Huw9dB8fHdiPe4d2hMcPB4f24+M+Xz1/++Lk+OIyfHP8+vTi/Pjk9IhBN6yy
dXml1Q+GUn5Qbwhb9SwZ6ZZ8jibzLFU611OiuS15N6kmurPZ/CRo8yNveGGH
2R1E/QcYgN9r9w1/IdB/ZFksKyZqL+qr86r8XY9AUsy1Fye/nr4+Dvf6e/1w
sNcFHQ+oi9EVbRS4/LVOs0RdEpuAi9ULDTofYlx+8EU5mmMJtdp+AS5VZsyd
9Wv6vS6LsObBeUnM2bvmnV25sXZRTIzHkfp7lU2umu7lXyN1XKSVvq2713+J
1K/zpmHu8y7/JaJVFEVGJA+J0aWmg8cHlhYO9x9ZYjl8dGDJ4lF/fx8f356/
fkWY7eAO1xjdFzM9ysZGfqwggvAAwcEIqOnJvcjIkQ3LfkHLzgrDPymJhCPC
cv9ROOgHQRiGKhmSjEtodwMrOlSqx/RGTVKYZJQuZNeHLKszT1bL6nssrPlR
wJvkwa+Xl+cXrQyreR2Q5D0mgml5AwJILDE7yfZDDfgSRUrDl4h1zzyBt67o
E4nrngJXD5PRNY1SZ3isp/5rrue6p4ZleT1Nquu6FwCyGUn8sSbQZyStdKWL
Ea2M1j3Uza2mxXnS20GU+PL7lqRsOaeLakTPVEmual3dZCMdqbNGDedZntaK
FphhCNo3XRHmctID6QJz1hg4K4J3FxdqO2v0VP3l/dkLQgVgev/u1Q7jr7lq
FZtj+GDb5/cdksD0HGlHyDRmfYFQjZJCNoZ2q6IdVgZkotAbwMTYLvStAbFZ
KCcMInVJKFWpYURVC+0RigDROMt1INustm/60UCATQj4lGdK120zP7q3I7BW
el6TfsBoNU0qOzwtU51HQn/TLE1pluAB7ICqTOcjJvvg2KeLSuey1qtsxqsD
eFllN4w39PYqG12p+qq8ZeAXBHiel7c9ukHbzpcUEc9sxmQMip0XROdZfUUX
9CyrCageL3uU0yw8hKUleoLWsrd/1D/AVKN5RYTU5AuC8YZwRYxGqBUI9A0p
NI+AZKArukLE1pSK0BGpC1rD6Io3xiM1WiYp5aqpLeq8RY8r0m//TVsciaC4
uzMy5P6e6CK/MTvmMw7RRQ1+INoFUIuGJ9R5DcJaZR9SkERW/CJB0eg1DOWY
KfCYaUcRAeUlES69yRPRnk4qBp32eBN9WWnTgySoSrI1ypwwWNZaTUpiMnqr
ZkI/UklgSUFd/Pr2/asXxLyKbUHCZ66TG/pWLNZxr5BrVWV4hKwzeqokNHU3
yNJTF+FNuUxjxGIkJ6M1clK0mVuk5RiwD9N6j7bL3g1HZDcmkMj398QWVTmf
XNFt/ZEWCJuyvr/fWRapSkQq8xb+4TGDuztQXwgODJNZhveYbvRH2lRLD+A5
ZnrgHOI3K0aVCI88WGJeCAPC6W3JExD+r8icpdXVRDe5z7pPlVsa7RMzdyt/
hlkOETPOS5pNAGKioHUDMaDBrgCD/ArGSZ4rpsimjDxdlDHesQIggjjOiR6G
tgIAqiidbE6zikwVqIig0hMiGygLAkR0IwEWqdOE5IRPABZhGW1yeUvfi3RW
0qxE0IG9lpZkZRY81IyllPc8kFEL8rRYsqoc09IJNbWvy8Fi06wBaRVlo0Ra
i3ReVi0kDx/AXMomBbMDmRuDSP34o3V6QpqXUPDjjzyrozzChYEuVcMFUwDJ
m0oUL32DEYALkXpTKtINKV3Oy9F1iKURFunlWZVpEkKLjj6r9H/NCbFpFOwB
irN2s4kMrFYBNO+Jfdlm+Iw2JDg2K0TCCniUaAd6ravCWs2FMc6WNOHr43+o
JE0N52JvfDgg9dsB2P51bKeGwEMU7DOWy7qmLa1ZNGQswo3OoiUe+5QM0qka
ouBZM6/YLfJlLd5zss1IC5ib5japaNYbbnjaatYmGCZuJUIMzU90Q7KiSOHJ
zsDcIjmWbQFmuJQJjDebDJuKPT0aIAoOsLpzUjEZ0RpfbKUB1nbKnGqMhBEE
p5iB8XwG0zE9buKALdYpNNV01gNkZA7MsfoVW4CWznIC9gnLVFpikwinYBhY
FCJJjMTMah6MJEFdJDNS5Y2oLyColT4QOUotzxaOCdgizRdRcIhV/jqfJkUI
wgORysZ9Qo0w0VqbhymFF0qbYHia0UWypZzQjND1gJcUWrIgoIelQDmNgoeY
/G+EdIJpDYemepSTVBXh4WjjRp5/ijnXWXeFnpS0Z2TaDfVVcpOV8woiQl1q
kGGZl5MFw2coMyG9zBLknfCt+Fg5We3zZKKhk7W6JnMIcYlabb1+f3G51ZP/
qjdv+fO707++P3t3+gKfL349fvXKfQjME4LD9lP75snb169P37yQl+mq6lwK
tohLt8Rt2Hp7fnn29s3xqy3FbOabCtA9tDFDo1tIeMDeTOogFS9SzLhfTs7/
938GB6RB/49x58kgki9wx+kLmX+FzFYWpD/kKxtlsMmSijebSI54OCM2ICsn
qdmMLBT0C+H5x38CM78dqWfD0Wxw8NxcwII7Fy3OOhcZZ6tXVl4WJK65tGYa
h83O9SVMd+E9/kfnu8W7d/HZzznJJxUOHv/8PDD6BxKLqL7MEeI5JsI22qUi
soaBVo6bW94ncMMtqVe2hloDye4lsQ80G43i7sGOIT6YEYmTUJTRiXxremHt
6ODkjYOPaAPpZmf0dkwrrD3gef8YYBrSjcQT3SR5BmFH401I5dcN2zdeYIP4
dj7MxW8wtiOg9TU9CfnO1IG3Mp46GY30rGGz9TOz02UyTgKJbtRCyJb6CCkI
zPhLGOpRMocSHpPsd+IqBbvXgfFTINB97VIOeZTtJSuUJYwN0Shntqq7B2ts
WSB7dWtYoBvzkTFoprq7MzGy+/seqZsRiXVwc/D+8mX4WLUe93BBG0RCimaF
B9JrbXVx7ljJlrMwJ6Wbw16d6aMg+Ne//qUQKwruSJ5u2bDn1pHaIoUT9UkE
0eUJFIHoNNzZ6+89DPuH4d7Dy8HBUb9P//vPzoNlRY/dqS3YD3ihjUxCyhkB
jhv70UE02FL3/DLMNPNimtV4/o15/9/JnoWFg7c5rImLsM3+TX9MoAIQsbTD
dOIh9OA/1W983bituMR/9jp7bvaid925cuaeve65c3znzszb0oO8QNeDe+A3
CP5QLzOdp6r9+8Oqm5Q+vilBw1//9wcNHHb/VHtFrdz80j8eOLa0EFuIFxbI
P9QF7QIZPqPwxipv8oMrojCx7M1Va9kzv0cW4tijpnh5YCJ1heCyUD0+kVZy
JhTUz/vLk2g9KmJHffEqxOcsz5aiCJ7Fu2bMdmCmzNjbPDL/7ce31u90BpOz
8c2kMKeNesp1wz5FDXcVNm0kE3RoNu5CflxVyQKojC+8p+KIDXjS+Ho6w1zr
IbdEv24T24FP5akLhDK+cGDmmk0ogRDSHEwwE/wVT5+R/xJvwrMb2LGd3URv
4BbiX8xTnxyvO7DHt/HywPG5f1ME75eMLDj21MPywC4+mXruE5vnKxpkaWA2
PNnAbl9sTfE4chkqSO/YBUbPjt8cqymnEpBxC7xXPMLfvSlSN8L/lRG2a62J
7bKkSKCroP0kMOX025kNibJrEQTueyYBlCuyEBtsTyfGamIc1n6P2rSj4766
DbuQWkdQhZVULa69jfVavoL67PKCKHn4YAsMkOuEI2zQ7KTiQhXDX35f5TEC
khy1TApyhsgSYs+ajKLjppzCoRaRpdmmjfCmiWj9ZZ6l7u2V4LOKn/nR5+cx
TJM5/La7u5X8lTGzRTNzsN1YSIiM2yCzYBSZw4bctol2y4eskpSv21ghbDAc
j0vOoQmXjiryzWkMP27Kll4n8mkGIu82n5PBMyzJauCB+BNHtW5I5bJnGLQS
jcMHObm0gnYXSwqtcdcJJ2zraBL1ONmrA4M/MtAsJs+QetsRD7y7t5E3SvRj
/BRoIZONwAqS9IbEViXeHIJENvIiqRODBqEhI+F8GiqW5N5niWji0wDoJn6G
kMzzZ/6eq223HTtMQCRT8rIml9+nP2FQ0Bti1TSQe0rNq/ynrSiKtp7HBPpZ
Y2zgFtNJV12802PiXZ1xGKhLrmUVOMo38U7GilCaJXVrgP5QL+mhf/4WBwi1
ZQjEnI3JsZZJEouKgj395SUS6V4XpDFhfttcQcBRcqYZGNwJouYIJsTbS0vp
tf7CcdOTdN9OrJo50U0vQHzDegc1k2Zn28kD5vUhnIcIDoksn5TqZWvXn/ss
ZZt38Ot//OM/gX026QzycMfmVT2Dcxe3o4/TXB72UI8Xngwe7T/Z1/vhYDjQ
4eFIj0OSFAehTpPk8EAPxo8HxrrmReKVUxnbcoXclWAsW8EJbdqLUsv1bJpM
9CeAG5VkhUW/zyZbvlU89Gz4g7BPZvzgsv/kiM14Y8PPi6Vni3meC6DJhA3q
rUaPrmCL32p9nS9CsXy2xDymHXGuXX1aYJuBj6aaa4G75WfY+pxq3YKE0lYs
yFYMDvvmj8FqEcyyQp55std/+PAhEuBigrvI20YvxVrkcXeVTLU1GWdOMjtr
7goRDpMK8xwpEs7QES7kZv1lejbLc/K9WKATRRK93uiFScayyoEjSDo9Ck4c
KYMxyOchBk+VD5ky/Mc50ykUdqRibEPMEnBcaR3Cbe45eEMW9vQmCWyjQZ3w
YyZcZgLtycC1TLDEoeKgbSJ2vGU2Y2LurSNOPds92JPhfeGx6fFknmYlvXSw
F01n+8tcY1ZnB/QESIcM+pf9Rx1nNZ2LfXNBnn+Rghr39x4/6gW8aELHHJe2
suID7e2k0nVt+VyygO1rg72Dw2hPbpLXelLOC0w94CsmVbjMS+OsqhuuQ1qG
c+9y8Pho34MzTzY8eXjZf3w0GLRPSorEnwY50ooZcEwqRDjwKkuJB9tLvAvI
HDBzM6/RDsN6xGxYEfE68egnwFyHlb7QQXcwxFvw+OpgT476h0eDvQ2D7Q0G
e+RPK/jgmzndR4jldFL+spmin2t4439jTe1sbfVaJ1wx8dV/Kx74tzvdxuue
FxwoSY0r8coXQwXnyzntDW0HO9Fw76qvwoN5tBv7g9khILzSTIwnSe+vd3p4
MEfIcReySiejKy3eh0bkWOJPOrVZcr3s2tBgSUXG2c3qMvVHmKoZygVIHqJ0
0AQOEeNypS2RN1gQL1ELy3IbXhaBHgsF8J0uUlpLOiBLGjUDgL+cZg3ww/lv
EuV6jSuPeGGF+o56ioh4U+bk6yCXsA3r00gvsmAIPY3Nb5ndQtDcYVNl467C
MfgMTD5tv0+KiRdmDTZC8o7xjGxlgrCvuntgaxVCuXIvbmQs32LjkRMWbEzb
ZHj5PtMYGXdg1lgMU3aFdBPcxRg47pGBCQ7GB/IWr/FfuxC+NiOL6IOUPOG7
9eXjeyA6SJomYevTJoMxE2lVxMZqH8VQh9YfSdhb0c3T1vIL+P6EzE9tV84V
K5LK8/J4/phesk+hiOs64FdNONTUSnECCbvfogzWSqXzBXseXgBVoA62V8gP
SLJaAF988U1mOKxWsRHq+ZgMpQylsEwyyCemtD1bUoQDxjwzJRvleLylZlzV
y940q3UOqiyrcxvNdHLcgscKyal7p8g/r6WtGIcKIMWxRuY+cWqVFE45r0Ys
66dJMU/yLU8LeKDsrQFlkyVANgV0/z7r/i+CZrAKDZnR5ZZoEGcDWnhYLgxM
1Z7LGZA8mBcZ4dPPbDN6yQaTgfFia4RZJzeWlWPvMSszBnFBE4IswOZHr8uK
9c1JOZ3OiXUkvGJjWit+imWjtebZt24oqWDPgtl/fBD1jT2WetcP9gbRobFC
yJ7EwH+BRCNElMgHcTKXoxgcI0Xmesu6AYz3v/JzplSL3vuBM+ljtSjnYLYf
iBmTa43sMKcr6DKt7AcZY4SZ1it5lJc5h2WzLWAeczveLi72peBTk2FGycWI
bflpKek5i3pY8on6EdVuP/JmeQHDlSRKJ0FgPJxJXg6T3H03piJE9buEMTUQ
C5Jv1dfZ7GVZ3ZI74Bmn/c79X+jV7gODQ/cAarkvshwweL4X36IV1c3fyozv
sAXId+6tk6Wrl5oNRgfoF3my7fPrluZAN8Bz+WIL+ZPl+2/nnfsP/fvgqRdE
bXmZMKFL6X64v2UeuQ/sv/ctp8uqYk7tsQjuRkrYSnBhrl6r+NvQYRSc2+pY
MSQVHOwKOcJYNjcWZ8sFdUkdexFeRJxWalmWc6GmRlLiYOtTjz0ckpCSpQoq
o9bhizcXbamOn9Pr5qTujDsSeZX+QHbH7DfixDp2LGZkT0hVv4Ni58f/Odij
TVUHj6LD336zhjncmmkEtHBgWoQe2wQimowdc0EaDVcGj0m6tJvkecMQv8yN
1Y1ewkHhVfaw8jf2k9X+gVfFk6zU7tL/uBjlWusZ2Hs6z5ss9DNCv5NgL/Qi
yE1ZE++pKVHB3t09uHFf7lmH2CyZ5G83J8bc+jiauDGzLWWd3rjT5HeyDmxK
TUpz5zOOBWAcMoVIDCwFLYSeFepd2ldR/KdvbbEYV3X4RU+RhQrJ8hrCg63w
qpwZW6djZLl0+dN2p1DUY4f0ty36MC84JBhjswpNgrFOKjFiXqHctLbHl7ga
GkFSPuKwQ9julm16WRFTBpWaugvSRDSQKbw2+Yj1dZZRwJNkpoLa1u6bLJ4t
GT1aLQntmeLHlDnflu6XKIFmG5RLt1yhlfbrxVBL4xL1KNoKKh1KPZxkTG/J
xlQzMg9KVG5khYNDisIZGC4BM7UNT5Fkot0MTAaG0/ki2dzCUo71ezUdsu5u
PSmb0vaS8qpwXe0swshIBRAFm4UK7dagZtACy7ShXhBvC3clUsBCEiylf5us
lkI96FgEuUounHMEv313566aTNMD9dbVe3J5LZz218DGH+qSvKyaCwk/8/cH
F1iirvtzT9oXjDP/FT78V7v7PMlLYJnBq0KwMsfrVjJ6/kreFsQEV8R2rlq8
p8SFTvKeEnsTXk1Rk+UhK8H+0ZtCpbZKlwOJoCVP5OEoCRfssh9uudEe+UAy
DqU1RMPgMr8Cn3zvl15p8ydY7siUNRNMIT9t6MN43i39ubxL/JfTS+VO4e3e
DHaFW+KeObtQ6YYEdVu4HbS1cDZrykRyW87z1EZnTamwo8G7By3ldYpyOvDZ
lARKh1bJN2mCeDe61XkesozbbSW3VO48HBze33+m0mbPVtrAB1lnvRPifWy0
qYHWwrQxthKX92zQ3NRyyxnBU0MGm2bgV3ftK9qO0ZTX+gvf5Ufte4SrmZgL
brkRStMkxGcucGFZ54rxxbd+c3H9UTITesp0a6xsyQ67yfxMj5ume9XMZV43
pRHuWXeh85h4fPYZ+dZ5wBUsuIfaK50HPb+gRYN3rQudBGTpESkElnTL8IqG
rrc6XqyPHGOFjMkmNnYHwjeosMOEIRd1GtpGlKNW8Y8yrZfpO7ZPmIiJrtuY
CR9qMcEiEzEx45hwSRRseL3lcV7PSv2zGUYWG/NpNKtX/eMO5Gua7DaXPo9K
Eksjm9h+0LHUTI1vw+WCKIUITp0UhFVh7ZSOlCF7NxaNHN8MYivVWBfCDAus
LcVebN05EGcrBzr2vH3elDKn5vhTYFV9pC4YW0apIgUVnwjQ4SWfmP501UYA
g9hWhj51KDOCq9ZsBbuKgPiYDc4YlRq09iiwTmQdIoxHkyApm6RpJhJ+G6cI
nGkkVmCPjxY4olsEQmf1Tms8DufTWRdvFg+yScckKWC3mFObwcrJBAzEhZlt
9v0tXuIjnyxVceoY9ZAcNBA5g8PrOGDCCfWOvInBU3FX4nCYbkni2J1fuS4z
0CAs/GvlRw7d6TBb1bMcgjVHlLgQv5GIBgLAU0Qva1jIOBQrNjlJ/2zErApj
/BdNFEN8BJFqV33Yx6qJJvjwCXLqY64Xzsch+Q0cs65MEWmIQjOakyg0Lxdc
1k7oPyEiBO7J8W83rC3uRkkCybhqYcTHMoFKEW2AlLvGOS/gAyigV2FpmGIL
y2dstmnSJqhyPE9oqz5vhKlfynShdtU7o+D/9F+bo/lSa+1PJHE+ZfbBpOEV
xusMmzWYeAkRt1oovP1Texpk52sxcf724nINEJJcXgcEtuNIpC3Oc5nzMCtQ
PbVifz6jD0QZmvMK4p0sA7EBE0tVkB4Q8Z1aOuZMioLPX9Y/91iXSL1IQU7n
ybyqy+pndb+6mq8GYveO9LMMRBb1ctXZn/zj7Xj/lUDIdnw/QADEi9NXp5en
XwHE+7ZE4U/ioAViE3d0C1jbV0AT9uafJQcHxAbu2AyE2Y4WFLJOyYb4jaZ7
aljhu6FiqeS2iwq++flFfjkQGyhzMxAOFRaUp6QtSDXw6c9CJMhXQ7EBFUtF
wh4UNL93BvvPk8UnqGIzEAYVrkj569a9HogNTOqA2L1r00T3yPZ/779PbMdS
aXX7ylJh9fcBYgNlbgbCbMd3AwVFB0YcEmF3imnJhr6y1bswpkJ7YGc13xCY
Ksk217Dyjss9dI0wEzaWckzuORHZGi8XAvROgcP9IpseBQ+SNwCQ7vDTu4uL
AIeKaxfZbePro1wncBntAVpYhwycq6t94Zw5BPCtM+bFm7aXzjb0vDMJPb/a
X/yHwKwt/pmM2JH+6Zk7EOIOgTyP2yq91TgjCvOsF+l5KWLZW08JTxX2lFYt
Zx1dBToH4IP2FK96rhiWGN0XYidR4vZ4A1o7sR3uxqj0lCzjNOAXxRP2zgFL
biK2Ain2DriYlhrcYAUuE9nYgTmPzmJLdodwbwnCVaNgKU7ekdMwHZLvUphG
Bi6utt8nP2VRu1huwLBdocZgiHBfOR7zycYcRecuAGZLE+Wo+EjqfVr4be8Y
ToKbQ8kz+scUqSSTrDCeXuuBm2rkhQnkqRxte3x/3iY50ECEJLVk58lvtoMt
7ag9gB23wt3QCTta9B5OGXwkhD4NfCQnNagm/llm+ekZ5/aIxGyoocU8hiC8
8XPMZkE5S1Ae4DylWOiE9zceGRjMYRryr4dIVAhOyMUXH5tMaSE0ZAtH7dXQ
XL0Pgr/LUVGzFWDZ+GwcvoZPf6SeOTIlmLHT8NantEryI2k4ab4yWkTBkhcH
rBGQB4M9ZLLdxOplQk5FGtuiJHqQCx1+qAPTx8U/3r6aUVIunM14NFm3WWWr
dG7LwGVL8nI41ByiYleBxeAPtWuy4vBiItaSijHlbuJmVhV24u5BMstCzV8I
XeYqxCBOUZoQAZxTWwdI7MpEZoqyRjnRwEp8lsdrg6sQyIh8+sLsA0nLD2Pw
ow3aTZHYmvCDb8quYpDC+1R5auCnTtWsGaL6sgpbP7t9yXH3jP0yBJBwPgrw
xjZRnWHN6O+hJQIVmFM+vMYQj9b3956OQTEyp9VcKIirltM2Mx34qWco3uyj
q35BhtkGhlElknzQH0ekyIisdshLnI+uAummEcqLXCiIsV1mkcv55SST6Uti
G+TQrv/dBEHVtg1M7bTS0CoCu7exDZn6usDqT3/smuP4bOh1jIr2fSajISyJ
ZVKZd8uVhMAtCtrRMI4p2XHFtjbmHBmmWg5ZR1zjtNVWP/Bf9xGja9rotB1L
MvK1HpGIBYDPuEdNquRKTz3/Se3v8bHh+rkrkTHohSbJCJcQqXLsJP6P0Dr9
4UU2ISE8r/QREo97hw9/enalP5IEQhRxTnMHpUSASYIkt8pEixh7fgehFv0G
JsTFcOvX18cnKHOI1Ds90lkruADRWHq11BYG/zSUFWx7Hz+aqq3g0JZPtgTe
6kxa15glnr9ehhBRmUICZQGieaQYu5p070BdkWxETM2RJB+WKqwM5pVJ2SCU
F+tVMr2ICzkXL3QSpmi4VAQz0nygWp7cWj+x0RYt6SIWDnA4sysqjDVpQQyG
yL9H5Z595KLwzlCyqbdObH1j0o1RPKtKJO7N3kFp0z63abDaJN4kwWcPK7D8
n8yTKiGTVCqqDCqCDV2QuKaDD3CRTJuaNj84VdsNEgtmXmp7SPEL2yB9rp9R
4PUzUt1+RryTm3soITp2NR9G6tioOOjfwugZ6cdDcgdFochG4CBIDlEyoBfq
67pbvmEtvnVZWm4r9FLLMa7YCp1ncvP5+kwkt+p5NzfpUgmlpyhW9honaM9o
d9mKRrp6HETqF+LWopbkTdgmb8QR6BgX0mtBZHiHx5m0Ueticef6TEnvksCe
OtWpV7Ugx7g0mR/cZ6dzMJV0f23uLB9ZZfK4MOF1vGlPu6EB7ub+CynsaMgD
U95Nb8EO9w54o0OFayxz1Omkl/g7iJNCdc+5KgtXdF+Sy2Zb6bUn5GxeGwYp
26r8TttTT7yGbXYc1xUuM9FzxXS6Y5okcdeJpgzlk5SIGDRkFYqxhUWitjOU
20POU6ziqGYgjs/PApdzAuM7DHEKhGbgZJI0vKq9LcAuV4QVHGcQsAPwORtN
XOpByMcQxm+wJ6oqrzFP0J5A5bSQd66+w0EjEsjceUhLe6zS1ZObw/zRN728
BvOkY9cmfbwJwBF2hFSjZ5l/Nranzs6df07fJrrMy5Ep8uB2zqTHqjRE6B1n
XZN8QdZ9vdKtixjLbRin6npmUlCssn0X/Wq6TsWXng7NIQ6vl6SVWKM2aySV
Qaij7IkkAYBIUdU9aV3D3Z6JBMpraYi1kHJ2bii2QlEellar2IZ6DN+N61pw
IkMk6SrnNiUOOQuaOEOxcF4WV9wtUVBbaGhmFmpP7BE7WAOeWutQd0/UaB2w
LSUNsbi3MJkSXomfLwkt+ARhJdZMO37AnRMt2Nb4QJmYPQjjUSX4jTCmluEP
pqaCmjRZzRlcqz/cuzQNhwa0t0TmVYQMplz8B4S1tVXgc5A3iaK2jeKO8bUa
+1hopS+J2zOvZm17td2icGvXCRUdcfnq4qmXQnTF9+QckLPLmdCvTVpKpoq0
DQQRm3H1U+YjEql2eAkYcF8sntYaqZIar6NlcDkFbHSn0LvUhJuOPQ7VhmX8
92023gQ0UENhbTfO7ZIzZRgeb30qBe2d+jfwsj0PYUtkuJDOp2o5/W0294rJ
XNrCcYuveROW41AGrrIaBw885hKTEUKE04095xOy6c11zGD3JBfRjVM/WT1F
B1LHPaOkALsA29Vi1pSTKpldielDhjTt1XDeyLntzhFaWLTBbYWDA9kaejf8
yvYtRye45YTPs4FZ2pCWGSZttQHNZbzUDndI/RyXxiAwIGIw4CqythtmbaSj
UIDs3w4Zb2kqYglIoUdorGzM7Rpq6cSaGtNY2v7dltW1QteAaA2uuUcG96gy
VhlKNyAFynm91CaXg3Z1wDG7CRvXKbu1taHKpT7RT+1NxDyrMrf9JYwaz4wF
bmykmeuVA5u2lObm3vwiBPF+29RjZZPwPJklBfmDtlGXBCadCApas2KbBiRh
yiYCd0WQgmMOpPnl36aeZ0fsQCyxCfwWx3nSwGykVdfJWIdEkimTJw7FwN6V
NiYILKwYkuv6nix35HVlD2OiOxkn8auPXru+Kx3Ll4QjHs1qj2lpoTYms9Sj
q23eAklhCj8e7z/mIsLVTlLdVEf3ZOsXZjM+We7wTcUQPCi3skcF/lpIfXr+
Ckgv5sNm07h/qJUCqS8b1PXigiAlXQ4ybgctUIb0dX8Y1DWG+p6DnprsyzL9
yqDDrEiqxdO1hjsJH+kYZ7NL3GNOcLrBu5JBL7gt0CY/6941+XJcIoOeLbv3
eDFSnUG9oxRrx1lZ/rlrJtgts5NBLz/1+mac+r9AIqIVQfaskUHP1/S573Vj
u0agVSKwJGbChr1rysDG1nLJo+lfXEtNOJla4oa2bX5aauG9Oi85ZIJxmuSj
EQxP+gPC3YaVvdMwiEw+BSH12j/1/o0kSA7YTVYLaXf8e2X7i22T/ZPl3MuN
S6cFaxtLlXgPWMmqXWV+L8HoqZyr2dd1i15DACuDggQLkPocLvXSfYXmn+CA
r1r+uq5cK5X7Jv3r9Rdtn34qGUrTc4twNx/BMEhDs6t8KPgjCkvZYJGROOqe
L+xvgQREOWQLm6JuGxa3YR9SoGdfpX4kOIWYzEKZY65bPNz/s8PVW65BeKuT
XGH7Rp30TerIbt531EZOIwEzBsFdOO0GfgOcJ6sEK2N+A9G6QTs/a9KKtGUR
t3R05jOQvkPLfvZ4zG+xWJ699DJ9Egbz+4+m7Q/ReM43fD0XK91GpBSBXRhv
PZV06nvlyJKWAJYXn6412XG8WEnLrYAMO9RJmq/aFT5B5AqGjYPzzQbZ0kgc
EQi8KmRemLDE4/4TwxIXPGnHSvnD/KbP7GtsnuVN/I4s0WGNjsdo4X2Hz0uF
l9pvJkTu1EcTYlKdYwE7634RQ7II7S/LdOaVBsMy7wmXSfdMClheNPGLlVN5
kufrOrxmy9kxqhVoyNAcEWvZndbGT91ySQsJKGuLvO3j60N+Xuxig3O+AikR
64oEkbOHn5QdtjOi4UbO5HIaVTlBbVwaP8m77M9obsMmrapEC/hJ14W0X0vV
lpuHk+vBCbfRXddf2OmzNWrBOAS7cB6/qd3teh74PsXatsVN2tY2ouC3JqOk
ITuuvOUzzSBJPi87Kisd2q1NfZvNZsbsGU7ZmTZcToTjlSvciwSMU+1V82Li
Egf+EJFHkoYc6yl+ZYIowVU+ybgswcyEaxAVO2aLlRX0Xnd9pCFsEQRI5ws3
ILhczt7OSjLyOAfRVVzOrxLpONh7iDqDM6lVCIwzXzOtnGwC4E9LzXagdxYb
DkGbyeE7nQBYHohnnRfuiF26BKKgViKROQmXWmInyyrVi8dvWGuX0TErKf0h
d/5a97DuDGkqMVh+emElvyLoS2d1NTLrZ3UEmtqzAi4YxsVaX7Svq7MifUgk
ufp6F8P2MZPztyVOJuMsGu4rZp15lVQfTF2BeRjdRm3VVtx5UN0msl54hfUY
IWmSEetKwSAs1syaFUwiH+yiNqyViy/kBIeNRiAmME1yWIOr8uMza0WXwpnE
8T54Rp2jJolvJ/W1acf6FaUJn5gV4vZDnk2zZi3nmFnRx8rWHLnD6KHtFMC/
+sZjfOla2e2mnfggQnd5VrMSxFXmhdRY8Q+m6Y8ziSYvv/Yls/LvvUmlxwN1
PIJnR+Q0kRTW3VExnw4x009b3MJl694LJ7c/s5dwHScSaIbWEChvGjT2rqVb
6rXuBIuDz/543Mz8tGz3J5xQ/3cdvEAZKf+AIm85fnTNprWxJTbjYn97rGNY
2m7FnRPmnMe6Re5qlHBtM3cYwHhZUc8yU6Egv4FGS0tL15oTFqLNguGX4iRF
sBQV766BW+zyQniI1SbPM/lpTx53ueGzXScwWge8lE5bEe4V6n5SkH9EUjrN
2L7dZjj/pSCF7VnOzE9KTKfzgstkaHoUhrM9igqWpOI+HckYB/z+P1VoL1VH
eAAA

-->

</rfc>

