You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by gi...@apache.org on 2020/06/17 00:02:05 UTC

[beam] branch asf-site updated: Publishing website 2020/06/17 00:01:54 at commit ca0611a

This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/beam.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 36c2c72  Publishing website 2020/06/17 00:01:54 at commit ca0611a
36c2c72 is described below

commit 36c2c72f7a6355134fcfd6d64dbe27a5ef57111e
Author: jenkins <us...@infra.apache.org>
AuthorDate: Wed Jun 17 00:01:55 2020 +0000

    Publishing website 2020/06/17 00:01:54 at commit ca0611a
---
 .../blog/2020/06/01/beam-katas-kotlin-release.html |    1 +
 .../blog/beam-katas-kotlin-release/index.html      |   21 +
 website/generated-content/blog/index.html          |    4 +-
 website/generated-content/blog/index.xml           | 1184 +-------------------
 .../generated-content/categories/blog/index.xml    |   40 +-
 website/generated-content/documentation/index.xml  |   71 +-
 .../documentation/programming-guide/index.html     |   68 +-
 website/generated-content/feed.xml                 |  103 +-
 .../beam-katas-kotlin-release/beam-and-kotlin.png  |  Bin 0 -> 81087 bytes
 .../beam-katas-in-edutools.png                     |  Bin 0 -> 46768 bytes
 website/generated-content/index.html               |    2 +-
 website/generated-content/sitemap.xml              |    2 +-
 12 files changed, 225 insertions(+), 1271 deletions(-)

