You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pekko.apache.org by fa...@apache.org on 2023/04/13 18:51:46 UTC
[incubator-pekko-site] branch asf-staging updated: add pekko samples docs
This is an automated email from the ASF dual-hosted git repository.
fanningpj pushed a commit to branch asf-staging
in repository https://gitbox.apache.org/repos/asf/incubator-pekko-site.git
The following commit(s) were added to refs/heads/asf-staging by this push:
new a575f156 add pekko samples docs
a575f156 is described below
commit a575f156bf80af1816e1410333182ab0dcef073e
Author: PJ Fanning <pj...@users.noreply.github.com>
AuthorDate: Thu Apr 13 20:51:38 2023 +0200
add pekko samples docs
---
.../pekko-sample-cluster-java/css/fonts/icons.eot | Bin 0 -> 1760 bytes
.../pekko-sample-cluster-java/css/fonts/icons.svg | 12 +
.../pekko-sample-cluster-java/css/fonts/icons.ttf | Bin 0 -> 1604 bytes
.../pekko-sample-cluster-java/css/fonts/icons.woff | Bin 0 -> 1240 bytes
.../current/pekko-sample-cluster-java/css/page.css | 965 +++++++++++++++++++++
.../pekko-sample-cluster-java/css/print.css | 27 +
.../pekko-sample-cluster-java/css/single.css | 63 ++
.../current/pekko-sample-cluster-java/index.html | 271 ++++++
.../current/pekko-sample-cluster-java/js/groups.js | 167 ++++
.../pekko-sample-cluster-java/js/magellan.js | 25 +
.../current/pekko-sample-cluster-java/js/page.js | 2 +
.../pekko-sample-cluster-java/js/snippets.js | 6 +
.../pekko-sample-cluster-java/js/warnOldVersion.js | 23 +
.../lib/foundation/dist/foundation.min.css | 2 +
.../lib/foundation/dist/foundation.min.js | 4 +
.../lib/jquery/jquery.min.js | 5 +
.../lib/prettify/lang-scala.js | 2 +
.../lib/prettify/prettify.css | 1 +
.../lib/prettify/prettify.js | 30 +
.../current/pekko-sample-cluster-java/paradox.json | 4 +
.../pekko-sample-cluster-java/print-toc.xslt | 74 ++
.../pekko-sample-cluster-scala/css/fonts/icons.eot | Bin 0 -> 1760 bytes
.../pekko-sample-cluster-scala/css/fonts/icons.svg | 12 +
.../pekko-sample-cluster-scala/css/fonts/icons.ttf | Bin 0 -> 1604 bytes
.../css/fonts/icons.woff | Bin 0 -> 1240 bytes
.../pekko-sample-cluster-scala/css/page.css | 965 +++++++++++++++++++++
.../pekko-sample-cluster-scala/css/print.css | 27 +
.../pekko-sample-cluster-scala/css/single.css | 63 ++
.../current/pekko-sample-cluster-scala/index.html | 271 ++++++
.../pekko-sample-cluster-scala/js/groups.js | 167 ++++
.../pekko-sample-cluster-scala/js/magellan.js | 25 +
.../current/pekko-sample-cluster-scala/js/page.js | 2 +
.../pekko-sample-cluster-scala/js/snippets.js | 6 +
.../js/warnOldVersion.js | 23 +
.../lib/foundation/dist/foundation.min.css | 2 +
.../lib/foundation/dist/foundation.min.js | 4 +
.../lib/jquery/jquery.min.js | 5 +
.../lib/prettify/lang-scala.js | 2 +
.../lib/prettify/prettify.css | 1 +
.../lib/prettify/prettify.js | 30 +
.../pekko-sample-cluster-scala/paradox.json | 4 +
.../pekko-sample-cluster-scala/print-toc.xslt | 74 ++
.../css/fonts/icons.eot | Bin 0 -> 1760 bytes
.../css/fonts/icons.svg | 12 +
.../css/fonts/icons.ttf | Bin 0 -> 1604 bytes
.../css/fonts/icons.woff | Bin 0 -> 1240 bytes
.../css/page.css | 965 +++++++++++++++++++++
.../css/print.css | 27 +
.../css/single.css | 63 ++
.../pekko-sample-distributed-data-java/index.html | 242 ++++++
.../js/groups.js | 167 ++++
.../js/magellan.js | 25 +
.../pekko-sample-distributed-data-java/js/page.js | 2 +
.../js/snippets.js | 6 +
.../js/warnOldVersion.js | 23 +
.../lib/foundation/dist/foundation.min.css | 2 +
.../lib/foundation/dist/foundation.min.js | 4 +
.../lib/jquery/jquery.min.js | 5 +
.../lib/prettify/lang-scala.js | 2 +
.../lib/prettify/prettify.css | 1 +
.../lib/prettify/prettify.js | 30 +
.../paradox.json | 4 +
.../print-toc.xslt | 74 ++
.../css/fonts/icons.eot | Bin 0 -> 1760 bytes
.../css/fonts/icons.svg | 12 +
.../css/fonts/icons.ttf | Bin 0 -> 1604 bytes
.../css/fonts/icons.woff | Bin 0 -> 1240 bytes
.../css/page.css | 965 +++++++++++++++++++++
.../css/print.css | 27 +
.../css/single.css | 63 ++
.../pekko-sample-distributed-data-scala/index.html | 238 +++++
.../js/groups.js | 167 ++++
.../js/magellan.js | 25 +
.../pekko-sample-distributed-data-scala/js/page.js | 2 +
.../js/snippets.js | 6 +
.../js/warnOldVersion.js | 23 +
.../lib/foundation/dist/foundation.min.css | 2 +
.../lib/foundation/dist/foundation.min.js | 4 +
.../lib/jquery/jquery.min.js | 5 +
.../lib/prettify/lang-scala.js | 2 +
.../lib/prettify/prettify.css | 1 +
.../lib/prettify/prettify.js | 30 +
.../paradox.json | 4 +
.../print-toc.xslt | 74 ++
.../css/fonts/icons.eot | Bin 0 -> 1760 bytes
.../css/fonts/icons.svg | 12 +
.../css/fonts/icons.ttf | Bin 0 -> 1604 bytes
.../css/fonts/icons.woff | Bin 0 -> 1240 bytes
.../css/page.css | 965 +++++++++++++++++++++
.../css/print.css | 27 +
.../css/single.css | 63 ++
.../index.html | 334 +++++++
.../js/groups.js | 167 ++++
.../js/magellan.js | 25 +
.../js/page.js | 2 +
.../js/snippets.js | 6 +
.../js/warnOldVersion.js | 23 +
.../lib/foundation/dist/foundation.min.css | 2 +
.../lib/foundation/dist/foundation.min.js | 4 +
.../lib/jquery/jquery.min.js | 5 +
.../lib/prettify/lang-scala.js | 2 +
.../lib/prettify/prettify.css | 1 +
.../lib/prettify/prettify.js | 30 +
.../paradox.json | 4 +
.../print-toc.xslt | 74 ++
.../pekko-sample-fsm-java/css/fonts/icons.eot | Bin 0 -> 1760 bytes
.../pekko-sample-fsm-java/css/fonts/icons.svg | 12 +
.../pekko-sample-fsm-java/css/fonts/icons.ttf | Bin 0 -> 1604 bytes
.../pekko-sample-fsm-java/css/fonts/icons.woff | Bin 0 -> 1240 bytes
.../current/pekko-sample-fsm-java/css/page.css | 965 +++++++++++++++++++++
.../current/pekko-sample-fsm-java/css/print.css | 27 +
.../current/pekko-sample-fsm-java/css/single.css | 63 ++
.../current/pekko-sample-fsm-java/index.html | 180 ++++
.../current/pekko-sample-fsm-java/js/groups.js | 167 ++++
.../current/pekko-sample-fsm-java/js/magellan.js | 25 +
.../current/pekko-sample-fsm-java/js/page.js | 2 +
.../current/pekko-sample-fsm-java/js/snippets.js | 6 +
.../pekko-sample-fsm-java/js/warnOldVersion.js | 23 +
.../lib/foundation/dist/foundation.min.css | 2 +
.../lib/foundation/dist/foundation.min.js | 4 +
.../pekko-sample-fsm-java/lib/jquery/jquery.min.js | 5 +
.../lib/prettify/lang-scala.js | 2 +
.../lib/prettify/prettify.css | 1 +
.../pekko-sample-fsm-java/lib/prettify/prettify.js | 30 +
.../current/pekko-sample-fsm-java/paradox.json | 4 +
.../current/pekko-sample-fsm-java/print-toc.xslt | 74 ++
.../pekko-sample-fsm-scala/css/fonts/icons.eot | Bin 0 -> 1760 bytes
.../pekko-sample-fsm-scala/css/fonts/icons.svg | 12 +
.../pekko-sample-fsm-scala/css/fonts/icons.ttf | Bin 0 -> 1604 bytes
.../pekko-sample-fsm-scala/css/fonts/icons.woff | Bin 0 -> 1240 bytes
.../current/pekko-sample-fsm-scala/css/page.css | 965 +++++++++++++++++++++
.../current/pekko-sample-fsm-scala/css/print.css | 27 +
.../current/pekko-sample-fsm-scala/css/single.css | 63 ++
.../current/pekko-sample-fsm-scala/index.html | 180 ++++
.../current/pekko-sample-fsm-scala/js/groups.js | 167 ++++
.../current/pekko-sample-fsm-scala/js/magellan.js | 25 +
.../current/pekko-sample-fsm-scala/js/page.js | 2 +
.../current/pekko-sample-fsm-scala/js/snippets.js | 6 +
.../pekko-sample-fsm-scala/js/warnOldVersion.js | 23 +
.../lib/foundation/dist/foundation.min.css | 2 +
.../lib/foundation/dist/foundation.min.js | 4 +
.../lib/jquery/jquery.min.js | 5 +
.../lib/prettify/lang-scala.js | 2 +
.../lib/prettify/prettify.css | 1 +
.../lib/prettify/prettify.js | 30 +
.../current/pekko-sample-fsm-scala/paradox.json | 4 +
.../current/pekko-sample-fsm-scala/print-toc.xslt | 74 ++
.../css/fonts/icons.eot | Bin 0 -> 1760 bytes
.../css/fonts/icons.svg | 12 +
.../css/fonts/icons.ttf | Bin 0 -> 1604 bytes
.../css/fonts/icons.woff | Bin 0 -> 1240 bytes
.../css/page.css | 965 +++++++++++++++++++++
.../css/print.css | 27 +
.../css/single.css | 63 ++
.../index.html | 296 +++++++
.../js/groups.js | 167 ++++
.../js/magellan.js | 25 +
.../js/page.js | 2 +
.../js/snippets.js | 6 +
.../js/warnOldVersion.js | 23 +
.../lib/foundation/dist/foundation.min.css | 2 +
.../lib/foundation/dist/foundation.min.js | 4 +
.../lib/jquery/jquery.min.js | 5 +
.../lib/prettify/lang-scala.js | 2 +
.../lib/prettify/prettify.css | 1 +
.../lib/prettify/prettify.js | 30 +
.../paradox.json | 4 +
.../print-toc.xslt | 74 ++
.../css/fonts/icons.eot | Bin 0 -> 1760 bytes
.../css/fonts/icons.svg | 12 +
.../css/fonts/icons.ttf | Bin 0 -> 1604 bytes
.../css/fonts/icons.woff | Bin 0 -> 1240 bytes
.../pekko-sample-persistence-java/css/page.css | 965 +++++++++++++++++++++
.../pekko-sample-persistence-java/css/print.css | 27 +
.../pekko-sample-persistence-java/css/single.css | 63 ++
.../pekko-sample-persistence-java/index.html | 175 ++++
.../pekko-sample-persistence-java/js/groups.js | 167 ++++
.../pekko-sample-persistence-java/js/magellan.js | 25 +
.../pekko-sample-persistence-java/js/page.js | 2 +
.../pekko-sample-persistence-java/js/snippets.js | 6 +
.../js/warnOldVersion.js | 23 +
.../lib/foundation/dist/foundation.min.css | 2 +
.../lib/foundation/dist/foundation.min.js | 4 +
.../lib/jquery/jquery.min.js | 5 +
.../lib/prettify/lang-scala.js | 2 +
.../lib/prettify/prettify.css | 1 +
.../lib/prettify/prettify.js | 30 +
.../pekko-sample-persistence-java/paradox.json | 4 +
.../pekko-sample-persistence-java/print-toc.xslt | 74 ++
.../css/fonts/icons.eot | Bin 0 -> 1760 bytes
.../css/fonts/icons.svg | 12 +
.../css/fonts/icons.ttf | Bin 0 -> 1604 bytes
.../css/fonts/icons.woff | Bin 0 -> 1240 bytes
.../pekko-sample-persistence-scala/css/page.css | 965 +++++++++++++++++++++
.../pekko-sample-persistence-scala/css/print.css | 27 +
.../pekko-sample-persistence-scala/css/single.css | 63 ++
.../pekko-sample-persistence-scala/index.html | 176 ++++
.../pekko-sample-persistence-scala/js/groups.js | 167 ++++
.../pekko-sample-persistence-scala/js/magellan.js | 25 +
.../pekko-sample-persistence-scala/js/page.js | 2 +
.../pekko-sample-persistence-scala/js/snippets.js | 6 +
.../js/warnOldVersion.js | 23 +
.../lib/foundation/dist/foundation.min.css | 2 +
.../lib/foundation/dist/foundation.min.js | 4 +
.../lib/jquery/jquery.min.js | 5 +
.../lib/prettify/lang-scala.js | 2 +
.../lib/prettify/prettify.css | 1 +
.../lib/prettify/prettify.js | 30 +
.../pekko-sample-persistence-scala/paradox.json | 4 +
.../pekko-sample-persistence-scala/print-toc.xslt | 74 ++
.../pekko-sample-sharding-java/css/fonts/icons.eot | Bin 0 -> 1760 bytes
.../pekko-sample-sharding-java/css/fonts/icons.svg | 12 +
.../pekko-sample-sharding-java/css/fonts/icons.ttf | Bin 0 -> 1604 bytes
.../css/fonts/icons.woff | Bin 0 -> 1240 bytes
.../pekko-sample-sharding-java/css/page.css | 965 +++++++++++++++++++++
.../pekko-sample-sharding-java/css/print.css | 27 +
.../pekko-sample-sharding-java/css/single.css | 63 ++
.../current/pekko-sample-sharding-java/index.html | 273 ++++++
.../pekko-sample-sharding-java/js/groups.js | 167 ++++
.../pekko-sample-sharding-java/js/magellan.js | 25 +
.../current/pekko-sample-sharding-java/js/page.js | 2 +
.../pekko-sample-sharding-java/js/snippets.js | 6 +
.../js/warnOldVersion.js | 23 +
.../lib/foundation/dist/foundation.min.css | 2 +
.../lib/foundation/dist/foundation.min.js | 4 +
.../lib/jquery/jquery.min.js | 5 +
.../lib/prettify/lang-scala.js | 2 +
.../lib/prettify/prettify.css | 1 +
.../lib/prettify/prettify.js | 30 +
.../pekko-sample-sharding-java/paradox.json | 4 +
.../pekko-sample-sharding-java/print-toc.xslt | 74 ++
.../css/fonts/icons.eot | Bin 0 -> 1760 bytes
.../css/fonts/icons.svg | 12 +
.../css/fonts/icons.ttf | Bin 0 -> 1604 bytes
.../css/fonts/icons.woff | Bin 0 -> 1240 bytes
.../pekko-sample-sharding-scala/css/page.css | 965 +++++++++++++++++++++
.../pekko-sample-sharding-scala/css/print.css | 27 +
.../pekko-sample-sharding-scala/css/single.css | 63 ++
.../current/pekko-sample-sharding-scala/index.html | 271 ++++++
.../pekko-sample-sharding-scala/js/groups.js | 167 ++++
.../pekko-sample-sharding-scala/js/magellan.js | 25 +
.../current/pekko-sample-sharding-scala/js/page.js | 2 +
.../pekko-sample-sharding-scala/js/snippets.js | 6 +
.../js/warnOldVersion.js | 23 +
.../lib/foundation/dist/foundation.min.css | 2 +
.../lib/foundation/dist/foundation.min.js | 4 +
.../lib/jquery/jquery.min.js | 5 +
.../lib/prettify/lang-scala.js | 2 +
.../lib/prettify/prettify.css | 1 +
.../lib/prettify/prettify.js | 30 +
.../pekko-sample-sharding-scala/paradox.json | 4 +
.../pekko-sample-sharding-scala/print-toc.xslt | 74 ++
252 files changed, 19851 insertions(+)
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/fonts/icons.eot b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/fonts/icons.eot
new file mode 100644
index 00000000..a5203e87
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/fonts/icons.eot differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/fonts/icons.svg b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/fonts/icons.svg
new file mode 100644
index 00000000..58c74882
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/fonts/icons.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by Fontastic.me</metadata>
+<defs>
+<font id="icons" horiz-adv-x="512">
+<font-face font-family="icons" units-per-em="512" ascent="480" descent="-32"/>
+<missing-glyph horiz-adv-x="512" />
+
+<glyph unicode="§" d="M202 136c5 5 10 7 17 7 7 0 13-2 19-7 10-11 10-23 0-36 0 0-22-20-22-20-19-19-42-29-68-29-26 0-49 10-68 29-19 19-29 42-29 67 0 27 10 50 29 69 0 0 76 76 76 76 24 23 48 36 73 39 26 3 47-4 66-22 5-5 8-11 8-18 0-7-3-13-8-19-12-11-24-11-36 0-17 17-40 11-68-17 0 0-75-75-75-75-9-9-14-20-14-33 0-13 5-23 14-31 9-9 19-14 32-14 13 0 23 5 32 14 0 0 22 20 22 20m230 294c19-19 29-42 29-68 0-26-10-49-29-68 0 0-81-81-81-81-25-25-51-37-77-37-21 0-40 9-57 26-5 5-7 10-7 17 0 7 2 13 [...]
+<glyph unicode="⌂" d="M480 249c6-6 8-10 6-14-2-4-6-6-14-6 0 0-43 0-43 0 0 0 0-158 0-158 0-5 0-9 0-11-1-2-2-5-4-7-3-2-7-3-12-3 0 0-105 0-105 0 0 0 0 159 0 159 0 0-104 0-104 0 0 0 0-159 0-159 0 0-99 0-99 0-10 0-16 2-18 5-3 4-4 9-4 16 0 0 0 158 0 158 0 0-43 0-43 0-7 0-12 2-14 6-1 4 0 8 6 14 0 0 205 206 205 206 5 5 12 8 19 8 8 0 14-3 20-8 0 0 204-206 204-206"/>
+</font></defs></svg>
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/fonts/icons.ttf b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/fonts/icons.ttf
new file mode 100644
index 00000000..6da4b13e
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/fonts/icons.ttf differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/fonts/icons.woff b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/fonts/icons.woff
new file mode 100644
index 00000000..2c7e917b
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/fonts/icons.woff differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/page.css b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/page.css
new file mode 100644
index 00000000..7be66ced
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/page.css
@@ -0,0 +1,965 @@
+@charset "UTF-8";
+
+/* fonts */
+
+@font-face {
+ font-family: "icons";
+ src:url("fonts/icons.eot");
+ src:url("fonts/icons.eot?#iefix") format("embedded-opentype"),
+ url("fonts/icons.woff") format("woff"),
+ url("fonts/icons.ttf") format("truetype"),
+ url("fonts/icons.svg#icons") format("svg");
+ font-weight: normal;
+ font-style: normal;
+}
+
+/* body */
+
+body {
+ background: #fff;
+ padding: 0;
+ margin: 0;
+ font-weight: 400;
+ font-style: normal;
+ line-height: 1.4em;
+ position: relative;
+ cursor: default;
+ font: 1em "Roboto", "Helvetica Neue", "Helvetica", Arial, sans-serif;
+ color: #333333;
+ font-smoothing: antialiased;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-size-adjust: none;
+ text-rendering: optimizeLegibility;
+}
+
+/* headers */
+
+h1 {
+ font-family: inherit;
+ font-size: 2.6em;
+ font-weight: 300;
+ color: #333333;
+ margin-bottom: 0.4em;
+ margin-top: 1.1em;
+}
+
+h1:first-child {
+ margin-top: 0;
+}
+
+h2 {
+ font-family: inherit;
+ font-size: 1.8em;
+ font-weight: 400;
+ color: #333333;
+ margin-bottom: 0.2em;
+ margin-top: 1.3em;
+}
+
+h2:first-child {
+ margin-top: 0;
+}
+
+h3 {
+ font-family: inherit;
+ font-size: 1.125em;
+ font-weight: 700;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h3:first-child {
+ margin-top: 0;
+}
+
+h4 {
+ font-family: inherit;
+ font-size: 1em;
+ font-weight: 700;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h4:first-child {
+ margin-top: 0;
+}
+
+h5 {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h5:first-child {
+ margin-top: 0;
+}
+
+h6 {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h6:first-child {
+ margin-top: 0;
+}
+
+/* text */
+
+p {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ line-height: 1.45em;
+ margin: 1em 0em;
+}
+
+/* links */
+
+a {
+ font-family: inherit;
+ color: #4078c0;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+a:link {
+ color: #4078c0;
+}
+
+a:visited {
+ color: #4078c0;
+}
+
+a:hover {
+ color: #4078c0;
+ text-decoration: underline;
+}
+
+a:active {
+ color: #4078c0;
+}
+
+/* header anchors */
+
+a.anchor .anchor-link:before {
+ content: "§";
+}
+
+.site-content .page-content .prettyprint .snippet-button {
+ float: right;
+ text-decoration: none;
+ font-size: 0.75rem;
+ font-weight: bold;
+ font-family: "Roboto", "Helvetica Neue", "Helvetica", Arial, sans-serif;
+ speak: none;
+ color: #4078c0;
+ border: 2px solid #e5e6e4;
+ padding: 4px 4px;
+ margin-left: 8px;
+ line-height: 1.2;
+ vertical-align: middle;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.site-content .page-content .prettyprint .snippet-button:hover {
+ background-color: #e5e6e4;
+ border: 2px solid #4078c0;
+}
+
+a.anchor .anchor-link {
+ font-size: 18px;
+ font-family: "icons" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1.2;
+ vertical-align: middle;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor {
+ visibility: hidden;
+ position: absolute;
+ display: block;
+ width: 30px;
+ margin-left: -30px;
+ padding-right: 3px;
+ text-align: right;
+ text-decoration: none;
+}
+
+h1:hover > a.anchor, h2:hover > a.anchor, h3:hover > a.anchor, h4:hover > a.anchor, h5:hover > a.anchor, h6:hover > a.anchor {
+ visibility: visible;
+ color: inherit;
+ text-decoration: none;
+}
+
+
+/* table */
+
+table th {
+ background: #ffffff;
+ border: solid 1px #dddddd;
+}
+
+table td {
+ background: #ffffff;
+ border: solid 1px #dddddd;
+}
+
+/* code */
+
+pre {
+ padding: 1rem !important;
+ border: 1px solid #dddddd !important;
+ margin: 0 0 1rem 0 !important;
+ white-space: pre;
+ overflow: auto;
+ line-height: 0.9em !important;
+}
+
+code {
+ line-height: 1.45em !important;
+ font-family: Consolas, "Liberation Mono", Courier, monospace;
+ font-size: 0.85em !important;
+ font-weight: normal !important;
+ padding: 0 !important;
+}
+
+pre > code {
+ background: none;
+ border: none;
+}
+
+p code {
+ border: none;
+ color: #0c323b;
+ padding: 0 0.2em !important;
+}
+
+li code {
+ border: none;
+ color: #0c323b;
+ padding: 0 0.2em !important;
+}
+
+/* Github-like */
+
+pre.prettyprint span.str {
+ color: #183691;
+}
+pre.prettyprint span.kwd {
+ color: #000000;
+ font-weight: bold;
+}
+pre.prettyprint span.com {
+ color: #999988;
+ font-style: italic;
+}
+pre.prettyprint span.typ {
+ color: #445588;
+ font-weight: bold;
+}
+pre.prettyprint span.lit {
+ color: #009999
+}
+pre.prettyprint span.pun {
+ color: #000000;
+ font-weight: bold;
+}
+pre.prettyprint span.pln {
+ color: #000000
+}
+pre.prettyprint span.tag {
+ color: navy
+}
+pre.prettyprint span.atn {
+ color: teal
+}
+pre.prettyprint span.atv {
+ color: #dd1144
+}
+pre.prettyprint span.dec {
+ color: #990000
+}
+pre.prettyprint span.var {
+ color: #000000
+}
+pre.prettyprint span.fun {
+ color: #990000
+}
+
+/* tabbed code snippets */
+
+dl.tabbed {
+ position: relative;
+}
+
+dl.tabbed dt {
+ float: left;
+ display: inline-block;
+ position: relative;
+ left: 1px;
+ margin-left: -1px;
+}
+
+dl.tabbed dt.current {
+ z-index: 2;
+}
+
+dl.tabbed dt a {
+ display: block;
+ border: 1px solid #f7f7f7;
+ padding: 0 20px;
+ height: 30px;
+ line-height: 2;
+ color: #4078c0;
+ text-decoration: none;
+}
+
+dl.tabbed dt a:hover {
+ background: #f7f7f7;
+}
+
+dl.tabbed dt.first a {
+ border-top-left-radius: 5px;
+}
+
+dl.tabbed dt.last a {
+ border-top-right-radius: 5px;
+}
+
+dl.tabbed dt.current a {
+ background-color: #f7f7f7;
+ border-color: #dddddd;
+ border-bottom: 0;
+ padding-bottom: 1px;
+}
+
+dl.tabbed dt.current a {
+ color: #0c323b;
+ outline: none;
+}
+
+dl.tabbed dd {
+ position: absolute;
+ width: 100%;
+ left: 0;
+ top: 29px;
+}
+
+dl.tabbed dd.current {
+ z-index: 1;
+}
+
+dl.tabbed dd pre {
+ border-top-left-radius: 0 !important;
+}
+
+dl.tabbed dd.has-note pre {
+ border-bottom: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+dl.tabbed dd.has-note blockquote {
+ color: #0c323b;
+ border: solid #dddddd;
+ border-width: 1px 1px 1px 10px;
+ border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px;
+ margin-top: 0;
+ font-style: italic;
+}
+
+/* blockquotes */
+
+blockquote {
+ border-left: 4px solid rgb(221, 221, 221);
+ margin: 1.5em 0;
+ padding: 1em 20px;
+ color: rgb(119, 119, 119);
+ line-height: 1.4em;
+}
+
+blockquote p {
+ margin: 0;
+ line-height: 1.4em;
+}
+
+blockquote p ~ p {
+ margin-top: 1em;
+}
+
+blockquote p code {
+ background: #fff;
+ padding-right: 0.4em !important;
+}
+
+/* callout */
+
+.callout {
+ border: none;
+ border-left: 10px solid #4078c0;
+ background-color: rgba(64, 120, 192, 0.1);
+}
+
+.callout.warning {
+ border-color: #DB504A;
+ background-color: #fff3d9;
+}
+
+.callout .callout-title {
+ font-weight: bold;
+ margin-bottom: 0.33em;
+}
+
+.callout div ~ p {
+ margin-top: 0;
+}
+
+.callout p ~ p {
+ margin-top: 1em;
+ margin-bottom: 0;
+}
+
+.callout p code {
+ background: #fff;
+ padding-right: 0.4em !important;
+}
+
+/* footnotes */
+
+small {
+ display: block;
+}
+
+/* logo links */
+
+.logo .svg-icon-logo {
+ height: 24px;
+ width: 112px;
+}
+
+.logo:hover {
+ text-decoration: none;
+}
+
+.svg-icon-logo .svg-icon-logo-text {
+ fill: #ffffff;
+}
+
+.logo:hover .svg-icon-logo .svg-icon-logo-text {
+ fill: #4078C0;
+}
+
+/* site header */
+
+.site-header {
+ background: #fcfcfc;
+ border-bottom: solid 1px #cccccc;
+}
+
+.site-header .title {
+ display: inline-block;
+ float: left;
+ height: 70px;
+ line-height: 70px;
+ font-weight: 400;
+ font-size: 1.4em;
+}
+
+.site-header .title a:link, .site-header .title a:visited {
+ color: #515151;
+}
+
+.site-header .title a:hover {
+ color: #515151;
+ text-decoration: none;
+}
+
+.site-header .off-canvas-toggle {
+ float: left;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu {
+ height: 40px;
+ width: 40px;
+ margin-top: 1rem;
+ margin-right: 1rem;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu .svg-icon-menu-path {
+ fill: #000;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu:hover .svg-icon-menu-path {
+ fill: #4183C4;
+}
+
+.site-header .logo {
+ float: right;
+ margin-top: 1rem;
+ text-align: right;
+ color: #000;
+}
+
+/* page header */
+
+.page-header {
+ background: #ffffff;
+ margin-top: 1rem;
+}
+
+.page-header .nav-breadcrumbs {
+ border-bottom: 1px solid #c2d2dc;
+}
+
+.page-header .nav-breadcrumbs ul {
+ display: block;
+ overflow: hidden;
+ margin: 0;
+ padding: 15px;
+ list-style: none;
+ font-size: 0.9em;
+}
+
+.page-header .nav-breadcrumbs li {
+ float: left;
+ margin: 0;
+}
+
+.page-header .nav-breadcrumbs li:before {
+ content: "/";
+ margin: 0 5px;
+ color: #c2d2dc;
+}
+
+.page-header .nav-breadcrumbs li:first-child:before {
+ content: "";
+ margin: 0;
+}
+
+.page-header .nav-breadcrumbs li a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+/* content */
+
+.site-content .row {
+ max-width: 90rem;
+}
+
+.page-content {
+ background: #ffffff;
+ min-height: 600px;
+ padding: 2.5rem 0;
+}
+
+/* sidebar */
+
+.sidebar {
+ background: #ffffff;
+ width: 100%;
+ padding: 0;
+}
+
+.sidebar .nav-toc {
+ padding-top: 1rem;
+}
+
+/* navigation */
+
+.nav-home {
+ background: #f7f7f7;
+ line-height: 2rem;
+}
+
+.nav-home a {
+ display: block;
+ color: #4078c0;
+ font-weight: bold;
+ font-size: 1rem;
+ padding-left: 1rem;
+}
+
+.nav-home a.active {
+ background: #e7e7e7;
+}
+
+.nav-home a:hover {
+ background: #e7e7e7;
+ text-decoration: none;
+}
+
+.nav-home a .home-icon {
+ font-size: 18px;
+ font-family: "icons" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1.2;
+ vertical-align: middle;
+ padding-right: 5px;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.nav-home .version-number {
+ padding-left: 1.4rem;
+ font-size: 0.9rem;
+}
+
+.nav-toc {
+}
+
+.nav-toc ul {
+ margin: 0;
+ padding: 0;
+ line-height: 2rem;
+}
+
+.nav-toc ul > li {
+ list-style-type: none;
+ padding-left: 0;
+}
+
+.nav-toc ul > li a {
+ display: block;
+ color: #4078c0;
+ font-weight: bold;
+ font-size: 0.9rem;
+ padding-left: 1rem;
+}
+
+.nav-toc ul > li a.active {
+ background: #e7e7e7;
+}
+
+.nav-toc ul > li a:hover {
+ background: #e7e7e7;
+ text-decoration: none;
+}
+
+.nav-toc ul > li > ul li {
+ margin-top: 0;
+ border-top: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+.nav-toc ul > li > ul li a {
+ font-size: 0.9rem;
+ font-weight: normal;
+ text-transform: none;
+ margin-top: 0;
+ padding-left: 1.2rem;
+}
+
+.nav-toc ul > li > ul > li > ul li a {
+ font-size: 0.8rem;
+ padding-left: 2rem;
+}
+
+
+/* site navigation */
+
+.site-nav {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border: solid 1px #cccccc;
+}
+
+/* off-canvas navigation colours */
+
+.off-canvas {
+}
+
+.off-canvas-nav {
+ padding: 0;
+}
+
+.off-canvas-nav .nav-home {
+ background: #ffffff;
+}
+
+.off-canvas-nav .nav-toc {
+ background: #ffffff;
+}
+
+.off-canvas-nav .nav-toc ul > li {
+}
+
+.off-canvas-nav .nav-toc ul > li a {
+}
+
+.off-canvas-nav .nav-toc ul > li a.active {
+}
+
+.off-canvas-nav .nav-toc ul > li a:hover {
+}
+
+.off-canvas-nav .nav-toc ul > li a.active:hover {
+}
+
+.off-canvas-nav .nav-toc ul > li > ul li {
+ border-top: 0;
+}
+
+/* page navigation */
+
+.page-nav {
+ background: #ffffff;
+}
+
+.page-nav .nav-title {
+ display: block;
+ color: #9eb1b7;
+ font-weight: bold;
+ font-size: 0.8rem;
+ padding-left: 1rem;
+}
+
+.page-nav .nav-toc {
+ background: #ffffff;
+}
+
+.page-nav .nav-toc ul > li {
+ border-top: 0;
+}
+
+.page-nav .nav-toc ul > li a.active {
+ background: #4078c0;
+ color: #ffffff;
+}
+
+.page-nav .nav-toc ul > li a.active:hover {
+ background: #4078c0;
+}
+
+/* navigation next */
+
+.nav-next {
+ background: #F7F7F7;
+ border-left: 10px solid #4078c0;
+ margin-top: 40px;
+ padding: 1em 20px;
+}
+
+.nav-next p {
+ display: inline;
+ color: #0c323b;
+ font-style: italic;
+}
+
+.nav-next a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+/* table of contents -- ordered */
+
+.toc a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+.toc ol li {
+ color: #778a99;
+}
+
+.toc > ol > li > ol {
+ list-style-type: lower-alpha;
+}
+
+.toc > ol > li > ol > li > ol {
+ list-style-type: lower-roman;
+}
+
+.toc.main > ol > li {
+ margin-top: 0.5em;
+ font-size: 1.2em;
+}
+
+.toc.main > ol > li {
+ counter-increment: root;
+}
+
+.toc.main > ol > li > ol {
+ counter-reset: subsection;
+ list-style-type: none;
+ margin-left: 2rem;
+}
+
+.toc.main > ol > li > ol > li {
+ counter-increment: subsection;
+}
+
+.toc.main > ol > li > ol > li:before {
+ content: counter(root) "." counter(subsection) ". ";
+ margin-left: -2rem;
+ padding-right: 0.25rem;
+}
+
+.toc.main > ol > li > ol > li > ol {
+ list-style-type: lower-alpha;
+}
+
+.toc.main > ol > li > ol > li > ol > li > ol {
+ list-style-type: lower-roman;
+}
+
+/* table of contents -- unordered */
+
+.toc ul li {
+ color: #778a99;
+}
+
+.toc.main > ul {
+ margin-left: 0;
+ padding-bottom: 2rem;
+ border-bottom: 1px solid #f3f6f6;
+}
+
+.toc.main > ul > li {
+ margin-top: 2rem;
+ border-top: 1px solid #f3f6f6;
+ padding-top: 2rem;
+ list-style-type: none;
+}
+
+.toc.main > ul > li > a {
+ font-weight: bold;
+}
+
+.toc.main > ul > li > ul {
+ margin-top: 1rem;
+}
+
+.toc.main > ul > li > ul > li {
+ list-style-type: disc;
+}
+
+.toc.main > ul > li > ul > li > a {
+ font-weight: normal;
+ text-transform: none;
+}
+
+.toc.main > ul > li > ul > li > ul > li {
+ list-style-type: circle;
+}
+
+/* site footer */
+
+.site-footer {
+ margin-top: 3rem;
+ border-top: solid 1px #cccccc;
+}
+
+.site-footer-content.row {
+ max-width: 90rem;
+}
+
+.site-footer-nav {
+ padding: 2rem 0;
+}
+
+.site-footer-nav .with-left-divider {
+ border-top: 0;
+ border-left: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+@media screen and (max-width: 40em) {
+ .site-footer-nav .with-left-divider {
+ margin-top: 2rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.2);
+ padding-top: 2rem;
+ border-left: 0;
+ }
+}
+
+@media screen and (min-width: 40em) {
+ .site-footer-nav .nav-links {
+ height: 8rem;
+ }
+}
+
+.nav-links ul {
+ margin: 0;
+ padding: 0;
+ line-height: 2rem;
+}
+
+.nav-links ul > li {
+ list-style-type: none;
+ padding-left: 0;
+}
+
+.nav-links ul > li a {
+ color: #c5d0d4;
+ font-weight: bold;
+ font-size: 0.9rem;
+}
+
+.nav-links ul > li a:hover {
+ color: #4078C0;
+ text-decoration: none;
+}
+
+.nav-links ul > li > ul li a {
+ font-weight: normal;
+ text-transform: none;
+}
+
+.site-footer-base {
+ padding: 1rem 0;
+}
+
+.site-footer-base h3, .site-footer-base a {
+}
+
+.site-footer-base .copyright {
+ margin-top: 20px;
+}
+
+.site-footer-base .copyright .text {
+ display: inline-block;
+ line-height: 24px;
+ padding-right: 10px;
+ vertical-align: top;
+}
+
+.site-footer-base .svg-icon-logo-text {
+}
+
+.site-footer-base .svg-icon-logo-image {
+}
+
+.site-footer-base .logo:hover .svg-icon-logo-text {
+}
+
+.site-footer-base .logo:hover .svg-icon-logo-image {
+}
+
+.source-github {
+ padding: 10px;
+ padding-top: 30px;
+ margin-top: 20px;
+ border-top: 1px solid #cccccc;
+}
+
+.source-github a {
+ font-weight: bold;
+}
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/print.css b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/print.css
new file mode 100644
index 00000000..01a832eb
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/print.css
@@ -0,0 +1,27 @@
+h2 {
+ page-break-before: always;
+}
+nav.print .toc-page-line {
+ border-bottom: 1px dashed #bbb;
+}
+nav.print .toc-page-no {
+ float: right;
+}
+nav.print li {
+ list-style: none;
+}
+
+.print-cover-title {
+ font-size: 15mm;
+ padding-top: 150mm;
+ text-align: center;
+ width: 100%;
+}
+
+.print-cover-version {
+ font-size: 10mm;
+ font-style: italic;
+ padding-top: 20mm;
+ text-align: center;
+ width: 100%;
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/single.css b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/single.css
new file mode 100644
index 00000000..0b595f79
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/css/single.css
@@ -0,0 +1,63 @@
+h1 {
+ counter-reset: h2 h3 1 h4 1 h5 1;
+}
+
+h2 {
+ counter-increment: h2;
+ counter-reset: h3 h4 1 h5 1;
+}
+
+h2 .header-title::before {
+ content: counter(h2);
+ margin-right: 10px;
+}
+
+h3 {
+ counter-increment: h3;
+ counter-reset: h4 h5 1;
+}
+
+h3 .header-title::before {
+ content: counter(h2) "." counter(h3);
+ margin-right: 10px;
+}
+
+h4 {
+ counter-increment: h4;
+ counter-reset: h5;
+}
+
+h4 .header-title::before {
+ content: counter(h2) "." counter(h3) "." counter(h4);
+ margin-right: 1rem;
+}
+
+h5 {
+ counter-increment: h5;
+}
+
+h5 .header-title::before {
+ content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5);
+ margin-right: 1rem;
+}
+
+nav ul {
+ counter-reset: nav
+}
+
+nav ul > ul {
+ counter-reset: nav;
+}
+
+nav ul ~ ul {
+ counter-reset: none;
+}
+
+nav li {
+ counter-increment: nav;
+}
+
+nav li a::before {
+ content: counters(nav, ".");
+ margin-right: 0.5rem
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/index.html b/content/docs/pekko-samples/current/pekko-sample-cluster-java/index.html
new file mode 100644
index 00000000..63e0b0fb
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/index.html
@@ -0,0 +1,271 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+
+<head>
+<title>Apache Pekko Cluster with Java</title>
+<meta charset="utf-8"/>
+<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+<meta name="description" content='Apache Pekko Cluster with Java'/>
+<link href="https://fonts.googleapis.com/css?family=Roboto:100normal,100italic,300normal,300italic,400normal,400italic,500normal,500italic,700normal,700italic,900normal,900italicc" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="lib/jquery/jquery.min.js"></script>
+<script type="text/javascript" src="js/page.js"></script>
+<script type="text/javascript" src="js/warnOldVersion.js"></script>
+<script type="text/javascript" src="js/groups.js"></script>
+<script type="text/javascript" src="js/snippets.js"></script>
+<link rel="stylesheet" type="text/css" href="lib/foundation/dist/foundation.min.css"/>
+<link rel="stylesheet" type="text/css" href="css/page.css"/>
+
+<!--
+<link rel="shortcut icon" href="images/favicon.ico" />
+-->
+</head>
+
+<body>
+<div class="off-canvas-wrapper">
+<div class="off-canvas-wrapper-inner" data-off-canvas-wrapper>
+
+<div class="off-canvas position-left" id="off-canvas-menu" data-off-canvas>
+<nav class="off-canvas-nav">
+<div class="nav-home">
+<a href="index.html" class="active">
+<span class="home-icon">⌂</span>Apache Pekko Cluster with Java
+</a>
+<div class="version-number">
+0.1.0*
+</div>
+</div>
+<div class="nav-toc">
+<ul>
+</ul>
+</div>
+
+</nav>
+</div>
+
+<div class="off-canvas-content" data-off-canvas-content>
+
+<header class="site-header expanded row">
+<div class="small-12 column">
+<a href="#" class="off-canvas-toggle hide-for-medium" data-toggle="off-canvas-menu"><svg class="svg-icon svg-icon-menu" version="1.1" id="Menu" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve"> <path class="svg-icon-menu-path" fill="#53CDEC" d="M16.4,9H3.6C3.048,9,3,9.447,3,10c0,0.553,0.048,1,0.6,1H16.4c0.552,0,0.6-0.447,0.6-1C17,9.447,16.952,9,16.4,9z M16.4,13
+H3.6C3.048,13,3,13.447,3,14c0,0.553,0.048,1,0.6,1H16.4c0.552,0,0.6-0.447,0.6-1C17,13.447,16.952,13,16.4,13z M3.6,7H16.4
+C16.952,7,17,6.553,17,6c0-0.553-0.048-1-0.6-1H3.6C3.048,5,3,5.447,3,6C3,6.553,3.048,7,3.6,7z"/></svg>
+</a>
+<div class="title"><a href="index.html" class="active">Apache Pekko Cluster with Java</a></div>
+
+<!--
+<a href="https://www.example.com" class="logo show-for-medium">logo</a>
+-->
+</div>
+</header>
+
+<div class="expanded row">
+
+<div class="medium-3 large-2 show-for-medium column">
+<nav class="site-nav">
+<div class="nav-home">
+<a href="index.html" class="active">
+<span class="home-icon">⌂</span>Apache Pekko Cluster with Java
+</a>
+<div class="version-number">
+0.1.0*
+</div>
+</div>
+<div class="nav-toc">
+<ul>
+</ul>
+</div>
+
+</nav>
+</div>
+
+<div class="small-12 medium-9 large-10 column">
+<section class="site-content">
+
+<span id="version-warning"></span>
+
+<div class="page-header row">
+<div class="medium-12 show-for-medium column">
+</div>
+</div>
+
+<div class="page-content row">
+<div class="small-12 large-9 column" id="docs">
+<h1><a href="#apache-pekko-cluster-with-java" name="apache-pekko-cluster-with-java" class="anchor"><span class="anchor-link"></span></a>Apache Pekko Cluster with Java</h1>
+<p>This tutorial contains 3 samples illustrating different <a href="https://pekko.apache.org/docs/pekko/current/typed/cluster.html">Apache Pekko cluster</a> features.</p>
+<ul>
+ <li>Subscribe to cluster membership events</li>
+ <li>Sending messages to actors running on nodes in the cluster</li>
+ <li>Cluster aware routers</li>
+</ul>
+<h2><a href="#a-simple-cluster-example" name="a-simple-cluster-example" class="anchor"><span class="anchor-link"></span></a>A Simple Cluster Example</h2>
+<p>Open <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-java/src/main/resources/application.conf">application.conf</a></p>
+<p>To enable cluster capabilities in your Apache Pekko project you should, at a minimum, add the remote settings, and use <code>cluster</code> as the <code>org.apache.pekko.actor.provider</code>. The <code>org.apache.pekko.cluster.seed-nodes</code> should normally also be added to your <code>application.conf</code> file.</p>
+<p>The seed nodes are configured contact points which newly started nodes will try to connect with in order to join the cluster.</p>
+<p>Note that if you are going to start the nodes on different machines you need to specify the ip-addresses or host names of the machines in <code>application.conf</code> instead of <code>127.0.0.1</code>.</p>
+<p>Open <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-java/src/main/java/sample/cluster/simple/App.java">SimpleClusterApp.java</a>.</p>
+<p>The small program together with its configuration starts an ActorSystem with the Cluster enabled. It joins the cluster and starts an actor that logs some membership events. Take a look at the <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-java/src/main/java/sample/cluster/simple/ClusterListener.java">SimpleClusterListener.java</a> actor.</p>
+<p>You can read more about the cluster concepts in the <a href="https://pekko.apache.org/docs/pekko/current/typed/cluster.html">documentation</a>.</p>
+<p>To run this sample, first make sure everything is compiled using <code>mvn compile</code>, then run using <code>mvn exec:java -Dexec.mainClass="sample.cluster.simple.App"</code>.</p>
+<p><code>sample.cluster.simple.App</code> starts three actor systems (cluster members) in the same JVM process. It can be more interesting to run them in separate processes. Stop the application and then open three terminal windows.</p>
+<p>In the first terminal window, start the first seed node with the following command:</p>
+<pre><code>mvn exec:java -Dexec.mainClass="sample.cluster.simple.App" -Dexec.args=17356
+</code></pre>
+<p>17356 corresponds to the port of the first seed-nodes element in the configuration. In the log output you see that the cluster node has been started and changed status to ‘Up’.</p>
+<p>In the second terminal window, start the second seed node with the following command:</p>
+<pre><code>mvn exec:java -Dexec.mainClass="sample.cluster.simple.App" -Dexec.args=17357
+</code></pre>
+<p>17357 corresponds to the port of the second seed-nodes element in the configuration. In the log output you see that the cluster node has been started and joins the other seed node and becomes a member of the cluster. Its status changed to ‘Up’.</p>
+<p>Switch over to the first terminal window and see in the log output that the member joined.</p>
+<p>Start another node in the third terminal window with the following command:</p>
+<pre><code>mvn exec:java -Dexec.mainClass="sample.cluster.simple.App" -Dexec.args=0
+</code></pre>
+<p>Now you don’t need to specify the port number, 0 means that it will use a random available port. It joins one of the configured seed nodes. Look at the log output in the different terminal windows.</p>
+<p>Start even more nodes in the same way, if you like.</p>
+<p>Shut down one of the nodes by pressing ‘ctrl-c’ in one of the terminal windows. It will cause the node to do a graceful leave from the cluster, telling the other nodes in the cluster that it is leaving. It will then be removed from the cluster, which you can see in the log output in the other terminals.</p>
+<p>Look at the source code of the actor again. It registers itself as subscriber of certain cluster events. It gets notified a stream of events leading up to the current state. After that it receives events for changes that happen in the cluster.</p>
+<p>Now we have seen how to subscribe to cluster membership events. You can read more about it in the <a href="https://pekko.apache.org/docs/pekko/current/typed/cluster.html#cluster-subscriptions">documentation</a>. The membership events show us the state of the cluster but it does not help with accessing actors on other nodes the cluster. To do that we need to use the <a href="https://pekko.apache.org/docs/pekko/current/typed/actor-discovery.html#receptionist">Receptionist</a>.</p>
+<h2><a href="#worker-registration-example" name="worker-registration-example" class="anchor"><span class="anchor-link"></span></a>Worker registration example</h2>
+<p>The <code>Receptionist</code> is a service registry that will work both when in single JVM apps not using cluster, and in clustered apps. <code>ActorRef</code>s are registered to the receptionist using a <code>ServiceKey</code>. The service key is defined with a type of message that actors registered for it will accept and a string identifier. </p>
+<p>Let’s take a look at an example that illustrates how workers, here only on nodes with the role <em>backend</em>, register themselves to the receptionist so that <em>frontend</em> nodes will know what workers are available to perform their work. Note that a node could potentially have both roles, since the node roles are a set. The <code>main</code> provided only allows one role though. </p>
+<p>The example application provides a service to transform text. At a periodic interval the frontend simulates an external request to process a text which it forwards to available workers if there are any. </p>
+<p>Since the discovery of workers is dynamic both <em>backend</em> and <em>frontend</em> nodes can be added to the cluster dynamically. </p>
+<p>The backend worker that performs the transformation job is defined in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-java/src/main/java/sample/cluster/transformation/Worker.java">Worker.java</a>. When starting up a worker registers itself to the receptionist so that it can be discovered through its <code>ServiceKey</code> on any node in the cluster.</p>
+<p>The frontend that simulates user jobs as well as keeping track of available workers is defined in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-java/src/main/java/sample/cluster/transformation/Frontend.java">Frontend.java</a>. The actor subscribes to the <code>Receptionist</code> with the <code>WorkerServiceKey</code> to receive updates when the set of available workers in the cluster changes. If a worker dies or its node is removed from the [...]
+<p>To run this sample, make sure you have shut down any previously started cluster sample, then type <code>mvn exec:java -Dexec.mainClass="sample.cluster.transformation.App"</code>.</p>
+<p>TransformationApp starts 5 actor systems (cluster members) in the same JVM process. It can be more interesting to run them in separate processes. Stop the application and run the following commands in separate terminal windows.</p>
+<pre><code>mvn exec:java -Dexec.mainClass="sample.cluster.transformation.App" -Dexec.args="backend 17356"
+
+mvn exec:java -Dexec.mainClass="sample.cluster.transformation.App" -Dexec.args="backend 17357"
+
+mvn exec:java -Dexec.mainClass="sample.cluster.transformation.App" -Dexec.args="backend 0"
+
+mvn exec:java -Dexec.mainClass="sample.cluster.transformation.App" -Dexec.args="frontend 0"
+
+mvn exec:java -Dexec.mainClass="sample.cluster.transformation.App" -Dexec.args="frontend 0"
+</code></pre>
+<p>There is a component built into Apache Pekko that performs the task of subscribing to the receptionist and keeping track of available actors significantly simplifying such interactions: the group router. Let’s look into how we can use those in the next section!</p>
+<h2><a href="#cluster-aware-routers" name="cluster-aware-routers" class="anchor"><span class="anchor-link"></span></a>Cluster Aware Routers</h2>
+<p>The <a href="https://pekko.apache.org/docs/pekko/current/typed/routers.html#group-router">group routers</a> relies on the <code>Receptionist</code> and will therefore route messages to services registered in any node of the cluster.</p>
+<p>Let’s take a look at a few samples that make use of cluster aware routers.</p>
+<h2><a href="#cluster-routing-example" name="cluster-routing-example" class="anchor"><span class="anchor-link"></span></a>Cluster routing example</h2>
+<p>Let’s take a look at two different ways to distribute work across a cluster using routers. </p>
+<p>Note that the samples just shows off various parts of Apache Pekko Cluster and does not provide a complete structure to build a resilient distributed application with. The <a href="https://developer.lightbend.com/guides/akka-distributed-workers-java/">Distributed Workers With Akka</a> sample covers more of the problems you would have to solve to build a resilient distributed processing application.</p>
+<h3><a href="#example-with-group-of-routees" name="example-with-group-of-routees" class="anchor"><span class="anchor-link"></span></a>Example with Group of routees</h3>
+<p>The example application provides a service to calculate statistics for a text. When some text is sent to the service it splits it into words, and delegates the task to count number of characters in each word to a separate worker, a routee of a router. The character count for each word is sent back to an aggregator that calculates the average number of characters per word when all results have been collected.</p>
+<p>The worker that counts number of characters in each word is defined in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-java/src/main/java/sample/cluster/stats/StatsWorker.java">StatsWorker.java</a>.</p>
+<p>The service that receives text from users and splits it up into words, delegates to a pool of workers and aggregates the result is defined in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-java/src/main/java/sample/cluster/stats/StatsService.java">StatsService.java</a>.</p>
+<p>Note, nothing cluster specific so far, just plain actors.</p>
+<p>Nodes in the cluster can be marked with roles, to perform different tasks, in our case we use <code>compute</code> as a role to designate cluster nodes that should do processing of word statistics. </p>
+<p>In <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-java/src/main/java/sample/cluster/stats/App.java">StatsSample.java</a> each <code>compute</code> node starts a <code>StatsService</code> that distributes work over N local <code>StatsWorkers</code>. The client nodes then message the <code>StatsService</code> instances through a <code>group</code> router. The router finds services by subscribing to the cluster receptionist and a service key. Ea [...]
+<p>With this design a single <code>compute</code> node crashing will only lose the ongoing work in that node and have the other nodes keep on with their work, but there is no single place to ask for a list of the current work in progress. </p>
+<p>To run the sample, type <code>mvn exec:java -Dexec.mainClass="sample.cluster.stats.App"</code> if it is not already started.</p>
+<p>StatsSample starts 4 actor systems (cluster members) in the same JVM process. It can be more interesting to run them in separate processes. Stop the application and run the following commands in separate terminal windows.</p>
+<pre><code>mvn exec:java -Dexec.mainClass="sample.cluster.stats.App" -Dexec.args="compute 17356"
+
+mvn exec:java -Dexec.mainClass="sample.cluster.stats.App" -Dexec.args="compute 17357"
+
+mvn exec:java -Dexec.mainClass="sample.cluster.stats.App" -Dexec.args="compute 0"
+
+mvn exec:java -Dexec.mainClass="sample.cluster.stats.App" -Dexec.args="client 0"
+</code></pre>
+<h3><a href="#router-example-with-cluster-singleton" name="router-example-with-cluster-singleton" class="anchor"><span class="anchor-link"></span></a>Router example with Cluster Singleton</h3>
+<p><a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-java/src/main/java/sample/cluster/stats/AppOneMaster.java">AppOneMaster.java</a> each <code>compute</code> node starts N workers, that register themselves with the receptionist. The <code>StatsService</code> is run in a single instance in the cluster through the Apache Pekko Cluster Singleton. The actual work is performed by workers on all compute nodes though. The workers are reached through a g [...]
+<p>With this design it would be possible to query the singleton for current work - it knows all current requests in flight and could potentially make decisions based on knowing exactly what work is currently in progress. </p>
+<p>If the singleton node crashes however, all ongoing work is lost though since the state of the singleton is not persistent, when it is started on a new node the <code>StatsService</code> will not know of any previous work. It also means that since all work has to go through the singleton it could be come a bottleneck. If one of the other nodes crash only the ongoing work sent to them is lost, however since each ongoing request could be handled by multiple different workers on different [...]
+<p>To run this sample, type <code>mvn exec:java -Dexec.mainClass="sample.cluster.stats.AppOneMaster"</code> if it is not already started.</p>
+<p>AppOneMaster starts 4 actor systems (cluster members) in the same JVM process. It can be more interesting to run them in separate processes. Stop the application and run the following commands in separate terminal windows.</p>
+<pre><code>mvn exec:java -Dexec.mainClass="sample.cluster.stats.AppOneMaster" -Dexec.args="compute 17356"
+
+mvn exec:java -Dexec.mainClass="sample.cluster.stats.AppOneMaster" -Dexec.args="compute 17357"
+
+mvn exec:java -Dexec.mainClass="sample.cluster.stats.AppOneMaster" -Dexec.args="compute 0"
+
+mvn exec:java -Dexec.mainClass="sample.cluster.stats.AppOneMaster" -Dexec.args="client 0"
+</code></pre>
+<h2><a href="#tests" name="tests" class="anchor"><span class="anchor-link"></span></a>Tests</h2>
+<p>The multi-jvm testkit which allows for starting a cluster with multiple separate JVMs is only available from Scala with the Scala build tool <code>sbt</code>. Such tests are included for completeness and can be found in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-java/src/multi-jvm">src/multi-jvm</a>. You can run them by typing <code>sbt multi-jvm:test</code>.</p>
+</div>
+<div class="large-3 show-for-large column" data-sticky-container>
+<nav class="sidebar sticky" data-sticky data-anchor="docs" data-sticky-on="large">
+<div class="page-nav">
+<div class="nav-title">On this page:</div>
+<div class="nav-toc">
+<ul>
+ <li><a href="index.html#apache-pekko-cluster-with-java" class="header">Apache Pekko Cluster with Java</a>
+ <ul>
+ <li><a href="index.html#a-simple-cluster-example" class="header">A Simple Cluster Example</a></li>
+ <li><a href="index.html#worker-registration-example" class="header">Worker registration example</a></li>
+ <li><a href="index.html#cluster-aware-routers" class="header">Cluster Aware Routers</a></li>
+ <li><a href="index.html#cluster-routing-example" class="header">Cluster routing example</a></li>
+ <li><a href="index.html#tests" class="header">Tests</a></li>
+ </ul></li>
+</ul>
+</div>
+</div>
+</nav>
+</div>
+</div>
+
+</section>
+</div>
+
+</div>
+
+<footer class="site-footer">
+
+<section class="site-footer-nav">
+<div class="expanded row">
+<div class="small-12 large-offset-2 large-10 column">
+<div class="row site-footer-content">
+
+<div class="small-12 medium-4 large-3 text-center column">
+<div class="nav-links">
+<ul>
+<!-- <li><a href="https://www.example.com/products/">Products</a> -->
+</ul>
+</div>
+</div>
+
+</div>
+</div>
+</div>
+</section>
+
+<section class="site-footer-base">
+<div class="expanded row">
+<div class="small-12 large-offset-2 large-10 column">
+<div class="row site-footer-content">
+
+<div class="small-12 text-center large-9 column">
+
+<!--
+<div class="copyright">
+<span class="text">© 2023</span>
+<a href="https://www.example.com" class="logo">logo</a>
+</div>
+-->
+</div>
+
+</div>
+</div>
+</div>
+</section>
+</footer>
+
+</div>
+</div>
+</div>
+</body>
+
+<script type="text/javascript" src="lib/foundation/dist/foundation.min.js"></script>
+<script type="text/javascript">jQuery(document).foundation();</script>
+<script type="text/javascript" src="js/magellan.js"></script>
+
+<style type="text/css">@import "lib/prettify/prettify.css";</style>
+<script type="text/javascript" src="lib/prettify/prettify.js"></script>
+<script type="text/javascript" src="lib/prettify/lang-scala.js"></script>
+<script type="text/javascript">jQuery(function(){window.prettyPrint && prettyPrint()});</script>
+<script type="text/javascript">jQuery(function(jq){initOldVersionWarnings(jq, '0.1.0-SNAPSHOT', '')});</script>
+
+
+</html>
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/groups.js b/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/groups.js
new file mode 100644
index 00000000..e9ec53c3
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/groups.js
@@ -0,0 +1,167 @@
+groupChangeListeners = [];
+
+window.groupChanged = function(callback) {
+ groupChangeListeners.push(callback);
+}
+
+$(function() {
+
+ // Groups (like 'java' and 'scala') represent groups of 'switchable' content, either in tabs or in regular text.
+ // The catalog of groups can be defined in the sbt parameters to initialize the group.
+
+ var groupCookie = "paradoxGroups";
+ var cookieTg = getCookie(groupCookie);
+ var currentGroups = {};
+
+ var catalog = {}
+ var supergroupByGroup = {};
+
+ if(cookieTg != "")
+ currentGroups = JSON.parse(cookieTg);
+
+ // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie
+ function setCookie(cookieName, cookieValue, daysToExpire) {
+ if (!daysToExpire) daysToExpire = 365;
+ const now = new Date();
+ now.setDate(now.getDate() + daysToExpire);
+ // The lax value will send the cookie for all same-site
+ // requests and top-level navigation GET requests. This
+ // is sufficient for user tracking, but it will prevent
+ // many CSRF attacks. This is the default value in modern browsers.
+ document.cookie = `${cookieName}=${encodeURIComponent(cookieValue)};expires=${now.toUTCString()};path=/;samesite=lax`;
+ }
+
+ // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#Example_2_Get_a_sample_cookie_named_test2
+ function getCookie(cookieName) {
+ const cookieAttr = decodeURIComponent(document.cookie)
+ .split(";")
+ .find(row => row.trimStart().startsWith(cookieName))
+ return cookieAttr ? cookieAttr.split("=")[1] : "";
+ }
+
+ $("dl").has("dd > pre").each(function() {
+ var dl = $(this);
+ dl.addClass("tabbed");
+ var dts = dl.find("dt");
+ dts.each(function(i) {
+ var dt = $(this);
+ dt.html("<a href=\"#tab" + i + "\">" + dt.text() + "</a>");
+ });
+ var dds = dl.find("dd");
+ dds.each(function(i) {
+ var dd = $(this);
+ dd.hide();
+ if (dd.find("blockquote").length) {
+ dd.addClass("has-note");
+ }
+ });
+
+ // Default to the first tab, for grouped tabs switch again later
+ switchToTab(dts.first());
+
+ dts.first().addClass("first");
+ dts.last().addClass("last");
+ });
+
+ // Determine all supergroups, populate 'catalog' and 'supergroupByGroup' accordingly.
+ $(".supergroup").each(function() {
+ var supergroup = $(this).attr('name').toLowerCase();
+ var groups = $(this).find(".group");
+
+ catalog[supergroup] = [];
+
+ groups.each(function() {
+ var group = "group-" + $(this).text().toLowerCase();
+ catalog[supergroup].push(group);
+ supergroupByGroup[group] = supergroup;
+ });
+
+ $(this).on("change", function() {
+ switchToGroup(supergroup, this.value);
+ });
+ });
+
+ // Switch to the right initial groups
+ for (var supergroup in catalog) {
+ var current = queryParamGroup(supergroup) || currentGroups[supergroup] || catalog[supergroup][0];
+
+ switchToGroup(supergroup, current);
+ }
+
+ $("dl.tabbed dt a").click(function(e){
+ e.preventDefault();
+ var currentDt = $(this).parent("dt");
+ var currentDl = currentDt.parent("dl");
+
+ var currentGroup = groupOf(currentDt);
+
+ var supergroup = supergroupByGroup[currentGroup]
+ if (supergroup) {
+ switchToGroup(supergroup, currentGroup);
+ } else {
+ switchToTab(currentDt);
+ }
+ });
+
+ function queryParamGroup(supergroup) {
+ var value = new URLSearchParams(window.location.search).get(supergroup)
+ if (value) {
+ return "group-" + value.toLowerCase();
+ } else {
+ return "";
+ }
+ }
+
+ function switchToGroup(supergroup, group) {
+ currentGroups[supergroup] = group;
+ setCookie(groupCookie, JSON.stringify(currentGroups));
+
+ // Dropdown switcher:
+ $("select")
+ .has("option[value=" + group +"]")
+ .val(group);
+
+ // Inline snippets:
+ catalog[supergroup].forEach(peer => {
+ if (peer === group) {
+ $("." + group).show();
+ } else {
+ $("." + peer).hide();
+ }
+ })
+
+ // Tabbed snippets:
+ $("dl.tabbed").each(function() {
+ var dl = $(this);
+ dl.find("dt").each(function() {
+ var dt = $(this);
+ if(groupOf(dt) == group) {
+ switchToTab(dt);
+ }
+ });
+ });
+
+ groupChangeListeners.forEach(listener => listener(group, supergroup, catalog));
+ }
+
+ function switchToTab(dt) {
+ var dl = dt.parent("dl");
+ dl.find(".current").removeClass("current").next("dd").removeClass("current").hide();
+ dt.addClass("current");
+ var currentContent = dt.next("dd").addClass("current").show();
+ dl.css("height", dt.height() + currentContent.height());
+ }
+
+ function groupOf(elem) {
+ const classAttribute = elem.next("dd").find("pre").attr("class");
+ if (classAttribute) {
+ const currentClasses = classAttribute.split(' ');
+ const regex = new RegExp("^group-.*");
+ const matchingClass = currentClasses.find(cc => regex.test(cc));
+ if (matchingClass) return matchingClass;
+ }
+
+ // No class found? Then use the tab title
+ return "group-" + elem.find('a').text().toLowerCase();
+ }
+});
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/magellan.js b/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/magellan.js
new file mode 100644
index 00000000..52d231ec
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/magellan.js
@@ -0,0 +1,25 @@
+$(function() {
+
+ // add magellan targets to anchor headers, up to depth 3
+ $("a.anchor").each(function() {
+ var anchor = $(this);
+ var name = anchor.attr("name");
+ var header = anchor.parent();
+ if (header.is("h1") || header.is("h2") || header.is("h3")) {
+ header.attr("id", name).attr("data-magellan-target", name);
+ }
+ });
+
+ // enable magellan plugin on the page navigation
+ $(".page-nav").each(function() {
+ var nav = $(this);
+
+ // strip page navigation links down to just the hash fragment
+ nav.find("a").attr('href', function(_, current){
+ return this.hash ? this.hash : current;
+ });
+
+ new Foundation.Magellan(nav);
+ });
+
+});
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/page.js b/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/page.js
new file mode 100644
index 00000000..cb2ef674
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/page.js
@@ -0,0 +1,2 @@
+$(function() {
+});
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/snippets.js b/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/snippets.js
new file mode 100644
index 00000000..a0d6c869
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/snippets.js
@@ -0,0 +1,6 @@
+$(function() {
+ $(".snippet-button.copy-snippet").click(function() {
+ var code = $(this).parent().find("code").text()
+ navigator.clipboard.writeText(code)
+ })
+})
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/warnOldVersion.js b/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/warnOldVersion.js
new file mode 100644
index 00000000..c90bcffb
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/js/warnOldVersion.js
@@ -0,0 +1,23 @@
+function initOldVersionWarnings($, thisVersion, projectUrl) {
+ if (projectUrl && projectUrl !== "") {
+ var schemeLessUrl = projectUrl;
+ if (projectUrl.startsWith("http://")) projectUrl = schemeLessUrl.substring(5);
+ else if (projectUrl.startsWith("https://")) projectUrl = schemeLessUrl.substring(6);
+ const url = schemeLessUrl + (schemeLessUrl.endsWith("\/") ? "" : "/") + "paradox.json";
+ $.get(url, function (versionData) {
+ const currentVersion = versionData.version;
+ if (thisVersion !== currentVersion) {
+ showVersionWarning(thisVersion, currentVersion, projectUrl);
+ }
+ });
+ }
+}
+
+function showVersionWarning(thisVersion, currentVersion, projectUrl) {
+ $('#version-warning').prepend(
+ '<div class="callout warning" style="margin-top: 16px">' +
+ '<p><span style="font-weight: bold">This documentation regards version ' + thisVersion + ', ' +
+ 'however the current version is <a href="' + projectUrl + '">' + currentVersion + '</a>.</span></p>' +
+ '</div>'
+ );
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/foundation/dist/foundation.min.css b/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/foundation/dist/foundation.min.css
new file mode 100644
index 00000000..32ce416b
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/foundation/dist/foundation.min.css
@@ -0,0 +1,2 @@
+@charset "UTF-8";
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[ti [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/foundation/dist/foundation.min.js b/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/foundation/dist/foundation.min.js
new file mode 100644
index 00000000..858078db
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/foundation/dist/foundation.min.js
@@ -0,0 +1,4 @@
+function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new [...]
+t(this).is(":first-child")?n=o.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(t(this).is(":last-child")&&(s=o.parents("li").first().next("li").find("a").first()))}),Foundation.Keyboard.handleKey(i,"AccordionMenu",{open:function(){r.is(":hidden")&&(e.down(r),r.find("li").first().find("a").first().focus())},close:function(){r.length&&!r.is(":hidden")?e.up(r):o.parent [...]
+}},{key:"_events",value:function(){this.$element.off(".zf.trigger .zf.offcanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offcanvas":this._handleKeyboard.bind(this)}),this.options.closeOnClick&&this.$exiter.length&&this.$exiter.on({"click.zf.offcanvas":this.close.bind(this)})}},{key:"_setMQChecker",value:function(){var e=this;t(window).on("changed.zf.mediaquery",function(){Foundation.MediaQ [...]
+"top"===this.options.stickTo?(o-=n,a-=t+n):"bottom"===this.options.stickTo&&(o-=r-(t+s),a-=r-s),this.topPoint=o,this.bottomPoint=a,i&&"function"==typeof i&&i()}},{key:"destroy",value:function(){this._removeSticky(!0),this.$element.removeClass(this.options.stickyClass+" is-anchored is-at-top").css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),t(window).off(this.scrollListener),this.wasWrapped [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/jquery/jquery.min.js b/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/jquery/jquery.min.js
new file mode 100644
index 00000000..c4643af6
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/jquery/jquery.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r= [...]
+},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a); [...]
+},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$ [...]
+//# sourceMappingURL=jquery.min.map
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/prettify/lang-scala.js b/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/prettify/lang-scala.js
new file mode 100644
index 00000000..3f97dba5
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/prettify/lang-scala.js
@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object| [...]
+["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]);
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/prettify/prettify.css b/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/prettify/prettify.css
new file mode 100644
index 00000000..d44b3a22
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/prettify/prettify.css
@@ -0,0 +1 @@
+.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/prettify/prettify.js b/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/prettify/prettify.js
new file mode 100644
index 00000000..7b990496
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/lib/prettify/prettify.js
@@ -0,0 +1,30 @@
+!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/ [...]
+b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a<f;++a){var h=b[a];if(/\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),l;a+2<f&&"-"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b [...]
+h[1]>h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var l=a[f];l==="("?++h:"\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l==="("?(++h,d[h]||(a[f]="(?:")):"\\"===l.charAt(0)&&(l=+l.substring(1) [...]
+(a[f]="\\"+d[l]);for(f=0;f<c;++f)"^"===a[f]&&"^"!==a[f+1]&&(a[f]="");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var i=a[k];if(i.ignoreCase)j=!0;else if(/[a-z]/i.test(i.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){m=!0;j=!1;break}}for(var r={b:8,t:9, [...]
+f:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw Error(""+i);n.push("(?:"+s(i)+")")}return RegExp(n.join("|"),j?"gi":"g")}function T(a,d){function g(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)s[j]="\n",m[j<<1]=x++,m[j++<<1|1]=a}}else if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r ]+/g," "),s[j]=c,m[j<<1]=x,x+=c.length,m [...]
+a)}var b=/(?:^|\s)nocode(?:\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join("").replace(/\n$/,""),d:m}}function H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function U(a){for(var d=void 0,g=a.firstChild;g;g=g.nextSibling)var b=g.nodeType,d=b===1?d?a:g:b===3?V.test(g.nodeValue)?a:d:d;return d===a?void 0:d}function C(a,d){function g(a){for(var j=a.e,k=[j,"pln"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var z=i[n],w=r[z],t=void 0,f;if(typeof w==="string")f=!1;else{var h=b[z.c [...]
+if(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w="pln")}if((f=w.length>=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.le [...]
+g[c],n=r[3];if(n)for(var e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)| [...]
+q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d. [...]
+/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+ [...]
+s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["p [...]
+q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b [...]
+c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute("value",d);var [...]
+r.className="linenums";for(var d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className="L"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode("\u00a0")),r.appendChild(k);a.appendChild(r)}function p(a,d){for(var g=d.length;--g>=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return F[a]}function K(a){var d=a.h;try{var g=T(a.c [...]
+a.a=b;a.d=g.d;a.e=0;I(d,b)(a);var s=/\bMSIE\s(\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var f=a.c,h;if(f)h=f.style.display,f.style.display="none";try{for(;b<k;){var l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType! [...]
+t))){s&&(G=G.replace(d,"\r"));A.nodeValue=G;var L=A.ownerDocument,o=L.createElement("span");o.className=c[r+1];var v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inl [...]
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,pack [...]
+O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,wi [...]
+Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map [...]
+V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%? [...]
+/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["p [...]
+["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimString [...]
+["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl", [...]
+hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc", [...]
+p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;g&&J(b,g,!0);K({h:d,j [...]
+return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var d=p[i],j=h,k=d;k=k.previousSibling;){var m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\??prettify\b/.test(o):m!==3||/\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f. [...]
+o.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=j.lang;if(!m){var m=k.match(n),y;if(!m&&(y=U(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else var o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue("white-space"):0)&&"pre"===o.substring(0,3);u=j.linenums;if(!(u=u==="true"||+u))u=(u=k.match(/\blinenums\b(?::(\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J [...]
+{h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):"function"===typeof a&&a()}for(var b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],p=[],m=0;m<b.length;++m)for(var j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var b=q,c=Date;c.now||(c={now:function(){return+new Date}});var i=0,r,n=/\blang(?:uage)?-([\w.]+)(?!\S)/,e=/\bprettyprint\b/,v=/\bprettyprinted\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code [...]
+h={};g()}};typeof define==="function"&&define.amd&&define("google-code-prettify",[],function(){return Y})})();}()
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/paradox.json b/content/docs/pekko-samples/current/pekko-sample-cluster-java/paradox.json
new file mode 100644
index 00000000..686ab950
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/paradox.json
@@ -0,0 +1,4 @@
+{
+ "name" : "Apache Pekko Cluster with Java",
+ "version" : "0.1.0-SNAPSHOT"
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-java/print-toc.xslt b/content/docs/pekko-samples/current/pekko-sample-cluster-java/print-toc.xslt
new file mode 100644
index 00000000..c240f5ab
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-java/print-toc.xslt
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="2.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:outline="http://wkhtmltopdf.org/outline"
+ xmlns="http://www.w3.org/1999/xhtml">
+ <xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
+ doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
+ indent="yes" />
+ <xsl:template match="outline:outline">
+ <html>
+ <head>
+ <title>Table of Contents</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/lib/foundation/dist/foundation.min.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/page.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/single.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/print.css"/>
+ </head>
+ <body>
+ <h1>Table of Contents</h1>
+ <nav class="print">
+ <xsl:apply-templates select="outline:item/outline:item">
+ <xsl:with-param name="depth" select="1"/>
+ </xsl:apply-templates>
+ </nav>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="outline:item">
+ <xsl:param name="depth"/>
+ <xsl:comment>Only add the li tags for elements beyond the first depth, so that the roots don't get numbers from our css</xsl:comment>
+ <xsl:choose>
+ <xsl:when test="$depth > 1">
+ <li>
+ <xsl:call-template name="item-inner">
+ <xsl:with-param name="depth" select="$depth"/>
+ </xsl:call-template>
+ </li>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="item-inner">
+ <xsl:with-param name="depth" select="$depth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="item-inner">
+ <xsl:param name="depth"/>
+ <xsl:if test="@title!=''">
+ <div class="toc-page-line">
+ <a>
+ <xsl:if test="@link">
+ <xsl:attribute name="href"><xsl:value-of select="@link"/></xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@backLink">
+ <xsl:attribute name="name"><xsl:value-of select="@backLink"/></xsl:attribute>
+ </xsl:if>
+ <xsl:value-of select="@title" />
+ </a>
+ <span class="toc-page-no"> <xsl:value-of select="@page" /> </span>
+ </div>
+ </xsl:if>
+ <xsl:if test="$depth < 5">
+ <ul>
+ <xsl:comment>added to prevent self-closing tags in QtXmlPatterns</xsl:comment>
+ <xsl:apply-templates select="outline:item">
+ <xsl:with-param name="depth" select="$depth + 1"/>
+ </xsl:apply-templates>
+ </ul>
+ </xsl:if>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/fonts/icons.eot b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/fonts/icons.eot
new file mode 100644
index 00000000..a5203e87
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/fonts/icons.eot differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/fonts/icons.svg b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/fonts/icons.svg
new file mode 100644
index 00000000..58c74882
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/fonts/icons.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by Fontastic.me</metadata>
+<defs>
+<font id="icons" horiz-adv-x="512">
+<font-face font-family="icons" units-per-em="512" ascent="480" descent="-32"/>
+<missing-glyph horiz-adv-x="512" />
+
+<glyph unicode="§" d="M202 136c5 5 10 7 17 7 7 0 13-2 19-7 10-11 10-23 0-36 0 0-22-20-22-20-19-19-42-29-68-29-26 0-49 10-68 29-19 19-29 42-29 67 0 27 10 50 29 69 0 0 76 76 76 76 24 23 48 36 73 39 26 3 47-4 66-22 5-5 8-11 8-18 0-7-3-13-8-19-12-11-24-11-36 0-17 17-40 11-68-17 0 0-75-75-75-75-9-9-14-20-14-33 0-13 5-23 14-31 9-9 19-14 32-14 13 0 23 5 32 14 0 0 22 20 22 20m230 294c19-19 29-42 29-68 0-26-10-49-29-68 0 0-81-81-81-81-25-25-51-37-77-37-21 0-40 9-57 26-5 5-7 10-7 17 0 7 2 13 [...]
+<glyph unicode="⌂" d="M480 249c6-6 8-10 6-14-2-4-6-6-14-6 0 0-43 0-43 0 0 0 0-158 0-158 0-5 0-9 0-11-1-2-2-5-4-7-3-2-7-3-12-3 0 0-105 0-105 0 0 0 0 159 0 159 0 0-104 0-104 0 0 0 0-159 0-159 0 0-99 0-99 0-10 0-16 2-18 5-3 4-4 9-4 16 0 0 0 158 0 158 0 0-43 0-43 0-7 0-12 2-14 6-1 4 0 8 6 14 0 0 205 206 205 206 5 5 12 8 19 8 8 0 14-3 20-8 0 0 204-206 204-206"/>
+</font></defs></svg>
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/fonts/icons.ttf b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/fonts/icons.ttf
new file mode 100644
index 00000000..6da4b13e
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/fonts/icons.ttf differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/fonts/icons.woff b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/fonts/icons.woff
new file mode 100644
index 00000000..2c7e917b
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/fonts/icons.woff differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/page.css b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/page.css
new file mode 100644
index 00000000..7be66ced
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/page.css
@@ -0,0 +1,965 @@
+@charset "UTF-8";
+
+/* fonts */
+
+@font-face {
+ font-family: "icons";
+ src:url("fonts/icons.eot");
+ src:url("fonts/icons.eot?#iefix") format("embedded-opentype"),
+ url("fonts/icons.woff") format("woff"),
+ url("fonts/icons.ttf") format("truetype"),
+ url("fonts/icons.svg#icons") format("svg");
+ font-weight: normal;
+ font-style: normal;
+}
+
+/* body */
+
+body {
+ background: #fff;
+ padding: 0;
+ margin: 0;
+ font-weight: 400;
+ font-style: normal;
+ line-height: 1.4em;
+ position: relative;
+ cursor: default;
+ font: 1em "Roboto", "Helvetica Neue", "Helvetica", Arial, sans-serif;
+ color: #333333;
+ font-smoothing: antialiased;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-size-adjust: none;
+ text-rendering: optimizeLegibility;
+}
+
+/* headers */
+
+h1 {
+ font-family: inherit;
+ font-size: 2.6em;
+ font-weight: 300;
+ color: #333333;
+ margin-bottom: 0.4em;
+ margin-top: 1.1em;
+}
+
+h1:first-child {
+ margin-top: 0;
+}
+
+h2 {
+ font-family: inherit;
+ font-size: 1.8em;
+ font-weight: 400;
+ color: #333333;
+ margin-bottom: 0.2em;
+ margin-top: 1.3em;
+}
+
+h2:first-child {
+ margin-top: 0;
+}
+
+h3 {
+ font-family: inherit;
+ font-size: 1.125em;
+ font-weight: 700;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h3:first-child {
+ margin-top: 0;
+}
+
+h4 {
+ font-family: inherit;
+ font-size: 1em;
+ font-weight: 700;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h4:first-child {
+ margin-top: 0;
+}
+
+h5 {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h5:first-child {
+ margin-top: 0;
+}
+
+h6 {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h6:first-child {
+ margin-top: 0;
+}
+
+/* text */
+
+p {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ line-height: 1.45em;
+ margin: 1em 0em;
+}
+
+/* links */
+
+a {
+ font-family: inherit;
+ color: #4078c0;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+a:link {
+ color: #4078c0;
+}
+
+a:visited {
+ color: #4078c0;
+}
+
+a:hover {
+ color: #4078c0;
+ text-decoration: underline;
+}
+
+a:active {
+ color: #4078c0;
+}
+
+/* header anchors */
+
+a.anchor .anchor-link:before {
+ content: "§";
+}
+
+.site-content .page-content .prettyprint .snippet-button {
+ float: right;
+ text-decoration: none;
+ font-size: 0.75rem;
+ font-weight: bold;
+ font-family: "Roboto", "Helvetica Neue", "Helvetica", Arial, sans-serif;
+ speak: none;
+ color: #4078c0;
+ border: 2px solid #e5e6e4;
+ padding: 4px 4px;
+ margin-left: 8px;
+ line-height: 1.2;
+ vertical-align: middle;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.site-content .page-content .prettyprint .snippet-button:hover {
+ background-color: #e5e6e4;
+ border: 2px solid #4078c0;
+}
+
+a.anchor .anchor-link {
+ font-size: 18px;
+ font-family: "icons" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1.2;
+ vertical-align: middle;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor {
+ visibility: hidden;
+ position: absolute;
+ display: block;
+ width: 30px;
+ margin-left: -30px;
+ padding-right: 3px;
+ text-align: right;
+ text-decoration: none;
+}
+
+h1:hover > a.anchor, h2:hover > a.anchor, h3:hover > a.anchor, h4:hover > a.anchor, h5:hover > a.anchor, h6:hover > a.anchor {
+ visibility: visible;
+ color: inherit;
+ text-decoration: none;
+}
+
+
+/* table */
+
+table th {
+ background: #ffffff;
+ border: solid 1px #dddddd;
+}
+
+table td {
+ background: #ffffff;
+ border: solid 1px #dddddd;
+}
+
+/* code */
+
+pre {
+ padding: 1rem !important;
+ border: 1px solid #dddddd !important;
+ margin: 0 0 1rem 0 !important;
+ white-space: pre;
+ overflow: auto;
+ line-height: 0.9em !important;
+}
+
+code {
+ line-height: 1.45em !important;
+ font-family: Consolas, "Liberation Mono", Courier, monospace;
+ font-size: 0.85em !important;
+ font-weight: normal !important;
+ padding: 0 !important;
+}
+
+pre > code {
+ background: none;
+ border: none;
+}
+
+p code {
+ border: none;
+ color: #0c323b;
+ padding: 0 0.2em !important;
+}
+
+li code {
+ border: none;
+ color: #0c323b;
+ padding: 0 0.2em !important;
+}
+
+/* Github-like */
+
+pre.prettyprint span.str {
+ color: #183691;
+}
+pre.prettyprint span.kwd {
+ color: #000000;
+ font-weight: bold;
+}
+pre.prettyprint span.com {
+ color: #999988;
+ font-style: italic;
+}
+pre.prettyprint span.typ {
+ color: #445588;
+ font-weight: bold;
+}
+pre.prettyprint span.lit {
+ color: #009999
+}
+pre.prettyprint span.pun {
+ color: #000000;
+ font-weight: bold;
+}
+pre.prettyprint span.pln {
+ color: #000000
+}
+pre.prettyprint span.tag {
+ color: navy
+}
+pre.prettyprint span.atn {
+ color: teal
+}
+pre.prettyprint span.atv {
+ color: #dd1144
+}
+pre.prettyprint span.dec {
+ color: #990000
+}
+pre.prettyprint span.var {
+ color: #000000
+}
+pre.prettyprint span.fun {
+ color: #990000
+}
+
+/* tabbed code snippets */
+
+dl.tabbed {
+ position: relative;
+}
+
+dl.tabbed dt {
+ float: left;
+ display: inline-block;
+ position: relative;
+ left: 1px;
+ margin-left: -1px;
+}
+
+dl.tabbed dt.current {
+ z-index: 2;
+}
+
+dl.tabbed dt a {
+ display: block;
+ border: 1px solid #f7f7f7;
+ padding: 0 20px;
+ height: 30px;
+ line-height: 2;
+ color: #4078c0;
+ text-decoration: none;
+}
+
+dl.tabbed dt a:hover {
+ background: #f7f7f7;
+}
+
+dl.tabbed dt.first a {
+ border-top-left-radius: 5px;
+}
+
+dl.tabbed dt.last a {
+ border-top-right-radius: 5px;
+}
+
+dl.tabbed dt.current a {
+ background-color: #f7f7f7;
+ border-color: #dddddd;
+ border-bottom: 0;
+ padding-bottom: 1px;
+}
+
+dl.tabbed dt.current a {
+ color: #0c323b;
+ outline: none;
+}
+
+dl.tabbed dd {
+ position: absolute;
+ width: 100%;
+ left: 0;
+ top: 29px;
+}
+
+dl.tabbed dd.current {
+ z-index: 1;
+}
+
+dl.tabbed dd pre {
+ border-top-left-radius: 0 !important;
+}
+
+dl.tabbed dd.has-note pre {
+ border-bottom: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+dl.tabbed dd.has-note blockquote {
+ color: #0c323b;
+ border: solid #dddddd;
+ border-width: 1px 1px 1px 10px;
+ border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px;
+ margin-top: 0;
+ font-style: italic;
+}
+
+/* blockquotes */
+
+blockquote {
+ border-left: 4px solid rgb(221, 221, 221);
+ margin: 1.5em 0;
+ padding: 1em 20px;
+ color: rgb(119, 119, 119);
+ line-height: 1.4em;
+}
+
+blockquote p {
+ margin: 0;
+ line-height: 1.4em;
+}
+
+blockquote p ~ p {
+ margin-top: 1em;
+}
+
+blockquote p code {
+ background: #fff;
+ padding-right: 0.4em !important;
+}
+
+/* callout */
+
+.callout {
+ border: none;
+ border-left: 10px solid #4078c0;
+ background-color: rgba(64, 120, 192, 0.1);
+}
+
+.callout.warning {
+ border-color: #DB504A;
+ background-color: #fff3d9;
+}
+
+.callout .callout-title {
+ font-weight: bold;
+ margin-bottom: 0.33em;
+}
+
+.callout div ~ p {
+ margin-top: 0;
+}
+
+.callout p ~ p {
+ margin-top: 1em;
+ margin-bottom: 0;
+}
+
+.callout p code {
+ background: #fff;
+ padding-right: 0.4em !important;
+}
+
+/* footnotes */
+
+small {
+ display: block;
+}
+
+/* logo links */
+
+.logo .svg-icon-logo {
+ height: 24px;
+ width: 112px;
+}
+
+.logo:hover {
+ text-decoration: none;
+}
+
+.svg-icon-logo .svg-icon-logo-text {
+ fill: #ffffff;
+}
+
+.logo:hover .svg-icon-logo .svg-icon-logo-text {
+ fill: #4078C0;
+}
+
+/* site header */
+
+.site-header {
+ background: #fcfcfc;
+ border-bottom: solid 1px #cccccc;
+}
+
+.site-header .title {
+ display: inline-block;
+ float: left;
+ height: 70px;
+ line-height: 70px;
+ font-weight: 400;
+ font-size: 1.4em;
+}
+
+.site-header .title a:link, .site-header .title a:visited {
+ color: #515151;
+}
+
+.site-header .title a:hover {
+ color: #515151;
+ text-decoration: none;
+}
+
+.site-header .off-canvas-toggle {
+ float: left;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu {
+ height: 40px;
+ width: 40px;
+ margin-top: 1rem;
+ margin-right: 1rem;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu .svg-icon-menu-path {
+ fill: #000;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu:hover .svg-icon-menu-path {
+ fill: #4183C4;
+}
+
+.site-header .logo {
+ float: right;
+ margin-top: 1rem;
+ text-align: right;
+ color: #000;
+}
+
+/* page header */
+
+.page-header {
+ background: #ffffff;
+ margin-top: 1rem;
+}
+
+.page-header .nav-breadcrumbs {
+ border-bottom: 1px solid #c2d2dc;
+}
+
+.page-header .nav-breadcrumbs ul {
+ display: block;
+ overflow: hidden;
+ margin: 0;
+ padding: 15px;
+ list-style: none;
+ font-size: 0.9em;
+}
+
+.page-header .nav-breadcrumbs li {
+ float: left;
+ margin: 0;
+}
+
+.page-header .nav-breadcrumbs li:before {
+ content: "/";
+ margin: 0 5px;
+ color: #c2d2dc;
+}
+
+.page-header .nav-breadcrumbs li:first-child:before {
+ content: "";
+ margin: 0;
+}
+
+.page-header .nav-breadcrumbs li a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+/* content */
+
+.site-content .row {
+ max-width: 90rem;
+}
+
+.page-content {
+ background: #ffffff;
+ min-height: 600px;
+ padding: 2.5rem 0;
+}
+
+/* sidebar */
+
+.sidebar {
+ background: #ffffff;
+ width: 100%;
+ padding: 0;
+}
+
+.sidebar .nav-toc {
+ padding-top: 1rem;
+}
+
+/* navigation */
+
+.nav-home {
+ background: #f7f7f7;
+ line-height: 2rem;
+}
+
+.nav-home a {
+ display: block;
+ color: #4078c0;
+ font-weight: bold;
+ font-size: 1rem;
+ padding-left: 1rem;
+}
+
+.nav-home a.active {
+ background: #e7e7e7;
+}
+
+.nav-home a:hover {
+ background: #e7e7e7;
+ text-decoration: none;
+}
+
+.nav-home a .home-icon {
+ font-size: 18px;
+ font-family: "icons" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1.2;
+ vertical-align: middle;
+ padding-right: 5px;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.nav-home .version-number {
+ padding-left: 1.4rem;
+ font-size: 0.9rem;
+}
+
+.nav-toc {
+}
+
+.nav-toc ul {
+ margin: 0;
+ padding: 0;
+ line-height: 2rem;
+}
+
+.nav-toc ul > li {
+ list-style-type: none;
+ padding-left: 0;
+}
+
+.nav-toc ul > li a {
+ display: block;
+ color: #4078c0;
+ font-weight: bold;
+ font-size: 0.9rem;
+ padding-left: 1rem;
+}
+
+.nav-toc ul > li a.active {
+ background: #e7e7e7;
+}
+
+.nav-toc ul > li a:hover {
+ background: #e7e7e7;
+ text-decoration: none;
+}
+
+.nav-toc ul > li > ul li {
+ margin-top: 0;
+ border-top: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+.nav-toc ul > li > ul li a {
+ font-size: 0.9rem;
+ font-weight: normal;
+ text-transform: none;
+ margin-top: 0;
+ padding-left: 1.2rem;
+}
+
+.nav-toc ul > li > ul > li > ul li a {
+ font-size: 0.8rem;
+ padding-left: 2rem;
+}
+
+
+/* site navigation */
+
+.site-nav {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border: solid 1px #cccccc;
+}
+
+/* off-canvas navigation colours */
+
+.off-canvas {
+}
+
+.off-canvas-nav {
+ padding: 0;
+}
+
+.off-canvas-nav .nav-home {
+ background: #ffffff;
+}
+
+.off-canvas-nav .nav-toc {
+ background: #ffffff;
+}
+
+.off-canvas-nav .nav-toc ul > li {
+}
+
+.off-canvas-nav .nav-toc ul > li a {
+}
+
+.off-canvas-nav .nav-toc ul > li a.active {
+}
+
+.off-canvas-nav .nav-toc ul > li a:hover {
+}
+
+.off-canvas-nav .nav-toc ul > li a.active:hover {
+}
+
+.off-canvas-nav .nav-toc ul > li > ul li {
+ border-top: 0;
+}
+
+/* page navigation */
+
+.page-nav {
+ background: #ffffff;
+}
+
+.page-nav .nav-title {
+ display: block;
+ color: #9eb1b7;
+ font-weight: bold;
+ font-size: 0.8rem;
+ padding-left: 1rem;
+}
+
+.page-nav .nav-toc {
+ background: #ffffff;
+}
+
+.page-nav .nav-toc ul > li {
+ border-top: 0;
+}
+
+.page-nav .nav-toc ul > li a.active {
+ background: #4078c0;
+ color: #ffffff;
+}
+
+.page-nav .nav-toc ul > li a.active:hover {
+ background: #4078c0;
+}
+
+/* navigation next */
+
+.nav-next {
+ background: #F7F7F7;
+ border-left: 10px solid #4078c0;
+ margin-top: 40px;
+ padding: 1em 20px;
+}
+
+.nav-next p {
+ display: inline;
+ color: #0c323b;
+ font-style: italic;
+}
+
+.nav-next a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+/* table of contents -- ordered */
+
+.toc a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+.toc ol li {
+ color: #778a99;
+}
+
+.toc > ol > li > ol {
+ list-style-type: lower-alpha;
+}
+
+.toc > ol > li > ol > li > ol {
+ list-style-type: lower-roman;
+}
+
+.toc.main > ol > li {
+ margin-top: 0.5em;
+ font-size: 1.2em;
+}
+
+.toc.main > ol > li {
+ counter-increment: root;
+}
+
+.toc.main > ol > li > ol {
+ counter-reset: subsection;
+ list-style-type: none;
+ margin-left: 2rem;
+}
+
+.toc.main > ol > li > ol > li {
+ counter-increment: subsection;
+}
+
+.toc.main > ol > li > ol > li:before {
+ content: counter(root) "." counter(subsection) ". ";
+ margin-left: -2rem;
+ padding-right: 0.25rem;
+}
+
+.toc.main > ol > li > ol > li > ol {
+ list-style-type: lower-alpha;
+}
+
+.toc.main > ol > li > ol > li > ol > li > ol {
+ list-style-type: lower-roman;
+}
+
+/* table of contents -- unordered */
+
+.toc ul li {
+ color: #778a99;
+}
+
+.toc.main > ul {
+ margin-left: 0;
+ padding-bottom: 2rem;
+ border-bottom: 1px solid #f3f6f6;
+}
+
+.toc.main > ul > li {
+ margin-top: 2rem;
+ border-top: 1px solid #f3f6f6;
+ padding-top: 2rem;
+ list-style-type: none;
+}
+
+.toc.main > ul > li > a {
+ font-weight: bold;
+}
+
+.toc.main > ul > li > ul {
+ margin-top: 1rem;
+}
+
+.toc.main > ul > li > ul > li {
+ list-style-type: disc;
+}
+
+.toc.main > ul > li > ul > li > a {
+ font-weight: normal;
+ text-transform: none;
+}
+
+.toc.main > ul > li > ul > li > ul > li {
+ list-style-type: circle;
+}
+
+/* site footer */
+
+.site-footer {
+ margin-top: 3rem;
+ border-top: solid 1px #cccccc;
+}
+
+.site-footer-content.row {
+ max-width: 90rem;
+}
+
+.site-footer-nav {
+ padding: 2rem 0;
+}
+
+.site-footer-nav .with-left-divider {
+ border-top: 0;
+ border-left: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+@media screen and (max-width: 40em) {
+ .site-footer-nav .with-left-divider {
+ margin-top: 2rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.2);
+ padding-top: 2rem;
+ border-left: 0;
+ }
+}
+
+@media screen and (min-width: 40em) {
+ .site-footer-nav .nav-links {
+ height: 8rem;
+ }
+}
+
+.nav-links ul {
+ margin: 0;
+ padding: 0;
+ line-height: 2rem;
+}
+
+.nav-links ul > li {
+ list-style-type: none;
+ padding-left: 0;
+}
+
+.nav-links ul > li a {
+ color: #c5d0d4;
+ font-weight: bold;
+ font-size: 0.9rem;
+}
+
+.nav-links ul > li a:hover {
+ color: #4078C0;
+ text-decoration: none;
+}
+
+.nav-links ul > li > ul li a {
+ font-weight: normal;
+ text-transform: none;
+}
+
+.site-footer-base {
+ padding: 1rem 0;
+}
+
+.site-footer-base h3, .site-footer-base a {
+}
+
+.site-footer-base .copyright {
+ margin-top: 20px;
+}
+
+.site-footer-base .copyright .text {
+ display: inline-block;
+ line-height: 24px;
+ padding-right: 10px;
+ vertical-align: top;
+}
+
+.site-footer-base .svg-icon-logo-text {
+}
+
+.site-footer-base .svg-icon-logo-image {
+}
+
+.site-footer-base .logo:hover .svg-icon-logo-text {
+}
+
+.site-footer-base .logo:hover .svg-icon-logo-image {
+}
+
+.source-github {
+ padding: 10px;
+ padding-top: 30px;
+ margin-top: 20px;
+ border-top: 1px solid #cccccc;
+}
+
+.source-github a {
+ font-weight: bold;
+}
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/print.css b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/print.css
new file mode 100644
index 00000000..01a832eb
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/print.css
@@ -0,0 +1,27 @@
+h2 {
+ page-break-before: always;
+}
+nav.print .toc-page-line {
+ border-bottom: 1px dashed #bbb;
+}
+nav.print .toc-page-no {
+ float: right;
+}
+nav.print li {
+ list-style: none;
+}
+
+.print-cover-title {
+ font-size: 15mm;
+ padding-top: 150mm;
+ text-align: center;
+ width: 100%;
+}
+
+.print-cover-version {
+ font-size: 10mm;
+ font-style: italic;
+ padding-top: 20mm;
+ text-align: center;
+ width: 100%;
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/single.css b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/single.css
new file mode 100644
index 00000000..0b595f79
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/css/single.css
@@ -0,0 +1,63 @@
+h1 {
+ counter-reset: h2 h3 1 h4 1 h5 1;
+}
+
+h2 {
+ counter-increment: h2;
+ counter-reset: h3 h4 1 h5 1;
+}
+
+h2 .header-title::before {
+ content: counter(h2);
+ margin-right: 10px;
+}
+
+h3 {
+ counter-increment: h3;
+ counter-reset: h4 h5 1;
+}
+
+h3 .header-title::before {
+ content: counter(h2) "." counter(h3);
+ margin-right: 10px;
+}
+
+h4 {
+ counter-increment: h4;
+ counter-reset: h5;
+}
+
+h4 .header-title::before {
+ content: counter(h2) "." counter(h3) "." counter(h4);
+ margin-right: 1rem;
+}
+
+h5 {
+ counter-increment: h5;
+}
+
+h5 .header-title::before {
+ content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5);
+ margin-right: 1rem;
+}
+
+nav ul {
+ counter-reset: nav
+}
+
+nav ul > ul {
+ counter-reset: nav;
+}
+
+nav ul ~ ul {
+ counter-reset: none;
+}
+
+nav li {
+ counter-increment: nav;
+}
+
+nav li a::before {
+ content: counters(nav, ".");
+ margin-right: 0.5rem
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/index.html b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/index.html
new file mode 100644
index 00000000..342dced5
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/index.html
@@ -0,0 +1,271 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+
+<head>
+<title>Apache Pekko Cluster with Scala</title>
+<meta charset="utf-8"/>
+<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+<meta name="description" content='Apache Pekko Cluster with Scala'/>
+<link href="https://fonts.googleapis.com/css?family=Roboto:100normal,100italic,300normal,300italic,400normal,400italic,500normal,500italic,700normal,700italic,900normal,900italicc" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="lib/jquery/jquery.min.js"></script>
+<script type="text/javascript" src="js/page.js"></script>
+<script type="text/javascript" src="js/warnOldVersion.js"></script>
+<script type="text/javascript" src="js/groups.js"></script>
+<script type="text/javascript" src="js/snippets.js"></script>
+<link rel="stylesheet" type="text/css" href="lib/foundation/dist/foundation.min.css"/>
+<link rel="stylesheet" type="text/css" href="css/page.css"/>
+
+<!--
+<link rel="shortcut icon" href="images/favicon.ico" />
+-->
+</head>
+
+<body>
+<div class="off-canvas-wrapper">
+<div class="off-canvas-wrapper-inner" data-off-canvas-wrapper>
+
+<div class="off-canvas position-left" id="off-canvas-menu" data-off-canvas>
+<nav class="off-canvas-nav">
+<div class="nav-home">
+<a href="index.html" class="active">
+<span class="home-icon">⌂</span>Apache Pekko Cluster with Scala
+</a>
+<div class="version-number">
+0.1.0*
+</div>
+</div>
+<div class="nav-toc">
+<ul>
+</ul>
+</div>
+
+</nav>
+</div>
+
+<div class="off-canvas-content" data-off-canvas-content>
+
+<header class="site-header expanded row">
+<div class="small-12 column">
+<a href="#" class="off-canvas-toggle hide-for-medium" data-toggle="off-canvas-menu"><svg class="svg-icon svg-icon-menu" version="1.1" id="Menu" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve"> <path class="svg-icon-menu-path" fill="#53CDEC" d="M16.4,9H3.6C3.048,9,3,9.447,3,10c0,0.553,0.048,1,0.6,1H16.4c0.552,0,0.6-0.447,0.6-1C17,9.447,16.952,9,16.4,9z M16.4,13
+H3.6C3.048,13,3,13.447,3,14c0,0.553,0.048,1,0.6,1H16.4c0.552,0,0.6-0.447,0.6-1C17,13.447,16.952,13,16.4,13z M3.6,7H16.4
+C16.952,7,17,6.553,17,6c0-0.553-0.048-1-0.6-1H3.6C3.048,5,3,5.447,3,6C3,6.553,3.048,7,3.6,7z"/></svg>
+</a>
+<div class="title"><a href="index.html" class="active">Apache Pekko Cluster with Scala</a></div>
+
+<!--
+<a href="https://www.example.com" class="logo show-for-medium">logo</a>
+-->
+</div>
+</header>
+
+<div class="expanded row">
+
+<div class="medium-3 large-2 show-for-medium column">
+<nav class="site-nav">
+<div class="nav-home">
+<a href="index.html" class="active">
+<span class="home-icon">⌂</span>Apache Pekko Cluster with Scala
+</a>
+<div class="version-number">
+0.1.0*
+</div>
+</div>
+<div class="nav-toc">
+<ul>
+</ul>
+</div>
+
+</nav>
+</div>
+
+<div class="small-12 medium-9 large-10 column">
+<section class="site-content">
+
+<span id="version-warning"></span>
+
+<div class="page-header row">
+<div class="medium-12 show-for-medium column">
+</div>
+</div>
+
+<div class="page-content row">
+<div class="small-12 large-9 column" id="docs">
+<h1><a href="#apache-pekko-cluster-with-scala" name="apache-pekko-cluster-with-scala" class="anchor"><span class="anchor-link"></span></a>Apache Pekko Cluster with Scala</h1>
+<p>This tutorial contains 3 samples illustrating different <a href="https://pekko.apache.org/docs/pekko/current/typed/cluster.html">Pekko cluster</a> features.</p>
+<ul>
+ <li>Subscribe to cluster membership events</li>
+ <li>Sending messages to actors running on nodes in the cluster</li>
+ <li>Cluster aware routers</li>
+</ul>
+<h2><a href="#a-simple-cluster-example" name="a-simple-cluster-example" class="anchor"><span class="anchor-link"></span></a>A Simple Cluster Example</h2>
+<p>Open <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-scala/src/main/resources/application.conf">application.conf</a></p>
+<p>To enable cluster capabilities in your Apache Pekko project you should, at a minimum, add the remote settings, and use <code>cluster</code> as the <code>org.apache.pekko.actor.provider</code>. The <code>org.apache.pekko.cluster.seed-nodes</code> should normally also be added to your <code>application.conf</code> file.</p>
+<p>The seed nodes are configured contact points which newly started nodes will try to connect with in order to join the cluster.</p>
+<p>Note that if you are going to start the nodes on different machines you need to specify the ip-addresses or host names of the machines in <code>application.conf</code> instead of <code>127.0.0.1</code>.</p>
+<p>Open <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-scala/src/main/scala/sample/cluster/simple/App.scala">SimpleClusterApp.scala</a>.</p>
+<p>The small program together with its configuration starts an ActorSystem with the Cluster enabled. It joins the cluster and starts an actor that logs some membership events. Take a look at the <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-scala/src/main/scala/sample/cluster/simple/ClusterListener.scala">SimpleClusterListener.scala</a> actor.</p>
+<p>You can read more about the cluster concepts in the <a href="https://pekko.apache.org/docs/pekko/current/typed/cluster.html">documentation</a>.</p>
+<p>To run this sample, type <code>sbt "runMain sample.cluster.simple.App"</code>.</p>
+<p><code>sample.cluster.simple.App</code> starts three actor systems (cluster members) in the same JVM process. It can be more interesting to run them in separate processes. Stop the application and then open three terminal windows.</p>
+<p>In the first terminal window, start the first seed node with the following command:</p>
+<pre><code>sbt "runMain sample.cluster.simple.App 17356"
+</code></pre>
+<p>17356 corresponds to the port of the first seed-nodes element in the configuration. In the log output you see that the cluster node has been started and changed status to ‘Up’.</p>
+<p>In the second terminal window, start the second seed node with the following command:</p>
+<pre><code>sbt "runMain sample.cluster.simple.App 17357"
+</code></pre>
+<p>17357 corresponds to the port of the second seed-nodes element in the configuration. In the log output you see that the cluster node has been started and joins the other seed node and becomes a member of the cluster. Its status changed to ‘Up’.</p>
+<p>Switch over to the first terminal window and see in the log output that the member joined.</p>
+<p>Start another node in the third terminal window with the following command:</p>
+<pre><code>sbt "runMain sample.cluster.simple.App 0"
+</code></pre>
+<p>Now you don’t need to specify the port number, 0 means that it will use a random available port. It joins one of the configured seed nodes. Look at the log output in the different terminal windows.</p>
+<p>Start even more nodes in the same way, if you like.</p>
+<p>Shut down one of the nodes by pressing ‘ctrl-c’ in one of the terminal windows. It will cause the node to do a graceful leave from the cluster, telling the other nodes in the cluster that it is leaving. It will then be removed from the cluster, which you can see in the log output in the other terminals.</p>
+<p>Look at the source code of the actor again. It registers itself as subscriber of certain cluster events. It gets notified a stream of events leading up to the current state. After that it receives events for changes that happen in the cluster.</p>
+<p>Now we have seen how to subscribe to cluster membership events. You can read more about it in the <a href="https://pekko.apache.org/docs/pekko/current/typed/cluster.html#cluster-subscriptions">documentation</a>. The membership events show us the state of the cluster but it does not help with accessing actors on other nodes the cluster. To do that we need to use the <a href="https://pekko.apache.org/docs/pekko/current/typed/actor-discovery.html#receptionist">Receptionist</a>.</p>
+<h2><a href="#worker-registration-example" name="worker-registration-example" class="anchor"><span class="anchor-link"></span></a>Worker registration example</h2>
+<p>The <code>Receptionist</code> is a service registry that will work both when in single JVM apps not using cluster, and in clustered apps. <code>ActorRef</code>s are registered to the receptionist using a <code>ServiceKey</code>. The service key is defined with a type of message that actors registered for it will accept and a string identifier. </p>
+<p>Let’s take a look at an example that illustrates how workers, here only on nodes with the role <em>backend</em>, register themselves to the receptionist so that <em>frontend</em> nodes will know what workers are available to perform their work. Note that a node could potentially have both roles, since the node roles are a set. The <code>main</code> provided only allows one role though. </p>
+<p>The example application provides a service to transform text. At a periodic interval the frontend simulates an external request to process a text which it forwards to available workers if there are any. </p>
+<p>Since the discovery of workers is dynamic both <em>backend</em> and <em>frontend</em> nodes can be added to the cluster dynamically. </p>
+<p>The backend worker that performs the transformation job is defined in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-scala/src/main/scala/sample/cluster/transformation/Worker.scala">TransformationBackend.scala</a>. When starting up a worker registers itself to the receptionist so that it can be discovered through its <code>ServiceKey</code> on any node in the cluster.</p>
+<p>The frontend that simulates user jobs as well as keeping track of available workers is defined in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-scala/src/main/scala/sample/cluster/transformation/Frontend.scala">Frontend.scala</a>. The actor subscribes to the <code>Receptionist</code> with the <code>WorkerServiceKey</code> to receive updates when the set of available workers in the cluster changes. If a worker dies or its node is removed from [...]
+<p>To run this sample, make sure you have shut down any previously started cluster sample, then type <code>sbt "runMain sample.cluster.transformation.App"</code>.</p>
+<p>TransformationApp starts 5 actor systems (cluster members) in the same JVM process. It can be more interesting to run them in separate processes. Stop the application and run the following commands in separate terminal windows.</p>
+<pre><code>sbt "runMain sample.cluster.transformation.App backend 17356"
+
+sbt "runMain sample.cluster.transformation.App backend 17357"
+
+sbt "runMain sample.cluster.transformation.App backend 0"
+
+sbt "runMain sample.cluster.transformation.App frontend 0"
+
+sbt "runMain sample.cluster.transformation.App frontend 0"
+</code></pre>
+<p>There is a component built into Apache Pekko that performs the task of subscribing to the receptionist and keeping track of available actors significantly simplifying such interactions: the group router. Let’s look into how we can use those in the next section!</p>
+<h2><a href="#cluster-aware-routers" name="cluster-aware-routers" class="anchor"><span class="anchor-link"></span></a>Cluster Aware Routers</h2>
+<p>The <a href="https://pekko.apache.org/docs/pekko/current/typed/routers.html#group-router">group routers</a> relies on the <code>Receptionist</code> and will therefore route messages to services registered in any node of the cluster.</p>
+<p>Let’s take a look at a few samples that make use of cluster aware routers.</p>
+<h2><a href="#cluster-routing-example" name="cluster-routing-example" class="anchor"><span class="anchor-link"></span></a>Cluster routing example</h2>
+<p>Let’s take a look at two different ways to distribute work across a cluster using routers. </p>
+<p>Note that the samples just shows off various parts of Apache Pekko Cluster and does not provide a complete structure to build a resilient distributed application with. The <a href="https://developer.lightbend.com/guides/akka-distributed-workers-scala/">Distributed Workers With Akka</a> sample covers more of the problems you would have to solve to build a resilient distributed processing application.</p>
+<h3><a href="#example-with-group-of-routees" name="example-with-group-of-routees" class="anchor"><span class="anchor-link"></span></a>Example with Group of routees</h3>
+<p>The example application provides a service to calculate statistics for a text. When some text is sent to the service it splits it into words, and delegates the task to count number of characters in each word to a separate worker, a routee of a router. The character count for each word is sent back to an aggregator that calculates the average number of characters per word when all results have been collected.</p>
+<p>The worker that counts number of characters in each word is defined in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-scala/src/main/scala/sample/cluster/stats/StatsWorker.scala">StatsWorker.scala</a>.</p>
+<p>The service that receives text from users and splits it up into words, delegates to a pool of workers and aggregates the result is defined in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-scala/src/main/scala/sample/cluster/stats/StatsService.scala">StatsService.scala</a>.</p>
+<p>Note, nothing cluster specific so far, just plain actors.</p>
+<p>Nodes in the cluster can be marked with roles, to perform different tasks, in our case we use <code>compute</code> as a role to designate cluster nodes that should do processing of word statistics. </p>
+<p>In <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-scala/src/main/scala/sample/cluster/stats/App.scala">StatsSample.scala</a> each <code>compute</code> node starts a <code>StatsService</code> that distributes work over N local <code>StatsWorkers</code>. The client nodes then message the <code>StatsService</code> instances through a <code>group</code> router. The router finds services by subscribing to the cluster receptionist and a service key [...]
+<p>With this design a single <code>compute</code> node crashing will only lose the ongoing work in that node and have the other nodes keep on with their work, but there is no single place to ask for a list of the current work in progress. </p>
+<p>To run the sample, type <code>sbt "runMain sample.cluster.stats.App"</code> if it is not already started.</p>
+<p>StatsSample starts 4 actor systems (cluster members) in the same JVM process. It can be more interesting to run them in separate processes. Stop the application and run the following commands in separate terminal windows.</p>
+<pre><code>sbt "runMain sample.cluster.stats.App compute 17356"
+
+sbt "runMain sample.cluster.stats.App compute 17357"
+
+sbt "runMain sample.cluster.stats.App compute 0"
+
+sbt "runMain sample.cluster.stats.App client 0"
+</code></pre>
+<h3><a href="#router-example-with-cluster-singleton" name="router-example-with-cluster-singleton" class="anchor"><span class="anchor-link"></span></a>Router example with Cluster Singleton</h3>
+<p><a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-scala/src/main/scala/sample/cluster/stats/AppOneMaster.scala">StatsSampleOneMaster.scala</a> each <code>compute</code> node starts N workers, that register themselves with the receptionist. The <code>StatsService</code> is run in a single instance in the cluster through the Apache Pekko Cluster Singleton. The actual work is performed by workers on all compute nodes though. The workers are reached [...]
+<p>With this design it would be possible to query the singleton for current work - it knows all current requests in flight and could potentially make decisions based on knowing exactly what work is currently in progress. </p>
+<p>If the singleton node crashes however, all ongoing work is lost though since the state of the singleton is not persistent, when it is started on a new node the <code>StatsService</code> will not know of any previous work. It also means that since all work has to go through the singleton it could be come a bottleneck. If one of the other nodes crash only the ongoing work sent to them is lost, however since each ongoing request could be handled by multiple different workers on different [...]
+<p>To run this sample, type <code>sbt "runMain sample.cluster.stats.AppOneMaster"</code> if it is not already started.</p>
+<p>StatsSampleOneMaster starts 4 actor systems (cluster members) in the same JVM process. It can be more interesting to run them in separate processes. Stop the application and run the following commands in separate terminal windows.</p>
+<pre><code>sbt "runMain sample.cluster.stats.AppOneMaster compute 17356"
+
+sbt "runMain sample.cluster.stats.AppOneMaster compute 17357"
+
+sbt "runMain sample.cluster.stats.AppOneMaster compute 0"
+
+sbt "runMain sample.cluster.stats.AppOneMaster client 0"
+</code></pre>
+<h2><a href="#tests" name="tests" class="anchor"><span class="anchor-link"></span></a>Tests</h2>
+<p>Tests can be found in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-cluster-scala/src/multi-jvm">src/multi-jvm</a>. You can run them by typing <code>sbt multi-jvm:test</code>.</p>
+</div>
+<div class="large-3 show-for-large column" data-sticky-container>
+<nav class="sidebar sticky" data-sticky data-anchor="docs" data-sticky-on="large">
+<div class="page-nav">
+<div class="nav-title">On this page:</div>
+<div class="nav-toc">
+<ul>
+ <li><a href="index.html#apache-pekko-cluster-with-scala" class="header">Apache Pekko Cluster with Scala</a>
+ <ul>
+ <li><a href="index.html#a-simple-cluster-example" class="header">A Simple Cluster Example</a></li>
+ <li><a href="index.html#worker-registration-example" class="header">Worker registration example</a></li>
+ <li><a href="index.html#cluster-aware-routers" class="header">Cluster Aware Routers</a></li>
+ <li><a href="index.html#cluster-routing-example" class="header">Cluster routing example</a></li>
+ <li><a href="index.html#tests" class="header">Tests</a></li>
+ </ul></li>
+</ul>
+</div>
+</div>
+</nav>
+</div>
+</div>
+
+</section>
+</div>
+
+</div>
+
+<footer class="site-footer">
+
+<section class="site-footer-nav">
+<div class="expanded row">
+<div class="small-12 large-offset-2 large-10 column">
+<div class="row site-footer-content">
+
+<div class="small-12 medium-4 large-3 text-center column">
+<div class="nav-links">
+<ul>
+<!-- <li><a href="https://www.example.com/products/">Products</a> -->
+</ul>
+</div>
+</div>
+
+</div>
+</div>
+</div>
+</section>
+
+<section class="site-footer-base">
+<div class="expanded row">
+<div class="small-12 large-offset-2 large-10 column">
+<div class="row site-footer-content">
+
+<div class="small-12 text-center large-9 column">
+
+<!--
+<div class="copyright">
+<span class="text">© 2023</span>
+<a href="https://www.example.com" class="logo">logo</a>
+</div>
+-->
+</div>
+
+</div>
+</div>
+</div>
+</section>
+</footer>
+
+</div>
+</div>
+</div>
+</body>
+
+<script type="text/javascript" src="lib/foundation/dist/foundation.min.js"></script>
+<script type="text/javascript">jQuery(document).foundation();</script>
+<script type="text/javascript" src="js/magellan.js"></script>
+
+<style type="text/css">@import "lib/prettify/prettify.css";</style>
+<script type="text/javascript" src="lib/prettify/prettify.js"></script>
+<script type="text/javascript" src="lib/prettify/lang-scala.js"></script>
+<script type="text/javascript">jQuery(function(){window.prettyPrint && prettyPrint()});</script>
+<script type="text/javascript">jQuery(function(jq){initOldVersionWarnings(jq, '0.1.0-SNAPSHOT', '')});</script>
+
+
+</html>
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/groups.js b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/groups.js
new file mode 100644
index 00000000..e9ec53c3
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/groups.js
@@ -0,0 +1,167 @@
+groupChangeListeners = [];
+
+window.groupChanged = function(callback) {
+ groupChangeListeners.push(callback);
+}
+
+$(function() {
+
+ // Groups (like 'java' and 'scala') represent groups of 'switchable' content, either in tabs or in regular text.
+ // The catalog of groups can be defined in the sbt parameters to initialize the group.
+
+ var groupCookie = "paradoxGroups";
+ var cookieTg = getCookie(groupCookie);
+ var currentGroups = {};
+
+ var catalog = {}
+ var supergroupByGroup = {};
+
+ if(cookieTg != "")
+ currentGroups = JSON.parse(cookieTg);
+
+ // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie
+ function setCookie(cookieName, cookieValue, daysToExpire) {
+ if (!daysToExpire) daysToExpire = 365;
+ const now = new Date();
+ now.setDate(now.getDate() + daysToExpire);
+ // The lax value will send the cookie for all same-site
+ // requests and top-level navigation GET requests. This
+ // is sufficient for user tracking, but it will prevent
+ // many CSRF attacks. This is the default value in modern browsers.
+ document.cookie = `${cookieName}=${encodeURIComponent(cookieValue)};expires=${now.toUTCString()};path=/;samesite=lax`;
+ }
+
+ // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#Example_2_Get_a_sample_cookie_named_test2
+ function getCookie(cookieName) {
+ const cookieAttr = decodeURIComponent(document.cookie)
+ .split(";")
+ .find(row => row.trimStart().startsWith(cookieName))
+ return cookieAttr ? cookieAttr.split("=")[1] : "";
+ }
+
+ $("dl").has("dd > pre").each(function() {
+ var dl = $(this);
+ dl.addClass("tabbed");
+ var dts = dl.find("dt");
+ dts.each(function(i) {
+ var dt = $(this);
+ dt.html("<a href=\"#tab" + i + "\">" + dt.text() + "</a>");
+ });
+ var dds = dl.find("dd");
+ dds.each(function(i) {
+ var dd = $(this);
+ dd.hide();
+ if (dd.find("blockquote").length) {
+ dd.addClass("has-note");
+ }
+ });
+
+ // Default to the first tab, for grouped tabs switch again later
+ switchToTab(dts.first());
+
+ dts.first().addClass("first");
+ dts.last().addClass("last");
+ });
+
+ // Determine all supergroups, populate 'catalog' and 'supergroupByGroup' accordingly.
+ $(".supergroup").each(function() {
+ var supergroup = $(this).attr('name').toLowerCase();
+ var groups = $(this).find(".group");
+
+ catalog[supergroup] = [];
+
+ groups.each(function() {
+ var group = "group-" + $(this).text().toLowerCase();
+ catalog[supergroup].push(group);
+ supergroupByGroup[group] = supergroup;
+ });
+
+ $(this).on("change", function() {
+ switchToGroup(supergroup, this.value);
+ });
+ });
+
+ // Switch to the right initial groups
+ for (var supergroup in catalog) {
+ var current = queryParamGroup(supergroup) || currentGroups[supergroup] || catalog[supergroup][0];
+
+ switchToGroup(supergroup, current);
+ }
+
+ $("dl.tabbed dt a").click(function(e){
+ e.preventDefault();
+ var currentDt = $(this).parent("dt");
+ var currentDl = currentDt.parent("dl");
+
+ var currentGroup = groupOf(currentDt);
+
+ var supergroup = supergroupByGroup[currentGroup]
+ if (supergroup) {
+ switchToGroup(supergroup, currentGroup);
+ } else {
+ switchToTab(currentDt);
+ }
+ });
+
+ function queryParamGroup(supergroup) {
+ var value = new URLSearchParams(window.location.search).get(supergroup)
+ if (value) {
+ return "group-" + value.toLowerCase();
+ } else {
+ return "";
+ }
+ }
+
+ function switchToGroup(supergroup, group) {
+ currentGroups[supergroup] = group;
+ setCookie(groupCookie, JSON.stringify(currentGroups));
+
+ // Dropdown switcher:
+ $("select")
+ .has("option[value=" + group +"]")
+ .val(group);
+
+ // Inline snippets:
+ catalog[supergroup].forEach(peer => {
+ if (peer === group) {
+ $("." + group).show();
+ } else {
+ $("." + peer).hide();
+ }
+ })
+
+ // Tabbed snippets:
+ $("dl.tabbed").each(function() {
+ var dl = $(this);
+ dl.find("dt").each(function() {
+ var dt = $(this);
+ if(groupOf(dt) == group) {
+ switchToTab(dt);
+ }
+ });
+ });
+
+ groupChangeListeners.forEach(listener => listener(group, supergroup, catalog));
+ }
+
+ function switchToTab(dt) {
+ var dl = dt.parent("dl");
+ dl.find(".current").removeClass("current").next("dd").removeClass("current").hide();
+ dt.addClass("current");
+ var currentContent = dt.next("dd").addClass("current").show();
+ dl.css("height", dt.height() + currentContent.height());
+ }
+
+ function groupOf(elem) {
+ const classAttribute = elem.next("dd").find("pre").attr("class");
+ if (classAttribute) {
+ const currentClasses = classAttribute.split(' ');
+ const regex = new RegExp("^group-.*");
+ const matchingClass = currentClasses.find(cc => regex.test(cc));
+ if (matchingClass) return matchingClass;
+ }
+
+ // No class found? Then use the tab title
+ return "group-" + elem.find('a').text().toLowerCase();
+ }
+});
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/magellan.js b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/magellan.js
new file mode 100644
index 00000000..52d231ec
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/magellan.js
@@ -0,0 +1,25 @@
+$(function() {
+
+ // add magellan targets to anchor headers, up to depth 3
+ $("a.anchor").each(function() {
+ var anchor = $(this);
+ var name = anchor.attr("name");
+ var header = anchor.parent();
+ if (header.is("h1") || header.is("h2") || header.is("h3")) {
+ header.attr("id", name).attr("data-magellan-target", name);
+ }
+ });
+
+ // enable magellan plugin on the page navigation
+ $(".page-nav").each(function() {
+ var nav = $(this);
+
+ // strip page navigation links down to just the hash fragment
+ nav.find("a").attr('href', function(_, current){
+ return this.hash ? this.hash : current;
+ });
+
+ new Foundation.Magellan(nav);
+ });
+
+});
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/page.js b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/page.js
new file mode 100644
index 00000000..cb2ef674
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/page.js
@@ -0,0 +1,2 @@
+$(function() {
+});
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/snippets.js b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/snippets.js
new file mode 100644
index 00000000..a0d6c869
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/snippets.js
@@ -0,0 +1,6 @@
+$(function() {
+ $(".snippet-button.copy-snippet").click(function() {
+ var code = $(this).parent().find("code").text()
+ navigator.clipboard.writeText(code)
+ })
+})
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/warnOldVersion.js b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/warnOldVersion.js
new file mode 100644
index 00000000..c90bcffb
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/js/warnOldVersion.js
@@ -0,0 +1,23 @@
+function initOldVersionWarnings($, thisVersion, projectUrl) {
+ if (projectUrl && projectUrl !== "") {
+ var schemeLessUrl = projectUrl;
+ if (projectUrl.startsWith("http://")) projectUrl = schemeLessUrl.substring(5);
+ else if (projectUrl.startsWith("https://")) projectUrl = schemeLessUrl.substring(6);
+ const url = schemeLessUrl + (schemeLessUrl.endsWith("\/") ? "" : "/") + "paradox.json";
+ $.get(url, function (versionData) {
+ const currentVersion = versionData.version;
+ if (thisVersion !== currentVersion) {
+ showVersionWarning(thisVersion, currentVersion, projectUrl);
+ }
+ });
+ }
+}
+
+function showVersionWarning(thisVersion, currentVersion, projectUrl) {
+ $('#version-warning').prepend(
+ '<div class="callout warning" style="margin-top: 16px">' +
+ '<p><span style="font-weight: bold">This documentation regards version ' + thisVersion + ', ' +
+ 'however the current version is <a href="' + projectUrl + '">' + currentVersion + '</a>.</span></p>' +
+ '</div>'
+ );
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/foundation/dist/foundation.min.css b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/foundation/dist/foundation.min.css
new file mode 100644
index 00000000..32ce416b
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/foundation/dist/foundation.min.css
@@ -0,0 +1,2 @@
+@charset "UTF-8";
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[ti [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/foundation/dist/foundation.min.js b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/foundation/dist/foundation.min.js
new file mode 100644
index 00000000..858078db
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/foundation/dist/foundation.min.js
@@ -0,0 +1,4 @@
+function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new [...]
+t(this).is(":first-child")?n=o.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(t(this).is(":last-child")&&(s=o.parents("li").first().next("li").find("a").first()))}),Foundation.Keyboard.handleKey(i,"AccordionMenu",{open:function(){r.is(":hidden")&&(e.down(r),r.find("li").first().find("a").first().focus())},close:function(){r.length&&!r.is(":hidden")?e.up(r):o.parent [...]
+}},{key:"_events",value:function(){this.$element.off(".zf.trigger .zf.offcanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offcanvas":this._handleKeyboard.bind(this)}),this.options.closeOnClick&&this.$exiter.length&&this.$exiter.on({"click.zf.offcanvas":this.close.bind(this)})}},{key:"_setMQChecker",value:function(){var e=this;t(window).on("changed.zf.mediaquery",function(){Foundation.MediaQ [...]
+"top"===this.options.stickTo?(o-=n,a-=t+n):"bottom"===this.options.stickTo&&(o-=r-(t+s),a-=r-s),this.topPoint=o,this.bottomPoint=a,i&&"function"==typeof i&&i()}},{key:"destroy",value:function(){this._removeSticky(!0),this.$element.removeClass(this.options.stickyClass+" is-anchored is-at-top").css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),t(window).off(this.scrollListener),this.wasWrapped [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/jquery/jquery.min.js b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/jquery/jquery.min.js
new file mode 100644
index 00000000..c4643af6
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/jquery/jquery.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r= [...]
+},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a); [...]
+},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$ [...]
+//# sourceMappingURL=jquery.min.map
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/prettify/lang-scala.js b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/prettify/lang-scala.js
new file mode 100644
index 00000000..3f97dba5
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/prettify/lang-scala.js
@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object| [...]
+["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]);
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/prettify/prettify.css b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/prettify/prettify.css
new file mode 100644
index 00000000..d44b3a22
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/prettify/prettify.css
@@ -0,0 +1 @@
+.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/prettify/prettify.js b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/prettify/prettify.js
new file mode 100644
index 00000000..7b990496
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/lib/prettify/prettify.js
@@ -0,0 +1,30 @@
+!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/ [...]
+b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a<f;++a){var h=b[a];if(/\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),l;a+2<f&&"-"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b [...]
+h[1]>h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var l=a[f];l==="("?++h:"\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l==="("?(++h,d[h]||(a[f]="(?:")):"\\"===l.charAt(0)&&(l=+l.substring(1) [...]
+(a[f]="\\"+d[l]);for(f=0;f<c;++f)"^"===a[f]&&"^"!==a[f+1]&&(a[f]="");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var i=a[k];if(i.ignoreCase)j=!0;else if(/[a-z]/i.test(i.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){m=!0;j=!1;break}}for(var r={b:8,t:9, [...]
+f:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw Error(""+i);n.push("(?:"+s(i)+")")}return RegExp(n.join("|"),j?"gi":"g")}function T(a,d){function g(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)s[j]="\n",m[j<<1]=x++,m[j++<<1|1]=a}}else if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r ]+/g," "),s[j]=c,m[j<<1]=x,x+=c.length,m [...]
+a)}var b=/(?:^|\s)nocode(?:\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join("").replace(/\n$/,""),d:m}}function H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function U(a){for(var d=void 0,g=a.firstChild;g;g=g.nextSibling)var b=g.nodeType,d=b===1?d?a:g:b===3?V.test(g.nodeValue)?a:d:d;return d===a?void 0:d}function C(a,d){function g(a){for(var j=a.e,k=[j,"pln"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var z=i[n],w=r[z],t=void 0,f;if(typeof w==="string")f=!1;else{var h=b[z.c [...]
+if(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w="pln")}if((f=w.length>=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.le [...]
+g[c],n=r[3];if(n)for(var e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)| [...]
+q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d. [...]
+/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+ [...]
+s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["p [...]
+q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b [...]
+c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute("value",d);var [...]
+r.className="linenums";for(var d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className="L"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode("\u00a0")),r.appendChild(k);a.appendChild(r)}function p(a,d){for(var g=d.length;--g>=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return F[a]}function K(a){var d=a.h;try{var g=T(a.c [...]
+a.a=b;a.d=g.d;a.e=0;I(d,b)(a);var s=/\bMSIE\s(\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var f=a.c,h;if(f)h=f.style.display,f.style.display="none";try{for(;b<k;){var l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType! [...]
+t))){s&&(G=G.replace(d,"\r"));A.nodeValue=G;var L=A.ownerDocument,o=L.createElement("span");o.className=c[r+1];var v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inl [...]
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,pack [...]
+O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,wi [...]
+Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map [...]
+V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%? [...]
+/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["p [...]
+["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimString [...]
+["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl", [...]
+hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc", [...]
+p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;g&&J(b,g,!0);K({h:d,j [...]
+return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var d=p[i],j=h,k=d;k=k.previousSibling;){var m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\??prettify\b/.test(o):m!==3||/\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f. [...]
+o.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=j.lang;if(!m){var m=k.match(n),y;if(!m&&(y=U(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else var o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue("white-space"):0)&&"pre"===o.substring(0,3);u=j.linenums;if(!(u=u==="true"||+u))u=(u=k.match(/\blinenums\b(?::(\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J [...]
+{h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):"function"===typeof a&&a()}for(var b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],p=[],m=0;m<b.length;++m)for(var j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var b=q,c=Date;c.now||(c={now:function(){return+new Date}});var i=0,r,n=/\blang(?:uage)?-([\w.]+)(?!\S)/,e=/\bprettyprint\b/,v=/\bprettyprinted\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code [...]
+h={};g()}};typeof define==="function"&&define.amd&&define("google-code-prettify",[],function(){return Y})})();}()
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/paradox.json b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/paradox.json
new file mode 100644
index 00000000..169a5591
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/paradox.json
@@ -0,0 +1,4 @@
+{
+ "name" : "Apache Pekko Cluster with Scala",
+ "version" : "0.1.0-SNAPSHOT"
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-cluster-scala/print-toc.xslt b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/print-toc.xslt
new file mode 100644
index 00000000..c240f5ab
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-cluster-scala/print-toc.xslt
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="2.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:outline="http://wkhtmltopdf.org/outline"
+ xmlns="http://www.w3.org/1999/xhtml">
+ <xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
+ doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
+ indent="yes" />
+ <xsl:template match="outline:outline">
+ <html>
+ <head>
+ <title>Table of Contents</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/lib/foundation/dist/foundation.min.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/page.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/single.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/print.css"/>
+ </head>
+ <body>
+ <h1>Table of Contents</h1>
+ <nav class="print">
+ <xsl:apply-templates select="outline:item/outline:item">
+ <xsl:with-param name="depth" select="1"/>
+ </xsl:apply-templates>
+ </nav>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="outline:item">
+ <xsl:param name="depth"/>
+ <xsl:comment>Only add the li tags for elements beyond the first depth, so that the roots don't get numbers from our css</xsl:comment>
+ <xsl:choose>
+ <xsl:when test="$depth > 1">
+ <li>
+ <xsl:call-template name="item-inner">
+ <xsl:with-param name="depth" select="$depth"/>
+ </xsl:call-template>
+ </li>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="item-inner">
+ <xsl:with-param name="depth" select="$depth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="item-inner">
+ <xsl:param name="depth"/>
+ <xsl:if test="@title!=''">
+ <div class="toc-page-line">
+ <a>
+ <xsl:if test="@link">
+ <xsl:attribute name="href"><xsl:value-of select="@link"/></xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@backLink">
+ <xsl:attribute name="name"><xsl:value-of select="@backLink"/></xsl:attribute>
+ </xsl:if>
+ <xsl:value-of select="@title" />
+ </a>
+ <span class="toc-page-no"> <xsl:value-of select="@page" /> </span>
+ </div>
+ </xsl:if>
+ <xsl:if test="$depth < 5">
+ <ul>
+ <xsl:comment>added to prevent self-closing tags in QtXmlPatterns</xsl:comment>
+ <xsl:apply-templates select="outline:item">
+ <xsl:with-param name="depth" select="$depth + 1"/>
+ </xsl:apply-templates>
+ </ul>
+ </xsl:if>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/fonts/icons.eot b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/fonts/icons.eot
new file mode 100644
index 00000000..a5203e87
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/fonts/icons.eot differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/fonts/icons.svg b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/fonts/icons.svg
new file mode 100644
index 00000000..58c74882
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/fonts/icons.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by Fontastic.me</metadata>
+<defs>
+<font id="icons" horiz-adv-x="512">
+<font-face font-family="icons" units-per-em="512" ascent="480" descent="-32"/>
+<missing-glyph horiz-adv-x="512" />
+
+<glyph unicode="§" d="M202 136c5 5 10 7 17 7 7 0 13-2 19-7 10-11 10-23 0-36 0 0-22-20-22-20-19-19-42-29-68-29-26 0-49 10-68 29-19 19-29 42-29 67 0 27 10 50 29 69 0 0 76 76 76 76 24 23 48 36 73 39 26 3 47-4 66-22 5-5 8-11 8-18 0-7-3-13-8-19-12-11-24-11-36 0-17 17-40 11-68-17 0 0-75-75-75-75-9-9-14-20-14-33 0-13 5-23 14-31 9-9 19-14 32-14 13 0 23 5 32 14 0 0 22 20 22 20m230 294c19-19 29-42 29-68 0-26-10-49-29-68 0 0-81-81-81-81-25-25-51-37-77-37-21 0-40 9-57 26-5 5-7 10-7 17 0 7 2 13 [...]
+<glyph unicode="⌂" d="M480 249c6-6 8-10 6-14-2-4-6-6-14-6 0 0-43 0-43 0 0 0 0-158 0-158 0-5 0-9 0-11-1-2-2-5-4-7-3-2-7-3-12-3 0 0-105 0-105 0 0 0 0 159 0 159 0 0-104 0-104 0 0 0 0-159 0-159 0 0-99 0-99 0-10 0-16 2-18 5-3 4-4 9-4 16 0 0 0 158 0 158 0 0-43 0-43 0-7 0-12 2-14 6-1 4 0 8 6 14 0 0 205 206 205 206 5 5 12 8 19 8 8 0 14-3 20-8 0 0 204-206 204-206"/>
+</font></defs></svg>
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/fonts/icons.ttf b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/fonts/icons.ttf
new file mode 100644
index 00000000..6da4b13e
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/fonts/icons.ttf differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/fonts/icons.woff b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/fonts/icons.woff
new file mode 100644
index 00000000..2c7e917b
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/fonts/icons.woff differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/page.css b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/page.css
new file mode 100644
index 00000000..7be66ced
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/page.css
@@ -0,0 +1,965 @@
+@charset "UTF-8";
+
+/* fonts */
+
+@font-face {
+ font-family: "icons";
+ src:url("fonts/icons.eot");
+ src:url("fonts/icons.eot?#iefix") format("embedded-opentype"),
+ url("fonts/icons.woff") format("woff"),
+ url("fonts/icons.ttf") format("truetype"),
+ url("fonts/icons.svg#icons") format("svg");
+ font-weight: normal;
+ font-style: normal;
+}
+
+/* body */
+
+body {
+ background: #fff;
+ padding: 0;
+ margin: 0;
+ font-weight: 400;
+ font-style: normal;
+ line-height: 1.4em;
+ position: relative;
+ cursor: default;
+ font: 1em "Roboto", "Helvetica Neue", "Helvetica", Arial, sans-serif;
+ color: #333333;
+ font-smoothing: antialiased;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-size-adjust: none;
+ text-rendering: optimizeLegibility;
+}
+
+/* headers */
+
+h1 {
+ font-family: inherit;
+ font-size: 2.6em;
+ font-weight: 300;
+ color: #333333;
+ margin-bottom: 0.4em;
+ margin-top: 1.1em;
+}
+
+h1:first-child {
+ margin-top: 0;
+}
+
+h2 {
+ font-family: inherit;
+ font-size: 1.8em;
+ font-weight: 400;
+ color: #333333;
+ margin-bottom: 0.2em;
+ margin-top: 1.3em;
+}
+
+h2:first-child {
+ margin-top: 0;
+}
+
+h3 {
+ font-family: inherit;
+ font-size: 1.125em;
+ font-weight: 700;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h3:first-child {
+ margin-top: 0;
+}
+
+h4 {
+ font-family: inherit;
+ font-size: 1em;
+ font-weight: 700;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h4:first-child {
+ margin-top: 0;
+}
+
+h5 {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h5:first-child {
+ margin-top: 0;
+}
+
+h6 {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h6:first-child {
+ margin-top: 0;
+}
+
+/* text */
+
+p {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ line-height: 1.45em;
+ margin: 1em 0em;
+}
+
+/* links */
+
+a {
+ font-family: inherit;
+ color: #4078c0;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+a:link {
+ color: #4078c0;
+}
+
+a:visited {
+ color: #4078c0;
+}
+
+a:hover {
+ color: #4078c0;
+ text-decoration: underline;
+}
+
+a:active {
+ color: #4078c0;
+}
+
+/* header anchors */
+
+a.anchor .anchor-link:before {
+ content: "§";
+}
+
+.site-content .page-content .prettyprint .snippet-button {
+ float: right;
+ text-decoration: none;
+ font-size: 0.75rem;
+ font-weight: bold;
+ font-family: "Roboto", "Helvetica Neue", "Helvetica", Arial, sans-serif;
+ speak: none;
+ color: #4078c0;
+ border: 2px solid #e5e6e4;
+ padding: 4px 4px;
+ margin-left: 8px;
+ line-height: 1.2;
+ vertical-align: middle;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.site-content .page-content .prettyprint .snippet-button:hover {
+ background-color: #e5e6e4;
+ border: 2px solid #4078c0;
+}
+
+a.anchor .anchor-link {
+ font-size: 18px;
+ font-family: "icons" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1.2;
+ vertical-align: middle;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor {
+ visibility: hidden;
+ position: absolute;
+ display: block;
+ width: 30px;
+ margin-left: -30px;
+ padding-right: 3px;
+ text-align: right;
+ text-decoration: none;
+}
+
+h1:hover > a.anchor, h2:hover > a.anchor, h3:hover > a.anchor, h4:hover > a.anchor, h5:hover > a.anchor, h6:hover > a.anchor {
+ visibility: visible;
+ color: inherit;
+ text-decoration: none;
+}
+
+
+/* table */
+
+table th {
+ background: #ffffff;
+ border: solid 1px #dddddd;
+}
+
+table td {
+ background: #ffffff;
+ border: solid 1px #dddddd;
+}
+
+/* code */
+
+pre {
+ padding: 1rem !important;
+ border: 1px solid #dddddd !important;
+ margin: 0 0 1rem 0 !important;
+ white-space: pre;
+ overflow: auto;
+ line-height: 0.9em !important;
+}
+
+code {
+ line-height: 1.45em !important;
+ font-family: Consolas, "Liberation Mono", Courier, monospace;
+ font-size: 0.85em !important;
+ font-weight: normal !important;
+ padding: 0 !important;
+}
+
+pre > code {
+ background: none;
+ border: none;
+}
+
+p code {
+ border: none;
+ color: #0c323b;
+ padding: 0 0.2em !important;
+}
+
+li code {
+ border: none;
+ color: #0c323b;
+ padding: 0 0.2em !important;
+}
+
+/* Github-like */
+
+pre.prettyprint span.str {
+ color: #183691;
+}
+pre.prettyprint span.kwd {
+ color: #000000;
+ font-weight: bold;
+}
+pre.prettyprint span.com {
+ color: #999988;
+ font-style: italic;
+}
+pre.prettyprint span.typ {
+ color: #445588;
+ font-weight: bold;
+}
+pre.prettyprint span.lit {
+ color: #009999
+}
+pre.prettyprint span.pun {
+ color: #000000;
+ font-weight: bold;
+}
+pre.prettyprint span.pln {
+ color: #000000
+}
+pre.prettyprint span.tag {
+ color: navy
+}
+pre.prettyprint span.atn {
+ color: teal
+}
+pre.prettyprint span.atv {
+ color: #dd1144
+}
+pre.prettyprint span.dec {
+ color: #990000
+}
+pre.prettyprint span.var {
+ color: #000000
+}
+pre.prettyprint span.fun {
+ color: #990000
+}
+
+/* tabbed code snippets */
+
+dl.tabbed {
+ position: relative;
+}
+
+dl.tabbed dt {
+ float: left;
+ display: inline-block;
+ position: relative;
+ left: 1px;
+ margin-left: -1px;
+}
+
+dl.tabbed dt.current {
+ z-index: 2;
+}
+
+dl.tabbed dt a {
+ display: block;
+ border: 1px solid #f7f7f7;
+ padding: 0 20px;
+ height: 30px;
+ line-height: 2;
+ color: #4078c0;
+ text-decoration: none;
+}
+
+dl.tabbed dt a:hover {
+ background: #f7f7f7;
+}
+
+dl.tabbed dt.first a {
+ border-top-left-radius: 5px;
+}
+
+dl.tabbed dt.last a {
+ border-top-right-radius: 5px;
+}
+
+dl.tabbed dt.current a {
+ background-color: #f7f7f7;
+ border-color: #dddddd;
+ border-bottom: 0;
+ padding-bottom: 1px;
+}
+
+dl.tabbed dt.current a {
+ color: #0c323b;
+ outline: none;
+}
+
+dl.tabbed dd {
+ position: absolute;
+ width: 100%;
+ left: 0;
+ top: 29px;
+}
+
+dl.tabbed dd.current {
+ z-index: 1;
+}
+
+dl.tabbed dd pre {
+ border-top-left-radius: 0 !important;
+}
+
+dl.tabbed dd.has-note pre {
+ border-bottom: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+dl.tabbed dd.has-note blockquote {
+ color: #0c323b;
+ border: solid #dddddd;
+ border-width: 1px 1px 1px 10px;
+ border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px;
+ margin-top: 0;
+ font-style: italic;
+}
+
+/* blockquotes */
+
+blockquote {
+ border-left: 4px solid rgb(221, 221, 221);
+ margin: 1.5em 0;
+ padding: 1em 20px;
+ color: rgb(119, 119, 119);
+ line-height: 1.4em;
+}
+
+blockquote p {
+ margin: 0;
+ line-height: 1.4em;
+}
+
+blockquote p ~ p {
+ margin-top: 1em;
+}
+
+blockquote p code {
+ background: #fff;
+ padding-right: 0.4em !important;
+}
+
+/* callout */
+
+.callout {
+ border: none;
+ border-left: 10px solid #4078c0;
+ background-color: rgba(64, 120, 192, 0.1);
+}
+
+.callout.warning {
+ border-color: #DB504A;
+ background-color: #fff3d9;
+}
+
+.callout .callout-title {
+ font-weight: bold;
+ margin-bottom: 0.33em;
+}
+
+.callout div ~ p {
+ margin-top: 0;
+}
+
+.callout p ~ p {
+ margin-top: 1em;
+ margin-bottom: 0;
+}
+
+.callout p code {
+ background: #fff;
+ padding-right: 0.4em !important;
+}
+
+/* footnotes */
+
+small {
+ display: block;
+}
+
+/* logo links */
+
+.logo .svg-icon-logo {
+ height: 24px;
+ width: 112px;
+}
+
+.logo:hover {
+ text-decoration: none;
+}
+
+.svg-icon-logo .svg-icon-logo-text {
+ fill: #ffffff;
+}
+
+.logo:hover .svg-icon-logo .svg-icon-logo-text {
+ fill: #4078C0;
+}
+
+/* site header */
+
+.site-header {
+ background: #fcfcfc;
+ border-bottom: solid 1px #cccccc;
+}
+
+.site-header .title {
+ display: inline-block;
+ float: left;
+ height: 70px;
+ line-height: 70px;
+ font-weight: 400;
+ font-size: 1.4em;
+}
+
+.site-header .title a:link, .site-header .title a:visited {
+ color: #515151;
+}
+
+.site-header .title a:hover {
+ color: #515151;
+ text-decoration: none;
+}
+
+.site-header .off-canvas-toggle {
+ float: left;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu {
+ height: 40px;
+ width: 40px;
+ margin-top: 1rem;
+ margin-right: 1rem;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu .svg-icon-menu-path {
+ fill: #000;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu:hover .svg-icon-menu-path {
+ fill: #4183C4;
+}
+
+.site-header .logo {
+ float: right;
+ margin-top: 1rem;
+ text-align: right;
+ color: #000;
+}
+
+/* page header */
+
+.page-header {
+ background: #ffffff;
+ margin-top: 1rem;
+}
+
+.page-header .nav-breadcrumbs {
+ border-bottom: 1px solid #c2d2dc;
+}
+
+.page-header .nav-breadcrumbs ul {
+ display: block;
+ overflow: hidden;
+ margin: 0;
+ padding: 15px;
+ list-style: none;
+ font-size: 0.9em;
+}
+
+.page-header .nav-breadcrumbs li {
+ float: left;
+ margin: 0;
+}
+
+.page-header .nav-breadcrumbs li:before {
+ content: "/";
+ margin: 0 5px;
+ color: #c2d2dc;
+}
+
+.page-header .nav-breadcrumbs li:first-child:before {
+ content: "";
+ margin: 0;
+}
+
+.page-header .nav-breadcrumbs li a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+/* content */
+
+.site-content .row {
+ max-width: 90rem;
+}
+
+.page-content {
+ background: #ffffff;
+ min-height: 600px;
+ padding: 2.5rem 0;
+}
+
+/* sidebar */
+
+.sidebar {
+ background: #ffffff;
+ width: 100%;
+ padding: 0;
+}
+
+.sidebar .nav-toc {
+ padding-top: 1rem;
+}
+
+/* navigation */
+
+.nav-home {
+ background: #f7f7f7;
+ line-height: 2rem;
+}
+
+.nav-home a {
+ display: block;
+ color: #4078c0;
+ font-weight: bold;
+ font-size: 1rem;
+ padding-left: 1rem;
+}
+
+.nav-home a.active {
+ background: #e7e7e7;
+}
+
+.nav-home a:hover {
+ background: #e7e7e7;
+ text-decoration: none;
+}
+
+.nav-home a .home-icon {
+ font-size: 18px;
+ font-family: "icons" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1.2;
+ vertical-align: middle;
+ padding-right: 5px;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.nav-home .version-number {
+ padding-left: 1.4rem;
+ font-size: 0.9rem;
+}
+
+.nav-toc {
+}
+
+.nav-toc ul {
+ margin: 0;
+ padding: 0;
+ line-height: 2rem;
+}
+
+.nav-toc ul > li {
+ list-style-type: none;
+ padding-left: 0;
+}
+
+.nav-toc ul > li a {
+ display: block;
+ color: #4078c0;
+ font-weight: bold;
+ font-size: 0.9rem;
+ padding-left: 1rem;
+}
+
+.nav-toc ul > li a.active {
+ background: #e7e7e7;
+}
+
+.nav-toc ul > li a:hover {
+ background: #e7e7e7;
+ text-decoration: none;
+}
+
+.nav-toc ul > li > ul li {
+ margin-top: 0;
+ border-top: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+.nav-toc ul > li > ul li a {
+ font-size: 0.9rem;
+ font-weight: normal;
+ text-transform: none;
+ margin-top: 0;
+ padding-left: 1.2rem;
+}
+
+.nav-toc ul > li > ul > li > ul li a {
+ font-size: 0.8rem;
+ padding-left: 2rem;
+}
+
+
+/* site navigation */
+
+.site-nav {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border: solid 1px #cccccc;
+}
+
+/* off-canvas navigation colours */
+
+.off-canvas {
+}
+
+.off-canvas-nav {
+ padding: 0;
+}
+
+.off-canvas-nav .nav-home {
+ background: #ffffff;
+}
+
+.off-canvas-nav .nav-toc {
+ background: #ffffff;
+}
+
+.off-canvas-nav .nav-toc ul > li {
+}
+
+.off-canvas-nav .nav-toc ul > li a {
+}
+
+.off-canvas-nav .nav-toc ul > li a.active {
+}
+
+.off-canvas-nav .nav-toc ul > li a:hover {
+}
+
+.off-canvas-nav .nav-toc ul > li a.active:hover {
+}
+
+.off-canvas-nav .nav-toc ul > li > ul li {
+ border-top: 0;
+}
+
+/* page navigation */
+
+.page-nav {
+ background: #ffffff;
+}
+
+.page-nav .nav-title {
+ display: block;
+ color: #9eb1b7;
+ font-weight: bold;
+ font-size: 0.8rem;
+ padding-left: 1rem;
+}
+
+.page-nav .nav-toc {
+ background: #ffffff;
+}
+
+.page-nav .nav-toc ul > li {
+ border-top: 0;
+}
+
+.page-nav .nav-toc ul > li a.active {
+ background: #4078c0;
+ color: #ffffff;
+}
+
+.page-nav .nav-toc ul > li a.active:hover {
+ background: #4078c0;
+}
+
+/* navigation next */
+
+.nav-next {
+ background: #F7F7F7;
+ border-left: 10px solid #4078c0;
+ margin-top: 40px;
+ padding: 1em 20px;
+}
+
+.nav-next p {
+ display: inline;
+ color: #0c323b;
+ font-style: italic;
+}
+
+.nav-next a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+/* table of contents -- ordered */
+
+.toc a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+.toc ol li {
+ color: #778a99;
+}
+
+.toc > ol > li > ol {
+ list-style-type: lower-alpha;
+}
+
+.toc > ol > li > ol > li > ol {
+ list-style-type: lower-roman;
+}
+
+.toc.main > ol > li {
+ margin-top: 0.5em;
+ font-size: 1.2em;
+}
+
+.toc.main > ol > li {
+ counter-increment: root;
+}
+
+.toc.main > ol > li > ol {
+ counter-reset: subsection;
+ list-style-type: none;
+ margin-left: 2rem;
+}
+
+.toc.main > ol > li > ol > li {
+ counter-increment: subsection;
+}
+
+.toc.main > ol > li > ol > li:before {
+ content: counter(root) "." counter(subsection) ". ";
+ margin-left: -2rem;
+ padding-right: 0.25rem;
+}
+
+.toc.main > ol > li > ol > li > ol {
+ list-style-type: lower-alpha;
+}
+
+.toc.main > ol > li > ol > li > ol > li > ol {
+ list-style-type: lower-roman;
+}
+
+/* table of contents -- unordered */
+
+.toc ul li {
+ color: #778a99;
+}
+
+.toc.main > ul {
+ margin-left: 0;
+ padding-bottom: 2rem;
+ border-bottom: 1px solid #f3f6f6;
+}
+
+.toc.main > ul > li {
+ margin-top: 2rem;
+ border-top: 1px solid #f3f6f6;
+ padding-top: 2rem;
+ list-style-type: none;
+}
+
+.toc.main > ul > li > a {
+ font-weight: bold;
+}
+
+.toc.main > ul > li > ul {
+ margin-top: 1rem;
+}
+
+.toc.main > ul > li > ul > li {
+ list-style-type: disc;
+}
+
+.toc.main > ul > li > ul > li > a {
+ font-weight: normal;
+ text-transform: none;
+}
+
+.toc.main > ul > li > ul > li > ul > li {
+ list-style-type: circle;
+}
+
+/* site footer */
+
+.site-footer {
+ margin-top: 3rem;
+ border-top: solid 1px #cccccc;
+}
+
+.site-footer-content.row {
+ max-width: 90rem;
+}
+
+.site-footer-nav {
+ padding: 2rem 0;
+}
+
+.site-footer-nav .with-left-divider {
+ border-top: 0;
+ border-left: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+@media screen and (max-width: 40em) {
+ .site-footer-nav .with-left-divider {
+ margin-top: 2rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.2);
+ padding-top: 2rem;
+ border-left: 0;
+ }
+}
+
+@media screen and (min-width: 40em) {
+ .site-footer-nav .nav-links {
+ height: 8rem;
+ }
+}
+
+.nav-links ul {
+ margin: 0;
+ padding: 0;
+ line-height: 2rem;
+}
+
+.nav-links ul > li {
+ list-style-type: none;
+ padding-left: 0;
+}
+
+.nav-links ul > li a {
+ color: #c5d0d4;
+ font-weight: bold;
+ font-size: 0.9rem;
+}
+
+.nav-links ul > li a:hover {
+ color: #4078C0;
+ text-decoration: none;
+}
+
+.nav-links ul > li > ul li a {
+ font-weight: normal;
+ text-transform: none;
+}
+
+.site-footer-base {
+ padding: 1rem 0;
+}
+
+.site-footer-base h3, .site-footer-base a {
+}
+
+.site-footer-base .copyright {
+ margin-top: 20px;
+}
+
+.site-footer-base .copyright .text {
+ display: inline-block;
+ line-height: 24px;
+ padding-right: 10px;
+ vertical-align: top;
+}
+
+.site-footer-base .svg-icon-logo-text {
+}
+
+.site-footer-base .svg-icon-logo-image {
+}
+
+.site-footer-base .logo:hover .svg-icon-logo-text {
+}
+
+.site-footer-base .logo:hover .svg-icon-logo-image {
+}
+
+.source-github {
+ padding: 10px;
+ padding-top: 30px;
+ margin-top: 20px;
+ border-top: 1px solid #cccccc;
+}
+
+.source-github a {
+ font-weight: bold;
+}
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/print.css b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/print.css
new file mode 100644
index 00000000..01a832eb
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/print.css
@@ -0,0 +1,27 @@
+h2 {
+ page-break-before: always;
+}
+nav.print .toc-page-line {
+ border-bottom: 1px dashed #bbb;
+}
+nav.print .toc-page-no {
+ float: right;
+}
+nav.print li {
+ list-style: none;
+}
+
+.print-cover-title {
+ font-size: 15mm;
+ padding-top: 150mm;
+ text-align: center;
+ width: 100%;
+}
+
+.print-cover-version {
+ font-size: 10mm;
+ font-style: italic;
+ padding-top: 20mm;
+ text-align: center;
+ width: 100%;
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/single.css b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/single.css
new file mode 100644
index 00000000..0b595f79
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/css/single.css
@@ -0,0 +1,63 @@
+h1 {
+ counter-reset: h2 h3 1 h4 1 h5 1;
+}
+
+h2 {
+ counter-increment: h2;
+ counter-reset: h3 h4 1 h5 1;
+}
+
+h2 .header-title::before {
+ content: counter(h2);
+ margin-right: 10px;
+}
+
+h3 {
+ counter-increment: h3;
+ counter-reset: h4 h5 1;
+}
+
+h3 .header-title::before {
+ content: counter(h2) "." counter(h3);
+ margin-right: 10px;
+}
+
+h4 {
+ counter-increment: h4;
+ counter-reset: h5;
+}
+
+h4 .header-title::before {
+ content: counter(h2) "." counter(h3) "." counter(h4);
+ margin-right: 1rem;
+}
+
+h5 {
+ counter-increment: h5;
+}
+
+h5 .header-title::before {
+ content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5);
+ margin-right: 1rem;
+}
+
+nav ul {
+ counter-reset: nav
+}
+
+nav ul > ul {
+ counter-reset: nav;
+}
+
+nav ul ~ ul {
+ counter-reset: none;
+}
+
+nav li {
+ counter-increment: nav;
+}
+
+nav li a::before {
+ content: counters(nav, ".");
+ margin-right: 0.5rem
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/index.html b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/index.html
new file mode 100644
index 00000000..d9c82bbd
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/index.html
@@ -0,0 +1,242 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+
+<head>
+<title>Apache Pekko Distributed Data with Java</title>
+<meta charset="utf-8"/>
+<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+<meta name="description" content='Apache Pekko Distributed Data with Java'/>
+<link href="https://fonts.googleapis.com/css?family=Roboto:100normal,100italic,300normal,300italic,400normal,400italic,500normal,500italic,700normal,700italic,900normal,900italicc" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="lib/jquery/jquery.min.js"></script>
+<script type="text/javascript" src="js/page.js"></script>
+<script type="text/javascript" src="js/warnOldVersion.js"></script>
+<script type="text/javascript" src="js/groups.js"></script>
+<script type="text/javascript" src="js/snippets.js"></script>
+<link rel="stylesheet" type="text/css" href="lib/foundation/dist/foundation.min.css"/>
+<link rel="stylesheet" type="text/css" href="css/page.css"/>
+
+<!--
+<link rel="shortcut icon" href="images/favicon.ico" />
+-->
+</head>
+
+<body>
+<div class="off-canvas-wrapper">
+<div class="off-canvas-wrapper-inner" data-off-canvas-wrapper>
+
+<div class="off-canvas position-left" id="off-canvas-menu" data-off-canvas>
+<nav class="off-canvas-nav">
+<div class="nav-home">
+<a href="index.html" class="active">
+<span class="home-icon">⌂</span>Apache Pekko Distributed Data with Java
+</a>
+<div class="version-number">
+0.1.0*
+</div>
+</div>
+<div class="nav-toc">
+<ul>
+</ul>
+</div>
+
+</nav>
+</div>
+
+<div class="off-canvas-content" data-off-canvas-content>
+
+<header class="site-header expanded row">
+<div class="small-12 column">
+<a href="#" class="off-canvas-toggle hide-for-medium" data-toggle="off-canvas-menu"><svg class="svg-icon svg-icon-menu" version="1.1" id="Menu" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve"> <path class="svg-icon-menu-path" fill="#53CDEC" d="M16.4,9H3.6C3.048,9,3,9.447,3,10c0,0.553,0.048,1,0.6,1H16.4c0.552,0,0.6-0.447,0.6-1C17,9.447,16.952,9,16.4,9z M16.4,13
+H3.6C3.048,13,3,13.447,3,14c0,0.553,0.048,1,0.6,1H16.4c0.552,0,0.6-0.447,0.6-1C17,13.447,16.952,13,16.4,13z M3.6,7H16.4
+C16.952,7,17,6.553,17,6c0-0.553-0.048-1-0.6-1H3.6C3.048,5,3,5.447,3,6C3,6.553,3.048,7,3.6,7z"/></svg>
+</a>
+<div class="title"><a href="index.html" class="active">Apache Pekko Distributed Data with Java</a></div>
+
+<!--
+<a href="https://www.example.com" class="logo show-for-medium">logo</a>
+-->
+</div>
+</header>
+
+<div class="expanded row">
+
+<div class="medium-3 large-2 show-for-medium column">
+<nav class="site-nav">
+<div class="nav-home">
+<a href="index.html" class="active">
+<span class="home-icon">⌂</span>Apache Pekko Distributed Data with Java
+</a>
+<div class="version-number">
+0.1.0*
+</div>
+</div>
+<div class="nav-toc">
+<ul>
+</ul>
+</div>
+
+</nav>
+</div>
+
+<div class="small-12 medium-9 large-10 column">
+<section class="site-content">
+
+<span id="version-warning"></span>
+
+<div class="page-header row">
+<div class="medium-12 show-for-medium column">
+</div>
+</div>
+
+<div class="page-content row">
+<div class="small-12 large-9 column" id="docs">
+<h1><a href="#apache-pekko-distributed-data-with-java" name="apache-pekko-distributed-data-with-java" class="anchor"><span class="anchor-link"></span></a>Apache Pekko Distributed Data with Java</h1>
+<p>This tutorial contains 5 samples illustrating how to use <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html">Apache Pekko Distributed Data</a>.</p>
+<ul>
+ <li>Low Latency Voting Service</li>
+ <li>Highly Available Shopping Cart</li>
+ <li>Distributed Service Registry</li>
+ <li>Replicated Cache</li>
+ <li>Replicated Metrics</li>
+</ul>
+<p><strong>Apache Pekko Distributed Data</strong> is useful when you need to share data between nodes in a Pekko Cluster. The data is accessed with an actor providing a key-value store like API. The keys are unique identifiers with type information of the data values. The values are <em>Conflict Free Replicated Data Types</em> (CRDTs).</p>
+<p>All data entries are spread to all nodes, or nodes with a certain role, in the cluster via direct replication and gossip based dissemination. You have fine grained control of the consistency level for reads and writes.</p>
+<p>The nature CRDTs makes it possible to perform updates from any node without coordination. Concurrent updates from different nodes will automatically be resolved by the monotonic merge function, which all data types must provide. The state changes always converge. Several useful data types for counters, sets, maps and registers are provided and you can also implement your own custom data types.</p>
+<p>It is eventually consistent and geared toward providing high read and write availability (partition tolerance), with low latency. Note that in an eventually consistent system a read may return an out-of-date value.</p>
+<p>Note that there are some <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#limitations">Limitations</a> that you should be aware of. For example, Apache Pekko Distributed Data is not intended for <em>Big Data</em>.</p>
+<h2><a href="#low-latency-voting-service" name="low-latency-voting-service" class="anchor"><span class="anchor-link"></span></a>Low Latency Voting Service</h2>
+<p>Distributed Data is great for low latency services, since you can update or get data from the local replica without immediate communication with other nodes.</p>
+<p>Open <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-java/src/main/java/sample/distributeddata/VotingService.java">VotingService.java</a>.</p>
+<p><code>VotingService</code> is an actor for low latency counting of votes on several cluster nodes and aggregation of the grand total number of votes. The actor is started on each cluster node. First it expects an <code>OPEN</code> message on one or several nodes. After that the counting can begin. The open signal is immediately replicated to all nodes with a boolean <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#limitations">Flag</a>. Note <code>write [...]
+<pre><code>Update<Flag> update = new Update<>(openedKey, Flag.create(), writeAll, curr -> curr.switchOn());
+</code></pre>
+<p>The actor is subscribing to changes of the <code>OpenedKey</code> and other instances of this actor, also on other nodes, will be notified when the flag is changed.</p>
+<pre><code>replicator.tell(new Subscribe<>(openedKey, self()), ActorRef.noSender());
+
+.match(Changed.class, c -> c.key().equals(openedKey), c -> receiveOpenedChanged((Changed<Flag>) c))
+</code></pre>
+<p>The counters are kept in a <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#counters">PNCounterMap</a> and updated with:</p>
+<pre><code>Update<PNCounterMap> update = new Update<>(countersKey, PNCounterMap.create(), Replicator.writeLocal(),
+ curr -> curr.increment(node, vote.participant, 1));
+ replicator.tell(update, self());
+</code></pre>
+<p>Incrementing the counter is very fast, since it only involves communication with the local <code>Replicator</code> actor. Note <code>writeLocal</code>. Those updates are also spread to other nodes, but that is performed in the background.</p>
+<p>The total number of votes is retrieved with:</p>
+<pre><code>Optional<Object> ctx = Optional.of(sender());
+replicator.tell(new Replicator.Get<PNCounterMap>(countersKey, readAll, ctx), self());
+
+.match(GetSuccess.class, g -> g.key().equals(countersKey),
+ g -> receiveGetSuccess(open, (GetSuccess<PNCounterMap>) g))
+
+private void receiveGetSuccess(boolean open, GetSuccess<PNCounterMap> g) {
+ Map<String, BigInteger> result = g.dataValue().getEntries();
+ ActorRef replyTo = (ActorRef) g.getRequest().get();
+ replyTo.tell(new Votes(result, open), self());
+}
+</code></pre>
+<p>The multi-node test for the <code>VotingService</code> can be found in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-java/src/multi-jvm/scala/sample/distributeddata/VotingServiceSpec.scala">VotingServiceSpec.scala</a>.</p>
+<p>Read the <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#using-the-replicator">Using the Replicator</a> documentation for more details of how to use <code>Get</code>, <code>Update</code>, and <code>Subscribe</code>.</p>
+<h2><a href="#highly-available-shopping-cart" name="highly-available-shopping-cart" class="anchor"><span class="anchor-link"></span></a>Highly Available Shopping Cart</h2>
+<p>Distributed Data is great for highly available services, since it is possible to perform updates to the local node (or currently available nodes) during a network partition.</p>
+<p>Open <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-java/src/main/java/sample/distributeddata/ShoppingCart.java">ShoppingCart.java</a>.</p>
+<p><code>ShoppingCart</code> is an actor that holds the selected items to buy for a user. The actor instance for a specific user may be started where ever needed in the cluster, i.e. several instances may be started on different nodes and used at the same time.</p>
+<p>Each product in the cart is represented by a <code>LineItem</code> and all items in the cart is collected in a <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#maps">LWWMap</a>.</p>
+<p>The actor handles the commands <code>GET_CART</code>, <code>AddItem</code> and <code>RemoveItem</code>. To get the latest updates in case the same shopping cart is used from several nodes it is using consistency level of <code>readMajority</code> and <code>writeMajority</code>, but that is only done to reduce the risk of seeing old data. If such reads and writes cannot be completed due to a network partition it falls back to reading/writing from the local replica (see <code>GetFailure [...]
+<p>The multi-node test for the <code>ShoppingCart</code> can be found in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-java/src/multi-jvm/scala/sample/distributeddata/ShoppingCartSpec.scala">ShoppingCartSpec.scala</a>.</p>
+<p>Read the <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#consistency">Consistency</a> section in the documentation to understand the consistency considerations.</p>
+<h2><a href="#replicated-cache" name="replicated-cache" class="anchor"><span class="anchor-link"></span></a>Replicated Cache</h2>
+<p>This example illustrates a simple key-value cache.</p>
+<p>Open <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-java/src/main/java/sample/distributeddata/ReplicatedCache.java">ReplicatedCache.scala</a>.</p>
+<p><code>ReplicatedCache</code> is an actor that is started on each node in the cluster. It supports three commands: <code>PutInCache</code>, <code>GetFromCache</code> and <code>Evict</code>.</p>
+<p>It is splitting up the key space in 100 top level keys, each with a <code>LWWMap</code>. When a data entry is changed the full state of that entry is replicated to other nodes, i.e. when you update a map the whole map is replicated. Therefore, instead of using one ORMap with 1000 elements it is more efficient to split that up in 100 top level ORMap entries with 10 elements each. Top level entries are replicated individually, which has the trade-off that different entries may not be re [...]
+<p>The multi-node test for the <code>ReplicatedCache</code> can be found in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-java/src/multi-jvm/scala/sample/distributeddata/ReplicatedCacheSpec.scala">ReplicatedCacheSpec.scala</a>.</p>
+<h2><a href="#replicated-metrics" name="replicated-metrics" class="anchor"><span class="anchor-link"></span></a>Replicated Metrics</h2>
+<p>This example illustrates to spread metrics data to all nodes in an Apache Pekko cluster.</p>
+<p>Open <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-java/src/main/java/sample/distributeddata/ReplicatedMetrics.java">ReplicatedMetrics.java</a>.</p>
+<p><code>ReplicatedMetrics</code> is an actor that is started on each node in the cluster. Periodically it collects some metrics, in this case used and max heap size. Each metrics type is stored in a <code>LWWMap</code> where the key in the map is the address of the node. The values are disseminated to other nodes with the gossip protocol.</p>
+<p>The multi-node test for the <code>ReplicatedCache</code> can be found in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-java/src/multi-jvm/scala/sample/distributeddata/ReplicatedMetricsSpec.scala">ReplicatedMetricsSpec.scala</a>.</p>
+<p>Note that there are some <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#limitations">Limitations</a> that you should be aware of. For example, Apache Pekko Distributed Data is not intended for <em>Big Data</em>.</p>
+</div>
+<div class="large-3 show-for-large column" data-sticky-container>
+<nav class="sidebar sticky" data-sticky data-anchor="docs" data-sticky-on="large">
+<div class="page-nav">
+<div class="nav-title">On this page:</div>
+<div class="nav-toc">
+<ul>
+ <li><a href="index.html#apache-pekko-distributed-data-with-java" class="header">Apache Pekko Distributed Data with Java</a>
+ <ul>
+ <li><a href="index.html#low-latency-voting-service" class="header">Low Latency Voting Service</a></li>
+ <li><a href="index.html#highly-available-shopping-cart" class="header">Highly Available Shopping Cart</a></li>
+ <li><a href="index.html#replicated-cache" class="header">Replicated Cache</a></li>
+ <li><a href="index.html#replicated-metrics" class="header">Replicated Metrics</a></li>
+ </ul></li>
+</ul>
+</div>
+</div>
+</nav>
+</div>
+</div>
+
+</section>
+</div>
+
+</div>
+
+<footer class="site-footer">
+
+<section class="site-footer-nav">
+<div class="expanded row">
+<div class="small-12 large-offset-2 large-10 column">
+<div class="row site-footer-content">
+
+<div class="small-12 medium-4 large-3 text-center column">
+<div class="nav-links">
+<ul>
+<!-- <li><a href="https://www.example.com/products/">Products</a> -->
+</ul>
+</div>
+</div>
+
+</div>
+</div>
+</div>
+</section>
+
+<section class="site-footer-base">
+<div class="expanded row">
+<div class="small-12 large-offset-2 large-10 column">
+<div class="row site-footer-content">
+
+<div class="small-12 text-center large-9 column">
+
+<!--
+<div class="copyright">
+<span class="text">© 2023</span>
+<a href="https://www.example.com" class="logo">logo</a>
+</div>
+-->
+</div>
+
+</div>
+</div>
+</div>
+</section>
+</footer>
+
+</div>
+</div>
+</div>
+</body>
+
+<script type="text/javascript" src="lib/foundation/dist/foundation.min.js"></script>
+<script type="text/javascript">jQuery(document).foundation();</script>
+<script type="text/javascript" src="js/magellan.js"></script>
+
+<style type="text/css">@import "lib/prettify/prettify.css";</style>
+<script type="text/javascript" src="lib/prettify/prettify.js"></script>
+<script type="text/javascript" src="lib/prettify/lang-scala.js"></script>
+<script type="text/javascript">jQuery(function(){window.prettyPrint && prettyPrint()});</script>
+<script type="text/javascript">jQuery(function(jq){initOldVersionWarnings(jq, '0.1.0-SNAPSHOT', '')});</script>
+
+
+</html>
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/groups.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/groups.js
new file mode 100644
index 00000000..e9ec53c3
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/groups.js
@@ -0,0 +1,167 @@
+groupChangeListeners = [];
+
+window.groupChanged = function(callback) {
+ groupChangeListeners.push(callback);
+}
+
+$(function() {
+
+ // Groups (like 'java' and 'scala') represent groups of 'switchable' content, either in tabs or in regular text.
+ // The catalog of groups can be defined in the sbt parameters to initialize the group.
+
+ var groupCookie = "paradoxGroups";
+ var cookieTg = getCookie(groupCookie);
+ var currentGroups = {};
+
+ var catalog = {}
+ var supergroupByGroup = {};
+
+ if(cookieTg != "")
+ currentGroups = JSON.parse(cookieTg);
+
+ // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie
+ function setCookie(cookieName, cookieValue, daysToExpire) {
+ if (!daysToExpire) daysToExpire = 365;
+ const now = new Date();
+ now.setDate(now.getDate() + daysToExpire);
+ // The lax value will send the cookie for all same-site
+ // requests and top-level navigation GET requests. This
+ // is sufficient for user tracking, but it will prevent
+ // many CSRF attacks. This is the default value in modern browsers.
+ document.cookie = `${cookieName}=${encodeURIComponent(cookieValue)};expires=${now.toUTCString()};path=/;samesite=lax`;
+ }
+
+ // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#Example_2_Get_a_sample_cookie_named_test2
+ function getCookie(cookieName) {
+ const cookieAttr = decodeURIComponent(document.cookie)
+ .split(";")
+ .find(row => row.trimStart().startsWith(cookieName))
+ return cookieAttr ? cookieAttr.split("=")[1] : "";
+ }
+
+ $("dl").has("dd > pre").each(function() {
+ var dl = $(this);
+ dl.addClass("tabbed");
+ var dts = dl.find("dt");
+ dts.each(function(i) {
+ var dt = $(this);
+ dt.html("<a href=\"#tab" + i + "\">" + dt.text() + "</a>");
+ });
+ var dds = dl.find("dd");
+ dds.each(function(i) {
+ var dd = $(this);
+ dd.hide();
+ if (dd.find("blockquote").length) {
+ dd.addClass("has-note");
+ }
+ });
+
+ // Default to the first tab, for grouped tabs switch again later
+ switchToTab(dts.first());
+
+ dts.first().addClass("first");
+ dts.last().addClass("last");
+ });
+
+ // Determine all supergroups, populate 'catalog' and 'supergroupByGroup' accordingly.
+ $(".supergroup").each(function() {
+ var supergroup = $(this).attr('name').toLowerCase();
+ var groups = $(this).find(".group");
+
+ catalog[supergroup] = [];
+
+ groups.each(function() {
+ var group = "group-" + $(this).text().toLowerCase();
+ catalog[supergroup].push(group);
+ supergroupByGroup[group] = supergroup;
+ });
+
+ $(this).on("change", function() {
+ switchToGroup(supergroup, this.value);
+ });
+ });
+
+ // Switch to the right initial groups
+ for (var supergroup in catalog) {
+ var current = queryParamGroup(supergroup) || currentGroups[supergroup] || catalog[supergroup][0];
+
+ switchToGroup(supergroup, current);
+ }
+
+ $("dl.tabbed dt a").click(function(e){
+ e.preventDefault();
+ var currentDt = $(this).parent("dt");
+ var currentDl = currentDt.parent("dl");
+
+ var currentGroup = groupOf(currentDt);
+
+ var supergroup = supergroupByGroup[currentGroup]
+ if (supergroup) {
+ switchToGroup(supergroup, currentGroup);
+ } else {
+ switchToTab(currentDt);
+ }
+ });
+
+ function queryParamGroup(supergroup) {
+ var value = new URLSearchParams(window.location.search).get(supergroup)
+ if (value) {
+ return "group-" + value.toLowerCase();
+ } else {
+ return "";
+ }
+ }
+
+ function switchToGroup(supergroup, group) {
+ currentGroups[supergroup] = group;
+ setCookie(groupCookie, JSON.stringify(currentGroups));
+
+ // Dropdown switcher:
+ $("select")
+ .has("option[value=" + group +"]")
+ .val(group);
+
+ // Inline snippets:
+ catalog[supergroup].forEach(peer => {
+ if (peer === group) {
+ $("." + group).show();
+ } else {
+ $("." + peer).hide();
+ }
+ })
+
+ // Tabbed snippets:
+ $("dl.tabbed").each(function() {
+ var dl = $(this);
+ dl.find("dt").each(function() {
+ var dt = $(this);
+ if(groupOf(dt) == group) {
+ switchToTab(dt);
+ }
+ });
+ });
+
+ groupChangeListeners.forEach(listener => listener(group, supergroup, catalog));
+ }
+
+ function switchToTab(dt) {
+ var dl = dt.parent("dl");
+ dl.find(".current").removeClass("current").next("dd").removeClass("current").hide();
+ dt.addClass("current");
+ var currentContent = dt.next("dd").addClass("current").show();
+ dl.css("height", dt.height() + currentContent.height());
+ }
+
+ function groupOf(elem) {
+ const classAttribute = elem.next("dd").find("pre").attr("class");
+ if (classAttribute) {
+ const currentClasses = classAttribute.split(' ');
+ const regex = new RegExp("^group-.*");
+ const matchingClass = currentClasses.find(cc => regex.test(cc));
+ if (matchingClass) return matchingClass;
+ }
+
+ // No class found? Then use the tab title
+ return "group-" + elem.find('a').text().toLowerCase();
+ }
+});
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/magellan.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/magellan.js
new file mode 100644
index 00000000..52d231ec
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/magellan.js
@@ -0,0 +1,25 @@
+$(function() {
+
+ // add magellan targets to anchor headers, up to depth 3
+ $("a.anchor").each(function() {
+ var anchor = $(this);
+ var name = anchor.attr("name");
+ var header = anchor.parent();
+ if (header.is("h1") || header.is("h2") || header.is("h3")) {
+ header.attr("id", name).attr("data-magellan-target", name);
+ }
+ });
+
+ // enable magellan plugin on the page navigation
+ $(".page-nav").each(function() {
+ var nav = $(this);
+
+ // strip page navigation links down to just the hash fragment
+ nav.find("a").attr('href', function(_, current){
+ return this.hash ? this.hash : current;
+ });
+
+ new Foundation.Magellan(nav);
+ });
+
+});
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/page.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/page.js
new file mode 100644
index 00000000..cb2ef674
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/page.js
@@ -0,0 +1,2 @@
+$(function() {
+});
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/snippets.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/snippets.js
new file mode 100644
index 00000000..a0d6c869
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/snippets.js
@@ -0,0 +1,6 @@
+$(function() {
+ $(".snippet-button.copy-snippet").click(function() {
+ var code = $(this).parent().find("code").text()
+ navigator.clipboard.writeText(code)
+ })
+})
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/warnOldVersion.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/warnOldVersion.js
new file mode 100644
index 00000000..c90bcffb
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/js/warnOldVersion.js
@@ -0,0 +1,23 @@
+function initOldVersionWarnings($, thisVersion, projectUrl) {
+ if (projectUrl && projectUrl !== "") {
+ var schemeLessUrl = projectUrl;
+ if (projectUrl.startsWith("http://")) projectUrl = schemeLessUrl.substring(5);
+ else if (projectUrl.startsWith("https://")) projectUrl = schemeLessUrl.substring(6);
+ const url = schemeLessUrl + (schemeLessUrl.endsWith("\/") ? "" : "/") + "paradox.json";
+ $.get(url, function (versionData) {
+ const currentVersion = versionData.version;
+ if (thisVersion !== currentVersion) {
+ showVersionWarning(thisVersion, currentVersion, projectUrl);
+ }
+ });
+ }
+}
+
+function showVersionWarning(thisVersion, currentVersion, projectUrl) {
+ $('#version-warning').prepend(
+ '<div class="callout warning" style="margin-top: 16px">' +
+ '<p><span style="font-weight: bold">This documentation regards version ' + thisVersion + ', ' +
+ 'however the current version is <a href="' + projectUrl + '">' + currentVersion + '</a>.</span></p>' +
+ '</div>'
+ );
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/foundation/dist/foundation.min.css b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/foundation/dist/foundation.min.css
new file mode 100644
index 00000000..32ce416b
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/foundation/dist/foundation.min.css
@@ -0,0 +1,2 @@
+@charset "UTF-8";
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[ti [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/foundation/dist/foundation.min.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/foundation/dist/foundation.min.js
new file mode 100644
index 00000000..858078db
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/foundation/dist/foundation.min.js
@@ -0,0 +1,4 @@
+function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new [...]
+t(this).is(":first-child")?n=o.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(t(this).is(":last-child")&&(s=o.parents("li").first().next("li").find("a").first()))}),Foundation.Keyboard.handleKey(i,"AccordionMenu",{open:function(){r.is(":hidden")&&(e.down(r),r.find("li").first().find("a").first().focus())},close:function(){r.length&&!r.is(":hidden")?e.up(r):o.parent [...]
+}},{key:"_events",value:function(){this.$element.off(".zf.trigger .zf.offcanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offcanvas":this._handleKeyboard.bind(this)}),this.options.closeOnClick&&this.$exiter.length&&this.$exiter.on({"click.zf.offcanvas":this.close.bind(this)})}},{key:"_setMQChecker",value:function(){var e=this;t(window).on("changed.zf.mediaquery",function(){Foundation.MediaQ [...]
+"top"===this.options.stickTo?(o-=n,a-=t+n):"bottom"===this.options.stickTo&&(o-=r-(t+s),a-=r-s),this.topPoint=o,this.bottomPoint=a,i&&"function"==typeof i&&i()}},{key:"destroy",value:function(){this._removeSticky(!0),this.$element.removeClass(this.options.stickyClass+" is-anchored is-at-top").css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),t(window).off(this.scrollListener),this.wasWrapped [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/jquery/jquery.min.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/jquery/jquery.min.js
new file mode 100644
index 00000000..c4643af6
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/jquery/jquery.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r= [...]
+},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a); [...]
+},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$ [...]
+//# sourceMappingURL=jquery.min.map
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/prettify/lang-scala.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/prettify/lang-scala.js
new file mode 100644
index 00000000..3f97dba5
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/prettify/lang-scala.js
@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object| [...]
+["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]);
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/prettify/prettify.css b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/prettify/prettify.css
new file mode 100644
index 00000000..d44b3a22
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/prettify/prettify.css
@@ -0,0 +1 @@
+.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/prettify/prettify.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/prettify/prettify.js
new file mode 100644
index 00000000..7b990496
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/lib/prettify/prettify.js
@@ -0,0 +1,30 @@
+!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/ [...]
+b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a<f;++a){var h=b[a];if(/\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),l;a+2<f&&"-"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b [...]
+h[1]>h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var l=a[f];l==="("?++h:"\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l==="("?(++h,d[h]||(a[f]="(?:")):"\\"===l.charAt(0)&&(l=+l.substring(1) [...]
+(a[f]="\\"+d[l]);for(f=0;f<c;++f)"^"===a[f]&&"^"!==a[f+1]&&(a[f]="");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var i=a[k];if(i.ignoreCase)j=!0;else if(/[a-z]/i.test(i.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){m=!0;j=!1;break}}for(var r={b:8,t:9, [...]
+f:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw Error(""+i);n.push("(?:"+s(i)+")")}return RegExp(n.join("|"),j?"gi":"g")}function T(a,d){function g(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)s[j]="\n",m[j<<1]=x++,m[j++<<1|1]=a}}else if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r ]+/g," "),s[j]=c,m[j<<1]=x,x+=c.length,m [...]
+a)}var b=/(?:^|\s)nocode(?:\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join("").replace(/\n$/,""),d:m}}function H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function U(a){for(var d=void 0,g=a.firstChild;g;g=g.nextSibling)var b=g.nodeType,d=b===1?d?a:g:b===3?V.test(g.nodeValue)?a:d:d;return d===a?void 0:d}function C(a,d){function g(a){for(var j=a.e,k=[j,"pln"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var z=i[n],w=r[z],t=void 0,f;if(typeof w==="string")f=!1;else{var h=b[z.c [...]
+if(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w="pln")}if((f=w.length>=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.le [...]
+g[c],n=r[3];if(n)for(var e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)| [...]
+q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d. [...]
+/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+ [...]
+s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["p [...]
+q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b [...]
+c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute("value",d);var [...]
+r.className="linenums";for(var d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className="L"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode("\u00a0")),r.appendChild(k);a.appendChild(r)}function p(a,d){for(var g=d.length;--g>=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return F[a]}function K(a){var d=a.h;try{var g=T(a.c [...]
+a.a=b;a.d=g.d;a.e=0;I(d,b)(a);var s=/\bMSIE\s(\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var f=a.c,h;if(f)h=f.style.display,f.style.display="none";try{for(;b<k;){var l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType! [...]
+t))){s&&(G=G.replace(d,"\r"));A.nodeValue=G;var L=A.ownerDocument,o=L.createElement("span");o.className=c[r+1];var v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inl [...]
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,pack [...]
+O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,wi [...]
+Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map [...]
+V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%? [...]
+/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["p [...]
+["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimString [...]
+["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl", [...]
+hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc", [...]
+p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;g&&J(b,g,!0);K({h:d,j [...]
+return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var d=p[i],j=h,k=d;k=k.previousSibling;){var m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\??prettify\b/.test(o):m!==3||/\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f. [...]
+o.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=j.lang;if(!m){var m=k.match(n),y;if(!m&&(y=U(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else var o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue("white-space"):0)&&"pre"===o.substring(0,3);u=j.linenums;if(!(u=u==="true"||+u))u=(u=k.match(/\blinenums\b(?::(\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J [...]
+{h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):"function"===typeof a&&a()}for(var b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],p=[],m=0;m<b.length;++m)for(var j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var b=q,c=Date;c.now||(c={now:function(){return+new Date}});var i=0,r,n=/\blang(?:uage)?-([\w.]+)(?!\S)/,e=/\bprettyprint\b/,v=/\bprettyprinted\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code [...]
+h={};g()}};typeof define==="function"&&define.amd&&define("google-code-prettify",[],function(){return Y})})();}()
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/paradox.json b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/paradox.json
new file mode 100644
index 00000000..f4a7bf3e
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/paradox.json
@@ -0,0 +1,4 @@
+{
+ "name" : "Apache Pekko Distributed Data with Java",
+ "version" : "0.1.0-SNAPSHOT"
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/print-toc.xslt b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/print-toc.xslt
new file mode 100644
index 00000000..c240f5ab
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-java/print-toc.xslt
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="2.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:outline="http://wkhtmltopdf.org/outline"
+ xmlns="http://www.w3.org/1999/xhtml">
+ <xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
+ doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
+ indent="yes" />
+ <xsl:template match="outline:outline">
+ <html>
+ <head>
+ <title>Table of Contents</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/lib/foundation/dist/foundation.min.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/page.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/single.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/print.css"/>
+ </head>
+ <body>
+ <h1>Table of Contents</h1>
+ <nav class="print">
+ <xsl:apply-templates select="outline:item/outline:item">
+ <xsl:with-param name="depth" select="1"/>
+ </xsl:apply-templates>
+ </nav>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="outline:item">
+ <xsl:param name="depth"/>
+ <xsl:comment>Only add the li tags for elements beyond the first depth, so that the roots don't get numbers from our css</xsl:comment>
+ <xsl:choose>
+ <xsl:when test="$depth > 1">
+ <li>
+ <xsl:call-template name="item-inner">
+ <xsl:with-param name="depth" select="$depth"/>
+ </xsl:call-template>
+ </li>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="item-inner">
+ <xsl:with-param name="depth" select="$depth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="item-inner">
+ <xsl:param name="depth"/>
+ <xsl:if test="@title!=''">
+ <div class="toc-page-line">
+ <a>
+ <xsl:if test="@link">
+ <xsl:attribute name="href"><xsl:value-of select="@link"/></xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@backLink">
+ <xsl:attribute name="name"><xsl:value-of select="@backLink"/></xsl:attribute>
+ </xsl:if>
+ <xsl:value-of select="@title" />
+ </a>
+ <span class="toc-page-no"> <xsl:value-of select="@page" /> </span>
+ </div>
+ </xsl:if>
+ <xsl:if test="$depth < 5">
+ <ul>
+ <xsl:comment>added to prevent self-closing tags in QtXmlPatterns</xsl:comment>
+ <xsl:apply-templates select="outline:item">
+ <xsl:with-param name="depth" select="$depth + 1"/>
+ </xsl:apply-templates>
+ </ul>
+ </xsl:if>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/fonts/icons.eot b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/fonts/icons.eot
new file mode 100644
index 00000000..a5203e87
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/fonts/icons.eot differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/fonts/icons.svg b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/fonts/icons.svg
new file mode 100644
index 00000000..58c74882
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/fonts/icons.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by Fontastic.me</metadata>
+<defs>
+<font id="icons" horiz-adv-x="512">
+<font-face font-family="icons" units-per-em="512" ascent="480" descent="-32"/>
+<missing-glyph horiz-adv-x="512" />
+
+<glyph unicode="§" d="M202 136c5 5 10 7 17 7 7 0 13-2 19-7 10-11 10-23 0-36 0 0-22-20-22-20-19-19-42-29-68-29-26 0-49 10-68 29-19 19-29 42-29 67 0 27 10 50 29 69 0 0 76 76 76 76 24 23 48 36 73 39 26 3 47-4 66-22 5-5 8-11 8-18 0-7-3-13-8-19-12-11-24-11-36 0-17 17-40 11-68-17 0 0-75-75-75-75-9-9-14-20-14-33 0-13 5-23 14-31 9-9 19-14 32-14 13 0 23 5 32 14 0 0 22 20 22 20m230 294c19-19 29-42 29-68 0-26-10-49-29-68 0 0-81-81-81-81-25-25-51-37-77-37-21 0-40 9-57 26-5 5-7 10-7 17 0 7 2 13 [...]
+<glyph unicode="⌂" d="M480 249c6-6 8-10 6-14-2-4-6-6-14-6 0 0-43 0-43 0 0 0 0-158 0-158 0-5 0-9 0-11-1-2-2-5-4-7-3-2-7-3-12-3 0 0-105 0-105 0 0 0 0 159 0 159 0 0-104 0-104 0 0 0 0-159 0-159 0 0-99 0-99 0-10 0-16 2-18 5-3 4-4 9-4 16 0 0 0 158 0 158 0 0-43 0-43 0-7 0-12 2-14 6-1 4 0 8 6 14 0 0 205 206 205 206 5 5 12 8 19 8 8 0 14-3 20-8 0 0 204-206 204-206"/>
+</font></defs></svg>
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/fonts/icons.ttf b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/fonts/icons.ttf
new file mode 100644
index 00000000..6da4b13e
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/fonts/icons.ttf differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/fonts/icons.woff b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/fonts/icons.woff
new file mode 100644
index 00000000..2c7e917b
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/fonts/icons.woff differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/page.css b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/page.css
new file mode 100644
index 00000000..7be66ced
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/page.css
@@ -0,0 +1,965 @@
+@charset "UTF-8";
+
+/* fonts */
+
+@font-face {
+ font-family: "icons";
+ src:url("fonts/icons.eot");
+ src:url("fonts/icons.eot?#iefix") format("embedded-opentype"),
+ url("fonts/icons.woff") format("woff"),
+ url("fonts/icons.ttf") format("truetype"),
+ url("fonts/icons.svg#icons") format("svg");
+ font-weight: normal;
+ font-style: normal;
+}
+
+/* body */
+
+body {
+ background: #fff;
+ padding: 0;
+ margin: 0;
+ font-weight: 400;
+ font-style: normal;
+ line-height: 1.4em;
+ position: relative;
+ cursor: default;
+ font: 1em "Roboto", "Helvetica Neue", "Helvetica", Arial, sans-serif;
+ color: #333333;
+ font-smoothing: antialiased;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-size-adjust: none;
+ text-rendering: optimizeLegibility;
+}
+
+/* headers */
+
+h1 {
+ font-family: inherit;
+ font-size: 2.6em;
+ font-weight: 300;
+ color: #333333;
+ margin-bottom: 0.4em;
+ margin-top: 1.1em;
+}
+
+h1:first-child {
+ margin-top: 0;
+}
+
+h2 {
+ font-family: inherit;
+ font-size: 1.8em;
+ font-weight: 400;
+ color: #333333;
+ margin-bottom: 0.2em;
+ margin-top: 1.3em;
+}
+
+h2:first-child {
+ margin-top: 0;
+}
+
+h3 {
+ font-family: inherit;
+ font-size: 1.125em;
+ font-weight: 700;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h3:first-child {
+ margin-top: 0;
+}
+
+h4 {
+ font-family: inherit;
+ font-size: 1em;
+ font-weight: 700;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h4:first-child {
+ margin-top: 0;
+}
+
+h5 {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h5:first-child {
+ margin-top: 0;
+}
+
+h6 {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h6:first-child {
+ margin-top: 0;
+}
+
+/* text */
+
+p {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ line-height: 1.45em;
+ margin: 1em 0em;
+}
+
+/* links */
+
+a {
+ font-family: inherit;
+ color: #4078c0;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+a:link {
+ color: #4078c0;
+}
+
+a:visited {
+ color: #4078c0;
+}
+
+a:hover {
+ color: #4078c0;
+ text-decoration: underline;
+}
+
+a:active {
+ color: #4078c0;
+}
+
+/* header anchors */
+
+a.anchor .anchor-link:before {
+ content: "§";
+}
+
+.site-content .page-content .prettyprint .snippet-button {
+ float: right;
+ text-decoration: none;
+ font-size: 0.75rem;
+ font-weight: bold;
+ font-family: "Roboto", "Helvetica Neue", "Helvetica", Arial, sans-serif;
+ speak: none;
+ color: #4078c0;
+ border: 2px solid #e5e6e4;
+ padding: 4px 4px;
+ margin-left: 8px;
+ line-height: 1.2;
+ vertical-align: middle;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.site-content .page-content .prettyprint .snippet-button:hover {
+ background-color: #e5e6e4;
+ border: 2px solid #4078c0;
+}
+
+a.anchor .anchor-link {
+ font-size: 18px;
+ font-family: "icons" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1.2;
+ vertical-align: middle;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor {
+ visibility: hidden;
+ position: absolute;
+ display: block;
+ width: 30px;
+ margin-left: -30px;
+ padding-right: 3px;
+ text-align: right;
+ text-decoration: none;
+}
+
+h1:hover > a.anchor, h2:hover > a.anchor, h3:hover > a.anchor, h4:hover > a.anchor, h5:hover > a.anchor, h6:hover > a.anchor {
+ visibility: visible;
+ color: inherit;
+ text-decoration: none;
+}
+
+
+/* table */
+
+table th {
+ background: #ffffff;
+ border: solid 1px #dddddd;
+}
+
+table td {
+ background: #ffffff;
+ border: solid 1px #dddddd;
+}
+
+/* code */
+
+pre {
+ padding: 1rem !important;
+ border: 1px solid #dddddd !important;
+ margin: 0 0 1rem 0 !important;
+ white-space: pre;
+ overflow: auto;
+ line-height: 0.9em !important;
+}
+
+code {
+ line-height: 1.45em !important;
+ font-family: Consolas, "Liberation Mono", Courier, monospace;
+ font-size: 0.85em !important;
+ font-weight: normal !important;
+ padding: 0 !important;
+}
+
+pre > code {
+ background: none;
+ border: none;
+}
+
+p code {
+ border: none;
+ color: #0c323b;
+ padding: 0 0.2em !important;
+}
+
+li code {
+ border: none;
+ color: #0c323b;
+ padding: 0 0.2em !important;
+}
+
+/* Github-like */
+
+pre.prettyprint span.str {
+ color: #183691;
+}
+pre.prettyprint span.kwd {
+ color: #000000;
+ font-weight: bold;
+}
+pre.prettyprint span.com {
+ color: #999988;
+ font-style: italic;
+}
+pre.prettyprint span.typ {
+ color: #445588;
+ font-weight: bold;
+}
+pre.prettyprint span.lit {
+ color: #009999
+}
+pre.prettyprint span.pun {
+ color: #000000;
+ font-weight: bold;
+}
+pre.prettyprint span.pln {
+ color: #000000
+}
+pre.prettyprint span.tag {
+ color: navy
+}
+pre.prettyprint span.atn {
+ color: teal
+}
+pre.prettyprint span.atv {
+ color: #dd1144
+}
+pre.prettyprint span.dec {
+ color: #990000
+}
+pre.prettyprint span.var {
+ color: #000000
+}
+pre.prettyprint span.fun {
+ color: #990000
+}
+
+/* tabbed code snippets */
+
+dl.tabbed {
+ position: relative;
+}
+
+dl.tabbed dt {
+ float: left;
+ display: inline-block;
+ position: relative;
+ left: 1px;
+ margin-left: -1px;
+}
+
+dl.tabbed dt.current {
+ z-index: 2;
+}
+
+dl.tabbed dt a {
+ display: block;
+ border: 1px solid #f7f7f7;
+ padding: 0 20px;
+ height: 30px;
+ line-height: 2;
+ color: #4078c0;
+ text-decoration: none;
+}
+
+dl.tabbed dt a:hover {
+ background: #f7f7f7;
+}
+
+dl.tabbed dt.first a {
+ border-top-left-radius: 5px;
+}
+
+dl.tabbed dt.last a {
+ border-top-right-radius: 5px;
+}
+
+dl.tabbed dt.current a {
+ background-color: #f7f7f7;
+ border-color: #dddddd;
+ border-bottom: 0;
+ padding-bottom: 1px;
+}
+
+dl.tabbed dt.current a {
+ color: #0c323b;
+ outline: none;
+}
+
+dl.tabbed dd {
+ position: absolute;
+ width: 100%;
+ left: 0;
+ top: 29px;
+}
+
+dl.tabbed dd.current {
+ z-index: 1;
+}
+
+dl.tabbed dd pre {
+ border-top-left-radius: 0 !important;
+}
+
+dl.tabbed dd.has-note pre {
+ border-bottom: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+dl.tabbed dd.has-note blockquote {
+ color: #0c323b;
+ border: solid #dddddd;
+ border-width: 1px 1px 1px 10px;
+ border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px;
+ margin-top: 0;
+ font-style: italic;
+}
+
+/* blockquotes */
+
+blockquote {
+ border-left: 4px solid rgb(221, 221, 221);
+ margin: 1.5em 0;
+ padding: 1em 20px;
+ color: rgb(119, 119, 119);
+ line-height: 1.4em;
+}
+
+blockquote p {
+ margin: 0;
+ line-height: 1.4em;
+}
+
+blockquote p ~ p {
+ margin-top: 1em;
+}
+
+blockquote p code {
+ background: #fff;
+ padding-right: 0.4em !important;
+}
+
+/* callout */
+
+.callout {
+ border: none;
+ border-left: 10px solid #4078c0;
+ background-color: rgba(64, 120, 192, 0.1);
+}
+
+.callout.warning {
+ border-color: #DB504A;
+ background-color: #fff3d9;
+}
+
+.callout .callout-title {
+ font-weight: bold;
+ margin-bottom: 0.33em;
+}
+
+.callout div ~ p {
+ margin-top: 0;
+}
+
+.callout p ~ p {
+ margin-top: 1em;
+ margin-bottom: 0;
+}
+
+.callout p code {
+ background: #fff;
+ padding-right: 0.4em !important;
+}
+
+/* footnotes */
+
+small {
+ display: block;
+}
+
+/* logo links */
+
+.logo .svg-icon-logo {
+ height: 24px;
+ width: 112px;
+}
+
+.logo:hover {
+ text-decoration: none;
+}
+
+.svg-icon-logo .svg-icon-logo-text {
+ fill: #ffffff;
+}
+
+.logo:hover .svg-icon-logo .svg-icon-logo-text {
+ fill: #4078C0;
+}
+
+/* site header */
+
+.site-header {
+ background: #fcfcfc;
+ border-bottom: solid 1px #cccccc;
+}
+
+.site-header .title {
+ display: inline-block;
+ float: left;
+ height: 70px;
+ line-height: 70px;
+ font-weight: 400;
+ font-size: 1.4em;
+}
+
+.site-header .title a:link, .site-header .title a:visited {
+ color: #515151;
+}
+
+.site-header .title a:hover {
+ color: #515151;
+ text-decoration: none;
+}
+
+.site-header .off-canvas-toggle {
+ float: left;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu {
+ height: 40px;
+ width: 40px;
+ margin-top: 1rem;
+ margin-right: 1rem;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu .svg-icon-menu-path {
+ fill: #000;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu:hover .svg-icon-menu-path {
+ fill: #4183C4;
+}
+
+.site-header .logo {
+ float: right;
+ margin-top: 1rem;
+ text-align: right;
+ color: #000;
+}
+
+/* page header */
+
+.page-header {
+ background: #ffffff;
+ margin-top: 1rem;
+}
+
+.page-header .nav-breadcrumbs {
+ border-bottom: 1px solid #c2d2dc;
+}
+
+.page-header .nav-breadcrumbs ul {
+ display: block;
+ overflow: hidden;
+ margin: 0;
+ padding: 15px;
+ list-style: none;
+ font-size: 0.9em;
+}
+
+.page-header .nav-breadcrumbs li {
+ float: left;
+ margin: 0;
+}
+
+.page-header .nav-breadcrumbs li:before {
+ content: "/";
+ margin: 0 5px;
+ color: #c2d2dc;
+}
+
+.page-header .nav-breadcrumbs li:first-child:before {
+ content: "";
+ margin: 0;
+}
+
+.page-header .nav-breadcrumbs li a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+/* content */
+
+.site-content .row {
+ max-width: 90rem;
+}
+
+.page-content {
+ background: #ffffff;
+ min-height: 600px;
+ padding: 2.5rem 0;
+}
+
+/* sidebar */
+
+.sidebar {
+ background: #ffffff;
+ width: 100%;
+ padding: 0;
+}
+
+.sidebar .nav-toc {
+ padding-top: 1rem;
+}
+
+/* navigation */
+
+.nav-home {
+ background: #f7f7f7;
+ line-height: 2rem;
+}
+
+.nav-home a {
+ display: block;
+ color: #4078c0;
+ font-weight: bold;
+ font-size: 1rem;
+ padding-left: 1rem;
+}
+
+.nav-home a.active {
+ background: #e7e7e7;
+}
+
+.nav-home a:hover {
+ background: #e7e7e7;
+ text-decoration: none;
+}
+
+.nav-home a .home-icon {
+ font-size: 18px;
+ font-family: "icons" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1.2;
+ vertical-align: middle;
+ padding-right: 5px;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.nav-home .version-number {
+ padding-left: 1.4rem;
+ font-size: 0.9rem;
+}
+
+.nav-toc {
+}
+
+.nav-toc ul {
+ margin: 0;
+ padding: 0;
+ line-height: 2rem;
+}
+
+.nav-toc ul > li {
+ list-style-type: none;
+ padding-left: 0;
+}
+
+.nav-toc ul > li a {
+ display: block;
+ color: #4078c0;
+ font-weight: bold;
+ font-size: 0.9rem;
+ padding-left: 1rem;
+}
+
+.nav-toc ul > li a.active {
+ background: #e7e7e7;
+}
+
+.nav-toc ul > li a:hover {
+ background: #e7e7e7;
+ text-decoration: none;
+}
+
+.nav-toc ul > li > ul li {
+ margin-top: 0;
+ border-top: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+.nav-toc ul > li > ul li a {
+ font-size: 0.9rem;
+ font-weight: normal;
+ text-transform: none;
+ margin-top: 0;
+ padding-left: 1.2rem;
+}
+
+.nav-toc ul > li > ul > li > ul li a {
+ font-size: 0.8rem;
+ padding-left: 2rem;
+}
+
+
+/* site navigation */
+
+.site-nav {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border: solid 1px #cccccc;
+}
+
+/* off-canvas navigation colours */
+
+.off-canvas {
+}
+
+.off-canvas-nav {
+ padding: 0;
+}
+
+.off-canvas-nav .nav-home {
+ background: #ffffff;
+}
+
+.off-canvas-nav .nav-toc {
+ background: #ffffff;
+}
+
+.off-canvas-nav .nav-toc ul > li {
+}
+
+.off-canvas-nav .nav-toc ul > li a {
+}
+
+.off-canvas-nav .nav-toc ul > li a.active {
+}
+
+.off-canvas-nav .nav-toc ul > li a:hover {
+}
+
+.off-canvas-nav .nav-toc ul > li a.active:hover {
+}
+
+.off-canvas-nav .nav-toc ul > li > ul li {
+ border-top: 0;
+}
+
+/* page navigation */
+
+.page-nav {
+ background: #ffffff;
+}
+
+.page-nav .nav-title {
+ display: block;
+ color: #9eb1b7;
+ font-weight: bold;
+ font-size: 0.8rem;
+ padding-left: 1rem;
+}
+
+.page-nav .nav-toc {
+ background: #ffffff;
+}
+
+.page-nav .nav-toc ul > li {
+ border-top: 0;
+}
+
+.page-nav .nav-toc ul > li a.active {
+ background: #4078c0;
+ color: #ffffff;
+}
+
+.page-nav .nav-toc ul > li a.active:hover {
+ background: #4078c0;
+}
+
+/* navigation next */
+
+.nav-next {
+ background: #F7F7F7;
+ border-left: 10px solid #4078c0;
+ margin-top: 40px;
+ padding: 1em 20px;
+}
+
+.nav-next p {
+ display: inline;
+ color: #0c323b;
+ font-style: italic;
+}
+
+.nav-next a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+/* table of contents -- ordered */
+
+.toc a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+.toc ol li {
+ color: #778a99;
+}
+
+.toc > ol > li > ol {
+ list-style-type: lower-alpha;
+}
+
+.toc > ol > li > ol > li > ol {
+ list-style-type: lower-roman;
+}
+
+.toc.main > ol > li {
+ margin-top: 0.5em;
+ font-size: 1.2em;
+}
+
+.toc.main > ol > li {
+ counter-increment: root;
+}
+
+.toc.main > ol > li > ol {
+ counter-reset: subsection;
+ list-style-type: none;
+ margin-left: 2rem;
+}
+
+.toc.main > ol > li > ol > li {
+ counter-increment: subsection;
+}
+
+.toc.main > ol > li > ol > li:before {
+ content: counter(root) "." counter(subsection) ". ";
+ margin-left: -2rem;
+ padding-right: 0.25rem;
+}
+
+.toc.main > ol > li > ol > li > ol {
+ list-style-type: lower-alpha;
+}
+
+.toc.main > ol > li > ol > li > ol > li > ol {
+ list-style-type: lower-roman;
+}
+
+/* table of contents -- unordered */
+
+.toc ul li {
+ color: #778a99;
+}
+
+.toc.main > ul {
+ margin-left: 0;
+ padding-bottom: 2rem;
+ border-bottom: 1px solid #f3f6f6;
+}
+
+.toc.main > ul > li {
+ margin-top: 2rem;
+ border-top: 1px solid #f3f6f6;
+ padding-top: 2rem;
+ list-style-type: none;
+}
+
+.toc.main > ul > li > a {
+ font-weight: bold;
+}
+
+.toc.main > ul > li > ul {
+ margin-top: 1rem;
+}
+
+.toc.main > ul > li > ul > li {
+ list-style-type: disc;
+}
+
+.toc.main > ul > li > ul > li > a {
+ font-weight: normal;
+ text-transform: none;
+}
+
+.toc.main > ul > li > ul > li > ul > li {
+ list-style-type: circle;
+}
+
+/* site footer */
+
+.site-footer {
+ margin-top: 3rem;
+ border-top: solid 1px #cccccc;
+}
+
+.site-footer-content.row {
+ max-width: 90rem;
+}
+
+.site-footer-nav {
+ padding: 2rem 0;
+}
+
+.site-footer-nav .with-left-divider {
+ border-top: 0;
+ border-left: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+@media screen and (max-width: 40em) {
+ .site-footer-nav .with-left-divider {
+ margin-top: 2rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.2);
+ padding-top: 2rem;
+ border-left: 0;
+ }
+}
+
+@media screen and (min-width: 40em) {
+ .site-footer-nav .nav-links {
+ height: 8rem;
+ }
+}
+
+.nav-links ul {
+ margin: 0;
+ padding: 0;
+ line-height: 2rem;
+}
+
+.nav-links ul > li {
+ list-style-type: none;
+ padding-left: 0;
+}
+
+.nav-links ul > li a {
+ color: #c5d0d4;
+ font-weight: bold;
+ font-size: 0.9rem;
+}
+
+.nav-links ul > li a:hover {
+ color: #4078C0;
+ text-decoration: none;
+}
+
+.nav-links ul > li > ul li a {
+ font-weight: normal;
+ text-transform: none;
+}
+
+.site-footer-base {
+ padding: 1rem 0;
+}
+
+.site-footer-base h3, .site-footer-base a {
+}
+
+.site-footer-base .copyright {
+ margin-top: 20px;
+}
+
+.site-footer-base .copyright .text {
+ display: inline-block;
+ line-height: 24px;
+ padding-right: 10px;
+ vertical-align: top;
+}
+
+.site-footer-base .svg-icon-logo-text {
+}
+
+.site-footer-base .svg-icon-logo-image {
+}
+
+.site-footer-base .logo:hover .svg-icon-logo-text {
+}
+
+.site-footer-base .logo:hover .svg-icon-logo-image {
+}
+
+.source-github {
+ padding: 10px;
+ padding-top: 30px;
+ margin-top: 20px;
+ border-top: 1px solid #cccccc;
+}
+
+.source-github a {
+ font-weight: bold;
+}
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/print.css b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/print.css
new file mode 100644
index 00000000..01a832eb
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/print.css
@@ -0,0 +1,27 @@
+h2 {
+ page-break-before: always;
+}
+nav.print .toc-page-line {
+ border-bottom: 1px dashed #bbb;
+}
+nav.print .toc-page-no {
+ float: right;
+}
+nav.print li {
+ list-style: none;
+}
+
+.print-cover-title {
+ font-size: 15mm;
+ padding-top: 150mm;
+ text-align: center;
+ width: 100%;
+}
+
+.print-cover-version {
+ font-size: 10mm;
+ font-style: italic;
+ padding-top: 20mm;
+ text-align: center;
+ width: 100%;
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/single.css b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/single.css
new file mode 100644
index 00000000..0b595f79
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/css/single.css
@@ -0,0 +1,63 @@
+h1 {
+ counter-reset: h2 h3 1 h4 1 h5 1;
+}
+
+h2 {
+ counter-increment: h2;
+ counter-reset: h3 h4 1 h5 1;
+}
+
+h2 .header-title::before {
+ content: counter(h2);
+ margin-right: 10px;
+}
+
+h3 {
+ counter-increment: h3;
+ counter-reset: h4 h5 1;
+}
+
+h3 .header-title::before {
+ content: counter(h2) "." counter(h3);
+ margin-right: 10px;
+}
+
+h4 {
+ counter-increment: h4;
+ counter-reset: h5;
+}
+
+h4 .header-title::before {
+ content: counter(h2) "." counter(h3) "." counter(h4);
+ margin-right: 1rem;
+}
+
+h5 {
+ counter-increment: h5;
+}
+
+h5 .header-title::before {
+ content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5);
+ margin-right: 1rem;
+}
+
+nav ul {
+ counter-reset: nav
+}
+
+nav ul > ul {
+ counter-reset: nav;
+}
+
+nav ul ~ ul {
+ counter-reset: none;
+}
+
+nav li {
+ counter-increment: nav;
+}
+
+nav li a::before {
+ content: counters(nav, ".");
+ margin-right: 0.5rem
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/index.html b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/index.html
new file mode 100644
index 00000000..fb234203
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/index.html
@@ -0,0 +1,238 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+
+<head>
+<title>Apache Pekko Distributed Data with Scala</title>
+<meta charset="utf-8"/>
+<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+<meta name="description" content='Apache Pekko Distributed Data with Scala'/>
+<link href="https://fonts.googleapis.com/css?family=Roboto:100normal,100italic,300normal,300italic,400normal,400italic,500normal,500italic,700normal,700italic,900normal,900italicc" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="lib/jquery/jquery.min.js"></script>
+<script type="text/javascript" src="js/page.js"></script>
+<script type="text/javascript" src="js/warnOldVersion.js"></script>
+<script type="text/javascript" src="js/groups.js"></script>
+<script type="text/javascript" src="js/snippets.js"></script>
+<link rel="stylesheet" type="text/css" href="lib/foundation/dist/foundation.min.css"/>
+<link rel="stylesheet" type="text/css" href="css/page.css"/>
+
+<!--
+<link rel="shortcut icon" href="images/favicon.ico" />
+-->
+</head>
+
+<body>
+<div class="off-canvas-wrapper">
+<div class="off-canvas-wrapper-inner" data-off-canvas-wrapper>
+
+<div class="off-canvas position-left" id="off-canvas-menu" data-off-canvas>
+<nav class="off-canvas-nav">
+<div class="nav-home">
+<a href="index.html" class="active">
+<span class="home-icon">⌂</span>Apache Pekko Distributed Data with Scala
+</a>
+<div class="version-number">
+0.1.0*
+</div>
+</div>
+<div class="nav-toc">
+<ul>
+</ul>
+</div>
+
+</nav>
+</div>
+
+<div class="off-canvas-content" data-off-canvas-content>
+
+<header class="site-header expanded row">
+<div class="small-12 column">
+<a href="#" class="off-canvas-toggle hide-for-medium" data-toggle="off-canvas-menu"><svg class="svg-icon svg-icon-menu" version="1.1" id="Menu" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve"> <path class="svg-icon-menu-path" fill="#53CDEC" d="M16.4,9H3.6C3.048,9,3,9.447,3,10c0,0.553,0.048,1,0.6,1H16.4c0.552,0,0.6-0.447,0.6-1C17,9.447,16.952,9,16.4,9z M16.4,13
+H3.6C3.048,13,3,13.447,3,14c0,0.553,0.048,1,0.6,1H16.4c0.552,0,0.6-0.447,0.6-1C17,13.447,16.952,13,16.4,13z M3.6,7H16.4
+C16.952,7,17,6.553,17,6c0-0.553-0.048-1-0.6-1H3.6C3.048,5,3,5.447,3,6C3,6.553,3.048,7,3.6,7z"/></svg>
+</a>
+<div class="title"><a href="index.html" class="active">Apache Pekko Distributed Data with Scala</a></div>
+
+<!--
+<a href="https://www.example.com" class="logo show-for-medium">logo</a>
+-->
+</div>
+</header>
+
+<div class="expanded row">
+
+<div class="medium-3 large-2 show-for-medium column">
+<nav class="site-nav">
+<div class="nav-home">
+<a href="index.html" class="active">
+<span class="home-icon">⌂</span>Apache Pekko Distributed Data with Scala
+</a>
+<div class="version-number">
+0.1.0*
+</div>
+</div>
+<div class="nav-toc">
+<ul>
+</ul>
+</div>
+
+</nav>
+</div>
+
+<div class="small-12 medium-9 large-10 column">
+<section class="site-content">
+
+<span id="version-warning"></span>
+
+<div class="page-header row">
+<div class="medium-12 show-for-medium column">
+</div>
+</div>
+
+<div class="page-content row">
+<div class="small-12 large-9 column" id="docs">
+<h1><a href="#apache-pekko-distributed-data-with-scala" name="apache-pekko-distributed-data-with-scala" class="anchor"><span class="anchor-link"></span></a>Apache Pekko Distributed Data with Scala</h1>
+<p>This tutorial contains 5 samples illustrating how to use <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html">Apache Pekko Distributed Data</a>.</p>
+<ul>
+ <li>Low Latency Voting Service</li>
+ <li>Highly Available Shopping Cart</li>
+ <li>Distributed Service Registry</li>
+ <li>Replicated Cache</li>
+ <li>Replicated Metrics</li>
+</ul>
+<p><strong>Apache Pekko Distributed Data</strong> is useful when you need to share data between nodes in a Pekko Cluster. The data is accessed with an actor providing a key-value store like API. The keys are unique identifiers with type information of the data values. The values are <em>Conflict Free Replicated Data Types</em> (CRDTs).</p>
+<p>All data entries are spread to all nodes, or nodes with a certain role, in the cluster via direct replication and gossip based dissemination. You have fine grained control of the consistency level for reads and writes.</p>
+<p>The nature CRDTs makes it possible to perform updates from any node without coordination. Concurrent updates from different nodes will automatically be resolved by the monotonic merge function, which all data types must provide. The state changes always converge. Several useful data types for counters, sets, maps and registers are provided and you can also implement your own custom data types.</p>
+<p>It is eventually consistent and geared toward providing high read and write availability (partition tolerance), with low latency. Note that in an eventually consistent system a read may return an out-of-date value.</p>
+<p>Note that there are some <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#limitations">Limitations</a> that you should be aware of. For example, Apache Pekko Distributed Data is not intended for <em>Big Data</em>.</p>
+<h2><a href="#low-latency-voting-service" name="low-latency-voting-service" class="anchor"><span class="anchor-link"></span></a>Low Latency Voting Service</h2>
+<p>Distributed Data is great for low latency services, since you can update or get data from the local replica without immediate communication with other nodes.</p>
+<p>Open <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-scala/src/main/scala/sample/distributeddata/VotingService.scala">VotingService.scala</a>.</p>
+<p><code>VotingService</code> is an actor for low latency counting of votes on several cluster nodes and aggregation of the grand total number of votes. The actor is started on each cluster node. First it expects an <code>Open</code> message on one or several nodes. After that the counting can begin. The open signal is immediately replicated to all nodes with a boolean <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#flags-and-registers">Flag</a>. Note <co [...]
+<pre><code>replicator ! Update(OpenedKey, Flag(), WriteAll(5.seconds))(_.switchOn)
+</code></pre>
+<p>The actor is subscribing to changes of the <code>OpenedKey</code> and other instances of this actor, also on other nodes, will be notified when the flag is changed.</p>
+<pre><code>replicator ! Subscribe(OpenedKey, self)
+
+case c @ Changed(OpenedKey) if c.get(OpenedKey).enabled
+</code></pre>
+<p>The counters are kept in a <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#counters">PNCounterMap</a> and updated with:</p>
+<pre><code>val update = Update(CountersKey, PNCounterMap(), WriteLocal, request = Some(v)) {
+ _.increment(participant, 1)
+}
+replicator ! update
+</code></pre>
+<p>Incrementing the counter is very fast, since it only involves communication with the local <code>Replicator</code> actor. Note <code>WriteLocal</code>. Those updates are also spread to other nodes, but that is performed in the background.</p>
+<p>The total number of votes is retrieved with:</p>
+<pre><code>case GetVotes ⇒
+ replicator ! Get(CountersKey, ReadAll(3.seconds), Some(GetVotesReq(sender())))
+
+case g @ GetSuccess(CountersKey, Some(GetVotesReq(replyTo))) ⇒
+ val data = g.get(CountersKey)
+ replyTo ! Votes(data.entries, open)
+</code></pre>
+<p>The multi-node test for the <code>VotingService</code> can be found in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-scala/src/multi-jvm/scala/sample/distributeddata/VotingServiceSpec.scala">VotingServiceSpec.scala</a>.</p>
+<p>Read the <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#using-the-replicator">Using the Replicator</a> documentation for more details of how to use <code>Get</code>, <code>Update</code>, and <code>Subscribe</code>.</p>
+<h2><a href="#highly-available-shopping-cart" name="highly-available-shopping-cart" class="anchor"><span class="anchor-link"></span></a>Highly Available Shopping Cart</h2>
+<p>Distributed Data is great for highly available services, since it is possible to perform updates to the local node (or currently available nodes) during a network partition.</p>
+<p>Open <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-scala/src/main/scala/sample/distributeddata/ShoppingCart.scala">ShoppingCart.scala</a>.</p>
+<p><code>ShoppingCart</code> is an actor that holds the selected items to buy for a user. The actor instance for a specific user may be started where ever needed in the cluster, i.e. several instances may be started on different nodes and used at the same time.</p>
+<p>Each product in the cart is represented by a <code>LineItem</code> and all items in the cart is collected in a <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#maps">LWWMap</a>.</p>
+<p>The actor handles the commands <code>GetCart</code>, <code>AddItem</code> and <code>RemoveItem</code>. To get the latest updates in case the same shopping cart is used from several nodes it is using consistency level of <code>ReadMajority</code> and <code>WriteMajority</code>, but that is only done to reduce the risk of seeing old data. If such reads and writes cannot be completed due to a network partition it falls back to reading/writing from the local replica (see <code>GetFailure< [...]
+<p>The multi-node test for the <code>ShoppingCart</code> can be found in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-scala/src/multi-jvm/scala/sample/distributeddata/ShoppingCartSpec.scala">ShoppingCartSpec.scala</a>.</p>
+<p>Read the <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#consistency">Consistency</a> section in the documentation to understand the consistency considerations.</p>
+<h2><a href="#replicated-cache" name="replicated-cache" class="anchor"><span class="anchor-link"></span></a>Replicated Cache</h2>
+<p>This example illustrates a simple key-value cache.</p>
+<p>Open <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-scala/src/main/scala/sample/distributeddata/ReplicatedCache.scala">ReplicatedCache.scala</a>.</p>
+<p><code>ReplicatedCache</code> is an actor that is started on each node in the cluster. It supports three commands: <code>PutInCache</code>, <code>GetFromCache</code> and <code>Evict</code>.</p>
+<p>It is splitting up the key space in 100 top level keys, each with a <code>LWWMap</code>. When a data entry is changed the full state of that entry is replicated to other nodes, i.e. when you update a map the whole map is replicated. Therefore, instead of using one ORMap with 1000 elements it is more efficient to split that up in 100 top level ORMap entries with 10 elements each. Top level entries are replicated individually, which has the trade-off that different entries may not be re [...]
+<p>The multi-node test for the <code>ReplicatedCache</code> can be found in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-scala/src/multi-jvm/scala/sample/distributeddata/ReplicatedCacheSpec.scala">ReplicatedCacheSpec.scala</a>.</p>
+<h2><a href="#replicated-metrics" name="replicated-metrics" class="anchor"><span class="anchor-link"></span></a>Replicated Metrics</h2>
+<p>This example illustrates to spread metrics data to all nodes in an Apache Pekko Cluster.</p>
+<p>Open <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-scala/src/main/scala/sample/distributeddata/ReplicatedMetrics.scala">ReplicatedMetrics.scala</a>.</p>
+<p><code>ReplicatedMetrics</code> is an actor that is started on each node in the cluster. Periodically it collects some metrics, in this case used and max heap size. Each metrics type is stored in a <code>LWWMap</code> where the key in the map is the address of the node. The values are disseminated to other nodes with the gossip protocol.</p>
+<p>The multi-node test for the <code>ReplicatedCache</code> can be found in <a href="https://github.com/apache/incubator-pekko-samples/tree/main/pekko-sample-distributed-data-scala/src/multi-jvm/scala/sample/distributeddata/ReplicatedMetricsSpec.scala">ReplicatedMetricsSpec.scala</a>.</p>
+<p>Note that there are some <a href="https://pekko.apache.org/docs/pekko/current/typed/distributed-data.html#limitations">Limitations</a> that you should be aware of. For example, Apache Pekko Distributed Data is not intended for <em>Big Data</em>.</p>
+</div>
+<div class="large-3 show-for-large column" data-sticky-container>
+<nav class="sidebar sticky" data-sticky data-anchor="docs" data-sticky-on="large">
+<div class="page-nav">
+<div class="nav-title">On this page:</div>
+<div class="nav-toc">
+<ul>
+ <li><a href="index.html#apache-pekko-distributed-data-with-scala" class="header">Apache Pekko Distributed Data with Scala</a>
+ <ul>
+ <li><a href="index.html#low-latency-voting-service" class="header">Low Latency Voting Service</a></li>
+ <li><a href="index.html#highly-available-shopping-cart" class="header">Highly Available Shopping Cart</a></li>
+ <li><a href="index.html#replicated-cache" class="header">Replicated Cache</a></li>
+ <li><a href="index.html#replicated-metrics" class="header">Replicated Metrics</a></li>
+ </ul></li>
+</ul>
+</div>
+</div>
+</nav>
+</div>
+</div>
+
+</section>
+</div>
+
+</div>
+
+<footer class="site-footer">
+
+<section class="site-footer-nav">
+<div class="expanded row">
+<div class="small-12 large-offset-2 large-10 column">
+<div class="row site-footer-content">
+
+<div class="small-12 medium-4 large-3 text-center column">
+<div class="nav-links">
+<ul>
+<!-- <li><a href="https://www.example.com/products/">Products</a> -->
+</ul>
+</div>
+</div>
+
+</div>
+</div>
+</div>
+</section>
+
+<section class="site-footer-base">
+<div class="expanded row">
+<div class="small-12 large-offset-2 large-10 column">
+<div class="row site-footer-content">
+
+<div class="small-12 text-center large-9 column">
+
+<!--
+<div class="copyright">
+<span class="text">© 2023</span>
+<a href="https://www.example.com" class="logo">logo</a>
+</div>
+-->
+</div>
+
+</div>
+</div>
+</div>
+</section>
+</footer>
+
+</div>
+</div>
+</div>
+</body>
+
+<script type="text/javascript" src="lib/foundation/dist/foundation.min.js"></script>
+<script type="text/javascript">jQuery(document).foundation();</script>
+<script type="text/javascript" src="js/magellan.js"></script>
+
+<style type="text/css">@import "lib/prettify/prettify.css";</style>
+<script type="text/javascript" src="lib/prettify/prettify.js"></script>
+<script type="text/javascript" src="lib/prettify/lang-scala.js"></script>
+<script type="text/javascript">jQuery(function(){window.prettyPrint && prettyPrint()});</script>
+<script type="text/javascript">jQuery(function(jq){initOldVersionWarnings(jq, '0.1.0-SNAPSHOT', '')});</script>
+
+
+</html>
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/groups.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/groups.js
new file mode 100644
index 00000000..e9ec53c3
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/groups.js
@@ -0,0 +1,167 @@
+groupChangeListeners = [];
+
+window.groupChanged = function(callback) {
+ groupChangeListeners.push(callback);
+}
+
+$(function() {
+
+ // Groups (like 'java' and 'scala') represent groups of 'switchable' content, either in tabs or in regular text.
+ // The catalog of groups can be defined in the sbt parameters to initialize the group.
+
+ var groupCookie = "paradoxGroups";
+ var cookieTg = getCookie(groupCookie);
+ var currentGroups = {};
+
+ var catalog = {}
+ var supergroupByGroup = {};
+
+ if(cookieTg != "")
+ currentGroups = JSON.parse(cookieTg);
+
+ // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie
+ function setCookie(cookieName, cookieValue, daysToExpire) {
+ if (!daysToExpire) daysToExpire = 365;
+ const now = new Date();
+ now.setDate(now.getDate() + daysToExpire);
+ // The lax value will send the cookie for all same-site
+ // requests and top-level navigation GET requests. This
+ // is sufficient for user tracking, but it will prevent
+ // many CSRF attacks. This is the default value in modern browsers.
+ document.cookie = `${cookieName}=${encodeURIComponent(cookieValue)};expires=${now.toUTCString()};path=/;samesite=lax`;
+ }
+
+ // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#Example_2_Get_a_sample_cookie_named_test2
+ function getCookie(cookieName) {
+ const cookieAttr = decodeURIComponent(document.cookie)
+ .split(";")
+ .find(row => row.trimStart().startsWith(cookieName))
+ return cookieAttr ? cookieAttr.split("=")[1] : "";
+ }
+
+ $("dl").has("dd > pre").each(function() {
+ var dl = $(this);
+ dl.addClass("tabbed");
+ var dts = dl.find("dt");
+ dts.each(function(i) {
+ var dt = $(this);
+ dt.html("<a href=\"#tab" + i + "\">" + dt.text() + "</a>");
+ });
+ var dds = dl.find("dd");
+ dds.each(function(i) {
+ var dd = $(this);
+ dd.hide();
+ if (dd.find("blockquote").length) {
+ dd.addClass("has-note");
+ }
+ });
+
+ // Default to the first tab, for grouped tabs switch again later
+ switchToTab(dts.first());
+
+ dts.first().addClass("first");
+ dts.last().addClass("last");
+ });
+
+ // Determine all supergroups, populate 'catalog' and 'supergroupByGroup' accordingly.
+ $(".supergroup").each(function() {
+ var supergroup = $(this).attr('name').toLowerCase();
+ var groups = $(this).find(".group");
+
+ catalog[supergroup] = [];
+
+ groups.each(function() {
+ var group = "group-" + $(this).text().toLowerCase();
+ catalog[supergroup].push(group);
+ supergroupByGroup[group] = supergroup;
+ });
+
+ $(this).on("change", function() {
+ switchToGroup(supergroup, this.value);
+ });
+ });
+
+ // Switch to the right initial groups
+ for (var supergroup in catalog) {
+ var current = queryParamGroup(supergroup) || currentGroups[supergroup] || catalog[supergroup][0];
+
+ switchToGroup(supergroup, current);
+ }
+
+ $("dl.tabbed dt a").click(function(e){
+ e.preventDefault();
+ var currentDt = $(this).parent("dt");
+ var currentDl = currentDt.parent("dl");
+
+ var currentGroup = groupOf(currentDt);
+
+ var supergroup = supergroupByGroup[currentGroup]
+ if (supergroup) {
+ switchToGroup(supergroup, currentGroup);
+ } else {
+ switchToTab(currentDt);
+ }
+ });
+
+ function queryParamGroup(supergroup) {
+ var value = new URLSearchParams(window.location.search).get(supergroup)
+ if (value) {
+ return "group-" + value.toLowerCase();
+ } else {
+ return "";
+ }
+ }
+
+ function switchToGroup(supergroup, group) {
+ currentGroups[supergroup] = group;
+ setCookie(groupCookie, JSON.stringify(currentGroups));
+
+ // Dropdown switcher:
+ $("select")
+ .has("option[value=" + group +"]")
+ .val(group);
+
+ // Inline snippets:
+ catalog[supergroup].forEach(peer => {
+ if (peer === group) {
+ $("." + group).show();
+ } else {
+ $("." + peer).hide();
+ }
+ })
+
+ // Tabbed snippets:
+ $("dl.tabbed").each(function() {
+ var dl = $(this);
+ dl.find("dt").each(function() {
+ var dt = $(this);
+ if(groupOf(dt) == group) {
+ switchToTab(dt);
+ }
+ });
+ });
+
+ groupChangeListeners.forEach(listener => listener(group, supergroup, catalog));
+ }
+
+ function switchToTab(dt) {
+ var dl = dt.parent("dl");
+ dl.find(".current").removeClass("current").next("dd").removeClass("current").hide();
+ dt.addClass("current");
+ var currentContent = dt.next("dd").addClass("current").show();
+ dl.css("height", dt.height() + currentContent.height());
+ }
+
+ function groupOf(elem) {
+ const classAttribute = elem.next("dd").find("pre").attr("class");
+ if (classAttribute) {
+ const currentClasses = classAttribute.split(' ');
+ const regex = new RegExp("^group-.*");
+ const matchingClass = currentClasses.find(cc => regex.test(cc));
+ if (matchingClass) return matchingClass;
+ }
+
+ // No class found? Then use the tab title
+ return "group-" + elem.find('a').text().toLowerCase();
+ }
+});
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/magellan.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/magellan.js
new file mode 100644
index 00000000..52d231ec
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/magellan.js
@@ -0,0 +1,25 @@
+$(function() {
+
+ // add magellan targets to anchor headers, up to depth 3
+ $("a.anchor").each(function() {
+ var anchor = $(this);
+ var name = anchor.attr("name");
+ var header = anchor.parent();
+ if (header.is("h1") || header.is("h2") || header.is("h3")) {
+ header.attr("id", name).attr("data-magellan-target", name);
+ }
+ });
+
+ // enable magellan plugin on the page navigation
+ $(".page-nav").each(function() {
+ var nav = $(this);
+
+ // strip page navigation links down to just the hash fragment
+ nav.find("a").attr('href', function(_, current){
+ return this.hash ? this.hash : current;
+ });
+
+ new Foundation.Magellan(nav);
+ });
+
+});
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/page.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/page.js
new file mode 100644
index 00000000..cb2ef674
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/page.js
@@ -0,0 +1,2 @@
+$(function() {
+});
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/snippets.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/snippets.js
new file mode 100644
index 00000000..a0d6c869
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/snippets.js
@@ -0,0 +1,6 @@
+$(function() {
+ $(".snippet-button.copy-snippet").click(function() {
+ var code = $(this).parent().find("code").text()
+ navigator.clipboard.writeText(code)
+ })
+})
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/warnOldVersion.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/warnOldVersion.js
new file mode 100644
index 00000000..c90bcffb
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/js/warnOldVersion.js
@@ -0,0 +1,23 @@
+function initOldVersionWarnings($, thisVersion, projectUrl) {
+ if (projectUrl && projectUrl !== "") {
+ var schemeLessUrl = projectUrl;
+ if (projectUrl.startsWith("http://")) projectUrl = schemeLessUrl.substring(5);
+ else if (projectUrl.startsWith("https://")) projectUrl = schemeLessUrl.substring(6);
+ const url = schemeLessUrl + (schemeLessUrl.endsWith("\/") ? "" : "/") + "paradox.json";
+ $.get(url, function (versionData) {
+ const currentVersion = versionData.version;
+ if (thisVersion !== currentVersion) {
+ showVersionWarning(thisVersion, currentVersion, projectUrl);
+ }
+ });
+ }
+}
+
+function showVersionWarning(thisVersion, currentVersion, projectUrl) {
+ $('#version-warning').prepend(
+ '<div class="callout warning" style="margin-top: 16px">' +
+ '<p><span style="font-weight: bold">This documentation regards version ' + thisVersion + ', ' +
+ 'however the current version is <a href="' + projectUrl + '">' + currentVersion + '</a>.</span></p>' +
+ '</div>'
+ );
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/foundation/dist/foundation.min.css b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/foundation/dist/foundation.min.css
new file mode 100644
index 00000000..32ce416b
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/foundation/dist/foundation.min.css
@@ -0,0 +1,2 @@
+@charset "UTF-8";
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[ti [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/foundation/dist/foundation.min.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/foundation/dist/foundation.min.js
new file mode 100644
index 00000000..858078db
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/foundation/dist/foundation.min.js
@@ -0,0 +1,4 @@
+function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new [...]
+t(this).is(":first-child")?n=o.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(t(this).is(":last-child")&&(s=o.parents("li").first().next("li").find("a").first()))}),Foundation.Keyboard.handleKey(i,"AccordionMenu",{open:function(){r.is(":hidden")&&(e.down(r),r.find("li").first().find("a").first().focus())},close:function(){r.length&&!r.is(":hidden")?e.up(r):o.parent [...]
+}},{key:"_events",value:function(){this.$element.off(".zf.trigger .zf.offcanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offcanvas":this._handleKeyboard.bind(this)}),this.options.closeOnClick&&this.$exiter.length&&this.$exiter.on({"click.zf.offcanvas":this.close.bind(this)})}},{key:"_setMQChecker",value:function(){var e=this;t(window).on("changed.zf.mediaquery",function(){Foundation.MediaQ [...]
+"top"===this.options.stickTo?(o-=n,a-=t+n):"bottom"===this.options.stickTo&&(o-=r-(t+s),a-=r-s),this.topPoint=o,this.bottomPoint=a,i&&"function"==typeof i&&i()}},{key:"destroy",value:function(){this._removeSticky(!0),this.$element.removeClass(this.options.stickyClass+" is-anchored is-at-top").css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),t(window).off(this.scrollListener),this.wasWrapped [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/jquery/jquery.min.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/jquery/jquery.min.js
new file mode 100644
index 00000000..c4643af6
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/jquery/jquery.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r= [...]
+},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a); [...]
+},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$ [...]
+//# sourceMappingURL=jquery.min.map
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/prettify/lang-scala.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/prettify/lang-scala.js
new file mode 100644
index 00000000..3f97dba5
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/prettify/lang-scala.js
@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object| [...]
+["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]);
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/prettify/prettify.css b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/prettify/prettify.css
new file mode 100644
index 00000000..d44b3a22
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/prettify/prettify.css
@@ -0,0 +1 @@
+.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/prettify/prettify.js b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/prettify/prettify.js
new file mode 100644
index 00000000..7b990496
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/lib/prettify/prettify.js
@@ -0,0 +1,30 @@
+!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/ [...]
+b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a<f;++a){var h=b[a];if(/\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),l;a+2<f&&"-"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b [...]
+h[1]>h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var l=a[f];l==="("?++h:"\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l==="("?(++h,d[h]||(a[f]="(?:")):"\\"===l.charAt(0)&&(l=+l.substring(1) [...]
+(a[f]="\\"+d[l]);for(f=0;f<c;++f)"^"===a[f]&&"^"!==a[f+1]&&(a[f]="");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var i=a[k];if(i.ignoreCase)j=!0;else if(/[a-z]/i.test(i.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){m=!0;j=!1;break}}for(var r={b:8,t:9, [...]
+f:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw Error(""+i);n.push("(?:"+s(i)+")")}return RegExp(n.join("|"),j?"gi":"g")}function T(a,d){function g(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)s[j]="\n",m[j<<1]=x++,m[j++<<1|1]=a}}else if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r ]+/g," "),s[j]=c,m[j<<1]=x,x+=c.length,m [...]
+a)}var b=/(?:^|\s)nocode(?:\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join("").replace(/\n$/,""),d:m}}function H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function U(a){for(var d=void 0,g=a.firstChild;g;g=g.nextSibling)var b=g.nodeType,d=b===1?d?a:g:b===3?V.test(g.nodeValue)?a:d:d;return d===a?void 0:d}function C(a,d){function g(a){for(var j=a.e,k=[j,"pln"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var z=i[n],w=r[z],t=void 0,f;if(typeof w==="string")f=!1;else{var h=b[z.c [...]
+if(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w="pln")}if((f=w.length>=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.le [...]
+g[c],n=r[3];if(n)for(var e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)| [...]
+q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d. [...]
+/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+ [...]
+s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["p [...]
+q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b [...]
+c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute("value",d);var [...]
+r.className="linenums";for(var d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className="L"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode("\u00a0")),r.appendChild(k);a.appendChild(r)}function p(a,d){for(var g=d.length;--g>=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return F[a]}function K(a){var d=a.h;try{var g=T(a.c [...]
+a.a=b;a.d=g.d;a.e=0;I(d,b)(a);var s=/\bMSIE\s(\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var f=a.c,h;if(f)h=f.style.display,f.style.display="none";try{for(;b<k;){var l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType! [...]
+t))){s&&(G=G.replace(d,"\r"));A.nodeValue=G;var L=A.ownerDocument,o=L.createElement("span");o.className=c[r+1];var v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inl [...]
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,pack [...]
+O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,wi [...]
+Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map [...]
+V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%? [...]
+/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["p [...]
+["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimString [...]
+["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl", [...]
+hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc", [...]
+p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;g&&J(b,g,!0);K({h:d,j [...]
+return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var d=p[i],j=h,k=d;k=k.previousSibling;){var m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\??prettify\b/.test(o):m!==3||/\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f. [...]
+o.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=j.lang;if(!m){var m=k.match(n),y;if(!m&&(y=U(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else var o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue("white-space"):0)&&"pre"===o.substring(0,3);u=j.linenums;if(!(u=u==="true"||+u))u=(u=k.match(/\blinenums\b(?::(\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J [...]
+{h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):"function"===typeof a&&a()}for(var b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],p=[],m=0;m<b.length;++m)for(var j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var b=q,c=Date;c.now||(c={now:function(){return+new Date}});var i=0,r,n=/\blang(?:uage)?-([\w.]+)(?!\S)/,e=/\bprettyprint\b/,v=/\bprettyprinted\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code [...]
+h={};g()}};typeof define==="function"&&define.amd&&define("google-code-prettify",[],function(){return Y})})();}()
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/paradox.json b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/paradox.json
new file mode 100644
index 00000000..1a1f3d8f
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/paradox.json
@@ -0,0 +1,4 @@
+{
+ "name" : "Apache Pekko Distributed Data with Scala",
+ "version" : "0.1.0-SNAPSHOT"
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/print-toc.xslt b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/print-toc.xslt
new file mode 100644
index 00000000..c240f5ab
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-data-scala/print-toc.xslt
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="2.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:outline="http://wkhtmltopdf.org/outline"
+ xmlns="http://www.w3.org/1999/xhtml">
+ <xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
+ doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
+ indent="yes" />
+ <xsl:template match="outline:outline">
+ <html>
+ <head>
+ <title>Table of Contents</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/lib/foundation/dist/foundation.min.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/page.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/single.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/print.css"/>
+ </head>
+ <body>
+ <h1>Table of Contents</h1>
+ <nav class="print">
+ <xsl:apply-templates select="outline:item/outline:item">
+ <xsl:with-param name="depth" select="1"/>
+ </xsl:apply-templates>
+ </nav>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="outline:item">
+ <xsl:param name="depth"/>
+ <xsl:comment>Only add the li tags for elements beyond the first depth, so that the roots don't get numbers from our css</xsl:comment>
+ <xsl:choose>
+ <xsl:when test="$depth > 1">
+ <li>
+ <xsl:call-template name="item-inner">
+ <xsl:with-param name="depth" select="$depth"/>
+ </xsl:call-template>
+ </li>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="item-inner">
+ <xsl:with-param name="depth" select="$depth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="item-inner">
+ <xsl:param name="depth"/>
+ <xsl:if test="@title!=''">
+ <div class="toc-page-line">
+ <a>
+ <xsl:if test="@link">
+ <xsl:attribute name="href"><xsl:value-of select="@link"/></xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@backLink">
+ <xsl:attribute name="name"><xsl:value-of select="@backLink"/></xsl:attribute>
+ </xsl:if>
+ <xsl:value-of select="@title" />
+ </a>
+ <span class="toc-page-no"> <xsl:value-of select="@page" /> </span>
+ </div>
+ </xsl:if>
+ <xsl:if test="$depth < 5">
+ <ul>
+ <xsl:comment>added to prevent self-closing tags in QtXmlPatterns</xsl:comment>
+ <xsl:apply-templates select="outline:item">
+ <xsl:with-param name="depth" select="$depth + 1"/>
+ </xsl:apply-templates>
+ </ul>
+ </xsl:if>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/fonts/icons.eot b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/fonts/icons.eot
new file mode 100644
index 00000000..a5203e87
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/fonts/icons.eot differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/fonts/icons.svg b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/fonts/icons.svg
new file mode 100644
index 00000000..58c74882
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/fonts/icons.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by Fontastic.me</metadata>
+<defs>
+<font id="icons" horiz-adv-x="512">
+<font-face font-family="icons" units-per-em="512" ascent="480" descent="-32"/>
+<missing-glyph horiz-adv-x="512" />
+
+<glyph unicode="§" d="M202 136c5 5 10 7 17 7 7 0 13-2 19-7 10-11 10-23 0-36 0 0-22-20-22-20-19-19-42-29-68-29-26 0-49 10-68 29-19 19-29 42-29 67 0 27 10 50 29 69 0 0 76 76 76 76 24 23 48 36 73 39 26 3 47-4 66-22 5-5 8-11 8-18 0-7-3-13-8-19-12-11-24-11-36 0-17 17-40 11-68-17 0 0-75-75-75-75-9-9-14-20-14-33 0-13 5-23 14-31 9-9 19-14 32-14 13 0 23 5 32 14 0 0 22 20 22 20m230 294c19-19 29-42 29-68 0-26-10-49-29-68 0 0-81-81-81-81-25-25-51-37-77-37-21 0-40 9-57 26-5 5-7 10-7 17 0 7 2 13 [...]
+<glyph unicode="⌂" d="M480 249c6-6 8-10 6-14-2-4-6-6-14-6 0 0-43 0-43 0 0 0 0-158 0-158 0-5 0-9 0-11-1-2-2-5-4-7-3-2-7-3-12-3 0 0-105 0-105 0 0 0 0 159 0 159 0 0-104 0-104 0 0 0 0-159 0-159 0 0-99 0-99 0-10 0-16 2-18 5-3 4-4 9-4 16 0 0 0 158 0 158 0 0-43 0-43 0-7 0-12 2-14 6-1 4 0 8 6 14 0 0 205 206 205 206 5 5 12 8 19 8 8 0 14-3 20-8 0 0 204-206 204-206"/>
+</font></defs></svg>
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/fonts/icons.ttf b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/fonts/icons.ttf
new file mode 100644
index 00000000..6da4b13e
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/fonts/icons.ttf differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/fonts/icons.woff b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/fonts/icons.woff
new file mode 100644
index 00000000..2c7e917b
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/fonts/icons.woff differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/page.css b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/page.css
new file mode 100644
index 00000000..7be66ced
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/page.css
@@ -0,0 +1,965 @@
+@charset "UTF-8";
+
+/* fonts */
+
+@font-face {
+ font-family: "icons";
+ src:url("fonts/icons.eot");
+ src:url("fonts/icons.eot?#iefix") format("embedded-opentype"),
+ url("fonts/icons.woff") format("woff"),
+ url("fonts/icons.ttf") format("truetype"),
+ url("fonts/icons.svg#icons") format("svg");
+ font-weight: normal;
+ font-style: normal;
+}
+
+/* body */
+
+body {
+ background: #fff;
+ padding: 0;
+ margin: 0;
+ font-weight: 400;
+ font-style: normal;
+ line-height: 1.4em;
+ position: relative;
+ cursor: default;
+ font: 1em "Roboto", "Helvetica Neue", "Helvetica", Arial, sans-serif;
+ color: #333333;
+ font-smoothing: antialiased;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-size-adjust: none;
+ text-rendering: optimizeLegibility;
+}
+
+/* headers */
+
+h1 {
+ font-family: inherit;
+ font-size: 2.6em;
+ font-weight: 300;
+ color: #333333;
+ margin-bottom: 0.4em;
+ margin-top: 1.1em;
+}
+
+h1:first-child {
+ margin-top: 0;
+}
+
+h2 {
+ font-family: inherit;
+ font-size: 1.8em;
+ font-weight: 400;
+ color: #333333;
+ margin-bottom: 0.2em;
+ margin-top: 1.3em;
+}
+
+h2:first-child {
+ margin-top: 0;
+}
+
+h3 {
+ font-family: inherit;
+ font-size: 1.125em;
+ font-weight: 700;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h3:first-child {
+ margin-top: 0;
+}
+
+h4 {
+ font-family: inherit;
+ font-size: 1em;
+ font-weight: 700;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h4:first-child {
+ margin-top: 0;
+}
+
+h5 {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h5:first-child {
+ margin-top: 0;
+}
+
+h6 {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h6:first-child {
+ margin-top: 0;
+}
+
+/* text */
+
+p {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ line-height: 1.45em;
+ margin: 1em 0em;
+}
+
+/* links */
+
+a {
+ font-family: inherit;
+ color: #4078c0;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+a:link {
+ color: #4078c0;
+}
+
+a:visited {
+ color: #4078c0;
+}
+
+a:hover {
+ color: #4078c0;
+ text-decoration: underline;
+}
+
+a:active {
+ color: #4078c0;
+}
+
+/* header anchors */
+
+a.anchor .anchor-link:before {
+ content: "§";
+}
+
+.site-content .page-content .prettyprint .snippet-button {
+ float: right;
+ text-decoration: none;
+ font-size: 0.75rem;
+ font-weight: bold;
+ font-family: "Roboto", "Helvetica Neue", "Helvetica", Arial, sans-serif;
+ speak: none;
+ color: #4078c0;
+ border: 2px solid #e5e6e4;
+ padding: 4px 4px;
+ margin-left: 8px;
+ line-height: 1.2;
+ vertical-align: middle;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.site-content .page-content .prettyprint .snippet-button:hover {
+ background-color: #e5e6e4;
+ border: 2px solid #4078c0;
+}
+
+a.anchor .anchor-link {
+ font-size: 18px;
+ font-family: "icons" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1.2;
+ vertical-align: middle;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor {
+ visibility: hidden;
+ position: absolute;
+ display: block;
+ width: 30px;
+ margin-left: -30px;
+ padding-right: 3px;
+ text-align: right;
+ text-decoration: none;
+}
+
+h1:hover > a.anchor, h2:hover > a.anchor, h3:hover > a.anchor, h4:hover > a.anchor, h5:hover > a.anchor, h6:hover > a.anchor {
+ visibility: visible;
+ color: inherit;
+ text-decoration: none;
+}
+
+
+/* table */
+
+table th {
+ background: #ffffff;
+ border: solid 1px #dddddd;
+}
+
+table td {
+ background: #ffffff;
+ border: solid 1px #dddddd;
+}
+
+/* code */
+
+pre {
+ padding: 1rem !important;
+ border: 1px solid #dddddd !important;
+ margin: 0 0 1rem 0 !important;
+ white-space: pre;
+ overflow: auto;
+ line-height: 0.9em !important;
+}
+
+code {
+ line-height: 1.45em !important;
+ font-family: Consolas, "Liberation Mono", Courier, monospace;
+ font-size: 0.85em !important;
+ font-weight: normal !important;
+ padding: 0 !important;
+}
+
+pre > code {
+ background: none;
+ border: none;
+}
+
+p code {
+ border: none;
+ color: #0c323b;
+ padding: 0 0.2em !important;
+}
+
+li code {
+ border: none;
+ color: #0c323b;
+ padding: 0 0.2em !important;
+}
+
+/* Github-like */
+
+pre.prettyprint span.str {
+ color: #183691;
+}
+pre.prettyprint span.kwd {
+ color: #000000;
+ font-weight: bold;
+}
+pre.prettyprint span.com {
+ color: #999988;
+ font-style: italic;
+}
+pre.prettyprint span.typ {
+ color: #445588;
+ font-weight: bold;
+}
+pre.prettyprint span.lit {
+ color: #009999
+}
+pre.prettyprint span.pun {
+ color: #000000;
+ font-weight: bold;
+}
+pre.prettyprint span.pln {
+ color: #000000
+}
+pre.prettyprint span.tag {
+ color: navy
+}
+pre.prettyprint span.atn {
+ color: teal
+}
+pre.prettyprint span.atv {
+ color: #dd1144
+}
+pre.prettyprint span.dec {
+ color: #990000
+}
+pre.prettyprint span.var {
+ color: #000000
+}
+pre.prettyprint span.fun {
+ color: #990000
+}
+
+/* tabbed code snippets */
+
+dl.tabbed {
+ position: relative;
+}
+
+dl.tabbed dt {
+ float: left;
+ display: inline-block;
+ position: relative;
+ left: 1px;
+ margin-left: -1px;
+}
+
+dl.tabbed dt.current {
+ z-index: 2;
+}
+
+dl.tabbed dt a {
+ display: block;
+ border: 1px solid #f7f7f7;
+ padding: 0 20px;
+ height: 30px;
+ line-height: 2;
+ color: #4078c0;
+ text-decoration: none;
+}
+
+dl.tabbed dt a:hover {
+ background: #f7f7f7;
+}
+
+dl.tabbed dt.first a {
+ border-top-left-radius: 5px;
+}
+
+dl.tabbed dt.last a {
+ border-top-right-radius: 5px;
+}
+
+dl.tabbed dt.current a {
+ background-color: #f7f7f7;
+ border-color: #dddddd;
+ border-bottom: 0;
+ padding-bottom: 1px;
+}
+
+dl.tabbed dt.current a {
+ color: #0c323b;
+ outline: none;
+}
+
+dl.tabbed dd {
+ position: absolute;
+ width: 100%;
+ left: 0;
+ top: 29px;
+}
+
+dl.tabbed dd.current {
+ z-index: 1;
+}
+
+dl.tabbed dd pre {
+ border-top-left-radius: 0 !important;
+}
+
+dl.tabbed dd.has-note pre {
+ border-bottom: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+dl.tabbed dd.has-note blockquote {
+ color: #0c323b;
+ border: solid #dddddd;
+ border-width: 1px 1px 1px 10px;
+ border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px;
+ margin-top: 0;
+ font-style: italic;
+}
+
+/* blockquotes */
+
+blockquote {
+ border-left: 4px solid rgb(221, 221, 221);
+ margin: 1.5em 0;
+ padding: 1em 20px;
+ color: rgb(119, 119, 119);
+ line-height: 1.4em;
+}
+
+blockquote p {
+ margin: 0;
+ line-height: 1.4em;
+}
+
+blockquote p ~ p {
+ margin-top: 1em;
+}
+
+blockquote p code {
+ background: #fff;
+ padding-right: 0.4em !important;
+}
+
+/* callout */
+
+.callout {
+ border: none;
+ border-left: 10px solid #4078c0;
+ background-color: rgba(64, 120, 192, 0.1);
+}
+
+.callout.warning {
+ border-color: #DB504A;
+ background-color: #fff3d9;
+}
+
+.callout .callout-title {
+ font-weight: bold;
+ margin-bottom: 0.33em;
+}
+
+.callout div ~ p {
+ margin-top: 0;
+}
+
+.callout p ~ p {
+ margin-top: 1em;
+ margin-bottom: 0;
+}
+
+.callout p code {
+ background: #fff;
+ padding-right: 0.4em !important;
+}
+
+/* footnotes */
+
+small {
+ display: block;
+}
+
+/* logo links */
+
+.logo .svg-icon-logo {
+ height: 24px;
+ width: 112px;
+}
+
+.logo:hover {
+ text-decoration: none;
+}
+
+.svg-icon-logo .svg-icon-logo-text {
+ fill: #ffffff;
+}
+
+.logo:hover .svg-icon-logo .svg-icon-logo-text {
+ fill: #4078C0;
+}
+
+/* site header */
+
+.site-header {
+ background: #fcfcfc;
+ border-bottom: solid 1px #cccccc;
+}
+
+.site-header .title {
+ display: inline-block;
+ float: left;
+ height: 70px;
+ line-height: 70px;
+ font-weight: 400;
+ font-size: 1.4em;
+}
+
+.site-header .title a:link, .site-header .title a:visited {
+ color: #515151;
+}
+
+.site-header .title a:hover {
+ color: #515151;
+ text-decoration: none;
+}
+
+.site-header .off-canvas-toggle {
+ float: left;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu {
+ height: 40px;
+ width: 40px;
+ margin-top: 1rem;
+ margin-right: 1rem;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu .svg-icon-menu-path {
+ fill: #000;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu:hover .svg-icon-menu-path {
+ fill: #4183C4;
+}
+
+.site-header .logo {
+ float: right;
+ margin-top: 1rem;
+ text-align: right;
+ color: #000;
+}
+
+/* page header */
+
+.page-header {
+ background: #ffffff;
+ margin-top: 1rem;
+}
+
+.page-header .nav-breadcrumbs {
+ border-bottom: 1px solid #c2d2dc;
+}
+
+.page-header .nav-breadcrumbs ul {
+ display: block;
+ overflow: hidden;
+ margin: 0;
+ padding: 15px;
+ list-style: none;
+ font-size: 0.9em;
+}
+
+.page-header .nav-breadcrumbs li {
+ float: left;
+ margin: 0;
+}
+
+.page-header .nav-breadcrumbs li:before {
+ content: "/";
+ margin: 0 5px;
+ color: #c2d2dc;
+}
+
+.page-header .nav-breadcrumbs li:first-child:before {
+ content: "";
+ margin: 0;
+}
+
+.page-header .nav-breadcrumbs li a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+/* content */
+
+.site-content .row {
+ max-width: 90rem;
+}
+
+.page-content {
+ background: #ffffff;
+ min-height: 600px;
+ padding: 2.5rem 0;
+}
+
+/* sidebar */
+
+.sidebar {
+ background: #ffffff;
+ width: 100%;
+ padding: 0;
+}
+
+.sidebar .nav-toc {
+ padding-top: 1rem;
+}
+
+/* navigation */
+
+.nav-home {
+ background: #f7f7f7;
+ line-height: 2rem;
+}
+
+.nav-home a {
+ display: block;
+ color: #4078c0;
+ font-weight: bold;
+ font-size: 1rem;
+ padding-left: 1rem;
+}
+
+.nav-home a.active {
+ background: #e7e7e7;
+}
+
+.nav-home a:hover {
+ background: #e7e7e7;
+ text-decoration: none;
+}
+
+.nav-home a .home-icon {
+ font-size: 18px;
+ font-family: "icons" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1.2;
+ vertical-align: middle;
+ padding-right: 5px;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.nav-home .version-number {
+ padding-left: 1.4rem;
+ font-size: 0.9rem;
+}
+
+.nav-toc {
+}
+
+.nav-toc ul {
+ margin: 0;
+ padding: 0;
+ line-height: 2rem;
+}
+
+.nav-toc ul > li {
+ list-style-type: none;
+ padding-left: 0;
+}
+
+.nav-toc ul > li a {
+ display: block;
+ color: #4078c0;
+ font-weight: bold;
+ font-size: 0.9rem;
+ padding-left: 1rem;
+}
+
+.nav-toc ul > li a.active {
+ background: #e7e7e7;
+}
+
+.nav-toc ul > li a:hover {
+ background: #e7e7e7;
+ text-decoration: none;
+}
+
+.nav-toc ul > li > ul li {
+ margin-top: 0;
+ border-top: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+}
+
+.nav-toc ul > li > ul li a {
+ font-size: 0.9rem;
+ font-weight: normal;
+ text-transform: none;
+ margin-top: 0;
+ padding-left: 1.2rem;
+}
+
+.nav-toc ul > li > ul > li > ul li a {
+ font-size: 0.8rem;
+ padding-left: 2rem;
+}
+
+
+/* site navigation */
+
+.site-nav {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+ border: solid 1px #cccccc;
+}
+
+/* off-canvas navigation colours */
+
+.off-canvas {
+}
+
+.off-canvas-nav {
+ padding: 0;
+}
+
+.off-canvas-nav .nav-home {
+ background: #ffffff;
+}
+
+.off-canvas-nav .nav-toc {
+ background: #ffffff;
+}
+
+.off-canvas-nav .nav-toc ul > li {
+}
+
+.off-canvas-nav .nav-toc ul > li a {
+}
+
+.off-canvas-nav .nav-toc ul > li a.active {
+}
+
+.off-canvas-nav .nav-toc ul > li a:hover {
+}
+
+.off-canvas-nav .nav-toc ul > li a.active:hover {
+}
+
+.off-canvas-nav .nav-toc ul > li > ul li {
+ border-top: 0;
+}
+
+/* page navigation */
+
+.page-nav {
+ background: #ffffff;
+}
+
+.page-nav .nav-title {
+ display: block;
+ color: #9eb1b7;
+ font-weight: bold;
+ font-size: 0.8rem;
+ padding-left: 1rem;
+}
+
+.page-nav .nav-toc {
+ background: #ffffff;
+}
+
+.page-nav .nav-toc ul > li {
+ border-top: 0;
+}
+
+.page-nav .nav-toc ul > li a.active {
+ background: #4078c0;
+ color: #ffffff;
+}
+
+.page-nav .nav-toc ul > li a.active:hover {
+ background: #4078c0;
+}
+
+/* navigation next */
+
+.nav-next {
+ background: #F7F7F7;
+ border-left: 10px solid #4078c0;
+ margin-top: 40px;
+ padding: 1em 20px;
+}
+
+.nav-next p {
+ display: inline;
+ color: #0c323b;
+ font-style: italic;
+}
+
+.nav-next a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+/* table of contents -- ordered */
+
+.toc a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+.toc ol li {
+ color: #778a99;
+}
+
+.toc > ol > li > ol {
+ list-style-type: lower-alpha;
+}
+
+.toc > ol > li > ol > li > ol {
+ list-style-type: lower-roman;
+}
+
+.toc.main > ol > li {
+ margin-top: 0.5em;
+ font-size: 1.2em;
+}
+
+.toc.main > ol > li {
+ counter-increment: root;
+}
+
+.toc.main > ol > li > ol {
+ counter-reset: subsection;
+ list-style-type: none;
+ margin-left: 2rem;
+}
+
+.toc.main > ol > li > ol > li {
+ counter-increment: subsection;
+}
+
+.toc.main > ol > li > ol > li:before {
+ content: counter(root) "." counter(subsection) ". ";
+ margin-left: -2rem;
+ padding-right: 0.25rem;
+}
+
+.toc.main > ol > li > ol > li > ol {
+ list-style-type: lower-alpha;
+}
+
+.toc.main > ol > li > ol > li > ol > li > ol {
+ list-style-type: lower-roman;
+}
+
+/* table of contents -- unordered */
+
+.toc ul li {
+ color: #778a99;
+}
+
+.toc.main > ul {
+ margin-left: 0;
+ padding-bottom: 2rem;
+ border-bottom: 1px solid #f3f6f6;
+}
+
+.toc.main > ul > li {
+ margin-top: 2rem;
+ border-top: 1px solid #f3f6f6;
+ padding-top: 2rem;
+ list-style-type: none;
+}
+
+.toc.main > ul > li > a {
+ font-weight: bold;
+}
+
+.toc.main > ul > li > ul {
+ margin-top: 1rem;
+}
+
+.toc.main > ul > li > ul > li {
+ list-style-type: disc;
+}
+
+.toc.main > ul > li > ul > li > a {
+ font-weight: normal;
+ text-transform: none;
+}
+
+.toc.main > ul > li > ul > li > ul > li {
+ list-style-type: circle;
+}
+
+/* site footer */
+
+.site-footer {
+ margin-top: 3rem;
+ border-top: solid 1px #cccccc;
+}
+
+.site-footer-content.row {
+ max-width: 90rem;
+}
+
+.site-footer-nav {
+ padding: 2rem 0;
+}
+
+.site-footer-nav .with-left-divider {
+ border-top: 0;
+ border-left: 1px solid rgba(255, 255, 255, 0.2);
+}
+
+@media screen and (max-width: 40em) {
+ .site-footer-nav .with-left-divider {
+ margin-top: 2rem;
+ border-top: 1px solid rgba(255, 255, 255, 0.2);
+ padding-top: 2rem;
+ border-left: 0;
+ }
+}
+
+@media screen and (min-width: 40em) {
+ .site-footer-nav .nav-links {
+ height: 8rem;
+ }
+}
+
+.nav-links ul {
+ margin: 0;
+ padding: 0;
+ line-height: 2rem;
+}
+
+.nav-links ul > li {
+ list-style-type: none;
+ padding-left: 0;
+}
+
+.nav-links ul > li a {
+ color: #c5d0d4;
+ font-weight: bold;
+ font-size: 0.9rem;
+}
+
+.nav-links ul > li a:hover {
+ color: #4078C0;
+ text-decoration: none;
+}
+
+.nav-links ul > li > ul li a {
+ font-weight: normal;
+ text-transform: none;
+}
+
+.site-footer-base {
+ padding: 1rem 0;
+}
+
+.site-footer-base h3, .site-footer-base a {
+}
+
+.site-footer-base .copyright {
+ margin-top: 20px;
+}
+
+.site-footer-base .copyright .text {
+ display: inline-block;
+ line-height: 24px;
+ padding-right: 10px;
+ vertical-align: top;
+}
+
+.site-footer-base .svg-icon-logo-text {
+}
+
+.site-footer-base .svg-icon-logo-image {
+}
+
+.site-footer-base .logo:hover .svg-icon-logo-text {
+}
+
+.site-footer-base .logo:hover .svg-icon-logo-image {
+}
+
+.source-github {
+ padding: 10px;
+ padding-top: 30px;
+ margin-top: 20px;
+ border-top: 1px solid #cccccc;
+}
+
+.source-github a {
+ font-weight: bold;
+}
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/print.css b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/print.css
new file mode 100644
index 00000000..01a832eb
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/print.css
@@ -0,0 +1,27 @@
+h2 {
+ page-break-before: always;
+}
+nav.print .toc-page-line {
+ border-bottom: 1px dashed #bbb;
+}
+nav.print .toc-page-no {
+ float: right;
+}
+nav.print li {
+ list-style: none;
+}
+
+.print-cover-title {
+ font-size: 15mm;
+ padding-top: 150mm;
+ text-align: center;
+ width: 100%;
+}
+
+.print-cover-version {
+ font-size: 10mm;
+ font-style: italic;
+ padding-top: 20mm;
+ text-align: center;
+ width: 100%;
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/single.css b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/single.css
new file mode 100644
index 00000000..0b595f79
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/css/single.css
@@ -0,0 +1,63 @@
+h1 {
+ counter-reset: h2 h3 1 h4 1 h5 1;
+}
+
+h2 {
+ counter-increment: h2;
+ counter-reset: h3 h4 1 h5 1;
+}
+
+h2 .header-title::before {
+ content: counter(h2);
+ margin-right: 10px;
+}
+
+h3 {
+ counter-increment: h3;
+ counter-reset: h4 h5 1;
+}
+
+h3 .header-title::before {
+ content: counter(h2) "." counter(h3);
+ margin-right: 10px;
+}
+
+h4 {
+ counter-increment: h4;
+ counter-reset: h5;
+}
+
+h4 .header-title::before {
+ content: counter(h2) "." counter(h3) "." counter(h4);
+ margin-right: 1rem;
+}
+
+h5 {
+ counter-increment: h5;
+}
+
+h5 .header-title::before {
+ content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5);
+ margin-right: 1rem;
+}
+
+nav ul {
+ counter-reset: nav
+}
+
+nav ul > ul {
+ counter-reset: nav;
+}
+
+nav ul ~ ul {
+ counter-reset: none;
+}
+
+nav li {
+ counter-increment: nav;
+}
+
+nav li a::before {
+ content: counters(nav, ".");
+ margin-right: 0.5rem
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/index.html b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/index.html
new file mode 100644
index 00000000..96779acc
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/index.html
@@ -0,0 +1,334 @@
+<!DOCTYPE html>
+<html class="no-js" lang="en">
+
+<head>
+<title>Apache Pekko Distributed Workers with Scala</title>
+<meta charset="utf-8"/>
+<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+<meta name="description" content='Apache Pekko Distributed Workers with Scala'/>
+<link href="https://fonts.googleapis.com/css?family=Roboto:100normal,100italic,300normal,300italic,400normal,400italic,500normal,500italic,700normal,700italic,900normal,900italicc" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="lib/jquery/jquery.min.js"></script>
+<script type="text/javascript" src="js/page.js"></script>
+<script type="text/javascript" src="js/warnOldVersion.js"></script>
+<script type="text/javascript" src="js/groups.js"></script>
+<script type="text/javascript" src="js/snippets.js"></script>
+<link rel="stylesheet" type="text/css" href="lib/foundation/dist/foundation.min.css"/>
+<link rel="stylesheet" type="text/css" href="css/page.css"/>
+
+<!--
+<link rel="shortcut icon" href="images/favicon.ico" />
+-->
+</head>
+
+<body>
+<div class="off-canvas-wrapper">
+<div class="off-canvas-wrapper-inner" data-off-canvas-wrapper>
+
+<div class="off-canvas position-left" id="off-canvas-menu" data-off-canvas>
+<nav class="off-canvas-nav">
+<div class="nav-home">
+<a href="index.html" class="active">
+<span class="home-icon">⌂</span>Apache Pekko Distributed Workers with Scala
+</a>
+<div class="version-number">
+0.1.0*
+</div>
+</div>
+<div class="nav-toc">
+<ul>
+</ul>
+</div>
+
+</nav>
+</div>
+
+<div class="off-canvas-content" data-off-canvas-content>
+
+<header class="site-header expanded row">
+<div class="small-12 column">
+<a href="#" class="off-canvas-toggle hide-for-medium" data-toggle="off-canvas-menu"><svg class="svg-icon svg-icon-menu" version="1.1" id="Menu" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve"> <path class="svg-icon-menu-path" fill="#53CDEC" d="M16.4,9H3.6C3.048,9,3,9.447,3,10c0,0.553,0.048,1,0.6,1H16.4c0.552,0,0.6-0.447,0.6-1C17,9.447,16.952,9,16.4,9z M16.4,13
+H3.6C3.048,13,3,13.447,3,14c0,0.553,0.048,1,0.6,1H16.4c0.552,0,0.6-0.447,0.6-1C17,13.447,16.952,13,16.4,13z M3.6,7H16.4
+C16.952,7,17,6.553,17,6c0-0.553-0.048-1-0.6-1H3.6C3.048,5,3,5.447,3,6C3,6.553,3.048,7,3.6,7z"/></svg>
+</a>
+<div class="title"><a href="index.html" class="active">Apache Pekko Distributed Workers with Scala</a></div>
+
+<!--
+<a href="https://www.example.com" class="logo show-for-medium">logo</a>
+-->
+</div>
+</header>
+
+<div class="expanded row">
+
+<div class="medium-3 large-2 show-for-medium column">
+<nav class="site-nav">
+<div class="nav-home">
+<a href="index.html" class="active">
+<span class="home-icon">⌂</span>Apache Pekko Distributed Workers with Scala
+</a>
+<div class="version-number">
+0.1.0*
+</div>
+</div>
+<div class="nav-toc">
+<ul>
+</ul>
+</div>
+
+</nav>
+</div>
+
+<div class="small-12 medium-9 large-10 column">
+<section class="site-content">
+
+<span id="version-warning"></span>
+
+<div class="page-header row">
+<div class="medium-12 show-for-medium column">
+</div>
+</div>
+
+<div class="page-content row">
+<div class="small-12 large-9 column" id="docs">
+<h1><a href="#apache-pekko-distributed-workers-with-scala" name="apache-pekko-distributed-workers-with-scala" class="anchor"><span class="anchor-link"></span></a>Apache Pekko Distributed Workers with Scala</h1>
+<h1><a href="#apache-pekko-distributed-workers-with-scala-guide" name="apache-pekko-distributed-workers-with-scala-guide" class="anchor"><span class="anchor-link"></span></a>Apache Pekko Distributed Workers with Scala Guide</h1>
+<p>To be reactive, distributed applications must deal gracefully with temporary and prolonged outages as well as have the ability to scale up and down to make the best use of resources. Apache Pekko Cluster provides these capabilities so that you don’t have to implement them yourself. The distributed workers example demonstrates the following Apache Pekko clustering capabilities:</p>
+<ul>
+ <li>elastic addition and removal of the front-end actors that accept client requests</li>
+ <li>elastic addition and removal of the back-end actors that perform the work distribution of actors across different nodes</li>
+ <li>how jobs are re-tried in the face of failures</li>
+</ul>
+<p>The design is based on Derek Wyatt’s blog post <a href="http://letitcrash.com/post/29044669086/balancing-workload-across-nodes-with-akka-2">Balancing Workload Across Nodes with Akka 2</a> from 2012, which is a bit old, but still a good description of the advantages of letting the workers pull work from the work manager instead of pushing work to the workers.</p>
+<h2><a href="#running-the-example" name="running-the-example" class="anchor"><span class="anchor-link"></span></a>Running the example</h2>
+<p>To run the example:</p>
+<pre class="prettyprint"><code class="language-bash">sbt run
+</code></pre>
+<p>After waiting a few seconds for the cluster to form the output should start look <em>something</em> like this (scroll all the way to the right to see the Actor output):</p>
+<pre class="prettyprint"><code class="language-bash">[INFO] [07/21/2017 17:41:53.320] [ClusterSystem-pekko.actor.default-dispatcher-16] [pekko://ClusterSystem@127.0.0.1:51983/user/producer] Produced work: 3
+[INFO] [07/21/2017 17:41:53.322] [ClusterSystem-pekko.actor.default-dispatcher-3] [pekko://ClusterSystem@127.0.0.1:7345/user/master/singleton] Accepted work: 3bce4d6d-eaae-4da6-b316-0c6f566f2399
+[INFO] [07/21/2017 17:41:53.328] [ClusterSystem-pekko.actor.default-dispatcher-3] [pekko://ClusterSystem@127.0.0.1:7345/user/master/singleton] Giving worker 2b646020-6273-437c-aa0d-4aad6f12fb47 some work 3bce4d6d-eaae-4da6-b316-0c6f566f2399
+[INFO] [07/21/2017 17:41:53.328] [ClusterSystem-pekko.actor.default-dispatcher-2] [pekko://ClusterSystem@127.0.0.1:51980/user/worker] Got work: 3
+[INFO] [07/21/2017 17:41:53.328] [ClusterSystem-pekko.actor.default-dispatcher-16] [pekko://ClusterSystem@127.0.0.1:51980/user/worker] Work is complete. Result 3 * 3 = 9.
+[INFO] [07/21/2017 17:41:53.329] [ClusterSystem-pekko.actor.default-dispatcher-19] [pekko://ClusterSystem@127.0.0.1:7345/user/master/singleton] Work 3bce4d6d-eaae-4da6-b316-0c6f566f2399 is done by worker 2b646020-6273-437c-aa0d-4aad6f12fb47
+</code></pre>
+<p>Now take a look at what happened under the covers.</p>
+<h2><a href="#what-happens-when-you-run-it" name="what-happens-when-you-run-it" class="anchor"><span class="anchor-link"></span></a>What happens when you run it</h2>
+<p>When <code>Main</code> is run without any parameters, it starts six <code>ActorSystem</code>s in the same JVM. These six <code>ActorSystem</code>s form a single cluster. The six nodes include two each that perform front-end, back-end, and worker tasks:</p>
+<ul>
+ <li>The front-end nodes simulate an external interface, such as a REST API, that accepts workloads from clients.</li>
+ <li>The worker nodes have worker actors that accept and process workloads.</li>
+ <li>The back-end nodes contain a WorkManager actor that coordinates workloads, keeps track of the workers, and delegates work to available workers. One of the nodes is active and one is on standby. If the active WorkManager goes down, the standby takes over.</li>
+</ul>
+<p>Let’s look at the details of each part of the application, starting with the front-end.</p>
+<h2><a href="#front-end" name="front-end" class="anchor"><span class="anchor-link"></span></a>Front end</h2>
+<p>Typically in systems built with Apache Pekko, clients submit requests using a RESTful API or a gRPC API. Either <a href="http://doc.pekko.io/docs/pekko-http/current/scala/http/introduction.html">Pekko HTTP</a> or <a href="https://www.playframework.com">Play Framework</a> are great choices for implementing an HTTP API for the front-end, <a href="https://doc.pekko.io/docs/pekko-grpc/current/index.html">Pekko gRPC</a> can be used of a gRPC front end is preferred.</p>
+<p>To limit the scope of this example, we have chosen to emulate client activity with two ordinary actors:</p>
+<ul>
+ <li>The <code>FrontEnd</code> actor generates payloads at random intervals and sends them to the ‘WorkManager’ actor.</li>
+ <li>The <code>WorkResultConsumerActor</code> that consumes results and logs them.</li>
+</ul>
+<p>The <code>FrontEnd</code> actor only concerns itself with posting workloads, and does not care when the work has been completed. When a workload has been processed successfully and passed to the <code>WorkManager</code> actor it publishes the result to all interested cluster nodes through Distributed Pub-Sub.</p>
+<p>The <code>WorkResultConsumerActor</code> subscribes to the completion events and logs when a workload has completed.</p>
+<p>Now, let’s take a look at the code that accomplishes this front-end behavior.</p>
+<h3><a href="#the-front-end-actor" name="the-front-end-actor" class="anchor"><span class="anchor-link"></span></a>The Front-end Actor</h3>
+<p>Note in the source code that as the ‘FrontEnd’ actor starts up, it:</p>
+<ol>
+ <li>Schedules ‘Tick’ messages to itself.</li>
+ <li>Each ‘Tick’ message:
+ <ol>
+ <li>Triggers creation of a new ‘Work’ message.</li>
+ <li>Switches to a new ‘busy’ behavior.</li>
+ <li>Sends the ‘Work’ message to the ‘WorkManager’ actor of a ‘back-end’ node.</li>
+ </ol>
+ </li>
+</ol>
+<p>The <code>FrontEnd</code> actor schedules <code>Tick</code> messages to itself when starting up. the <code>Tick</code> message then triggers creation of a new <code>Work</code>, sending the work to the <code>WorkManager</code> actor on a <code>back-end</code> node and switching to a new <code>busy</code> behavior.</p>
+<p>The cluster contains one <code>WorkManager</code> actor. The <code>FrontEnd</code> actor does not need to know the exact location because it sends work to the <code>masterProxy</code> that is a cluster singleton proxy.</p>
+<p>The ‘WorkManager’ actor can accept or deny a work request and we need to deal with unexpected errors:</p>
+<ul>
+ <li>If the ‘WorkManager’ accepts the request, the actor schedules a new tick to itself and toggles back to the idle behavior.</li>
+ <li>To deal with failures, the message uses the <a href="https://pekko.apache.org/docs/pekko/current/scala/actors.html#ask-send-and-receive-future">ask pattern</a> to add a timeout to wait for a reply. If the timeout expires before the master responds, the returned ‘Future’ fails with a pekko.pattern.AskTimeoutException.</li>
+ <li>We transform timeouts or denials from the ‘WorkManager’ into a ‘Failed’ value that is automatically piped back to <code>self</code> and a <code>Retry</code> is scheduled.</li>
+</ul>
+<p>When a workload has been acknowledged by the master, the actor goes back to the <code>idle</code> behavior which schedules a <code>Tick</code> to start the process again. </p>
+<p>If the work is not accepted or there is no response, for example if the message or response got lost, the <code>FrontEnd</code> actor backs off a bit and then sends the work again.</p>
+<p>You can see the how the actors on a front-end node is started in the method <code>Main.start</code> when the node contains the <code>front-end</code> role:</p>
+<h3><a href="#the-work-result-consumer-actor" name="the-work-result-consumer-actor" class="anchor"><span class="anchor-link"></span></a>The Work Result Consumer Actor</h3>
+<p>As mentioned in the introduction, results are published using Distributed Pub-Sub. The ‘WorkResultConsumerActor’ subscribes to completion events and logs when a workload has completed.</p>
+<p>In an actual application you would probably want a way for clients to poll or stream the status changes of the submitted work.</p>
+<h2><a href="#back-end" name="back-end" class="anchor"><span class="anchor-link"></span></a>Back end</h2>
+<p>The back-end nodes host the <code>WorkManager</code> actor, which manages work, keeps track of available workers, and notifies registered workers when new work is available. The single <code>WorkManager</code> actor is the heart of the solution, with built-in resilience provided by the <a href="https://pekko.apache.org/docs/pekko/current/scala/guide/modules.html#cluster-singleton">Apache Pekko Cluster Singleton</a>.</p>
+<h3><a href="#the-workmanager-singleton" name="the-workmanager-singleton" class="anchor"><span class="anchor-link"></span></a>The WorkManager singleton</h3>
+<p>The <a href="https://pekko.apache.org/docs/pekko/current/scala/guide/modules.html#cluster-singleton">Cluster Singleton</a> tool in Apache Pekko makes sure an actor only runs concurrently on one node within the subset of nodes marked with the role <code>back-end</code> at any given time. It will run on the oldest back-end node. If the node on which the ‘WorkManager’ is running is removed from the cluster, Pekkostarts a new <code>WorkManager</code> on the next oldest node. O [...]
+<p>In case of the master node crashing and being removed from the cluster another master actor is automatically started on the new oldest node.</p>
+<p>You can see how the master singleton is started in the method <code>init</code> in <code>WorkManagerSingleton</code>:</p>
+<p>The singleton accepts the <code>Behavior</code> of the actual singleton actor, as well as configuration which allows us to decide that the singleton actors should only run on the nodes with the role <code>back-end</code>.</p>
+<p>Calls to <code>init</code> on nodes without the <code>back-end</code> role will result in a proxy to communicate with the singleton being created.</p>
+<p>The state of the master is recovered on the standby node in the case of the node being lost through event sourcing.</p>
+<p>Let’s now explore the implementation of the <code>WorkManager</code> actor in depth.</p>
+<h2><a href="#work-manager-in-detail" name="work-manager-in-detail" class="anchor"><span class="anchor-link"></span></a>Work manager in detail</h2>
+<p>The <code>WorkManager</code> actor is without question the most involved component in this example. This is because it is designed to deal with failures. While the Apache Pekko Cluster takes care of restarting the <code>WorkManager</code> in case of a failure, we also want to make sure that the new <code>WorkManager</code> can arrive at the same state as the failed <code>WorkManager</code>. We use event sourcing and PekkoPersistence to achieve this.</p>
+<p>If the <code>back-end</code> node hosting the <code>WorkManager</code> actor would crash the Apache Pekko Cluster Singleton makes sure it starts up on a different node, but we would also want it to reach the exact same state as the crashed node <code>WorkManager</code>. This is achieved through use of event sourcing and <a href="https://pekko.apache.org/docs/pekko/current/scala/persistence.html">PekkoPersistence</a>.</p>
+<h3><a href="#tracking-current-work-items" name="tracking-current-work-items" class="anchor"><span class="anchor-link"></span></a>Tracking current work items</h3>
+<p>The current set of work item is modelled in the <code>WorkState</code> class. It keeps track of the current set of work that is pending, has been accepted by a worker, has completed etc. Every change to the <code>WorkState</code> is modelled as a domain event.</p>
+<p>This allows us to capture and store each such event that happens, we can later replay all of them on an empty model and arrive at the exact same state. This is how event sourcing and <a href="https://pekko.apache.org/docs/pekko/current/scala/persistence.html">PekkoPersistence</a> allows the actor to start on any node and reach the same state as a previous instance.</p>
+<p>If the <code>WorkManager</code> fails and is restarted, the replacement <code>WorkManager</code> replays events from the log to retrieve the current state. This means that when the WorkState is modified, the <code>WorkManager</code> must persist the event before acting on it. When the event is successfully stored, we can modify the state. Otherwise, if a failure occurs before the event is persisted, the replacement <code>WorkManager</code> will not be able to attain the same state as [...]
+<p>Let’s look at how a command to process a work item from the front-end comes in. The first thing you might notice is the comment saying <em>idempotent</em>, this means that the same work message may arrive multiple times, but regardless how many times the same work arrives, it should only be executed once. This is needed since the <code>FrontEnd</code> actor re-sends work in case of the <code>Work</code> or <code>Ack</code> messages getting lost (Pekkodoes not provide any guarant [...]
+<p>To make the logic idempotent we simple check if the work id is already known, and if it is we simply <code>Ack</code> it without further logic. If the work is previously unknown, we start by transforming it into a <code>WorkAccepted</code> event, which we persist, and only in the <code>EventHandler</code> that is called after the event has been persisted do we actually update the <code>workState</code>, and send an <code>Ack</code> back to the <code>FrontEnd</code> and trigger a searc [...]
+<h3><a href="#implementation-items-required-for-pekkopersistence" name="implementation-items-required-for-pekkopersistence" class="anchor"><span class="anchor-link"></span></a>Implementation items required for PekkoPersistence</h3>
+<p>In a “normal” Actor the only thing we have only to provide a <code>Behavior</code>. For a <code>PersistentBehavior</code> there are three things that needs to be implemented:</p>
+<ol>
+ <li><code>persistenceId</code> is a global identifier for the actor, we must make sure that there is never more than one Actor instance with the same <code>persistenceId</code> running globally, or else we would possibly mess up its journal.</li>
+ <li><code>commandHandler</code> receives incoming messages, called <code>Command</code>s and returns any Effects e.g. persisting an event</li>
+ <li><code>eventHandler</code> is invoked with the events once they have been persisted to the database</li>
+</ol>
+<h3><a href="#tracking-workers" name="tracking-workers" class="anchor"><span class="anchor-link"></span></a>Tracking workers</h3>
+<p>Unlike the <code>WorkManager</code> actor, the example system contains multiple workers that can be stopped and restarted frequently. We do not need to save their state since the <code>WorkManager</code> is tracking work and will simply send work to another worker if the original fails to respond. So, rather than persisting a list of available workers, the example uses the following strategy:</p>
+<ul>
+ <li>Running workers periodically register with the master using a <code>RegisterWorker</code> message. If a <code>back-end</code> node fails and the <code>WorkManager</code> is started on a new node, the registrations go automatically to the new node.</li>
+ <li>Any type of failure – whether from the network, worker actor, or node – that prevents a <code>RegisterWorker</code> message from arriving within the <code>work-timeout</code> period causes the ‘WorkManager’ actor to remove the worker from its list.</li>
+</ul>
+<p>When stopping a <code>Worker</code> Actor still tries to gracefully remove it self using the <code>DeRegisterWorker</code> message, but in case of crash it will have no chance to communicate that with the master node.</p>
+<p>Now let’s move on to the last piece of the puzzle, the worker nodes.</p>
+<h2><a href="#worker-nodes" name="worker-nodes" class="anchor"><span class="anchor-link"></span></a>Worker nodes</h2>
+<p><code>Worker</code> actors and the <code>WorkManager</code> actor interact as follows:</p>
+<ol>
+ <li><code>Worker</code> actors register with the receptionist.</li>
+ <li>The <code>WorkManager</code> subscribes to workers via the receptionist.</li>
+ <li>When the <code>WorkManager</code> actor has work, it sends a <code>WorkIsReady</code> message to all workers it thinks are not busy.</li>
+ <li>The <code>WorkManager</code> picks the first reply and assigns the work to that worker. This achieves back pressure because the <code>WorkManager</code> does not push work on workers that are already busy and overwhelm their mailboxes.</li>
+ <li>When the worker receives work from the master, it delegates the actual processing to a child actor, <code>WorkExecutor</code>. This allows the worker to be responsive while its child executes the work.</li>
+</ol>
+<p>You can see how a worker node and a number of worker actors is started in the method <code>Main.start</code> if the node contains the role <code>worker</code>.</p>
+<p>Now that we have covered all the details, we can experiment with different sets of nodes for the cluster.</p>
+<h2><a href="#experimenting" name="experimenting" class="anchor"><span class="anchor-link"></span></a>Experimenting</h2>
+<p>When running the appliction without parameters it runs a six node cluster within the same JVM and starts a Apache Cassandra database. It can be more interesting to run them in separate processes. Open four terminal windows.</p>
+<p>In the first terminal window, start the Apache Cassandra database with the following command:</p>
+<pre class="prettyprint"><code class="language-bash">sbt "runMain worker.Main cassandra"
+</code></pre>
+<p>The Apache Cassandra database will stay alive as long as you do not kill this process, when you want to stop it you can do that with <code>Ctrl + C</code>. Without the database the back-end nodes will not be able to start up.</p>
+<p>You could also run your own local installation of Apache Cassandra given that it runs on the default port on localhost and does not require a password.</p>
+<p>With the database running, go to the second terminal window and start the first seed node with the following command:</p>
+<pre class="prettyprint"><code class="language-bash">sbt "runMain worker.Main 7345"
+</code></pre>
+<p>7345 corresponds to the port of the first seed-nodes element in the configuration. In the log output you see that the cluster node has been started and changed status to ‘Up’.</p>
+<p>In the third terminal window, start the front-end node with the following command:</p>
+<pre class="prettyprint"><code class="language-bash">sbt "runMain worker.Main 3001"
+</code></pre>
+<p>3001 is to the port of the node. In the log output you see that the cluster node has been started and joins the 7345 node and becomes a member of the cluster. Its status changed to ‘Up’.</p>
+<p>Switch over to the second terminal window and see in the log output that the member joined. So far, no <code>Worker</code> has not been started, i.e. jobs are produced and accepted but not processed.</p>
+<p>In the fourth terminal window, start a worker node with the following command:</p>
+<pre class="prettyprint"><code class="language-bash">sbt "runMain worker.Main 5001 3"
+</code></pre>
+<p>5001 means the node will be a worker node, and the second parameter <code>3</code> means that it will host three worker actors.</p>
+<p>Look at the log output in the different terminal windows. In the second window (front-end) you should see that the produced jobs are processed and logged as <code>"Consumed result"</code>.</p>
+<p>Take a look at the logging that is done in <code>WorkProducer</code>, <code>WorkManager</code> and <code>Worker</code>. Identify the corresponding log entries in the 3 terminal windows with Pekkonodes.</p>
+<p>Shutdown the worker node (fourth terminal window) with <code>ctrl-c</code>. Observe how the <code>"Consumed result"</code> logs in the front-end node (second terminal window) stops. Start the worker node again.</p>
+<pre class="prettyprint"><code class="language-bash">sbt "runMain worker.Main 5001 3"
+</code></pre>
+<p>You can also start more such worker nodes in new terminal windows.</p>
+<p>You can start more cluster back-end nodes using port numbers between 2000-2999.</p>
+<pre class="prettyprint"><code class="language-bash">sbt "runMain worker.Main 7355"
+</code></pre>
+<p>The nodes with port 7345 to 2554 are configured to be used as “seed nodes” in this sample, if you shutdown all or start none of these the other nodes will not know how to join the cluster. If all four are shut down and 7345 is started it will join itself and form a new cluster.</p>
+<p>As long as one of the four nodes is alive the cluster will keep working. You can read more about this in the <a href="https://pekko.apache.org/docs/pekko/current/scala/cluster-usage.html">Pekkodocumentation section on seed nodes</a>.</p>
+<p>You can start more cluster front-end nodes using port numbers between 3000-3999:</p>
+<pre class="prettyprint"><code class="language-bash">sbt "runMain worker.Main 3002
+</code></pre>
+<p>Any port outside these ranges creates a worker node, for which you can also play around with the number of worker actors on using the second parameter.</p>
+<pre class="prettyprint"><code class="language-bash">sbt "runMain worker.Main 5009 4
+</code></pre>
+<h2><a href="#the-journal" name="the-journal" class="anchor"><span class="anchor-link"></span></a>The journal</h2>
+<p>The files of the Apache Cassandra database are saved in the target directory and when you restart the application the state is recovered. You can clean the state with:</p>
+<pre class="prettyprint"><code class="language-bash">sbt clean
+</code></pre>
+<h2><a href="#next-steps" name="next-steps" class="anchor"><span class="anchor-link"></span></a>Next steps</h2>
+<p>The following are some ideas where to take this sample next. Implementation of each idea is left up to you.</p>
+<h3><a href="#a-http-based-api" name="a-http-based-api" class="anchor"><span class="anchor-link"></span></a>A HTTP Based API</h3>
+<p>The <code>FrontEnd</code> in this sample is a dummy that automatically generates work. A real application could for example use <a href="http://doc.pekko.io/docs/pekko-http/current/scala/http/introduction.html">PekkoHTTP</a> to provide a HTTP REST (or other) API for external clients.</p>
+<h3><a href="#scaling-better-with-many-masters" name="scaling-better-with-many-masters" class="anchor"><span class="anchor-link"></span></a>Scaling better with many masters</h3>
+<p>If the singleton master becomes a bottleneck we could start several master actors and shard the jobs among them. This could be achieved by using <a href="https://pekko.apache.org/docs/pekko/current/scala/cluster-sharding.html">Apache Pekko Cluster Sharding</a> with many <code>WorkManager</code> actors as entities and a hash of some sort on the payload deciding which master it should go to.</p>
+<h3><a href="#more-tools-for-building-distributed-systems" name="more-tools-for-building-distributed-systems" class="anchor"><span class="anchor-link"></span></a>More tools for building distributed systems</h3>
+<p>In this example we have used <a href="https://pekko.apache.org/docs/pekko/current/scala/cluster-singleton.html#cluster-singleton">Cluster Singleton</a> and <a href="https://pekko.apache.org/docs/pekko/current/scala/distributed-pub-sub.html">Distributed Publish Subscribe</a> but those are not the only tools in Apache Pekko Cluster.</p>
+<p>You can also find a good overview of the various modules that make up Pekkoin <a href="https://pekko.apache.org/docs/pekko/current/scala/guide/modules.html#cluster-singleton">this section of the official documentation</a></p>
+</div>
+<div class="large-3 show-for-large column" data-sticky-container>
+<nav class="sidebar sticky" data-sticky data-anchor="docs" data-sticky-on="large">
+<div class="page-nav">
+<div class="nav-title">On this page:</div>
+<div class="nav-toc">
+<ul>
+ <li><a href="index.html#apache-pekko-distributed-workers-with-scala" class="header">Apache Pekko Distributed Workers with Scala</a>
+ <ul>
+ <li><a href="index.html#apache-pekko-distributed-workers-with-scala-guide" class="header">Apache Pekko Distributed Workers with Scala Guide</a></li>
+ </ul></li>
+</ul>
+</div>
+</div>
+</nav>
+</div>
+</div>
+
+</section>
+</div>
+
+</div>
+
+<footer class="site-footer">
+
+<section class="site-footer-nav">
+<div class="expanded row">
+<div class="small-12 large-offset-2 large-10 column">
+<div class="row site-footer-content">
+
+<div class="small-12 medium-4 large-3 text-center column">
+<div class="nav-links">
+<ul>
+<!-- <li><a href="https://www.example.com/products/">Products</a> -->
+</ul>
+</div>
+</div>
+
+</div>
+</div>
+</div>
+</section>
+
+<section class="site-footer-base">
+<div class="expanded row">
+<div class="small-12 large-offset-2 large-10 column">
+<div class="row site-footer-content">
+
+<div class="small-12 text-center large-9 column">
+
+<!--
+<div class="copyright">
+<span class="text">© 2023</span>
+<a href="https://www.example.com" class="logo">logo</a>
+</div>
+-->
+</div>
+
+</div>
+</div>
+</div>
+</section>
+</footer>
+
+</div>
+</div>
+</div>
+</body>
+
+<script type="text/javascript" src="lib/foundation/dist/foundation.min.js"></script>
+<script type="text/javascript">jQuery(document).foundation();</script>
+<script type="text/javascript" src="js/magellan.js"></script>
+
+<style type="text/css">@import "lib/prettify/prettify.css";</style>
+<script type="text/javascript" src="lib/prettify/prettify.js"></script>
+<script type="text/javascript" src="lib/prettify/lang-scala.js"></script>
+<script type="text/javascript">jQuery(function(){window.prettyPrint && prettyPrint()});</script>
+<script type="text/javascript">jQuery(function(jq){initOldVersionWarnings(jq, '0.1.0-SNAPSHOT', '')});</script>
+
+
+</html>
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/groups.js b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/groups.js
new file mode 100644
index 00000000..e9ec53c3
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/groups.js
@@ -0,0 +1,167 @@
+groupChangeListeners = [];
+
+window.groupChanged = function(callback) {
+ groupChangeListeners.push(callback);
+}
+
+$(function() {
+
+ // Groups (like 'java' and 'scala') represent groups of 'switchable' content, either in tabs or in regular text.
+ // The catalog of groups can be defined in the sbt parameters to initialize the group.
+
+ var groupCookie = "paradoxGroups";
+ var cookieTg = getCookie(groupCookie);
+ var currentGroups = {};
+
+ var catalog = {}
+ var supergroupByGroup = {};
+
+ if(cookieTg != "")
+ currentGroups = JSON.parse(cookieTg);
+
+ // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie
+ function setCookie(cookieName, cookieValue, daysToExpire) {
+ if (!daysToExpire) daysToExpire = 365;
+ const now = new Date();
+ now.setDate(now.getDate() + daysToExpire);
+ // The lax value will send the cookie for all same-site
+ // requests and top-level navigation GET requests. This
+ // is sufficient for user tracking, but it will prevent
+ // many CSRF attacks. This is the default value in modern browsers.
+ document.cookie = `${cookieName}=${encodeURIComponent(cookieValue)};expires=${now.toUTCString()};path=/;samesite=lax`;
+ }
+
+ // https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#Example_2_Get_a_sample_cookie_named_test2
+ function getCookie(cookieName) {
+ const cookieAttr = decodeURIComponent(document.cookie)
+ .split(";")
+ .find(row => row.trimStart().startsWith(cookieName))
+ return cookieAttr ? cookieAttr.split("=")[1] : "";
+ }
+
+ $("dl").has("dd > pre").each(function() {
+ var dl = $(this);
+ dl.addClass("tabbed");
+ var dts = dl.find("dt");
+ dts.each(function(i) {
+ var dt = $(this);
+ dt.html("<a href=\"#tab" + i + "\">" + dt.text() + "</a>");
+ });
+ var dds = dl.find("dd");
+ dds.each(function(i) {
+ var dd = $(this);
+ dd.hide();
+ if (dd.find("blockquote").length) {
+ dd.addClass("has-note");
+ }
+ });
+
+ // Default to the first tab, for grouped tabs switch again later
+ switchToTab(dts.first());
+
+ dts.first().addClass("first");
+ dts.last().addClass("last");
+ });
+
+ // Determine all supergroups, populate 'catalog' and 'supergroupByGroup' accordingly.
+ $(".supergroup").each(function() {
+ var supergroup = $(this).attr('name').toLowerCase();
+ var groups = $(this).find(".group");
+
+ catalog[supergroup] = [];
+
+ groups.each(function() {
+ var group = "group-" + $(this).text().toLowerCase();
+ catalog[supergroup].push(group);
+ supergroupByGroup[group] = supergroup;
+ });
+
+ $(this).on("change", function() {
+ switchToGroup(supergroup, this.value);
+ });
+ });
+
+ // Switch to the right initial groups
+ for (var supergroup in catalog) {
+ var current = queryParamGroup(supergroup) || currentGroups[supergroup] || catalog[supergroup][0];
+
+ switchToGroup(supergroup, current);
+ }
+
+ $("dl.tabbed dt a").click(function(e){
+ e.preventDefault();
+ var currentDt = $(this).parent("dt");
+ var currentDl = currentDt.parent("dl");
+
+ var currentGroup = groupOf(currentDt);
+
+ var supergroup = supergroupByGroup[currentGroup]
+ if (supergroup) {
+ switchToGroup(supergroup, currentGroup);
+ } else {
+ switchToTab(currentDt);
+ }
+ });
+
+ function queryParamGroup(supergroup) {
+ var value = new URLSearchParams(window.location.search).get(supergroup)
+ if (value) {
+ return "group-" + value.toLowerCase();
+ } else {
+ return "";
+ }
+ }
+
+ function switchToGroup(supergroup, group) {
+ currentGroups[supergroup] = group;
+ setCookie(groupCookie, JSON.stringify(currentGroups));
+
+ // Dropdown switcher:
+ $("select")
+ .has("option[value=" + group +"]")
+ .val(group);
+
+ // Inline snippets:
+ catalog[supergroup].forEach(peer => {
+ if (peer === group) {
+ $("." + group).show();
+ } else {
+ $("." + peer).hide();
+ }
+ })
+
+ // Tabbed snippets:
+ $("dl.tabbed").each(function() {
+ var dl = $(this);
+ dl.find("dt").each(function() {
+ var dt = $(this);
+ if(groupOf(dt) == group) {
+ switchToTab(dt);
+ }
+ });
+ });
+
+ groupChangeListeners.forEach(listener => listener(group, supergroup, catalog));
+ }
+
+ function switchToTab(dt) {
+ var dl = dt.parent("dl");
+ dl.find(".current").removeClass("current").next("dd").removeClass("current").hide();
+ dt.addClass("current");
+ var currentContent = dt.next("dd").addClass("current").show();
+ dl.css("height", dt.height() + currentContent.height());
+ }
+
+ function groupOf(elem) {
+ const classAttribute = elem.next("dd").find("pre").attr("class");
+ if (classAttribute) {
+ const currentClasses = classAttribute.split(' ');
+ const regex = new RegExp("^group-.*");
+ const matchingClass = currentClasses.find(cc => regex.test(cc));
+ if (matchingClass) return matchingClass;
+ }
+
+ // No class found? Then use the tab title
+ return "group-" + elem.find('a').text().toLowerCase();
+ }
+});
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/magellan.js b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/magellan.js
new file mode 100644
index 00000000..52d231ec
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/magellan.js
@@ -0,0 +1,25 @@
+$(function() {
+
+ // add magellan targets to anchor headers, up to depth 3
+ $("a.anchor").each(function() {
+ var anchor = $(this);
+ var name = anchor.attr("name");
+ var header = anchor.parent();
+ if (header.is("h1") || header.is("h2") || header.is("h3")) {
+ header.attr("id", name).attr("data-magellan-target", name);
+ }
+ });
+
+ // enable magellan plugin on the page navigation
+ $(".page-nav").each(function() {
+ var nav = $(this);
+
+ // strip page navigation links down to just the hash fragment
+ nav.find("a").attr('href', function(_, current){
+ return this.hash ? this.hash : current;
+ });
+
+ new Foundation.Magellan(nav);
+ });
+
+});
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/page.js b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/page.js
new file mode 100644
index 00000000..cb2ef674
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/page.js
@@ -0,0 +1,2 @@
+$(function() {
+});
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/snippets.js b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/snippets.js
new file mode 100644
index 00000000..a0d6c869
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/snippets.js
@@ -0,0 +1,6 @@
+$(function() {
+ $(".snippet-button.copy-snippet").click(function() {
+ var code = $(this).parent().find("code").text()
+ navigator.clipboard.writeText(code)
+ })
+})
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/warnOldVersion.js b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/warnOldVersion.js
new file mode 100644
index 00000000..c90bcffb
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/js/warnOldVersion.js
@@ -0,0 +1,23 @@
+function initOldVersionWarnings($, thisVersion, projectUrl) {
+ if (projectUrl && projectUrl !== "") {
+ var schemeLessUrl = projectUrl;
+ if (projectUrl.startsWith("http://")) projectUrl = schemeLessUrl.substring(5);
+ else if (projectUrl.startsWith("https://")) projectUrl = schemeLessUrl.substring(6);
+ const url = schemeLessUrl + (schemeLessUrl.endsWith("\/") ? "" : "/") + "paradox.json";
+ $.get(url, function (versionData) {
+ const currentVersion = versionData.version;
+ if (thisVersion !== currentVersion) {
+ showVersionWarning(thisVersion, currentVersion, projectUrl);
+ }
+ });
+ }
+}
+
+function showVersionWarning(thisVersion, currentVersion, projectUrl) {
+ $('#version-warning').prepend(
+ '<div class="callout warning" style="margin-top: 16px">' +
+ '<p><span style="font-weight: bold">This documentation regards version ' + thisVersion + ', ' +
+ 'however the current version is <a href="' + projectUrl + '">' + currentVersion + '</a>.</span></p>' +
+ '</div>'
+ );
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/foundation/dist/foundation.min.css b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/foundation/dist/foundation.min.css
new file mode 100644
index 00000000..32ce416b
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/foundation/dist/foundation.min.css
@@ -0,0 +1,2 @@
+@charset "UTF-8";
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[ti [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/foundation/dist/foundation.min.js b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/foundation/dist/foundation.min.js
new file mode 100644
index 00000000..858078db
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/foundation/dist/foundation.min.js
@@ -0,0 +1,4 @@
+function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _classCallCheck(t,e){if(!(t instanceof e))throw new [...]
+t(this).is(":first-child")?n=o.parents("li").first().find("a").first():n.parents("li").first().children("[data-submenu]:visible").length&&(n=n.parents("li").find("li:last-child").find("a").first()),void(t(this).is(":last-child")&&(s=o.parents("li").first().next("li").find("a").first()))}),Foundation.Keyboard.handleKey(i,"AccordionMenu",{open:function(){r.is(":hidden")&&(e.down(r),r.find("li").first().find("a").first().focus())},close:function(){r.length&&!r.is(":hidden")?e.up(r):o.parent [...]
+}},{key:"_events",value:function(){this.$element.off(".zf.trigger .zf.offcanvas").on({"open.zf.trigger":this.open.bind(this),"close.zf.trigger":this.close.bind(this),"toggle.zf.trigger":this.toggle.bind(this),"keydown.zf.offcanvas":this._handleKeyboard.bind(this)}),this.options.closeOnClick&&this.$exiter.length&&this.$exiter.on({"click.zf.offcanvas":this.close.bind(this)})}},{key:"_setMQChecker",value:function(){var e=this;t(window).on("changed.zf.mediaquery",function(){Foundation.MediaQ [...]
+"top"===this.options.stickTo?(o-=n,a-=t+n):"bottom"===this.options.stickTo&&(o-=r-(t+s),a-=r-s),this.topPoint=o,this.bottomPoint=a,i&&"function"==typeof i&&i()}},{key:"destroy",value:function(){this._removeSticky(!0),this.$element.removeClass(this.options.stickyClass+" is-anchored is-at-top").css({height:"",top:"",bottom:"","max-width":""}).off("resizeme.zf.trigger"),this.$anchor&&this.$anchor.length&&this.$anchor.off("change.zf.sticky"),t(window).off(this.scrollListener),this.wasWrapped [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/jquery/jquery.min.js b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/jquery/jquery.min.js
new file mode 100644
index 00000000..c4643af6
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/jquery/jquery.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v2.1.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.1",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r= [...]
+},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a); [...]
+},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)&&(a[d]=!1),a.removeAttribute(c)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),Zb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):a.setAttribute(c,c),c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=$b[b]||n.find.attr;$ [...]
+//# sourceMappingURL=jquery.min.map
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/prettify/lang-scala.js b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/prettify/lang-scala.js
new file mode 100644
index 00000000..3f97dba5
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/prettify/lang-scala.js
@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\r \xa0]+/,null,"\t\n\r \u00a0"],["str",/^"(?:""(?:""?(?!")|[^"\\]|\\.)*"{0,3}|(?:[^\n\r"\\]|\\.)*"?)/,null,'"'],["lit",/^`(?:[^\n\r\\`]|\\.)*`?/,null,"`"],["pun",/^[!#%&(--:-@[-^{-~]+/,null,"!#%&()*+,-:;<=>?@[\\]^{|}~"]],[["str",/^'(?:[^\n\r'\\]|\\(?:'|[^\n\r']+))'/],["lit",/^'[$A-Z_a-z][\w$]*(?![\w$'])/],["kwd",/^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object| [...]
+["lit",/^(?:true|false|null|this)\b/],["lit",/^(?:0(?:[0-7]+|x[\da-f]+)l?|(?:0|[1-9]\d*)(?:(?:\.\d+)?(?:e[+-]?\d+)?f?|l?)|\\.\d+(?:e[+-]?\d+)?f?)/i],["typ",/^[$_]*[A-Z][\d$A-Z_]*[a-z][\w$]*/],["pln",/^[$A-Z_a-z][\w$]*/],["com",/^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],["pun",/^(?:\.+|\/)/]]),["scala"]);
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/prettify/prettify.css b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/prettify/prettify.css
new file mode 100644
index 00000000..d44b3a22
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/prettify/prettify.css
@@ -0,0 +1 @@
+.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding [...]
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/prettify/prettify.js b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/prettify/prettify.js
new file mode 100644
index 00000000..7b990496
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/lib/prettify/prettify.js
@@ -0,0 +1,30 @@
+!function(){var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function S(a){function d(e){var b=e.charCodeAt(0);if(b!==92)return b;var a=e.charAt(1);return(b=r[a])?b:"0"<=a&&a<="7"?parseInt(e.substring(1),8):a==="u"||a==="x"?parseInt(e.substring(2),16):e.charCodeAt(1)}function g(e){if(e<32)return(e<16?"\\x0":"\\x")+e.toString(16);e=String.fromCharCode(e);return e==="\\"||e==="-"||e==="]"||e==="^"?"\\"+e:e}function b(e){var b=e.substring(1,e.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/ [...]
+b[0]==="^",c=["["];a&&c.push("^");for(var a=a?1:0,f=b.length;a<f;++a){var h=b[a];if(/\\[bdsw]/i.test(h))c.push(h);else{var h=d(h),l;a+2<f&&"-"===b[a+1]?(l=d(b[a+2]),a+=2):l=h;e.push([h,l]);l<65||h>122||(l<65||h>90||e.push([Math.max(65,h)|32,Math.min(l,90)|32]),l<97||h>122||e.push([Math.max(97,h)&-33,Math.min(l,122)&-33]))}}e.sort(function(e,a){return e[0]-a[0]||a[1]-e[1]});b=[];f=[];for(a=0;a<e.length;++a)h=e[a],h[0]<=f[1]+1?f[1]=Math.max(f[1],h[1]):b.push(f=h);for(a=0;a<b.length;++a)h=b [...]
+h[1]>h[0]&&(h[1]+1>h[0]&&c.push("-"),c.push(g(h[1])));c.push("]");return c.join("")}function s(e){for(var a=e.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),c=a.length,d=[],f=0,h=0;f<c;++f){var l=a[f];l==="("?++h:"\\"===l.charAt(0)&&(l=+l.substring(1))&&(l<=h?d[l]=-1:a[f]=g(l))}for(f=1;f<d.length;++f)-1===d[f]&&(d[f]=++x);for(h=f=0;f<c;++f)l=a[f],l==="("?(++h,d[h]||(a[f]="(?:")):"\\"===l.charAt(0)&&(l=+l.substring(1) [...]
+(a[f]="\\"+d[l]);for(f=0;f<c;++f)"^"===a[f]&&"^"!==a[f+1]&&(a[f]="");if(e.ignoreCase&&m)for(f=0;f<c;++f)l=a[f],e=l.charAt(0),l.length>=2&&e==="["?a[f]=b(l):e!=="\\"&&(a[f]=l.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return a.join("")}for(var x=0,m=!1,j=!1,k=0,c=a.length;k<c;++k){var i=a[k];if(i.ignoreCase)j=!0;else if(/[a-z]/i.test(i.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){m=!0;j=!1;break}}for(var r={b:8,t:9, [...]
+f:12,r:13},n=[],k=0,c=a.length;k<c;++k){i=a[k];if(i.global||i.multiline)throw Error(""+i);n.push("(?:"+s(i)+")")}return RegExp(n.join("|"),j?"gi":"g")}function T(a,d){function g(a){var c=a.nodeType;if(c==1){if(!b.test(a.className)){for(c=a.firstChild;c;c=c.nextSibling)g(c);c=a.nodeName.toLowerCase();if("br"===c||"li"===c)s[j]="\n",m[j<<1]=x++,m[j++<<1|1]=a}}else if(c==3||c==4)c=a.nodeValue,c.length&&(c=d?c.replace(/\r\n?/g,"\n"):c.replace(/[\t\n\r ]+/g," "),s[j]=c,m[j<<1]=x,x+=c.length,m [...]
+a)}var b=/(?:^|\s)nocode(?:\s|$)/,s=[],x=0,m=[],j=0;g(a);return{a:s.join("").replace(/\n$/,""),d:m}}function H(a,d,g,b){d&&(a={a:d,e:a},g(a),b.push.apply(b,a.g))}function U(a){for(var d=void 0,g=a.firstChild;g;g=g.nextSibling)var b=g.nodeType,d=b===1?d?a:g:b===3?V.test(g.nodeValue)?a:d:d;return d===a?void 0:d}function C(a,d){function g(a){for(var j=a.e,k=[j,"pln"],c=0,i=a.a.match(s)||[],r={},n=0,e=i.length;n<e;++n){var z=i[n],w=r[z],t=void 0,f;if(typeof w==="string")f=!1;else{var h=b[z.c [...]
+if(h)t=z.match(h[1]),w=h[0];else{for(f=0;f<x;++f)if(h=d[f],t=z.match(h[1])){w=h[0];break}t||(w="pln")}if((f=w.length>=5&&"lang-"===w.substring(0,5))&&!(t&&typeof t[1]==="string"))f=!1,w="src";f||(r[z]=w)}h=c;c+=z.length;if(f){f=t[1];var l=z.indexOf(f),B=l+f.length;t[2]&&(B=z.length-t[2].length,l=B-f.length);w=w.substring(5);H(j+h,z.substring(0,l),g,k);H(j+h+l,f,I(w,f),k);H(j+h+B,z.substring(B),g,k)}else k.push(j+h,w)}a.g=k}var b={},s;(function(){for(var g=a.concat(d),j=[],k={},c=0,i=g.le [...]
+g[c],n=r[3];if(n)for(var e=n.length;--e>=0;)b[n.charAt(e)]=r;r=r[1];n=""+r;k.hasOwnProperty(n)||(j.push(r),k[n]=q)}j.push(/[\S\s]/);s=S(j)})();var x=d.length;return g}function v(a){var d=[],g=[];a.tripleQuotedStrings?d.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?d.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)| [...]
+q,"'\"`"]):d.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&g.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var b=a.hashComments;b&&(a.cStyleComments?(b>1?d.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):d.push(["com",/^#(?:(?:define|e(?:l|nd)if|else|error|ifn?def|include|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),g.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,q])):d. [...]
+/^#[^\n\r]*/,q,"#"]));a.cStyleComments&&(g.push(["com",/^\/\/[^\n\r]*/,q]),g.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));if(b=a.regexLiterals){var s=(b=b>1?"":"\n\r")?".":"[\\S\\s]";g.push(["lang-regex",RegExp("^(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*("+("/(?=[^/*"+b+"])(?:[^/\\x5B\\x5C"+b+"]|\\x5C"+s+"|\\x5B(?:[^\\x5C\\x5D"+b+ [...]
+s+")*(?:\\x5D|$))+/")+")")])}(b=a.types)&&g.push(["typ",b]);b=(""+a.keywords).replace(/^ | $/g,"");b.length&&g.push(["kwd",RegExp("^(?:"+b.replace(/[\s,]+/g,"|")+")\\b"),q]);d.push(["pln",/^\s+/,q," \r\n\t\u00a0"]);b="^.[^\\s\\w.$@'\"`/\\\\]*";a.regexLiterals&&(b+="(?!s*/)");g.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["p [...]
+q],["pun",RegExp(b),q]);return C(d,g)}function J(a,d,g){function b(a){var c=a.nodeType;if(c==1&&!x.test(a.className))if("br"===a.nodeName)s(a),a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)b(a);else if((c==3||c==4)&&g){var d=a.nodeValue,i=d.match(m);if(i)c=d.substring(0,i.index),a.nodeValue=c,(d=d.substring(i.index+i[0].length))&&a.parentNode.insertBefore(j.createTextNode(d),a.nextSibling),s(a),c||a.parentNode.removeChild(a)}}function s(a){function b [...]
+c?a.cloneNode(!1):a,e=a.parentNode;if(e){var e=b(e,1),g=a.nextSibling;e.appendChild(d);for(var i=g;i;i=g)g=i.nextSibling,e.appendChild(i)}return d}for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),d;(d=a.parentNode)&&d.nodeType===1;)a=d;c.push(a)}for(var x=/(?:^|\s)nocode(?:\s|$)/,m=/\r\n?|\n/,j=a.ownerDocument,k=j.createElement("li");a.firstChild;)k.appendChild(a.firstChild);for(var c=[k],i=0;i<c.length;++i)b(c[i]);d===(d|0)&&c[0].setAttribute("value",d);var [...]
+r.className="linenums";for(var d=Math.max(0,d-1|0)||0,i=0,n=c.length;i<n;++i)k=c[i],k.className="L"+(i+d)%10,k.firstChild||k.appendChild(j.createTextNode("\u00a0")),r.appendChild(k);a.appendChild(r)}function p(a,d){for(var g=d.length;--g>=0;){var b=d[g];F.hasOwnProperty(b)?D.console&&console.warn("cannot override language handler %s",b):F[b]=a}}function I(a,d){if(!a||!F.hasOwnProperty(a))a=/^\s*</.test(d)?"default-markup":"default-code";return F[a]}function K(a){var d=a.h;try{var g=T(a.c [...]
+a.a=b;a.d=g.d;a.e=0;I(d,b)(a);var s=/\bMSIE\s(\d+)/.exec(navigator.userAgent),s=s&&+s[1]<=8,d=/\n/g,x=a.a,m=x.length,g=0,j=a.d,k=j.length,b=0,c=a.g,i=c.length,r=0;c[i]=m;var n,e;for(e=n=0;e<i;)c[e]!==c[e+2]?(c[n++]=c[e++],c[n++]=c[e++]):e+=2;i=n;for(e=n=0;e<i;){for(var p=c[e],w=c[e+1],t=e+2;t+2<=i&&c[t+1]===w;)t+=2;c[n++]=p;c[n++]=w;e=t}c.length=n;var f=a.c,h;if(f)h=f.style.display,f.style.display="none";try{for(;b<k;){var l=j[b+2]||m,B=c[r+2]||m,t=Math.min(l,B),A=j[b+1],G;if(A.nodeType! [...]
+t))){s&&(G=G.replace(d,"\r"));A.nodeValue=G;var L=A.ownerDocument,o=L.createElement("span");o.className=c[r+1];var v=A.parentNode;v.replaceChild(o,A);o.appendChild(A);g<l&&(j[b+1]=A=L.createTextNode(x.substring(t,l)),v.insertBefore(A,o.nextSibling))}g=t;g>=l&&(b+=2);g>=B&&(r+=2)}}finally{if(f)f.style.display=h}}catch(u){D.console&&console.log(u&&u.stack||u)}}var D=window,y=["break,continue,do,else,for,if,return,while"],E=[[y,"auto,case,char,const,default,double,enum,extern,float,goto,inl [...]
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],M=[E,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,delegate,dynamic_cast,explicit,export,friend,generic,late_check,mutable,namespace,nullptr,property,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],N=[E,"abstract,assert,boolean,byte,extends,final,finally,implements,import,instanceof,interface,null,native,pack [...]
+O=[N,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,internal,into,is,let,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var,virtual,where"],E=[E,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],P=[y,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,wi [...]
+Q=[y,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],W=[y,"as,assert,const,copy,drop,enum,extern,fail,false,fn,impl,let,log,loop,match,mod,move,mut,priv,pub,pure,ref,self,static,struct,true,trait,type,unsafe,use"],y=[y,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],R=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map [...]
+V=/\S/,X=v({keywords:[M,O,E,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",P,Q,y],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),F={};p(X,["default-code"]);p(C([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%? [...]
+/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);p(C([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["p [...]
+["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);p(C([],[["atv",/^[\S\s]+/]]),["uq.val"]);p(v({keywords:M,hashComments:!0,cStyleComments:!0,types:R}),["c","cc","cpp","cxx","cyc","m"]);p(v({keywords:"null,true,false"}),["json"]);p(v({keywords:O,hashComments:!0,cStyleComments:!0,verbatimString [...]
+["cs"]);p(v({keywords:N,cStyleComments:!0}),["java"]);p(v({keywords:y,hashComments:!0,multiLineStrings:!0}),["bash","bsh","csh","sh"]);p(v({keywords:P,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),["cv","py","python"]);p(v({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:2}),["perl","pl", [...]
+hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb","ruby"]);p(v({keywords:E,cStyleComments:!0,regexLiterals:!0}),["javascript","js"]);p(v({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,throw,true,try,unless,until,when,while,yes",hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);p(v({keywords:W,cStyleComments:!0,multilineStrings:!0}),["rc", [...]
+p(C([],[["str",/^[\S\s]+/]]),["regex"]);var Y=D.PR={createSimpleLexer:C,registerLangHandler:p,sourceDecorator:v,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ",prettyPrintOne:D.prettyPrintOne=function(a,d,g){var b=document.createElement("div");b.innerHTML="<pre>"+a+"</pre>";b=b.firstChild;g&&J(b,g,!0);K({h:d,j [...]
+return b.innerHTML},prettyPrint:D.prettyPrint=function(a,d){function g(){for(var b=D.PR_SHOULD_USE_CONTINUATION?c.now()+250:Infinity;i<p.length&&c.now()<b;i++){for(var d=p[i],j=h,k=d;k=k.previousSibling;){var m=k.nodeType,o=(m===7||m===8)&&k.nodeValue;if(o?!/^\??prettify\b/.test(o):m!==3||/\S/.test(k.nodeValue))break;if(o){j={};o.replace(/\b(\w+)=([\w%+\-.:]+)/g,function(a,b,c){j[b]=c});break}}k=d.className;if((j!==h||e.test(k))&&!v.test(k)){m=!1;for(o=d.parentNode;o;o=o.parentNode)if(f. [...]
+o.className&&e.test(o.className)){m=!0;break}if(!m){d.className+=" prettyprinted";m=j.lang;if(!m){var m=k.match(n),y;if(!m&&(y=U(d))&&t.test(y.tagName))m=y.className.match(n);m&&(m=m[1])}if(w.test(d.tagName))o=1;else var o=d.currentStyle,u=s.defaultView,o=(o=o?o.whiteSpace:u&&u.getComputedStyle?u.getComputedStyle(d,q).getPropertyValue("white-space"):0)&&"pre"===o.substring(0,3);u=j.linenums;if(!(u=u==="true"||+u))u=(u=k.match(/\blinenums\b(?::(\d+))?/))?u[1]&&u[1].length?+u[1]:!0:!1;u&&J [...]
+{h:m,c:d,j:u,i:o};K(r)}}}i<p.length?setTimeout(g,250):"function"===typeof a&&a()}for(var b=d||document.body,s=b.ownerDocument||document,b=[b.getElementsByTagName("pre"),b.getElementsByTagName("code"),b.getElementsByTagName("xmp")],p=[],m=0;m<b.length;++m)for(var j=0,k=b[m].length;j<k;++j)p.push(b[m][j]);var b=q,c=Date;c.now||(c={now:function(){return+new Date}});var i=0,r,n=/\blang(?:uage)?-([\w.]+)(?!\S)/,e=/\bprettyprint\b/,v=/\bprettyprinted\b/,w=/pre|xmp/i,t=/^code$/i,f=/^(?:pre|code [...]
+h={};g()}};typeof define==="function"&&define.amd&&define("google-code-prettify",[],function(){return Y})})();}()
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/paradox.json b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/paradox.json
new file mode 100644
index 00000000..d1b8cb4c
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/paradox.json
@@ -0,0 +1,4 @@
+{
+ "name" : "Apache Pekko Distributed Workers with Scala",
+ "version" : "0.1.0-SNAPSHOT"
+}
\ No newline at end of file
diff --git a/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/print-toc.xslt b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/print-toc.xslt
new file mode 100644
index 00000000..c240f5ab
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-distributed-workers-scala/print-toc.xslt
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="2.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:outline="http://wkhtmltopdf.org/outline"
+ xmlns="http://www.w3.org/1999/xhtml">
+ <xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
+ doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
+ indent="yes" />
+ <xsl:template match="outline:outline">
+ <html>
+ <head>
+ <title>Table of Contents</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/lib/foundation/dist/foundation.min.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/page.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/single.css"/>
+ <link rel="stylesheet" type="text/css" href="file:///opt/paradoxsite/css/print.css"/>
+ </head>
+ <body>
+ <h1>Table of Contents</h1>
+ <nav class="print">
+ <xsl:apply-templates select="outline:item/outline:item">
+ <xsl:with-param name="depth" select="1"/>
+ </xsl:apply-templates>
+ </nav>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="outline:item">
+ <xsl:param name="depth"/>
+ <xsl:comment>Only add the li tags for elements beyond the first depth, so that the roots don't get numbers from our css</xsl:comment>
+ <xsl:choose>
+ <xsl:when test="$depth > 1">
+ <li>
+ <xsl:call-template name="item-inner">
+ <xsl:with-param name="depth" select="$depth"/>
+ </xsl:call-template>
+ </li>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="item-inner">
+ <xsl:with-param name="depth" select="$depth"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template name="item-inner">
+ <xsl:param name="depth"/>
+ <xsl:if test="@title!=''">
+ <div class="toc-page-line">
+ <a>
+ <xsl:if test="@link">
+ <xsl:attribute name="href"><xsl:value-of select="@link"/></xsl:attribute>
+ </xsl:if>
+ <xsl:if test="@backLink">
+ <xsl:attribute name="name"><xsl:value-of select="@backLink"/></xsl:attribute>
+ </xsl:if>
+ <xsl:value-of select="@title" />
+ </a>
+ <span class="toc-page-no"> <xsl:value-of select="@page" /> </span>
+ </div>
+ </xsl:if>
+ <xsl:if test="$depth < 5">
+ <ul>
+ <xsl:comment>added to prevent self-closing tags in QtXmlPatterns</xsl:comment>
+ <xsl:apply-templates select="outline:item">
+ <xsl:with-param name="depth" select="$depth + 1"/>
+ </xsl:apply-templates>
+ </ul>
+ </xsl:if>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/fonts/icons.eot b/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/fonts/icons.eot
new file mode 100644
index 00000000..a5203e87
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/fonts/icons.eot differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/fonts/icons.svg b/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/fonts/icons.svg
new file mode 100644
index 00000000..58c74882
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/fonts/icons.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by Fontastic.me</metadata>
+<defs>
+<font id="icons" horiz-adv-x="512">
+<font-face font-family="icons" units-per-em="512" ascent="480" descent="-32"/>
+<missing-glyph horiz-adv-x="512" />
+
+<glyph unicode="§" d="M202 136c5 5 10 7 17 7 7 0 13-2 19-7 10-11 10-23 0-36 0 0-22-20-22-20-19-19-42-29-68-29-26 0-49 10-68 29-19 19-29 42-29 67 0 27 10 50 29 69 0 0 76 76 76 76 24 23 48 36 73 39 26 3 47-4 66-22 5-5 8-11 8-18 0-7-3-13-8-19-12-11-24-11-36 0-17 17-40 11-68-17 0 0-75-75-75-75-9-9-14-20-14-33 0-13 5-23 14-31 9-9 19-14 32-14 13 0 23 5 32 14 0 0 22 20 22 20m230 294c19-19 29-42 29-68 0-26-10-49-29-68 0 0-81-81-81-81-25-25-51-37-77-37-21 0-40 9-57 26-5 5-7 10-7 17 0 7 2 13 [...]
+<glyph unicode="⌂" d="M480 249c6-6 8-10 6-14-2-4-6-6-14-6 0 0-43 0-43 0 0 0 0-158 0-158 0-5 0-9 0-11-1-2-2-5-4-7-3-2-7-3-12-3 0 0-105 0-105 0 0 0 0 159 0 159 0 0-104 0-104 0 0 0 0-159 0-159 0 0-99 0-99 0-10 0-16 2-18 5-3 4-4 9-4 16 0 0 0 158 0 158 0 0-43 0-43 0-7 0-12 2-14 6-1 4 0 8 6 14 0 0 205 206 205 206 5 5 12 8 19 8 8 0 14-3 20-8 0 0 204-206 204-206"/>
+</font></defs></svg>
diff --git a/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/fonts/icons.ttf b/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/fonts/icons.ttf
new file mode 100644
index 00000000..6da4b13e
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/fonts/icons.ttf differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/fonts/icons.woff b/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/fonts/icons.woff
new file mode 100644
index 00000000..2c7e917b
Binary files /dev/null and b/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/fonts/icons.woff differ
diff --git a/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/page.css b/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/page.css
new file mode 100644
index 00000000..7be66ced
--- /dev/null
+++ b/content/docs/pekko-samples/current/pekko-sample-fsm-java/css/page.css
@@ -0,0 +1,965 @@
+@charset "UTF-8";
+
+/* fonts */
+
+@font-face {
+ font-family: "icons";
+ src:url("fonts/icons.eot");
+ src:url("fonts/icons.eot?#iefix") format("embedded-opentype"),
+ url("fonts/icons.woff") format("woff"),
+ url("fonts/icons.ttf") format("truetype"),
+ url("fonts/icons.svg#icons") format("svg");
+ font-weight: normal;
+ font-style: normal;
+}
+
+/* body */
+
+body {
+ background: #fff;
+ padding: 0;
+ margin: 0;
+ font-weight: 400;
+ font-style: normal;
+ line-height: 1.4em;
+ position: relative;
+ cursor: default;
+ font: 1em "Roboto", "Helvetica Neue", "Helvetica", Arial, sans-serif;
+ color: #333333;
+ font-smoothing: antialiased;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-size-adjust: none;
+ text-rendering: optimizeLegibility;
+}
+
+/* headers */
+
+h1 {
+ font-family: inherit;
+ font-size: 2.6em;
+ font-weight: 300;
+ color: #333333;
+ margin-bottom: 0.4em;
+ margin-top: 1.1em;
+}
+
+h1:first-child {
+ margin-top: 0;
+}
+
+h2 {
+ font-family: inherit;
+ font-size: 1.8em;
+ font-weight: 400;
+ color: #333333;
+ margin-bottom: 0.2em;
+ margin-top: 1.3em;
+}
+
+h2:first-child {
+ margin-top: 0;
+}
+
+h3 {
+ font-family: inherit;
+ font-size: 1.125em;
+ font-weight: 700;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h3:first-child {
+ margin-top: 0;
+}
+
+h4 {
+ font-family: inherit;
+ font-size: 1em;
+ font-weight: 700;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h4:first-child {
+ margin-top: 0;
+}
+
+h5 {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h5:first-child {
+ margin-top: 0;
+}
+
+h6 {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ margin-top: 1.3em;
+}
+
+h6:first-child {
+ margin-top: 0;
+}
+
+/* text */
+
+p {
+ font-family: inherit;
+ font-size: 1em;
+ color: #333333;
+ line-height: 1.45em;
+ margin: 1em 0em;
+}
+
+/* links */
+
+a {
+ font-family: inherit;
+ color: #4078c0;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+a:link {
+ color: #4078c0;
+}
+
+a:visited {
+ color: #4078c0;
+}
+
+a:hover {
+ color: #4078c0;
+ text-decoration: underline;
+}
+
+a:active {
+ color: #4078c0;
+}
+
+/* header anchors */
+
+a.anchor .anchor-link:before {
+ content: "§";
+}
+
+.site-content .page-content .prettyprint .snippet-button {
+ float: right;
+ text-decoration: none;
+ font-size: 0.75rem;
+ font-weight: bold;
+ font-family: "Roboto", "Helvetica Neue", "Helvetica", Arial, sans-serif;
+ speak: none;
+ color: #4078c0;
+ border: 2px solid #e5e6e4;
+ padding: 4px 4px;
+ margin-left: 8px;
+ line-height: 1.2;
+ vertical-align: middle;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.site-content .page-content .prettyprint .snippet-button:hover {
+ background-color: #e5e6e4;
+ border: 2px solid #4078c0;
+}
+
+a.anchor .anchor-link {
+ font-size: 18px;
+ font-family: "icons" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1.2;
+ vertical-align: middle;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor {
+ visibility: hidden;
+ position: absolute;
+ display: block;
+ width: 30px;
+ margin-left: -30px;
+ padding-right: 3px;
+ text-align: right;
+ text-decoration: none;
+}
+
+h1:hover > a.anchor, h2:hover > a.anchor, h3:hover > a.anchor, h4:hover > a.anchor, h5:hover > a.anchor, h6:hover > a.anchor {
+ visibility: visible;
+ color: inherit;
+ text-decoration: none;
+}
+
+
+/* table */
+
+table th {
+ background: #ffffff;
+ border: solid 1px #dddddd;
+}
+
+table td {
+ background: #ffffff;
+ border: solid 1px #dddddd;
+}
+
+/* code */
+
+pre {
+ padding: 1rem !important;
+ border: 1px solid #dddddd !important;
+ margin: 0 0 1rem 0 !important;
+ white-space: pre;
+ overflow: auto;
+ line-height: 0.9em !important;
+}
+
+code {
+ line-height: 1.45em !important;
+ font-family: Consolas, "Liberation Mono", Courier, monospace;
+ font-size: 0.85em !important;
+ font-weight: normal !important;
+ padding: 0 !important;
+}
+
+pre > code {
+ background: none;
+ border: none;
+}
+
+p code {
+ border: none;
+ color: #0c323b;
+ padding: 0 0.2em !important;
+}
+
+li code {
+ border: none;
+ color: #0c323b;
+ padding: 0 0.2em !important;
+}
+
+/* Github-like */
+
+pre.prettyprint span.str {
+ color: #183691;
+}
+pre.prettyprint span.kwd {
+ color: #000000;
+ font-weight: bold;
+}
+pre.prettyprint span.com {
+ color: #999988;
+ font-style: italic;
+}
+pre.prettyprint span.typ {
+ color: #445588;
+ font-weight: bold;
+}
+pre.prettyprint span.lit {
+ color: #009999
+}
+pre.prettyprint span.pun {
+ color: #000000;
+ font-weight: bold;
+}
+pre.prettyprint span.pln {
+ color: #000000
+}
+pre.prettyprint span.tag {
+ color: navy
+}
+pre.prettyprint span.atn {
+ color: teal
+}
+pre.prettyprint span.atv {
+ color: #dd1144
+}
+pre.prettyprint span.dec {
+ color: #990000
+}
+pre.prettyprint span.var {
+ color: #000000
+}
+pre.prettyprint span.fun {
+ color: #990000
+}
+
+/* tabbed code snippets */
+
+dl.tabbed {
+ position: relative;
+}
+
+dl.tabbed dt {
+ float: left;
+ display: inline-block;
+ position: relative;
+ left: 1px;
+ margin-left: -1px;
+}
+
+dl.tabbed dt.current {
+ z-index: 2;
+}
+
+dl.tabbed dt a {
+ display: block;
+ border: 1px solid #f7f7f7;
+ padding: 0 20px;
+ height: 30px;
+ line-height: 2;
+ color: #4078c0;
+ text-decoration: none;
+}
+
+dl.tabbed dt a:hover {
+ background: #f7f7f7;
+}
+
+dl.tabbed dt.first a {
+ border-top-left-radius: 5px;
+}
+
+dl.tabbed dt.last a {
+ border-top-right-radius: 5px;
+}
+
+dl.tabbed dt.current a {
+ background-color: #f7f7f7;
+ border-color: #dddddd;
+ border-bottom: 0;
+ padding-bottom: 1px;
+}
+
+dl.tabbed dt.current a {
+ color: #0c323b;
+ outline: none;
+}
+
+dl.tabbed dd {
+ position: absolute;
+ width: 100%;
+ left: 0;
+ top: 29px;
+}
+
+dl.tabbed dd.current {
+ z-index: 1;
+}
+
+dl.tabbed dd pre {
+ border-top-left-radius: 0 !important;
+}
+
+dl.tabbed dd.has-note pre {
+ border-bottom: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+dl.tabbed dd.has-note blockquote {
+ color: #0c323b;
+ border: solid #dddddd;
+ border-width: 1px 1px 1px 10px;
+ border-bottom-left-radius: 5px;
+ border-bottom-right-radius: 5px;
+ margin-top: 0;
+ font-style: italic;
+}
+
+/* blockquotes */
+
+blockquote {
+ border-left: 4px solid rgb(221, 221, 221);
+ margin: 1.5em 0;
+ padding: 1em 20px;
+ color: rgb(119, 119, 119);
+ line-height: 1.4em;
+}
+
+blockquote p {
+ margin: 0;
+ line-height: 1.4em;
+}
+
+blockquote p ~ p {
+ margin-top: 1em;
+}
+
+blockquote p code {
+ background: #fff;
+ padding-right: 0.4em !important;
+}
+
+/* callout */
+
+.callout {
+ border: none;
+ border-left: 10px solid #4078c0;
+ background-color: rgba(64, 120, 192, 0.1);
+}
+
+.callout.warning {
+ border-color: #DB504A;
+ background-color: #fff3d9;
+}
+
+.callout .callout-title {
+ font-weight: bold;
+ margin-bottom: 0.33em;
+}
+
+.callout div ~ p {
+ margin-top: 0;
+}
+
+.callout p ~ p {
+ margin-top: 1em;
+ margin-bottom: 0;
+}
+
+.callout p code {
+ background: #fff;
+ padding-right: 0.4em !important;
+}
+
+/* footnotes */
+
+small {
+ display: block;
+}
+
+/* logo links */
+
+.logo .svg-icon-logo {
+ height: 24px;
+ width: 112px;
+}
+
+.logo:hover {
+ text-decoration: none;
+}
+
+.svg-icon-logo .svg-icon-logo-text {
+ fill: #ffffff;
+}
+
+.logo:hover .svg-icon-logo .svg-icon-logo-text {
+ fill: #4078C0;
+}
+
+/* site header */
+
+.site-header {
+ background: #fcfcfc;
+ border-bottom: solid 1px #cccccc;
+}
+
+.site-header .title {
+ display: inline-block;
+ float: left;
+ height: 70px;
+ line-height: 70px;
+ font-weight: 400;
+ font-size: 1.4em;
+}
+
+.site-header .title a:link, .site-header .title a:visited {
+ color: #515151;
+}
+
+.site-header .title a:hover {
+ color: #515151;
+ text-decoration: none;
+}
+
+.site-header .off-canvas-toggle {
+ float: left;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu {
+ height: 40px;
+ width: 40px;
+ margin-top: 1rem;
+ margin-right: 1rem;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu .svg-icon-menu-path {
+ fill: #000;
+}
+
+.site-header .off-canvas-toggle .svg-icon-menu:hover .svg-icon-menu-path {
+ fill: #4183C4;
+}
+
+.site-header .logo {
+ float: right;
+ margin-top: 1rem;
+ text-align: right;
+ color: #000;
+}
+
+/* page header */
+
+.page-header {
+ background: #ffffff;
+ margin-top: 1rem;
+}
+
+.page-header .nav-breadcrumbs {
+ border-bottom: 1px solid #c2d2dc;
+}
+
+.page-header .nav-breadcrumbs ul {
+ display: block;
+ overflow: hidden;
+ margin: 0;
+ padding: 15px;
+ list-style: none;
+ font-size: 0.9em;
+}
+
+.page-header .nav-breadcrumbs li {
+ float: left;
+ margin: 0;
+}
+
+.page-header .nav-breadcrumbs li:before {
+ content: "/";
+ margin: 0 5px;
+ color: #c2d2dc;
+}
+
+.page-header .nav-breadcrumbs li:first-child:before {
+ content: "";
+ margin: 0;
+}
+
+.page-header .nav-breadcrumbs li a {
+ color: #4078c0;
+ font-weight: normal;
+}
+
+/* content */
+
+.site-content .row {
+ max-width: 90rem;
+}
+
+.page-content {
+ background: #ffffff;
+ min-height: 600px;
+ padding: 2.5rem 0;
+}
+
+/* sidebar */
+
+.sidebar {
+ background: #ffffff;
+ width: 100%;
+ padding: 0;
+}
+
+.sidebar .nav-toc {
+ padding-top: 1rem;
+}
+
+/* navigation */
+
+.nav-home {
+ background: #f7f7f7;
+ line-height: 2rem;
+}
+
+.nav-home a {
+ display: block;
+ color: #4078c0;
+ font-weight: bold;
+ font-size: 1rem;
+ padding-left: 1rem;
+}
+
+.nav-home a.active {
+ background: #e7e7e7;
+}
+
+.nav-home a:hover {
+ background: #e7e7e7;
+ text-decoration: none;
+}
+
+.nav-home a .home-icon {
+ font-size: 18px;
+ font-family: "icons" !important;
+ font-style: normal !important;
+ font-weight: normal !important;
+ font-variant: normal !important;
+ text-transform: none !important;
+ speak: none;
+ line-height: 1.2;
+ vertical-align: middle;
+ padding-right: 5px;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.nav-home .version-number {
+ padding-left: 1.4rem;
+ font-size: 0.9rem;
+}
+
+.nav-toc {
+}
+
+.nav-toc ul {
+ margin: 0;
+ padding: 0;
+ line-height: 2rem;
+}
+
+.nav-toc ul > li {
... 11675 lines suppressed ...
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pekko.apache.org
For additional commands, e-mail: commits-help@pekko.apache.org