diff --git a/website/generated-content/blog/2020/06/01/beam-katas-kotlin-release.html b/website/generated-content/blog/2020/06/01/beam-katas-kotlin-release.html
new file mode 100644
index 0000000..4a868aa
--- /dev/null
+++ b/website/generated-content/blog/2020/06/01/beam-katas-kotlin-release.html
@@ -0,0 +1 @@
+<!doctype html><html><head><title>/blog/beam-katas-kotlin-release/</title><link rel=canonical href=/blog/beam-katas-kotlin-release/><meta name=robots content="noindex"><meta charset=utf-8><meta http-equiv=refresh content="0; url=/blog/beam-katas-kotlin-release/"></head></html>
\ No newline at end of file
diff --git a/website/generated-content/blog/beam-katas-kotlin-release/index.html b/website/generated-content/blog/beam-katas-kotlin-release/index.html
new file mode 100644
index 0000000..b7ba8f4
--- /dev/null
+++ b/website/generated-content/blog/beam-katas-kotlin-release/index.html
@@ -0,0 +1,21 @@
+<!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><title>Announcing Beam Katas for Kotlin</title><meta name=description content="Apache Beam is an open source, unified model and set of language-specific SDKs for defining and executing data processing workflows, and also data ingestion and integration flows, supporting Enterprise Integration Patterns (EIPs)  [...]
+<span class=sr-only>Toggle navigation</span>
+<span class=icon-bar></span><span class=icon-bar></span><span class=icon-bar></span></button>
+<a href=/ class=navbar-brand><img alt=Brand style=height:25px src=/images/beam_logo_navbar.png></a></div><div class="navbar-mask closed"></div><div id=navbar class="navbar-container closed"><ul class="nav navbar-nav"><li><a href=/get-started/beam-overview/>Get Started</a></li><li><a href=/documentation/>Documentation</a></li><li><a href=/documentation/sdks/java/>Languages</a></li><li><a href=/documentation/runners/capability-matrix/>RUNNERS</a></li><li><a href=/roadmap/>Roadmap</a></li>< [...]
+•
+Rion Williams [<a href=https://twitter.com/rionmonster>@rionmonster</a>]</p></header><div class=post-content itemprop=articleBody><p>Today, we are happy to announce a new addition to the Beam Katas family: Kotlin!</p><p><img src=/images/blog/beam-katas-kotlin-release/beam-and-kotlin.png alt="Apache Beam and Kotlin Shaking Hands" height=330 width=800></p><p>You may remember <a href=https://beam.apache.org/blog/beam-kata-release>a post from last year</a> that informed everyone of the wonde [...]
+for learning more about writing Apache Beam applications, working with its various APIs and programming model
+hands-on, all from the comfort of your favorite IDEs. As of today, you can now work through all of the progressive
+exercises to learn about the fundamentals of Beam in Kotlin.</p><p><a href=https://kotlinlang.org>Kotlin</a> is a modern, open-source, statically typed language that targets the JVM. It is most commonly used by
+Android developers, however it has recently risen in popularity due to its extensive feature set that enables
+more concise and cleaner code than Java, without sacrificing performance or type safety. It recently was <a href=https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-languages-loved>ranked
+as one of the most beloved programming languages in the annual Stack Overflow Developer Survey</a>, so don&rsquo;t take
+just our word for it.</p><p>The relationship between Apache Beam and Kotlin isn&rsquo;t a new one. You can find examples scattered across the web
+of engineering teams embracing the two technologies including <a href=https://beam.apache.org/blog/beam-kotlin/>a series of samples announced on this very blog</a>.
+If you are new to Beam or are an experienced veteran looking for a change of pace, we&rsquo;d encourage you to give
+Kotlin a try.</p><p>You can find the Kotlin and the other excellent Beam Katas below (or by just searching for &ldquo;Beam Katas&rdquo; within
+<a href="https://www.jetbrains.com/education/download/#section=idea">IntelliJ</a> or <a href="https://www.jetbrains.com/education/download/#section=pycharm-edu">PyCharm</a> through <a href=https://plugins.jetbrains.com/plugin/10081-edutools>the EduTools plugin</a>):</p><ul><li><a href=https://stepik.org/course/72488><strong>Kotlin</strong></a></li><li><a href=https://stepik.org/course/54530><strong>Java</strong></a></li><li><a href=https://stepik.org/course/54532><strong>Python</strong>< [...]
+and his support during the review process and making this effort a reality.</p><p><br></p><p><img src=/images/blog/beam-katas-kotlin-release/beam-katas-in-edutools.png alt="Access Beam Katas Kotlin through a JetBrains Educational Product" height=252 width=800></p></div></article></div><footer class=footer><div class=footer__contained><div class=footer__cols><div class=footer__cols__col><div class=footer__cols__col__logo><img src=/images/beam_logo_circle.svg class=footer__logo alt="Beam l [...]
+<a href=http://www.apache.org>The Apache Software Foundation</a>
+| <a href=/privacy_policy>Privacy Policy</a>
+| <a href=/feed.xml>RSS Feed</a><br><br>Apache Beam, Apache, Beam, the Beam logo, and the Apache feather logo are either registered trademarks or trademarks of The Apache Software Foundation. All other products or name brands are trademarks of their respective holders, including The Apache Software Foundation.</div></footer></body></html>
\ No newline at end of file
diff --git a/website/generated-content/blog/index.html b/website/generated-content/blog/index.html
index 88bcb33..2605f6c 100644
--- a/website/generated-content/blog/index.html
+++ b/website/generated-content/blog/index.html
@@ -3,7 +3,9 @@
 <span class=icon-bar></span><span class=icon-bar></span><span class=icon-bar></span></button>
 <a href=/ class=navbar-brand><img alt=Brand style=height:25px src=/images/beam_logo_navbar.png></a></div><div class="navbar-mask closed"></div><div id=navbar class="navbar-container closed"><ul class="nav navbar-nav"><li><a href=/get-started/beam-overview/>Get Started</a></li><li><a href=/documentation/>Documentation</a></li><li><a href=/documentation/sdks/java/>Languages</a></li><li><a href=/documentation/runners/capability-matrix/>RUNNERS</a></li><li><a href=/roadmap/>Roadmap</a></li>< [...]
 •
-bhulette</i></p>We are happy to present the new 2.<p><a class="btn btn-default btn-sm" href=/blog/beam-2.22.0/ role=button>Read more&nbsp;<span class="glyphicon glyphicon-menu-right" aria-hidden=true></span></a></p><hr><h3><a class=post-link href=/blog/python-typing/>Python SDK Typing Changes</a></h3><p><i>May 28, 2020
+bhulette</i></p>We are happy to present the new 2.<p><a class="btn btn-default btn-sm" href=/blog/beam-2.22.0/ role=button>Read more&nbsp;<span class="glyphicon glyphicon-menu-right" aria-hidden=true></span></a></p><hr><h3><a class=post-link href=/blog/beam-katas-kotlin-release/>Announcing Beam Katas for Kotlin</a></h3><p><i>Jun 1, 2020
+•
+Rion Williams [<a href=https://twitter.com/rionmonster>@rionmonster</a>]</i></p><p>Today, we are happy to announce a new addition to the Beam Katas family: Kotlin!<p><a class="btn btn-default btn-sm" href=/blog/beam-katas-kotlin-release/ role=button>Read more&nbsp;<span class="glyphicon glyphicon-menu-right" aria-hidden=true></span></a></p><hr><h3><a class=post-link href=/blog/python-typing/>Python SDK Typing Changes</a></h3><p><i>May 28, 2020
 •
 Chad Dombrova
 &
diff --git a/website/generated-content/blog/index.xml b/website/generated-content/blog/index.xml
index 76049fe..49bcc11 100644
--- a/website/generated-content/blog/index.xml
+++ b/website/generated-content/blog/index.xml
@@ -43,7 +43,45 @@ For more information on changes in 2.22.0, check out the
 &lt;/ul>
 &lt;h2 id="list-of-contributors">List of Contributors&lt;/h2>
 &lt;p>According to git shortlog, the following people contributed to the 2.22.0 release. Thank you to all contributors!&lt;/p>
-&lt;p>Ahmet Altay, aiyangar, Ajo Thomas, Akshay-Iyangar, Alan Pryor, Alexey Romanenko, Allen Pradeep Xavier, amaliujia, Andrew Pilloud, Ankur Goenka, Ashwin Ramaswami, bntnam, Borzoo Esmailloo, Boyuan Zhang, Brian Hulette, Chamikara Jayalath, Colm O hEigeartaigh, Craig Chambers, Damon Douglas, Daniel Oliveira, David Cavazos, David Moravek, Esun Kim, Etienne Chauchot, Filipe Regadas, Graeme Morgan, Hannah Jiang, Hannah-Jiang, Harch Vardhan, Heejong Lee, Henry Suryawirawan, Ismaël Mejía, I [...]
+&lt;p>Ahmet Altay, aiyangar, Ajo Thomas, Akshay-Iyangar, Alan Pryor, Alexey Romanenko, Allen Pradeep Xavier, amaliujia, Andrew Pilloud, Ankur Goenka, Ashwin Ramaswami, bntnam, Borzoo Esmailloo, Boyuan Zhang, Brian Hulette, Chamikara Jayalath, Colm O hEigeartaigh, Craig Chambers, Damon Douglas, Daniel Oliveira, David Cavazos, David Moravek, Esun Kim, Etienne Chauchot, Filipe Regadas, Graeme Morgan, Hannah Jiang, Hannah-Jiang, Harch Vardhan, Heejong Lee, Henry Suryawirawan, Ismaël Mejía, I [...]
+&lt;!--
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+&lt;p>Today, we are happy to announce a new addition to the Beam Katas family: Kotlin!&lt;/p>
+&lt;p>&lt;img src="/images/blog/beam-katas-kotlin-release/beam-and-kotlin.png" alt="Apache Beam and Kotlin Shaking Hands" height="330" width="800" >&lt;/p>
+&lt;p>You may remember &lt;a href="https://beam.apache.org/blog/beam-kata-release">a post from last year&lt;/a> that informed everyone of the wonderful Beam Katas available on &lt;a href="https://stepik.org">Stepik&lt;/a>
+for learning more about writing Apache Beam applications, working with its various APIs and programming model
+hands-on, all from the comfort of your favorite IDEs. As of today, you can now work through all of the progressive
+exercises to learn about the fundamentals of Beam in Kotlin.&lt;/p>
+&lt;p>&lt;a href="https://kotlinlang.org">Kotlin&lt;/a> is a modern, open-source, statically typed language that targets the JVM. It is most commonly used by
+Android developers, however it has recently risen in popularity due to its extensive feature set that enables
+more concise and cleaner code than Java, without sacrificing performance or type safety. It recently was &lt;a href="https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-languages-loved">ranked
+as one of the most beloved programming languages in the annual Stack Overflow Developer Survey&lt;/a>, so don&amp;rsquo;t take
+just our word for it.&lt;/p>
+&lt;p>The relationship between Apache Beam and Kotlin isn&amp;rsquo;t a new one. You can find examples scattered across the web
+of engineering teams embracing the two technologies including &lt;a href="https://beam.apache.org/blog/beam-kotlin/">a series of samples announced on this very blog&lt;/a>.
+If you are new to Beam or are an experienced veteran looking for a change of pace, we&amp;rsquo;d encourage you to give
+Kotlin a try.&lt;/p>
+&lt;p>You can find the Kotlin and the other excellent Beam Katas below (or by just searching for &amp;ldquo;Beam Katas&amp;rdquo; within
+&lt;a href="https://www.jetbrains.com/education/download/#section=idea">IntelliJ&lt;/a> or &lt;a href="https://www.jetbrains.com/education/download/#section=pycharm-edu">PyCharm&lt;/a> through &lt;a href="https://plugins.jetbrains.com/plugin/10081-edutools">the EduTools plugin&lt;/a>):&lt;/p>
+&lt;ul>
+&lt;li>&lt;a href="https://stepik.org/course/72488">&lt;strong>Kotlin&lt;/strong>&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://stepik.org/course/54530">&lt;strong>Java&lt;/strong>&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://stepik.org/course/54532">&lt;strong>Python&lt;/strong>&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://stepik.org/course/70387">&lt;strong>Go (in development)&lt;/strong>&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;p>I&amp;rsquo;d like to extend a very special thanks to &lt;a href="https://twitter.com/henry_ken">Henry Suryawirawan&lt;/a> for his creation of the original series of Katas
+and his support during the review process and making this effort a reality.&lt;/p>
+&lt;p>&lt;br />&lt;/p>
+&lt;p>&lt;img src="/images/blog/beam-katas-kotlin-release/beam-katas-in-edutools.png" alt="Access Beam Katas Kotlin through a JetBrains Educational Product" height="252" width="800" >&lt;/p></description></item><item><title>Blog: Python SDK Typing Changes</title><link>/blog/python-typing/</link><pubDate>Thu, 28 May 2020 00:00:01 -0800</pubDate><guid>/blog/python-typing/</guid><description>
 &lt;!--
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
@@ -4963,1146 +5001,4 @@ limitations under the License.
 &lt;/ul>
 &lt;/li>
 &lt;/ul>
-&lt;p>As Apache Beam grows, so will this repository of presentation materials. We are excited to add new materials as the Apache Beam ecosystem grows with new runners, SDKs, and so on. If you are interested in contributing content or have a request, please see the &lt;a href="/contribute/presentation-materials/">Apache Beam presentation materials&lt;/a> page or email the &lt;a href="mailto:user@beam.apache.org">&lt;code>user@beam.apache.org&lt;/code>&lt;/a> mailing list with your ideas o [...]
-&lt;!--
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-&lt;p>With initial code drops complete (&lt;a href="https://github.com/apache/beam/pull/1">Dataflow SDK and Runner&lt;/a>, &lt;a href="https://github.com/apache/beam/pull/12">Flink Runner&lt;/a>, &lt;a href="https://github.com/apache/beam/pull/42">Spark Runner&lt;/a>) and expressed interest in runner implementations for &lt;a href="https://issues.apache.org/jira/browse/BEAM-9">Storm&lt;/a>, &lt;a href="https://issues.apache.org/jira/browse/BEAM-19">Hadoop&lt;/a>, and &lt;a href="https:// [...]
-&lt;p>While we’d love to have a world where all runners support the full suite of semantics included in the Beam Model (formerly referred to as the &lt;a href="https://www.vldb.org/pvldb/vol8/p1792-Akidau.pdf">Dataflow Model&lt;/a>), practically speaking, there will always be certain features that some runners can’t provide. For example, a Hadoop-based runner would be inherently batch-based and may be unable to (easily) implement support for unbounded collections. However, that doesn’t p [...]
-&lt;p>To help clarify things, we’ve been working on enumerating the key features of the Beam model in a &lt;a href="/documentation/runners/capability-matrix/">capability matrix&lt;/a> for all existing runners, categorized around the four key questions addressed by the model: &lt;span class="wwwh-what-dark">What&lt;/span> / &lt;span class="wwwh-where-dark">Where&lt;/span> / &lt;span class="wwwh-when-dark">When&lt;/span> / &lt;span class="wwwh-how-dark">How&lt;/span> (if you’re not familia [...]
-&lt;p>Included below is a summary snapshot of our current understanding of the capabilities of the existing runners (see the &lt;a href="/documentation/runners/capability-matrix/">live version&lt;/a> for full details, descriptions, and Jira links); since integration is still under way, the system as whole isn’t yet in a completely stable, usable state. But that should be changing in the near future, and we’ll be updating loud and clear on this blog when the first supported Beam 1.0 relea [...]
-&lt;p>In the meantime, these tables should help clarify where we expect to be in the very near term, and help guide expectations about what existing runners are capable of, and what features runner implementers will be tackling next.&lt;/p>
-&lt;p>
-&lt;script type="text/javascript">
-function ToggleTables(showDetails, anchor) {
-document.getElementById("cap-summary").style.display = showDetails ? "none" : "block";
-document.getElementById("cap-full").style.display = showDetails ? "block" : "none";
-location.hash = anchor;
-}
-&lt;/script>
-&lt;div id='cap-blog' style='display:block'>
-&lt;table class='cap-summary'>
-&lt;tr class='cap-summary' id='cap-blog-what'>
-&lt;th class='cap-summary color-metadata format-category' colspan='8' style='color:#ca1'>
-What is being computed?
-&lt;/th>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability'>&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#ec3'>Beam Model&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#ec3'>Google Cloud Dataflow&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#ec3'>Apache Flink&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#ec3'>Apache Spark&lt;/th>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>ParDo&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>GroupByKey&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
-&lt;center>
-&lt;b>
-~
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>Flatten&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>Combine&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>Composite Transforms&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
-&lt;center>
-&lt;b>
-~
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
-&lt;center>
-&lt;b>
-~
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
-&lt;center>
-&lt;b>
-~
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>Side Inputs&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
-&lt;center>
-&lt;b>
-~
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
-&lt;center>
-&lt;b>
-~
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>Source API&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
-&lt;center>
-&lt;b>
-~
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ec3;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>Aggregators&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
-&lt;center>
-&lt;b>
-~
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
-&lt;center>
-&lt;b>
-~
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
-&lt;center>
-&lt;b>
-~
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#fe5;border-color:#ca1'>
-&lt;center>
-&lt;b>
-~
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#ec3'>Keyed State&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#ca1'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;td class='cap-summary color-blank cap-blank' colspan='5'>&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary' id='cap-blog-where'>
-&lt;th class='cap-summary color-metadata format-category' colspan='8' style='color:#37d'>
-Where in event time?
-&lt;/th>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability'>&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#59f'>Beam Model&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#59f'>Google Cloud Dataflow&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#59f'>Apache Flink&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#59f'>Apache Spark&lt;/th>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#59f'>Global windows&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#59f'>Fixed windows&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8cf;border-color:#37d'>
-&lt;center>
-&lt;b>
-~
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#59f'>Sliding windows&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#59f'>Session windows&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#59f'>Custom windows&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#59f'>Custom merging windows&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#59f'>Timestamp control&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#59f;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#37d'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;td class='cap-summary color-blank cap-blank' colspan='5'>&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary' id='cap-blog-when'>
-&lt;th class='cap-summary color-metadata format-category' colspan='8' style='color:#6a4'>
-When in processing time?
-&lt;/th>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability'>&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#8c6'>Beam Model&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#8c6'>Google Cloud Dataflow&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#8c6'>Apache Flink&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#8c6'>Apache Spark&lt;/th>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#8c6'>Configurable triggering&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#8c6'>Event-time triggers&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#8c6'>Processing-time triggers&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#8c6'>Count triggers&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#8c6'>[Meta]data driven triggers&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#8c6'>Composite triggers&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#8c6'>Allowed lateness&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#8c6;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#8c6'>Timers&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#6a4'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;td class='cap-summary color-blank cap-blank' colspan='5'>&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary' id='cap-blog-how'>
-&lt;th class='cap-summary color-metadata format-category' colspan='8' style='color:#b55'>
-How do refinements relate?
-&lt;/th>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability'>&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#d77'>Beam Model&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#d77'>Google Cloud Dataflow&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#d77'>Apache Flink&lt;/th>
-&lt;th class='cap-summary color-platform format-platform' style='color:#d77'>Apache Spark&lt;/th>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#d77'>Discarding&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#d77;border-color:#b55'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#d77;border-color:#b55'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#d77;border-color:#b55'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#d77;border-color:#b55'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#d77'>Accumulating&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#d77;border-color:#b55'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#d77;border-color:#b55'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#d77;border-color:#b55'>
-&lt;center>
-&lt;b>
-&amp;#x2713;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#b55'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;th class='cap-summary color-capability format-capability' style='color:#d77'>Accumulating &amp;amp; Retracting&lt;/th>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#b55'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#b55'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#b55'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;td width='25%' class='cap-summary' style='background-color:#ddd;border-color:#b55'>
-&lt;center>
-&lt;b>
-&amp;#x2715;
-&lt;/b>
-&lt;b>
-&lt;/b>
-&lt;/center>
-&lt;/td>
-&lt;/tr>
-&lt;tr class='cap-summary'>
-&lt;td class='cap-summary color-blank cap-blank' colspan='5'>&lt;/td>
-&lt;/tr>
-&lt;/table>
-&lt;/div>
-&lt;/p></description></item></channel></rss>
\ No newline at end of file
+&lt;p>As Apache Beam grows, so will this repository of presentation materials. We are excited to add new materials as the Apache Beam ecosystem grows with new runners, SDKs, and so on. If you are interested in contributing content or have a request, please see the &lt;a href="/contribute/presentation-materials/">Apache Beam presentation materials&lt;/a> page or email the &lt;a href="mailto:user@beam.apache.org">&lt;code>user@beam.apache.org&lt;/code>&lt;/a> mailing list with your ideas o [...]
\ No newline at end of file
diff --git a/website/generated-content/categories/blog/index.xml b/website/generated-content/categories/blog/index.xml
index 85bef1d..9c1d270 100644
--- a/website/generated-content/categories/blog/index.xml
+++ b/website/generated-content/categories/blog/index.xml
@@ -43,7 +43,45 @@ For more information on changes in 2.22.0, check out the
 &lt;/ul>
 &lt;h2 id="list-of-contributors">List of Contributors&lt;/h2>
 &lt;p>According to git shortlog, the following people contributed to the 2.22.0 release. Thank you to all contributors!&lt;/p>
-&lt;p>Ahmet Altay, aiyangar, Ajo Thomas, Akshay-Iyangar, Alan Pryor, Alexey Romanenko, Allen Pradeep Xavier, amaliujia, Andrew Pilloud, Ankur Goenka, Ashwin Ramaswami, bntnam, Borzoo Esmailloo, Boyuan Zhang, Brian Hulette, Chamikara Jayalath, Colm O hEigeartaigh, Craig Chambers, Damon Douglas, Daniel Oliveira, David Cavazos, David Moravek, Esun Kim, Etienne Chauchot, Filipe Regadas, Graeme Morgan, Hannah Jiang, Hannah-Jiang, Harch Vardhan, Heejong Lee, Henry Suryawirawan, Ismaël Mejía, I [...]
+&lt;p>Ahmet Altay, aiyangar, Ajo Thomas, Akshay-Iyangar, Alan Pryor, Alexey Romanenko, Allen Pradeep Xavier, amaliujia, Andrew Pilloud, Ankur Goenka, Ashwin Ramaswami, bntnam, Borzoo Esmailloo, Boyuan Zhang, Brian Hulette, Chamikara Jayalath, Colm O hEigeartaigh, Craig Chambers, Damon Douglas, Daniel Oliveira, David Cavazos, David Moravek, Esun Kim, Etienne Chauchot, Filipe Regadas, Graeme Morgan, Hannah Jiang, Hannah-Jiang, Harch Vardhan, Heejong Lee, Henry Suryawirawan, Ismaël Mejía, I [...]
+&lt;!--
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+&lt;p>Today, we are happy to announce a new addition to the Beam Katas family: Kotlin!&lt;/p>
+&lt;p>&lt;img src="/images/blog/beam-katas-kotlin-release/beam-and-kotlin.png" alt="Apache Beam and Kotlin Shaking Hands" height="330" width="800" >&lt;/p>
+&lt;p>You may remember &lt;a href="https://beam.apache.org/blog/beam-kata-release">a post from last year&lt;/a> that informed everyone of the wonderful Beam Katas available on &lt;a href="https://stepik.org">Stepik&lt;/a>
+for learning more about writing Apache Beam applications, working with its various APIs and programming model
+hands-on, all from the comfort of your favorite IDEs. As of today, you can now work through all of the progressive
+exercises to learn about the fundamentals of Beam in Kotlin.&lt;/p>
+&lt;p>&lt;a href="https://kotlinlang.org">Kotlin&lt;/a> is a modern, open-source, statically typed language that targets the JVM. It is most commonly used by
+Android developers, however it has recently risen in popularity due to its extensive feature set that enables
+more concise and cleaner code than Java, without sacrificing performance or type safety. It recently was &lt;a href="https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-languages-loved">ranked
+as one of the most beloved programming languages in the annual Stack Overflow Developer Survey&lt;/a>, so don&amp;rsquo;t take
+just our word for it.&lt;/p>
+&lt;p>The relationship between Apache Beam and Kotlin isn&amp;rsquo;t a new one. You can find examples scattered across the web
+of engineering teams embracing the two technologies including &lt;a href="https://beam.apache.org/blog/beam-kotlin/">a series of samples announced on this very blog&lt;/a>.
+If you are new to Beam or are an experienced veteran looking for a change of pace, we&amp;rsquo;d encourage you to give
+Kotlin a try.&lt;/p>
+&lt;p>You can find the Kotlin and the other excellent Beam Katas below (or by just searching for &amp;ldquo;Beam Katas&amp;rdquo; within
+&lt;a href="https://www.jetbrains.com/education/download/#section=idea">IntelliJ&lt;/a> or &lt;a href="https://www.jetbrains.com/education/download/#section=pycharm-edu">PyCharm&lt;/a> through &lt;a href="https://plugins.jetbrains.com/plugin/10081-edutools">the EduTools plugin&lt;/a>):&lt;/p>
+&lt;ul>
+&lt;li>&lt;a href="https://stepik.org/course/72488">&lt;strong>Kotlin&lt;/strong>&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://stepik.org/course/54530">&lt;strong>Java&lt;/strong>&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://stepik.org/course/54532">&lt;strong>Python&lt;/strong>&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://stepik.org/course/70387">&lt;strong>Go (in development)&lt;/strong>&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;p>I&amp;rsquo;d like to extend a very special thanks to &lt;a href="https://twitter.com/henry_ken">Henry Suryawirawan&lt;/a> for his creation of the original series of Katas
+and his support during the review process and making this effort a reality.&lt;/p>
+&lt;p>&lt;br />&lt;/p>
+&lt;p>&lt;img src="/images/blog/beam-katas-kotlin-release/beam-katas-in-edutools.png" alt="Access Beam Katas Kotlin through a JetBrains Educational Product" height="252" width="800" >&lt;/p></description></item><item><title>Blog: Python SDK Typing Changes</title><link>/blog/python-typing/</link><pubDate>Thu, 28 May 2020 00:00:01 -0800</pubDate><guid>/blog/python-typing/</guid><description>
 &lt;!--
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/website/generated-content/documentation/index.xml b/website/generated-content/documentation/index.xml
index 40937ee..ddcfc0b 100644
--- a/website/generated-content/documentation/index.xml
+++ b/website/generated-content/documentation/index.xml
@@ -1623,7 +1623,7 @@ sets as &lt;code>PCollection&lt;/code>s and its operations as &lt;code>Transform
 &lt;p>To use Beam, your driver program must first create an instance of the Beam SDK
 class &lt;code>Pipeline&lt;/code> (typically in the &lt;code>main()&lt;/code> function). When you create your
 &lt;code>Pipeline&lt;/code>, you&amp;rsquo;ll also need to set some &lt;strong>configuration options&lt;/strong>. You can set
-your pipeline&amp;rsquo;s configuration options programatically, but it&amp;rsquo;s often easier to
+your pipeline&amp;rsquo;s configuration options programmatically, but it&amp;rsquo;s often easier to
 set the options ahead of time (or read them from the command line) and pass them
 to the &lt;code>Pipeline&lt;/code> object when you create the object.&lt;/p>
 &lt;div class=language-java>
@@ -1858,9 +1858,9 @@ itself.&lt;/p>
 &lt;/div>
 &lt;h3 id="pcollection-characteristics">3.2. PCollection characteristics&lt;/h3>
 &lt;p>A &lt;code>PCollection&lt;/code> is owned by the specific &lt;code>Pipeline&lt;/code> object for which it is
-created; multiple pipelines cannot share a &lt;code>PCollection&lt;/code>. In some respects, a
-&lt;code>PCollection&lt;/code> functions like a collection class. However, a &lt;code>PCollection&lt;/code> can
-differ in a few key ways:&lt;/p>
+created; multiple pipelines cannot share a &lt;code>PCollection&lt;/code>. &lt;span language="java">
+In some respects, a &lt;code>PCollection&lt;/code> functions like a &lt;code>Collection&lt;/code> class. However,
+a &lt;code>PCollection&lt;/code> can differ in a few key ways:&lt;/span>&lt;/p>
 &lt;h4 id="element-type">3.2.1. Element type&lt;/h4>
 &lt;p>The elements of a &lt;code>PCollection&lt;/code> may be of any type, but must all be of the same
 type. However, to support distributed processing, Beam needs to be able to
@@ -1962,7 +1962,10 @@ transforms sequentially and also apply transforms that contain other transforms
 nested within (called &lt;a href="#composite-transforms">composite transforms&lt;/a> in the Beam
 SDKs).&lt;/p>
 &lt;p>How you apply your pipeline&amp;rsquo;s transforms determines the structure of your
-pipeline. The best way to think of your pipeline is as a directed acyclic graph, where &lt;code>PTransform&lt;/code> nodes are subroutines that accept &lt;code>PCollection&lt;/code> nodes as inputs and emit &lt;code>PCollection&lt;/code> nodes as outputs. For example, you can chain together transforms to create a pipeline that successively modifies input data:&lt;/p>
+pipeline. The best way to think of your pipeline is as a directed acyclic graph,
+where &lt;code>PTransform&lt;/code> nodes are subroutines that accept &lt;code>PCollection&lt;/code> nodes as
+inputs and emit &lt;code>PCollection&lt;/code> nodes as outputs. For example, you can chain
+together transforms to create a pipeline that successively modifies input data:&lt;/p>
 &lt;div class=language-java>
 &lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="o">[&lt;/span>&lt;span class="n">Final&lt;/span> &lt;span class="n">Output&lt;/span> &lt;span class="n">PCollection&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="o">[&lt;/span>&lt;span class="n">Initial&lt;/span> &lt;span class="n">Input&lt;/span> &lt;span class="n">PCollection&lt;/span>&lt;span class="o">].&lt;/span>&lt;span class="na" [...]
 &lt;span class="o">.&lt;/span>&lt;span class="na">apply&lt;/span>&lt;span class="o">([&lt;/span>&lt;span class="n">Second&lt;/span> &lt;span class="n">Transform&lt;/span>&lt;span class="o">])&lt;/span>
@@ -1977,7 +1980,7 @@ pipeline. The best way to think of your pipeline is as a directed acyclic graph,
 &lt;p>&lt;img src="/images/design-your-pipeline-linear.svg" alt="This linear pipeline starts with one input collection, sequentially appliesthree transforms, and ends with one output collection.">&lt;/p>
 &lt;p>&lt;em>Figure 1: A linear pipeline with three sequential transforms.&lt;/em>&lt;/p>
 &lt;p>However, note that a transform &lt;em>does not consume or otherwise alter&lt;/em> the input
-collection&amp;ndash;remember that a &lt;code>PCollection&lt;/code> is immutable by definition. This means
+collection — remember that a &lt;code>PCollection&lt;/code> is immutable by definition. This means
 that you can apply multiple transforms to the same input &lt;code>PCollection&lt;/code> to create
 a branching pipeline, like so:&lt;/p>
 &lt;div class=language-java>
@@ -1995,7 +1998,7 @@ a branching pipeline, like so:&lt;/p>
 &lt;p>&lt;em>Figure 2: A branching pipeline. Two transforms are applied to a single
 PCollection of database table rows.&lt;/em>&lt;/p>
 &lt;p>You can also build your own &lt;a href="#composite-transforms">composite transforms&lt;/a> that
-nest multiple sub-steps inside a single, larger transform. Composite transforms
+nest multiple transforms inside a single, larger transform. Composite transforms
 are particularly useful for building a reusable sequence of simple steps that
 get used in a lot of different places.&lt;/p>
 &lt;h3 id="core-beam-transforms">4.2. Core Beam transforms&lt;/h3>
@@ -2011,14 +2014,15 @@ processing paradigm:&lt;/p>
 &lt;/ul>
 &lt;h4 id="pardo">4.2.1. ParDo&lt;/h4>
 &lt;p>&lt;code>ParDo&lt;/code> is a Beam transform for generic parallel processing. The &lt;code>ParDo&lt;/code>
-processing paradigm is similar to the &amp;ldquo;Map&amp;rdquo; phase of a Map/Shuffle/Reduce-style
+processing paradigm is similar to the &amp;ldquo;Map&amp;rdquo; phase of a
+&lt;a href="https://en.wikipedia.org/wiki/MapReduce">Map/Shuffle/Reduce&lt;/a>-style
 algorithm: a &lt;code>ParDo&lt;/code> transform considers each element in the input
 &lt;code>PCollection&lt;/code>, performs some processing function (your user code) on that
 element, and emits zero, one, or multiple elements to an output &lt;code>PCollection&lt;/code>.&lt;/p>
 &lt;p>&lt;code>ParDo&lt;/code> is useful for a variety of common data processing operations, including:&lt;/p>
 &lt;ul>
 &lt;li>&lt;strong>Filtering a data set.&lt;/strong> You can use &lt;code>ParDo&lt;/code> to consider each element in a
-&lt;code>PCollection&lt;/code> and either output that element to a new collection, or discard
+&lt;code>PCollection&lt;/code> and either output that element to a new collection or discard
 it.&lt;/li>
 &lt;li>&lt;strong>Formatting or type-converting each element in a data set.&lt;/strong> If your input
 &lt;code>PCollection&lt;/code> contains elements that are of a different type or format than
@@ -2084,7 +2088,7 @@ the length of each string, and outputs the result to a new &lt;code>PCollection&
 &lt;h5 id="4212-creating-a-dofn">4.2.1.2. Creating a DoFn&lt;/h5>
 &lt;p>The &lt;code>DoFn&lt;/code> object that you pass to &lt;code>ParDo&lt;/code> contains the processing logic that
 gets applied to the elements in the input collection. When you use Beam, often
-the most important pieces of code you&amp;rsquo;ll write are these &lt;code>DoFn&lt;/code>s&amp;ndash;they&amp;rsquo;re what
+the most important pieces of code you&amp;rsquo;ll write are these &lt;code>DoFn&lt;/code>s - they&amp;rsquo;re what
 define your pipeline&amp;rsquo;s exact data processing tasks.&lt;/p>
 &lt;blockquote>
 &lt;p>&lt;strong>Note:&lt;/strong> When you create your &lt;code>DoFn&lt;/code>, be mindful of the &lt;a href="#requirements-for-writing-user-code-for-beam-transforms">Requirements
@@ -2107,15 +2111,16 @@ that for you. Your &lt;code>@ProcessElement&lt;/code> method should accept a par
 &lt;code>@Element&lt;/code>, which will be populated with the input element. In order to output
 elements, the method can also take a parameter of type &lt;code>OutputReceiver&lt;/code> which
 provides a method for emitting elements. The parameter types must match the input
-and output types of your &lt;code>DoFn&lt;/code> or the framework will raise an error. Note: @Element and
-OutputReceiver were introduced in Beam 2.5.0; if using an earlier release of Beam, a
-ProcessContext parameter should be used instead.&lt;/p>
+and output types of your &lt;code>DoFn&lt;/code> or the framework will raise an error. Note: &lt;code>@Element&lt;/code> and
+&lt;code>OutputReceiver&lt;/code> were introduced in Beam 2.5.0; if using an earlier release of Beam, a
+&lt;code>ProcessContext&lt;/code> parameter should be used instead.&lt;/p>
 &lt;p class="language-py">Inside your &lt;code>DoFn&lt;/code> subclass, you&amp;rsquo;ll write a method &lt;code>process&lt;/code> where you provide
 the actual processing logic. You don&amp;rsquo;t need to manually extract the elements
-from the input collection; the Beam SDKs handle that for you. Your &lt;code>process&lt;/code>
-method should accept an object of type &lt;code>element&lt;/code>. This is the input element and
-output is emitted by using &lt;code>yield&lt;/code> or &lt;code>return&lt;/code> statement inside &lt;code>process&lt;/code>
-method.&lt;/p>
+from the input collection; the Beam SDKs handle that for you. Your &lt;code>process&lt;/code> method
+should accept an argument &lt;code>element&lt;/code>, which is the input element, and return an
+iterable with its output values. You can accomplish this by emitting individual
+elements with &lt;code>yield&lt;/code> statements. You can also use a &lt;code>return&lt;/code> statement
+with an iterable, like a list or a generator.&lt;/p>
 &lt;div class=language-java>
 &lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="kd">static&lt;/span> &lt;span class="kd">class&lt;/span> &lt;span class="nc">ComputeWordLengthFn&lt;/span> &lt;span class="kd">extends&lt;/span> &lt;span class="n">DoFn&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="n">Integer&lt;/span>&lt;span class="o">&amp;gt;&lt;/span> &lt;span class="o">{&lt;/span>
 &lt;span class="nd">@ProcessElement&lt;/span>
@@ -2152,6 +2157,12 @@ elements from the input collection).&lt;/li>
 &lt;li>Once you output a value using &lt;code>OutputReceiver.output()&lt;/code> you should not modify
 that value in any way.&lt;/li>
 &lt;/ul>&lt;/p>
+&lt;p class="language-python">&lt;ul>
+&lt;li>You should not in any way modify the &lt;code>element&lt;/code> argument provided to the
+&lt;code>process&lt;/code> method, or any side inputs.&lt;/li>
+&lt;li>Once you output a value using &lt;code>yield&lt;/code> or &lt;code>return&lt;/code>, you should not modify
+that value in any way.&lt;/li>
+&lt;/ul>&lt;/p>
 &lt;h5 id="lightweight-dofns">4.2.1.3. Lightweight DoFns and other abstractions&lt;/h5>
 &lt;p>If your function is relatively straightforward, you can simplify your use of
 &lt;code>ParDo&lt;/code> by providing a lightweight &lt;code>DoFn&lt;/code> in-line, as
@@ -3083,7 +3094,7 @@ If an element falls in multiple windows (for example, this will happen when usin
 &lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="kn">import&lt;/span> &lt;span class="nn">apache_beam&lt;/span> &lt;span class="kn">as&lt;/span> &lt;span class="nn">beam&lt;/span>
 &lt;span class="k">class&lt;/span> &lt;span class="nc">ProcessRecord&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">beam&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DoFn&lt;/span>&lt;span class="p">):&lt;/span>
 &lt;span class="k">def&lt;/span> &lt;span class="nf">process&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">element&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">window&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">beam&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DoFn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">WindowParam&lt;/span>&lt;span class="p">):&lt;/span>
-&lt;span class="c1"># access window e.g window.end.micros&lt;/span>
+&lt;span class="c1"># access window e.g. window.end.micros&lt;/span>
 &lt;span class="k">pass&lt;/span>
 &lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
@@ -3093,7 +3104,7 @@ you can determine whether this is an early or a late firing, and how many times
 &lt;p class="language-py">&lt;strong>PaneInfo:&lt;/strong>
 When triggers are used, Beam provides a &lt;code>DoFn.PaneInfoParam&lt;/code> object that contains information about the current firing. Using &lt;code>DoFn.PaneInfoParam&lt;/code>
 you can determine whether this is an early or a late firing, and how many times this window has already fired for this key.
-This feature implementation in python sdk is not fully completed, see more at &lt;a href="https://issues.apache.org/jira/browse/BEAM-3759">BEAM-3759&lt;/a>.&lt;/p>
+This feature implementation in Python SDK is not fully completed; see more at &lt;a href="https://issues.apache.org/jira/browse/BEAM-3759">BEAM-3759&lt;/a>.&lt;/p>
 &lt;div class=language-java>
 &lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="o">.&lt;/span>&lt;span class="na">of&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="k">new&lt;/span> &lt;span class="n">DoFn&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="n">String&lt;/span>&lt;span class="o">&amp;gt;()&lt;/span> &lt;span class="o">{&lt;/span>
 &lt;span class="kd">public&lt;/span> &lt;span class="kt">void&lt;/span> &lt;span class="nf">processElement&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="nd">@Element&lt;/span> &lt;span class="n">String&lt;/span> &lt;span class="n">word&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="n">PaneInfo&lt;/span> &lt;span class="n">paneInfo&lt;/span>&lt;span class="o">)&lt;/span> &lt;span class="o">{&lt;/span>
@@ -3103,7 +3114,7 @@ This feature implementation in python sdk is not fully completed, see more at &l
 &lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-py" data-lang="py">&lt;span class="kn">import&lt;/span> &lt;span class="nn">apache_beam&lt;/span> &lt;span class="kn">as&lt;/span> &lt;span class="nn">beam&lt;/span>
 &lt;span class="k">class&lt;/span> &lt;span class="nc">ProcessRecord&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">beam&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DoFn&lt;/span>&lt;span class="p">):&lt;/span>
 &lt;span class="k">def&lt;/span> &lt;span class="nf">process&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="bp">self&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">element&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pane_info&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">beam&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DoFn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">PaneInfoParam&lt;/span>&lt;span class="p">):&lt;/span>
-&lt;span class="c1"># access pane info e.g pane_info.is_first, pane_info.is_last, pane_info.timing&lt;/span>
+&lt;span class="c1"># access pane info, e.g. pane_info.is_first, pane_info.is_last, pane_info.timing&lt;/span>
 &lt;span class="k">pass&lt;/span>
 &lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
@@ -3121,7 +3132,7 @@ a parameter of type &lt;code>TimeDomain&lt;/code> which tells whether the timer
 Timers are explained in more detail in the
 &lt;a href="/blog/2017/08/28/timely-processing.html">Timely (and Stateful) Processing with Apache Beam&lt;/a> blog post.&lt;/p>
 &lt;p class="language-py">&lt;strong>Timer and State:&lt;/strong>
-In addition to aforementioned parameters, user defined Timer and State parameters can be used in a Stateful DoFn.
+In addition to aforementioned parameters, user defined Timer and State parameters can be used in a stateful DoFn.
 Timers and States are explained in more detail in the
 &lt;a href="/blog/2017/08/28/timely-processing.html">Timely (and Stateful) Processing with Apache Beam&lt;/a> blog post.&lt;/p>
 &lt;div class=language-py>
@@ -3137,7 +3148,7 @@ Timers and States are explained in more detail in the
 &lt;span class="n">buffer_1&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">beam&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DoFn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">StateParam&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">BUFFER_STATE_1&lt;/span>&lt;span class="p">),&lt;/span>
 &lt;span class="n">buffer_2&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">beam&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DoFn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">StateParam&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">BUFFER_STATE_2&lt;/span>&lt;span class="p">),&lt;/span>
 &lt;span class="n">watermark_timer&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">beam&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DoFn&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">TimerParam&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">WATERMARK_TIMER&lt;/span>&lt;span class="p">)):&lt;/span>
-&lt;span class="c1"># Do you processing here&lt;/span>
+&lt;span class="c1"># Do your processing here&lt;/span>
 &lt;span class="n">key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">value&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">element&lt;/span>
 &lt;span class="c1"># Read all the data from buffer1&lt;/span>
 &lt;span class="n">all_values_in_buffer_1&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="k">for&lt;/span> &lt;span class="n">x&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">buffer_1&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">read&lt;/span>&lt;span class="p">()]&lt;/span>
@@ -3195,11 +3206,6 @@ words, producing a &lt;code>PCollection&lt;/code> of key/value pairs. Each key r
 word in the text, and each value represents the number of times that word
 appeared in the original data.&lt;/li>
 &lt;/ol>
-&lt;p>Note that this is also an example of nested composite transforms, as &lt;code>Count&lt;/code>
-is, by itself, a composite transform.&lt;/p>
-&lt;p>Your composite transform&amp;rsquo;s parameters and return value must match the initial
-input type and final return type for the entire transform, even if the
-transform&amp;rsquo;s intermediate data changes type multiple times.&lt;/p>
 &lt;div class=language-java>
 &lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-java" data-lang="java"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">static&lt;/span> &lt;span class="kd">class&lt;/span> &lt;span class="nc">CountWords&lt;/span> &lt;span class="kd">extends&lt;/span> &lt;span class="n">PTransform&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">PCollection&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="o [...]
 &lt;span class="n">PCollection&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">KV&lt;/span>&lt;span class="o">&amp;lt;&lt;/span>&lt;span class="n">String&lt;/span>&lt;span class="o">,&lt;/span> &lt;span class="n">Long&lt;/span>&lt;span class="o">&amp;gt;&amp;gt;&amp;gt;&lt;/span> &lt;span class="o">{&lt;/span>
@@ -3228,6 +3234,10 @@ transform&amp;rsquo;s intermediate data changes type multiple times.&lt;/p>
 &lt;span class="c1"># Format each word and count into a printable string.&lt;/span>
 &lt;span class="o">|&lt;/span> &lt;span class="s1">&amp;#39;FormatCounts&amp;#39;&lt;/span> &lt;span class="o">&amp;gt;&amp;gt;&lt;/span> &lt;span class="n">beam&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ParDo&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">FormatCountsFn&lt;/span>&lt;span class="p">()))&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
+&lt;blockquote>
+&lt;p>&lt;strong>Note:&lt;/strong> Because &lt;code>Count&lt;/code> is itself a composite transform,
+&lt;code>CountWords&lt;/code> is also a nested composite transform.&lt;/p>
+&lt;/blockquote>
 &lt;h4 id="composite-transform-creation">4.6.2. Creating a composite transform&lt;/h4>
 &lt;p>To create your own composite transform, create a subclass of the &lt;code>PTransform&lt;/code>
 class and override the &lt;code>expand&lt;/code> method to specify the actual processing logic.
@@ -3279,6 +3289,9 @@ accept the appropriate input &lt;code>PCollection&lt;/code>(s) and return the co
 output &lt;code>PCollection&lt;/code>(s), you can include as many transforms as you want. These
 transforms can include core transforms, composite transforms, or the transforms
 included in the Beam SDK libraries.&lt;/p>
+&lt;p>Your composite transform&amp;rsquo;s parameters and return value must match the initial
+input type and final return type for the entire transform, even if the
+transform&amp;rsquo;s intermediate data changes type multiple times.&lt;/p>
 &lt;p>&lt;strong>Note:&lt;/strong> The &lt;code>expand&lt;/code> method of a &lt;code>PTransform&lt;/code> is not meant to be invoked
 directly by the user of a transform. Instead, you should call the &lt;code>apply&lt;/code> method
 on the &lt;code>PCollection&lt;/code> itself, with the transform as an argument. This allows
@@ -3324,7 +3337,7 @@ a &lt;code>PCollection&lt;/code>'s data at any point in your pipeline.&lt;/p>
 &lt;p>Many read transforms support reading from multiple input files matching a glob
 operator you provide. Note that glob operators are filesystem-specific and obey
 filesystem-specific consistency models. The following TextIO example uses a glob
-operator (*) to read all matching input files that have prefix &amp;ldquo;input-&amp;rdquo; and the
+operator (&lt;code>*&lt;/code>) to read all matching input files that have prefix &amp;ldquo;input-&amp;rdquo; and the
 suffix &amp;ldquo;.csv&amp;rdquo; in the given location:&lt;/p>
 &lt;div class=language-java>
 &lt;div class="highlight">&lt;pre class="chroma">&lt;code class="language-java" data-lang="java">&lt;span class="n">p&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="na">apply&lt;/span>&lt;span class="o">(&lt;/span>&lt;span class="s">&amp;#34;ReadFromText&amp;#34;&lt;/span>&lt;span class="o">,&lt;/span>
@@ -3363,7 +3376,7 @@ structures that can often be determined by examining the type. Even within a SDK
 (or equivalent structures in other languages) are often used as intermediate types, and these also have a
 clear structure that can be inferred by inspecting the class. By understanding the structure of a pipeline’s
 records, we can provide much more concise APIs for data processing.&lt;/p>
-&lt;h3 id="what-is-a-schema">6.1. What is a schema&lt;/h3>
+&lt;h3 id="what-is-a-schema">6.1. What is a schema?&lt;/h3>
 &lt;p>Most structured records share some common characteristics:&lt;/p>
 &lt;ul>
 &lt;li>They can be subdivided into separate named fields. Fields usually have string names, but sometimes - as in the case of indexed
diff --git a/website/generated-content/documentation/programming-guide/index.html b/website/generated-content/documentation/programming-guide/index.html
index 2a91194..5df6f90 100644
--- a/website/generated-content/documentation/programming-guide/index.html
+++ b/website/generated-content/documentation/programming-guide/index.html
@@ -1,7 +1,7 @@
 <!doctype html><html lang=en class=no-js><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><title>Beam Programming Guide</title><meta name=description content="Apache Beam is an open source, unified model and set of language-specific SDKs for defining and executing data processing workflows, and also data ingestion and integration flows, supporting Enterprise Integration Patterns (EIPs) and Domain [...]
 <span class=sr-only>Toggle navigation</span>
 <span class=icon-bar></span><span class=icon-bar></span><span class=icon-bar></span></button>
-<a href=/ class=navbar-brand><img alt=Brand style=height:25px src=/images/beam_logo_navbar.png></a></div><div class="navbar-mask closed"></div><div id=navbar class="navbar-container closed"><ul class="nav navbar-nav"><li><a href=/get-started/beam-overview/>Get Started</a></li><li><a href=/documentation/>Documentation</a></li><li><a href=/documentation/sdks/java/>Languages</a></li><li><a href=/documentation/runners/capability-matrix/>RUNNERS</a></li><li><a href=/roadmap/>Roadmap</a></li>< [...]
+<a href=/ class=navbar-brand><img alt=Brand style=height:25px src=/images/beam_logo_navbar.png></a></div><div class="navbar-mask closed"></div><div id=navbar class="navbar-container closed"><ul class="nav navbar-nav"><li><a href=/get-started/beam-overview/>Get Started</a></li><li><a href=/documentation/>Documentation</a></li><li><a href=/documentation/sdks/java/>Languages</a></li><li><a href=/documentation/runners/capability-matrix/>RUNNERS</a></li><li><a href=/roadmap/>Roadmap</a></li>< [...]
 Beam SDKs to create data processing pipelines. It provides guidance for using
 the Beam SDK classes to build and test your pipeline. It is not intended as an
 exhaustive reference, but as a language-agnostic, high-level guide to
@@ -54,7 +54,7 @@ object, and then using that object as the basis for creating the pipeline&rsquo;
 sets as <code>PCollection</code>s and its operations as <code>Transform</code>s.</p><p>To use Beam, your driver program must first create an instance of the Beam SDK
 class <code>Pipeline</code> (typically in the <code>main()</code> function). When you create your
 <code>Pipeline</code>, you&rsquo;ll also need to set some <strong>configuration options</strong>. You can set
-your pipeline&rsquo;s configuration options programatically, but it&rsquo;s often easier to
+your pipeline&rsquo;s configuration options programmatically, but it&rsquo;s often easier to
 set the options ahead of time (or read them from the command line) and pass them
 to the <code>Pipeline</code> object when you create the object.</p><div class=language-java><div class=highlight><pre class=chroma><code class=language-java data-lang=java><span class=c1>// Start by defining the options for the pipeline.
 </span><span class=c1></span><span class=n>PipelineOptions</span> <span class=n>options</span> <span class=o>=</span> <span class=n>PipelineOptionsFactory</span><span class=o>.</span><span class=na>create</span><span class=o>();</span>
@@ -209,9 +209,8 @@ itself.</p><p>The following example code shows how to create a <code>PCollection
           <span class=s1>&#39;The slings and arrows of outrageous fortune, &#39;</span><span class=p>,</span>
           <span class=s1>&#39;Or to take arms against a sea of troubles, &#39;</span><span class=p>,</span>
       <span class=p>]))</span></code></pre></div></div><h3 id=pcollection-characteristics>3.2. PCollection characteristics</h3><p>A <code>PCollection</code> is owned by the specific <code>Pipeline</code> object for which it is
-created; multiple pipelines cannot share a <code>PCollection</code>. In some respects, a
-<code>PCollection</code> functions like a collection class. However, a <code>PCollection</code> can
-differ in a few key ways:</p><h4 id=element-type>3.2.1. Element type</h4><p>The elements of a <code>PCollection</code> may be of any type, but must all be of the same
+created; multiple pipelines cannot share a <code>PCollection</code>. <span language=java>In some respects, a <code>PCollection</code> functions like a <code>Collection</code> class. However,
+a <code>PCollection</code> can differ in a few key ways:</span></p><h4 id=element-type>3.2.1. Element type</h4><p>The elements of a <code>PCollection</code> may be of any type, but must all be of the same
 type. However, to support distributed processing, Beam needs to be able to
 encode each individual element as a byte string (so elements can be passed
 around to distributed workers). The Beam SDKs provide a data encoding mechanism
@@ -280,12 +279,15 @@ the transform itself as an argument, and the operation returns the output
 transforms sequentially and also apply transforms that contain other transforms
 nested within (called <a href=#composite-transforms>composite transforms</a> in the Beam
 SDKs).</p><p>How you apply your pipeline&rsquo;s transforms determines the structure of your
-pipeline. The best way to think of your pipeline is as a directed acyclic graph, where <code>PTransform</code> nodes are subroutines that accept <code>PCollection</code> nodes as inputs and emit <code>PCollection</code> nodes as outputs. For example, you can chain together transforms to create a pipeline that successively modifies input data:</p><div class=language-java><div class=highlight><pre class=chroma><code class=language-java data-lang=java><span class=o>[</span><span class=n>Fin [...]
+pipeline. The best way to think of your pipeline is as a directed acyclic graph,
+where <code>PTransform</code> nodes are subroutines that accept <code>PCollection</code> nodes as
+inputs and emit <code>PCollection</code> nodes as outputs. For example, you can chain
+together transforms to create a pipeline that successively modifies input data:</p><div class=language-java><div class=highlight><pre class=chroma><code class=language-java data-lang=java><span class=o>[</span><span class=n>Final</span> <span class=n>Output</span> <span class=n>PCollection</span><span class=o>]</span> <span class=o>=</span> <span class=o>[</span><span class=n>Initial</span> <span class=n>Input</span> <span class=n>PCollection</span><span class=o>].</span><span class=na>a [...]
 <span class=o>.</span><span class=na>apply</span><span class=o>([</span><span class=n>Second</span> <span class=n>Transform</span><span class=o>])</span>
 <span class=o>.</span><span class=na>apply</span><span class=o>([</span><span class=n>Third</span> <span class=n>Transform</span><span class=o>])</span></code></pre></div></div><div class=language-py><div class=highlight><pre class=chroma><code class=language-py data-lang=py><span class=p>[</span><span class=n>Final</span> <span class=n>Output</span> <span class=n>PCollection</span><span class=p>]</span> <span class=o>=</span> <span class=p>([</span><span class=n>Initial</span> <span cla [...]
               <span class=o>|</span> <span class=p>[</span><span class=n>Second</span> <span class=n>Transform</span><span class=p>]</span>
               <span class=o>|</span> <span class=p>[</span><span class=n>Third</span> <span class=n>Transform</span><span class=p>])</span></code></pre></div></div><p>The graph of this pipeline looks like the following:</p><p><img src=/images/design-your-pipeline-linear.svg alt="This linear pipeline starts with one input collection, sequentially appliesthree transforms, and ends with one output collection."></p><p><em>Figure 1: A linear pipeline with three sequential transforms.</em></p> [...]
-collection&ndash;remember that a <code>PCollection</code> is immutable by definition. This means
+collection — remember that a <code>PCollection</code> is immutable by definition. This means
 that you can apply multiple transforms to the same input <code>PCollection</code> to create
 a branching pipeline, like so:</p><div class=language-java><div class=highlight><pre class=chroma><code class=language-java data-lang=java><span class=o>[</span><span class=n>PCollection</span> <span class=n>of</span> <span class=n>database</span> <span class=n>table</span> <span class=n>rows</span><span class=o>]</span> <span class=o>=</span> <span class=o>[</span><span class=n>Database</span> <span class=n>Table</span> <span class=n>Reader</span><span class=o>].</span><span class=na>ap [...]
 <span class=o>[</span><span class=n>PCollection</span> <span class=n>of</span> <span class=sc>&#39;A&#39;</span> <span class=n>names</span><span class=o>]</span> <span class=o>=</span> <span class=o>[</span><span class=n>PCollection</span> <span class=n>of</span> <span class=n>database</span> <span class=n>table</span> <span class=n>rows</span><span class=o>].</span><span class=na>apply</span><span class=o>([</span><span class=n>Transform</span> <span class=n>A</span><span class=o>])</span>
@@ -293,15 +295,16 @@ a branching pipeline, like so:</p><div class=language-java><div class=highlight>
 <span class=p>[</span><span class=n>PCollection</span> <span class=n>of</span> <span class=s1>&#39;A&#39;</span> <span class=n>names</span><span class=p>]</span> <span class=o>=</span> <span class=p>[</span><span class=n>PCollection</span> <span class=n>of</span> <span class=n>database</span> <span class=n>table</span> <span class=n>rows</span><span class=p>]</span> <span class=o>|</span> <span class=p>[</span><span class=n>Transform</span> <span class=n>A</span><span class=p>]</span>
 <span class=p>[</span><span class=n>PCollection</span> <span class=n>of</span> <span class=s1>&#39;B&#39;</span> <span class=n>names</span><span class=p>]</span> <span class=o>=</span> <span class=p>[</span><span class=n>PCollection</span> <span class=n>of</span> <span class=n>database</span> <span class=n>table</span> <span class=n>rows</span><span class=p>]</span> <span class=o>|</span> <span class=p>[</span><span class=n>Transform</span> <span class=n>B</span><span class=p>]</span></c [...]
 PCollection of database table rows.</em></p><p>You can also build your own <a href=#composite-transforms>composite transforms</a> that
-nest multiple sub-steps inside a single, larger transform. Composite transforms
+nest multiple transforms inside a single, larger transform. Composite transforms
 are particularly useful for building a reusable sequence of simple steps that
 get used in a lot of different places.</p><h3 id=core-beam-transforms>4.2. Core Beam transforms</h3><p>Beam provides the following core transforms, each of which represents a different
 processing paradigm:</p><ul><li><code>ParDo</code></li><li><code>GroupByKey</code></li><li><code>CoGroupByKey</code></li><li><code>Combine</code></li><li><code>Flatten</code></li><li><code>Partition</code></li></ul><h4 id=pardo>4.2.1. ParDo</h4><p><code>ParDo</code> is a Beam transform for generic parallel processing. The <code>ParDo</code>
-processing paradigm is similar to the &ldquo;Map&rdquo; phase of a Map/Shuffle/Reduce-style
+processing paradigm is similar to the &ldquo;Map&rdquo; phase of a
+<a href=https://en.wikipedia.org/wiki/MapReduce>Map/Shuffle/Reduce</a>-style
 algorithm: a <code>ParDo</code> transform considers each element in the input
 <code>PCollection</code>, performs some processing function (your user code) on that
 element, and emits zero, one, or multiple elements to an output <code>PCollection</code>.</p><p><code>ParDo</code> is useful for a variety of common data processing operations, including:</p><ul><li><strong>Filtering a data set.</strong> You can use <code>ParDo</code> to consider each element in a
-<code>PCollection</code> and either output that element to a new collection, or discard
+<code>PCollection</code> and either output that element to a new collection or discard
 it.</li><li><strong>Formatting or type-converting each element in a data set.</strong> If your input
 <code>PCollection</code> contains elements that are of a different type or format than
 you want, you can use <code>ParDo</code> to perform a conversion on each element and
@@ -353,7 +356,7 @@ following example code:</p><div class=language-java><div class=highlight><pre cl
 the length of each string, and outputs the result to a new <code>PCollection</code> of
 <code>Integer</code> values that stores the length of each word.</p><h5 id=4212-creating-a-dofn>4.2.1.2. Creating a DoFn</h5><p>The <code>DoFn</code> object that you pass to <code>ParDo</code> contains the processing logic that
 gets applied to the elements in the input collection. When you use Beam, often
-the most important pieces of code you&rsquo;ll write are these <code>DoFn</code>s&ndash;they&rsquo;re what
+the most important pieces of code you&rsquo;ll write are these <code>DoFn</code>s - they&rsquo;re what
 define your pipeline&rsquo;s exact data processing tasks.</p><blockquote><p><strong>Note:</strong> When you create your <code>DoFn</code>, be mindful of the <a href=#requirements-for-writing-user-code-for-beam-transforms>Requirements
 for writing user code for Beam transforms</a>
 and ensure that your code follows them.</p></blockquote><p class=language-java>A <code>DoFn</code> processes one element at a time from the input <code>PCollection</code>. When you
@@ -368,14 +371,15 @@ that for you. Your <code>@ProcessElement</code> method should accept a parameter
 <code>@Element</code>, which will be populated with the input element. In order to output
 elements, the method can also take a parameter of type <code>OutputReceiver</code> which
 provides a method for emitting elements. The parameter types must match the input
-and output types of your <code>DoFn</code> or the framework will raise an error. Note: @Element and
-OutputReceiver were introduced in Beam 2.5.0; if using an earlier release of Beam, a
-ProcessContext parameter should be used instead.</p><p class=language-py>Inside your <code>DoFn</code> subclass, you&rsquo;ll write a method <code>process</code> where you provide
+and output types of your <code>DoFn</code> or the framework will raise an error. Note: <code>@Element</code> and
+<code>OutputReceiver</code> were introduced in Beam 2.5.0; if using an earlier release of Beam, a
+<code>ProcessContext</code> parameter should be used instead.</p><p class=language-py>Inside your <code>DoFn</code> subclass, you&rsquo;ll write a method <code>process</code> where you provide
 the actual processing logic. You don&rsquo;t need to manually extract the elements
-from the input collection; the Beam SDKs handle that for you. Your <code>process</code>
-method should accept an object of type <code>element</code>. This is the input element and
-output is emitted by using <code>yield</code> or <code>return</code> statement inside <code>process</code>
-method.</p><div class=language-java><div class=highlight><pre class=chroma><code class=language-java data-lang=java><span class=kd>static</span> <span class=kd>class</span> <span class=nc>ComputeWordLengthFn</span> <span class=kd>extends</span> <span class=n>DoFn</span><span class=o>&lt;</span><span class=n>String</span><span class=o>,</span> <span class=n>Integer</span><span class=o>&gt;</span> <span class=o>{</span>
+from the input collection; the Beam SDKs handle that for you. Your <code>process</code> method
+should accept an argument <code>element</code>, which is the input element, and return an
+iterable with its output values. You can accomplish this by emitting individual
+elements with <code>yield</code> statements. You can also use a <code>return</code> statement
+with an iterable, like a list or a generator.</p><div class=language-java><div class=highlight><pre class=chroma><code class=language-java data-lang=java><span class=kd>static</span> <span class=kd>class</span> <span class=nc>ComputeWordLengthFn</span> <span class=kd>extends</span> <span class=n>DoFn</span><span class=o>&lt;</span><span class=n>String</span><span class=o>,</span> <span class=n>Integer</span><span class=o>&gt;</span> <span class=o>{</span>
   <span class=nd>@ProcessElement</span>
   <span class=kd>public</span> <span class=kt>void</span> <span class=nf>processElement</span><span class=o>(</span><span class=nd>@Element</span> <span class=n>String</span> <span class=n>word</span><span class=o>,</span> <span class=n>OutputReceiver</span><span class=o>&lt;</span><span class=n>Integer</span><span class=o>&gt;</span> <span class=n>out</span><span class=o>)</span> <span class=o>{</span>
     <span class=c1>// Use OutputReceiver.output to emit the output element.
@@ -396,6 +400,8 @@ serialize and cache the values in your pipeline. Your method should meet the
 following requirements:</p><p class=language-java><ul><li>You should not in any way modify an element returned by
 the <code>@Element</code> annotation or <code>ProcessContext.sideInput()</code> (the incoming
 elements from the input collection).</li><li>Once you output a value using <code>OutputReceiver.output()</code> you should not modify
+that value in any way.</li></ul></p><p class=language-python><ul><li>You should not in any way modify the <code>element</code> argument provided to the
+<code>process</code> method, or any side inputs.</li><li>Once you output a value using <code>yield</code> or <code>return</code>, you should not modify
 that value in any way.</li></ul></p><h5 id=lightweight-dofns>4.2.1.3. Lightweight DoFns and other abstractions</h5><p>If your function is relatively straightforward, you can simplify your use of
 <code>ParDo</code> by providing a lightweight <code>DoFn</code> in-line, as
 <span class=language-java>an anonymous inner class instance</span>
@@ -1151,21 +1157,21 @@ If an element falls in multiple windows (for example, this will happen when usin
 <span class=k>class</span> <span class=nc>ProcessRecord</span><span class=p>(</span><span class=n>beam</span><span class=o>.</span><span class=n>DoFn</span><span class=p>):</span>
 
   <span class=k>def</span> <span class=nf>process</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>element</span><span class=p>,</span> <span class=n>window</span><span class=o>=</span><span class=n>beam</span><span class=o>.</span><span class=n>DoFn</span><span class=o>.</span><span class=n>WindowParam</span><span class=p>):</span>
-     <span class=c1># access window e.g window.end.micros</span>
+     <span class=c1># access window e.g. window.end.micros</span>
      <span class=k>pass</span>  
   </code></pre></div></div><p class=language-java><strong>PaneInfo:</strong>
 When triggers are used, Beam provides a <code>PaneInfo</code> object that contains information about the current firing. Using <code>PaneInfo</code>
 you can determine whether this is an early or a late firing, and how many times this window has already fired for this key.</p><p class=language-py><strong>PaneInfo:</strong>
 When triggers are used, Beam provides a <code>DoFn.PaneInfoParam</code> object that contains information about the current firing. Using <code>DoFn.PaneInfoParam</code>
 you can determine whether this is an early or a late firing, and how many times this window has already fired for this key.
-This feature implementation in python sdk is not fully completed, see more at <a href=https://issues.apache.org/jira/browse/BEAM-3759>BEAM-3759</a>.</p><div class=language-java><div class=highlight><pre class=chroma><code class=language-java data-lang=java><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=k>new</span> <span class=n>DoFn</span><span class=o>&lt;</span><span class=n>String</span><span class=o>,</span> <span class=n>String</span><span class=o>& [...]
+This feature implementation in Python SDK is not fully completed; see more at <a href=https://issues.apache.org/jira/browse/BEAM-3759>BEAM-3759</a>.</p><div class=language-java><div class=highlight><pre class=chroma><code class=language-java data-lang=java><span class=o>.</span><span class=na>of</span><span class=o>(</span><span class=k>new</span> <span class=n>DoFn</span><span class=o>&lt;</span><span class=n>String</span><span class=o>,</span> <span class=n>String</span><span class=o>& [...]
      <span class=kd>public</span> <span class=kt>void</span> <span class=nf>processElement</span><span class=o>(</span><span class=nd>@Element</span> <span class=n>String</span> <span class=n>word</span><span class=o>,</span> <span class=n>PaneInfo</span> <span class=n>paneInfo</span><span class=o>)</span> <span class=o>{</span>
   <span class=o>}})</span></code></pre></div></div><div class=language-py><div class=highlight><pre class=chroma><code class=language-py data-lang=py><span class=kn>import</span> <span class=nn>apache_beam</span> <span class=kn>as</span> <span class=nn>beam</span>
 
 <span class=k>class</span> <span class=nc>ProcessRecord</span><span class=p>(</span><span class=n>beam</span><span class=o>.</span><span class=n>DoFn</span><span class=p>):</span>
 
   <span class=k>def</span> <span class=nf>process</span><span class=p>(</span><span class=bp>self</span><span class=p>,</span> <span class=n>element</span><span class=p>,</span> <span class=n>pane_info</span><span class=o>=</span><span class=n>beam</span><span class=o>.</span><span class=n>DoFn</span><span class=o>.</span><span class=n>PaneInfoParam</span><span class=p>):</span>
-     <span class=c1># access pane info e.g pane_info.is_first, pane_info.is_last, pane_info.timing</span>
+     <span class=c1># access pane info, e.g. pane_info.is_first, pane_info.is_last, pane_info.timing</span>
      <span class=k>pass</span>  
   </code></pre></div></div><p class=language-java><strong>PipelineOptions:</strong>
 The <code>PipelineOptions</code> for the current pipeline can always be accessed in a process method by adding it
@@ -1176,7 +1182,7 @@ as a parameter:</p><div class=language-java><div class=highlight><pre class=chro
 a parameter of type <code>TimeDomain</code> which tells whether the timer is based on event time or processing time.
 Timers are explained in more detail in the
 <a href=/blog/2017/08/28/timely-processing.html>Timely (and Stateful) Processing with Apache Beam</a> blog post.</p><p class=language-py><strong>Timer and State:</strong>
-In addition to aforementioned parameters, user defined Timer and State parameters can be used in a Stateful DoFn.
+In addition to aforementioned parameters, user defined Timer and State parameters can be used in a stateful DoFn.
 Timers and States are explained in more detail in the
 <a href=/blog/2017/08/28/timely-processing.html>Timely (and Stateful) Processing with Apache Beam</a> blog post.</p><div class=language-py><div class=highlight><pre class=chroma><code class=language-py data-lang=py><span class=k>class</span> <span class=nc>StatefulDoFn</span><span class=p>(</span><span class=n>beam</span><span class=o>.</span><span class=n>DoFn</span><span class=p>):</span>
   <span class=s2>&#34;&#34;&#34;An example stateful DoFn with state and timer&#34;&#34;&#34;</span>
@@ -1193,7 +1199,7 @@ Timers and States are explained in more detail in the
               <span class=n>buffer_2</span><span class=o>=</span><span class=n>beam</span><span class=o>.</span><span class=n>DoFn</span><span class=o>.</span><span class=n>StateParam</span><span class=p>(</span><span class=n>BUFFER_STATE_2</span><span class=p>),</span>
               <span class=n>watermark_timer</span><span class=o>=</span><span class=n>beam</span><span class=o>.</span><span class=n>DoFn</span><span class=o>.</span><span class=n>TimerParam</span><span class=p>(</span><span class=n>WATERMARK_TIMER</span><span class=p>)):</span>
 
-    <span class=c1># Do you processing here</span>
+    <span class=c1># Do your processing here</span>
     <span class=n>key</span><span class=p>,</span> <span class=n>value</span> <span class=o>=</span> <span class=n>element</span>
     <span class=c1># Read all the data from buffer1</span>
     <span class=n>all_values_in_buffer_1</span> <span class=o>=</span> <span class=p>[</span><span class=n>x</span> <span class=k>for</span> <span class=n>x</span> <span class=ow>in</span> <span class=n>buffer_1</span><span class=o>.</span><span class=n>read</span><span class=p>()]</span>
@@ -1242,10 +1248,7 @@ transform operations:</p><ol><li>It applies a <code>ParDo</code> on the input <c
 an output <code>PCollection</code> of individual words.</li><li>It applies the Beam SDK library transform <code>Count</code> on the <code>PCollection</code> of
 words, producing a <code>PCollection</code> of key/value pairs. Each key represents a
 word in the text, and each value represents the number of times that word
-appeared in the original data.</li></ol><p>Note that this is also an example of nested composite transforms, as <code>Count</code>
-is, by itself, a composite transform.</p><p>Your composite transform&rsquo;s parameters and return value must match the initial
-input type and final return type for the entire transform, even if the
-transform&rsquo;s intermediate data changes type multiple times.</p><div class=language-java><div class=highlight><pre class=chroma><code class=language-java data-lang=java>  <span class=kd>public</span> <span class=kd>static</span> <span class=kd>class</span> <span class=nc>CountWords</span> <span class=kd>extends</span> <span class=n>PTransform</span><span class=o>&lt;</span><span class=n>PCollection</span><span class=o>&lt;</span><span class=n>String</span><span class=o>&gt;,</span>
+appeared in the original data.</li></ol><div class=language-java><div class=highlight><pre class=chroma><code class=language-java data-lang=java>  <span class=kd>public</span> <span class=kd>static</span> <span class=kd>class</span> <span class=nc>CountWords</span> <span class=kd>extends</span> <span class=n>PTransform</span><span class=o>&lt;</span><span class=n>PCollection</span><span class=o>&lt;</span><span class=n>String</span><span class=o>&gt;,</span>
       <span class=n>PCollection</span><span class=o>&lt;</span><span class=n>KV</span><span class=o>&lt;</span><span class=n>String</span><span class=o>,</span> <span class=n>Long</span><span class=o>&gt;&gt;&gt;</span> <span class=o>{</span>
     <span class=nd>@Override</span>
     <span class=kd>public</span> <span class=n>PCollection</span><span class=o>&lt;</span><span class=n>KV</span><span class=o>&lt;</span><span class=n>String</span><span class=o>,</span> <span class=n>Long</span><span class=o>&gt;&gt;</span> <span class=nf>expand</span><span class=o>(</span><span class=n>PCollection</span><span class=o>&lt;</span><span class=n>String</span><span class=o>&gt;</span> <span class=n>lines</span><span class=o>)</span> <span class=o>{</span>
@@ -1270,7 +1273,8 @@ transform&rsquo;s intermediate data changes type multiple times.</p><div class=l
         <span class=c1># Count the number of times each word occurs.</span>
         <span class=o>|</span> <span class=n>beam</span><span class=o>.</span><span class=n>combiners</span><span class=o>.</span><span class=n>Count</span><span class=o>.</span><span class=n>PerElement</span><span class=p>()</span>
         <span class=c1># Format each word and count into a printable string.</span>
-        <span class=o>|</span> <span class=s1>&#39;FormatCounts&#39;</span> <span class=o>&gt;&gt;</span> <span class=n>beam</span><span class=o>.</span><span class=n>ParDo</span><span class=p>(</span><span class=n>FormatCountsFn</span><span class=p>()))</span></code></pre></div></div><h4 id=composite-transform-creation>4.6.2. Creating a composite transform</h4><p>To create your own composite transform, create a subclass of the <code>PTransform</code>
+        <span class=o>|</span> <span class=s1>&#39;FormatCounts&#39;</span> <span class=o>&gt;&gt;</span> <span class=n>beam</span><span class=o>.</span><span class=n>ParDo</span><span class=p>(</span><span class=n>FormatCountsFn</span><span class=p>()))</span></code></pre></div></div><blockquote><p><strong>Note:</strong> Because <code>Count</code> is itself a composite transform,
+<code>CountWords</code> is also a nested composite transform.</p></blockquote><h4 id=composite-transform-creation>4.6.2. Creating a composite transform</h4><p>To create your own composite transform, create a subclass of the <code>PTransform</code>
 class and override the <code>expand</code> method to specify the actual processing logic.
 You can then use this transform just as you would a built-in transform from the
 Beam SDK.</p><p class=language-java>For the <code>PTransform</code> class type parameters, you pass the <code>PCollection</code> types
@@ -1302,7 +1306,9 @@ value.</p><p>The following code sample shows how to override <code>expand</code>
 accept the appropriate input <code>PCollection</code>(s) and return the corresponding
 output <code>PCollection</code>(s), you can include as many transforms as you want. These
 transforms can include core transforms, composite transforms, or the transforms
-included in the Beam SDK libraries.</p><p><strong>Note:</strong> The <code>expand</code> method of a <code>PTransform</code> is not meant to be invoked
+included in the Beam SDK libraries.</p><p>Your composite transform&rsquo;s parameters and return value must match the initial
+input type and final return type for the entire transform, even if the
+transform&rsquo;s intermediate data changes type multiple times.</p><p><strong>Note:</strong> The <code>expand</code> method of a <code>PTransform</code> is not meant to be invoked
 directly by the user of a transform. Instead, you should call the <code>apply</code> method
 on the <code>PCollection</code> itself, with the transform as an argument. This allows
 transforms to be nested within the structure of your pipeline.</p><h4 id=ptransform-style-guide>4.6.3. PTransform Style Guide</h4><p>The <a href=/contribute/ptransform-style-guide/>PTransform Style Guide</a>
@@ -1324,7 +1330,7 @@ your pipeline&rsquo;s final results. However, you can use a write transform to o
 a <code>PCollection</code>'s data at any point in your pipeline.</p><div class=language-java><div class=highlight><pre class=chroma><code class=language-java data-lang=java><span class=n>output</span><span class=o>.</span><span class=na>apply</span><span class=o>(</span><span class=n>TextIO</span><span class=o>.</span><span class=na>write</span><span class=o>().</span><span class=na>to</span><span class=o>(</span><span class=s>&#34;gs://some/outputData&#34;</span><span class=o>));</span> [...]
 operator you provide. Note that glob operators are filesystem-specific and obey
 filesystem-specific consistency models. The following TextIO example uses a glob
-operator (*) to read all matching input files that have prefix &ldquo;input-&rdquo; and the
+operator (<code>*</code>) to read all matching input files that have prefix &ldquo;input-&rdquo; and the
 suffix &ldquo;.csv&rdquo; in the given location:</p><div class=language-java><div class=highlight><pre class=chroma><code class=language-java data-lang=java><span class=n>p</span><span class=o>.</span><span class=na>apply</span><span class=o>(</span><span class=s>&#34;ReadFromText&#34;</span><span class=o>,</span>
     <span class=n>TextIO</span><span class=o>.</span><span class=na>read</span><span class=o>().</span><span class=na>from</span><span class=o>(</span><span class=s>&#34;protocol://my_bucket/path/to/input-*.csv&#34;</span><span class=o>));</span></code></pre></div></div><div class=language-py><div class=highlight><pre class=chroma><code class=language-py data-lang=py><span class=n>lines</span> <span class=o>=</span> <span class=n>p</span> <span class=o>|</span> <span class=s1>&#39;ReadFr [...]
 independently and then use the <a href=#flatten>Flatten</a> transform to create a single
@@ -1342,7 +1348,7 @@ JSON, Avro, Protocol Buffer, or database row objects; all of these types have we
 structures that can often be determined by examining the type. Even within a SDK pipeline, Simple Java POJOs
 (or equivalent structures in other languages) are often used as intermediate types, and these also have a
 clear structure that can be inferred by inspecting the class. By understanding the structure of a pipeline’s
-records, we can provide much more concise APIs for data processing.</p><h3 id=what-is-a-schema>6.1. What is a schema</h3><p>Most structured records share some common characteristics:</p><ul><li>They can be subdivided into separate named fields. Fields usually have string names, but sometimes - as in the case of indexed
+records, we can provide much more concise APIs for data processing.</p><h3 id=what-is-a-schema>6.1. What is a schema?</h3><p>Most structured records share some common characteristics:</p><ul><li>They can be subdivided into separate named fields. Fields usually have string names, but sometimes - as in the case of indexed
 tuples - have numerical indices instead.</li><li>There is a confined list of primitive types that a field can have. These often match primitive types in most programming
 languages: int, long, string, etc.</li><li>Often a field type can be marked as optional (sometimes referred to as nullable) or required.</li></ul><p>Often records have a nested structure. A nested structure occurs when a field itself has subfields so the
 type of the field itself has a schema. Fields that are array or map types is also a common feature of these structured
diff --git a/website/generated-content/feed.xml b/website/generated-content/feed.xml
index b8ef234..cc29f67 100644
--- a/website/generated-content/feed.xml
+++ b/website/generated-content/feed.xml
@@ -43,7 +43,45 @@ For more information on changes in 2.22.0, check out the
 &lt;/ul>
 &lt;h2 id="list-of-contributors">List of Contributors&lt;/h2>
 &lt;p>According to git shortlog, the following people contributed to the 2.22.0 release. Thank you to all contributors!&lt;/p>
-&lt;p>Ahmet Altay, aiyangar, Ajo Thomas, Akshay-Iyangar, Alan Pryor, Alexey Romanenko, Allen Pradeep Xavier, amaliujia, Andrew Pilloud, Ankur Goenka, Ashwin Ramaswami, bntnam, Borzoo Esmailloo, Boyuan Zhang, Brian Hulette, Chamikara Jayalath, Colm O hEigeartaigh, Craig Chambers, Damon Douglas, Daniel Oliveira, David Cavazos, David Moravek, Esun Kim, Etienne Chauchot, Filipe Regadas, Graeme Morgan, Hannah Jiang, Hannah-Jiang, Harch Vardhan, Heejong Lee, Henry Suryawirawan, Ismaël Mejía, I [...]
+&lt;p>Ahmet Altay, aiyangar, Ajo Thomas, Akshay-Iyangar, Alan Pryor, Alexey Romanenko, Allen Pradeep Xavier, amaliujia, Andrew Pilloud, Ankur Goenka, Ashwin Ramaswami, bntnam, Borzoo Esmailloo, Boyuan Zhang, Brian Hulette, Chamikara Jayalath, Colm O hEigeartaigh, Craig Chambers, Damon Douglas, Daniel Oliveira, David Cavazos, David Moravek, Esun Kim, Etienne Chauchot, Filipe Regadas, Graeme Morgan, Hannah Jiang, Hannah-Jiang, Harch Vardhan, Heejong Lee, Henry Suryawirawan, Ismaël Mejía, I [...]
+&lt;!--
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+&lt;p>Today, we are happy to announce a new addition to the Beam Katas family: Kotlin!&lt;/p>
+&lt;p>&lt;img src="/images/blog/beam-katas-kotlin-release/beam-and-kotlin.png" alt="Apache Beam and Kotlin Shaking Hands" height="330" width="800" >&lt;/p>
+&lt;p>You may remember &lt;a href="https://beam.apache.org/blog/beam-kata-release">a post from last year&lt;/a> that informed everyone of the wonderful Beam Katas available on &lt;a href="https://stepik.org">Stepik&lt;/a>
+for learning more about writing Apache Beam applications, working with its various APIs and programming model
+hands-on, all from the comfort of your favorite IDEs. As of today, you can now work through all of the progressive
+exercises to learn about the fundamentals of Beam in Kotlin.&lt;/p>
+&lt;p>&lt;a href="https://kotlinlang.org">Kotlin&lt;/a> is a modern, open-source, statically typed language that targets the JVM. It is most commonly used by
+Android developers, however it has recently risen in popularity due to its extensive feature set that enables
+more concise and cleaner code than Java, without sacrificing performance or type safety. It recently was &lt;a href="https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-languages-loved">ranked
+as one of the most beloved programming languages in the annual Stack Overflow Developer Survey&lt;/a>, so don&amp;rsquo;t take
+just our word for it.&lt;/p>
+&lt;p>The relationship between Apache Beam and Kotlin isn&amp;rsquo;t a new one. You can find examples scattered across the web
+of engineering teams embracing the two technologies including &lt;a href="https://beam.apache.org/blog/beam-kotlin/">a series of samples announced on this very blog&lt;/a>.
+If you are new to Beam or are an experienced veteran looking for a change of pace, we&amp;rsquo;d encourage you to give
+Kotlin a try.&lt;/p>
+&lt;p>You can find the Kotlin and the other excellent Beam Katas below (or by just searching for &amp;ldquo;Beam Katas&amp;rdquo; within
+&lt;a href="https://www.jetbrains.com/education/download/#section=idea">IntelliJ&lt;/a> or &lt;a href="https://www.jetbrains.com/education/download/#section=pycharm-edu">PyCharm&lt;/a> through &lt;a href="https://plugins.jetbrains.com/plugin/10081-edutools">the EduTools plugin&lt;/a>):&lt;/p>
+&lt;ul>
+&lt;li>&lt;a href="https://stepik.org/course/72488">&lt;strong>Kotlin&lt;/strong>&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://stepik.org/course/54530">&lt;strong>Java&lt;/strong>&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://stepik.org/course/54532">&lt;strong>Python&lt;/strong>&lt;/a>&lt;/li>
+&lt;li>&lt;a href="https://stepik.org/course/70387">&lt;strong>Go (in development)&lt;/strong>&lt;/a>&lt;/li>
+&lt;/ul>
+&lt;p>I&amp;rsquo;d like to extend a very special thanks to &lt;a href="https://twitter.com/henry_ken">Henry Suryawirawan&lt;/a> for his creation of the original series of Katas
+and his support during the review process and making this effort a reality.&lt;/p>
+&lt;p>&lt;br />&lt;/p>
+&lt;p>&lt;img src="/images/blog/beam-katas-kotlin-release/beam-katas-in-edutools.png" alt="Access Beam Katas Kotlin through a JetBrains Educational Product" height="252" width="800" >&lt;/p></description><link>/blog/beam-katas-kotlin-release/</link><pubDate>Mon, 01 Jun 2020 00:00:01 -0800</pubDate><guid>/blog/beam-katas-kotlin-release/</guid><category>blog</category></item><item><title>Python SDK Typing Changes</title><description>
 &lt;!--
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
@@ -684,65 +722,4 @@ Salman Raza, Sam Rohde, Saul Chavez, Shoaib, Shoaib Zafar, Slava Chernyak, Tanay
 Thinh Ha, Thomas Weise, Tianzi Cai, Tim van der Lippe, Tomer Zeltzer, Tudor Marian,
 Udi Meiri, Valentyn Tymofieiev, Yichi Zhang, Yifan Zou, Yueyang Qiu, gxercavins,
 jesusrv1103, lostluck, matt-darwin, mrociorg, ostrokach, parahul, rahul8383, rosetn,
-sunjincheng121, the1plummie, ttanay, tvalentyn, venn001, yoshiki.obata, Łukasz Gajowy&lt;/p></description><link>/blog/beam-2.16.0/</link><pubDate>Mon, 07 Oct 2019 00:00:01 -0800</pubDate><guid>/blog/beam-2.16.0/</guid><category>blog</category></item><item><title>Google Summer of Code '19</title><description>
-&lt;!--
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-http://www.apache.org/licenses/LICENSE-2.0
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-&lt;p>Google Summer of Code was an amazing learning experience for me.
-I contributed to open source, learned about Apache Beam’s internals and worked with the best engineers in the world.&lt;/p>
-&lt;h2 id="motivation">Motivation&lt;/h2>
-&lt;p>Two of my friends had participated in GSoC in 2018. I was intrigued by their experience.
-The idea of working on open-source software that could potentially be used by developers across the world, while being mentored by the best people in a field was exciting!
-So, I decided to give Google Summer of Code a shot this year.&lt;/p>
-&lt;h2 id="what-is-google-summer-of-code">What is Google Summer of Code?&lt;/h2>
-&lt;p>&lt;a href="https://summerofcode.withgoogle.com/">Google Summer of Code&lt;/a> is a global program hosted by Google focused on introducing students to open source software development.
-Students work on a 3 month programming project with an open source organization during their break from university.&lt;/p>
-&lt;h2 id="why-apache-beam">Why Apache Beam?&lt;/h2>
-&lt;p>While interning at &lt;a href="https://atlan.com/">Atlan&lt;/a>, I discovered the field of Data Engineering. I found the challenges and the discussions of the engineers there interesting. While researching for my internship project, I came across the Streaming Systems book. It introduced me to the unified model of Apache Beam for Batch and Streaming Systems, which I was fascinated by.
-I wanted to explore Data Engineering, so for GSoC, I wanted to work on a project in that field. Towards the end of my internship, I started contributing to Apache Airflow(very cool project) and Apache Beam, hoping one of them would participate in GSoC. I got lucky!&lt;/p>
-&lt;p>&lt;a href="https://youtu.be/U2eWLb-LD44">Also, Spotify’s Discover Weekly uses Apache Beam!&lt;/a>&lt;/p>
-&lt;h2 id="preparation">Preparation&lt;/h2>
-&lt;p>I had already read the &lt;a href="http://streamingsystems.net/">Streaming Systems book&lt;/a>. So, I had an idea of the concepts that Beam is built on, but had never actually used Beam.
-Before actually submitting a proposal, I went through a bunch of resources to make sure I had a concrete understanding of Beam.
-I read the &lt;a href="https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101">Streaming 101&lt;/a> and &lt;a href="https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-102">Streaming 102&lt;/a> blogs by Tyler Akidau. They are the perfect introduction to Beam’s unified model for Batch and Streaming.
-In addition, I watched all Beam talks on YouTube. You can find them on the &lt;a href="https://beam.apache.org/documentation/resources/videos-and-podcasts/">Beam Website&lt;/a>.
-Beam has really good documentation. The &lt;a href="https://beam.apache.org/documentation/programming-guide/">Programming Guide&lt;/a> lays out all of Beam’s concepts really well. &lt;a href="https://beam.apache.org/documentation/runtime/model">Beam’s execution model&lt;/a> is also documented well and is a must-read to understand how Beam processes data.
-&lt;a href="https://www.waitingforcode.com/apache-beam">waitingforcode.com&lt;/a> also has good blog posts about Beam concepts.
-To get a better sense of the Beam codebase, I played around with it and worked on some PRs to understand Beam better and got familiar with the test suite and workflows.&lt;/p>
-&lt;h2 id="gsoc-journey">GSoC Journey&lt;/h2>
-&lt;p>GSoC has 2 phases. The first is the Community Bonding period in which students get familiar with the project and the community. The other is the actual Coding Period in which students work on their projects. Since the Coding Period has three evaluations spaced out by a month, I divided my project into three parts focusing on the implementation, tests, and documentation or improvements.&lt;/p>
-&lt;h3 id="project">Project&lt;/h3>
-&lt;p>My project(&lt;a href="https://issues.apache.org/jira/browse/BEAM-6611">BEAM-6611&lt;/a>) added support for File Loads method of inserting data into BigQuery for streaming pipelines. It builds on PR - &lt;a href="https://github.com/apache/beam/pull/7655">#7655&lt;/a> for &lt;a href="https://issues.apache.org/jira/browse/BEAM-6553">BEAM-6553&lt;/a> that added support in the Python SDK for writing to BigQuery using File Loads method for Batch pipelines. Streaming pipelines with non-d [...]
-You can find my proposal &lt;a href="https://docs.google.com/document/d/15Peyd3Z_wu5rvGWw8lMLpZuTyyreM_JOAEFFWvF97YY/edit?usp=sharing">here&lt;/a>.&lt;/p>
-&lt;h3 id="community-bonding">Community Bonding&lt;/h3>
-&lt;p>When GSoC started, my semester end exams had not yet finished. As a result, I couldn’t get much done. I worked on three PTransforms for the Python SDK - Latest, WithKeys and Reify.&lt;/p>
-&lt;h3 id="coding-period-i">Coding Period I&lt;/h3>
-&lt;p>In this period, I wrote some Integration Tests for the BigQuery sink using Streaming Inserts in streaming mode. I worked on a failing integration test for my project. I also finished the implementation of my project. But, one PostCommit test didn’t pass. I realized that the matcher for the Integration Test that queried BigQuery for the results was intended to be used in Batch mode. So, I wrote a version of the matcher to work in streaming mode.&lt;/p>
-&lt;h3 id="coding-period-ii">Coding Period II&lt;/h3>
-&lt;p>Even after I had added the matcher for streaming mode, the PostComit tests did not pass. A test was being run even though it was not specified. I isolated the failure to a &lt;a href="https://nose.readthedocs.io/en/latest/doc_tests/test_multiprocess/multiprocess.html#other-differences-in-test-running">limitation&lt;/a> of the multiprocess plugin for &lt;a href="https://nose.readthedocs.io/en/latest/">nose(a Python test framework)&lt;/a> due to which it found more tests than had bee [...]
-I also worked on small issues related to testing.&lt;/p>
-&lt;p>This period was marked by a few exciting events:&lt;/p>
-&lt;ul>
-&lt;li>Ending up in the top #100 contributors to apache/beam.&lt;/li>
-&lt;li>My first ever PR Review on an open source project.&lt;/li>
-&lt;/ul>
-&lt;p>&lt;img src="https://pbs.twimg.com/media/D_XNSC-UIAUmswG?format=png&amp;name=small" alt="Weird flex but ok" />&lt;/p>
-&lt;h3 id="coding-period-iii">Coding Period III&lt;/h3>
-&lt;p>This was the final coding period before the program ended. Since my project was merged earlier than expected, my mentor suggested another issue(&lt;a href="https://issues.apache.org/jira/browse/BEAM-7742">BEAM-7742&lt;/a>) in the same area - BigQueryIO, that I found interesting. So, I worked on partitioning written files in BigQuery to ensure that all load jobs triggered adhere to the load job size limitations specified for BigQuery.
-While working on my project, I was using a pipeline that uses PubSub as a source and BigQuery as a sink to validate my changes. My mentor suggested we add them to the Beam test suite as it would be the ultimate test for BigQueryIO. I also worked on adding this test to Beam.&lt;/p>
-&lt;p>You can find the list of PRs I worked on &lt;a href="https://github.com/apache/beam/pulls?utf8=%E2%9C%93&amp;amp;q=is%3Apr+author%3Attanay">here&lt;/a>.&lt;/p>
-&lt;h2 id="conclusion">Conclusion&lt;/h2>
-&lt;p>GSoC has been a lesson in discipline and goal-setting for me. Deciding what I wanted to work on and how much I wanted to get done each week was an important lesson.
-I had never worked remotely, so this was a new experience. Although I struggled with it initially, I appreciate the flexibility that it comes with.
-I also had a lot of fun learning about Apache Beam’s internals, and other tools in the same ecosystem.
-This was also the first time I had written code with a test-first approach.&lt;/p>
-&lt;p>I thank my mentor - Pablo Estrada, Apache Beam, The Apache Software Foundation and Google Summer of Code for this opportunity. I am also grateful to my mentor for helping me with everything I needed and more, and the Apache Beam community for being supportive and encouraging.&lt;/p>
-&lt;p>With the right effort, perseverance, conviction, and a plan, anything is possible. Anything.&lt;/p></description><link>/blog/gsoc-19/</link><pubDate>Wed, 04 Sep 2019 00:00:01 -0800</pubDate><guid>/blog/gsoc-19/</guid><category>blog</category><category>gsoc</category></item></channel></rss>
\ No newline at end of file
+sunjincheng121, the1plummie, ttanay, tvalentyn, venn001, yoshiki.obata, Łukasz Gajowy&lt;/p></description><link>/blog/beam-2.16.0/</link><pubDate>Mon, 07 Oct 2019 00:00:01 -0800</pubDate><guid>/blog/beam-2.16.0/</guid><category>blog</category></item></channel></rss>
\ No newline at end of file
diff --git a/website/generated-content/images/blog/beam-katas-kotlin-release/beam-and-kotlin.png b/website/generated-content/images/blog/beam-katas-kotlin-release/beam-and-kotlin.png
new file mode 100644
index 0000000..13bf0f9
Binary files /dev/null and b/website/generated-content/images/blog/beam-katas-kotlin-release/beam-and-kotlin.png differ
diff --git a/website/generated-content/images/blog/beam-katas-kotlin-release/beam-katas-in-edutools.png b/website/generated-content/images/blog/beam-katas-kotlin-release/beam-katas-in-edutools.png
new file mode 100644
index 0000000..a3e59e7
Binary files /dev/null and b/website/generated-content/images/blog/beam-katas-kotlin-release/beam-katas-in-edutools.png differ
diff --git a/website/generated-content/index.html b/website/generated-content/index.html
index f30018c..b066ea5 100644
--- a/website/generated-content/index.html
+++ b/website/generated-content/index.html
@@ -5,7 +5,7 @@
 <a class="button button--primary" href=/get-started/try-apache-beam/>Try Beam</a>
 <a class="button button--primary" href=/get-started/downloads/>Download Beam SDK 2.22.0</a></div><div class=hero__ctas><a class=button href=/get-started/quickstart-java/>Java Quickstart</a>
 <a class=button href=/get-started/quickstart-py/>Python Quickstart</a>
-<a class=button href=/get-started/quickstart-go/>Go Quickstart</a></div></div></div><div class=hero__cols__col><div class=hero__blog><div class=hero__blog__title>The latest from the blog</div><div class=hero__blog__cards><a class=hero__blog__cards__card href=/blog/beam-2.22.0/><div class=hero__blog__cards__card__title>Apache Beam 2.22.0</div><div class=hero__blog__cards__card__date>Jun 8, 2020</div></a><a class=hero__blog__cards__card href=/blog/python-typing/><div class=hero__blog__card [...]
+<a class=button href=/get-started/quickstart-go/>Go Quickstart</a></div></div></div><div class=hero__cols__col><div class=hero__blog><div class=hero__blog__title>The latest from the blog</div><div class=hero__blog__cards><a class=hero__blog__cards__card href=/blog/beam-2.22.0/><div class=hero__blog__cards__card__title>Apache Beam 2.22.0</div><div class=hero__blog__cards__card__date>Jun 8, 2020</div></a><a class=hero__blog__cards__card href=/blog/beam-katas-kotlin-release/><div class=hero [...]
 <a class="button button--primary" href=/get-started/downloads/>Download Beam SDK 2.22.0</a></div><div class=ctas__ctas><a class=button href=/get-started/quickstart-java/>Java Quickstart</a>
 <a class=button href=/get-started/quickstart-py/>Python Quickstart</a>
 <a class=button href=/get-started/quickstart-go/>Go Quickstart</a></div></div></div><footer class=footer><div class=footer__contained><div class=footer__cols><div class=footer__cols__col><div class=footer__cols__col__logo><img src=/images/beam_logo_circle.svg class=footer__logo alt="Beam logo"></div><div class=footer__cols__col__logo><img src=/images/apache_logo_circle.svg class=footer__logo alt="Apache logo"></div></div><div class="footer__cols__col footer__cols__col--md"><div class=foo [...]
diff --git a/website/generated-content/sitemap.xml b/website/generated-content/sitemap.xml
index e40e8b9..d8b49cd 100644
--- a/website/generated-content/sitemap.xml
+++ b/website/generated-content/sitemap.xml
@@ -1 +1 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"><url><loc>/blog/beam-2.22.0/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/categories/blog/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/blog/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/categories/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/catego [...]
\ No newline at end of file
+<?xml version="1.0" encoding="utf-8" standalone="yes"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"><url><loc>/blog/beam-2.22.0/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/categories/blog/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/blog/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/categories/</loc><lastmod>2020-06-08T14:13:37-07:00</lastmod></url><url><loc>/blog/b [...]
\ No newline at end of file