]> juplo.de Git - website/commitdiff
Moved Hugo-Content to the root of the project
authorKai Moritz <kai@juplo.de>
Wed, 17 Dec 2025 20:17:02 +0000 (21:17 +0100)
committerKai Moritz <kai@juplo.de>
Wed, 17 Dec 2025 20:17:02 +0000 (21:17 +0100)
507 files changed:
.gitignore
archetypes/default.md [new file with mode: 0644]
content/archives.md [new file with mode: 0644]
content/pages/blog/index.md [new file with mode: 0644]
content/pages/front/index.md [new file with mode: 0644]
content/pages/projects/index.md [new file with mode: 0644]
content/posts/a-perfect-outline.md [new file with mode: 0644]
content/posts/actuator-httptrace-does-not-work-with-spring-boot-2-2.md [new file with mode: 0644]
content/posts/arbeitspaket-a-entwicklung-eines-facebook-crawlers.md [new file with mode: 0644]
content/posts/aspectj-maven-plugin-can-not-compile-valid-java-7-0-code.md [new file with mode: 0644]
content/posts/bidirectional-association-with-elementcollection.md [new file with mode: 0644]
content/posts/bypassing-the-same-origin-policiy-for-loal-files-during-development.md [new file with mode: 0644]
content/posts/cat-any-file-in-any-commit-with-git.md [new file with mode: 0644]
content/posts/changes-in-log4j-properties-are-ignored-when-running-sl4fj-under-tomcat.md [new file with mode: 0644]
content/posts/combining-jetty-maven-plugin-and-wro4j-maven-plugin-for-dynamic-reloading-of-less-resources.md [new file with mode: 0644]
content/posts/compare-two-files-in-different-branches-with-git.md [new file with mode: 0644]
content/posts/configure-https-for-jetty-maven-plugin-9-0-x.md [new file with mode: 0644]
content/posts/configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login.md [new file with mode: 0644]
content/posts/create-a-simulated-network-as-docker-does-it.md [new file with mode: 0644]
content/posts/create-self-signed-multi-domain-san-certificates.md [new file with mode: 0644]
content/posts/debugging-the-oauth-flow-in-spring-security.md [new file with mode: 0644]
content/posts/deduplicating-partitioned-data-with-kafka-streams.md [new file with mode: 0644]
content/posts/der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen.md [new file with mode: 0644]
content/posts/develop-a-facebook-app-with-spring-social-part-00.md [new file with mode: 0644]
content/posts/develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes.md [new file with mode: 0644]
content/posts/develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works.md [new file with mode: 0644]
content/posts/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source.md [new file with mode: 0644]
content/posts/develop-a-facebook-app-with-spring-social-part-04-signing-in-users.md [new file with mode: 0644]
content/posts/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic.md [new file with mode: 0644]
content/posts/develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page.md [new file with mode: 0644]
content/posts/develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire.md [new file with mode: 0644]
content/posts/disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can.md [new file with mode: 0644]
content/posts/disable-spring-autowireing-for-junit-tests.md [new file with mode: 0644]
content/posts/enabling-decoupled-template-logic-for-thymeleaf-in-a-spring-boot-app.md [new file with mode: 0644]
content/posts/encrypt-communication-between-kafka-and-zookeeper-with-tls.md [new file with mode: 0644]
content/posts/entwicklung-einer-crowdgestutzten-vertikalen-suchmaschine-fur-veranstaltungen-und-locations.md [new file with mode: 0644]
content/posts/fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun.md [new file with mode: 0644]
content/posts/hibernate-maven-plugin-2-0-0-released.md [new file with mode: 0644]
content/posts/hibernate4-maven-plugin-1-0-1-released.md [new file with mode: 0644]
content/posts/hibernate4-maven-plugin-1-0-2-release.md [new file with mode: 0644]
content/posts/hibernate4-maven-plugin-1-0-3-released.md [new file with mode: 0644]
content/posts/hibernate4-maven-plugin-1-0-4-released.md [new file with mode: 0644]
content/posts/hibernate4-maven-plugin-1-0-5-released.md [new file with mode: 0644]
content/posts/hibernate4-maven-plugin-1-0-released.md [new file with mode: 0644]
content/posts/hibernate4-maven-plugin-1-1-0-released.md [new file with mode: 0644]
content/posts/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations.md [new file with mode: 0644]
content/posts/how-to-instantiatiate-multiple-beans-dinamically-in-spring-boot-based-on-configuration-properties.md [new file with mode: 0644]
content/posts/how-to-keep-the-time-zone-when-deserializing-a-zoneddatetime-with-jackson.md [new file with mode: 0644]
content/posts/how-to-redirect-to-spring-security-oauth-behind-a-gateway-proxy-part-debugging-the-oauth-flow.md [new file with mode: 0644]
content/posts/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway.md [new file with mode: 0644]
content/posts/howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker.md [new file with mode: 0644]
content/posts/implementing-narrow-integrationtests-by-combining-mockserver-with-testcontainers.md [new file with mode: 0644]
content/posts/implementing-the-outbox-pattern-with-kafka-part-0-the-example.md [new file with mode: 0644]
content/posts/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table.md [new file with mode: 0644]
content/posts/implementing-the-outbox-pattern-with-kafka-part-sending-messages-from-the-outbox.md [new file with mode: 0644]
content/posts/in-need-of-a-mockwebclient-mock-webclient-with-a-short-circuit-exchangefunction.md [new file with mode: 0644]
content/posts/install-google-play-on-hama.md [new file with mode: 0644]
content/posts/integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project.md [new file with mode: 0644]
content/posts/java-lang-exception-method-xzy-should-have-no-parameters.md [new file with mode: 0644]
content/posts/lange-ladezeiten-durch-openx-werbebanner-verhindern.md [new file with mode: 0644]
content/posts/log-out-from-wrong-account-with-maven-appengine-plugin.md [new file with mode: 0644]
content/posts/logging-request-and-response-data-from-requets-made-through-resttemplate.md [new file with mode: 0644]
content/posts/parsing-json-from-facebooks-graph-api-using-jackson-x-and-java-s-new-time-api.md [new file with mode: 0644]
content/posts/problems-deploying-a-spring-boot-app-as-war.md [new file with mode: 0644]
content/posts/release-of-a-maven-plugin-to-maven-central-fails-with-error-unknown-tag-goal.md [new file with mode: 0644]
content/posts/replace-text-by-graphic-without-extra-markup.md [new file with mode: 0644]
content/posts/rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml.md [new file with mode: 0644]
content/posts/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj.md [new file with mode: 0644]
content/posts/select-text-content-of-a-tag-with-thymeleaf-s-markup-selection.md [new file with mode: 0644]
content/posts/serve-static-html-with-nodjs-and-grunt.md [new file with mode: 0644]
content/posts/show-spring-boot-auto-configuration-report-when-running-via-mvn-spring-boot-run.md [new file with mode: 0644]
content/posts/subscribe-to-facebook-s-real-time-updates-with-spring-security-oauth.md [new file with mode: 0644]
content/posts/testing-exception-handling-in-spring-mvc.md [new file with mode: 0644]
content/posts/testing-spring-webflux-with-springboottest.md [new file with mode: 0644]
content/posts/the-outbox-pattern-pro-contra-alternatives.md [new file with mode: 0644]
content/posts/unittest-or-integrationtest-a-practical-guide.md [new file with mode: 0644]
content/posts/using-jackson-without-annotations-to-quickly-add-logging-of-object-graphs-as-json.md [new file with mode: 0644]
content/posts/virtual-networking-with-linux-network-namespaces.md [new file with mode: 0644]
content/posts/virtual-networking-with-linux-veth-pairs.md [new file with mode: 0644]
content/posts/virtual-networking-with-linux-virtual-bridges.md [new file with mode: 0644]
content/posts/xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace.md [new file with mode: 0644]
content/search.md [new file with mode: 0644]
data/comments.yaml [new file with mode: 0644]
data/library.yaml [new file with mode: 0644]
generated-2025-11-21-17-29-08/.gitignore [deleted file]
generated-2025-11-21-17-29-08/archetypes/default.md [deleted file]
generated-2025-11-21-17-29-08/content/archives.md [deleted file]
generated-2025-11-21-17-29-08/content/pages/blog/index.md [deleted file]
generated-2025-11-21-17-29-08/content/pages/front/index.md [deleted file]
generated-2025-11-21-17-29-08/content/pages/projects/index.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/a-perfect-outline.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/actuator-httptrace-does-not-work-with-spring-boot-2-2.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/arbeitspaket-a-entwicklung-eines-facebook-crawlers.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/aspectj-maven-plugin-can-not-compile-valid-java-7-0-code.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/bidirectional-association-with-elementcollection.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/bypassing-the-same-origin-policiy-for-loal-files-during-development.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/cat-any-file-in-any-commit-with-git.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/changes-in-log4j-properties-are-ignored-when-running-sl4fj-under-tomcat.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/combining-jetty-maven-plugin-and-wro4j-maven-plugin-for-dynamic-reloading-of-less-resources.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/compare-two-files-in-different-branches-with-git.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/configure-https-for-jetty-maven-plugin-9-0-x.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/create-a-simulated-network-as-docker-does-it.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/create-self-signed-multi-domain-san-certificates.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/debugging-the-oauth-flow-in-spring-security.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/deduplicating-partitioned-data-with-kafka-streams.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-00.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-04-signing-in-users.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/disable-spring-autowireing-for-junit-tests.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/enabling-decoupled-template-logic-for-thymeleaf-in-a-spring-boot-app.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/encrypt-communication-between-kafka-and-zookeeper-with-tls.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/entwicklung-einer-crowdgestutzten-vertikalen-suchmaschine-fur-veranstaltungen-und-locations.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/hibernate-maven-plugin-2-0-0-released.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-1-released.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-2-release.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-3-released.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-4-released.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-5-released.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-released.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-1-0-released.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/how-to-instantiatiate-multiple-beans-dinamically-in-spring-boot-based-on-configuration-properties.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/how-to-keep-the-time-zone-when-deserializing-a-zoneddatetime-with-jackson.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/how-to-redirect-to-spring-security-oauth-behind-a-gateway-proxy-part-debugging-the-oauth-flow.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/implementing-narrow-integrationtests-by-combining-mockserver-with-testcontainers.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/implementing-the-outbox-pattern-with-kafka-part-0-the-example.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/implementing-the-outbox-pattern-with-kafka-part-sending-messages-from-the-outbox.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/in-need-of-a-mockwebclient-mock-webclient-with-a-short-circuit-exchangefunction.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/install-google-play-on-hama.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/java-lang-exception-method-xzy-should-have-no-parameters.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/lange-ladezeiten-durch-openx-werbebanner-verhindern.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/log-out-from-wrong-account-with-maven-appengine-plugin.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/logging-request-and-response-data-from-requets-made-through-resttemplate.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/parsing-json-from-facebooks-graph-api-using-jackson-x-and-java-s-new-time-api.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/problems-deploying-a-spring-boot-app-as-war.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/release-of-a-maven-plugin-to-maven-central-fails-with-error-unknown-tag-goal.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/replace-text-by-graphic-without-extra-markup.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/select-text-content-of-a-tag-with-thymeleaf-s-markup-selection.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/serve-static-html-with-nodjs-and-grunt.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/show-spring-boot-auto-configuration-report-when-running-via-mvn-spring-boot-run.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/subscribe-to-facebook-s-real-time-updates-with-spring-security-oauth.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/testing-exception-handling-in-spring-mvc.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/testing-spring-webflux-with-springboottest.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/the-outbox-pattern-pro-contra-alternatives.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/unittest-or-integrationtest-a-practical-guide.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/using-jackson-without-annotations-to-quickly-add-logging-of-object-graphs-as-json.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/virtual-networking-with-linux-network-namespaces.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/virtual-networking-with-linux-veth-pairs.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/virtual-networking-with-linux-virtual-bridges.md [deleted file]
generated-2025-11-21-17-29-08/content/posts/xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace.md [deleted file]
generated-2025-11-21-17-29-08/content/search.md [deleted file]
generated-2025-11-21-17-29-08/data/comments.yaml [deleted file]
generated-2025-11-21-17-29-08/data/library.yaml [deleted file]
generated-2025-11-21-17-29-08/hugo.yaml [deleted file]
generated-2025-11-21-17-29-08/layouts/partials/comments.html [deleted file]
generated-2025-11-21-17-29-08/layouts/rss.xml [deleted file]
generated-2025-11-21-17-29-08/layouts/shortcodes/audio.html [deleted file]
generated-2025-11-21-17-29-08/layouts/shortcodes/catlist.html [deleted file]
generated-2025-11-21-17-29-08/layouts/shortcodes/gallery.html [deleted file]
generated-2025-11-21-17-29-08/layouts/shortcodes/googlemaps.html [deleted file]
generated-2025-11-21-17-29-08/layouts/shortcodes/parallaxblur.html [deleted file]
generated-2025-11-21-17-29-08/nginx.conf [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/hama_00054807_stock_recovery.jpg [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty-http.xml [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty-https.xml [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty-ssl.xml [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty.keystore [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty.xml [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/05/replace-1.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/05/replace-2.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-01.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-02.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-03.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-04.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-05.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-06.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-07.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-08.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-09.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-10.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-11.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-12.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-13.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-14.html [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2020/03/github-example.jpg [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2020/03/real-life-meme.png [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/2021/02/outbox-pattern-sending-order.png [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/create-ca.sh [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/gencert.sh [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/jks.txt [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/pem.txt [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/settings.conf [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/README.sh [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/consumer.config [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/create-certs.sh [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/gencert.sh [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/java.env [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/kafka-1.properties [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/kafka-2.properties [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/producer.config [deleted file]
generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/zoo.cfg [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/.github/ISSUE_TEMPLATE/bug.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/.github/ISSUE_TEMPLATE/config.yml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/.github/ISSUE_TEMPLATE/enhancement.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/.github/PULL_REQUEST_TEMPLATE.md [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/.github/workflows/gh-pages.yml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/LICENSE [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/README.md [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/404.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/archive.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/footer.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/header.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/main.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/post-entry.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/post-single.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/profile-mode.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/search.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/terms.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/core/license.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/core/reset.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/core/theme-vars.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/core/zmedia.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/extended/blank.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/includes/chroma-mod.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/includes/chroma-styles.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/includes/scroll-bar.css [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/js/fastsearch.js [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/js/fuse.basic.min.js [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/assets/js/license.js [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/go.mod [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ar.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/be.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/bg.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/bn.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ca.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ckb.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/cs.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/da.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/de.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/el.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/en.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/eo.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/es.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/fa.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/fi.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/fr.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/he.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/hi.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/hr.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/hu.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/id.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/it.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ja.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ko.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ku.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/mn.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ms.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/nl.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/no.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/oc.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/pa.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/pl.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/pnb.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/pt.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ro.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ru.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/sk.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/sv.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/sw.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/th.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/tr.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/uk.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/uz.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/vi.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/zh-tw.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/i18n/zh.yaml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/images/screenshot.png [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/images/tn.png [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/404.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/_markup/render-image.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/archives.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/baseof.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/index.json [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/list.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/rss.xml [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/search.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/single.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/terms.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/anchored_headings.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/author.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/breadcrumbs.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/comments.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/cover.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/edit_post.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/extend_footer.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/extend_head.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/footer.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/head.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/header.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/home_info.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/index_profile.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/post_canonical.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/post_meta.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/post_nav_links.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/share_icons.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/social_icons.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/svg.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/templates/_funcs/get-page-images.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/templates/opengraph.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/templates/schema_json.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/templates/twitter_cards.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/toc.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/translation_list.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/robots.txt [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/collapse.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/figure.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/inTextImg.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/ltr.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/rawhtml.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/rtl.html [deleted file]
generated-2025-11-21-17-29-08/themes/PaperMod/theme.toml [deleted file]
hugo.yaml [new file with mode: 0644]
layouts/partials/comments.html [new file with mode: 0644]
layouts/rss.xml [new file with mode: 0644]
layouts/shortcodes/audio.html [new file with mode: 0644]
layouts/shortcodes/catlist.html [new file with mode: 0644]
layouts/shortcodes/gallery.html [new file with mode: 0644]
layouts/shortcodes/googlemaps.html [new file with mode: 0644]
layouts/shortcodes/parallaxblur.html [new file with mode: 0644]
nginx.conf
static/wp-uploads/2014/02/hama_00054807_stock_recovery.jpg [new file with mode: 0644]
static/wp-uploads/2014/02/jetty-http.xml [new file with mode: 0644]
static/wp-uploads/2014/02/jetty-https.xml [new file with mode: 0644]
static/wp-uploads/2014/02/jetty-ssl.xml [new file with mode: 0644]
static/wp-uploads/2014/02/jetty.keystore [new file with mode: 0644]
static/wp-uploads/2014/02/jetty.xml [new file with mode: 0644]
static/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png [new file with mode: 0644]
static/wp-uploads/2015/05/replace-1.html [new file with mode: 0644]
static/wp-uploads/2015/05/replace-2.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-01.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-02.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-03.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-04.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-05.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-06.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-07.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-08.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-09.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-10.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-11.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-12.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-13.html [new file with mode: 0644]
static/wp-uploads/2015/06/example-14.html [new file with mode: 0644]
static/wp-uploads/2020/03/github-example.jpg [new file with mode: 0644]
static/wp-uploads/2020/03/real-life-meme.png [new file with mode: 0644]
static/wp-uploads/2021/02/outbox-pattern-sending-order.png [new file with mode: 0644]
static/wp-uploads/selfsigned+san/create-ca.sh [new file with mode: 0755]
static/wp-uploads/selfsigned+san/gencert.sh [new file with mode: 0755]
static/wp-uploads/selfsigned+san/jks.txt [new file with mode: 0644]
static/wp-uploads/selfsigned+san/pem.txt [new file with mode: 0644]
static/wp-uploads/selfsigned+san/settings.conf [new file with mode: 0644]
static/wp-uploads/zookeeper+tls/README.sh [new file with mode: 0755]
static/wp-uploads/zookeeper+tls/consumer.config [new file with mode: 0644]
static/wp-uploads/zookeeper+tls/create-certs.sh [new file with mode: 0755]
static/wp-uploads/zookeeper+tls/gencert.sh [new file with mode: 0755]
static/wp-uploads/zookeeper+tls/java.env [new file with mode: 0644]
static/wp-uploads/zookeeper+tls/kafka-1.properties [new file with mode: 0644]
static/wp-uploads/zookeeper+tls/kafka-2.properties [new file with mode: 0644]
static/wp-uploads/zookeeper+tls/producer.config [new file with mode: 0644]
static/wp-uploads/zookeeper+tls/zoo.cfg [new file with mode: 0644]
themes/PaperMod/.github/ISSUE_TEMPLATE/bug.yaml [new file with mode: 0644]
themes/PaperMod/.github/ISSUE_TEMPLATE/config.yml [new file with mode: 0644]
themes/PaperMod/.github/ISSUE_TEMPLATE/enhancement.yaml [new file with mode: 0644]
themes/PaperMod/.github/PULL_REQUEST_TEMPLATE.md [new file with mode: 0644]
themes/PaperMod/.github/workflows/gh-pages.yml [new file with mode: 0644]
themes/PaperMod/LICENSE [new file with mode: 0644]
themes/PaperMod/README.md [new file with mode: 0644]
themes/PaperMod/assets/css/common/404.css [new file with mode: 0644]
themes/PaperMod/assets/css/common/archive.css [new file with mode: 0644]
themes/PaperMod/assets/css/common/footer.css [new file with mode: 0644]
themes/PaperMod/assets/css/common/header.css [new file with mode: 0644]
themes/PaperMod/assets/css/common/main.css [new file with mode: 0644]
themes/PaperMod/assets/css/common/post-entry.css [new file with mode: 0644]
themes/PaperMod/assets/css/common/post-single.css [new file with mode: 0644]
themes/PaperMod/assets/css/common/profile-mode.css [new file with mode: 0644]
themes/PaperMod/assets/css/common/search.css [new file with mode: 0644]
themes/PaperMod/assets/css/common/terms.css [new file with mode: 0644]
themes/PaperMod/assets/css/core/license.css [new file with mode: 0644]
themes/PaperMod/assets/css/core/reset.css [new file with mode: 0644]
themes/PaperMod/assets/css/core/theme-vars.css [new file with mode: 0644]
themes/PaperMod/assets/css/core/zmedia.css [new file with mode: 0644]
themes/PaperMod/assets/css/extended/blank.css [new file with mode: 0644]
themes/PaperMod/assets/css/includes/chroma-mod.css [new file with mode: 0644]
themes/PaperMod/assets/css/includes/chroma-styles.css [new file with mode: 0644]
themes/PaperMod/assets/css/includes/scroll-bar.css [new file with mode: 0644]
themes/PaperMod/assets/js/fastsearch.js [new file with mode: 0644]
themes/PaperMod/assets/js/fuse.basic.min.js [new file with mode: 0644]
themes/PaperMod/assets/js/license.js [new file with mode: 0644]
themes/PaperMod/go.mod [new file with mode: 0644]
themes/PaperMod/i18n/ar.yaml [new file with mode: 0644]
themes/PaperMod/i18n/be.yaml [new file with mode: 0644]
themes/PaperMod/i18n/bg.yaml [new file with mode: 0644]
themes/PaperMod/i18n/bn.yaml [new file with mode: 0644]
themes/PaperMod/i18n/ca.yaml [new file with mode: 0644]
themes/PaperMod/i18n/ckb.yaml [new file with mode: 0644]
themes/PaperMod/i18n/cs.yaml [new file with mode: 0644]
themes/PaperMod/i18n/da.yaml [new file with mode: 0644]
themes/PaperMod/i18n/de.yaml [new file with mode: 0644]
themes/PaperMod/i18n/el.yaml [new file with mode: 0644]
themes/PaperMod/i18n/en.yaml [new file with mode: 0644]
themes/PaperMod/i18n/eo.yaml [new file with mode: 0644]
themes/PaperMod/i18n/es.yaml [new file with mode: 0644]
themes/PaperMod/i18n/fa.yaml [new file with mode: 0644]
themes/PaperMod/i18n/fi.yaml [new file with mode: 0644]
themes/PaperMod/i18n/fr.yaml [new file with mode: 0644]
themes/PaperMod/i18n/he.yaml [new file with mode: 0644]
themes/PaperMod/i18n/hi.yaml [new file with mode: 0644]
themes/PaperMod/i18n/hr.yaml [new file with mode: 0644]
themes/PaperMod/i18n/hu.yaml [new file with mode: 0644]
themes/PaperMod/i18n/id.yaml [new file with mode: 0644]
themes/PaperMod/i18n/it.yaml [new file with mode: 0644]
themes/PaperMod/i18n/ja.yaml [new file with mode: 0644]
themes/PaperMod/i18n/ko.yaml [new file with mode: 0644]
themes/PaperMod/i18n/ku.yaml [new file with mode: 0644]
themes/PaperMod/i18n/mn.yaml [new file with mode: 0644]
themes/PaperMod/i18n/ms.yaml [new file with mode: 0644]
themes/PaperMod/i18n/nl.yaml [new file with mode: 0644]
themes/PaperMod/i18n/no.yaml [new file with mode: 0644]
themes/PaperMod/i18n/oc.yaml [new file with mode: 0644]
themes/PaperMod/i18n/pa.yaml [new file with mode: 0644]
themes/PaperMod/i18n/pl.yaml [new file with mode: 0644]
themes/PaperMod/i18n/pnb.yaml [new file with mode: 0644]
themes/PaperMod/i18n/pt.yaml [new file with mode: 0644]
themes/PaperMod/i18n/ro.yaml [new file with mode: 0644]
themes/PaperMod/i18n/ru.yaml [new file with mode: 0644]
themes/PaperMod/i18n/sk.yaml [new file with mode: 0644]
themes/PaperMod/i18n/sv.yaml [new file with mode: 0644]
themes/PaperMod/i18n/sw.yaml [new file with mode: 0644]
themes/PaperMod/i18n/th.yaml [new file with mode: 0644]
themes/PaperMod/i18n/tr.yaml [new file with mode: 0644]
themes/PaperMod/i18n/uk.yaml [new file with mode: 0644]
themes/PaperMod/i18n/uz.yaml [new file with mode: 0644]
themes/PaperMod/i18n/vi.yaml [new file with mode: 0644]
themes/PaperMod/i18n/zh-tw.yaml [new file with mode: 0644]
themes/PaperMod/i18n/zh.yaml [new file with mode: 0644]
themes/PaperMod/images/screenshot.png [new file with mode: 0644]
themes/PaperMod/images/tn.png [new file with mode: 0644]
themes/PaperMod/layouts/404.html [new file with mode: 0644]
themes/PaperMod/layouts/_default/_markup/render-image.html [new file with mode: 0644]
themes/PaperMod/layouts/_default/archives.html [new file with mode: 0644]
themes/PaperMod/layouts/_default/baseof.html [new file with mode: 0644]
themes/PaperMod/layouts/_default/index.json [new file with mode: 0644]
themes/PaperMod/layouts/_default/list.html [new file with mode: 0644]
themes/PaperMod/layouts/_default/rss.xml [new file with mode: 0644]
themes/PaperMod/layouts/_default/search.html [new file with mode: 0644]
themes/PaperMod/layouts/_default/single.html [new file with mode: 0644]
themes/PaperMod/layouts/_default/terms.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/anchored_headings.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/author.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/breadcrumbs.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/comments.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/cover.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/edit_post.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/extend_footer.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/extend_head.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/footer.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/head.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/header.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/home_info.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/index_profile.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/post_canonical.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/post_meta.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/post_nav_links.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/share_icons.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/social_icons.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/svg.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/templates/_funcs/get-page-images.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/templates/opengraph.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/templates/schema_json.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/templates/twitter_cards.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/toc.html [new file with mode: 0644]
themes/PaperMod/layouts/partials/translation_list.html [new file with mode: 0644]
themes/PaperMod/layouts/robots.txt [new file with mode: 0644]
themes/PaperMod/layouts/shortcodes/collapse.html [new file with mode: 0644]
themes/PaperMod/layouts/shortcodes/figure.html [new file with mode: 0644]
themes/PaperMod/layouts/shortcodes/inTextImg.html [new file with mode: 0644]
themes/PaperMod/layouts/shortcodes/ltr.html [new file with mode: 0644]
themes/PaperMod/layouts/shortcodes/rawhtml.html [new file with mode: 0644]
themes/PaperMod/layouts/shortcodes/rtl.html [new file with mode: 0644]
themes/PaperMod/theme.toml [new file with mode: 0644]
wp/juplo.wordpress.2022-03-09.xml [deleted file]

index 434a8b6f7b317bae310687265d210041eea681cd..8373a390e3d2ce1a8ecd177964ce93a9fadcecbb 100644 (file)
@@ -1,6 +1,3 @@
-application.*
-/target/
-.idea/
-nbactions.xml
-thymeroot.iml
-/node_modules/
+/.hugo_build.lock
+/public/
+/resources/
diff --git a/archetypes/default.md b/archetypes/default.md
new file mode 100644 (file)
index 0000000..0d5eebd
--- /dev/null
@@ -0,0 +1,5 @@
+---
+date: '{{ .Date }}'
+draft: true
+title: '{{ replace .File.ContentBaseName "-" " " | title }}'
+---
diff --git a/content/archives.md b/content/archives.md
new file mode 100644 (file)
index 0000000..aaadc43
--- /dev/null
@@ -0,0 +1,7 @@
+
+---
+title: "All"
+layout: "archives"
+url: "/all/"
+summary: archives
+---
diff --git a/content/pages/blog/index.md b/content/pages/blog/index.md
new file mode 100644 (file)
index 0000000..03e3e39
--- /dev/null
@@ -0,0 +1,12 @@
+---
+_edit_last: "3"
+author: tortenheber
+date: "2013-10-10T20:43:16+00:00"
+guid: http://juplo.de/?page_id=108
+parent_post_id: null
+post_id: "108"
+title: Blog
+url: /blog/
+
+---
+
diff --git a/content/pages/front/index.md b/content/pages/front/index.md
new file mode 100644 (file)
index 0000000..4c3bd53
--- /dev/null
@@ -0,0 +1,45 @@
+---
+_edit_last: "3"
+author: tortenheber
+date: "2014-03-11T17:38:46+00:00"
+guid: http://juplo.de/?page_id=271
+parent_post_id: null
+post_id: "271"
+title: FRONT
+url: /
+
+---
+## Funded by the Europian Union
+
+As partner of the company
+[yourSHOUTER UG (haftungsbeschränkt)](http://yourshouter.com "Visit the Homepage of the company")
+we publish results of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Westphalia.
+
+[![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
+
+## About juplo
+
+- [More about juplo](/about.html "Visit my about-pag")
+- [Blog](/blog/ "(Hopefully) helpful stuff")
+- [Projects](/projects/ "All current projects")
+- [Contact](/contact.html "All contact-information on a glance")
+
+## Work In Progress...
+
+Due to lack of time, this page is still under construction.
+
+![Man bashing his head on a computer-keyboard](/img/wip.gif)
+
+So, please be a litle more patiance with us...
+
+
+
+## hibernate-maven-plugin
+
+**A simple Plugin for generating a Database-Schema from Hibernate Mapping-Annotations**
+
+hibernate4-maven-plugin is a plugin for generating a database-schema from your Hibernate-Mappings and create or update your database accordingly. Its main usage is to automatically create and populate a test-database for unit-tests in cooperation with the dbunit-maven-plugin.
+
+[Learn more](/hibernate-maven-plugin/ "Visit the plugin-documentation")
diff --git a/content/pages/projects/index.md b/content/pages/projects/index.md
new file mode 100644 (file)
index 0000000..137b4e4
--- /dev/null
@@ -0,0 +1,45 @@
+---
+_edit_last: "3"
+author: tortenheber
+date: "2014-03-11T17:54:09+00:00"
+guid: http://juplo.de/?page_id=111
+parent_post_id: null
+post_id: "111"
+title: Projects
+url: /projects/
+
+---
+![Comming soon...](/img/comming-soon.png)
+
+**Lorem ipsum** dolor [sit amet](/projects/typo.html), consectetur adipisicing elit, sed do
+eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud [exercitation](/projects/html-experimente.html) ullamco laboris nisi ut
+aliquip ex ea commodo consequat. Duis aute irure dolor in
+reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
+culpa qui officia deserunt mollit anim id est laborum.
+
+## Duis aute irure dolor
+
+- Operators and other mathematical stuff: -+/\*
+- Characters offten used in programming languages: {(<>)}@$?%\*#;:&/\\!^"'\`~
+- Special german characters: ÄäÖöÜü
+- Other special characters: @€¢§%°
+
+## Excepteur sint occaecat cupidatat
+
+Lorem ipsum dolor _sit amet_, consectetur adipisicing elit, sed do
+eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
+ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
+aliquip ex ea commodo consequat. Duis aute irure dolor in
+reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
+culpa qui officia deserunt mollit anim id est laborum.
+
+Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
+eiusmod tempor incididunt ut labore et dolore magna aliqua. **Ut enim**
+**ad minim veniam, quis nostrud _exercitation ullamco_ laboris nisi ut**
+**aliquip ex ea commodo consequat**. Duis aute irure dolor in
+reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
+pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
+culpa qui officia deserunt mollit anim id est laborum.
diff --git a/content/posts/a-perfect-outline.md b/content/posts/a-perfect-outline.md
new file mode 100644 (file)
index 0000000..eda4b71
--- /dev/null
@@ -0,0 +1,720 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - html(5)
+date: "2020-04-10T11:53:39+00:00"
+guid: http://juplo.de/?p=357
+parent_post_id: null
+post_id: "357"
+title: A Perfect Outline
+url: /a-perfect-outline/
+
+---
+## Point Out Your Content: Utilize the HTML5 Outline-Algorithm
+
+HTML5 introduces new semantic elements accompained by the definition of [a new algorithm to calculate the document-outline](https://developer.mozilla.org/de/docs/Web/Guide/HTML/Sections_and_Outlines_of_an_HTML5_document "Read all about the new possibilities to mark up the outline of your document") from the mark up.
+There are plenty of [good explanations](http://www.smashingmagazine.com/2011/08/16/html5-and-the-document-outlining-algorithm/ "This is a very good overview, because it also pointes out, what to watch out for") of these new possibilities, to point out your content in a more controlled way.
+But the most of these explanations fall short, if it comes to how to put these new markup into use, so that it results in a sensible outline of the document, that was marked up.
+
+In this article I will try to explain, how to use the new semantic markup, to produce an outline, that is usable as a real content table of the document - not just as an partially orderd overview of all headings.
+I will do so, by showing simple examples, that will illuminate the principles behind the new markup.
+
+## All Messed Up!
+
+Although, the ideas behind the new markup seems to be simple and clear, nearly nobody accomplishes to produce a sensible outline.
+Even the big players, who [guide us through the jungle of the new specifications](http://www.html5rocks.com/de/ "Great guidance - but bad outline") and are giving [great explanations about the subject](http://www.smashingmagazine.com/2013/01/18/the-importance-of-sections/ "Great explanation - but bad outline"), either fail on there sites (see by yourself with the help of the help of [the h5o HTML5 Outline Bookmarklet](https://h5o.github.io/ "Just drag and drop the bookmarklet to your favorites.")), or produce the outline in the old way by the usage of `h1`- `h6` only, like the fabulous HTML5-bible [Dive Into HTML5](http://diveintohtml5.info/semantics.html#footer-element "A wounderful introduction to the new possibilities of HTML5 - but the tid outline is produced the old way").
+
+This is, because there is a lot to mix up in a wrong way, when trying to adopt the new features.
+Here is, what I ended up with, on my first try to combine what I have learned about [semantic elements](http://www.w3schools.com/html/html5_semantic_elements.asp "Overview of the new semantic elements, available in HTML5") and the [document outline](http://html5doctor.com/outlines/ "An explanation, of what the specs told you about the document outline"):
+
+#### Example 01: Markup
+
+```html
+
+<!DOCTYPE html>
+<title>Example 01</title>
+<header>
+  <h2>Header</h2>
+  <nav>Navigation</nav>
+</header>
+<main>
+  <h1>Main</h1>
+  <section>
+    <h2>Section I</h2>
+  </section>
+  <section>
+    <h2>Section II</h2>
+    <section>
+      <h3>Subsection a</h3>
+    </section>
+    <section>
+      <h3>Subsection b</h3>
+    </section>
+  </section>
+  <section>
+    <h2>Section III</h2>
+    <section>
+      <h3>Subsection a</h3>
+    </section>
+  </section>
+</main>
+<aside>
+  <h1>Aside</h1>
+</aside>
+<footer>
+  <h2>Footer</h2>
+</footer>
+
+```
+
+#### Example 01: Outline
+
+1. Header
+1. _Untitled section_
+1. Main
+1. Section I
+1. Section II
+      1. Subsection a
+      1. Subsection b
+1. Section III
+      1. Subsection a
+1. Aside
+1. Footer
+
+[View example 01](/wp-uploads/2015/06/example-01.html)
+
+That quiet was not the outline, that I had expected.
+I planed, that _Header_, _Main_, _Aside_ and _Footer_ are ending up at the same level.
+Instead of that, _Aside_ and _Footer_ had become sections of my _Main_-content.
+And where the hell comes that _Untitled section_ from?!?
+My first thought on that was: No problem, I just forgot the `header`-tags.
+But after adding them, the only thing that cleared out, was where the _Untitled section_ was coming from:
+
+#### Example 02: Markup
+
+```html
+
+<!DOCTYPE html>
+<title>Example 02</title>
+<header>
+  <h2>Header</h2>
+  <nav>
+    <header><h3>Navigation</h3></header>
+  </nav>
+</header>
+<main>
+  <header><h1>Main</h1></header>
+  <section>
+    <header><h2>Section I</h2></header>
+  </section>
+  <section>
+    <header><h2>Section II</h2></header>
+    <section>
+      <header><h3>Subsection a</h3></header>
+    </section>
+    <section>
+      <header><h3>Subsection b</h3></header>
+    </section>
+  </section>
+  <section>
+    <header><h2>Section III</h2></header>
+    <section>
+      <header><h3>Subsection a</h3></header>
+    </section>
+  </section>
+</main>
+<footer>
+  <header><h2>Footer</h2></header>
+
+```
+
+#### Example 02: Outline
+
+1. Header
+1. Navigation
+1. Main
+1. Section I
+1. Section II
+      1. Subsection a
+      1. Subsection b
+1. Section III
+      1. Subsection a
+1. Aside
+1. Footer
+
+[View example 02](/wp-uploads/2015/06/example-02.html)
+
+So I thought: Maybe the `main`-tag was the wrong choice.
+Perhaps it should be replaced by an `article`.
+But after that change, the outline even got worse.
+Now, _Navigation_, _Main_ and _Aside_ appeared on the same level, all as a subsection of _Header_.
+At least, _Footer_ suddenly was a sibling of _Header_ as planed:
+
+#### Example 03: Markup
+
+```html
+
+<!DOCTYPE html>
+<title>Example 03</title>
+<header>
+  <h2>Header</h2>
+  <nav>
+    <header><h3>Navigation</h333></header>
+  </nav>
+</header>
+<article>
+  <header><h1>Article (Main)</h1></header>
+  <section>
+    <header><h2>Section I</h2></header>
+  </section>
+  <section>
+    <header><h2>Section II</h2></header>
+    <section>
+      <header><h3>Subsection a</h3></header>
+    </section>
+    <section>
+      <header><h3>Subsection b</h3></header>
+    </section>
+  </section>
+  <section>
+    <header><h2>Section III</h2></header>
+    <section>
+      <header><h3>Subsection a</h3></header>
+    </section>
+  </section>
+</article>
+<footer>
+  <header><h2>Footer</h2></header>
+</footer>
+
+```
+
+#### Example 03: Outline
+
+1. Header
+1. Navigation
+1. Main
+      1. Section I
+      1. Section II
+         1. Subsection a
+         1. Subsection b
+      1. Section III
+         1. Subsection a
+1. Aside
+1. Footer
+
+[View example 03](/wp-uploads/2015/06/example-03.html)
+
+After that, I was totally confused and decided, to sort it out step by step.
+That procedure finally gave me the clue, I want to share with you now.
+
+## Step by Step (Uh Baby!)
+
+### Step I: Investigate the Structured Part
+
+Let us start with the strictly structured part of the document: **the article and it's subsections**.
+At first a minimal example with no markup except the `article`\- and the `section`-tags:
+
+#### Example 04: Markup
+
+```html
+
+<!DOCTYPE html>
+<title>Example 04</title>
+<article>
+  Main
+  <section>
+    Section I
+  </section>
+  <section>
+    Section II
+    <section>
+      Subsection a
+    </section>
+    <section>
+      Subsection b
+    </section>
+  </section>
+  <section>
+    Section III
+    <section>
+      Subsection a
+    </section>
+  </section>
+</main>
+
+```
+
+#### Example 04: Outline
+
+1. _Untitled BODY_   1. _Untitled ARTICLE_      1. _Untitled SECTION_
+      1. _Untitled SECTION_         1. _Untitled SECTION_
+         1. _Untitled SECTION_
+      1. _Untitled SECTION_         1. _Untitled SECTION_
+
+[View Example 04](/wp-uploads/2015/06/example-04.html)
+
+Nothing really unexpected here.
+The `article`\- and `section`-tags are reflected in the outline according to their nesting.
+The only thing notably here is, that the `body` itself is also reflected in the outline.
+It appears on its own level as the root-element of all tags.
+We can think of it as the title of our document.
+
+We can add headings of any kind ( `h1`- `h6`) here and will always get an identically structured outline, that reflects the text of our headings.
+If we want to give the body a title, we have to place a heading outside and before any sectioning-elements:
+
+#### Example 05: Markup
+
+```html
+
+<!DOCTYPE html>
+<title>Example 05</title>
+<h1>Page</h1>
+<article>
+  <h1>Article</h1>
+  <section>
+    <h1>Section I</h1>
+  </section>
+  <section>
+    <h1>Section II</h1>
+    <section>
+      <h1>Subsection a</h1>
+    </section>
+    <section>
+      <h1>Subsection b</h1>
+    </section>
+  </section>
+  <section>
+    <h1>Section III</h1>
+    <section>
+      <h1>Subsection a</h1>
+    </section>
+  </section>
+</article>
+
+```
+
+#### Example 05: Outline
+
+1. Page
+1. Article
+      1. Section I
+      1. Section II
+         1. Subsection a
+         1. Subsection b
+      1. Section III
+         1. Subsection a
+
+[View Example 05](/wp-uploads/2015/06/example-05.html)
+
+This is the new part of the outline algorithm introduced in HTML5: _The nesting of elements, that define sections, defines the outline of the document._
+The rank of the heading element is ignored by this algorithm!
+
+Among the elements, that define sections in HTML5 are the `article` and the `section` tags.
+But there are more.
+[I will discuss them later](#sectioning-elemnts "Jump to the explanation of all sectioning-elements now").
+For now, you only have to know, that in HTML5, sectioning elements define the structure of the outline.
+Also, you should memorize, that the outline always has a single root without any siblings: the `body`.
+
+### Step II: Investigate the Page-Elements
+
+So, let us do the same with the tags that represent the different logical sections of a web-page: **the page-elements**.
+We start with a minimal example again, that contains no markup except the `header`\- the `main` and the `footer`-tags:
+
+#### Example 06: Markup
+
+```html
+
+<!DOCTYPE html>
+<title>Example 06</title>
+<header>Page</header>
+<main>Main</main>
+<footer>Footer</footer>
+
+```
+
+#### Example 06: Outline
+
+1. _Untitled BODY_
+
+[View Example 06](/wp-uploads/2015/06/example-06.html)
+
+That is wired, ehh?
+There is only one untitled element in the outline.
+The explanation for this is, that neither the `header`\- nor the `main`\- nor the `footer`-tag belong to the elements, that define a section in HTML5!
+This is often confused, because these elements define _the logical sections_ (header – main-content – footer) of a website.
+But these logical sections do not have to do anything with the structural sectioning of the document, that defines the outline.
+
+### Step III: Investigate the Headings
+
+So, what happens, if we add the desired markup for our headings?
+We want a `h1`-heading for our main-content, because it is the important part of our page.
+The header should have a `h2`-heading and the footer a `h3`-heading, because it is rather unimportant.
+
+#### Example 07: Markup
+
+```html
+
+<!DOCTYPE html>
+<title>Example 07</title>
+<header><h2>Page</h2></header>
+<main><h1>Main</h1></main>
+<footer><h3>Footer</h3></footer>
+
+```
+
+#### Example 07: Outline
+
+1. Page
+1. Main
+1. Footer
+
+[View Example 07](/wp-uploads/2015/06/example-07.html)
+
+Now, there is an outline again.
+But why?
+And why is it looking this way?
+
+What happens here, is [implicit sectioning](https://developer.mozilla.org/de/docs/Web/Guide/HTML/Sections_and_Outlines_of_an_HTML5_document#Implicit_Sectioning "Read all about implicit sectioning").
+In short, implicit sectioning is the outline algorithm of HTML4.
+HTML5 needs implicit sectioning, to keep compatible with HTML4, which still dominates the web.
+In fact, we could have used plain HTML4, with `div` instead of `header`, `main` and `footer`, and it would have yield the exact same outline:
+
+#### Example 08: Markup
+
+```html
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+  <head><title>Example 08</title></head>
+  <body>
+    <div class="header"><h2>Page</h2></div>
+    <div class="main"><h1>Main</h1></div>
+    <div class="footer"><h3>Footer</h3></div>
+  </body>
+</html>
+
+```
+
+#### Example 08: Outline
+
+1. Page
+1. Main
+1. Footer
+
+[View Example 08](/wp-uploads/2015/06/example-08.html)
+
+In HTML4, solely the headings ( `h1`- `h6`) define the outline of a document.
+The enclosing elements or any nesting of them are ignored altogether.
+The level, at which a heading appears in the outline, is defined by the rank of the heading alone.
+(Strictly speaking, HTML4 does not define anything like a document outline.
+But as a result of the common usage and interpretation, this is, how people outline their documents with HTML4.)
+
+The implicit sectioning of HTML5 works in a way, that is backward compatible with this way of outlining, but closes the gaps in the resulting hierarchy:
+_Each heading implicitly opens a section – hence the name –, but if there is a gap between its rank and the rank of its ancestor – that is the last preceding heading with a higher rank – it is placed in the level directly beneath its ancestor_:
+
+#### Example 09: Markup
+
+```html
+
+<!DOCTYPE html>
+<title>Example 09</title>
+<h4>h4</h4>
+<h2>h2</h2>
+<h4>h4</h4>
+<h3>h3</h3>
+<h2>h2</h2>
+<h1>h1</h1>
+<h2>h2</h2>
+<h3>h3</h3>
+
+```
+
+#### Example 09: Outline
+
+1. h4
+1. h2
+1. h4
+1. h3
+1. h2
+1. h1
+1. h2
+      1. h3
+
+[View Example 09](/wp-uploads/2015/06/example-09.html)
+
+See, how the first heading `h4` ends up on the same level as the second, which is a `h2`.
+Or, how the third and fourth headings are both on the same level under the `h2`, although they are of different rank.
+And note, how the `h2` and `h3` end up on different sectioning-levels as their earlier appearances, if they follow a `h1` in the natural order.
+
+### Step IV: Mixing it all together
+
+With the gathered clues in mind, we can now retry to layout our document with the desired outline.
+If we want, that _Header_, _Main_ and _Footer_ end up as top level citizens in our planed outline, we simply have to achieve, that they are all recognized as sections under the top level by the HTML5 outline algorithm.
+We can do that, by explicitly stating, that the `header` and the `footer` are section:
+
+#### Example 10: Markup
+
+```html
+
+<!DOCTYPE html>
+<title>Example 10</title>
+<header>
+  <section>
+    <h2>Main</h2>
+  </section>
+</header>
+<main>
+  <article>
+    <h1>Article</h1>
+    <section>
+      <h2>Section I</h2>
+    </section>
+    <section>
+      <h2>Section II</h2>
+      <section>
+        <h3>Subsection a</h3>
+      </section>
+      <section>
+        <h3>Subsection b</h3>
+      </section>
+    </section>
+    <section>
+      <h2>Section III</h2>
+      <section>
+        <h3>Subsection a</h3>
+      </section>
+    </section>
+  </article>
+</main>
+<footer>
+  <section>
+    <h3>Footer</h3>
+  </section>
+</footer>
+
+```
+
+#### Example 10: Outline
+
+1. _Untitled BODY_   1. Main
+1. Article
+      1. Section I
+      1. Section II
+         1. Subsection a
+         1. Subsection b
+      1. Section III
+         1. Subsection a
+1. Footer
+
+[View Example 10](/wp-uploads/2015/06/example-10.html)
+
+So far, so good.
+But what about the untitled body?
+We forgot about the single root of any outline, that is defined by the body, how we learned back in [step 1](#step-01 "Jump back to step 1, if you do not remember..."). As shown in [example 05](#example-05 "Revisit example 5"), we can simply name that by putting a heading outside and before any element, that defines a section:
+
+#### Example 11: Markup
+
+```html
+
+<!DOCTYPE html>
+<title>Example 11</title>
+<header>
+  <h2>Page</h2>
+  <section>
+    <h3>Header</h3>
+  </section>
+</header>
+<main>
+  <article>
+    <h1>Article</h1>
+    <section>
+      <h2>Section I</h2>
+    </section>
+    <section>
+      <h2>Section II</h2>
+      <section>
+        <h3>Subsection a</h3>
+      </section>
+      <section>
+        <h3>Subsection b</h3>
+      </section>
+    </section>
+    <section>
+      <h2>Section III</h2>
+      <section>
+        <h3>Subsection a</h3>
+      </section>
+    </section>
+  </article>
+</main>
+<footer>
+  <section>
+    <h3>Footer</h3>
+  </section>
+</footer>
+
+```
+
+#### Example 11: Outline
+
+1. _Page_   1. Header
+1. Main
+      1. Section I
+      1. Section II
+         1. Subsection a
+         1. Subsection b
+      1. Section III
+         1. Subsection a
+1. Footer
+
+[View Example 11](/wp-uploads/2015/06/example-11.html)
+
+### Step V: Be Aware, Which Elements Define Sections
+
+The eagle-eyed among you might have noticed, that I had "forgotten" the two element-types `nav` and `aside`, when we were investigating the elements, that define the logical structure of the page in [step 2](#step-2 "Revisit step 2").
+I did not forgot about these – I left them out intentionally.
+Because otherwise, the results of [example 07](#example-07 "Revisit example 07") would have been too confusing, to made my point about implicit sectioning.
+Let us look, what would have happend:
+
+#### Example 12: Markup
+
+```html
+
+<!DOCTYPE html>
+<title>Example 12</title>
+<header>
+  <h1>Page</h1>
+  <nav><h1>Navigation</h1></nav>
+</header>
+<main><h1>Main</h1></main>
+<aside><h1>Aside</h1></aside>
+<footer><h1>Footer</h1></footer>
+
+```
+
+#### Example 07: Outline
+
+1. Page
+1. Navigation
+1. Main
+1. Aside
+1. Footer
+
+[View Example 12](/wp-uploads/2015/06/example-12.html)
+
+What is wrong there?
+Why are _Navigation_ and _Aside_ showing up as children, albeit we marked up every element with headings of the same rank?
+The reason for this is, that `nav` and `aside` are sectioning elements:
+
+#### Example 12: Markup
+
+```html
+
+<!DOCTYPE html>
+<title>Example 13</title>
+<header>
+  Page
+  <nav>Navigation</nav>
+</header>
+<main>Main</main>
+<aside>Aside</aside>
+<footer>Footer</footer>
+
+```
+
+#### Example 07: Outline
+
+1. _Untitled BODY_   1. _Untitled NAV_
+1. _Untitled ASIDE_
+
+[View Example 13](/wp-uploads/2015/06/example-13.html)
+
+The HTML5 spec defines four [sectioning elements](http://www.w3.org/WAI/GL/wiki/Using_HTML5_section_elements "Read about the intended use of these sectioning elements"): `article`, `section`, `nav` and `aside`!
+Some explain the confusion about this fact with the constantly evolving standard, that leads to [structurally unclear specifications](http://www.smashingmagazine.com/2013/01/18/the-importance-of-sections/#cad-middle "Jump to this rather lame excuse in an otherwise great article").
+I will be frank:
+_I cannot imagine any good reason for this decision!_
+In my opinion, the concept would be much clearer, if `article` and `section` would be the only two sectioning elements and `nav` and `aside` would only define the logical structure of the page, like `header` and `footer`.
+
+## Putting It All Together
+
+Knowing, that `nav` and `aside` will define sections, we now can complete our outline skillfully avoiding the appearance of untitled sections:
+
+#### Example 14: Markup
+
+```html
+
+<!DOCTYPE html>
+<title>Example 14</title>
+<header>
+  <h2>Page</h2>
+  <section>
+    <h3>Header</h3>
+    <nav><h4>Navigation</h4></nav>
+  </section>
+</header>
+<main>
+  <article>
+    <h1>Main</h1>
+    <section>
+      <h2>Section I</h2>
+    </section>
+    <section>
+      <h2>Section II</h2>
+      <section>
+        <h3>Subsection a</h3>
+      </section>
+      <section>
+        <h3>Subsection b</h3>
+      </section>
+    </section>
+    <section>
+      <h2>Section III</h2>
+      <section>
+        <h3>Subsection a</h3>
+      </section>
+    </section>
+  </article>
+</main>
+<aside><h3>Aside</h3></aside>
+<footer>
+  <section>
+    <h3>Footer</h3>
+  </section>
+</footer>
+
+```
+
+#### Example 14: Outline
+
+1. _Page_   1. Header
+      1. Navigation
+1. Main
+      1. Section I
+      1. Section II
+         1. Subsection a
+         1. Subsection b
+      1. Section III
+         1. Subsection a
+1. Aside
+1. Footer
+
+[View Example 14](/wp-uploads/2015/06/example-14.html)
+
+_Et voilà: Our Perfect Outline!_
+
+If you memorize the concepts, that you have learned in this little tutorial, you should now be able to mark up your documents to generate _your perfect outline_...
+
+...but: one last word about headings:
+
+## A Word On The Ranks Of The Headings
+
+It is crucial to note, that [the new outline-algorithm still is a fiction](http://www.paciellogroup.com/blog/2013/10/html5-document-outline/ "Read, why it may be dangerous, to miss that it is not yet real"): most user agents do not implement the algorithm yet.
+Hence, you still should stick to the old [hints for keeping your content accessible](https://dequeuniversity.com/assets/html/jquery-summit/html5/slides/headings.html "Tipps, how to create a logical outline of your document the old way") and point out the most important heading to the search engines.
+
+But there is no reason, not to apply the new possibilities shown in this article to your markup: it will only make it more feature-proof.
+It is very likely, that [search engines will start to adopt the HTML5 outline algorithm](http://html5doctor.com/html5-seo-search-engine-optimisation/ "Read more about, what search engines already pick up from the new fruits, that HTML5 has to offer"), to make more sense out of your content in near feature - or are already doing so...
+So, why not be one of the first, to gain from that new technique.
+
+_I would advise you, to adopt the new possibilities to section your content and generate a sensible outline, while still keeping the old heading ranks to be backward compatible._
diff --git a/content/posts/actuator-httptrace-does-not-work-with-spring-boot-2-2.md b/content/posts/actuator-httptrace-does-not-work-with-spring-boot-2-2.md
new file mode 100644 (file)
index 0000000..bafa43f
--- /dev/null
@@ -0,0 +1,88 @@
+---
+_edit_last: "2"
+_oembed_0a2776cf844d7b8b543bf000729407fe: '{{unknown}}'
+_oembed_8a143b8145082a48cc586f0fdb19f9b5: '{{unknown}}'
+_oembed_4484ca19961800dfe51ad98d0b1fcfef: '{{unknown}}'
+_oembed_b0575eccf8471857f8e25e8d0f179f68: '{{unknown}}'
+author: kai
+categories:
+  - explained
+  - java
+  - spring-boot
+classic-editor-remember: classic-editor
+date: "2020-07-02T13:24:07+00:00"
+guid: http://juplo.de/?p=970
+parent_post_id: null
+post_id: "970"
+title: Actuator HTTP Trace Does Not Work With Spring Boot 2.2.x
+url: /actuator-httptrace-does-not-work-with-spring-boot-2-2/
+
+---
+## TL;DR
+
+In Spring Boot 2.2.x, you have to instanciate a **`@Bean`** of type **`InMemoryHttpTraceRepository`** to enable the HTTP Trace Actuator.
+
+Jump to the [explanation](#explanation) of and [example code for the fix](#fix)
+
+## `Enabling HTTP Trace — Before 2.2.x...`
+
+Spring Boot comes with a very handy feature called [Actuator](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready "Show the Spring Boot Documentation for the Actuator Feature").
+Actuator provides a build-in production-ready REST-API, that can be used to monitor / menage / debug your bootified App.
+To enable it — _prior to 2.2.x_ —, one only had to:
+
+1. Specifiy the dependency for Spring Boot Actuator:
+
+   ```
+   <dependency>
+     <groupId>org.springframework.boot
+     <artifactId>spring-boot-starter-actuator
+   </dependency>
+
+   ```
+
+1. Expose the needed endpoints via HTTP:
+
+   ```properties
+   management.endpoints.web.exposure.include=*
+
+   ```
+
+   - This exposes **all available endpoints** via HTTP.
+   - _**Advise:** Do not copy this into a production config_  
+
+      (Without thinking about it twice and — at least — [enable some security measures](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-endpoints-security "Read, how to secure HTTP-endpoints in the documentation of Spring Boot") to protect the exposed endpoints!)
+
+## The problem: _It simply does not work any more in 2.2 :(_
+
+_But..._
+
+- If you upgrade your existing app with a working `httptrace`-actuator to Spring Boot 2.2.x, or
+- If you start with a fresh app in Spring Boot 2.2.x and try to enable the `httptrace`-actuator [as described in the documentation](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-endpoints-exposing-endpoints "Read, how to expose HTTP-endpoints in the documentation of Spring Boot")
+
+**...it simply does not work at all!**
+
+## The Fix
+
+The simple fix for this problem is, to add a `@Bean` of type `InMemoryHttpTraceRepository` to your **`@Configuration`**-class:
+
+```
+@Bean
+public HttpTraceRepository htttpTraceRepository()
+{
+  return new InMemoryHttpTraceRepository();
+}
+
+```
+
+## The Explanation
+
+The cause of this problem is not a bug, but a legitimate change in the default configuration.
+Unfortunately, this change is not noted in the according section of the documentation.
+Instead it is burried in the [Upgrade Notes for Spring Boot 2.2](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2.0-M3-Release-Notes#actuator-http-trace-and-auditing-are-disabled-by-default)
+
+The default-implementation stores the captured data in memory.
+Hence, it consumes much memory, without the user knowing, or even worse: needing it.
+This is especially undesirable in cluster environments, where memory is a precious good.
+_And remember:_ Spring Boot was invented to simplify cluster deployments!
+
+**That is, why this feature is now turned of by default and has to be turned on by the user explicitly, if needed.**
diff --git a/content/posts/arbeitspaket-a-entwicklung-eines-facebook-crawlers.md b/content/posts/arbeitspaket-a-entwicklung-eines-facebook-crawlers.md
new file mode 100644 (file)
index 0000000..92d1c83
--- /dev/null
@@ -0,0 +1,15 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - facebook
+date: "2015-10-01T11:57:11+00:00"
+draft: "true"
+guid: http://juplo.de/?p=532
+parent_post_id: null
+post_id: "532"
+title: 'Arbeitspaket 1a: Entwicklung eines Facebook-Crawlers'
+url: /
+
+---
+
diff --git a/content/posts/aspectj-maven-plugin-can-not-compile-valid-java-7-0-code.md b/content/posts/aspectj-maven-plugin-can-not-compile-valid-java-7-0-code.md
new file mode 100644 (file)
index 0000000..1a36b67
--- /dev/null
@@ -0,0 +1,60 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - java
+  - maven
+date: "2014-07-18T10:32:21+00:00"
+guid: http://juplo.de/?p=302
+parent_post_id: null
+post_id: "302"
+title: aspectj-maven-plugin can not compile valid Java-7.0-Code
+url: /aspectj-maven-plugin-can-not-compile-valid-java-7-0-code/
+
+---
+I stumbled over a valid construction, that can not be compiled by the [aspectj-maven-plugin](http://mojo.codehaus.org/aspectj-maven-plugin/ "Jump to the homepage of the aspectj-maven-plugin"):
+
+```java
+
+class Outer
+{
+  void outer(Inner inner)
+  {
+  }
+
+  class Inner
+  {
+    Outer outer;
+
+    void inner()
+    {
+      outer.outer(this);
+    }
+  }
+}
+
+```
+
+This code might look very useless.
+Originally, it `Inner` was a Thread, that wants to signal its enclosing class, that it has finished some work.
+I just striped down all other code, that was not needed, to trigger the error.
+
+If you put the class `Outer` in a maven-project and configure the aspectj-maven-plugin to weave this class with compliance-level 1.6, you will get the following error:
+
+```
+
+[ERROR] Failed to execute goal org.codehaus.mojo:aspectj-maven-plugin:1.6:compile (default-cli) on project shouter: Compiler errors:
+[ERROR] error at outer.inner(this);
+[ERROR]
+[ERROR] /home/kai/juplo/shouter/src/main/java/Outer.java:16:0::0 The method inner(Outer.Inner) is undefined for the type Outer
+[ERROR] error at queue.done(this, System.currentTimeMillis() - start);
+[ERROR]
+
+```
+
+The normal compilation works, because the class is syntactically correct Java-7.0-Code.
+But the AspectJ-Compiler (Version 1.7.4) bundeled with the aspectj-maven-pluign will fail!
+
+Fortunately, I found out, [how to use the aspectj-maven-plugin with AspectJ 1.8.3](/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/ "Read, how to run the aspectj-maven-plugin with a current version of AspectJ").
+
+So, if you have a similar problem, [read on...](/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/ "Read, how you can solve this ajc compilation error")
diff --git a/content/posts/bidirectional-association-with-elementcollection.md b/content/posts/bidirectional-association-with-elementcollection.md
new file mode 100644 (file)
index 0000000..cefe6c7
--- /dev/null
@@ -0,0 +1,58 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - hibernate
+  - java
+  - jpa
+date: "2013-10-03T09:11:36+00:00"
+guid: http://juplo.de/?p=90
+parent_post_id: null
+post_id: "90"
+title: Bidirectional Association with @ElementCollection
+url: /bidirectional-association-with-elementcollection/
+
+---
+Have you ever wondered, how to map a bidirectional association from an entity to the instances of its element-collection? Actually, it is very easy, if you are using hibernate. It is just somehow hard to find in the documentation, if you are searching for it (look for chapter 2.4.3.4 in the [Hibernate-Annotationss-Documentation](http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec-property "Chapter 2.4.3 of the Hibernate-Annotation-Documentation")).
+
+## Hibernate
+
+So, here we go:
+Just add the `@Parent`-annotation to the attribute of your associated `@Embeddable`-class, that points back to its _parent_.
+
+```
+@Entity
+class Cat
+{
+  @Id
+  Long id;
+
+  @ElementCollection
+  Set kittens;
+
+  ...
+}
+
+@Embeddable
+class Kitten
+{
+  // Embeddable's have no ID-property!
+
+  @Parent
+  private Cat mother;
+
+  ...
+}
+
+```
+
+## Drawback
+
+But this clean approach has a drawback: it only works with hibernate. If you work with other JPA-implementations or plain old JPA itself, it will not work. Hence, it will not work in googles appengine, for example!
+
+Unfortunatly, there are no clean workarounds, to get bidirectional associations to `@ElementCollections`'s working with JPA. The only workarounds I found, only work for directly embedded instances - not for collections of embedded instances:
+
+- Applying `@Embedded` to a getter/setter pair rather than to the member itself (found on [stackoverflow.com](http://stackoverflow.com/a/5061089/247276 "Open the Answer in stackoverflow.com")).
+- Set the parent in the property set method (found in the [Java-Persistence WikiBook](http://en.wikibooks.org/wiki/Java_Persistence/Embeddables#Example_of_setting_a_relationship_in_an_embeddable_to_its_parent "Open the Java-Persistence WikiBook")).
+
+**If you want bidirectiona associations to the elements of your embedded collection, it works only with hibernate!**
diff --git a/content/posts/bypassing-the-same-origin-policiy-for-loal-files-during-development.md b/content/posts/bypassing-the-same-origin-policiy-for-loal-files-during-development.md
new file mode 100644 (file)
index 0000000..5c01ed6
--- /dev/null
@@ -0,0 +1,121 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - css
+  - grunt
+  - html(5)
+  - less
+  - nodejs
+date: "2015-08-25T15:16:32+00:00"
+guid: http://juplo.de/?p=481
+parent_post_id: null
+post_id: "481"
+title: Bypassing the Same-Origin-Policy For Local Files During Development
+url: /bypassing-the-same-origin-policiy-for-loal-files-during-development/
+
+---
+## downloadable font: download failed ...: status=2147500037
+
+Are you ever stumbled accross weired errors with font-files, that could not be loaded, or SVG-graphics, that are not shown during local development on your machine using `file:///`-URI's, though everything works as expected, if you push the content to a webserver and access it via HTTP?
+Furthermore, the browsers behave very differently here.
+Firefox, for example, just states, that the download of the font failed:
+
+```bash
+
+downloadable font: download failed (font-family: "XYZ" style:normal weight:normal stretch:normal src index:0): status=2147500037 source: file:///home/you/path/to/font/xyz.woff
+
+```
+
+Meanwhile, Chrome just happily uses the same font.
+Considering the SVG-graphics, that are not shown, Firefox just does not show them, like it would not be able to at all.
+Chrome logs an error:
+
+```bash
+
+Unsafe attempt to load URL file:///home/you/path/to/project/img/sprite.svg#logo from frame with URL file:///home/you/path/to/project/templates/layout.html. Domains, protocols and ports must match
+
+```
+
+...though, no protocol, domain or port is involved.
+
+## The Same-Origin Policy
+
+The reason for this strange behavior is the [Same-origin policy](https://en.wikipedia.org/wiki/Same-origin_policy "Read more about the Same-origin policy on wikipedia").
+Chrome gives you a hint in this direction with the remark that something does not match.
+I found the trail, that lead me to this explanation, while [googling for the strange error message](https://bugzilla.mozilla.org/show_bug.cgi?id=760436 "Read the bug-entry, that explains the meaning of the error-message"), that Firefox gives for the fonts, that can not be loaded.
+
+_The Same-origin policy forbids, that locally stored files can access any data, that is stored in a parent-directory._
+_They only have access to files, that reside in the same directory or in a directory beneath it._
+
+You can read more about that rule on [MDN](https://developer.mozilla.org/en-US/docs/Same-origin_policy_for_file%3A_URIs "Same-origin policy for file: URIs").
+
+I often violate that rule, when developing templates for dynamically rendered pages with [Thymeleaf](http://www.thymeleaf.org/ "Read more about the XML/XHTML/HTML5 template engine Thymeleaf"), or similar techniques.
+That is, because I like to place the template-files on a subdirectory of the directory, that contains my webapp ( `src/main/webapp` with Maven):
+
+```
+
++ src/main/webapp/
+  + css/
+  + img/
+  + fonts/
+  + thymeleaf/templates/
+
+```
+
+I packed a simple example-project for developing static templates with [LESS](http://lesscss.org/ "Read more about less"), [nodejs](https://nodejs.org/ "Read more about nodejs") and [grunt](http://gruntjs.com/ "Read more about grunt"), that shows the problem and the [quick solution for Firefox](#quick-solution "Jump to the quick solution for Firefox") presented later.
+You can browse it on my [juplo.de/gitweb](/gitweb/?p=examples/template-development;a=tree;h=1.0.3;hb=1.0.3 "Browse the example-project on juplo.de/gitweb"), or clone it with:
+
+```bash
+
+git clone /git/examples/template-development
+
+```
+
+## Cross-Browser Solution
+
+Unfortunately, there is no simple cross-browser solution, if you want to access your files through `file:///`-URI's during development.
+The only real solution is, to access your files through the HTTP-protocol, like in production.
+If you do not want to do that, the only two cross-browser solutions are, to
+
+1. turn of the Same-origin policy for local files in all browsers, or
+
+1. rearrange your files in such a way, that they do not violate the Same-origin policy (as a rule, all resources linked in a HTML-file must reside in the same directory as the file, or beneath it).
+
+The only real cross-browser solution is to circumvent the problem altogether and serve the content with a local webserver, so that you can access it through HTTP, like in production.
+You can [read how to extend the example-project mentioned above to achieve that goal](/serve-static-html-with-nodjs-and-grunt/ "Read the article 'Serving Static HTML With Nodjs And Grunt For Template-Development'") in a follow up article.
+
+## Turn Of Security
+
+Turning of the Same-origin policy is not recommended.
+I would only do that, if you only use your browser, to access the HTML-files under development ‐ which I doubt, that it is the case.
+Anyway, this is a good quick test to validate, that the Same-origin policy is the source of your problems ‐ if you quickly re-enable it after the validation.
+
+Firefox:
+ Set `security.fileuri.strict_origin_policy` to `false` on the [about:config](about:config)-page.
+ Chrome:
+ Restart Chrome with `--disable-web-security` or `--allow-file-access-from-files` (for more, see this [question on Stackoverflow)](http://stackoverflow.com/questions/3102819/disable-same-origin-policy-in-chrome "Read more on how to turn of the Same-origin policy in chrome").
+
+## Quick Fix For Firefox
+
+If you develop with Firefox, there is a quick fix, to bypass the Same-origin policy for local files.
+
+As the [explanation on MDM](https://developer.mozilla.org/en-US/docs/Same-origin_policy_for_file%3A_URIs "Read the explanation on MDM") stats, a file loaded in a frame shares the same origin as the file, that contains the frameset.
+This can be used to bypass the policy, if you place a file with a frameset in the topmost directory of your development-folder and load the template under development through that file.
+
+In [my case](#my-case "See the directory-tree I use this frameset with"), the frameset-file looks like this:
+
+```html
+
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
+<html>
+  <head>
+    <meta http-equiv="content-type" content="text/html; charset=utf-8">
+    <title>Frameset to Bypass Same-Origin-Policy
+  </head>
+  <frameset>
+    <frame src="thymeleaf/templates/layout.html">
+  </frameset>
+</html>
+
+```
diff --git a/content/posts/cat-any-file-in-any-commit-with-git.md b/content/posts/cat-any-file-in-any-commit-with-git.md
new file mode 100644 (file)
index 0000000..8e42488
--- /dev/null
@@ -0,0 +1,95 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - tips
+classic-editor-remember: classic-editor
+date: "2020-01-13T16:13:13+00:00"
+guid: http://juplo.de/?p=1025
+parent_post_id: null
+post_id: "1025"
+tags:
+  - bash
+  - git
+title: Cat Any File in Any Commit With Git
+url: /cat-any-file-in-any-commit-with-git/
+
+---
+Ever wanted to do take a quick look at the version of some file in a different commit without checking out that commit first? Then read on, here's how you can do it...
+
+## Goal
+
+- **Take a quick look at a special version of a file with _git_ withou checking out the commit first**
+- Commit may be anything denominatable by git (commit, branch, HEAD, remote-branch)
+- Branch may differ
+- Pipe into another command in the shell
+- Overwrite a file with an older version of itself
+
+## Tip
+
+### Syntax
+
+```bash
+git show BRANCH:PATH
+
+```
+
+### Examples
+
+- Show the content of file `file.txt` in commit `a09127`:
+
+  ```bash
+  git show a09127a:file.txt
+
+  ```
+
+  _The commit can be specified with any valid denominator and may belong to any local- or remote-branch..._
+  - Same as above, but specify the commit relativ to the checked-out commit (handy syntax):
+
+    ```bash
+    git show HEAD^^^^:file.txt
+
+    ```
+
+  - Same as above, but specify the commit relativ to the checked-out commit (readable syntax):
+
+    ```bash
+    git show HEAD~4:file.txt
+
+    ```
+
+  - Same as above for a remote-branch:
+
+    ```bash
+    git show remotes/origin/master~4:file.txt
+
+    ```
+
+  - Same as above for the branch `foo` in repository `bar`:
+
+    ```bash
+    git show remotes/bar/foo~4:file.txt
+
+    ```
+- Pipe the file into another command:
+
+  ```bash
+  git show a09127a:file.txt | wc -l
+
+  ```
+
+- Overwrite the file with its version four commits ago:
+
+  ```bash
+  git show HEAD~4:file.txt > file.txt
+
+  ```
+
+## Explanation
+
+If the path (aka _object name_) contains a colon ( **`:`**), git interprets the part before the colon as a commit and the part after it as the path in the tree, denominated by the commit.
+
+- The **commit** can be specified by its reference, or the name of a local or remote branch
+- The **path** is interpreted as absolut to the origin of the tree, denominated by the commit
+- If you want to use a relative path (i.e, current directory), prepend the path accordingly — for example **`./file`**.   
+_But in this case, be aware that the path is expanded against the checked-out version and not the version, that is specified before the colon!_
diff --git a/content/posts/changes-in-log4j-properties-are-ignored-when-running-sl4fj-under-tomcat.md b/content/posts/changes-in-log4j-properties-are-ignored-when-running-sl4fj-under-tomcat.md
new file mode 100644 (file)
index 0000000..2584b6b
--- /dev/null
@@ -0,0 +1,49 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - java
+  - jetty
+date: "2014-06-03T09:55:28+00:00"
+guid: http://juplo.de/?p=291
+parent_post_id: null
+post_id: "291"
+title: Changes in log4j.properties are ignored, when running sl4fj under Tomcat
+url: /changes-in-log4j-properties-are-ignored-when-running-sl4fj-under-tomcat/
+
+---
+Lately, I run into this very subtle bug:
+my logs were all visible, like intended and configured in `log4j.properties` (or `log4j.xml`), when I fired up my web-application in development-mode under [Jetty](http://www.eclipse.org/jetty/ "Lern more about Jetty") with `mvn jetty:run`.
+But if I installed the application on the production-server, which uses a [Tomcat 7](http://tomcat.apache.org/ "Lern more about Tomcat") servlet-container, no special logger-configuration where picked up from my configuration-file.
+_But - very strange - my configuration-file was not ignored completely._
+The appender-configuration and the log-level from the root-logger where picked up from my configuration-file.
+**Only all special logger-configuration were ignored**.
+
+## Erroneous logging-configuration
+
+Here is my configuration, as it was when I run into the problem:
+
+- Logging was done with [slf4j](http://www.slf4j.org "Learn more about slf4j")
+- Logs were written by [log4j](http://logging.apache.org/log4j/2.x/ "Learn more about log4j") with the help of **slf4j-log4j12**
+- Because I was using some legacy libraries, that were using other logging-frameworks, I had to include some [bridges](http://www.slf4j.org/legacy.html "Lern more about slf4j-bridges") to be able to include the log-messages, that were logged through this frameworks in my log-files.
+   I used: **jcl-over-slf4j** and **log4j-over-slf4j**.
+
+## Do not use sl4fj-log4j and log4j-over-slf4j together!
+
+As said before:
+_All worked as expected while developing under Jetty and in production under Tomcat, only special logger-confiugrations where ignored._
+
+Because of that, it took me quiet a while and a lot of reading, to figure out, that **this was not a configuration-issue, but a clash of libraries**.
+The cause of this strange behaviour were the fact, that **one must not use the log4j-binding _slf4j-log4j12_ and the log4j-bridge _log4j-over-slf4j_ together**.
+
+This fact is quiet logically, because it _should_ push all your logging-statements into an endless loop, where they are handed back and forth between sl4fj and log4j as stated in the sl4fj-documentation [here](http://www.slf4j.org/legacy.html#log4j-over-slf4j "Here you can read the warning in the documentation").
+But if you see all your log-messages in development and in production only the configuration behaves strangley, this mistake is realy hard to figure out!
+So, I hope I can save you some time by dragging your attention to this.
+
+## The solution
+
+Only the cause is hard to find.
+The solution is very simple:
+**Just switch from log4j to [logback](http://logback.qos.ch/index.html "Learn more about logback")**.
+
+There are some more good reasons, why you should do this anyway, over which you can [learn more here](http://logback.qos.ch/reasonsToSwitch.html "Learn why you should switch from log4j to logback anyway").
diff --git a/content/posts/combining-jetty-maven-plugin-and-wro4j-maven-plugin-for-dynamic-reloading-of-less-resources.md b/content/posts/combining-jetty-maven-plugin-and-wro4j-maven-plugin-for-dynamic-reloading-of-less-resources.md
new file mode 100644 (file)
index 0000000..fc11159
--- /dev/null
@@ -0,0 +1,275 @@
+---
+_edit_last: "3"
+author: kai
+categories:
+  - jetty
+  - less
+  - maven
+  - wro4j
+date: "2013-12-06T10:58:17+00:00"
+guid: http://juplo.de/?p=140
+parent_post_id: null
+post_id: "140"
+title: Combining jetty-maven-plugin and wro4j-maven-plugin for Dynamic Reloading of LESS-Resources
+url: /combining-jetty-maven-plugin-and-wro4j-maven-plugin-for-dynamic-reloading-of-less-resources/
+
+---
+Ever searched for a simple configuration, that lets you use your [jetty-maven-plugin](http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin "See the documentation for mor information") as you are used to, while working with [LESS](http://www.lesscss.org/ "See LESS CSS documentation for mor informations") to simplify your stylesheets?
+
+You cannot do both, use the [Client-side mode](http://www.lesscss.org/#usage "More about the client-side usage of LESS") of LESS to ease development and use the [lesscss-maven-plugin](https://github.com/marceloverdijk/lesscss-maven-plugin "Homepage of the official LESS CSS maven plugin") to automatically compile the LESS-sources into CSS for production. That does not work, because your stylesheets must be linked in different ways if you are switching between the client-side mode - which is best for development - and the pre-compiled mode - which is best for production. For the client-side mode you need something like:
+
+```html
+
+<link rel="stylesheet/less" type="text/css" href="styles.less" />
+<script src="less.js" type="text/javascript"></script>
+
+```
+
+While, for the pre-compiled mode, you want to link to your stylesheets as usual, with:
+
+```html
+
+<link rel="stylesheet" type="text/css" href="styles.css" />
+
+```
+
+While looking for a solution to this dilemma, I stumbled accross [wro4j](https://code.google.com/p/wro4j/ "See the documentation of ths wounderfull tool"). Originally intended, to speed up page-delivery by combining and minimizing multiple resources into one through the use of a servlet-filter, this tool also comes with a maven-plugin, that let you do the same offline, while compiling your webapp.
+
+The idea is, to use the [wro4j-maven-plugin](http://code.google.com/p/wro4j/wiki/MavenPlugin "See the documentation of hte wro4j-maven-plugin") to compile and combine your LESS-sources into CSS for production and to use the [wro4j filter](http://code.google.com/p/wro4j/wiki/Installation "See how to configure the filter"), to dynamically deliver the compiled CSS while developing. This way, you do not have to alter your HTML-code, when switching between development and production, because you always link to the CSS-files.
+
+So, lets get dirty!
+
+## Step 1: Configure wro4j
+
+First, we configure **wro4j**, like as we want to use it to speed up our page. The details are explained and linked on wro4j's [Getting-Started-Page](http://code.google.com/p/wro4j/wiki/GettingStarted "Visit the Getting-Started-Page"). In short, we just need two files: **wro.xml** and **wro.properties**.
+
+### wro.xml
+
+wro.xml tells wro4j, which resources should be combined and how the result should be named. I am using the following configuration to generate all LESS-Sources beneath `base/` into one CSS-file called `base.css`:
+
+```xml
+
+<groups xmlns="http://www.isdc.ro/wro">
+  <group name="base">
+    <css>/less/base/*.less</css>
+  </group>
+
+```
+
+wro4j looks for `/less/base/*.less` inside the root of the web-context, which is equal to `src/main/webapp` in a normal maven-project. There are [other ways to specifie the resources](http://code.google.com/p/wro4j/wiki/ResourceTypes "See the resource locator documentation of wro4j for more details"), which enable you to store them elswhere. But this approach works best for our goal, because the path is understandable for both: the wro4j servlet-filter, we are configuring now for our development-environment, and the wro4j-maven-plugin, that we will configure later for build-time compilation.
+
+### wro.properties
+
+wro.properties in short tells wro4j, how or if it should convert the combined sources and how it should behave. I am using the following configuration to tell wro4j, that it should convert `*.less`-sources into CSS and do that on _every request_:
+
+```properties
+
+managerFactoryClassName=ro.isdc.wro.manager.factory.ConfigurableWroManagerFactory
+preProcessors=cssUrlRewriting,lessCssImport
+postProcessors=less4j
+disableCache=true
+
+```
+
+First of all we specify the `ConfigurableWroManagerFactory`, because otherwise, wro4j would not pick up our pre- and post-processor-configuration. This is a little bit confusing, because wro4j is already reading the `wro.properties`-file - otherwise wro4j would never detect the `managerFactoryClassName`-directive - and you might think: "Why? He is already interpreting our configuration!" But belive me, he is not! You can [read more about that in wro4j's documentation](http://code.google.com/p/wro4j/wiki/ConfigurableWroManagerFactory "Read the full story in wro4j's documentation"). The `disableCache=true` is also crucial, because otherwise, we would not see the changes take effect when developing with **jetty-maven-plugin** later on. The pre-processors `lessCssImport` and `cssUrlRewriting` merge together all our LESS-resources under `/less/base/*.less` and do some URL-rewriting, in case you have specified paths to images, fonts or other resources inside your LESS-code, to reflect that the resulting CSS is found under `/css/base.css` and not `/css/base/YOURFILE.css` like the LESS-resources.
+
+You can do much more with your resources here, for example [minimizing](https://code.google.com/p/wro4j/wiki/AvailableProcessors "See all available processors"). Also, there are countless [configuration options](http://code.google.com/p/wro4j/wiki/ConfigurationOptions "See all configuration options") to fine-tune the behaviour of wro4j. But for our goal, we are now only intrested in the compilation of our LESS-sources.
+
+## Step 2: Configure the wro4j servlet-filter
+
+Configuring the filter in the **web.xml** is easy. It is explained in wro4j's [installation-insctuctions](https://code.google.com/p/wro4j/wiki/Installation "See the installation instructions for the wro4j servlet-filter"). But the trick is, that we do not want to configure that filter for the production-version of our webapp, because we want to compile the resources offline, when the webapp is build. To acchieve this, we can use the `<overrideDescriptor>`-Parameter of the [jetty-maven-plugin](http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin#Configuring_Your_WebApp "Read more about the configuration of the jetty-maven-plugin").
+
+## <overrideDescriptor>
+
+This parameter lets you specify additional configuration options for the web.xml of your webapp. I am using the following configuration for my jetty-maven-plugin:
+
+```xml
+
+<plugin>
+  <groupId>org.eclipse.jetty</groupId>
+  <artifactId>jetty-maven-plugin</artifactId>
+  <configuration>
+    <webApp>
+      <overrideDescriptor>${project.basedir}/src/test/resources/jetty-web.xml</overrideDescriptor>
+    </webApp>
+  </configuration>
+  <dependencies>
+    <dependency>
+      <groupId>ro.isdc.wro4j</groupId>
+      <artifactId>wro4j-core</artifactId>
+      <version>${wro4j.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>ro.isdc.wro4j</groupId>
+      <artifactId>wro4j-extensions</artifactId>
+      <version>${wro4j.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>javax.servlet</groupId>
+          <artifactId>servlet-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.commons</groupId>
+          <artifactId>commons-lang3</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>commons-io</groupId>
+          <artifactId>commons-io</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-web</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.google.code.gson</groupId>
+          <artifactId>gson</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.google.javascript</groupId>
+          <artifactId>closure-compiler</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.github.lltyk</groupId>
+          <artifactId>dojo-shrinksafe</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.jruby</groupId>
+          <artifactId>jruby-core</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.jruby</groupId>
+          <artifactId>jruby-stdlib</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>me.n4u.sass</groupId>
+          <artifactId>sass-gems</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>nz.co.edmi</groupId>
+          <artifactId>bourbon-gem-jar</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.codehaus.gmaven.runtime</groupId>
+          <artifactId>gmaven-runtime-1.7</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.webjars</groupId>
+          <artifactId>jshint</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.webjars</groupId>
+          <artifactId>emberjs</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.webjars</groupId>
+          <artifactId>handlebars</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.webjars</groupId>
+          <artifactId>coffee-script</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.webjars</groupId>
+          <artifactId>jslint</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.webjars</groupId>
+          <artifactId>json2</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.webjars</groupId>
+          <artifactId>jquery</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+  </dependencies>
+</plugin>
+
+```
+
+The dependencies to **wro4j-core** and **wro4j-extensions** are needed by jetty, to be able to enable the filter defined below. Unfortunatly, one of the transitive dependencies of `wro4j-extensions` triggers an uggly error when running the jetty-maven-plugin. Therefore, all unneeded dependencies of `wro4j-extensions` are excluded, as a workaround for this error/bug.
+
+## jetty-web.xml
+
+And my jetty-web.xml looks like this:
+
+```xml
+
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://java.sun.com/xml/ns/javaee"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+  version="2.5">
+  <filter>
+    <filter-name>wro</filter-name>
+    <filter-class>ro.isdc.wro.http.WroFilter</filter-class>
+  </filter>
+  <filter-mapping>
+    <filter-name>wro</filter-name>
+    <url-pattern>*.css</url-pattern>
+  </filter-mapping>
+</web-app>
+
+```
+
+The filter processes any URI's that end with `.css`. This way, the wro4j servlet-filter makes `base.css` available under any path, because for exampl `/base.css`, `/css/base.css` and `/foo/bar/base.css` all end with `.css`.
+
+This is all, that is needed to develop with dynamically reloadable compiled LESS-resources. Just fire up your browser and browse to `/what/you/like/base.css`. (But do not forget to put some LESS-files in `src/main/webapp/less/base/` first!)
+
+## Step 3: Install wro4j-maven-plugin
+
+All that is left over to configure now, is the build-process. If you would build and deploy your webapp now, the CSS-file `base.css` would not be generated and the link to your stylesheet, that already works in our jetty-maven-plugin environment would point to a 404. Hence, we need to set up the **wro4j-maven-plugin**. I am using this configuration:
+
+```xml
+
+<plugin>
+  <groupId>ro.isdc.wro4j</groupId>
+  <artifactId>wro4j-maven-plugin</artifactId>
+  <version>${wro4j.version}</version>
+  <configuration>
+    <wroManagerFactory>ro.isdc.wro.maven.plugin.manager.factory.ConfigurableWroManagerFactory</wroManagerFactory>
+    <cssDestinationFolder>${project.build.directory}/${project.build.finalName}/css/</cssDestinationFolder>
+  </configuration>
+  <executions>
+    <execution>
+      <phase>prepare-package</phase>
+      <goals>
+        <goal>run</goal>
+      </goals>
+    </execution>
+  </executions>
+</plugin>
+
+```
+
+I connected the `run`-goal with the `package`-phase, because the statically compiled CSS-file is needed only in the final war. The `ConfigurableWroManagerFactory` tells wro4j, that it should look up further configuration options in our `wro.properties`-file, where we tell wro4j, that it should compile our LESS-resources. The `<cssDestinationFolder>`-tag tells wro4j, where it should put the generated CSS-file. You can adjust that to suite your needs.
+
+That's it: now the same CSS-file, which is created on the fly by the wro4j servlet-filter when using `mvn jetty:run` and, thus, enables dynamic reloading of our LESS-resources, is generated during the build-process by the wro4j-maven-plugin.
+
+## Cleanup and further considerations
+
+### lesscss-maven-plugin
+
+If you already compile your LESS-resources with the lesscss-maven-plugin, you can stick with it and skip step 3. But I strongly recommend giving wro4j-maven-plugin a try, because it is a much more powerfull tool, that can speed up your final webapp even more.
+
+### Clean up your mess
+
+With a configuration like the above one, your LESS-resources and wro4j-configuration-files will be packed into your production-war. That might be confusing later, because neither wro4j nor LESS is used in the final war. You can add the following to your `pom.xml` to exclude these files from your war for the sake of clarity:
+
+```xml
+
+<plugin>
+  <artifactId>maven-war-plugin</artifactId>
+  <configuration>
+    <warSourceExcludes>
+      WEB-INF/wro.*,
+      less/**
+    </warSourceExcludes>
+  </configuration>
+</plugin>
+
+```
+
+### What's next?
+
+We only scrached the surface, of what can be done with wro4j. Based on this configuration, you can easily enable additional features to fine-tune your final build for maximum speed. You really should take a look at the [list of available Processors](https://code.google.com/p/wro4j/wiki/AvailableProcessors "Available Processors")!
diff --git a/content/posts/compare-two-files-in-different-branches-with-git.md b/content/posts/compare-two-files-in-different-branches-with-git.md
new file mode 100644 (file)
index 0000000..4ee972d
--- /dev/null
@@ -0,0 +1,96 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - tips
+classic-editor-remember: classic-editor
+date: "2020-01-13T16:20:34+00:00"
+guid: http://juplo.de/?p=1019
+parent_post_id: null
+post_id: "1019"
+tags:
+  - bash
+  - git
+title: Compare Two Files In Different Branches With Git
+url: /compare-two-files-in-different-branches-with-git/
+
+---
+Ever wanted to do a quick diff between two different files in two different commits with git? Then read on, here's how you can do it...
+
+## Goal
+
+- **Compare two files in two commits with _git_**
+- Commit may be anything denominatable by git (commit, branch, HEAD, remote-branch)
+- Name / Path may differ
+- Branch may differ
+
+## Tip
+
+### Syntax
+
+```bash
+git diff BRANCH:PATH OTHER_BRANCH:OTHER_PATH
+
+```
+
+### Examples
+
+- Compare two different files in two different branches:
+
+  ```bash
+  git diff branch_a:file_a.txt branch_b:file_b.txt
+
+  ```
+
+- Compare a file with another version of itself in another commit
+
+  ```bash
+  git diff HEAD:file.txt a09127a:file.txt
+
+  ```
+
+- Same as above, but the commit is denominated by its branch:
+
+  ```bash
+  git diff HEAD:file.txt branchname:file.txt
+
+  ```
+
+- Same as above, but with shortcut-syntax for the currently checked-out commit:
+
+  ```bash
+  git diff :file.txt branchname:file.txt
+
+  ```
+
+- Compare a file with itself four commits ago (readable syntax):
+
+  ```bash
+  git diff :file.txt HEAD~4:file.txt
+
+  ```
+
+- Compare a file with itself four commits ago (handy syntax):
+
+  ```bash
+  git diff :file.txt HEAD~4:file.txt
+
+  ```
+
+- Compare a file with its latest version in the origin-repository:
+
+  ```bash
+  git diff :file.txt remotes/origin/master:file.txt
+
+  ```
+
+- Compare a file with its fourth-latest version in the `foo`-branch of the `bar`-repository:
+
+  ```bash
+  git diff :file.txt remotes/bar/foo~4:file.txt
+
+  ```
+
+## Explanation
+
+If the path (aka _object name_) contains a colon ( **`:`**), git interprets the part before the colon as a commit and the part after it as the path in the tree, denominated by the commit. (For more details refere to this post with [tips for `git show`](/cat-any-file-in-any-commit-with-git/ "Read more on how to cat any file in any commit with git, without checking it out first"))
diff --git a/content/posts/configure-https-for-jetty-maven-plugin-9-0-x.md b/content/posts/configure-https-for-jetty-maven-plugin-9-0-x.md
new file mode 100644 (file)
index 0000000..2069af2
--- /dev/null
@@ -0,0 +1,249 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - java
+  - jetty
+date: "2018-08-17T10:29:23+00:00"
+guid: http://juplo.de/?p=209
+parent_post_id: null
+post_id: "209"
+title: Configure HTTPS for jetty-maven-plugin 9.0.x
+url: /configure-https-for-jetty-maven-plugin-9-0-x/
+
+---
+## For the impatient
+
+If you do not want to know why it does not work and how I fixed it, just [jump to the quick fix](#quick-fix)!
+
+## jetty-maven-plugin 9.0.x breaks the HTTPS-Connector
+
+With Jetty 9.0.x the configuration of the `jetty-maven-plugin` (formaly known as `maven-jetty-plugin`) has changed dramatically. Since then, it is no more possible to configure a HTTPS-Connector in the plugin easily. Normally, connecting your development-container via HTTPS was not often necessary. But since [Snowden](http://en.wikipedia.org/wiki/Edward_Snowden "Read more about Edward Snowden"), encryption is on everybodys mind. And so, testing the encrypted part of your webapp becomes more and more important.
+
+## Why it is "broken" in `jetty-maven-plugin` 9.0.x
+
+[A bug-report](https://bugs.eclipse.org/bugs/show_bug.cgi?id=408962 "Read the bug-report") stats, that
+
+Since the constructor signature changed for Connectors in jetty-9 to require the Server instance to be passed into it, it is no longer possible to configure Connectors directly with the plugin (because maven requires no-arg constructor for any <configuration> elements).
+
+[The documentation](http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html "Jump to the documentation of the jetty-maven-plugin") includes an example, [how to configure a HTTPS Connector with the help of a `jetty.xml`-file](http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html#maven-config-https "Jump to the example in the documentation of the jetty-maven-plugin"). But unfortunatly, this example is broken. Jetty refuses to start with the following error: `[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.0.5.v20130815:run (default-cli) on project FOOBAR: Failure: Unknown configuration type: New in org.eclipse.jetty.xml.XmlConfiguration@4809f93a -> [Help 1]`.
+
+## Get HTTPS running again
+
+So, here is, what you have to do to fix this [broken example](http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html#maven-config-https "Jump to the example in the documentation of the jetty-maven-plugin"): the content shown for the file `jetty.xml` in the example is wrong. It has to look like the other example-files. That is, ith has to start with a `<Configure>`-tag. The corrected content of the file looks like this:
+
+```html
+
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+
+<!-- ============================================================= -->
+<!-- Configure the Http Configuration                              -->
+<!-- ============================================================= -->
+<Configure id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
+  <Set name="secureScheme">https</Set>
+  <Set name="securePort"><Property name="jetty.secure.port" default="8443" /></Set>
+  <Set name="outputBufferSize">32768</Set>
+  <Set name="requestHeaderSize">8192</Set>
+  <Set name="responseHeaderSize">8192</Set>
+  <Set name="sendServerVersion">true</Set>
+  <Set name="sendDateHeader">false</Set>
+  <Set name="headerCacheSize">512</Set>
+
+  <!-- Uncomment to enable handling of X-Forwarded- style headers
+  <Call name="addCustomizer">
+    <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
+  </Call>
+  -->
+</Configure>
+
+```
+
+## But it's not running!
+
+If you are getting the error `[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.0.5.v20130815:run (default-cli) on project FOOBAR: Failure: etc/jetty.keystore (file or directory not found) -> [Help 1]` now, this is because you have to create/get a certificate for your HTTPS-Connector. For development, a selfsigned certificate is sufficient. You can easily create one like back in the [good old `maven-jetty-plugin`-times](http://mrhaki.blogspot.de/2009/05/configure-maven-jetty-plugin-for-ssl.html "Example for configuring the HTTPS-Connector of the old maven-jetty-plugin"), with this command: `keytool -genkey -alias jetty -keyalg RSA -keystore src/test/resources/jetty.keystore -storepass secret -keypass secret -dname "CN=localhost"`. Just be sure, to change the example file `jetty-ssl.xml`, to reflect the path to your new keystore file and password. Your `jetty-ssl.xml` should look like:
+
+```html
+
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+
+<!-- ============================================================= -->
+<!-- Configure a TLS (SSL) Context Factory                         -->
+<!-- This configuration must be used in conjunction with jetty.xml -->
+<!-- and either jetty-https.xml or jetty-spdy.xml (but not both)   -->
+<!-- ============================================================= -->
+<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
+  <Set name="KeyStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.keystore" default="src/test/resources/jetty.keystore"/></Set>
+  <Set name="KeyStorePassword"><Property name="jetty.keystore.password" default="secret"/></Set>
+  <Set name="KeyManagerPassword"><Property name="jetty.keymanager.password" default="secret"/></Set>
+  <Set name="TrustStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.truststore" default="src/test/resources/jetty.keystore"/></Set>
+  <Set name="TrustStorePassword"><Property name="jetty.truststore.password" default="secret"/></Set>
+  <Set name="EndpointIdentificationAlgorithm"></Set>
+  <Set name="ExcludeCipherSuites">
+    <Array type="String">
+      <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
+      <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
+      <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
+      <Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
+      <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
+      <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
+      <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
+    </Array>
+  </Set>
+
+  <!-- =========================================================== -->
+  <!-- Create a TLS specific HttpConfiguration based on the        -->
+  <!-- common HttpConfiguration defined in jetty.xml               -->
+  <!-- Add a SecureRequestCustomizer to extract certificate and    -->
+  <!-- session information                                         -->
+  <!-- =========================================================== -->
+  <New id="sslHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
+    <Arg><Ref refid="httpConfig"/></Arg>
+    <Call name="addCustomizer">
+      <Arg><New class="org.eclipse.jetty.server.SecureRequestCustomizer"/></Arg>
+    </Call>
+  </New>
+
+</Configure>
+
+```
+
+## But it's still not running!
+
+Unless you are running `mvn jetty:run` as `root`, you should see another error now: `[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.0.5.v20130815:run (default-cli) on project FOOBAR: Failure: Permission denied -> [Help 1]`. This is, because the ports are set to the numbers `80` and `443` of the privileged port-range.
+
+You have to change `jetty-http.xml` like this:
+
+```html
+
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+
+<!-- ============================================================= -->
+<!-- Configure the Jetty Server instance with an ID "Server"       -->
+<!-- by adding a HTTP connector.                                   -->
+<!-- This configuration must be used in conjunction with jetty.xml -->
+<!-- ============================================================= -->
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+  <!-- =========================================================== -->
+  <!-- Add a HTTP Connector.                                       -->
+  <!-- Configure an o.e.j.server.ServerConnector with a single     -->
+  <!-- HttpConnectionFactory instance using the common httpConfig  -->
+  <!-- instance defined in jetty.xml                               -->
+  <!--                                                             -->
+  <!-- Consult the javadoc of o.e.j.server.ServerConnector and     -->
+  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
+  <!-- that may be set here.                                       -->
+  <!-- =========================================================== -->
+  <Call name="addConnector">
+    <Arg>
+      <New class="org.eclipse.jetty.server.ServerConnector">
+        <Arg name="server"><Ref refid="Server" /></Arg>
+        <Arg name="factories">
+          <Array type="org.eclipse.jetty.server.ConnectionFactory">
+            <Item>
+              <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+                <Arg name="config"><Ref refid="httpConfig" /></Arg>
+              </New>
+            </Item>
+          </Array>
+        </Arg>
+        <Set name="host"><Property name="jetty.host" /></Set>
+        <Set name="port"><Property name="jetty.port" default="8080" /></Set>
+        <Set name="idleTimeout"><Property name="http.timeout" default="30000"/></Set>
+      </New>
+    </Arg>
+  </Call>
+
+</Configure>
+
+```
+
+... and `jetty-https.xml` like this:
+
+```html
+
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+
+<!-- ============================================================= -->
+<!-- Configure a HTTPS connector.                                  -->
+<!-- This configuration must be used in conjunction with jetty.xml -->
+<!-- and jetty-ssl.xml.                                            -->
+<!-- ============================================================= -->
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+
+  <!-- =========================================================== -->
+  <!-- Add a HTTPS Connector.                                      -->
+  <!-- Configure an o.e.j.server.ServerConnector with connection   -->
+  <!-- factories for TLS (aka SSL) and HTTP to provide HTTPS.      -->
+  <!-- All accepted TLS connections are wired to a HTTP connection.-->
+  <!--                                                             -->
+  <!-- Consult the javadoc of o.e.j.server.ServerConnector,        -->
+  <!-- o.e.j.server.SslConnectionFactory and                       -->
+  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
+  <!-- that may be set here.                                       -->
+  <!-- =========================================================== -->
+  <Call id="httpsConnector" name="addConnector">
+    <Arg>
+      <New class="org.eclipse.jetty.server.ServerConnector">
+        <Arg name="server"><Ref refid="Server" /></Arg>
+          <Arg name="factories">
+            <Array type="org.eclipse.jetty.server.ConnectionFactory">
+              <Item>
+                <New class="org.eclipse.jetty.server.SslConnectionFactory">
+                  <Arg name="next">http/1.1</Arg>
+                  <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg>
+                </New>
+              </Item>
+              <Item>
+                <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+                  <Arg name="config"><Ref refid="sslHttpConfig"/></Arg>
+                </New>
+              </Item>
+            </Array>
+          </Arg>
+          <Set name="host"><Property name="jetty.host" /></Set>
+          <Set name="port"><Property name="https.port" default="8443" /></Set>
+          <Set name="idleTimeout"><Property name="https.timeout" default="30000"/></Set>
+        </New>
+    </Arg>
+  </Call>
+</Configure>
+
+```
+
+Now, it should be running, _but..._
+
+## That is all much to complex. I just want a quick fix to get it running!
+
+So, now it is working. But you still have to clutter your project with several files and avoid some pitfalls (belive me or not: if you put the filenames in the `<jettyXml>`-tag of your `pom.xml` on separate lines, jetty won't start!). Last but not least, the HTTP-Connector will stop working, if you forget to add the `jetty-http.xml`, that is mentioned at the end of the example.
+
+Because of that, I've created a simple 6-step quick-fix-guide to get the HTTPS-Connector of the `jetty-maven-plugin` running.
+
+## Quick Fix
+
+1. Download [jetty.xml](/wp-uploads/2014/02/jetty.xml) or copy it [from above](#jetty-xml) and place it in `src/test/resources/jetty.xml`
+1. Download [jetty-http.xml](/wp-uploads/2014/02/jetty-http.xml) or copy it [from above](#jetty-http-xml) and place it in `src/test/resources/jetty-http.xml`
+1. Download [jetty-ssl.xml](/wp-uploads/2014/02/jetty-ssl.xml) or copy it [from above](#jetty-ssl-xml) and place it in `src/test/resources/jetty-ssl.xml`
+1. Download [jetty-https.xml](/wp-uploads/2014/02/jetty-https.xml) or copy it [from above](#jetty-https-xml) and place it in `src/test/resources/jetty-https.xml`
+1. Download [jetty.keystore](/wp-uploads/2014/02/jetty.keystore) or generate it with the command [keytool-command from above](#keytool) and place it in `src/test/resources/jetty.keystore`
+1. Update the configuration of the `jetty-maven-plugin` in your `pom.xml` to include the XML-configurationfiles. But be aware, the ordering of the files is important and there should be no newlines inbetween. You have been warned! It should look like:
+
+   ```html
+
+   <plugin>
+     <groupId>org.eclipse.jetty</groupId>
+     <artifactId>jetty-maven-plugin</artifactId>
+     <configuration>
+       <jettyXml>
+         ${project.basedir}/src/test/resources/jetty.xml,${project.basedir}/src/test/resources/jetty-http.xml,${project.basedir}/src/test/resources/jetty-ssl.xml,${project.basedir}/src/test/resources/jetty-https.xml
+       </jettyXml>
+     </configuration>
+   </plugin>
+
+   ```
+
+That's it. You should be done!
diff --git a/content/posts/configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login.md b/content/posts/configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login.md
new file mode 100644 (file)
index 0000000..9231e1b
--- /dev/null
@@ -0,0 +1,194 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - facebook
+  - java
+  - oauth2
+  - spring
+date: "2016-06-26T10:40:45+00:00"
+guid: http://juplo.de/?p=462
+parent_post_id: null
+post_id: "462"
+title: Configure pac4j for a Social-Login along with a Spring-Security based Form-Login
+url: /configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login/
+
+---
+## The Problem – What will be explained
+
+If you just want to enable your spring-based webapplication to let users log in with their social accounts, without changing anything else, [pac4j](http://www.pac4j.org/#1 "The authentication solution for java") should be your first choice.
+But the [provided example](https://github.com/pac4j/spring-security-pac4j-demo "Clone the examples on GitHub") only shows, how to define all authentication mechanisms via pac4j.
+If you already have set up your log-in via spring-security, you have to reconfigure it with the appropriate pac4j-mechanism.
+That is a lot of unnecessary work, if you just want to supplement the already configured log in with the additionally possibility, to log in via a social provider.
+
+In this short article, I will show you, how to set that up along with the normal [form-based login of Spring-Security](http://docs.spring.io/spring-security/site/docs/4.0.1.RELEASE/reference/htmlsingle/#ns-form-and-basic "Read, how to set up the form-based login of Spring-Security").
+I will show this for a Login via Facabook along the Form-Login of Spring-Security.
+The method should work as well for [other social logins, that are supported by spring-security-pac4j](https://github.com/pac4j/spring-security-pac4j#providers-supported "See a list of all login-mechanisms, supported by spring-security-pac4j"), along other login-mechanisms provided by spring-security out-of-the-box.
+
+In this article I will not explain, how to store the user-profile-data, that was retrieved during the social login.
+Also, if you need more social interaction, than just a login and access to the default data in the user-profile you probably need [spring-social](http://projects.spring.io/spring-social/ "Homepage of the spring-social project"). How to combine spring-social with spring-security for that purpose, is explained in this nice article about how to [add social sign in to a spring-mvc weba-pplication](http://www.petrikainulainen.net/programming/spring-framework/adding-social-sign-in-to-a-spring-mvc-web-application-configuration/ "Read this article about how to integrate spring-security with spring-social").
+
+## Adding the Required Maven-Artifacts
+
+In order to use spring-security-pac4j to login to facebook, you need the following maven-artifacts:
+
+```xml
+
+<dependency>
+  <groupId>org.pac4j</groupId>
+  <artifactId>spring-security-pac4j</artifactId>
+  <version>1.2.5</version>
+</dependency>
+<dependency>
+  <groupId>org.pac4j</groupId>
+  <artifactId>pac4j-http</artifactId>
+  <version>1.7.1</version>
+</dependency>
+<dependency>
+  <groupId>org.pac4j</groupId>
+  <artifactId>pac4j-oauth</artifactId>
+  <version>1.7.1</version>
+</dependency>
+
+```
+
+## Configuration of Spring-Security (Without Social Login via pac4j)
+
+This is a bare minimal configuration to get the form-login via Spring-Security working:
+
+```xml
+
+<?xml version="1.0" encoding="UTF-8"?>
+<beans
+    xmlns="http://www.springframework.org/schema/beans"
+    xmlns:security="http://www.springframework.org/schema/security"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="
+      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+      http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
+    ">
+
+  <security:http use-expressions="true">
+    <security:intercept-url pattern="/**" access="permitAll"/>
+    <security:intercept-url pattern="/home.html" access="isAuthenticated()"/>
+    <security:form-login login-page="/login.html" authentication-failure-url="/login.html?failure"/>
+    <security:logout/>
+    <security:remember-me/>
+  </security:http>
+
+  <security:authentication-manager>
+    <security:authentication-provider>
+      <security:user-service>
+       <security:user name="user" password="user" authorities="ROLE_USER" />
+      </security:user-service>
+    </security:authentication-provider>
+  </security:authentication-manager>
+
+</beans>
+
+```
+
+The `http` defines, that the access to the url `/home.html` is restriced and must be authenticated via a form-login on url `/login.html`.
+The `authentication-manager` defines an in-memory authentication-provider for testing purposes with just one user (username: `user`, password: `user`).
+For more details, see the [documentation of spring-security](http://docs.spring.io/spring-security/site/docs/4.0.1.RELEASE/reference/htmlsingle/#ns-form-and-basic "Read more about the available configuration-parameters in the spring-security documentation").
+
+## Enabling pac4j via spring-security-pac4j alongside
+
+To enable pac4j alongside, you have to add/change the following:
+
+```xml
+
+<?xml version="1.0" encoding="UTF-8"?>
+<beans
+    xmlns="http://www.springframework.org/schema/beans"
+    xmlns:security="http://www.springframework.org/schema/security"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="
+      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+      http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
+    ">
+
+  <security:http use-expressions="true">
+    <security:custom-filter position="OPENID_FILTER" ref="clientFilter"/>
+    <security:intercept-url pattern="/**" access="permitAll()"/>
+    <security:intercept-url pattern="/home.html" access="isAuthenticated()"/>
+    <security:form-login login-page="/login.html" authentication-failure-url="/login.html?failure"/>
+    <security:logout/>
+  </security:http>
+
+  <security:authentication-manager alias="authenticationManager">
+    <security:authentication-provider>
+      <security:user-service>
+       <security:user name="user" password="user" authorities="ROLE_USER" />
+      </security:user-service>
+    </security:authentication-provider>
+    <security:authentication-provider ref="clientProvider"/>
+  </security:authentication-manager>
+
+  <!-- entry points -->
+  <bean id="facebookEntryPoint" class="org.pac4j.springframework.security.web.ClientAuthenticationEntryPoint">
+    <property name="client" ref="facebookClient"/>
+  </bean>
+
+  <!-- client definitions -->
+  <bean id="facebookClient" class="org.pac4j.oauth.client.FacebookClient">
+    <property name="key" value="145278422258960"/>
+    <property name="secret" value="be21409ba8f39b5dae2a7de525484da8"/>
+  </bean>
+  <bean id="clients" class="org.pac4j.core.client.Clients">
+    <property name="callbackUrl" value="http://localhost:8080/callback"/>
+    <property name="clients">
+      <list>
+        <ref bean="facebookClient"/>
+      </list>
+    </property>
+  </bean>
+
+  <!-- common to all clients -->
+  <bean id="clientFilter" class="org.pac4j.springframework.security.web.ClientAuthenticationFilter">
+    <constructor-arg value="/callback"/>
+    <property name="clients" ref="clients"/>
+    <property name="sessionAuthenticationStrategy" ref="sas"/>
+    <property name="authenticationManager" ref="authenticationManager"/>
+  </bean>
+  <bean id="clientProvider" class="org.pac4j.springframework.security.authentication.ClientAuthenticationProvider">
+    <property name="clients" ref="clients"/>
+  </bean>
+  <bean id="httpSessionRequestCache" class="org.springframework.security.web.savedrequest.HttpSessionRequestCache"/>
+  <bean id="sas" class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy"/>
+
+</beans>
+
+```
+
+In short:
+
+1. You have to add an additional filter in `http`.
+   I added this filter on position `OPENID_FILTER`, because pac4j introduces a unified way to handle OpenID and OAuth and so on.
+   If you are using the OpenID-mechanism of spring-security, you have to use another position in the filter-chain (for example `CAS_FILTER`) or reconfigure OpenID to use the pac4j-mechanism, which should be fairly straight-forward.
+
+
+   The new Filter has the ID `clientFilter` and needs a reference to the `authenticationManager`.
+   Also, the callback-URL (here: `/callback`) must be mapped to your web-application!
+
+1. You have to add an additional `authentication-provider` to the `authentication-manager`, that references your newly defined pac4j-ClientProvider ( `clientProvider`).
+
+1. You have to configure your entry-points as pac4j-clients.
+   In the example above, only one pac4j-client, that authenticats the user via Facebook, is configured.
+   You easily can add more clients: just copy the definitions from the [spring-security-pac4j example](https://github.com/pac4j/spring-security-pac4j-demo "Browse the source of that example on GitHub").
+
+That should be all, that is necessary, to enable a Facebook-Login in your Spring-Security web-application.
+
+## Do Not Forget To Use Your Own APP-ID!
+
+The App-ID `145278422258960` and the accompanying secret `be21409ba8f39b5dae2a7de525484da8` were taken from the [spring-security-pac4j example](https://github.com/pac4j/spring-security-pac4j-demo "Browse the source of that example on GitHub") for simplicity.
+That works for a first test-run on `localhost`.
+_But you have to replace that with your own App-ID and -scecret, that you have to generate using [your App Dashboard on Facebook](https://developers.facebook.com/apps "You can generate your own apps on your App Dashboard")!_
+
+## More to come...
+
+This short article does not show, how to save the retrieved user-profiles in your user-database, if you need that.
+I hope, I will write a follow-up on that soon.
+In short:
+pac4j creates a Spring-Security `UserDetails`-Instance for every user, that was authenticated against it.
+You can use this, to access the data in the retrieved user-profile (for example to write out the name of the user in a greeting or contact him via e-mail).
diff --git a/content/posts/create-a-simulated-network-as-docker-does-it.md b/content/posts/create-a-simulated-network-as-docker-does-it.md
new file mode 100644 (file)
index 0000000..571e45c
--- /dev/null
@@ -0,0 +1,139 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - howto
+date: "2019-06-03T16:05:21+00:00"
+draft: "true"
+guid: http://juplo.de/?p=831
+parent_post_id: null
+post_id: "831"
+title: Create A Simulated Network As Docker Does It
+url: /
+
+---
+## Why
+
+In this mini-HOWTO, we will configure a simulated network in exact the same way, as Docker does it.
+
+Our goal is, to understand how Docker handles virtual networks.
+Later (in another post), we will use the gained understanding to simulate segmented multihop networks using Docker-Compose.
+
+## Step 1: Create The Bridge
+
+First, we have to create a bridge, that will act as the switch in our virtual network and bring it up.
+
+```bash
+sudo ip link add dev switch type bridge
+sudo ip link set dev switch up
+
+```
+
+_It is crucial, to activate each created device, since new devices are not activated by default._
+
+## Step 2: Create A Virtual Host
+
+Now we can create a virtual host.
+This is done by creating a new **network namespace**, that will act as the host:
+
+```bash
+sudo ip netns add host_1
+```
+
+This "virtual host" is not of much use at the moment, because it is not connected to any network, which we will do next...
+
+## Step 3: Connect The Virtual Host To The Network
+
+Connecting the host to the network is done with the help of a **[veth pair](/virtual-networking-with-linux-veth-pairs/ "Virtual Networking With Linux: Veth-Pairs")**:
+
+```bash
+sudo ip link add dev host_1 type veth peer name host_if
+
+```
+
+A veth-pair acts as a virtual patch-cable.
+As a real cable, it always has two ends and data that enters one end is copied to the other.
+Unlike a real cable, each end comes with a network interface card (nic).
+To stick with the metaphor: using a veth-pair is like taking a patch-cable with a nic hardwired to each end and installing these nics.
+
+## Pitfalls
+
+Some common pitfalls, when
+
+```bash
+# Create a bridge in the standard-networknamespace, that represents the switch
+sudo ip link add dev switch type bridge
+# Bring the bridge up
+sudo ip link set dev switch up
+
+# Create a veth-pair for the virtual peer host_1
+sudo ip link add dev host_1 type veth peer name host_if
+# Create a private namespace for host_1 and move the interface host_if into it
+sudo ip netns add host_1
+sudo ip link set dev host_if netns host_1
+# Rename the private interface to eth0
+sudo ip netns exec host_1 ip link set dev host_if name eth0
+# Set the IP for the interface eth0 and bring it up
+sudo ip netns exec host_1 ip addr add 192.168.10.1/24 dev eth0
+sudo ip netns exec host_1 ip link set dev eth0 up
+# Plug the other end into the virtual switch and bring it up
+sudo ip link set dev host_1 master switch
+sudo ip link set dev host_1 up
+
+# Create a veth-pair for the virtual peer host_2
+sudo ip link add dev host_2 type veth peer name host_if
+# Create a private namespace for host_2 and move the interface host_if into it
+sudo ip netns add host_2
+sudo ip link set dev host_if netns host_2
+# Rename the private interface to eth0
+sudo ip netns exec host_2 ip link set dev host_if name eth0
+# Set the IP for the interface eth0 and bring it up
+sudo ip netns exec host_2 ip addr add 192.168.10.2/24 dev eth0
+sudo ip netns exec host_2 ip link set dev eth0 up
+# Plug the other end into the virtual switch and bring it up
+sudo ip link set dev host_2 master switch
+sudo ip link set dev host_2 up
+
+# Create a veth-pair for the virtual peer host_3
+sudo ip link add dev host_3 type veth peer name host_if
+# Create a private namespace for host_3 and move the interface host_if into it
+sudo ip netns add host_3
+sudo ip link set dev host_if netns host_3
+# Rename the private interface to eth0
+sudo ip netns exec host_3 ip link set dev host_if name eth0
+# Set the IP for the interface eth0 and bring it up
+sudo ip netns exec host_3 ip addr add 192.168.10.3/24 dev eth0
+sudo ip netns exec host_3 ip link set dev eth0 up
+# Plug the other end into the virtual switch and bring it up
+sudo ip link set dev host_3 master switch
+sudo ip link set dev host_3 up
+
+# Create a veth-pair for the virtual peer host_4
+sudo ip link add dev host_4 type veth peer name host_if
+# Create a private namespace for host_4 and move the interface host_if into it
+sudo ip netns add host_4
+sudo ip link set dev host_if netns host_4
+# Rename the private interface to eth0
+sudo ip netns exec host_4 ip link set dev host_if name eth0
+# Set the IP for the interface eth0 and bring it up
+sudo ip netns exec host_4 ip addr add 192.168.10.4/24 dev eth0
+sudo ip netns exec host_4 ip link set dev eth0 up
+# Plug the other end into the virtual switch and bring it up
+sudo ip link set dev host_4 master switch
+sudo ip link set dev host_4 up
+
+# Create a veth-pair for the virtual peer host_5
+sudo ip link add dev host_5 type veth peer name host_if
+# Create a private namespace for host_5 and move the interface host_if into it
+sudo ip netns add host_5
+sudo ip link set dev host_if netns host_5
+# Rename the private interface to eth0
+sudo ip netns exec host_5 ip link set dev host_if name eth0
+# Set the IP for the interface eth0 and bring it up
+sudo ip netns exec host_5 ip addr add 192.168.10.5/24 dev eth0
+sudo ip netns exec host_5 ip link set dev eth0 up
+# Plug the other end into the virtual switch and bring it up
+sudo ip link set dev host_5 master switch
+sudo ip link set dev host_5 up
+
+```
diff --git a/content/posts/create-self-signed-multi-domain-san-certificates.md b/content/posts/create-self-signed-multi-domain-san-certificates.md
new file mode 100644 (file)
index 0000000..dd95da9
--- /dev/null
@@ -0,0 +1,226 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - howto
+classic-editor-remember: classic-editor
+date: "2019-12-09T17:55:30+00:00"
+guid: http://juplo.de/?p=887
+parent_post_id: null
+post_id: "887"
+title: Create Self-Signed Multi-Domain (SAN) Certificates
+url: /create-self-signed-multi-domain-san-certificates/
+
+---
+## TL;DR
+
+The SAN-extension is removed during signing, if not respecified explicitly.
+To create a private CA with self-signed multi-domain certificats for your development setup, you simply have to:
+
+1. Run [create-ca.sh](/wp-uploads/selfsigned+san/create-ca.sh) to generate the root-certificate for your private CA.
+1. Run [gencert.sh NAME](/wp-uploads/selfsigned+san/gencert.sh) to generate selfsigned certificates for the CN NAME with an exemplary SAN-extension.
+
+## Subject Alternative Name (SAN) And Self-Signed Certificates
+
+Multi-Domain certificates are implemented as a certificate-extension called **Subject Alternative Name (SAN)**.
+One can simply specify the additional domains (or IP's) when creating a certificate.
+
+The following example shows the syntax for the **`keytool`**-command, that comes with the JDK and is frequently used by Java-programmers to create certificates:
+
+```bash
+keytool \
+ -keystore test.jks -storepass confidential -keypass confidential \
+ -genkey -alias test -validity 365 \
+ -dname "CN=test,OU=security,O=juplo,L=Juist,ST=Niedersachsen,C=DE" \
+ -ext "SAN=DNS:test,DNS:localhost,IP:127.0.0.1"
+
+```
+
+If you list the content of the newly created keystore with...
+
+```bash
+keytool -list -v -keystore test.jks
+
+```
+
+...you should see a section like the following one:
+
+```bash
+#1: ObjectId: 2.5.29.17 Criticality=false
+SubjectAlternativeName [
+  DNSName: test
+  DNSName: localhost
+  IPAddress: 127.0.0.1
+]
+
+```
+
+The certificate is also valid for this additionally specified domains and IP's.
+
+The problem is, that it is not signed and will not be trusted, unless you publicize it explicitly through a truststore.
+This is feasible, if you just want to authenticate and encrypt one point-2-point communication.
+But if more clients and/or servers have to be authenticated to each other, updating and distributing the truststore will soon become hell.
+
+The common solution in this situation is, to create a private CA, that can sign newly created certificates.
+This way, only the root-certificate of that private CA has to be distributed.
+Clients, that know the root-certificate of the private CA will automatically trust all certificates, that are signed by that CA.
+
+But unfortunatly, **if you sign your certificate, the SAN-extension vanishes**: the signed certificate is only valid for the CN.
+_(One may think, that you just have to specify the export of the SAN-extension into the certificate-signing-request - which is not exported by default - but the SAN will still be lost after signing the extended request...)_
+
+This removal of the SAN-extension is not a bug, but a feature.
+A CA has to be in control, which domains and IP's it signes certificates for.
+If a client could write arbitrary additional domains in the SAN-extension of his certificate-signing-request, he could fool the CA into signing a certificate for any domain.
+Hence, all entries in a SAN-extension are removed by default during signing.
+
+This default behavior is very annoying, if you just want to run your own private CA, to authenticate all your services to each other.
+
+In the following sections, I will walk you through a solution to circumvent this pitfall.
+If you just need a working solution for your development setup, you may skip the explanation and just [download the scripts](#scripts "Jump to the downloads"), that combine the presented steps.
+
+## Recipe To Create A Private CA With Self-Signed Multi-Domain Certificates
+
+### Create And Distribute The Root-Certificate Of The CA
+
+We are using **`openssl`** to create the root-certificate of our private CA:
+
+```bash
+openssl req \
+  -new -x509 -subj "/C=DE/ST=Niedersachsen/L=Juist/O=juplo/OU=security/CN=Root-CA" \
+  -keyout ca-key -out ca-cert -days 365 -passout pass:extraconfidential
+
+```
+
+This should create two files:
+
+- **`ca-cert`**, the root-certificate of your CA
+- **`ca-key`**, the private key of your CA with the password **`extraconfidential`**
+
+_Be sure to protect `ca-key` and its password, because anyone who has access to both of them, can sign certificates in the name of your CA!_
+
+To distribute the root-certificate, so that your Java-clients can trust all certificates, that are signed by your CA, you have to import the root-certificate into a truststore and make that truststore available to your Java-clients:
+
+```bash
+keytool \
+  -keystore truststore.jks -storepass confidential \
+  -import -alias ca-root -file ca-cert -noprompt
+
+```
+
+### Create A Certificate-Signing-Request For Your Certificat
+
+We are reusing the already created certificate here.
+If you create a new one, there is no need to specify the SAN-extension, since it will not be exported into the request and this version of the certificate will be overwritten, when the signed certificate is reimported:
+
+```bash
+keytool \
+  -keystore test.jks -storepass confidential \
+  -certreq -alias test -file cert-file
+
+```
+
+This will create the file **`cert-file`**, which contains the certificate-signing-request.
+This file can be deleted, after the certificate is signed (which is done in the next step).
+
+### Sign The Request, Adding The Additional Domains In A SAN-Extension
+
+We use **`openssl x509`** to sign the request:
+
+```bash
+openssl x509 \
+  -req -CA ca-cert -CAkey ca-key -in cert-file -out test.pem \
+  -days 365 -CAcreateserial -passin pass:extraconfidential \
+  -extensions SAN -extfile <(printf "\n[SAN]\nsubjectAltName=DNS:test,DNS:localhost,IP:127.0.0.1")
+
+```
+
+This can also be done with `openssl ca`, which has a slightly different and little bit more complicated API.
+`openssl ca` is ment to manage a real full-blown CA.
+But we do not need the extra options and complexity for our simple private CA.
+
+The important part here is all that comes after **`-extensions SAN`**.
+It specifies the _Subject-Alternative-Name_-section, that we want to include additionally into the signed certificate.
+Because we are in full control of our private CA, we can specify any domains and/or IP's here, that we want.
+The other options are ordinary certificate-signing-stuff, that is [already better explained elswhere](https://stackoverflow.com/a/21340898 "For example, you can read more in this answer on stackoverflow.com").
+
+We use a special syntax with the option `-extfile`, that allows us to specify the contents of a virtual file as part of the command.
+You can as well write your SAN-extension into a file and hand over the name of that file here, as it is done usually.
+If you want to specify the same SAN-extension in a file, that file would have to contain:
+
+```bash
+[SAN]
+subjectAltName=DNS:test,DNS:localhost,IP:127.0.0.1
+
+```
+
+Note, that the name that you give the extension on the command-line with `-extension SAN` has to match the header in the (virtual) file ( `[SAN]`).
+
+As a result of the command, the file **`test.pem`** will be created, which contains the signed x509-certificate.
+You can disply the contents of that certificate in a human readable form with:
+
+```bash
+openssl x509 -in test.pem -text
+
+```
+
+_It should display something similar to this [example-output](/wp-uploads/selfsigned+san/pem.txt "Display the example-output for a x509-certificate in PEM-format")_
+
+### Import The Root-Certificate Of The CA And The Signed Certificate Into The Keystore
+
+If you want your clients, that do only know the root-certificate of your CA, to trust your Java-service, you have to build up a _Chain-of-Trust_, that leads from the known root-certificate to the signed certificate, that your service uses to authenticate itself.
+_(Note: SSL-encryption always includes the authentication of the service a clients connects to through its certificate!)_
+In our case, that chain only has two entries, because our certificate was directly signed by the root-certificate.
+Therefore, you have to import the root-certificate ( `ca-cert`) and your signed certificate ( `test.pem`) into a keystore and make that keystore available to the Java-service, in order to enable it to authentificate itself using the signed certificate, when a client connects.
+
+Import the root-certificate of the CA:
+
+```bash
+keytool \
+ -keystore test.jks -storepass confidential \
+ -import -alias ca-root -file ca-cert -noprompt
+
+```
+
+Import the signed certificate (this will overwrite the unsigned version):
+
+```bash
+keytool \
+ -keystore test.jks -storepass confidential \
+ -import -alias test -file test.pem
+
+```
+
+**That's it: we are done!**
+
+You can validate the contents of the created keystore with:
+
+```bash
+keytool \
+ -keystore test.jks -storepass confidential \
+ -list -v
+
+```
+
+_It should display something similar to this [example-output](/wp-uploads/selfsigned+san/jks.txt "Display the example-output for a JKS-keystore")_
+
+To authenticate service A against client B you will have to:
+
+- make the keystore **`test.jks`** available to the service **A**
+- make the truststore **`truststore.jks`** available to the client **B**
+
+_If you want, that your clients also authentificate themselfs to your services, so that only clients with a trusted certificate can connect (2-Way-Authentication), client B also needs its own signed certificate to authenticate against service A and service A also needs access to the truststore, to be able to trust that certificate._
+
+## Simple Example-Scripts To Create A Private CA And Self-Signed Certificates With SAN-Extension
+
+The following two scripts automate the presented steps and may be useful, when setting up a private CA for Java-development:
+
+- Run [create-ca.sh](/wp-uploads/selfsigned+san/create-ca.sh "Read the source of create-ca.sh") to create the root-certificate for the CA and import it into a truststore (creates **`ca-cert`** and **`ca-key`** and the truststore **`truststore.p12`**)
+- Run [gencert.sh CN](/wp-uploads/selfsigned+san/gencert.sh "Read the source of gencert.sh") to create a certificate for the common name CN, sign it using the private CA (also exemplarily adding alternative names) and building up a valid Chain-of-Trust in a keystore (creates **`CN.pem`** and the keystore **`CN.p12`**)
+- Global options can be set in the configuration file [settings.conf](/wp-uploads/selfsigned+san/settings.conf "Read the source of setings.conf")
+
+_Read the source for more options..._
+
+Differing from the steps shown above, these scripts use the keystore-format PKCS12.
+This is, because otherwise, `keytool` is nagging about the non-standard default-format JKS in each and every step.
+
+**Note:** PKCS12 does not distinguish between a store-password and a key-password. Hence, only a store-passwort is specified in the scripts.
diff --git a/content/posts/debugging-the-oauth-flow-in-spring-security.md b/content/posts/debugging-the-oauth-flow-in-spring-security.md
new file mode 100644 (file)
index 0000000..a7769d3
--- /dev/null
@@ -0,0 +1,66 @@
+---
+_edit_last: "2"
+_oembed_0a2776cf844d7b8b543bf000729407fe: '{{unknown}}'
+_oembed_4484ca19961800dfe51ad98d0b1fcfef: '{{unknown}}'
+_oembed_b0575eccf8471857f8e25e8d0f179f68: '{{unknown}}'
+author: kai
+categories:
+  - hacking
+  - java
+  - oauth2
+  - spring-boot
+classic-editor-remember: classic-editor
+date: "2019-12-28T00:34:36+00:00"
+draft: "true"
+guid: http://juplo.de/?p=971
+parent_post_id: null
+post_id: "971"
+title: Debugging The OAuth2-Flow in Spring Security
+url: /
+
+---
+## TL;DR
+
+Use **`CommonsRequestLoggingFilter`** and place it befor the filter, that represents Spring Security.
+
+Jump to the [configuration details](details)
+
+## The problem: Logging the Request/Response-Flow
+
+If you want to understand the OAuth2-Flow or have to debug any issues involving it, the crucial part about it is the request/response-flow between your application and the provider.
+**Unfortunately, this**
+
+**```properties**
+**spring.security.filter.order=-100**
+
+**```**
+
+**https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#security-properties**
+
+**https://mtyurt.net/post/spring-how-to-insert-a-filter-before-springsecurityfilterchain.html**
+
+**https://spring.io/guides/topicals/spring-security-architecture#\_web\_security**
+
+**```properties**
+**logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG**
+
+**```**
+
+**```java**
+**@Bean**
+**public FilterRegistrationBean requestLoggingFilter()**
+**{**
+**CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter();**
+
+**loggingFilter.setIncludeClientInfo(true);**
+**loggingFilter.setIncludeQueryString(true);**
+**loggingFilter.setIncludeHeaders(true);**
+**loggingFilter.setIncludePayload(true);**
+**loggingFilter.setMaxPayloadLength(64000);**
+
+**FilterRegistrationBean reg = new FilterRegistrationBean(loggingFilter);**
+**reg.setOrder(-101); // Default for spring.security.filter.order is -100**
+**return reg;**
+**}**
+
+**```**
diff --git a/content/posts/deduplicating-partitioned-data-with-kafka-streams.md b/content/posts/deduplicating-partitioned-data-with-kafka-streams.md
new file mode 100644 (file)
index 0000000..0b8c9d0
--- /dev/null
@@ -0,0 +1,193 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - demos
+  - java
+  - kafka
+  - spring-boot
+classic-editor-remember: classic-editor
+date: "2020-10-10T20:02:49+00:00"
+guid: http://juplo.de/?p=1147
+parent_post_id: null
+post_id: "1147"
+title: Deduplicating Partitioned Data With a Kafka Streams ValueTransformer
+url: /deduplicating-partitioned-data-with-kafka-streams/
+
+---
+Inspired by a current customer project and this article about
+[deduplicating events with Kafka Streams](https://blog.softwaremill.com/de-de-de-de-duplicating-events-with-kafka-streams-ed10cfc59fbe)
+I want to share a simple but powerful implementation of a deduplication mechanism, that works well for partitioned data and does not suffer of memory leaks, because a countless number of message-keys has to be stored.
+
+Yet, the presented approach does not work for all use-cases, because it presumes, that a strictly monotonically increasing sequence numbering can be established across all messages - at least concerning all messages, that are routed to the same partition.
+
+## The Problem
+
+A source produces messages, with reliably unique ID's.
+From time to time, sending these messages to Kafka may fail.
+The order, in which these messages are send, is crucial with respect to the incedent, they belong to.
+Resending the messages in correct order after a failure (or downtime) is no problem.
+But some of the messages may be send twice (or more often), because the producer does not know exactly, which messages were send successful.
+
+`Incident A - { id: 1,  data: "ab583cc8f8" }
+Incident B - { id: 2,  data: "83ccc8f8f8" }
+Incident C - { id: 3,  data: "115tab5b58" }
+Incident C - { id: 4,  data: "83caac564b" }
+Incident B - { id: 5,  data: "a583ccc8f8" }
+Incident A - { id: 6,  data: "8f8bc8f890" }
+Incident A - { id: 7,  data: "07583ab583" }
+<< DOWNTIME OR FAILURE >>
+Incident C - { id: 4,  data: "83caac564b" }
+Incident B - { id: 5,  data: "a583ccc8f8" }
+Incident A - { id: 6,  data: "8f8bc8f890" }
+Incident A - { id: 7,  data: "07583ab583" }
+Incident A - { id: 8,  data: "930fce58f3" }
+Incident B - { id: 9,  data: "7583ab93ab" }
+Incident C - { id: 10, data: "7583aab583" }
+Incident B - { id: 11, data: "b583075830" }
+`
+
+Since eache message has a unique ID, all messages are inherently idempotent:
+**Deduplication is no problem, if the receiver keeps track of the messages, he has already seen.**
+
+_Where is the problem?_, you may ask. _That's trivial, I just code the deduplication into my consumer!_
+
+But this approach has several drawbacks, including:
+
+- Implementing the trivial algorithm described above is not efficent, since the algorithm in general has to remember the IDs of all messages for an indefinit period of time.
+- Implementing the algorithm over and over again for every consumer is cumbersome and errorprone.
+
+_Wouldn't it be much nicer, if we had an efficient and bulletproof algorithm, that we can simply plug into our Kafka-pipelines?_
+
+## The Idea
+
+In his [blog-article](https://blog.softwaremill.com/de-de-de-de-duplicating-events-with-kafka-streams-ed10cfc59fbe)
+Jaroslaw Kijanowski describes three deduplication algorithms.
+The first does not scale well, because it does only work for single-partition topics.
+The third aims at a slightly different problem and might fail deduplicating some messages, if the timing is not tuned correctly.
+The looks like a robust solution.
+But it also looks a bit hacky and is unnecessary complex in my opinion.
+
+Playing around with his ideas, i have come up with the following algorithm, that combines elements of all three solutions:
+
+- All messages are keyed by an ID that represents the incident - not the message.
+  _This guarantees, that all messages concerning a specific incident will be stored in the same partition, so that their ordering is retained._
+- We generate unique strictly monotonically increasing sequence numbers, that are assigned to each message.
+  _If the IDs of the messages fullfill these requirements and are stored in the value (like above), they can be reused as sequence numbers_
+- We keep track of the sequence number last seen for each partition.
+- We drop all messages with sequnce numbers, that are not greater than the last sequence number, that we saw on that partition.
+
+The algorithm uses the well known approach, that TCP/IP uses to detect and drop duplicate packages.
+It is efficient, since we never have to store more sequence numbers, than partitions, that we are handling.
+The algorithm can be implemented easily based on a `ValueTransformer`, because Kafka Streams provides the ability to store state locally.
+
+## A simplified example-implementation
+
+To clearify the idea, I further simplified the problem for the example implementation:
+
+- Key and value of the messages are of type `String`, for easy scripting.
+
+- In the example implementation, person-names take the part of the ID of the incident, that acts out as message-key.
+
+- The value of the message solely consists of the sequence number.
+  _In a real-world use-case, the sequence number would be stored in the message-value and would have to be extracted from there._
+  _Or it would be stored as a message-header._
+
+That is, our message stream is simply a mapping from names to unique sequence numbers and we want to be able to separate out the contained sequence for a single person, without duplicate entries and without jeopardizing the order of that sequence.
+
+In this simplified setup, the implementation effectively boils down to the following method-override:
+
+`@Override
+public Iterable<String> transform(String value)
+{
+  Integer partition = context.partition();
+  long sequenceNumber = Long.parseLong(value);
+  Long seen = store.get(partition);
+  if (seen == null || seen < sequenceNumber)
+  {
+    store.put(partition, sequenceNumber);
+    return Arrays.asList(value);
+  }
+  return Collections.emptyList();
+}
+`
+
+- We can get the active partition from the `ProcessorContext`, that is handed to our Instance in the constructor, which is not shown here for brevity.
+- Parsing the `String`-value of the message as `long` corresponds to the extraction of the sequence number from the value of the message in our simplified setup.
+- We then check the local state, if a sequence-number was already seen for the active partition.
+  _Kafka Streams takes care of the initialization and resurection of the local state._
+  _Take a look at the [full source-code](https://github.com/juplo/demos-kafka-deduplication "Browse the source on github.com") see, how we instruct Kafka Streams to do so._
+- If this is the first sequence-number, that we see for this partition, or if the sequence-number is greater (that is: newer) than the stored one, we store it in our local state and return the value of the message, because it was seen for the first time.
+
+- Otherwise, we instruct Kafka Streams to drop the current (duplicate!) value, by returning an empty array.
+
+We can use our `ValueTransformer` with **`flatTransformValues()`**,
+to let Kafka Streams drop the detected duplicate values:
+
+`streamsBuilder
+    .stream("input")
+    .flatTransformValues(
+        new ValueTransformerSupplier()
+        {
+          @Override
+          public ValueTransformer get()
+          {
+            return new DeduplicationTransformer();
+          }
+        },
+        "SequenceNumbers")
+    .to("output");
+`
+
+One has to register an appropriate store to the `StreamsBuilder` under the referenced name.
+
+[The full source is available on github.com](https://github.com/juplo/demos-kafka-deduplication "Browse the source on github.com")
+
+## Recapping Our Assumptions...
+
+The presented deduplication algorithm presumes some assumptions, that may not fit your use-case.
+It is crucial, that these prerequisites are not violated.
+Therefor, I will spell them out once more:
+
+1. We can generate **unique strictly monotonically increasing sequence numbers** for all messages (of a partition).
+
+1. We have a **strict ordering of all messages** (per partition).
+
+1. And hence, since we want to handle more than one partition:
+   **The data is partitioned by key**.
+   That is, all messages for a specific key must always be routed to the same partition.
+
+As a conclusion of this assumptions, we have to note:
+**We can only deduplicate messages, that are routed to the same partition.**
+This follows, because we can only guarantee message-order per partition. But it should not be a problem for the same reason:
+**We assume a use-case, where all messages concerning a specific incident are captured in the same partition.**
+
+## What is _not_ needed - _but also does not hurt_
+
+Since we are only deduplicating messages, that are routed to the same partition, we do not need globally unique sequence numbers.
+Our sequence numbers only have to be unique per partition, to enable us to detect, that we have seen a specific message before on that partition.
+Golbally unique sequence numbers clearly are a stronger condition:
+**It does not hurt, if the sequence numbers are globally unique, because they are always unique per partition, if they are also globally unique.**
+
+We detect unseen messages, by the fact that their sequence number is greater than the last stored hight watermark for the partition, they are routed to.
+Hence, we do not rely on a seamless numbering without gaps.
+**It does not hurt, if the series of sequence numbers does not have any gaps, as long as two different messages on the same partition never are assigned to the same sequence number.**
+
+That said, it should be clear, that a globally unique seamless numbering of all messages across all partitions - as in our simple example-implementation - does fit well with our approach, because the numbering is still unique, if one only considers the messages in one partition, and the gaps in the numbering, that are introduced by focusing only on the messages of a single partition, are not violating our assumptions.
+
+## Pointless / Contradictorily Usage Of The Presented Approach
+
+Last but not least, I want to point out, that this approach silently assumes, that the sequence number of the message is not identically to the key of the message.
+On the contrary: **The sequence number is expected to be different from the key of the message!**
+
+If one would use the key of the message as its sequence number (provided that it is unique and represents a strictly increasing sequence of numbers), one would indeed assure, that all duplicates can be detected, but he would at once force the implementation to be indifferent, concerning the order of the messages.
+
+That is, because subsequent messages are forced to have different keys, because all messages are required to have unique sequence numbers.
+But messages with different keys may be routed to different partitions - and Kafka can only guarantee message ordering for messages, that live on the same partition.
+Hence, one has to assume, that the order in which the messages are send is not retained, if he uses the message-keys as sequence numbers - _unless,_ only one partition is utilized, which is contradictory to our primary goal here: enabling scalability through data-sharding.
+
+This is also true, if the key of a message contains an invariant ID and only embeds the changing sequence number.
+Because, the default partitioning algorithm always considers the key as a whole, and if any part of it changes, the outcome of the algorithm might change.
+
+In a production-ready implementation of the presented approach, I would advice, to store the sequence number in a message header, or provide a configurable extractor, that can derive the sequence number from the contents of the value of the message.
+It would be perfectly o.k., if the IDs of the messages are used as sequence numbers, as long as they are unique and monotonically increasing and are stored in the value of the message - not in / as the key!
diff --git a/content/posts/der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen.md b/content/posts/der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen.md
new file mode 100644 (file)
index 0000000..54ba6d0
--- /dev/null
@@ -0,0 +1,30 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+classic-editor-remember: classic-editor
+date: "2020-04-22T17:45:06+00:00"
+guid: http://juplo.de/?p=275
+parent_post_id: null
+post_id: "275"
+title: Der Benutzer ist nicht dazu berechtigt, diese Anwendung zu sehen
+url: /der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen/
+
+---
+Du bist gerade bei Facebook über die folgende Fehlermeldung gestolpert:
+
+**Fehler**  
+
+Der Nutzer ist nicht dazu berechtigt, diese Anwendung zu sehen.:  
+
+Der Benutzer ist nicht berrechtigt diese Applikation an zusehen. Der Entwickler hat dies so eingestellt.
+
+[![Fehler Der Nutzer ist nicht dazu berechtigt, diese Anwendung zu sehen.: Der Benutzer ist nicht berrechtigt diese Applikation an zusehen. Der Entwickler hat dies so eingestellt.](/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt-300x150.png)](/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png)
+
+Da dazu nichts bei Googel zu finden war, hier die einfache Erklärung, was da schief läuft:
+
+**Du hast die bei Facebook als Testbenutzer einer deiner Apps eingeloggt und das beim Zugriff auf eine andere App vergessen!**
+
+Die Testbenutzer einer App dürfen offensichtlich nur auf diese App und sonst auf keine Seiten/Apps in Facebook zugreifen - macht ja auch Sinn.
+Verwirrend nur, dass Facebook behauptet, man hättte da etwas selber von Hand eingestellt...
diff --git a/content/posts/develop-a-facebook-app-with-spring-social-part-00.md b/content/posts/develop-a-facebook-app-with-spring-social-part-00.md
new file mode 100644 (file)
index 0000000..be50d3e
--- /dev/null
@@ -0,0 +1,144 @@
+---
+_edit_last: "2"
+_wp_old_slug: develop-a-facebook-app-with-spring-social-part-0
+author: kai
+categories:
+  - howto
+date: "2016-02-01T18:33:47+00:00"
+guid: http://juplo.de/?p=558
+parent_post_id: null
+post_id: "558"
+tags:
+  - createmedia.nrw
+  - facebook
+  - graph-api
+  - java
+  - oauth2
+  - spring
+  - spring-boot
+  - spring-social
+title: 'Develop a Facebook-App with Spring-Social - Part 0: Prepare'
+url: /develop-a-facebook-app-with-spring-social-part-00/
+
+---
+In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social").
+
+The goal of this series is not, to show how simple it is to set up your first social app with Spring Social.
+Even though the usual getting-started guides, like [the one this series is based on](http://spring.io/guides/gs/accessing-facebook/ "Read the official guide, that was the starting point of this series"), are really simple at first glance, they IMHO tend to be confusing, if you try to move on.
+I started with [the example from the original Getting-Started guide "Accessing Facebook Data"](https://github.com/spring-guides/gs-accessing-facebook.git "Browse the source of the original example") and planed to extend it to handle a sign-in via the canvas-page of facebook, like in the [Spring Social Canvas-Example](https://github.com/spring-projects/spring-social-samples/tree/master/spring-social-canvas "Browse the source of the Spring Social Canvas-Example").
+But I was not able to achieve that simple refinement and ran into multiple obstacles.
+
+Because of that, I wanted to show the refinement-process from a simple example up to a full-fledged facebook-app.
+My goal is, that you should be able to reuse the final result of the last part of this series as blueprint and starting-point for your own project.
+At the same time, you should be able to jump back to earlier posts and read all about the design-decisions, that lead up to that result.
+
+This part of my series will handle the preconditions of our first real development-steps.
+
+## The Source is With You
+
+The source-code can be found on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
+and [browsed via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
+For every part I will add a corresponding tag, that denotes the differences between the earlier and the later development steps.
+
+## Keep it Simple
+
+We will start with the most simple app possible, that just displays the public profile data of the logged in user.
+This app is based on the code of [the original Getting-Started guide "Accessing Facebook Data" from Spring-Social](http://spring.io/guides/gs/accessing-facebook/ "Jump to the original guide").
+
+But it is simplified and cleand a little.
+And I fixed some small bugs: the original code from
+[https://github.com/spring-guides/gs-accessing-facebook.git](https://github.com/spring-guides/gs-accessing-facebook.git "Link to clone the original code")
+produces a
+[NullPointerException](https://github.com/spring-guides/gs-accessing-facebook/issues/15 "Read more about this bug") and won't work with the current version 2.0.3.RELEASE of spring-social-facebook, because it uses the [depreceated](https://developers.facebook.com/docs/facebook-login/permissions#reference-read_stream) scope `read_stream`.
+
+The code for this.logging.level.de.juplo.yourshouter= part is tagged with `part-00`.
+Appart from the HTML-templates, the attic for spring-boot and the build-definitions in the `pom.xml` it mainly consists of one file:
+
+```Java
+@Controller
+@RequestMapping("/")
+public class HomeController
+{
+  private final static Logger LOG = LoggerFactory.getLogger(HomeController.class);
+
+  private final Facebook facebook;
+
+  @Inject.logging.level.de.juplo.yourshouter=
+  public HomeController(Facebook facebook)
+  {
+    this.facebook = facebook;
+  }
+
+  @RequestMapping(method = RequestMethod.GET)
+  public String helloFacebook(Model model)
+  {
+    boolean authorized = true;
+    try
+    {
+      authorized = facebook.isAuthorized();
+    }
+    catch (NullPointerException e)
+    {
+      LOG.debug("NPE while acessing Facebook: {}", e);
+      authorized = false;
+    }
+    if (!authorized)
+    {
+      LOG.info("no authorized user, redirecting to /connect/facebook");
+      return "redirect:/connect/facebook";
+    }
+
+    User user = facebook.userOperations().getUserProfile();
+    LOG.info("authorized user {}, id: {}", user.getName(), user.getId());
+    model.addAttribute("user", user);
+    return "home";
+  }
+}
+
+```
+
+I removed every unnecessary bit, to clear the view for the relevant part.
+You can add your styling and stuff by yourself later...
+
+## Automagic
+
+The magic of Spring-Social is hidden in the autoconfiguration of [Spring-Boot](http://projects.spring.io/spring-boot/ "Learn more about Spring Boot"), which will be revealed and refined/replaced in the next parts of this series.
+
+## Run it!
+
+You can clone the repository, checkout the right version and run it with the following commands:
+
+```bash
+git clone /git/examples/facebook-app/
+cd facebook-app
+checkout part-00
+mvn spring-boot:run \
+    -Dfacebook.app.id=YOUR_ID \
+    -Dfacebook.app.secret=YOUR_SECRET
+
+```
+
+Of course, you have to replace `YOUR_ID` and `YOUR_SECRET` with the ID and secret of your Facebook-App.
+What you have to do to register as a facebook-developer and start your first facebook-app is described in this ["Getting Started"-guide from Spring-Social](http://spring.io/guides/gs/register-facebook-app/ "Read, how to register your first facebook-app").
+
+In addition to what is described there, you have to **configure the URL of your website**.
+To do so, you have to navigate to the _Settings_-panel of your newly registered facebook-app.
+Click on _Add Platform_ and choose _Website_.
+Then, enter `http://localhost:8080/` as the URL of your website.
+
+After maven has downloaded all dependencies and started the Spring-Boot application in the embedded tomcat, you can point your browser to [http://localhost:8080](http://localhost:8080 "Jump to your first Facebook-App"), connect, go back to the welcome-page and view the public data of the account you connected with your app.
+
+## Coming next...
+
+Now, you are prepared to learn Spring-Social and develop your first app step by step.
+I will guide you through the process in the upcoming parts of this series.
+
+In [the next part](develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes "Jump to the next part of this series and read on...") of this series I will explain, why this example from the "Getting Started"-guide would not work as a real application and what has to be done, to fix that.
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes.md b/content/posts/develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes.md
new file mode 100644 (file)
index 0000000..d0969e2
--- /dev/null
@@ -0,0 +1,189 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - howto
+date: "2016-01-22T16:19:12+00:00"
+guid: http://juplo.de/?p=579
+parent_post_id: null
+post_id: "579"
+tags:
+  - createmedia.nrw
+  - facebook
+  - graph-api
+  - java
+  - oauth2
+  - spring
+  - spring-boot
+  - spring-social
+title: 'Develop a Facebook-App with Spring-Social - Part I: Behind the Scenes'
+url: /develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes/
+
+---
+In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social").
+
+In [the last and first part of this series](/develop-a-facebook-app-with-spring-social-part-00/ "Read part 0 of this series, to get prepared!"), I prepared you for our little course.
+
+In this part we will take a look behind the scenes and learn more about the autoconfiguration performed by Spring-Boot, which made our first small example so automagically.
+
+## The Source is With You
+
+You can find the source-code on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
+and [browse it via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
+Check out `part-01` to get the source for this part of the series.
+
+## Our Silent Servant Behind the Scenes: Spring-Boot
+
+While looking at our simple example from the last part of this series, you may have wondered, how all this is wired up.
+You can log in a user from facebook, access his public profile and all this without one line of configuration.
+
+**This is achieved via [Spring-Boot autoconfiguration](http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-auto-configuration "Learn more about Spring-Boot's autoconfiguration-mechanism").**
+
+What comes in very handy in the beginning, sometimes get's in your way, when your project grows.
+This may happen, because these parts of the code are not under your control and you do not know what the autoconfiguration is doing on your behalf.
+Because of that, in this part of our series, we will rebuild the most relevant parts of the configuration by hand.
+As you will see later, this is not only an exercise, but will lead us to the first improvement of our little example.
+
+## What Is Going On Here?
+
+In our case, two Spring-Boot configuration-classes are defining the configuration.
+These two classes are [SocialWebAutoConfiguration](https://github.com/spring-projects/spring-boot/blob/v1.3.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java "View the class on github") and [FacebookAutoConfiguration](https://github.com/spring-projects/spring-boot/blob/v1.3.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/FacebookAutoConfiguration.java "View the class on github").
+Both classes are located in the package [spring-boot-autoconfigure](https://github.com/spring-projects/spring-boot/tree/v1.3.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social "View the package on github").
+
+The first one configures the `ConnectController`, sets up an instance of `InMemoryUsersConnectionRepository` as persitent store for user/connection-mappings and sets up a `UserIdService` on our behalf, that always returns the user-id `anonymous`.
+
+The second one adds an instance of `FacebookConnectionFactory` to the list of available connection-factories, if the required properties ( `spring.social.facebook.appId` and `spring.social.facebook.appSecret`) are available.
+It also configures, that a request-scoped bean of the type `Connection<Facebook>` is created for each request, that has a known user, who is connected to the Graph-API.
+
+## Rebuild This Configuration By Hand
+
+The following class rebuilds the same configuration explicitly:
+
+```Java
+@Configuration
+@EnableSocial
+public class SocialConfig extends SocialConfigurerAdapter
+{
+  /**
+   * Add a {@link FacebookConnectionFactory} to the configuration.
+   * The factory is configured through the keys <code>facebook.app.id</code>
+   * and <,code>facebook.app.secret</code>.
+   *
+   * @param config
+   * @param env
+   */
+  @Override
+  public void addConnectionFactories(
+      ConnectionFactoryConfigurer config,
+      Environment env
+      )
+  {
+    config.addConnectionFactory(
+        new FacebookConnectionFactory(
+            env.getProperty("facebook.app.id"),
+            env.getProperty("facebook.app.secret")
+            )
+        );
+  }
+
+  /**
+   * Configure an instance of {@link InMemoryUsersConnection} as persistent
+   * store of user/connection-mappings.
+   *
+   * At the moment, no special configuration is needed.
+   *
+   * @param connectionFactoryLocator
+   *     The {@link ConnectionFactoryLocator} will be injected by Spring.
+   * @return
+   *     The configured {@link UsersConnectionRepository}.
+   */
+  @Override
+  public UsersConnectionRepository getUsersConnectionRepository(
+      ConnectionFactoryLocator connectionFactoryLocator
+      )
+  {
+    InMemoryUsersConnectionRepository repository =
+        new InMemoryUsersConnectionRepository(connectionFactoryLocator);
+    return repository;
+  }
+
+  /**
+   * Configure a {@link UserIdSource}, that is equivalent to the one, that is
+   * created by Spring-Boot.
+   *
+   * @return
+   *     An instance of {@link AnonymousUserIdSource}.
+   *
+   * @see {@link AnonymousUserIdSource}
+   */
+  @Override
+  public UserIdSource getUserIdSource()
+  {
+    return new AnonymousUserIdSource();
+  }
+
+  /**
+   * Configuration of the controller, that handles the authorization against
+   * the Facebook-API, to connect a user to Facebook.
+   *
+   * At the moment, no special configuration is needed.
+   *
+   * @param factoryLocator
+   *     The {@link ConnectionFactoryLocator} will be injected by Spring.
+   * @param repository
+   *     The {@link ConnectionRepository} will be injected by Spring.
+   * @return
+   *     The configured controller.
+   */
+  @Bean
+  public ConnectController connectController(
+      ConnectionFactoryLocator factoryLocator,
+      ConnectionRepository repository
+      )
+  {
+    ConnectController controller =
+        new ConnectController(factoryLocator, repository);
+    return controller;
+  }
+
+  /**
+   * Configure a scoped bean named <code>facebook</code>, that enables
+   * access to the Graph-API in the name of the current user.
+   *
+   * @param repository
+   *     The {@link ConnectionRepository} will be injected by Spring.
+   * @return
+   *     A {@Connection}, that represents the authorization of the
+   *     current user against the Graph-API, or null, if the
+   *     current user is not connected to the API.
+   */
+  @Bean
+  @Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
+  public Facebook facebook(ConnectionRepository repository)
+  {
+    Connection connection =
+        repository.findPrimaryConnection(Facebook.class);
+    return connection != null ? connection.getApi() : null;
+  }
+}
+
+```
+
+If you run this refined version of our app, you will see, that it behaves in exact the same way, as the initial version.
+
+## Coming next
+
+You may ask, why we should rebuild the configuration by hand, if it does the same thing.
+This is, because the example, so far, would not work as a real app.
+The first step, to refine it, is to take control of the configuration.
+
+In [the next part](develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works "Jump to the third part of this series and read on...") of this series, I will show you, why this is necessary.
+But, first, we have to take a short look into Spring Social.
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works.md b/content/posts/develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works.md
new file mode 100644 (file)
index 0000000..5d93567
--- /dev/null
@@ -0,0 +1,95 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - howto
+date: "2016-01-22T23:10:04+00:00"
+guid: http://juplo.de/?p=592
+parent_post_id: null
+post_id: "592"
+tags:
+  - createmedia.nrw
+  - facebook
+  - graph-api
+  - java
+  - oauth2
+  - spring
+  - spring-boot
+  - spring-social
+title: 'Develop a Facebook-App with Spring-Social - Part II: How Spring Social Works'
+url: /develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works/
+
+---
+In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social").
+
+In [the last part of this series](/develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes/ "Read part 1 of this series, to take a look behind the scenes!"), we took control of the autoconfiguration, that Spring Boot had put in place for us.
+But there is still a lot of magic in our little example, that was borrowed from [the offical "Getting Started"-guides](http://spring.io/guides/gs/accessing-facebook/ "Read the official guide") or at least, it looks so.
+
+## First Time In The Electric-Wonder-Land
+
+When I first run the example, I wondered like _"Wow, how does this little piece of code figures out which data to fetch? How is Spring Social told, which data to fetch? That must be stored in the session, or so! But where is that configured?"_ and so on and so on.
+
+When we connect to Facebook, Facebook tells Spring Social, which user is logged in and if this user authorizes the requested access.
+We get an access-token from facebook, that can be used to retrieve user-related data from the Graph-API.
+Our application has to manage this data.
+
+Spring Social assists us on that task.
+But in the end, we have to make the decisions, how to deal with it.
+
+## Whom Are You Intrested In?
+
+Spring Social provides the concept of a `ConnectionRepository`, which is used to persist the connections of specific user.
+Spring Social also provides the concept of a `UsersConnectionRepository`, which stores, whether a user is connected to a specific social service or not.
+As described in [the official documentation](http://docs.spring.io/spring-social/docs/1.1.4.RELEASE/reference/htmlsingle/#configuring-connectcontroller "For further details, please read  the official implementations"), Spring Social uses the `UsersConnectionRepository` to create a request-scoped `ConnectionRepository` bean (the bean named `facebook` in [our little example](/develop-a-facebook-app-with-spring-social-part-00/#HomeController "Go back to part 00, to reread the code-example, that uses this bean to access the facebook-data")), that is used by us to access the Graph-API.
+
+**But to be able to do so, it must know _which user_ we are interested in!**
+
+Hence, Spring Social requires us to configure a `UserIdSource`.
+Every time, when it prepares a request for us, Spring Social will ask this source, which user we are interested in.
+
+Attentive readers might have noticed, that we have configured such a source, when we were [explicitly rebuilding](/develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes/ "Jump back to re-read our explicitly rebuild configuration") the automatic default-configuration of Spring Boot:
+
+```Java
+public class AnonymousUserIdSource implements UserIdSource
+{
+  @Override
+  public String getUserId()
+  {
+    return "anonymous";
+  }
+}
+
+```
+
+## No One Special...
+
+But what is that?!?
+All the time we are only interested in one and the same user, whose connections should be stored under the key `anonymous`?
+
+**And what will happen, if a second user connects to our app?**
+
+## Let's Test That!
+
+To see what happens, if more than one user connects to your app, you have to create a [test user](https://developers.facebook.com/docs/apps/test-users "Read more about test users").
+This is very simple.
+Just go to the dashboard of your app, select the menu-item _"Roles"_ and click on the tab _"Test Users"_.
+Select a test user (or create a new one) and click on the _"Edit"_-button.
+There you can select _"Log in as this test user"_.
+
+**If you first connect to the app as yourself and afterwards as test user, you will see, that your data is presented to the test user.**
+
+That is, because we are telling Spring Social that every user is called `anonymous`.
+Hence, every user is the same for Spring Social!
+When the test user fetches the page, after you have connected to Facebook as yourself, Spring-Social is thinking, that the same user is returning and serves your data.
+
+## Coming next...
+
+In [the next part](develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source "Jump to the next part of this series and read on...") of this series, we will try to teach Spring Social to distinguish between several users.
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source.md b/content/posts/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source.md
new file mode 100644 (file)
index 0000000..f3241df
--- /dev/null
@@ -0,0 +1,196 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - howto
+date: "2016-01-25T13:43:26+00:00"
+guid: http://juplo.de/?p=613
+parent_post_id: null
+post_id: "613"
+tags:
+  - createmedia.nrw
+  - facebook
+  - graph-api
+  - java
+  - oauth2
+  - spring
+  - spring-boot
+  - spring-social
+title: 'Develop a Facebook-App with Spring-Social – Part III: Implementing a UserIdSource'
+url: /develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source/
+
+---
+In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social")
+
+In [the last part of this series](/develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works/ "Read part 2 of this series, to understand, why the first example cannot work as a real app!"), I explained, why the nice little example from the Getting-Started-Guide " [Accessing Facebook Data](http://spring.io/guides/gs/accessing-facebook/ "Read the official Getting-Started-Guide")" cannot function as a real facebook-app.
+
+In this part, we will try to solve that problem, by implementing a `UserIdSource`, that tells Spring Social, which user it should connect to the API.
+
+## The Source is With You
+
+You can find the source-code on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
+and [browse it via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
+Check out `part-03` to get the source for this part of the series.
+
+## Introducing `UserIdSource`
+
+The `UserIdSource` is used by Spring Social to ask us, which user it should connect with the social net.
+Clearly, to answer that question, we must remeber, which user we are currently interested in!
+
+## Remember Your Visitors
+
+In order to remember the current user, we implement a simple mechanism, that stores the ID of the current user in a cookie and retrieves it from there for subsequent calls.
+This concept was borrowed — again — from [the official code examples](https://github.com/spring-projects/spring-social-samples "Clone the official code examples from GitHub").
+You can find it for example in the [quickstart-example](https://github.com/spring-projects/spring-social-samples/tree/master/spring-social-quickstart "Clone the quickstart-example from GitHub").
+
+**It is crucial to stress, that this concept is inherently insecure and should never be used in a production-environment.**
+As the ID of the user is stored in a cookie, an attacker could simply take over control by sending the ID of any currently connected user, he is interested in.
+
+The concept is implemented here only for educational purposes.
+It will be replaced by Spring Security later on.
+But for the beginning, it is easier to understand, how Spring Social works, if we implement a simple version of the mechanism ourself.
+
+## Pluging in Our New Memory
+
+The internals of our implementation are not of interest.
+You may explore them by yourself.
+In short, it stores the ID of each new user in a cookie.
+By inspecting that cookie, it can restore the ID of the user on subsequent calls.
+
+What is from interest here is, how we can plug in this simple example-mechanism in Spring Social.
+
+Mainly, there are two hooks to do that, that means: two interfaces, we have to implement:
+
+1. **UserIdSource**:
+   Spring Social uses an instance of this interface to ask us, which users authorizations it should load from its persistent store of user/connection-mappings.
+   We already have seen an implementation of that one in [the last part of our series](develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works/#AnonymousUserIdSource "Jump back to the last part of our series").
+
+1. **ConnectionSignUp**:
+   Spring Social uses an instance of this interface, to ask us about the name it should use for a new user during sign-up.
+
+## Implementation
+
+The implementation of `ConnectionSignUp` simply uses the ID, that is provided by the social network.
+Since we are only signing in users from Facebook, these ID's are guaranteed to be unique.
+
+```Java
+public class ProviderUserIdConnectionSignUp implements ConnectionSignUp
+{
+  @Override
+  public String execute(Connection connection)
+  {
+    return connection.getKey().getProviderUserId();
+  }
+}
+
+```
+
+The implementation of `UserIdSource` retrieves the ID, that was stored in the `SecurityContext` (our simple implementation — not to be confused with the class from Spring Security).
+If no user is stored in the `SecurityContext`, it falls back to the old behavior and returns the fix id `anonymous`.
+
+```Java
+public class SecurityContextUserIdSource implements UserIdSource
+{
+  private final static Logger LOG =
+      LoggerFactory.getLogger(SecurityContextUserIdSource.class);
+
+  @Override
+  public String getUserId()
+  {
+    String user = SecurityContext.getCurrentUser();
+    if (user != null)
+    {
+      LOG.debug("found user \"{}\" in the security-context", user);
+    }
+    else
+    {
+      LOG.info("found no user in the security-context, using \"anonymous\"");
+      user = "anonymous";
+    }
+    return user;
+  }
+}
+
+```
+
+## Actual Plumbing
+
+To replace the `AnonymousUserIdSource` by our new implementation, we simply instantiate that instead of the old one in our configuration-class `SocialConfig`:
+
+```Java
+@Override
+public UserIdSource getUserIdSource()
+{
+  return new SecurityContextUserIdSource();
+}
+
+```
+
+There are several ways to plug in the `ConnectionSignUp`.
+I decided, to plug it into the instance of `InMemoryUsersConnectionRepository`, that our configuration uses, because this way, the user will be signed up automatically on sign in, if it is not known to the application:
+
+```Java
+@Override
+public UsersConnectionRepository getUsersConnectionRepository(
+    ConnectionFactoryLocator connectionFactoryLocator
+    )
+{
+  InMemoryUsersConnectionRepository repository =
+      new InMemoryUsersConnectionRepository(connectionFactoryLocator);
+  repository.setConnectionSignUp(new ProviderUserIdConnectionSignUp());
+  return repository;
+}
+
+```
+
+This makes sense, because our facebook-app uses Facebook, to sign in its users, and, because of that, does not have its own user-model.
+It can just reuse the user-data provided by facebook.
+
+The other approach would be, to officially sign up users, that are not known to the app.
+This is achieved, by redirecting to a special URL, if a sign-in fails, because the user is unknown.
+These URL then presents a formular for sign-up, which can be prepopulated with the user-data provided by the social network.
+You can read more about this approach in the [official documentation](http://docs.spring.io/spring-social/docs/1.1.4.RELEASE/reference/htmlsingle/#signing-up-after-a-failed-sign-in "Read more on signing up after a faild sign-in in the official documentation").
+
+## Run It!
+
+So, let us see, if our refinement works. Run the following command and log into your app with at least two different users:
+
+```bash
+git clone /git/examples/facebook-app/
+cd facebook-app
+checkout part-00
+mvn spring-boot:run \
+    -Dfacebook.app.id=YOUR_ID \
+    -Dfacebook.app.secret=YOUR_SECRET \
+    -Dlogging.level.de.juplo.yourshouter=debug
+
+```
+
+(The last part of the command turns on the `DEBUG` logging-level, to see in detail, what is going on.
+
+## But What The \*\#! Is Going On There?!?
+
+**Unfortunately, our application shows exactly the same behavior as, before our last refinement.**
+Why that?
+
+If you run the application in a debugger and put a breakpoint in our implementation of `ConnectionSignUp`, you will see, that this code is never called.
+But it is plugged in in the right place and should be called, if _a new user signs in_!
+
+The solution is, that we are using the wrong mechanism.
+We are still using the `ConnectController` which was configured in the simple example, we extended.
+But this controller is meant to connect a _known user_ to one or more _new social services_.
+This controller assumes, that the user is already signed in to the application and can be retrieved via the configured `UserIdSource`.
+
+**To sign in a user to our application, we have to use the `ProviderSignInController` instead!**
+
+## Coming next...
+
+In [the next part](/develop-a-facebook-app-with-spring-social-part-04-signing-in-users "Jump to the next part of this series and read on...") of this series, I will show you, how to change the configuration, so that the `ProviderSignInController` is used to sign in (and automatically sign up) users, that were authenticated through the Graph-API from Facebook.
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/develop-a-facebook-app-with-spring-social-part-04-signing-in-users.md b/content/posts/develop-a-facebook-app-with-spring-social-part-04-signing-in-users.md
new file mode 100644 (file)
index 0000000..fd02246
--- /dev/null
@@ -0,0 +1,138 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - howto
+date: "2016-01-25T17:59:59+00:00"
+guid: http://juplo.de/?p=626
+parent_post_id: null
+post_id: "626"
+tags:
+  - createmedia.nrw
+  - facebook
+  - graph-api
+  - java
+  - oauth2
+  - spring
+  - spring-boot
+  - spring-social
+title: 'Develop a Facebook-App with Spring-Social – Part IV: Signing In Users'
+url: /develop-a-facebook-app-with-spring-social-part-04-signing-in-users/
+
+---
+In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social")
+
+In [the last part of this series](/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source "Go back to part 3 of this series, to learn how you plug in user-recognition into Spring Social"), we tried to teach Spring Social how to remember our signed in users and learned, that we have to sign in a user first.
+
+In this part, I will show you, how you sign (and automatically sign up) users, that are authenticated via the Graph-API.
+
+## The Source is With You
+
+You can find the source-code on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
+and [browse it via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
+Check out `part-04` to get the source for this part of the series.
+
+## In Or Up? Up And In!
+
+In the last part of our series we ran in the problem, that we wanted to connect several (new) users to our application.
+We tried to achieve that, by extending our initial configuration.
+But the mistake was, that we tried to _connect_ new users.
+In the world of Spring Social we can only connect a _known user_ to a _new social service_.
+
+To know a user, Spring Social requires us to _sign in_ that user.
+But again, if you try to _sign in_ a _new user_, Spring Social requires us to _sign up_ that user first.
+Because of that, we had already implemented a [`ConnectionSignUp`](/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source/#ProviderUserIdConnectionSignUp "Jump back to the last part and view the source of our implementation") and [configured Spring Social to call it](/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source/#plumbing-ConnectionSignUp "Jump back to the last part to view how we pluged in our ConnectionSignUp"), whenever it does not know a user, that was authenticated by Facebook.
+If you forget that (or if you remove the according configuration, that tells Spring Social to use our `ConnectionSignUp`), Spring Social will redirect you to the URL `/signup` — a Sign-Up page you have to implement — after a successfull authentication of a user, that Spring Social does not know yet.
+
+The confusion — or, to be honest, _my_ confusion — about _sign in_ and _sign up_ arises from the fact, that we are developing a Facebook-Application.
+We do not care about signing up users.
+Each user, that is known to Facebook — that is, who has signed up to Facebook — should be able to use our application.
+An explicit sign-up to our application is not needed and not wanted.
+So, in our use-case, we have to implement the automatically sign-up of new users.
+But Spring Social is designed for a much wider range of use cases.
+Hence, it has to distinguish between sign-in and sign-up.
+
+## Implementation Of The Sign-In
+
+Spring Social provides the interface `SignInAdapter`, that it calls every time, it has authenticated a user against a social service.
+This enables us, to be aware of that event and remember the user for subsequent calls.
+Our implementation stores the user in our `SecurityContext` to sign him in and creates a cookie to remember him for subsequent calls:
+
+```Java
+public class UserCookieSignInAdapter implements SignInAdapter
+{
+  private final static Logger LOG =
+      LoggerFactory.getLogger(UserCookieSignInAdapter.class);
+
+  @Override
+  public String signIn(
+      String user,
+      Connection connection,
+      NativeWebRequest request
+      )
+  {
+    LOG.info(
+        "signing in user {} (connected via {})",
+        user,
+        connection.getKey().getProviderId()
+        );
+    SecurityContext.setCurrentUser(user);
+    UserCookieGenerator
+        .INSTANCE
+        .addCookie(usSigning In Userser, request.getNativeResponse(HttpServletResponse.class));
+
+    return null;
+  }
+}
+
+```
+
+It returns `null`, to indicate, that the user should be redirected to the default-URL after an successful sign-in.
+This URL can be configured in the `ProviderSignInController` and defaults to `/`, which matches our use-case.
+If you return a string here, for example `/welcome.html`, the controller would ignore the configured URL and redirect to that URL after a successful sign-in.
+
+## Configuration Of The Sign-In
+
+To enable the Sign-In, we have to plug our `SignInAdapter` into the `ProviderSignInController`:
+
+```Java
+@Bean
+public ProviderSignInController signInController(
+    ConnectionFactoryLocator factoryLocator,
+    UsersConnectionRepository repository
+    )
+{
+  ProviderSignInController controller = new ProviderSignInController(
+      factoryLocator,
+      repository,
+      new UserCookieSignInAdapter()
+      );
+  return controller;
+}
+
+```
+
+Since we are using Spring Boot, an alternative configuration would have been to just create a bean-instance of our implementation named `signInAdapter`.
+Then, the auto-configuration of Spring Boot would discover that bean, create an instance of `ProviderSignInController` and plug in our implementation for us.
+If you want to learn, how that works, take a look at the implementation of the auto-configuration in the class [SocialWebAutoConfiguration](https://github.com/spring-projects/spring-boot/blob/v1.3.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java#L112 "Jump to GitHub to study the implementation of the SocialWebAutoConfiguration"), lines 112ff.
+
+## Run it!
+
+If you run our refined example and visit it after impersonating different facebook-users, you will see that everything works as expected now.
+If you visit the app for the first time (after a restart) with a new user, the user is signed up and in automatically and a cookie is generated, that stores the Facebook-ID of the user in the browser.
+On subsequent calls, his ID is read from this cookie and the corresponding connection is restored from the persistent store by Spring Social.
+
+## Coming Next...
+
+In [the next part](/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic "Jump to the next part of this series and read on...") of this little series, we will move the redirect-if-unknown logic from our `HomeController` into our `UserCookieInterceptor`, so that the behavior of our so-called "security"-concept more closely resembles the behavior of Spring Security.
+That will ease the migration to that solution in a later step.
+
+Perhaps you want to skip that, rather short and boring step and jump to the part after the next, that explains, how to sign in users by the `signed_request`, that Facebook sends, if you integrate your app as a canvas-page.
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic.md b/content/posts/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic.md
new file mode 100644 (file)
index 0000000..2f571ba
--- /dev/null
@@ -0,0 +1,124 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - howto
+date: "2016-01-26T14:34:23+00:00"
+guid: http://juplo.de/?p=644
+parent_post_id: null
+post_id: "644"
+tags:
+  - createmedia.nrw
+  - facebook
+  - graph-api
+  - java
+  - oauth2
+  - spring
+  - spring-boot
+  - spring-social
+title: 'Develop a Facebook-App with Spring-Social – Part V: Refactor The Redirect-Logic'
+url: /develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic/
+
+---
+In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social")
+
+In [the last part of this series](/develop-a-facebook-app-with-spring-social-part-04-signing-in-users "Go back to part 4 of this series, to learn how to sign in users"), we reconfigured our app, so that users are signed in after an authentication against Facebook and new users are signed up automatically on the first visit.
+
+In this part, we will refactor our redirect-logic for unauthenticated users, so that it more closely resembles the behavior of Spring Social, hence, easing the planed switch to that technology in a feature step.
+
+## The Source is With You
+
+You can find the source-code on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
+and [browse it via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
+Check out `part-05` to get the source for this part of the series.
+
+## Mimic Spring Security
+
+**To stress that again: our simple authentication-concept is only meant for educational purposes. [It is inherently insecure!](/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source#remember "Jump back to part 3 to learn, why our authentication-concept is insecure")**
+We are not refining it here, to make it better or more secure.
+We are refining it, so that it can be replaced with Spring Security later on, without a hassle!
+
+In our current implementation, a user, who is not yet authenticated, would be redirected to our sign-in-page only, if he visits the root of our webapp ( `/`).
+To move all redirect-logic out of `HomeController` and redirect unauthenicated users from all pages to our sign-in-page, we can simply modify our interceptor `UserCookieInterceptor`, which already intercepts each and every request.
+
+We refine the method `preHandle`, so that it redirects every request to our sign-in-page, that is not authenticated:
+
+```Java
+@Override
+public boolean preHandle(
+    HttpServletRequest request,
+    HttpServletResponse response,
+    Object handler
+    )
+    throws
+      Exception
+{
+  if (request.getServletPath().startsWith("/signin"))
+    return true;
+
+  String user = UserCookieGenerator.INSTANCE.readCookieValue(request);
+  if (user != null)
+  {
+    if (!repository
+        .findUserIdsConnectedTo("facebook", Collections.singleton(user))
+        .isEmpty()
+        )
+    {
+      LOG.info("loading user {} from cookie", user);
+      SecurityContext.setCurrentUser(user);
+      return true;
+    }
+    else
+    {
+      LOG.warn("user {} is not known!", user);
+      UserCookieGenerator.INSTANCE.removeCookie(response);
+    }
+  }
+
+  response.sendRedirect("/signin.html");
+  return false;
+}
+
+```
+
+If the user, that is identified by the cookie, is not known to Spring Security, we send a redirect to our sign-in-page and flag the request as already handled, by returning `false`.
+To prevent an endless loop of redirections, we must not redirect request, that were already redirected to our sign-in-page.
+Since these requests hit our webapp as a new request for the different location, we can filter out and wave through at the beginning of this method.
+
+## Run It!
+
+That is all there is to do.
+Run the app and call the page `http://localhost:8080/profile.html` as first request.
+You will see, that you will be redirected to our sigin-in-page.
+
+## Cleaning Up Behind Us...
+
+As it is now not possible, to call any page except the sigin-up-page, without beeing redirected to our sign-in-page, if you are not authenticated, it is impossible to call any page without being authenticated.
+Hence, we can (and should!) refine our `UserIdSource`, to throw an exception, if that happens anyway, because it has to be a sign for a bug:
+
+```Java
+public class SecurityContextUserIdSource implements UserIdSource
+{
+
+  @Override
+  public String getUserId()
+  {
+    Assert.state(SecurityContext.userSignedIn(), "No user signed in!");
+    return SecurityContext.getCurrentUser();
+  }
+}
+
+```
+
+## Coming Next...
+
+In the next part of this series, we will enable users to sign in through the canvas-page of our app.
+The canvas-page is the page that Facebook embeds into its webpage, if we render our app inside of Facebook.
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page.md b/content/posts/develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page.md
new file mode 100644 (file)
index 0000000..3ed3ef5
--- /dev/null
@@ -0,0 +1,175 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - howto
+date: "2016-01-26T16:05:28+00:00"
+guid: http://juplo.de/?p=671
+parent_post_id: null
+post_id: "671"
+tags:
+  - createmedia.nrw
+  - facebook
+  - graph-api
+  - java
+  - oauth2
+  - spring
+  - spring-boot
+  - spring-social
+title: 'Develop a Facebook-App with Spring-Social – Part VI: Sign In Users Through The Canvas-Page'
+url: /develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page/
+
+---
+In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social")
+
+In [the last part of this series](/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic/ "Read part 5 of this series"), we refactored our authentication-concept, so that it can be replaced by Spring Security later on more easy.
+
+In this part, we will turn our app into a real Facebook-App, that is rendered inside Facebook and signs in users through the `signed_request`.
+
+## The Source is With You
+
+You can find the source-code on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
+and [browse it via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
+Check out `part-06` to get the source for this part of the series.
+
+## What The \*\#&! Is a `signed_request`
+
+If you add the platform **Facebook Canvas** to your app, you can present your app inside of Facebook.
+It will be accessible on a URL like **`https://apps.facebook.com/YOUR_NAMESPACE`** then and if a (known!) user accesses this URL, facebook will send a [`signed_request`](https://developers.facebook.com/docs/reference/login/signed-request "Read more about the fields, that are contained in the signed_request"), that already contains some data of this user an an authorization to retrieve more.
+
+## Sign In Users With `signed_request` In 5 Simple Steps
+
+As I first tried to extend the [simple example](http://spring.io/guides/gs/accessing-facebook/ "Read the original guide, this article-series is based on"), this article-series is based on, I stumbled across multiple misunderstandings.
+But now, as I guided you around all that obstacles, it is fairly easy to refine our app, so that is can sign in users through the signed\_request, send to a Canvas-Page.
+
+You just have to:
+
+1. Add the platform "Facebook Canvas" in the settings of your app and choose a canvas-URL.
+1. Reconfigure your app to support HTTPS, because Facebook requires the canvas-URL to be secured by SSL.
+1. Configure the `CanvasSignInController`.
+1. Allow the URL of the canvas-page to be accessed unauthenticated.
+1. Enable Sign-Up throw your canvas-page.
+
+That is all, there is to do.
+But now, step by step...
+
+## Step 1: Turn Your App Into A Canvas-Page
+
+Go to the settings-panel of your app on [https://developers.facebook.com/apps](https://developers.facebook.com/apps "Log in to your developer-account on Facebook now") and click on _Add Platform_.
+Choose _Facebook Canvas_.
+Pick a secure URL, where your app will serve the canvas-page.
+
+For example: `https://localhost:8443`.
+
+Be aware, that the URL has to be publicly available, if you want to enable other users to access your app.
+But that also counts for the Website-URL `http://localhost:8080`, that we are using already.
+
+Just remember, if other people should be able to access your app later, you have to change these URL's to something, they can access, because all the content of your app is served by you, not by Facebook.
+A Canvas-App just embedds your content in an iFrame inside of Facebook.
+
+## Step 2: Reconfigure Your App To Support HTTPS
+
+Add the following lines to your `src/main/resources/application.properties`:
+
+```properties
+server.port: 8443
+server.ssl.key-store: keystore
+server.ssl.key-store-password: secret
+
+```
+
+I have included a self-signed `keystore` with the password `secret` in the source, that you can use for development and testing.
+But of course, later, you have to create your own keystore with a certificate that is signed by an official certificate authority, that is known by the browsers of your users.
+
+Since your app now listens on `8443` an uses `HTTPS`, you have to change the URL, that is used for the platform "Website", if you want your sign-in-page to continue to work in parallel to the sign-in through the canvas-page.
+
+For now, you can simply change it to `https://locahost:8443/` in the settings-panel of your app.
+
+## Step 3: Configure the `CanvasSignInController`
+
+To actually enable the [automatic handling](https://developers.facebook.com/docs/games/gamesonfacebook/login#usingsignedrequest "Read about all the cumbersome steps, that would be necesarry, if you had to handle a signed_requst by yourself") of the `signed_request`, that is, decoding the `signed_request` and sign in the user with the data provided in the `signed_request`, you just have to add the `CanvasSignInController` as a bean in your `SocialConfig`:
+
+```Java
+@Bean
+public CanvasSignInController canvasSignInController(
+    ConnectionFactoryLocator connectionFactoryLocator,
+    UsersConnectionRepository usersConnectionRepository,
+    Environment env
+    )
+{
+  return
+      new CanvasSignInController(
+          connectionFactoryLocator,
+          usersConnectionRepository,
+          new UserCookieSignInAdapter(),
+          env.getProperty("facebook.app.id"),
+          env.getProperty("facebook.app.secret"),
+          env.getProperty("facebook.app.canvas")
+          );
+}
+
+```
+
+## Step 4: Allow the URL Of Your Canvas-Page To Be Accessed Unauthenticated
+
+Since [we have "secured" all of our pages](/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic "Read more about the refactoring, that ensures, that every request, that is made to our app, is authenticated") except of our sign-in-page `/signin*`, so that they can only be accessed by an authenticated user, we have to explicitly allow unauthenticated access to our new special sign-in-page.
+
+To achieve that, we have to refine our [`UserCookieInterceptor`](/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic#redirect "Compare the changes to the unchanged method of our UserCookieInterceptor") as follows.
+First add a pattern for all pages, that are allowed to be accessed unauthenticated:
+
+```Java
+private final static Pattern PATTERN = Pattern.compile("^/signin|canvas");
+
+```
+
+Then match the requests against this pattern, instead of the fixed string `/signin`:
+
+```Java
+if (PATTERN.matcher(request.getServletPath()).find())
+  return true;
+
+```
+
+## Step 5: Enable Sign-Up Through Your Canvas-Page
+
+Facebook always sends a `signed_request` to your app, if a user visits your app through the canvas-page.
+But on the first visit of a user, the `signed_request` does not authenticate the user.
+In this case, the only data that is presented to your page is the language and locale of the user and his or her age.
+
+Because the data, that is needed to sign in the user, is missing, the `CanvasSignInController` will issue an explicit authentication-request to the Graph-API via a so called [Server-Side Log-In](https://developers.facebook.com/docs/games/gamesonfacebook/login#serversidelogin "Read more details about the process of a Server-Side Log-In on Facebook").
+This process includes a redirect to the Login-Dialog of Facebook and then a second redirect back to your app.
+It requires the specification of a full absolute URL to redirect back to.
+
+Since we are configuring the canvas-login-in, we want, that new users are redirected to the canvas-page of our app.
+Hence, you should use the Facebook-URL of your app: `https://apps.facebook.com/YOUR_NAMESPACE`.
+This will result in a call to your canvas-page with a `signed_request`, that authenticates the new user, if the user accepts to share the requested data with your app.
+
+Any other page of your app would work as well, but the result would be a call to the stand-alone version of your app (the version of your app that is called the "Website"-platform of your app by Facebook), meaning, that your app is not rendered inside of Facebook.
+Also it requires one more call of your app to the Graph-API to actually sign-in the new user, because Facebook sends the `signed_request` only the canvas-page of your app.
+
+To specify the URL I have introduced a new attribute `facebook.app.canvas` that is handed to the `CanvasSignInController`.
+You can specifiy it, when starting your app:
+
+```bash
+mvn spring-boot:run \
+    -Dfacebook.app.id=YOUR_ID \
+    -Dfacebook.app.secret=YOUR_SECRET \
+    -Dfacebook.app.canvas=https://apps.facebook.com/YOUR_NAMESPACE
+
+```
+
+Be aware, that this process requires the automatic sign-up of new users, that we enabled in [part 3](/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source#plumbing-UserIdSource "Jump back to part 3 of this series to reread, how we enabled the automatic sign-up") of this series.
+Otherwise, the user would be redirected to the sign-up-page of your application, after he allowed your app to access the requested data.
+Obviously, that would be very confusing for the user, so we really nead automati sign-up in this use-case!
+
+## Coming Next...
+
+In [the next part](/develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire/ "Jump to the next part of this series and learn how to turn on debugging for the HTTP-communication between your app and the Graph-API") of this series, I will show you, how you can debug the calls, that Spring Social makes to the Graph-API, by turning on the debugging of the classes, that process the HTTP-requests and -responses, that your app is making.
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire.md b/content/posts/develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire.md
new file mode 100644 (file)
index 0000000..8ba4d91
--- /dev/null
@@ -0,0 +1,110 @@
+---
+_edit_last: "2"
+_wp_old_slug: develop-a-facebook-app-with-spring-social-part-07-whats-on-the-wire
+author: kai
+categories:
+  - howto
+date: "2016-01-29T09:18:33+00:00"
+guid: http://juplo.de/?p=694
+parent_post_id: null
+post_id: "694"
+tags:
+  - createmedia.nrw
+  - facebook
+  - graph-api
+  - java
+  - oauth2
+  - spring
+  - spring-boot
+  - spring-social
+title: 'Develop a Facebook-App with Spring-Social – Part VII: What is Going On On The Wire'
+url: /develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire/
+
+---
+In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social")
+
+In [the last part of this series](/develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page "Read part 6 of this series to learn, how you turn your spring-social-app into a real facebook-app"), I showed you, how you can sign-in your users through the `signed_request`, that is send to your canvas-page.
+
+In this part, I will show you, how to turn on logging of the HTTP-requests, that your app sends to, and the -responses it recieves from the Facebook Graph-API.
+
+## The Source is With You
+
+You can find the source-code on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
+and [browse it via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
+Check out `part-07` to get the source for this part of the series.
+
+## Why You Want To Listen On The Wire
+
+If you are developing your app, you will often wonder, why something does not work as expected.
+In this case, it is often very usefull to be able to debug the communitation between your app and the Graph-API.
+But since all requests to the Graph-API are secured by SSL you can not simply listen in with tcpdump or wireshark.
+
+Fortunately, you can turn on the debugging of the underling classes, that process theses requests, to sidestep this problem.
+
+## Introducing HttpClient
+
+In its default-configuration, the Spring Framework will use the `HttpURLConnection`, which comes with the JDK, as http-client.
+As described in the [documentation](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#rest-client-access "Read more about that in the Spring-documentation"), some advanced methods are not available, when using `HttpURLConnection`
+Besides, the package [`HttpClient`](https://hc.apache.org/httpcomponents-client-4.5.x/index.html "Visit the project home of Apache HttpClient"), which is part of Apaches `HttpComponents` is a much more mature, powerful and configurable alternative.
+For example, you easily can plug in connection pooling, to speed up the connection handling, or caching to reduce the amount of requests that go through the wire.
+In production, you should always use this implementation, instead of the default-one, that comes with the JDK.
+
+Hence, we will switch our configuration to use the `HttpClient` from Apache, before turning on the debug-logging.
+
+## Switching From Apaches `HttpCompnents` To `HttpClient`
+
+To siwtch from the default client, that comes with the JDK to Apaches `HttpClient`, you have to configure an instance of `HttpComponentsClientHttpRequestFactory` as `HttpRequestFactory` in your `SocialConfig`:
+
+```Java
+@Bean
+public HttpComponentsClientHttpRequestFactory requestFactory(Environment env)
+{
+  HttpComponentsClientHttpRequestFactory factory =
+      new HttpComponentsClientHttpRequestFactory();
+  factory.setConnectTimeout(
+      Integer.parseInt(env.getProperty("httpclient.timeout.connection"))
+      );
+  factory.setReadTimeout(
+      Integer.parseInt(env.getProperty("httpclient.timeout.read"))
+      );
+  return factory;
+}
+
+```
+
+To use this configuration, you also have to add the dependency `org.apache.httpcomonents:httpclient` in your `pom.xml`.
+
+As you can see, this would also be the right place to enable other specialized configuration-options.
+
+## Logging The Headers From HTTP-Requests And Responses
+
+I configured a short-cut to enable the logging of the HTTP-headers of the communication between the app and the Graph-API.
+Simply run the app with the additionally switch `-Dhttpclient.logging.level=DEBUG`
+
+## Take Full Control
+
+If the headers are not enough to answer your questions, you can enable a lot more debugging messages.
+You just have to overwrite the default logging-levels.
+Read [the original documentation of `HttpClient`](https://hc.apache.org/httpcomponents-client-4.5.x/logging.html "Jump to the logging-guide form HttpClient now."), for more details.
+
+For example, to enable logging of the headers and the content of all requests, you have to start your app like this:
+
+```bash
+mvn spring-boot:run \
+    -Dfacebook.app.id=YOUR_ID \
+    -Dfacebook.app.secret=YOUR_SECRET \
+    -Dfacebook.app.canvas=https://apps.facebook.com/YOUR_NAMESPACE
+    -Dlogging.level.org.apache.http=DEBUG \
+    -Dlogging.level.org.apache.http.wire=DEBUG
+
+```
+
+The second switch is necessary, because I defined the default-level `ERROR` for that logger in our `src/main/application.properties`, to enable the short-cut for logging only the headers.
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can.md b/content/posts/disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can.md
new file mode 100644 (file)
index 0000000..07c7d00
--- /dev/null
@@ -0,0 +1,52 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - html(5)
+  - wordpress
+date: "2018-07-20T11:23:50+00:00"
+guid: http://juplo.de/?p=255
+parent_post_id: null
+post_id: "255"
+title: Disable automatic p and br tags in the wordpress editor - and do it as early, as you can!
+url: /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/
+
+---
+## Why you should disable them as early, as you can
+
+I don't like visual HTML-editors, because they always mess up your HTML. So the first thing, that I've done in my wordpress-profile, was checking the check-box `Disable the visual editor when writing`.
+But today I found out, that this is worth nothing.
+Even when in text-mode, wordpress is adding some `<p>-` and `<br>`-tags automagically and, hence, is automagically messing up my neatly hand-crafted HTML-code.
+
+**Fuck wordpress!** _(Ehem - sorry for that outburst)_...
+
+But what is even worse: after [really turning off wordpress's automagically-messup-functionality](#disable "Jump to the tech-section, if you only want to find out, how to disable wordpress's auto-messup functionality"), nearly all my handwritten `<p>`-tags were gone, too.
+So, if you want to turn of automatic `<p>-` and `<br>`-tags, you should really do it as early, as you can. Otherwise, you will have to clean up all your old posts afterwards like me. TI've lost some hours with usless HTML-editing today, because of that sh#%&\*!
+
+## How to disable them
+
+The [wordpress-documentation of the build-in HTML-editor](https://codex.wordpress.org/TinyMCE#Automatic_use_of_Paragraph_Tags) links to [this post](http://redrokk.com/2010/08/16/removing-p-tags-in-wordpress/), which describs how to disable autmatic use of paragraph tags.
+Simple open the file `wp-includes/default-filters.php` of you wordpress-installation and comment out the following line:
+
+```html
+
+addfilter('the_content', 'wpautop');
+
+```
+
+If you are building your own wordpress-theme - like me - you alternatively can add the following to the `functions.php`-file of your theme:
+
+```html
+
+remove_filter('the_content', 'wpautop');
+
+```
+
+## Why you should disable automatic paragraph tags
+
+For example, I was wondering a while, where all that whitespace in my posts were coming from.
+Being used to handcraft my HTML, I often wrote one sentence per line, or put some empty lines inbetween to clearly arange my code.
+There comes wordpress, messing everything up by automagically putting every sentence in its own paragraph, because it was written on its own line and putting `<br>` inbetween, to reflect my empty lines.
+
+But even worse, wordpress also puts these unwanted `<p>`-tags [arround HTML-code, that breaks because of it](http://wordpress.org/support/topic/disable-automatic-p-and-br-tags-in-html-editor "Another example is described in this forum-request. One guy puts a plugin in his post, but it does not work, because wordpress automagically messed up his HTML...").
+For example, I eventually found out about this auto-messup functionallity, because I was checking my blog-post with a [html-validator](http://validator.w3.org/) and was wondering, why the validator was grumping about a `<quote>`-tag inside [flow content](http://dev.w3.org/html5/html-author/#flow-content), which I've never put there. It turned out, that wordpress had put it there for me...
diff --git a/content/posts/disable-spring-autowireing-for-junit-tests.md b/content/posts/disable-spring-autowireing-for-junit-tests.md
new file mode 100644 (file)
index 0000000..b6093c7
--- /dev/null
@@ -0,0 +1,71 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+date: "2014-04-01T08:46:44+00:00"
+draft: "true"
+guid: http://juplo.de/?p=283
+parent_post_id: null
+post_id: "283"
+title: Disable Spring-Autowireing for Junit-Tests
+url: /
+
+---
+```java
+
+import java.beans.PropertyDescriptor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.PropertyValues;
+import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.beans.factory.BeanFactory;
+import org.springframework.beans.factory.NoSuchBeanDefinitionException;
+import org.springframework.beans.factory.support.RootBeanDefinition;
+import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
+
+/**
+ * Swallows all {@link NoSuchBeanDefinitionException}s, and
+ * {@link BeanCreationException}s, that might be thrown
+ * during autowireing.
+ *
+ * @author kai@juplo.de
+ */
+public class ForgivableCommonAnnotationBeanPostProcessor
+    extends
+      CommonAnnotationBeanPostProcessor
+{
+  private static final Logger log =
+      LoggerFactory.getLogger(ForgivableCommonAnnotationBeanPostProcessor.class);
+
+  @Override
+  protected Object autowireResource(BeanFactory factory, LookupElement element, String requestingBeanName) throws BeansException
+  {
+    try
+    {
+       return super.autowireResource(factory, element, requestingBeanName);
+    }
+    catch (NoSuchBeanDefinitionException e)
+    {
+      log.warn(e.getMessage());
+      return null;
+    }
+  }
+
+  @Override
+  public Object postProcessBeforeInitialization(Object bean, String beanName)
+  {
+    try
+    {
+      return super.postProcessBeforeInitialization(bean, beanName);
+    }
+    catch (BeanCreationException e)
+    {
+      log.warn(e.getMessage());
+      return bean;
+    }
+  }
+}
+
+```
diff --git a/content/posts/enabling-decoupled-template-logic-for-thymeleaf-in-a-spring-boot-app.md b/content/posts/enabling-decoupled-template-logic-for-thymeleaf-in-a-spring-boot-app.md
new file mode 100644 (file)
index 0000000..afc905b
--- /dev/null
@@ -0,0 +1,16 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+classic-editor-remember: classic-editor
+date: "2019-12-28T00:36:30+00:00"
+draft: "true"
+guid: http://juplo.de/?p=1004
+parent_post_id: null
+post_id: "1004"
+title: Enabling Decoupled Template Logic For Thymeleaf In A Spring-Boot App
+url: /
+
+---
+
diff --git a/content/posts/encrypt-communication-between-kafka-and-zookeeper-with-tls.md b/content/posts/encrypt-communication-between-kafka-and-zookeeper-with-tls.md
new file mode 100644 (file)
index 0000000..d2a2f3c
--- /dev/null
@@ -0,0 +1,342 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - howto
+classic-editor-remember: classic-editor
+date: "2020-09-25T23:23:17+00:00"
+guid: http://juplo.de/?p=881
+parent_post_id: null
+post_id: "881"
+tags:
+  - encryption
+  - java
+  - kafka
+  - security
+  - tls
+  - zookeeper
+title: Encrypt Communication Between Kafka And ZooKeeper With TLS
+url: /encrypt-communication-between-kafka-and-zookeeper-with-tls/
+
+---
+## TL;DR
+
+1. Download and unpack [zookeeper+tls.tgz](/wp-uploads/zookeeper+tls.tgz).
+1. Run [README.sh](/wp-uploads/zookeeper+tls/README.sh) for a fully automated example of the presented setup.
+
+Copy and paste to execute the two steps on Linux:
+
+```bash
+curl -sc - /wp-uploads/zookeeper+tls.tgz | tar -xzv && cd zookeeper+tls && ./README.sh
+
+```
+
+A [german translation](https://www.trion.de/news/2019/06/28/kafka-zookeeper-tls.html "Hier findest du eine deutsche Übersetzung dieses Artikels") of this article can be found on [http://trion.de](https://www.trion.de/news/ "A lot of intresting posts about Java, Docker, Kubernetes, Spring Boot and so on can be found @trion").
+
+## Current Kafka Cannot Encrypt ZooKeeper-Communication
+
+Up until now ( [Version 2.3.0 of Apache Kafka](https://kafka.apache.org/documentation/#security_overview "Read more about the supported options in the original documentation of version 2.3.0")) it is not possible, to encrypt the communication between the Kafka-Brokers and their ZooKeeper-ensemble.
+This is not possiible, because ZooKeeper 3.4.13, which is shipped with Apache Kafka 2.3.0, lacks support for TLS-encryption.
+
+The documentation deemphasizes this, with the observation, that usually only non-sensitive data (configuration-data and status information) is stored in ZooKeeper and that it would not matter, if this data is world-readable, as long as it can be protected against manipulation, which can be done through proper authentication and ACL's for zNodes:
+
+> _The rationale behind this decision is that the data stored in ZooKeeper is not sensitive, but inappropriate manipulation of znodes can cause cluster disruption._ ( [Kafka-Documentation](https://kafka.apache.org/documentation/#zk_authz "Read the documentation about how to secure ZooKeeper"))
+
+This quote obfuscates the [elsewhere mentioned fact](https://kafka.apache.org/documentation/#security_sasl_scram_security "The security considerations for SASL/SCRAM are clearly stating, that ZooKeeper must be protected, because it stores sensitive authentication data in this case"), that there are use-cases that store sensible data in ZooKeeper.
+For example, if authentication via [SASL/SCRAM](https://kafka.apache.org/documentation/#security_sasl_scram_clientconfig "Read more about authentication via SASL/SCRAM") or [Delegation Tokens](https://kafka.apache.org/documentation/#security_delegation_token) is used.
+Accordingly, the documentation often stresses, that usually there is no need to make ZooKeeper accessible to normal clients.
+Nowadays, only admin-tools need direct access to the ZooKeeper-ensemble.
+Hence, it is stated as a best practice, to make the ensemble only available on a local network, hidden behind a firewall or such.
+
+**In cleartext: One must not run a Kafka-Cluster, that spans more than one data-center — or at least make sure, that all communication is tunneled through a virtual private network.**
+
+## ZooKeeper 3.5.5 To The Rescue
+
+On may the 20th 2019, [version 3.5.5 of ZooKeeper](http://zookeeper.apache.org/releases.html#releasenotes "Read the release notes") has been released.
+Version 3.5.5 is the first stable release of the 3.5.x branch, that introduces the support for TLS-encryption, the community has yearned for so long.
+It supports the encryption of all communication between the nodes of a ZooKeeper-ensemble and between ZooKeeper-Servers and -Clients.
+
+Part of ZooKeeper is a sophisticated client-API, that provide a convenient abstraction for the communication between clients and servers over the _Atomic Broadcast Protocol_.
+The TLS-encryption is applied by this API transparently.
+Because of that, all client-implementations can profit from this new feature through a simple library-upgrade from 3.4.13 to 3.5.5.
+**This article will walk you through an example, that shows how to carry out such a library-upgrade for Apache Kafka 2.3.0 and configure a cluster to use TLS-encryption, when communicating with a standalone ZooKeeper.**
+
+## Disclaimer
+
+**The presented setup is ment for evaluation only!**
+
+It fiddles with the libraries, used by Kafka, which might cause unforseen issues.
+Furthermore, using TLS-encryption in ZooKeeper requires one to switch from the battle-tested `NIOServerCnxnFactory`, which uses the [NIO-API](https://en.wikipedia.org/wiki/Non-blocking_I/O_(Java) "Learn more about non-blocking I/O in Java") directly, to the newly introduced `NettyServerCnxnFactory`, which is build on top of [Netty](https://netty.io/ "Learn more about Netty").
+
+## Recipe To Enable TLS Between Broker And ZooKeeper
+
+The article will walk you step by step through the setup now.
+If you just want to evaluate the example, you can [jump to the download-links](#scripts "I am so inpatient, just get me to the fully automated example").
+
+All commands must be executed in the same directory.
+We recommend, to create a new directory for that purpose.
+
+### Download Kafka and ZooKeeper
+
+First of all: Download version 2.3.0 of Apache Kafka and version 3.5.5 of Apache ZooKeeper:
+
+```bash
+curl -sc - http://ftp.fau.de/apache/zookeeper/zookeeper-3.5.5/apache-zookeeper-3.5.5-bin.tar.gz | tar -xzv
+curl -sc - http://ftp.fau.de/apache/kafka/2.3.0/kafka_2.12-2.3.0.tgz | tar -xzv
+
+```
+
+### Switch Kafka 2.3.0 from ZooKeeper 3.4.13 to ZooKeeper 3.5.5
+
+Remove the 3.4.13-version from the `libs`-directory of Apache Kafka:
+
+```bash
+rm -v kafka_2.12-2.3.0/libs/zookeeper-3.4.14.jar
+
+```
+
+Then copy the JAR's of the new version of Apache ZooKeeper into that directory. (The last JAR is only needed for CLI-clients, like for example `zookeeper-shell.sh`.)
+
+```bash
+cp -av apache-zookeeper-3.5.5-bin/lib/zookeeper-3.5.5.jar kafka_2.12-2.3.0/libs/
+cp -av apache-zookeeper-3.5.5-bin/lib/zookeeper-jute-3.5.5.jar kafka_2.12-2.3.0/libs/
+cp -av apache-zookeeper-3.5.5-bin/lib/netty-all-4.1.29.Final.jar kafka_2.12-2.3.0/libs/
+cp -av apache-zookeeper-3.5.5-bin/lib/commons-cli-1.2.jar kafka_2.12-2.3.0/libs/
+
+```
+
+That is all there is to do to upgrade ZooKeeper.
+If you run one of the Kafka-commands, it will use ZooKeeper 3.5.5. from now on.
+
+### Create A Private CA And The Needed Certificates
+
+_You can [read more about setting up a private CA in this post](/create-self-signed-multi-domain-san-certificates/ "Lern how to set up a private CA and create self-signed certificates")..._
+
+Create the root-certificate for the CA and store it in a Java-truststore:
+
+```bash
+openssl req -new -x509 -days 365 -keyout ca-key -out ca-cert -subj "/C=DE/ST=NRW/L=MS/O=juplo/OU=kafka/CN=Root-CA" -passout pass:superconfidential
+keytool -keystore truststore.jks -storepass confidential -import -alias ca-root -file ca-cert -noprompt
+
+```
+
+The following commands will create a self-signed certificate in **`zookeeper.jks`**.
+What happens is:
+
+1. Create a new key-pair and certificate for `zookeeper`
+1. Generate a certificate-signing-request for that certificate
+1. Sign the request with the key of private CA and also add a SAN-extension, so that the signed certificate is also valid for `localhost`
+1. Import the root-certificate of the private CA into the keystore `zookeeper.jks`
+1. Import the signed certificate for `zookeeper` into the keystore `zookeeper.jks`
+
+_You can [read more about creating self-signed certificates with multiple domains and building a Chain-of-Trust here](/create-self-signed-multi-domain-san-certificates/#sign-with-san "Lern how to sign certificates with SAN-extension")..._
+
+```bash
+NAME=zookeeper
+keytool -keystore $NAME.jks -storepass confidential -alias $NAME -validity 365 -genkey -keypass confidential -dname "CN=$NAME,OU=kafka,O=juplo,L=MS,ST=NRW,C=DE"
+keytool -keystore $NAME.jks -storepass confidential -alias $NAME -certreq -file cert-file
+openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out $NAME.pem -days 365 -CAcreateserial -passin pass:superconfidential -extensions SAN -extfile <(printf "\n[SAN]\nsubjectAltName=DNS:$NAME,DNS:localhost")
+keytool -keystore $NAME.jks -storepass confidential -import -alias ca-root -file ca-cert -noprompt
+keytool -keystore $NAME.jks -storepass confidential -import -alias $NAME -file $NAME.pem
+
+```
+
+Repeat this with:
+
+- **`NAME=kafka-1`**
+- **`NAME=kafka-2`**
+- **`NAME=client`**
+
+Now we have signed certificates for all participants in our small example, that are stored in separate keystores, each with a Chain-of-Trust set up, that is rooting in our private CA.
+We also have a truststore, that will validate all these certificates, because it contains the root-certificate of the Chain-of-Trust: the certificate of our private CA.
+
+### Configure And Start ZooKeeper
+
+_We hightlight/explain only the configuration-options here, that are needed for TLS-encryption!_
+
+In our setup, the standalone ZooKeeper essentially needs two specially tweaked configuration files, to use encryption.
+
+Create the file **`java.env`**:
+
+```bash
+SERVER_JVMFLAGS="-Xms512m -Xmx512m -Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory"
+ZOO_LOG_DIR=.
+
+```
+
+- The Java-Environmentvariable **`zookeeper.serverCnxnFactory`** switches the connection-factory to use the Netty-Framework.  
+**Without this, TLS is not possible!**
+
+Create the file **`zoo.cfg`**:
+
+```bash
+dataDir=/tmp/zookeeper
+secureClientPort=2182
+maxClientCnxns=0
+authProvider.1=org.apache.zookeeper.server.auth.X509AuthenticationProvider
+ssl.keyStore.location=zookeeper.jks
+ssl.keyStore.password=confidential
+ssl.trustStore.location=truststore.jks
+ssl.trustStore.password=confidential
+
+```
+
+- **`secureClientPort`**: We only allow encrypted connections!  
+(If we want to allow unencrypted connections too, we can just specify `clientPort` additionally.)
+- **`authProvider.1`**: Selects authentification through client certificates
+- **`ssl.keyStore.*`**: Specifies the path to and password of the keystore, with the `zookeeper`-certificate
+- **`ssl.trustStore.*`**: Specifies the path to and password of the common truststore with the root-certificate of our private CA
+
+Copy the file **`log4j.properties`** into the current working directory, to enable logging for ZooKeeper (see also `java.env`):
+
+```bash
+cp -av apache-zookeeper-3.5.5-bin/conf/log4j.properties .
+
+```
+
+Start the ZooKeeper-Server:
+
+```bash
+apache-zookeeper-3.5.5-bin/bin/zkServer.sh --config . start
+
+```
+
+- **`--config .`**: The script should search in the current directory for the configration data and certificates.
+
+### Konfigure And Start The Brokers
+
+_We hightlight/explain only the configuration-options and start-parameters here, that are needed to encrypt the communication between the Kafka-Brokers and the ZooKeeper-Server!_
+
+The other parameters shown here, that are concerned with SSL are only needed for securing the communication between the Brokers itself and between Brokers and Clients.
+You can read all about them in the [standard documentation](https://kafka.apache.org/documentation/#security).
+In short: This example is set up, to use SSL for authentication between the brokers and SASL/PLAIN for client-authentification — both channels are encrypted with TLS.
+
+TLS for the ZooKeeper Client-API is configured through Java-Environmentvariables.
+Hence, most of the SSL-configuration for connecting to ZooKeeper has to be specified, when starting the broker.
+Only the address and port for the connction itself is specified in the configuration-file.
+
+Create the file **`kafka-1.properties`**:
+
+```bash
+broker.id=1
+zookeeper.connect=zookeeper:2182
+listeners=SSL://kafka-1:9193,SASL_SSL://kafka-1:9194
+security.inter.broker.protocol=SSL
+ssl.client.auth=required
+ssl.keystore.location=kafka-1.jks
+ssl.keystore.password=confidential
+ssl.key.password=confidential
+ssl.truststore.location=truststore.jks
+ssl.truststore.password=confidential
+listener.name.sasl_ssl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required user_consumer="pw4consumer" user_producer="pw4producer";
+sasl.enabled.mechanisms=PLAIN
+log.dirs=/tmp/kafka-1-logs
+offsets.topic.replication.factor=2
+transaction.state.log.replication.factor=2
+transaction.state.log.min.isr=2
+
+```
+
+- **`zookeeper.connect`**: If you allow unsecure connections too, be sure to specify the right port here!
+- _All other options are not relevant for encrypting the connections to ZooKeeper_
+
+Start the broker in the background and remember its PID in the file **`KAFKA-1`**:
+
+```bash
+(
+  export KAFKA_OPTS="
+    -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
+    -Dzookeeper.client.secure=true
+    -Dzookeeper.ssl.keyStore.location=kafka-1.jks
+    -Dzookeeper.ssl.keyStore.password=confidential
+    -Dzookeeper.ssl.trustStore.location=truststore.jks
+    -Dzookeeper.ssl.trustStore.password=confidential
+  "
+  kafka_2.12-2.3.0/bin/kafka-server-start.sh kafka-1.properties & echo $! > KAFKA-1
+) > kafka-1.log &
+
+```
+
+Check the logfile **`kafka-1.log`** to confirm that the broker starts without errors!
+
+- **`zookeeper.clientCnxnSocket`**: Switches from NIO to the Netty-Framework.  
+**Without this, the ZooKeeper Client-API (just like the ZooKeeper-Server) cannot use TLS!**
+- **`zookeeper.client.secure=true`**: Switches on TLS-encryption, for all connections to any ZooKeeper-Server
+- **`zookeeper.ssl.keyStore.*`**: Specifies the path to and password of the keystore, with the `kafka-1`-certificate
+- **`zookeeper.ssl.trustStore.*`**: Specifies the path to and password of the common truststore with the root-certificate of our private CA
+
+_Do the same for **`kafka-2`**!_
+_And do not forget, to adapt the config-file accordingly — or better: just [download a copy](/wp-uploads/zookeeper+tls/kafka-2.properties)..._
+
+### Configure And Execute The CLI-Clients
+
+All scripts from the Apache-Kafka-Distribution that connect to ZooKeeper are configured in the same way as seen for `kafka-server-start.sh`.
+For example, to create a topic, you will run:
+
+```bash
+export KAFKA_OPTS="
+  -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
+  -Dzookeeper.client.secure=true
+  -Dzookeeper.ssl.keyStore.location=client.jks
+  -Dzookeeper.ssl.keyStore.password=confidential
+  -Dzookeeper.ssl.trustStore.location=truststore.jks
+  -Dzookeeper.ssl.trustStore.password=confidential
+"
+kafka_2.12-2.3.0/bin/kafka-topics.sh \
+  --zookeeper zookeeper:2182 \
+  --create --topic test \
+  --partitions 1 --replication-factor 2
+
+```
+
+_Note:_ A different keystore is used here ( `client.jks`)!
+
+CLI-clients, that connect to the brokers, can be called as usual.
+
+In this example, they use an encrypted listener on port 9194 (for `kafka-1`) and are authenticated using SASL/PLAIN.
+The client-configuration is kept in the files `consumer.config` and `producer.config`.
+Take a look at that files and compare them with the broker-configuration above.
+If you want to lern more about securing broker/client-communication, we refere you to the [official documentation](https://kafka.apache.org/documentation/#security "The official documentation does a good job on this topic!").
+
+_If you have trouble to start these clients, download the scripts and take a look at the examples in [README.sh](/wp-uploads/zookeeper+tls/README.sh)_
+
+### TBD: Further Steps To Take...
+
+This recipe only activates TLS-encryption between Kafka-Brokers and a Standalone ZooKeeper.
+It does not show, how to enable TLS between ZooKeeper-Nodes (which should be easy) or if it is possible to authenticate Kafka-Brokers via TLS-certificates. These topics will be covered in future articles...
+
+## Fully Automated Example Of The Presented Setup
+
+Download and unpack [zookeeper+tls.tgz](/wp-uploads/zookeeper+tls.tgz) for an evaluation of the presented setup:
+
+```bash
+curl -sc - /wp-uploads/zookeeper+tls.tgz | tar -xzv
+
+```
+
+The archive contains a fully automated example.
+Just run [README.sh](/wp-uploads/zookeeper+tls/README.sh) in the unpacked directory.
+
+It downloads the required software, carries out the library-upgrade, creates the required certificates and starts a standalone ZooKeeper and two Kafka-Brokers, that use TLS to encrypt all communication.
+It also executes a console-consumer and a console-producer, that read and write to a topic, and a zookeeper-shell, that communicates directly with the ZooKeeper-node, to proof, that the setup is working.
+The ZooKeeper and the Brokers-instances are left running, to enable the evaluation of the fully encrypted cluster.
+
+### Usage
+
+- Run **`README.sh`**, to execute the automated example
+- After running `README.sh`, the Kafka-Cluster will be still running, so that one can experiment with commands from `README.sh` by hand
+- `README.sh` can be executed repeatedly: it will skip all setup-steps, that are already done automatically
+- Run **`README.sh stop`**, to stop the Kafka-Cluster (it can be restarted by re-running `README.sh`)
+- Run **`README.sh cleanup`**, to stop the Cluster and remove all created files and data (only the downloaded packages will be left untouched)
+
+### Separate Downloads For The Packaged Files
+
+- [README.sh](/wp-uploads/zookeeper+tls/README.sh)
+- [create-certs.sh](/wp-uploads/zookeeper+tls/create-certs.sh)
+- [gencert.sh](/wp-uploads/zookeeper+tls/gencert.sh)
+- [zoo.cfg](/wp-uploads/zookeeper+tls/zoo.cfg)
+- [java.env](/wp-uploads/zookeeper+tls/java.env)
+- [kafka-1.properties](/wp-uploads/zookeeper+tls/kafka-1.properties)
+- [kafka-2.properties](/wp-uploads/zookeeper+tls/kafka-2.properties)
+- [consumer.config](/wp-uploads/zookeeper+tls/consumer.config)
+- [producer.config](/wp-uploads/zookeeper+tls/producer.config)
diff --git a/content/posts/entwicklung-einer-crowdgestutzten-vertikalen-suchmaschine-fur-veranstaltungen-und-locations.md b/content/posts/entwicklung-einer-crowdgestutzten-vertikalen-suchmaschine-fur-veranstaltungen-und-locations.md
new file mode 100644 (file)
index 0000000..623da09
--- /dev/null
@@ -0,0 +1,15 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+date: "2015-10-01T11:55:54+00:00"
+draft: "true"
+guid: http://juplo.de/?p=530
+parent_post_id: null
+post_id: "530"
+title: Entwicklung einer crowdgestützten vertikalen Suchmaschine für Veranstaltungen und Locations
+url: /
+
+---
+
diff --git a/content/posts/fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun.md b/content/posts/fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun.md
new file mode 100644 (file)
index 0000000..1ec528b
--- /dev/null
@@ -0,0 +1,54 @@
+---
+_edit_last: "3"
+author: kai
+categories:
+  - java
+  - spring
+  - spring-boot
+  - thymeleaf
+date: "2020-05-01T14:06:13+00:00"
+guid: http://juplo.de/?p=543
+parent_post_id: null
+post_id: "543"
+title: Fix Hot Reload of Thymeleaf-Templates In spring-boot:run
+url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
+
+---
+## The Problem: Hot-Reload Of Thymeleaf-Templates Does Not Work, When The Application Is Run With `spring-boot:run`
+
+A lot of people seem to have problems with hot reloading of static HTML-ressources when developing a [Spring-Boot](http://projects.spring.io/spring-boot/#quick-start "Learn more about Spring-Boot") application that uses [Thymeleaf](http://www.thymeleaf.org/ "Learn more about Thymeleaf") as templateing engine with [`spring-boot:run`](http://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html "Learn more about the spring-boot-maven-plugin").
+There are a lot of tips out there, how to fix that problem:
+
+- [The official Hot-Swapping-Guide](http://docs.spring.io/spring-boot/docs/current/reference/html/howto-hotswapping.html "Read the official guide") says, that you just have to add `spring.thymeleaf.cache=false` in your application-configuration in `src/main/resources/application.properties`.
+- [Some say](http://stackoverflow.com/a/26562302/247276 "Read the whole suggestion"), that you have to disable caching by setting `spring.template.cache=false` **and** `spring.thymeleaf.cache=false` and/or run the application in debugging mode.
+- [Others say](http://stackoverflow.com/a/31641587/247276 "Read the suggestion"), that you have to add a dependency to `org.springframework:springloaded` to the configuration of the `spring-boot-maven-plugin`.
+- There is even a [bug-report on GitHub](https://github.com/spring-projects/spring-boot/issues/34 "Read the whole bug-report on GitHub"), that says, that you have to run the application from your favored IDE.
+
+But none of that fixes worked for me.
+Some may work, if I would switch my IDE (I am using Netbeans), but I have not tested that, because I am not willing to switch my beloved IDE because of that issue.
+
+## The Solution: Move Your Thymeleaf-Templates Back To `src/main/webapp`
+
+Fortunatly, I found a simple solution, to fix the issue without all the above stuff.
+**You simply have to move your Thymeleaf-Templates back to where they belong (IMHO): `src/main/webapp` and turn of the caching.**
+It is not necessary to run the application in debugging mode and/or from your IDE, nor is it necessary to add the dependency to `springloaded` or more configuration-switches.
+
+To move the templates and disable caching, just add the following to your application configuration in `src/main/application.properties`:
+
+```properties
+spring.thymeleaf.prefix=/thymeleaf/
+spring.thymeleaf.cache=false
+
+```
+
+Of course, you also have to move your Thymeaf-Templates from `src/main/resources/templates/` to `src/main/webapp/thymeleaf/`.
+In my opinion, the templates belong there anyway, in order to have them accessible as normal static HTML(5)-files.
+If they are locked away in the classpath you cannot access them, which foils the approach of Thymeleaf, that you can view your templates in a browser as thy are.
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/hibernate-maven-plugin-2-0-0-released.md b/content/posts/hibernate-maven-plugin-2-0-0-released.md
new file mode 100644 (file)
index 0000000..395d0ed
--- /dev/null
@@ -0,0 +1,228 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - projects
+date: "2020-06-24T11:32:38+00:00"
+guid: http://juplo.de/?p=721
+parent_post_id: null
+post_id: "721"
+tags:
+  - createmedia.nrw
+  - hibernate
+  - java
+  - jpa
+  - maven
+title: hibernate-maven-plugin 2.0.0 released!
+url: /hibernate-maven-plugin-2-0-0-released/
+
+---
+Today we released the version 2.0.0 of [hibernate-maven-plugin](/hibernate-maven-plugin "hibernate-maven-plugin") to [Central](http://search.maven.org/#search|gav|1|g%3A%22de.juplo%22%20AND%20a%3A%22hibernate-maven-plugin%22 "Central")!
+
+## Why Now?
+
+During one of our other projects ‐ the development of [a vertical search-engine for events and locations](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Read more about our project"), which is [funded by the mistery of economy of NRW](http://yourshouter.com/partner/mweimh-nrw.html "Read more about the support by the ministery") ‐, we realized, that we were in the need of Hibernate 5 and some of the more sophisticated JPA-configuration-options.
+
+Unfortunatly ‐ _for us_ ‐ the old releases of this plugin neither support Hibernate 5 nor all configuration options, that are available for use in the `META-INF/persistence.xml`.
+
+Fortunatly ‐ _for you_ ‐ we decided, that we really need all that and have to integrate it in our little plugin.
+
+## Nearly Complete Rewrite
+
+Due to [changes in the way Hibernate has to be configured internally](http://docs.jboss.org/hibernate/orm/5.0/integrationsGuide/en-US/html_single/ "Read more about this changes in the official Integrations Guide for Hibernate 5"), this release is a nearly complete rewrite.
+It was no longer possible, to just use the [SchemaExport](https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/toolsetguide.html#toolsetguide-s1-3)-Tool to build up the configuration and support all possible configuration-approaches.
+Hence, the plugin now builds up the configuration using [Services and Registries](http://docs.jboss.org/hibernate/orm/5.0/integrationsGuide/en-US/html_single/#services "Read more about services and registries"), like described in the Integration Guide.
+
+## Simplified Configuration: No Drop-In-Replacement!
+
+We also took the opportunity, to simplify the configuration.
+Beforehand, the plugin had just used the configuration, that was set up in the class [SchemaExport](https://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/tool/hbm2ddl/SchemaExport.html).
+This reliefed us from the burden, to understand the configuration internals, but brought up some oddities of the internal implementation of the tool.
+It also turned out to be a bad decision in the long run, because some configuration options are hard coded in that class and cannot be changed.
+
+By building up the whole configuration by hand, it is now possible to implement separate goals for creating and dropping the schema.
+Also, it enables us to add a goal `update` in one of the next releases.
+Because of all this improvements, you have to revise your configuration, if you want to switch from 1.x to 2.x.
+
+**Be warned: this release is _no drop-in replacement_ of the previous releases!**
+
+## Not Only For 4, But For Any Version
+
+While rewirting the plugin, we focused on Hibernate 5, which was not supported by the older releases, because of some of the oddities of the internal implementation of the SchemaExport-tool.
+We tried to maintain backward compatibility.
+
+You should be able to use the new plugin with Hibernate 5 and also with older versions of Hibernate (we only tested that for Hibernate 4).
+Because of that, we dropped the 4 in the name of the plugin!
+
+## Extended Support For JPA-Configurations
+
+We tried to support all possible configuration-approaches, that Hibernate 5 understands.
+Including hard coded XML-mapping-files in the `META-INF/persistence.xml`, that do not seem to be used very often, but which we needed in one of our own projects.
+
+Therefore, the plugin now understands all (or most of?) the relevant configuration options, that one can specify through a standard JPA-configuration.
+The plugin now should work with any configuration, that you drop in from your existing JPA- or Hibernate-projects.
+All recognized configuration from the different possible configuration-sources are merged together, considering the [configuration-method-precedence](/hibernate-maven-plugin/configuration.html#precedence "Jump to the documentation to read more about the configuration-method-precedence"), described in the documentation.
+
+We hope, we did not make any unhandy assumptions, while designing the merge-process.
+_Please let us know, if something wents wrong in your projects and you think it is, because we messed it up!_
+
+## Release notes:
+
+```
+commit 64b7446c958efc15daf520c1ca929c6b8d3b8af5
+Author: Kai Moritz
+Date:   Tue Mar 8 00:25:50 2016 +0100
+
+    javadoc hat to be configured multiple times for release:prepare
+
+commit 1730d92a6da63bdcc81f7a1c9020e73cdc0adc13
+Author: Kai Moritz
+Date:   Tue Mar 8 00:13:10 2016 +0100
+
+    Added the special javadoc-tags for maven-plugins to the configuration
+
+commit 0611db682bc69b80d8567bf9316668a1b6161725
+Author: Kai Moritz
+Date:   Mon Mar 7 16:01:59 2016 +0100
+
+    Updated documentation
+
+commit a275df25c52fdb7b5b4275fcf9a359194f7b9116
+Author: Kai Moritz
+Date:   Mon Mar 7 17:56:16 2016 +0100
+
+    Fixed missing menu on generated site: moved template from skin to project
+
+commit e8263ad80b1651b812618c964fb02f7e5ddf3d7e
+Author: Kai Moritz
+Date:   Mon Mar 7 14:44:53 2016 +0100
+
+    Turned of doclint, that was introduced in Java 8
+
+    See: http://blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html
+
+commit 62ec2b1b98d5ce144f1ac41815b94293a52e91e6
+Author: Kai Moritz
+Date:   Tue Dec 22 19:56:41 2015 +0100
+
+    Fixed ConcurrentModificationException
+
+commit 9d6e06c972ddda45bf0cd2e6a5e11d8fa319c290
+Author: Kai Moritz
+Date:   Mon Dec 21 17:01:42 2015 +0100
+
+    Fixed bug regarding the skipping of unmodified builds
+
+    If a property or class was removed, its value or md5sum stayed in the set
+    of md5sums, so that each following build (without a clean) was juged as
+    modified.
+
+commit dc652540d007799fb23fc11d06186aa5325058db
+Author: Kai Moritz
+Date:   Sun Dec 20 21:06:37 2015 +0100
+
+    All packages up to the root are checked for annotations
+
+commit 851ced4e14fefba16b690155b698e7a39670e196
+Author: Kai Moritz
+Date:   Sun Dec 20 13:32:48 2015 +0100
+
+    Fixed bug: the execution is no more skipped after a failed build
+
+    After a failed build, further executions of the plugin were skipped, because
+    the MD5-summs suggested, that nothing is to do because nothing has changed.
+    Because of that, the MD5-summs are now removed in case of a failure.
+
+commit 08649780d2cd70f2861298d683aa6b1945d43cda
+Author: Kai Moritz
+Date:   Sat Dec 19 18:02:02 2015 +0100
+
+    Mappings from JPA-mapping-files are considered
+
+commit bb8b638714db7fc02acdc1a9032cc43210fe5c0e
+Author: Kai Moritz
+Date:   Sat Dec 19 03:46:49 2015 +0100
+
+    Fixed minor misconfiguration in integration-test dependency test
+
+    Error because of multiple persistence-units by repeated execution
+
+commit 3a7590b8862c3be691b05110f423865f6674f6f6
+Author: Kai Moritz
+Date:   Thu Dec 17 03:10:33 2015 +0100
+
+    Considering mapping-configuration from persistence.xml and hibernate.cfg.xml
+
+commit 23668ccaa93bfbc583c1697214bae116bd9f4ef6
+Author: Kai Moritz
+Date:   Thu Dec 17 02:53:38 2015 +0100
+
+    Sidestepped bug in Hibernate 5
+
+commit 8e5921c9e76b4540f1d4b75e05e338001145ff6d
+Author: Kai Moritz
+Date:   Wed Dec 16 22:09:00 2015 +0100
+
+    Introduced the goal "drop"
+
+     * Fixed integration-test hibernate4-maven-plugin-envers-sample by adapting
+       it to the new drop-goal
+     * Adapted the other integration-tests to the new naming schema for the
+       create-script
+
+commit 6dff3bfb0f9ea7a1d0cc56398aaad29e31a17b91
+Author: Kai Moritz
+Date:   Wed Dec 16 18:08:56 2015 +0100
+
+    Reworked configuration and the tracking thereof
+
+     * Moved common parameters from CreateMojo to AbstractSchemaMojo
+     * Reordered parameters into sensible groups
+     * Renamed the maven-property-names of the parameters
+     * All configuration-parameters are tracked, not only hibernate-parameters
+     * Introduced special treatment for some of the plugin-parameters (export
+       and show)
+
+commit b316a5b4122c3490047b68e1e4a6df205645aad5
+Author: Kai Moritz
+Date:   Wed Oct 21 11:49:56 2015 +0200
+
+    Reworked plugin-configuration: worshipped the DRY-principle
+
+commit 4940080670944a15916c68fb294e18a6bfef12d5
+Author: Kai Moritz
+Date:   Fri Oct 16 12:16:30 2015 +0200
+
+    Refined reimplementation of the plugin for Hibernate 5.x
+
+    Renamed the plugin from hibernate4-maven-plugin to hibernate-maven-plugin,
+    because the goal is, to support all recent older versions with the new
+    plugin.
+
+commit fdda82a6f76deefd10f83da89d7e82054e3c3ecd
+Author: Kai Moritz
+Date:   Wed Oct 21 12:18:29 2015 +0200
+
+    Integration-Tests are skiped, if "maven.test.skip" is set to true
+
+commit b971570e28cbdc3b27eca15a7395586bee787446
+Author: Kai Moritz
+Date:   Tue Sep 8 13:55:43 2015 +0200
+
+    Updated version of juplo-skin for generation of documentation
+
+commit 3541cf3742dd066b94365d351a3ca39a35e3d3c8
+Author: Kai Moritz
+Date:   Tue May 19 21:41:50 2015 +0200
+
+    Added new configuration sources in documentation about precedence
+
+```
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/hibernate4-maven-plugin-1-0-1-released.md b/content/posts/hibernate4-maven-plugin-1-0-1-released.md
new file mode 100644 (file)
index 0000000..67094a5
--- /dev/null
@@ -0,0 +1,130 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - hibernate
+  - java
+  - maven
+date: "2013-01-15T23:10:59+00:00"
+guid: http://juplo.de/?p=64
+parent_post_id: null
+post_id: "64"
+title: hibernate4-maven-plugin 1.0.1 released!
+url: /hibernate4-maven-plugin-1-0-1-released/
+
+---
+Today we released the bugfix-version 1.0.1 of [hibernate4-maven-plugin](/hibernate4-maven-plugin "hibernate4-maven-plugin") to [Central](http://search.maven.org/ "Central").
+
+Appart from two bugfixes, this version includes some minor improvements, which might come in handy for you.
+
+**[hibernate4-maven-plugin 1.0.1](/hibernate4-maven-plugin/ "hibernate4-maven-plugin")** should be available in the [Central Maven Repository](http://search.maven.org/#artifactdetails|de.juplo|hibernate4-maven-plugin|1.0.1|maven-plugin "Central Maven Repository") in a few hours.
+
+- [hibernate4-maven-plugin?](/hibernate4-maven-plugin/ "hibernate4-maven-plugin") What's that for?!?
+- [Read more about the hibernate4-maven-plugin...](/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/ "About the hibernate4-maven-plugin")
+- [Jump to the quickstart-guide!](/hibernate4-maven-plugin/configuration.html "Quickstart")
+
+## Release notes:
+
+ `
+commit 4b507b15b0122ac180e44b8418db8d9143ae9c3a
+Author: Kai Moritz
+Date:   Tue Jan 15 23:09:01 2013 +0100
+    Reworked documentation: splited and reorderd pages and menu
+commit 65bbbdbaa7df1edcc92a3869122ff06a3895fe57
+Author: Kai Moritz
+Date:   Tue Jan 15 22:39:39 2013 +0100
+    Added breadcrumb to site
+commit a8c4f4178a570da392c94e384511f9e671b0d040
+Author: Kai Moritz
+Date:   Tue Jan 15 22:33:48 2013 +0100
+    Added Google-Analytics tracking-code to site
+commit 1feb1053532279981a464cef954072cfefbe01a5
+Author: Kai Moritz
+Date:   Tue Jan 15 22:21:54 2013 +0100
+    Added release information to site
+commit bf5e8c39287713b9eb236ca441473f723059357a
+Author: Kai Moritz
+Date:   Tue Dec 18 00:14:08 2012 +0100
+    Reworked documentation: added documentation for new features etc.
+commit 36af74be42d47438284677134037ce399ea0b58e
+Author: Kai Moritz
+Date:   Tue Jan 15 10:40:09 2013 +0100
+    Test-Classes can now be included into the scanning for Hibernate-Annotations
+commit bcf07578452d7c31dc97410bc495c73bd0f87748
+Author: Kai Moritz
+Date:   Tue Jan 15 09:09:05 2013 +0100
+    Bugfix: database-parameters for connection were not taken from properties
+
+    The hibernate-propertiesfile was read and used for the configuration of
+    the SchemaExport-class, but the database-parameters from these source were
+    ignored, when the database-connection was opened.
+commit 54b22b88de40795a73397ac8b3725716bc80b6c4
+Author: Kai Moritz
+Date:   Wed Jan 9 20:57:22 2013 +0100
+    Bugfix: connection was closed, even when it was never created
+
+    Bugreport from: Adriano Machado
+
+    When only the script is generated and no export is executed, no database-
+    connection is opend. Nevertheless, the code tried to close it in the
+    finally-block, which lead to a NPE.
+commit b9ab24b21d3eb65e2a2208be658ff447c1846894
+Author: Kai Moritz
+Date:   Tue Dec 18 00:31:22 2012 +0100
+    Implemented new parameter "force"
+
+    If -Dhibernate.export.force is specified, the schema-export will be forced.
+commit 19740023bb37770ad8e08c8e50687cb507e2fbfd
+Author: Kai Moritz
+Date:   Fri Dec 14 02:16:44 2012 +0100
+    Plugin ignores upper- or lower-case mismatches for "type" and "target"
+commit 8a2e08b6409034fd692c4bea72058f785e6802ad
+Author: Kai Moritz
+Date:   Fri Dec 14 02:13:05 2012 +0100
+    The Targets EXPORT and NONE force excecution
+
+    Otherwise, an explicitly requestes SQL-export or mapping-test-run would be
+    skipped, if no annotated class was modified.
+
+    If the export is skipped, this is signaled via the maven-property
+    hibernate.export.skipped.
+
+    Refactored name of the skip-property to an public final static String
+commit 55a33e35422b904b974a19d3d6368ded60ea1811
+Author: Kai Moritz
+Date:   Fri Dec 14 01:43:45 2012 +0100
+    Configuration via properties reworked
+
+     * export-type and -target are now also configurable via properties
+     * schema-filename, -delemiter and -format are now also configurable via
+       porperties
+commit 5002604d2f9024dd7119190915b6c62c75fbe1d6
+Author: Kai Moritz
+Date:   Thu Dec 13 16:19:55 2012 +0100
+    schema is now rebuild, when SQL-dialect changes
+commit a2859d3177a64880ca429d4dfd9437a7fb78dede
+Author: Kai Moritz
+Date:   Tue Dec 11 17:30:19 2012 +0100
+    Skipping of unchanged scenarios is now based on MD5-sums of all classes
+
+    When working with Netbeans, the schema was often rebuild without need.
+    The cause of this behaviour was, that Netbeans (or Maven itself) sometimes
+    touches unchanged classes. To avoid this, hibernat4-maven-plugin now
+    calculates MD5-sums for all annotated classes and compares these instead of
+    the last-modified value.
+commit a4de03f352b21ce6abad570d2753467e3a972a10
+Author: Kai Moritz
+Date:   Tue Dec 11 17:02:14 2012 +0100
+    hibernate4:export is skipped, when annotated classes are unchanged
+
+    Hbm2DdlMojo now checks the last-modified-timestamp of all found annotated
+    classes and aborts the schema-generation, when no class has changed and no
+    new class was added since the last execution.
+
+    It then sets a maven-property, to indicate to other plugins, that the
+    generation was skipped.
+commit 2f3807b9fbde5c1230e3a22010932ddec722871b
+Author: Kai Moritz
+Date:   Thu Nov 29 18:23:59 2012 +0100
+    Found annotated classes get logged now
+`
diff --git a/content/posts/hibernate4-maven-plugin-1-0-2-release.md b/content/posts/hibernate4-maven-plugin-1-0-2-release.md
new file mode 100644 (file)
index 0000000..fc809ff
--- /dev/null
@@ -0,0 +1,67 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - hibernate
+  - java
+  - maven
+date: "2013-09-08T00:51:18+00:00"
+guid: http://juplo.de/?p=75
+parent_post_id: null
+post_id: "75"
+title: hibernate4-maven-plugin 1.0.2 released!
+url: /hibernate4-maven-plugin-1-0-2-release/
+
+---
+Today we released the version 1.0.2 of [hibernate4-maven-plugin](/hibernate4-maven-plugin "hibernate4-maven-plugin") to [Central](http://search.maven.org/ "Central").
+
+This release includes:
+
+- Improved documentation (thanks to Adriano Machado)
+- Support for the `hibernateNamingStrategy`-configuration-option (thanks to Lorenzo Nicora)
+- Mapping via `*.hbm.xml`-files (old approach without annotations)
+
+**[hibernate4-maven-plugin 1.0.2](/hibernate4-maven-plugin/ "hibernate4-maven-plugin")** is available in the [Central Maven Repository](http://search.maven.org/#artifactdetails|de.juplo|hibernate4-maven-plugin|1.0.2|maven-plugin "Central Maven Repository").
+
+- [hibernate4-maven-plugin?](/hibernate4-maven-plugin/ "hibernate4-maven-plugin") What's that for?!?
+- [Read more about the hibernate4-maven-plugin...](/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/ "About the hibernate4-maven-plugin")
+- [Jump to the quickstart-guide!](/hibernate4-maven-plugin/configuration.html "Quickstart")
+
+## Release notes:
+
+ `
+commit 4edef457d2b747d939a141de24bec5e32abbc0c7
+Author: Kai Moritz
+Date:   Fri Aug 2 00:37:40 2013 +0200
+    Last preparations for release
+commit 82eada1297cdc295dcec9f43660763a04c1b1deb
+Author: Kai Moritz
+Date:   Fri Aug 2 00:37:22 2013 +0200
+    Upgrade to Hibernate 4.2.3.Final
+commit 3d355800b5a5d2a536270b714f37a84d50b12168
+Author: Kai Moritz
+Date:   Thu Aug 1 12:41:06 2013 +0200
+    Mapping-configurations are opend as given before searched in resources
+commit 1ba817af3ae5ab23232fca001061f8050cecd6a7
+Author: Kai Moritz
+Date:   Thu Aug 1 01:45:22 2013 +0200
+    Improved documentaion (new FAQ-entries)
+commit 02312592d27d628cc7e0d8e28cc40bf74a80de21
+Author: Kai Moritz
+Date:   Wed Jul 31 23:07:26 2013 +0200
+    Added support for mapping-configuration through mapping-files (*.hbm.xml)
+commit b6ac188a40136102edc51b6824875dfb07c89955
+Author: nicus
+Date:   Fri Apr 19 15:27:21 2013 +0200
+    Fixed problem with NamingStrategy (contribution from Lorenzo Nicora)
+
+     * NamingStrategy is set explicitly on Hibernate Configuration (not
+       passed by properties)
+     * Added  'hibernateNamingStrategy' configuration property
+commit c2135b5dedc55fc9e3f4dd9fe53f8c7b4141204c
+Author: Kai Moritz
+Date:   Mon Feb 25 22:35:33 2013 +0100
+    Integration of the maven-plugin-plugin for automated helpmojo-generation
+
+    Thanks to Adriano Machado, who contributed this patch!
+`
diff --git a/content/posts/hibernate4-maven-plugin-1-0-3-released.md b/content/posts/hibernate4-maven-plugin-1-0-3-released.md
new file mode 100644 (file)
index 0000000..f2ee8af
--- /dev/null
@@ -0,0 +1,167 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - hibernate
+  - java
+  - maven
+date: "2014-01-15T20:12:55+00:00"
+guid: http://juplo.de/?p=114
+parent_post_id: null
+post_id: "114"
+title: hibernate4-maven-plugin 1.0.3 released!
+url: /hibernate4-maven-plugin-1-0-3-released/
+
+---
+Today we released the version 1.0.3 of [hibernate4-maven-plugin](/hibernate4-maven-plugin "hibernate4-maven-plugin") to [Central](http://search.maven.org/ "Central").
+
+## Scanning dependencies
+
+This release of the plugin now supports scanning of dependencies. By default all dependencies in the scope `compile` are scanned for annotated classes. Thanks to Guido Wimmel, who pointed out, that this was really missing and supported the implementation with a little test-project for this use-case. [Learn more...](/hibernate4-maven-plugin/export-mojo.html#scanDependencies "Configuring dependency-scanning")
+
+## Support for Hibernate Envers
+
+Another new feature of this release is support for [Hibernate Envers - Easy Entity Auditing](http://docs.jboss.org/envers/docs/ "Open documentation"). Thanks a lot to Victor Tatai, how implemented this, and Erik-Berndt Scheper, who helped integrating it and who supported the testin with a little test-project, that demonstrates the new feature. You can [visit it at bitbucket](https://bitbucket.org/fbascheper/hibernate4-maven-plugin-envers-sample "Open the example project") as a starting point for your own experiments with this technique.
+
+## Less bugs!
+
+Many thanks also to Stephen Johnson and Eduard Szente, who pointed out bugs and helped eleminating them...
+
+## Get your hands on - on central!
+
+**[hibernate4-maven-plugin 1.0.3](/hibernate4-maven-plugin/ "hibernate4-maven-plugin")** is available in the [Central Maven Repository](http://search.maven.org/#artifactdetails|de.juplo|hibernate4-maven-plugin|1.0.3|maven-plugin "Central Maven Repository").
+
+- hibernate4-maven-plugin? [What's that for?!?](/hibernate4-maven-plugin/ "hibernate4-maven-plugin")
+- [Read more about the hibernate4-maven-plugin...](/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/ "About the hibernate4-maven-plugin")
+- [Jump to the quickstart-guide!](/hibernate4-maven-plugin/configuration.html "Quickstart")
+
+## Release notes:
+
+ `
+commit adb20bc4da63d4cec663ca68648db0f808e3d181
+Author: Kai Moritz
+Date:   Fri Oct 18 01:52:27 2013 +0200
+    Added missing documentation for skip-configuration
+commit 99a7eaddd1301df0d151f01791e3d177297670aa
+Author: Kai Moritz
+Date:   Fri Oct 18 00:38:29 2013 +0200
+    Added @since-Annotation to configuration-parameters
+commit 221d977368ee1897377f80bfcdd50dcbcd1d4b83
+Author: Kai Moritz
+Date:   Wed Oct 16 01:18:53 2013 +0200
+    The plugin now scans for annotated classes in dependencies too
+commit ef1233a6095a475d9cdded754381267c5d1e336f
+Author: Kai Moritz
+Date:   Wed Oct 9 21:37:58 2013 +0200
+    Project-Documentation now uses the own skin juplo-skin
+commit 84e8517be79d88d7e2bec2688a8f965f591394bf
+Author: Kai Moritz
+Date:   Wed Oct 9 21:30:28 2013 +0200
+    Reworked APT-Documentation: page-titles were missing
+commit f27134cdec6c38b4c8300efb0bb34fc8ed381033
+Author: Kai Moritz
+Date:   Wed Oct 9 21:29:30 2013 +0200
+    maven-site-plugin auf Version 3.3 aktualisiert
+commit d38b2386641c7ca00f54d69cb3f576c20b0cdccc
+Author: Kai Moritz
+Date:   Wed Sep 18 23:59:13 2013 +0200
+    Reverted to old behaviour: export is skipped, when maven.test.skip=true
+commit 7d935b61a3d80260b9cacf959984e14708c3a96b
+Author: Kai Moritz
+Date:   Wed Sep 18 18:15:38 2013 +0200
+    No configuration for hibernate.dialect might be a valid configuration too
+commit caa492b70dc1daeaef436748db38df1c19554943
+Author: Kai Moritz
+Date:   Wed Sep 18 18:14:54 2013 +0200
+    Improved log-messages
+commit 2b1147d5e99c764c1f6816f4d4f000abe260097c
+Author: Kai Moritz
+Date:   Wed Sep 18 18:10:32 2013 +0200
+    Variable "envers" should not be put into hibernate.properties
+
+    "hibernate.exoprt.envers" is no Hibernate-Configuration-Parameter.
+    Hence, it should not be put into the hibernate.properties-file.
+commit 0a52dca3dd6729b8b6a43cc3ef3b69eb22755b0a
+Author: Erik-Berndt Scheper
+Date:   Tue Sep 10 16:18:47 2013 +0200
+    Rename envers property to hibernate.export.envers
+commit 0fb85d6754939b2f30ca4fc18823c5f7da1add31
+Author: Erik-Berndt Scheper
+Date:   Tue Sep 10 08:20:23 2013 +0200
+    Ignore IntelliJ project files
+commit e88830c968c1aabc5c32df8a061a8b446c26505c
+Author: Victor Tatai
+Date:   Mon Feb 25 16:23:29 2013 -0300
+    Adding envers support (contribution from Victor Tatai)
+commit e59ac1191dda44d69dfb8f3afd0770a0253a785c
+Author: Kai Moritz
+Date:   Tue Sep 10 20:46:55 2013 +0200
+    Added Link to old Version 1.0.2 in documentation
+commit 97a45d03e1144d30b90f2f566517be22aca39358
+Author: Kai Moritz
+Date:   Tue Sep 10 20:29:15 2013 +0200
+    Execution is only skipped, if explicitly told so
+commit 8022611f93ad6f86534ddf3568766f88acf863f3
+Author: Kai Moritz
+Date:   Sun Sep 8 00:25:51 2013 +0200
+    Upgrade to Scannotation 1.0.3
+commit 9ab53380a87c4a1624654f654158a701cfeb0cae
+Author: Kai Moritz
+Date:   Sun Sep 8 00:25:02 2013 +0200
+    Upgrade to Hibernate 4.2.5.Final
+commit 5715c7e29252ed230389cfce9c1a0376fec82813
+Author: Kai Moritz
+Date:   Sat Aug 31 09:01:43 2013 +0200
+    Fixed failure when target/classes does not exist when runnin mvn test phase
+
+    Thanks to Stephen Johnson
+
+    Details from the original email:
+    ---------
+    The following patch stops builds failing when target/classes (or no main java exists), and target/test-classes and src/tests exist.
+
+    So for example calling
+
+    mvn test -> invokes compiler:compile and if you have export bound to process-classes phase in executions it will fail.  Maybe better to give info and carry on.  Say for example they want to leave the executions in place that deal with process-classes and also process-test-classes but they do not want it to fail if there is no java to annotate in src/classes.  The other way would be to comment out the executions bound to process-classes.  What about export being bound to process-class by default?  Could this also cause issues?
+
+    In either case I think the plugin code did checks for src/classes directory existing, in which case even call "mvn test" would fail as src/classes would not exist as no java existed in src/main only in src/test.  Have a look through the patch and see if its of any use.
+commit 9414e11c9ffb27e195193f5fa53c203c6297c7a4
+Author: Kai Moritz
+Date:   Sat Aug 31 11:28:51 2013 +0200
+    Improved log-messages
+commit da0b3041b8fbcba6175d05a2561b38c365111ed8
+Author: Kai Moritz
+Date:   Sat Aug 31 08:51:03 2013 +0200
+    Fixed NPE when using nested classes in entities with @EmbeddedId/@Embeddable
+
+    Patch supplied by Eduard Szente
+
+    Details:
+    ----------------
+    Hi,
+
+    when using your plugin for schema export the presence of nested classes
+    in entities (e.g. when using @EmbeddedId/@Embeddable and defining the Id
+    within the target entity class)
+    yields to NPEs.
+
+    public class Entity {
+
+      @EmbeddedId
+      private Id id;
+
+      @Embeddable
+      public static class Id implements Serializable {
+        ....
+      }
+
+    }
+
+    Entity.Id.class.getSimplename == "Id", while the compiled class is named
+    "Entity$Id.class"
+
+    Patch appended.
+
+    Best regards,
+    Eduard
+`
diff --git a/content/posts/hibernate4-maven-plugin-1-0-4-released.md b/content/posts/hibernate4-maven-plugin-1-0-4-released.md
new file mode 100644 (file)
index 0000000..b5d3a2f
--- /dev/null
@@ -0,0 +1,134 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - hibernate
+  - java
+  - maven
+date: "2014-06-17T10:32:30+00:00"
+guid: http://juplo.de/?p=288
+parent_post_id: null
+post_id: "288"
+title: hibernate4-maven-plugin 1.0.4 released!
+url: /hibernate4-maven-plugin-1-0-4-released/
+
+---
+We finally did it.
+Today we released the version 1.0.4 of [hibernate4-maven-plugin](/hibernate4-maven-plugin "hibernate4-maven-plugin") to [Central](http://search.maven.org/#search|gav|1|g%3A%22de.juplo%22%20AND%20a%3A%22hibernate4-maven-plugin%22 "Central")!
+
+This release mainly is a library-upgrade to version 4.3.1.Final of hibernate.
+It also includes some bug-fixes provided by the community.
+Please see the release notes for details.
+
+It took us quiet some time, to release this version and we are sorry for that.
+But with a growing number of users, we are becoming more anxious to break some special use-cases.
+Because of that, we started to add some integration-tests, to avoid that hassle, and that took us some time...
+
+If you have some special small-sized (example) use-cases for the plugin, we would appreciate it, if you would provide them to us, so we can add them es additional integration-tests.
+
+## Release notes:
+
+ `
+commit f3dabc0e6e3676244986b5bbffdb67d427c8383c
+Author: Kai Moritz
+Date:   Mon Jun 2 10:31:12 2014 +0200
+    [maven-release-plugin] prepare release hibernate4-maven-plugin-1.0.4
+commit 856dd31c9b90708e841163c91261a865f9efd224
+Author: Kai Moritz
+Date:   Mon Jun 2 10:12:24 2014 +0200
+    Updated documentation
+commit 64900890db2575b7a28790c5e4d5f45083ee94b3
+Author: Kai Moritz
+Date:   Tue Apr 29 20:43:15 2014 +0200
+    Switched documentation to xhtml, to be able to integrate google-pretty-print
+commit bd78c276663790bf7a3f121db85a0d62c64ce38c
+Author: Kai Moritz
+Date:   Tue Apr 29 19:42:41 2014 +0200
+    Fixed bug in site-configuration
+commit 1628bcf6c9290a729352215ee22e5b48fa628c4c
+Author: Kai Moritz
+Date:   Tue Apr 29 18:07:44 2014 +0200
+    Verifying generated SQL in integration-test hibernate4-maven-plugin-envers-sample
+commit 25079f13c0eda6807d5aee67086a21ddde313213
+Author: Kai Moritz
+Date:   Tue Apr 29 18:01:10 2014 +0200
+    Added integration-test provided by Erik-Berndt Scheper
+commit 69458703cddc2aea1f67e06db43bce6950c6f3cb
+Author: Kai Moritz
+Date:   Tue Apr 29 17:52:17 2014 +0200
+    Verifying generated SQL in integration-test schemaexport-example
+commit a53a2ad438038084200a8449c557a41159e409dc
+Author: Kai Moritz
+Date:   Tue Apr 29 17:46:05 2014 +0200
+    Added integration-test provided by Guido Wimmel
+commit f18f820198878cddcea8b98c2a5e0c9843b923d2
+Author: Kai Moritz
+Date:   Tue Apr 29 09:43:06 2014 +0200
+    Verifying generated SQL in integration-test hib-test
+commit 4bb462610138332087d808a62c84a0c9776b24cc
+Author: Kai Moritz
+Date:   Tue Apr 29 08:58:33 2014 +0200
+    Added integration-test provided by Joel Johnson
+commit c5c4c7a4007bc2bd58b850150adb78f8518788da
+Author: Kai Moritz
+Date:   Tue Apr 29 08:43:28 2014 +0200
+    Prepared POM for integration-tests via invoker-maven-plugin
+commit d8647fedfe936f49476a5c1f095d51a9f5703d3d
+Author: Kai Moritz
+Date:   Tue Apr 29 08:41:50 2014 +0200
+    Upgraded Version of maven from 3.0.4 to 3.2.1
+commit 1979c6349fc2a9e0fe3f028fa1cc76557b32031c
+Author: Frank Schimmel
+Date:   Wed Feb 12 15:16:18 2014 +0100
+    Properly support constraints expressed by bean validation (jsr303) annotations.
+
+     * Access public method of package-visible TypeSafeActivator class without reflection.
+     * Fix arguments to call of TypeSafeActivator.applyRelationalConstraints().
+     * Use hibernate version 4.3.1.Final for all components.
+     * Minor refactorings in exception handling.
+commit c3a16dc3704517d53501914bb8a0f95f856585f4
+Author: Kai Moritz
+Date:   Fri Jan 17 09:05:05 2014 +0100
+    Added last contributors to the POM
+commit 5fba40e135677130cbe0ff3c59f6055228293d92
+Author: Mark Robinson
+Date:   Fri Jan 17 08:53:47 2014 +0100
+    Generated schema now corresponds to hibernate validators set on the beans
+commit aedcc19cfb89a8b387399a978afab1166be816e3
+Author: Kai Moritz
+Date:   Thu Jan 16 18:33:32 2014 +0100
+    Upgrade to Hibernate 4.3.0.Final
+commit 734356ab74d2896ec8d7530af0d2fa60ff58001f
+Author: Kai Moritz
+Date:   Thu Jan 16 18:23:12 2014 +0100
+    Improved documentation of the dependency-scanning on the pitfalls-page
+commit f2955fc974239cbb266922c04e8e11101d7e9dd9
+Author: Joel Johnson
+Date:   Thu Dec 26 14:33:51 2013 -0700
+    Text cleanup, spelling, etc.
+commit 727d1a35bb213589270b097d04d5a1f480bffef6
+Author: Joel Johnson
+Date:   Thu Dec 26 14:02:29 2013 -0700
+    Make output file handling more robust
+
+    * Ensure output file directory path exists
+    * Anchor relative paths in build directory
+commit eeb182205a51c4507e61e1862af184341e65dbd3
+Author: Joel Johnson
+Date:   Thu Dec 26 13:53:37 2013 -0700
+    Check that md5 path is file and has content
+commit 64c0a52bdd82142a4c8caef18ab0671a74fdc6c1
+Author: Joel Johnson
+Date:   Thu Dec 26 11:25:34 2013 -0700
+    Use more descriptive filename for schema md5
+commit ba2e48a347a839be63cbce4b7ca2469a600748c6
+Author: Joel Johnson
+Date:   Thu Dec 26 11:20:24 2013 -0700
+    Offer explicit disable option
+
+    Use an explicit disable property, but still default it to test state
+commit e44434257040745e66e0596b262dd0227b085729
+Author: Kai Moritz
+Date:   Fri Oct 18 01:55:11 2013 +0200
+    [maven-release-plugin] prepare for next development iteration
+`
diff --git a/content/posts/hibernate4-maven-plugin-1-0-5-released.md b/content/posts/hibernate4-maven-plugin-1-0-5-released.md
new file mode 100644 (file)
index 0000000..59f46e0
--- /dev/null
@@ -0,0 +1,99 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - hibernate
+  - java
+  - maven
+date: "2015-05-03T13:52:31+00:00"
+guid: http://juplo.de/?p=319
+parent_post_id: null
+post_id: "319"
+title: hibernate4-maven-plugin 1.0.5 released!
+url: /hibernate4-maven-plugin-1-0-5-released/
+
+---
+Today we released the version 1.0.5 of [hibernate4-maven-plugin](/hibernate4-maven-plugin "hibernate4-maven-plugin") to [Central](http://search.maven.org/#search|gav|1|g%3A%22de.juplo%22%20AND%20a%3A%22hibernate4-maven-plugin%22 "Central")!
+
+This release mainly fixes a NullPointerException-bug, that was introduced in 1.0.4.
+The NPE was triggered, if a `hibernate.properties`-file is present and the dialect is specified in that file and not in the plugin configuration.
+Thanks to Paulo Pires and and everflux, for pointing me at that bug.
+
+But there are also some minor improvements to talk about:
+
+- Package level annotations are now supported (Thanks to Joachim Van der Auwera for that)
+- `Hibernate Core` was upgraded to 4.3.7.Final
+- `Hibernate Envers` was upgraded to 4.3.7.Final
+- `Hibernate Validator` was upgrades to 5.1.3.Final
+
+The upgrade of `Hibernate Validator` is a big step, because 5.x supports Bean Validation 1.1 ( [JSR 349](https://jcp.org/en/jsr/detail?id=349 "Read the specification at jpc.org")).
+See [the FAQ of hibernate-validator](http://hibernate.org/validator/faq/ "Read the first entry for more details on the supported version of Bean Validation") for more details on this.
+
+Because `Hibernate Validator 5` requires the Unified Expression Language (EL) in version 2.2 or later, a dependency to `javax.el-api:3.0.0` was added.
+That does the trick for the integration-tests included in the source code of the plugin.
+But, because I am not using `Hibernate Validator` in any of my own projects, at the moment, the upgrade may rise some backward compatibility errors, that I am not aware of.
+_If you stumble across any problems, please let me know!_
+
+## Release notes:
+
+ `
+commit ec30af2068f2d12a9acf65474ca1a4cdc1aa7122
+Author: Kai Moritz
+Date:   Tue Nov 11 15:28:12 2014 +0100
+    [maven-release-plugin] prepare for next development iteration
+commit 18840e3c775584744199d8323eb681b73b98e9c4
+Author: Kai Moritz
+Date:   Tue Nov 11 15:27:57 2014 +0100
+    [maven-release-plugin] prepare release hibernate4-maven-plugin-1.0.5
+commit b95416ef16bbaafecb3d40888fe97e70cdd75c77
+Author: Kai Moritz
+Date:   Tue Nov 11 15:10:32 2014 +0100
+    Upgraded hibernate-validator from 4.3.2.Final to 5.1.3.Final
+
+    Hibernate Validator 5 requires the Unified Expression Language (EL) in
+    version 2.2 or later. Therefore, a dependency to javax.el-api:3.0.0 was
+    added. (Without that, the compilation of some integration-tests fails!)
+commit ad979a8a82a7701a891a59a183ea4be66672145b
+Author: Kai Moritz
+Date:   Tue Nov 11 14:32:42 2014 +0100
+    Upgraded hibernate-core, hibernate-envers, hibernate-validator and maven-core
+
+     * Upgraded hibernate-core      from 4.3.1.Final to 4.3.7.Final
+     * Upgraded hibernate-envers    from 4.3.1.Final to 4.3.7.Final
+     * Upgraded hibernate-validator from 4.3.1.Final to 4.3.2.Final
+     * Upgraded maven-core          from 3.2.1       to 3.2.3
+commit 347236c3cea0f204cefd860c605d9f086e674e8b
+Author: Kai Moritz
+Date:   Tue Nov 11 14:29:23 2014 +0100
+    Added FAQ-entry for problem with whitespaces in the path under Windows
+commit 473c3ef285c19e0f0b85643b67bbd77e06c0b926
+Author: Kai Moritz
+Date:   Tue Oct 28 23:37:45 2014 +0100
+    Explained how to suppress dependency-scanning in documentation
+
+    Also added a test-case to be sure, that dependency-scanning is skipped, if
+    the parameter "dependencyScanning" is set to "none".
+commit 74c0dd783b84c90e116f3e7f1c8d6109845ba71f
+Author: Kai Moritz
+Date:   Mon Oct 27 09:04:48 2014 +0100
+    Fixed NullPointerException, when dialect is specified in properties-file
+
+    Also added an integration test-case, that proofed, that the error was
+    solved.
+commit d27f7af23c82167e873ce143e50ce9d9a65f5e61
+Author: Kai Moritz
+Date:   Sun Oct 26 11:16:00 2014 +0100
+    Renamed an integration-test to test for whitespaces in the filename
+commit 426d18e689b89f33bf71601becfa465a00067b10
+Author: Kai Moritz
+Date:   Sat Oct 25 17:29:41 2014 +0200
+    Added patch by Joachim Van der Auwera to support package level annotations
+commit 3a3aeaabdb1841faf5e1bf8d220230597fb22931
+Author: Kai Moritz
+Date:   Sat Oct 25 16:52:34 2014 +0200
+    Integrated integration test provided by Claus Graf (clausgraf@gmail.com)
+commit 3dd832edbd50b1499ea6d53e4bcd0ad4c79640ed
+Author: Kai Moritz
+Date:   Mon Jun 2 10:31:13 2014 +0200
+    [maven-release-plugin] prepare for next development iteration
+`
diff --git a/content/posts/hibernate4-maven-plugin-1-0-released.md b/content/posts/hibernate4-maven-plugin-1-0-released.md
new file mode 100644 (file)
index 0000000..16cd104
--- /dev/null
@@ -0,0 +1,37 @@
+---
+_edit_last: "2"
+_wp_old_slug: hibernat4-maven-plugin-1-0-released
+author: kai
+categories:
+  - hibernate
+  - java
+  - maven
+date: "2012-11-29T20:04:25+00:00"
+guid: http://juplo.de/?p=55
+parent_post_id: null
+post_id: "55"
+title: hibernate4-maven-plugin 1.0 released!
+url: /hibernate4-maven-plugin-1-0-released/
+
+---
+**Yeah!** We successfully released our first artifact to [Central](http://search.maven.org/ "Central").
+
+**[hibernate4-maven-plugin](/hibernate4-maven-plugin/ "hibernate4-maven-plugin")** is now available in the [Central Maven Repository](http://search.maven.org/#artifactdetails|de.juplo|hibernate4-maven-plugin|1.0|maven-plugin "Central Maven Repository")
+
+That means, that you now can use it without manually downloading and adding it to your local repository.
+
+Simply define it in your `plugins`-section...
+
+```
+
+  de.juplo
+  hibernate4-maven-plugin
+  1.0
+
+```
+
+...and there you go!
+
+- [hibernate4-maven-plugin?](/hibernate4-maven-plugin/ "hibernate4-maven-plugin") What's that for?!?
+- [Read more about the hibernate4-maven-plugin...](/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/ "About the hibernate4-maven-plugin")
+- [Jump to the quickstart-guide!](/hibernate4-maven-plugin-1.0/examples.html "Quickstart")
diff --git a/content/posts/hibernate4-maven-plugin-1-1-0-released.md b/content/posts/hibernate4-maven-plugin-1-1-0-released.md
new file mode 100644 (file)
index 0000000..1628f46
--- /dev/null
@@ -0,0 +1,200 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - hibernate
+  - java
+  - jpa
+  - maven
+  - uncategorized
+date: "2015-05-16T14:52:37+00:00"
+guid: http://juplo.de/?p=348
+parent_post_id: null
+post_id: "348"
+title: hibernate4-maven-plugin 1.1.0 released!
+url: /hibernate4-maven-plugin-1-1-0-released/
+
+---
+Today we released the version 1.1.0 of [hibernate4-maven-plugin](/hibernate4-maven-plugin "hibernate4-maven-plugin") to [Central](http://search.maven.org/#search|gav|1|g%3A%22de.juplo%22%20AND%20a%3A%22hibernate4-maven-plugin%22 "Central")!
+
+The main work in this release were modification to the process of configuration-gathering.
+The plugin now also is looking for a `hibernate.cfg.xml` on the classpath or a persistence-unit specified in a `META-INF/persistence.xml`.
+
+With this enhancement, the plugin is now able to deal with all examples from the official
+[Hibernate Getting Started Guide](https://docs.jboss.org/hibernate/orm/3.6/quickstart/en-US/html/index.html "Read the Tutorial").
+
+All configuration infos found are merged together with the same default precedences applied by hibernate.
+So, the overall order, in which possible configuration-sources are checked is now (each later source might overwrite settings of a previous source):
+
+1. `hibernate.properties`
+1. `hibernate.cfg.xml`
+1. `persistence.xml`
+1. maven properties
+1. plugin configuration
+
+Because the possible new configuration-sources might change the expected behavior of the plugin, we lifted the version to 1.1.
+
+This release also fixes a bug, that occured on some platforms, if the path to the project includes one or more space characters.
+
+## Release notes:
+
+ `
+commit 94e6b2e93fe107e75c9d20aa1eb3126e78a5ed0a
+Author: Kai Moritz
+Date:   Sat May 16 14:14:44 2015 +0200
+    Added script to check outcome of the hibernate-tutorials
+commit b3f8db2fdd9eddbaac002f94068dd1b4e6aef9a8
+Author: Kai Moritz
+Date:   Tue May 5 12:43:15 2015 +0200
+    Configured hibernate-tutorials to use the plugin
+commit 4b6fc12d443b0594310e5922e6ad763891d5d8fe
+Author: Kai Moritz
+Date:   Tue May 5 12:21:39 2015 +0200
+    Fixed the settings in the pom's of the tutorials
+commit 70bd20689badc18bed866b3847565e1278433503
+Author: Kai Moritz
+Date:   Tue May 5 11:49:30 2015 +0200
+    Added tutorials of the hibernate-release 4.3.9.Final as integration-tests
+commit 7e3e9b90d61b077e48b59fc0eb63059886c68cf5
+Author: Kai Moritz
+Date:   Sat May 16 11:04:36 2015 +0200
+    JPA-jdbc-properties are used, if appropriate hibernate-properties are missing
+commit c573877a186bec734915fdb3658db312e66a9083
+Author: Kai Moritz
+Date:   Thu May 14 23:43:13 2015 +0200
+    Hibernate configuration is gathered from class-path by default
+commit 2a85cb05542795f9cd2eed448f212f92842a85e8
+Author: Kai Moritz
+Date:   Wed May 13 09:44:18 2015 +0200
+    Found no way to check, that mapped classes were found
+commit 038ccf9c60be6c77e2ba9c2d2a2a0d261ce02ccb
+Author: Kai Moritz
+Date:   Tue May 12 22:13:23 2015 +0200
+    Upgraded scannotation from 1.0.3 to 1.0.4
+
+    This fixes the bug that occures on some platforms, if the path contains a
+    space. Created a fork of scannotation to bring the latest bug-fixes from SVN
+    to maven central...
+commit c43094689043d7da04df6ca55529d0f0c089d820
+Author: Kai Moritz
+Date:   Sun May 10 19:06:27 2015 +0200
+    Added javadoc-jar to deployed artifact
+commit 524cb8c971de87c21d0d9f0e04edf6bd30f77acc
+Author: Kai Moritz
+Date:   Sat May 9 23:48:39 2015 +0200
+    Be sure to relase all resources (closing db-connections!)
+commit 1e5cca792c49d60e20d7355eb97b13d591d80af6
+Author: Kai Moritz
+Date:   Sat May 9 22:07:31 2015 +0200
+    Settings in a hibernate.cfg.xml are read
+commit 9156c5f6414b676d34eb0c934e70604ba822d09a
+Author: Kai Moritz
+Date:   Tue May 5 23:42:40 2015 +0200
+    Catched NPE, if hibernate-dialect is not set
+commit 62859b260a47e70870e795304756bba2750392e3
+Author: Kai Moritz
+Date:   Sun May 3 18:53:24 2015 +0200
+    Upgraded oss-type, maven-plugin-api and build/report-plugins
+commit c1b3b60be4ad2c5c78cb1e3706019dfceb390f89
+Author: Kai Moritz
+Date:   Sun May 3 18:53:04 2015 +0200
+    Upgraded hibernate to 4.3.9.Final
+commit 038ccf9c60be6c77e2ba9c2d2a2a0d261ce02ccb
+Author: Kai Moritz
+Date:   Tue May 12 22:13:23 2015 +0200
+    Upgraded scannotation from 1.0.3 to 1.0.4
+
+    This fixes the bug that occures on some platforms, if the path contains a
+    space. Created a fork of scannotation to bring the latest bug-fixes from SVN
+    to maven central...
+commit c43094689043d7da04df6ca55529d0f0c089d820
+Author: Kai Moritz
+Date:   Sun May 10 19:06:27 2015 +0200
+    Added javadoc-jar to deployed artifact
+commit 524cb8c971de87c21d0d9f0e04edf6bd30f77acc
+Author: Kai Moritz
+Date:   Sat May 9 23:48:39 2015 +0200
+    Be sure to relase all resources (closing db-connections!)
+commit 1e5cca792c49d60e20d7355eb97b13d591d80af6
+Author: Kai Moritz
+Date:   Sat May 9 22:07:31 2015 +0200
+    Settings in a hibernate.cfg.xml are read
+commit 9156c5f6414b676d34eb0c934e70604ba822d09a
+Author: Kai Moritz
+Date:   Tue May 5 23:42:40 2015 +0200
+    Catched NPE, if hibernate-dialect is not set
+commit 62859b260a47e70870e795304756bba2750392e3
+Author: Kai Moritz
+Date:   Sun May 3 18:53:24 2015 +0200
+    Upgraded oss-type, maven-plugin-api and build/report-plugins
+commit c1b3b60be4ad2c5c78cb1e3706019dfceb390f89
+Author: Kai Moritz
+Date:   Sun May 3 18:53:04 2015 +0200
+    Upgraded hibernate to 4.3.9.Final
+commit 038ccf9c60be6c77e2ba9c2d2a2a0d261ce02ccb
+Author: Kai Moritz
+Date:   Tue May 12 22:13:23 2015 +0200
+    Upgraded scannotation from 1.0.3 to 1.0.4
+
+    This fixes the bug that occures on some platforms, if the path contains a
+    space. Created a fork of scannotation to bring the latest bug-fixes from SVN
+    to maven central...
+commit c43094689043d7da04df6ca55529d0f0c089d820
+Author: Kai Moritz
+Date:   Sun May 10 19:06:27 2015 +0200
+    Added javadoc-jar to deployed artifact
+commit 524cb8c971de87c21d0d9f0e04edf6bd30f77acc
+Author: Kai Moritz
+Date:   Sat May 9 23:48:39 2015 +0200
+    Be sure to relase all resources (closing db-connections!)
+commit 1e5cca792c49d60e20d7355eb97b13d591d80af6
+Author: Kai Moritz
+Date:   Sat May 9 22:07:31 2015 +0200
+    Settings in a hibernate.cfg.xml are read
+commit 9156c5f6414b676d34eb0c934e70604ba822d09a
+Author: Kai Moritz
+Date:   Tue May 5 23:42:40 2015 +0200
+    Catched NPE, if hibernate-dialect is not set
+commit 62859b260a47e70870e795304756bba2750392e3
+Author: Kai Moritz
+Date:   Sun May 3 18:53:24 2015 +0200
+    Upgraded oss-type, maven-plugin-api and build/report-plugins
+commit c1b3b60be4ad2c5c78cb1e3706019dfceb390f89
+Author: Kai Moritz
+Date:   Sun May 3 18:53:04 2015 +0200
+    Upgraded hibernate to 4.3.9.Final
+commit 248ff3220acc8a2c11281959a1496adc024dd4df
+Author: Kai Moritz
+Date:   Sun May 3 18:09:12 2015 +0200
+    Renamed nex release to 1.1.0
+commit 2031d4cfdb8b2d16e4f2c7bbb5c03a15b4f64b21
+Author: Kai Moritz
+Date:   Sun May 3 16:48:43 2015 +0200
+    Generation of tables and rows for auditing is now default
+commit 42465d2a5e4a5adc44fbaf79104ce8cc25ecd8fd
+Author: Kai Moritz
+Date:   Sun May 3 16:20:58 2015 +0200
+    Fixed mojo to scan for properties in persistence.xml
+commit d5a4326bf1fe2045a7b2183cfd3d8fdb30fcb406
+Author: Kai Moritz
+Date:   Sun May 3 14:51:12 2015 +0200
+    Added an integration-test, that depends on properties from a persistence.xml
+commit 5da1114d419ae10f94a83ad56cea9856a39f00b6
+Author: Kai Moritz
+Date:   Sun May 3 14:51:46 2015 +0200
+    Switched to usage of a ServiceRegistry
+commit fed9fc9e4e053c8b61895e78d1fbe045fadf7348
+Author: Kai Moritz
+Date:   Sun May 3 11:42:54 2015 +0200
+    Integration-Test for envers really generates the SQL
+commit fee05864d61145a06ee870fbffd3bff1e95af08c
+Author: Kai Moritz
+Date:   Sun Mar 15 16:56:22 2015 +0100
+    Extended integration-test "hib-test" to check for package-level annotations
+commit 7518f2a7e8a3d900c194dbe61609efa34ef047bd
+Author: Kai Moritz
+Date:   Sun Mar 15 15:42:01 2015 +0100
+    Added support for m2e
+
+    Thanks to Andreas Khutz
+`
diff --git a/content/posts/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations.md b/content/posts/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations.md
new file mode 100644 (file)
index 0000000..109e6c9
--- /dev/null
@@ -0,0 +1,26 @@
+---
+_edit_last: "1"
+author: kai
+categories:
+  - hibernate
+  - java
+  - maven
+date: "2020-06-15T19:15:58+00:00"
+guid: http://juplo.de/?p=34
+parent_post_id: null
+post_id: "34"
+title: hibernate4-maven-plugin
+url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+
+---
+## A simple Plugin for generating a Database-Schema from Hibernate 4 Mapping-Annotations
+
+Hibernate comes with the buildin functionality, to automatically create or update the database schema. This functionality is configured in the session-configuraton via the parameter `hbm2ddl.auto` (see [Hibernate Reference Documentation - Chapter 3.4. Optional configuration properties](http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#configuration-optional)). But doing so [is not very wise](http://stackoverflow.com/questions/221379/hibernate-hbm2ddl-auto-update-in-production), because you can easily corrupt or erase your production database, if this configuration parameter slips through to your production environment.
+
+Alternatively, you can [run the tools **SchemaExport** or **SchemaUpdate** by hand](http://stackoverflow.com/questions/835961/how-to-creata-database-schema-using-hibernate). But that is not very comfortable and being used to maven you will quickly long for a plugin, that does that job automatically for you, when you fire up your test cases.
+
+In the good old times, there was the [Maven Hibernate3 Plugin](http://mojo.codehaus.org/maven-hibernate3/hibernate3-maven-plugin/), that does this for you. But unfortunatly, this plugin is not compatible with Hibernate 4.x. Since there does not seem to be any successor for the Maven Hibernate3 Plugin and [googeling](http://www.google.de/search?q=hibernate4+maven+plugin) does not help, I decided to write up this simple plugin (inspired by these two articles I found: [Schema Export with Hibernate 4 and Maven](http://www.tikalk.com/alm/blog/schema-export-hibernate-4-and-maven) and [Schema generation with Hibernate 4, JPA and Maven](http://doingenterprise.blogspot.de/2012/05/schema-generation-with-hibernate-4-jpa.html)).
+
+I hope, the resulting simple to use buletproof [hibernate4-maven-plugin](/hibernate4-maven-plugin/) is usefull!
+
+**[Try it out now!](/hibernate4-maven-plugin/)**
diff --git a/content/posts/how-to-instantiatiate-multiple-beans-dinamically-in-spring-boot-based-on-configuration-properties.md b/content/posts/how-to-instantiatiate-multiple-beans-dinamically-in-spring-boot-based-on-configuration-properties.md
new file mode 100644 (file)
index 0000000..f3d635a
--- /dev/null
@@ -0,0 +1,130 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - demos
+  - explained
+  - howto
+  - java
+  - spring
+  - spring-boot
+classic-editor-remember: classic-editor
+date: "2020-11-21T10:12:57+00:00"
+guid: http://juplo.de/?p=1185
+parent_post_id: null
+post_id: "1185"
+title: How To Instantiatiate Multiple Beans Dinamically in Spring-Boot Depending on Configuration-Properties
+url: /how-to-instantiatiate-multiple-beans-dinamically-in-spring-boot-based-on-configuration-properties/
+
+---
+## TL;DR
+
+In this mini-HowTo I will show a way, how to instantiate multiple beans dinamically in Spring-Boot, depending on configuration-properties.
+We will:
+
+- write a **`ApplicationContextInitializer`** to add the beans to the context, before it is refreshed
+- write a **`EnvironmentPostProcessor`** to access the configured configuration sources
+- register the `EnvironmentPostProcessor` with Spring-Boot
+
+## Write an ApplicationContextInitializer
+
+Additionally Beans can be added programatically very easy with the help of an `ApplicationContextInitializer`:
+
+`@AllArgsConstructor
+public class MultipleBeansApplicationContextInitializer
+    implements
+      ApplicationContextInitializer
+{
+  private final String[] sites;
+  @Override
+  public void initialize(ConfigurableApplicationContext context)
+  {
+    ConfigurableListableBeanFactory factory =
+        context.getBeanFactory();
+    for (String site : sites)
+    {
+      SiteController controller =
+          new SiteController(site, "Descrition of site " + site);
+      factory.registerSingleton("/" + site, controller);
+    }
+  }
+}
+`
+
+This simplified example is configured with a list of strings that should be registered as controllers with the `DispatcherServlet`.
+All "sites" are insances of the same controller `SiteController`, which are instanciated and registered dynamically.
+
+The instances are registered as beans with the method **`registerSingleton(String name, Object bean)`**
+of a `ConfigurableListableBeanFactory` that can be accessed through the provided `ConfigurableApplicationContext`
+
+The array of strings represents the accessed configuration properties in the simplified example.
+The array will most probably hold more complex data-structures in a real-world application.
+
+_But how do we get access to the configuration-parameters, that are injected in this array here...?_
+
+## Accessing the Configured Property-Sources
+
+Instantiating and registering the additionally beans is easy.
+The real problem is to access the configuration properties in the early plumbing-stage of the application-context, in that our `ApplicationContextInitializer` runs in:
+
+_The initializer cannot be instantiated and autowired by Spring!_
+
+**The Bad News:** In the early stage we are running in, we cannot use autowiring or access any of the other beans that will be instantiated by spring - especially not any of the beans, that are instantiated via `@ConfigurationProperties`, we are intrested in.
+
+**The Good News:** We will present a way, how to access initialized instances of all property sources, that will be presented to your app
+
+## Write an EnvironmentPostProcessor
+
+If you write an **`EnvironmentPostProcessor`**, you will get access to an instance of `ConfigurableEnvironment`, that contains a complete list of all `PropertySource`'s, that are configured for your Spring-Boot-App.
+
+`public class MultipleBeansEnvironmentPostProcessor
+    implements
+      EnvironmentPostProcessor
+{
+  @Override
+  public void postProcessEnvironment(
+      ConfigurableEnvironment environment,
+      SpringApplication application)
+  {
+    String sites =
+        environment.getRequiredProperty("juplo.sites", String.class);
+    application.addInitializers(
+        new MultipleBeansApplicationContextInitializer(
+            Arrays
+                .stream(sites.split(","))
+                .map(site -> site.trim())
+                .toArray(size -> new String[size])));
+  }
+}
+`
+
+**The Bad News:**
+Unfortunately, you have to scan all property-sources for the parameters, that you are interested in.
+Also, all values are represented as stings in this early startup-phase of the application-context, because Spring's convenient conversion mechanisms are not available yet.
+So, you have to convert any values by yourself and stuff them in more complex data-structures as needed.
+
+**The Good News:**
+The property names are consistently represented in standard Java-Properties-Notation, regardless of the actual type ( `.properties` / `.yml`) of the property source.
+
+## Register the EnvironmentPostProcessor
+
+Finally, you have to [register](https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-customize-the-environment-or-application-context "Read more on details and/or alternatives of the mechanism") the `EnvironmentPostProcessor` with your Spring-Boot-App.
+This is done in the **`META-INF/spring.factories`**:
+
+`org.springframework.boot.env.EnvironmentPostProcessor=\
+  de.juplo.demos.multiplebeans.MultipleBeansEnvironmentPostProcessor
+`
+
+**That's it, your done!**
+
+## Source Code
+
+You can find the whole source code in a working mini-application on juplo.de and GitHub:
+
+- [/git/demos/multiple-beans/](/git/demos/multiple-beans/)
+- [https://github.com/juplo/demos-multiple-beans](https://github.com/juplo/demos-multiple-beans)
+
+## Other Blog-Posts On The Topic
+
+- The blog-post [Dynamic Beans in Spring](https://blog.pchudzik.com/201705/dynamic-beans/) shows a way to register beans dynamically, but does not show how to access the configuration. Also, meanwhile another interface was added to spring, that facilitates this approach: `BeanDefinitionRegistryPostProcessor `
+- Benjamin shows in [How To Create Your Own Dynamic Bean Definitions In Spring](https://comsystoreply.de/blog-post/how-to-create-your-own-dynamic-bean-definitions-in-spring), how this interface can be applied and how one can access the configuration. But his example only works with plain Spring in a Servlet Container
diff --git a/content/posts/how-to-keep-the-time-zone-when-deserializing-a-zoneddatetime-with-jackson.md b/content/posts/how-to-keep-the-time-zone-when-deserializing-a-zoneddatetime-with-jackson.md
new file mode 100644 (file)
index 0000000..c82278f
--- /dev/null
@@ -0,0 +1,39 @@
+---
+_edit_last: "3"
+author: kai
+categories:
+  - jackson
+  - java
+  - leitmarkt-wettbewerb-createmedia.nrw
+date: "2015-11-12T15:12:05+00:00"
+guid: http://juplo.de/?p=554
+parent_post_id: null
+post_id: "554"
+title: How To Keep The Time-Zone When Deserializing A ZonedDateTime With Jackson
+url: /how-to-keep-the-time-zone-when-deserializing-a-zoneddatetime-with-jackson/
+
+---
+## The Problem: Jackson Loses The Time-Zone During Dezerialization Of A ZonedDateTime
+
+In its default configuration [Jackson](http://wiki.fasterxml.com/JacksonHome "Visit the homepage of the Jackson-project") adjusts the time-zone of a `ZonedDateTime` to the time-zone of the local context.
+As, by default, the time-zone of the local context is not set and has to be configured manually, Jackson adjusts the time-zone to GMT.
+
+This behavior is very unintuitive and not well documented.
+[It looks like Jackson just loses the time-zone during deserialization](http://stackoverflow.com/questions/19460004/jackson-loses-time-offset-from-dates-when-deserializing-to-jodatime/33674296 "Read this question on Stackoverflow for example") and, [if you serialize and deserialize a `ZonedDateTime`, the result will not equal the original instance](https://github.com/FasterXML/jackson-datatype-jsr310/issues/22 "See this issue on the jackson-datatype-jsr310 on GitHub"), because it has a different time-zone.
+
+## The Solution: Tell Jackson, Not To Adjust the Time-Zone
+
+Fortunately, there is a quick and simple fix for this odd default-behavior: you just have to tell Jackson, not to adjust the time-zone.
+Tis can be done with this line of code:
+
+```java
+mapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
+```
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/how-to-redirect-to-spring-security-oauth-behind-a-gateway-proxy-part-debugging-the-oauth-flow.md b/content/posts/how-to-redirect-to-spring-security-oauth-behind-a-gateway-proxy-part-debugging-the-oauth-flow.md
new file mode 100644 (file)
index 0000000..65afb0a
--- /dev/null
@@ -0,0 +1,30 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+classic-editor-remember: classic-editor
+date: "2020-03-07T15:58:36+00:00"
+draft: "true"
+guid: http://juplo.de/?p=1116
+parent_post_id: null
+post_id: "1116"
+title: 'How To Redirect To Spring Security OAuth2 Behind a Gateway/Proxy -- Part 3: Debugging The OAuth2-Flow'
+url: /
+
+---
+If you only see something like the following, after starting NGINX, you have forgotten, to start your app before (in the network `juplo`):
+
+```sh
+2020/03/06 14:31:20 [emerg] 1#1: host not found in upstream "app:8080" in /etc/nginx/conf.d/proxy.conf:2
+nginx: [emerg] host not found in upstream "app:8080" in /etc/nginx/conf.d/proxy.conf:2
+
+```
+
+```sh
+
+```
+
+```sh
+
+```
diff --git a/content/posts/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway.md b/content/posts/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway.md
new file mode 100644 (file)
index 0000000..a916f39
--- /dev/null
@@ -0,0 +1,220 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - howto
+  - java
+  - oauth2
+  - spring
+  - spring-boot
+classic-editor-remember: classic-editor
+date: "2020-11-10T07:20:07+00:00"
+guid: http://juplo.de/?p=1037
+parent_post_id: null
+post_id: "1037"
+title: 'How To Redirect To Spring Security OAuth2 Behind a Gateway/Proxy -- Part 2: Hiding The App Behind A Reverse-Proxy (Aka Gateway)'
+url: /how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/
+
+---
+This post is part of a series of Mini-Howtos, that gather some help, to get you started, when switching from localhost to production with SSL and a reverse-proxy (aka gateway) in front of your app, that forwards the requests to your app that listens on a different name/IP, port and protocol.
+
+## In This Series We...
+
+1. [Run the official Spring-Boot-OAuth2-Tutorial as a container in docker](/howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker/)
+1. Simulate production by hiding the app behind a gateway (this part)
+1. Show how to debug the oauth2-flow for the whole crap!
+1. Enable SSL on our gateway
+1. Show how to do the same with Facebook, instead of GitHub
+
+I will also give some advice for those of you, who are new to Docker - _but just enough to enable you to follow_.
+
+This is **part 2** of this series, that shows how to **run a Spring-Boot OAuth2 App behind a gateway**
+\- Part 1 is linked above.
+
+## Our Plan: Simulating A Production-Setup
+
+We will simulate a production-setup by adding the domain, that will be used in production - `example.com` in our case -, as an alias for `localhost`.
+
+Additionally, we will start an [NGINX](https://nginx.com) as reverse-proxy alongside our app and put both containers into a virtual network.
+This simulates a real-world secenario, where your app will be running behinde a gateway together with a bunch of other apps and will have to deal with forwarded requests.
+
+Together, this enables you to test the production-setup of your oauth2-provider against a locally running development environment, including the configuration of the finally used URIs and nasty forwarding-errors.
+
+To reach this goal we will have to:
+
+1. [Reconfigure our oauth-provider for the new domain](#provider-production-setup)
+1. [Add the domain as an alias for localhost](#set-alias-for-domain)
+1. [Create a virtual network](#create-virtual-network)
+1. [Move the app into the created virtual network](#move-app-into-virtual-network)
+1. [Configure and start nginx as gateway in the virtual network](#start-gateway-in-virtual-network)
+
+_By the way:_
+Any other server, that can act as reverse proxy, or some real gateway,like [Zuul](https://github.com/Netflix/zuul "In real real-world you should consider something like Zuul of similar") would work as well, but we stick with good old NGINX, to keep it simple.
+
+## Switching The Setup Of Your OAuth2-Provider To Production
+
+In our example we are using GitHub as oauth2-provider and `example.com` as the domain, where the app should be found after the release.
+So, we will have to change the **Authorization callback URL** to
+**`http://example.de/login/oauth2/code/github`**
+
+![](/wp-uploads/2020/03/github-example.jpg)
+
+O.k., that's done.
+
+But we haven't released yet and nothing can be found on the reals server, that hosts `example.com`...
+But still, we really would like to test that production-setup to be sure that we configured all bits and pieces correctly!
+
+_In order to tackle this chicken-egg-problem, we will fool our locally running browser to belive, that `example.com` is our local development system._
+
+## Setting Up The Alias for `example.com`
+
+On Linux/Unix this can be simply done by editing **`/etc/hosts`**.
+You just have to add the domain ( `example.com`) at the end of the line that starts with `127.0.0.1`:
+
+```hosts
+127.0.0.1      localhost example.com
+
+```
+
+Locally running programms - like your browser - will now resolve `example.com` as `127.0.0.1`
+
+## Create A Virtual Network With Docker
+
+Next, we have to create a virtual network, where we can put in both containers:
+
+```sh
+docker network create juplo
+
+```
+
+Yes, with Docker it is as simple as that.
+
+Docker networks also come with some extra goodies.
+Especially one, which is extremly handy for our use-case is: They are enabling automatic name-resolving for the connected containers.
+Because of that, we do not need to know the IP-addresses of the participating containers, if we give each connected container a name.
+
+## Docker vs. Kubernetes vs. Docker-Compose
+
+We are using Docker here on purpose.
+Using Kubernetes just to test / experiment on a DevOp-box would be overkill.
+Using Docker-Compose might be an option.
+But we want to keep it as simple as possible for now, hence we stick with Docker.
+Also, we are just experimenting here.
+
+_You might want to switch to Docker-Compose later._
+_Especially, if you plan to set up an environment, that you will frequently reuse for manual tests or such._
+
+## Move The App Into The Virtual Network
+
+To move our app into the virtual network, we have to start it again with the additional parameter **`--network`**.
+We also want to give it a name this time, by using **`--name`**, to be able to contact it by name.
+
+_You have to stop and remove the old container from part 1 of this HowTo-series with `CTRL-C` beforehand, if it is still running - Removing is done automatically, because we specified `--rm`_:
+
+```sh
+docker run \
+  -d \
+  --name app \
+  --rm \
+  --network juplo \
+  juplo/social-logout:0.0.1 \
+  --server.use-forward-headers=true \
+  --spring.security.oauth2.client.registration.github.client-id=YOUR_GITHUB_ID \
+  --spring.security.oauth2.client.registration.github.client-secret=YOUR_GITHUB_SECRET
+
+```
+
+Summary of the changes in comparison to [the statement used in part 1](/howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker/#build-a-docker-image "Skip back to part 1, if you want to compare..."):
+
+- We added **`-d`** to run the container in the background - _See tips below..._
+- We added **`--server.use-forward-headers=true`**, which is needed, because our app is running behind a gateway now - _I will explain this in more detail later_
+- _And:_ Do not forget the **`--network juplo`**,
+  which is necessary to put the app in our virtual network `juplo`, and **`--name app`**, which is necessary to enable DNS-resolving.
+
+- You do not need the port-mapping this time, because we will only talk to our app through the gateway.  
+
+  Remember: _We are **hiding** our app behind the gateway!_
+
+## Some quick tips to Docker-newbies
+
+- Since we are starting multiple containers, that shall run in parallel, you have to start each command in a separate terminal, because **`CTRL-C`** will stop (and in our case remove) the container again.
+
+- Alternatively, you can add the parameter **`-d`** (for daemonize) to start the container in the background.
+
+- Then, you can look at its output with **`docker logs -f NAME`** (safely disruptable with `CTRL-C`) and stop (and in our case remove) the container with **`docker stop NAME`**.
+
+- If you wonder, which containers are actually running, **`docker ps`** is your friend.
+
+## Starting the Reverse-Proxy Aka Gateway
+
+Next, we will start NGINX alongside our app and configure it as reverse-proxy:
+
+1. Create a file **`proxy.conf`** with the following content:
+
+   ```sh
+   upstream upstream_a {
+     server        app:8080;
+   }
+
+   server {
+     listen        80;
+     server_name   example.com;
+
+     proxy_set_header     X-Real-IP           $remote_addr;
+     proxy_set_header     X-Forwarded-For     $proxy_add_x_forwarded_for;
+     proxy_set_header     X-Forwarded-Proto   $scheme;
+     proxy_set_header     Host                $host;
+     proxy_set_header     X-Forwarded-Host    $host;
+     proxy_set_header     X-Forwarded-Port    $server_port;
+
+     location / {
+       proxy_pass  http://upstream_a;
+     }
+   }
+
+   ```
+
+   - We define a server, that listens to requests for the host **`example.com`** ( `server_name`) on port **`80`**.
+   - With the `location`-directive we tell this server, that all requests shall be handled by the upstream-server **`upstream_a`**.
+   - This server was defined in the `upstream`-block at the beginning of the configuration-file to be a forward to **`app:8080`**
+   - **`app`** is simply the name of the container, that is running our oauth2-app - Rembember: the name is resolvable via DNS
+   - **`8080`** is the port, our app listens on in that container.
+   - The `proxy_set_header`-directives are needed by Spring-Boot Security, for dealing correctly with the circumstance, that it is running behind a reverse-proxy.
+
+_In part 3, we will survey the `proxy_set_header`-directives in more detail._
+1. Start nginx in the virtual network and connect port `80` to `localhost`:
+
+   ```sh
+   docker run \
+     --name proxy \
+     --rm \
+     --network juplo -p 80:80 \
+     --volume $(pwd)/proxy.conf:/etc/nginx/conf.d/proxy.conf:ro \
+     nginx:1.17
+
+   ```
+
+   _This command has to be executed in the direcotry, where you have created the file `proxy.conf`._
+
+   - I use NGINX here, because I want to demystify the work of a gateway  
+_[traefik](https://docs.traefik.io/ "Read more about this great tool") would have been easier to configure in this setup, but it would have disguised, what is going on behind the scene: with NGINX we have to configure all manually, which is more explicitly and hence, more informative_
+   - We can use port `80` on localhost, since the docker-daemon runs with root-privileges and hence, can use this privileged port - _if you do not have another webserver running locally there_.
+   - `$(pwd)` resolves to your current working-directory - This is the most convenient way to produce the absolute path to `proxy.conf`, that is required by `--volume` to work correclty.
+
+If you have reproduced the receipt exacly, your app should be up and running now.
+That is:
+
+   - Because we set the alias `example.com` to point at `localhost` you should now be able to open your app as **`http://example.com` in a locally running browser**
+   - You then should be able to login/logount without errors
+   - If you have configured everything correctly, neither your app nor GitHub should mutter at you during the redirect to GitHub and back to your app
+
+## Whats next... is what can go wrong!
+
+In this simulated production-setup a lot of stuff can go wrong!
+You may face nearly any problem from configuration-mismatches considering the redirect-URIs to nasty and hidden redirect-issues due to forwarded requests.
+
+_Do not mutter at me..._
+_**Remember:** That was the reason, we set up this simulated production-setup in the first place!_
+
+In the next part of this series I will explain some of the most common problems in a production-setup with forwarded requests.
+I will also show, how you can debug the oauth2-flow in your simulated production-setup, to discover and solve these problems
diff --git a/content/posts/howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker.md b/content/posts/howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker.md
new file mode 100644 (file)
index 0000000..fccdf35
--- /dev/null
@@ -0,0 +1,160 @@
+---
+_edit_last: "2"
+_wp_old_date: "2020-03-06"
+author: kai
+categories:
+  - howto
+  - java
+  - oauth2
+  - spring
+  - spring-boot
+classic-editor-remember: classic-editor
+date: "2020-03-06T22:02:44+00:00"
+guid: http://juplo.de/?p=1064
+parent_post_id: null
+post_id: "1064"
+title: 'How To Redirect To Spring Security OAuth2 Behind a Gateway/Proxy - Part 1: Running Your  App In Docker'
+url: /howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker/
+
+---
+## Switching From Tutorial-Mode (aka POC) To Production Is Hard
+
+Developing Your first OAuth2-App on [`localhost`](https://www.google.com/search?q=there+no+place+like+%22127.0.0.1%22&tbm=isch&ved=2ahUKEwjF-8XirIHoAhWzIMUKHWcZBJYQ2-cCegQIABAA&oq=there+no+place+like+%22127.0.0.1%22&gs_l=img.3..0i30l3j0i8i30l4.8396.18840..19156...0.0..0.114.2736.30j1......0....1..gws-wiz-img.......35i39j0j0i19j0i30i19j0i8i30i19.joOmqxpmfsw&ei=EeZfXoWvIrPBlAbnspCwCQ&bih=949&biw=1853) with [OAuth2 Boot](https://docs.spring.io/spring-security-oauth2-boot/docs/current/reference/htmlsingle/ "Learn more about OAuth2 Boot") may be easy, ...
+
+...but what about running it in **real life**?
+
+![Looking for the real life](/wp-uploads/2020/03/real-life-meme-300x297.png)
+
+This is the first post of a series of Mini-Howtos, that gather some help, to get you started, when switching from localhost to production with SSL and a reverse-proxy (aka gateway) in front of your app, that forwards the requests to your app that listens on a different name/IP, port and protocol.
+
+## In This Series We Will...
+
+1. [Start with](#spring-boot-oauth2) the fantastic official [OAuth2-Tutorial](https://spring.io/guides/tutorials/spring-boot-oauth2/ "You definitely should work through this tutorial first!") from the Spring-Boot folks - _love it!_ \- and [run it as a container in docker](#build-a-docker-image)
+1. [Hide that behind a reverse-proxy, like in production - _nginx in our case, but could be any pice of software, that can act as a gateway_](/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/ "Jump to part 2 and learn how to set up a simulated production-installation")
+ [Show how to debug the oauth2-flow for the whole crap!\
+Enable SSL for our gateway - because oauth2-providers (like Facebook) are pressing us to do so\
+Show how to do the same with Facebook, instead of GitHub](/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/ "Jump to part 2 and learn how to set up a simulated production-installation")
+
+[I will also give some advice for those of you, who are new to Docker - _but just enough to enable you to follow_.\
+\
+This is **Part 1** of this series, that shows how to **package a Spring-Boot-App as Docker-Image and run it as a container**\
+**`tut-spring-boot-oauth2/logout`**](/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/ "Jump to part 2 and learn how to set up a simulated production-installation")
+
+[As an example for a simple app, that uses](/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/ "Jump to part 2 and learn how to set up a simulated production-installation") [OAuth2](https://tools.ietf.org/html/rfc6749 "Read all about OAuth2 in the RFC 6749") for authentication, we will use the third step of the [Spring-Boot OAuth2-Tutorial](https://spring.io/guides/tutorials/spring-boot-oauth2/ "You definitely should work through this tutorial first!").
+
+You should work through that tutorial up until that step - called **logout** -, if you have not done yet.
+This will guide you through programming and setting up a simple app, that uses the [GitHub-API](https://developer.github.com/v3/ "Learn more about the API provided by GitHub") to authenticate its users.
+
+Especially, it explains, how to **[create and set up a OAuth2-App on GitHub](https://spring.io/guides/tutorials/spring-boot-oauth2/#github-register-application "This links directly to the part of the tutorial, that explains the setup & configuration needed in GitHub Developers")** \- _Do not miss out on that part: You need your own app-ID and -secret and a correctly configured **redirect URI**_.
+
+You should be able to build the app as JAR and start that with the ID/secret of your GitHub-App without changing code or configuration-files as follows:
+
+```docker
+mvn package
+java -jar target/social-logout-0.0.1-SNAPSHOT.jar \
+  --spring.security.oauth2.client.registration.github.client-id=YOUR_GITHUB_APP_ID
+  --spring.security.oauth2.client.registration.github.client-secret=YOUR_GITHUB_APP_SECRET
+
+```
+
+_If the app is running corectly, you should be able to Login/Logout via **`http://localhost:8080/`**_
+
+The folks at Spring-Boot are keeping the guide and this repository up-to-date pretty well.
+At the date of the writing of this article it is up to date with version [2.2.2.RELEASE](https://github.com/spring-guides/tut-spring-boot-oauth2/commit/274b864a2bcab5326979bc2ba370e32180510362 "Check out the exact version of this example-project, that is used in this article, if you want") of Spring-Boot.
+
+_You may as well use any other OAuth2-application here. For example your own POC, if you already have build one that works while running on `localhost`_
+
+## Some Short Notes On OAuth2
+
+I will only explain the protocol in very short words here, so that you can understand what goes wrong in case you stumble across one of the many pitfalls, when setting up oauth2.
+You can [read more about oauth2 elswhere](https://www.oauth.com/oauth2-servers/getting-ready/ "And you most probably should: At least if you are planning to use it in production!")
+
+For authentication, [oauth2](https://tools.ietf.org/html/rfc6749 "OAuth2 is a standardized protocol, that was implemented by several authorities and organizations") redirects the browser of your user to a server of your oauth2-provider.
+This server authenticates the user and redirects the browser back to your server, providing additionally information and ressources, that lets your server know that the user was authenticated successfully and enables it to request more information in the name of the user.
+
+Hence, when configuring oath2 one have to:
+
+1. Provide the URI of the server of your oauth2-provider, the browser will be redirected to for authentication
+1. Tell the server of the oauth2-provider the URL, the browser will be redirected to back after authentication
+1. Also, your app has to provide some identification - a client-ID and -secret - when redirecting to the server of your oauth2-provider, which it has to know
+
+There are a lot more things, which can be configured in oauth2, because the protocol is designed to fit a wide range of use-cases.
+But in our case, it usually boils down to the parameters mentioned above.
+
+Considering our combination of **`spring-security-oauth2`** with **GitHub** this means:
+
+1. The redirect-URIs of well known oauth2-providers like GitHub are build into the library and do not have to be configured explicitly.
+1. The URI, the provider has to redirect the browser back to after authenticating the user, is predefined by the library as well.  
+_But as an additional security measure, almost every oauth2-provider requires you, to also specify this redirect-URI in the configuration on the side of the oauth2-provider._  
+
+   This is a good and necessary protection against fraud, but at the same time the primary source for missconfiguration:
+   **If the specified URI in the configuration of your app and on the server of your oauth2-provider does not match, ALL WILL FAIL!**
+1. The ID and secret of the client (your GitHub-app) always have to be specified explicitly by hand.
+
+Again, everything can be manually overriden, if needed.
+Configuration-keys starting with **`spring.security.oauth2.client.registration.github`** are choosing GitHub as the oauth2-provider and trigger a bunch of predifined default-configuration.
+If you have set up your own oauth2-provider, you have to configure everything manually.
+
+## Running The App Inside Docker
+
+To faciliate the debugging - and because this most probably will be the way you are deploying your app anyway - we will start by building a docker-image from the app
+
+For this, you do not have to change a single character in the example project - _all adjustments to the configuration will be done, when the image is started as a container_.
+Just change to the subdirectory [`logout`](https://github.com/spring-guides/tut-spring-boot-oauth2/tree/master/logout "This is the subdirectory of the GitHub-Porject, that contains that step of the guide") of the checked out project and create the following `Dockerfile` there:
+
+```docker
+FROM openjdk:8-jre-buster
+
+COPY  target/social-logout-0.0.1-SNAPSHOT.jar /opt/app.jar
+EXPOSE 8080
+ENTRYPOINT [ "/usr/local/openjdk-8/bin/java", "-jar", "/opt/app.jar" ]
+CMD []
+
+```
+
+This defines a docker-image, that will run the app.
+
+- The image deduces from **`openjdk:8-jre-buster`**, which is an installation of the latest [OpenJDK-JDK8](https://openjdk.java.net/projects/jdk8/) on a [Debian-Buster](https://www.debian.org/releases/stable/index.de.html "Have a look at the Release notes of that Debian-Version")
+- The app will listen on port **`8080`**
+- By default, a container instanciated from this image will automatically start the Java-app
+- The **`CMD []`** overwrites the default from the parent-image with an empty list - _this enables us to pass command-line parameters to our spring-boot app which we will need to pass in our configuration_
+
+You can build and tag this image with the following commands:
+
+```sh
+mvn clean package
+docker build -t juplo/social-logout:0.0.1 .
+
+```
+
+This will tag your image as **`juplo/social-logout:0.0.1`** \- you obviously will/should use your own tag here, for example: `myfancytag`
+
+_Do not miss out on the flyspeck ( `.`) at the end of the last line!_
+
+You can run this new image with the follwing command - _and you should do that, to test that everything works as expected_:
+
+```sh
+docker run \
+  --rm \
+  -p 8080:8080 \
+  juplo/social-logout:0.0.1 \
+  --spring.security.oauth2.client.registration.github.client-id=YOUR_GITHUB_ID \
+  --spring.security.oauth2.client.registration.github.client-secret=YOUR_GITHUB_SECRET
+
+```
+
+- **`--rm`** removes this test-container automatically, once it is stopped again
+- **`-p 8080:8080`** redirects port `8080` on `localhost` to the app
+
+Everything _after_ the specification of the image (here: `juplo/social-logout:0.0.1`) is handed as a command-line parameter to the started Spring-Boot app - That is, why we needed to declare `CMD []` in our `Dockerfile`
+
+We utilize this here to pass the ID and secret of your GitHub-app into the docker container -- just like when we started the JAR directly
+
+The app should behave exactly the same now lik in the test above, where we started it directly by calling the JAR.
+
+That means, that you should still be able to login into and logout of your app, if you browse to `http://localhost:8080` --
+_At least, if you correctly configured `http://localhost:8080/login/oauth2/code/github` as authorization callback URL in the [settings of your OAuth App](https://github.com/settings/developers "If you have any problems here, you should check your settings: do not proceede, until this works!") on GitHub_.
+
+## Comming Next...
+
+In the [next part](/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/ "Jump to the next part and read on...") of this series, we will hide the app behind a proxy and simulate that the setup is running on our real server **`example.com`**.
diff --git a/content/posts/implementing-narrow-integrationtests-by-combining-mockserver-with-testcontainers.md b/content/posts/implementing-narrow-integrationtests-by-combining-mockserver-with-testcontainers.md
new file mode 100644 (file)
index 0000000..2ac9755
--- /dev/null
@@ -0,0 +1,16 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+classic-editor-remember: classic-editor
+date: "2020-01-11T13:41:39+00:00"
+draft: "true"
+guid: http://juplo.de/?p=1009
+parent_post_id: null
+post_id: "1009"
+title: Implementing Narrow IntegrationTests By Combining MockServer With Testcontainers
+url: /
+
+---
+
diff --git a/content/posts/implementing-the-outbox-pattern-with-kafka-part-0-the-example.md b/content/posts/implementing-the-outbox-pattern-with-kafka-part-0-the-example.md
new file mode 100644 (file)
index 0000000..a614c26
--- /dev/null
@@ -0,0 +1,157 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - demos
+  - explained
+  - java
+  - kafka
+  - spring
+  - spring-boot
+classic-editor-remember: classic-editor
+date: "2021-02-05T17:59:38+00:00"
+guid: http://juplo.de/?p=1201
+parent_post_id: null
+post_id: "1201"
+title: 'Implementing The Outbox-Pattern With Kafka - Part 0: The example'
+url: /implementing-the-outbox-pattern-with-kafka-part-0-the-example/
+
+---
+_This article is part of a Blog-Series_
+
+Based on a [very simple example-project](/implementing-the-outbox-pattern-with-kafka-part-0-the-example/)
+we will implemnt the [Outbox-Pattern](https://microservices.io/patterns/data/transactional-outbox.html) with [Kafka](https://kafka.apache.org/quickstart).
+
+- Part 0: The Example-Project
+- [Part 1: Writing In The Outbox-Table](/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table/ "Jump to the explanation what has to be added, to enqueue messages in an outbox for successfully written transactions")
+
+## TL;DR
+
+In this part, a small example-project is introduced, that features a component, which has to inform another component upon every succsessfully completed operation.
+
+## The Plan
+
+In this mini-series I will implement the [Outbox-Pattern](https://microservices.io/patterns/data/transactional-outbox.html)
+as described on Chris Richardson's fabolous website [microservices.io](https://microservices.io/).
+
+The pattern enables you, to send a message as part of a database transaction in a reliable way, effectively turining the writing of the data
+to the database and the sending of the message into an **[atomic operation](https://en.wikipedia.org/wiki/Atomicity_(database_systems))**:
+either both operations are successful or neither.
+
+The pattern is well known and implementing it with [Kafka](https://kafka.apache.org/quickstart) looks like an easy straight forward job at first glance.
+However, there are many obstacles that easily lead to an incomplete or incorrect implementation.
+In this blog-series, we will circumnavigate these obstacles together step by step.
+
+## The Example Project
+
+To illustrate our implementation, we will use a simple example-project.
+It mimics a part of the registration process for an web application:
+a (very!) simplistic service takes registration orders for new users.
+
+- Successfull registration requests will return a 201 (Created), that carries the URI, under which the data of the newly registered user can be accessed in the `Location`-header:
+
+`echo peter | http :8080/users
+  HTTP/1.1 201
+  Content-Length: 0
+  Date: Fri, 05 Feb 2021 14:44:51 GMT
+  Location: http://localhost:8080/users/peter
+  `
+- Requests to registrate an already existing user will result in a 400 (Bad Request):
+
+`echo peter | http :8080/users
+  HTTP/1.1 400
+  Connection: close
+  Content-Length: 0
+  Date: Fri, 05 Feb 2021 14:44:53 GMT
+  `
+- Successfully registrated users can be listed:
+  `http :8080/users
+  HTTP/1.1 200
+  Content-Type: application/json;charset=UTF-8
+  Date: Fri, 05 Feb 2021 14:53:59 GMT
+  Transfer-Encoding: chunked
+  [
+      {
+          "created": "2021-02-05T10:38:32.301",
+          "loggedIn": false,
+          "username": "peter"
+      },
+      ...
+  ]
+  `
+
+## The Messaging Use-Case
+
+As our messaging use-case imagine, that there has to happen several processes after a successful registration of a new user.
+This may be the generation of an invoice, some business analytics or any other lengthy process that is best carried out asynchronously.
+Hence, we have to generate an event, that informs the responsible services about new registrations.
+
+Obviously, these events should only be generated, if the registration is completed successfully.
+The event must not be fired, if the registration is rejected, because a duplicate username.
+
+On the other hand, the publication of the event must happen reliably, because otherwise, the new might not be charged for the services, we offer...
+
+## The Transaction
+
+The users are stored in a database and the creation of a new user happens in a transaction.
+A "brilliant" colleague came up with the idea, to trigger an `IncorrectResultSizeDataAccessException` to detect duplicate usernames:
+
+`User user = new User(username);
+repository.save(user);
+// Triggers an Exception, if more than one entry is found
+repository.findByUsername(username);
+`
+
+The query for the user by its names triggers an `IncorrectResultSizeDataAccessException`, if more than one entry is found.
+The uncaught exception will mark the transaction for rollback, hence, canceling the requested registration.
+The 400-response is then generated by a corresponding `ExceptionHandler`:
+
+`@ExceptionHandler
+public ResponseEntity incorrectResultSizeDataAccessException(
+    IncorrectResultSizeDataAccessException e)
+{
+  LOG.info("User already exists!");
+  return ResponseEntity.badRequest().build();
+}
+`
+
+Please do not code this at home...
+
+But his weired implementation perfectly illustrates the requirements for our messaging use-case:
+The user is written into the database.
+But the registration is not successfully completed until the transaction is commited.
+If the transaction is rolled back, no message must be send, because no new user was registered.
+
+## Decoupling with Springs EventPublisher
+
+In the example implementation I am using an `EventPublisher` to decouple the business logic from the implementation of the messaging.
+The controller publishes an event, when a new user is registered:
+
+`publisher.publishEvent(new UserEvent(this, usernam));
+`
+
+A listener annotated with `@TransactionalEventListener` receives the events and handles the messaging:
+
+`@TransactionalEventListener
+public void onUserEvent(UserEvent event)
+{
+    // Sending the message happens here...
+}
+`
+
+In non-critical use-cases, it might be sufficient to actually send the message to Kafka right here.
+Spring ensures, that the message of the listener is only called, if the transaction completes successfully.
+But in the case of a failure this naive implementation can loose messages.
+If the application crashes, after the transaction has completed, but before the message could be send, the event would be lost.
+
+In the following blog posts, we will step by step implement a solution based on the Outbox-Pattern, that can guarantee Exactly-Once semantics for the send messages.
+
+## May The Source Be With You!
+
+The complete source code of the example-project can be cloned here:
+
+- `git clone /git/demos/spring/data-jdbc`
+- `git clone https://github.com/juplo/demos-spring-data-jdbc.git`
+
+It includes a [Setup for Docker Compose](https://github.com/juplo/demos-spring-data-jdbc/blob/master/docker-compose.yml), that can be run without compiling
+the project. And a runnable [README.sh](https://github.com/juplo/demos-spring-data-jdbc/blob/master/README.sh), that compiles and run the application and illustrates the example.
diff --git a/content/posts/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table.md b/content/posts/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table.md
new file mode 100644 (file)
index 0000000..5cb1c33
--- /dev/null
@@ -0,0 +1,122 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - demos
+  - explained
+  - java
+  - kafka
+  - spring
+  - spring-boot
+classic-editor-remember: classic-editor
+date: "2021-02-14T18:10:38+00:00"
+guid: http://juplo.de/?p=1209
+parent_post_id: null
+post_id: "1209"
+title: 'Implementing The Outbox-Pattern With Kafka - Part 1: Writing In The Outbox-Table'
+url: /implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table/
+
+---
+_This article is part of a Blog-Series_
+
+Based on a [very simple example-project](/implementing-the-outbox-pattern-with-kafka-part-0-the-example/)
+we will implemnt the [Outbox-Pattern](https://microservices.io/patterns/data/transactional-outbox.html) with [Kafka](https://kafka.apache.org/quickstart).
+
+- [Part 0: The Example-Project](/implementing-the-outbox-pattern-with-kafka-part-0-the-example/ "Jump to the explanation of the example project")
+- Part 1: Writing In The Outbox-Table
+
+## TL;DR
+
+In this part, we will implement the outbox (aka: the queueing of the messages in a database-table).
+
+## The Outbox Table
+
+The outbox is represented by an additionall table in the database.
+This table acts as a queue for messages, that should be send as part of the transaction.
+Instead of sending the messages, the application stores them in the outbox-table.
+The actual sending of the messages occures outside of the transaction.
+
+Because the messages are read from the table outside of the transaction context, only entries related to sucessfully commited transactions are visible.
+Hence, the sending of the message effectively becomes a part of the transaction.
+It happens only, if the transaction was successfully completed.
+Messages associated to an aborted transaction will not be send.
+
+## The Implementation
+
+No special measures need to be taken when writing the messages to the table.
+The only thing to be sure of is that the writing takes part in the transaction.
+
+In our implementation, we simply store the **serialized message**, together with a **key**, that is needed for the partitioning of your data in Kafka, in case the order of the messages is important.
+We also store a timestamp, that we plan to record as [Event Time](https://kafka.apache.org/0110/documentation/streams/core-concepts) later.
+
+One more thing that is worth noting is that we utilize the database to create an unique record-ID.
+The generated **unique and monotonically increasing id** is required later, for the implementation of **Exactly-Once** semantics.
+
+[The SQL for the table](https://github.com/juplo/demos-spring-data-jdbc/blob/part-1/src/main/resources/db/migration/h2/V2__Table_outbox.sql) looks like this:
+
+ `CREATE TABLE outbox (
+  id BIGINT PRIMARY KEY AUTO_INCREMENT,
+  key VARCHAR(127),
+  value varchar(1023),
+  issued timestamp
+);
+`
+
+## Decoupling The Business Logic
+
+In order to decouple the business logic from the implementation of the messaging mechanism, I have implemented a thin layer, that uses [Spring Application Events](https://docs.spring.io/spring-integration/docs/current/reference/html/event.html) to publish the messages.
+
+Messages are send as a [subclass of `ApplicationEvent`](https://github.com/juplo/demos-spring-data-jdbc/blob/part-1/src/main/java/de/juplo/kafka/outbox/OutboxEvent.java):
+
+`publisher.publishEvent(
+  new UserEvent(
+    this,
+    username,
+    CREATED,
+    ZonedDateTime.now(clock)));
+`
+
+The event takes a key ( `username`) and an object as value (an instance of an enum in our case).
+An `EventListener` receives the events and writes them in the outbox table:
+
+`@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
+public void onUserEvent(OutboxEvent event)
+{
+  try
+  {
+    repository.save(
+        event.getKey(),
+        mapper.writeValueAsString(event.getValue()),
+        event.getTime());
+  }
+  catch (JsonProcessingException e)
+  {
+    throw new RuntimeException(e);
+  }
+}
+`
+
+The `@TransactionalEventListener` is not really needed here.
+A normal `EventListener` would also suffice, because spring immediately executes all registered normal event listeners.
+Therefore, the registered listeners would run in the same thread, that published the event, and participate in the existing transaction.
+
+But if a `@TransactionalEventListener` is used, like in our example project, it is crucial, that the phase is switched to `BEFORE_COMMIT` when the Outbox Pattern is introduced.
+This is, because the listener has to be executed in the same transaction context in which the event was published.
+Otherwise, the writing of the messages would not be coupled to the success or abortion of the transaction, thus violating the idea of the pattern.
+
+## May The Source Be With You!
+
+Since this part of the implementation only stores the messages in a normal database, it can be published as an independent component that does not require any dependencies on Kafka.
+To highlight this, the implementation of this step does not use Kafka at all.
+In a later step, we will separate the layer, that decouples the business code from our messaging logic in a separate package.
+
+The complete source code of the example-project can be cloned here:
+
+- `git clone -b part-1 /git/demos/spring/data-jdbc`
+- `git clone -b part-1 https://github.com/juplo/demos-spring-data-jdbc.git`
+
+This version only includes the logic, that is needed to fill the outbox-tabel.
+Reading the messages from this table and sending them through Kafka will be the topic of the next part of this blog-series.
+
+The sources include a [Setup for Docker Compose](https://github.com/juplo/demos-spring-data-jdbc/blob/master/docker-compose.yml), that can be run without compiling
+the project. And a runnable [README.sh](https://github.com/juplo/demos-spring-data-jdbc/blob/master/README.sh), that compiles and run the application and illustrates the example.
diff --git a/content/posts/implementing-the-outbox-pattern-with-kafka-part-sending-messages-from-the-outbox.md b/content/posts/implementing-the-outbox-pattern-with-kafka-part-sending-messages-from-the-outbox.md
new file mode 100644 (file)
index 0000000..79b2c7e
--- /dev/null
@@ -0,0 +1,27 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+classic-editor-remember: classic-editor
+date: "2021-05-16T14:56:45+00:00"
+draft: "true"
+guid: http://juplo.de/?p=1257
+parent_post_id: null
+post_id: "1257"
+title: 'Implementing The Outbox-Pattern With Kafka - Part 2: Sending Messages From The Outbox'
+url: /
+
+---
+_This article is part of a Blog-Series_
+
+Based on a [very simple example-project](/implementing-the-outbox-pattern-with-kafka-part-0-the-example/)
+we will implemnt the [Outbox-Pattern](https://microservices.io/patterns/data/transactional-outbox.html) with [Kafka](https://kafka.apache.org/quickstart).
+
+- [Part 0: The Example-Project](/implementing-the-outbox-pattern-with-kafka-part-0-the-example/ "Jump to the explanation of the example project")
+- [Part 1: Writing In The Outbox-Table](/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table/ "Jump to the explanation what has to be added, to enqueue messages in an outbox for successfully written transactions")
+- Part 2: Sending Messages From The Outbox
+
+## TL;DR
+
+In this part, we will add a first simple version of the logic, that is needed to poll the outbox-table and send the found entries as messages into a Apache Kafka topic.
diff --git a/content/posts/in-need-of-a-mockwebclient-mock-webclient-with-a-short-circuit-exchangefunction.md b/content/posts/in-need-of-a-mockwebclient-mock-webclient-with-a-short-circuit-exchangefunction.md
new file mode 100644 (file)
index 0000000..b537dc1
--- /dev/null
@@ -0,0 +1,16 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+classic-editor-remember: classic-editor
+date: "2020-01-11T13:45:04+00:00"
+draft: "true"
+guid: http://juplo.de/?p=1011
+parent_post_id: null
+post_id: "1011"
+title: In Need Of A MockWebClient? Mock WebClient With A Short-Circuit-ExchangeFunction
+url: /
+
+---
+
diff --git a/content/posts/install-google-play-on-hama.md b/content/posts/install-google-play-on-hama.md
new file mode 100644 (file)
index 0000000..35f3726
--- /dev/null
@@ -0,0 +1,17 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+date: "2014-02-17T01:25:20+00:00"
+draft: "true"
+guid: http://juplo.de/?p=203
+parent_post_id: null
+post_id: "203"
+title: Install Google Play on Hama...
+url: /
+
+---
+[Google Aps](http://goo-inside.me/gapps/gapps-ics-20120317-signed.zip "Download Google Apps for Android 4.0.x (Ice Cream Sandwich)")
+
+You need the Google Apps for Android 4.0.x (called Ice Cream Sandwich internally). These accord to Cyanogenmod 9 and download-links can be found on the [Cyanogenmod's "Google Apps"-page](http://wiki.cyanogenmod.org/w/Google_Apps "Google Apps download-page from cyanogenmod").
diff --git a/content/posts/integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project.md b/content/posts/integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project.md
new file mode 100644 (file)
index 0000000..eacc59c
--- /dev/null
@@ -0,0 +1,125 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - bootstrap
+  - css
+  - grunt
+  - java
+  - less
+  - maven
+  - nodejs
+  - spring
+  - thymeleaf
+date: "2015-08-26T11:57:43+00:00"
+guid: http://juplo.de/?p=509
+parent_post_id: null
+post_id: "509"
+title: Integrating A Maven-Backend- With A Nodjs/Grunt-Fronted-Project
+url: /integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project/
+
+---
+## Frontend-Development With Nodjs and Grunt
+
+As I already wrote in [a previous article](/serve-static-html-with-nodjs-and-grunt/ "Serving Static HTML With Nodjs And Grunt For Template-Development"), frontend-development is mostly done with [Nodjs](https://nodejs.org/ "Read more about nodjs") and [Grunt](http://gruntjs.com/ "Read more about grunt") nowadays.
+As I am planing to base the frontend of my next Spring-Application on [Bootstrap](http://getbootstrap.com/ "Read more about Bootstrap"), I was looking for a way to integrate my backend, which is build using [Spring](http://projects.spring.io/spring-framework/ "Read more about the Springframework") and [Thymeleaf](http://www.thymeleaf.org/ "Read more about Thymeleaf") and managed with Maven, with a frontend, which is based on Bootstrap and, hence, build with Nodjs and Grunt.
+
+## Integrate The Frontend-Build Into The Maven-Build-Process
+
+As I found out, one can integrate a npm-based build into a maven project with the help of the [frontend-maven-plugin](https://github.com/eirslett/frontend-maven-plugin "Read more about the frontend-maven-plugin").
+This plugin automates the managment of Nodjs and its libraries and ensures that the version of Node and NPM being run is the same in every build environment.
+As a backend-developer, you do not have to install any of the frontend-tools manualy.
+Because of that, this plugin is ideal to integrate a separately developed frontend into a maven-build, without bothering the backend-developers with details of the frontend-build-process.
+
+## Seperate The Frontend-Project From The Maven-Based Backend-Project
+
+The drawback with this approach is, that the backend- and the frontend-project are tightly coupled.
+You can configure the frontend-maven-plugin to use a separate subdirectory as working-directory (for example `src/main/frontend`) and utilize this to separate the frontend-project in its own repository (for example by using [the submodule-functions of git](https://git-scm.com/book/en/v2/Git-Tools-Submodules "Read more about how to use git-submodules")).
+But the grunt-tasks, that you call in the frontend-project through the frontend-maven-plugin, must be defined in that project.
+
+Since I am planing to integrate a ‐ slightly modified ‐ version of Bootstrap as frontend into my project, that would mean that I have to mess around with the configuration of the Bootstrap-project a lot.
+But that is not a very good idea, because it hinders upgrades of the Bootstrap-base, because merge-conflicts became more and more likely.
+
+So, I decided to program a special `Gruntfile.js`, that resides in the base-folder of my Maven-project and lets me redefine and call tasks of a separated frontend-project in a subdirectory.
+
+## Redefine And Call Tasks Of An Included Gruntfile From A Sub-Project
+
+As it turned out, there are several npm-plugins for managing and building sub-projects (like [grunt-subgrunt](https://www.npmjs.com/package/grunt-subgrunt "Read more about the npm-plugin grunt-subgrunt") or [grunt-recurse](https://www.npmjs.com/package/grunt-recurse "Read more about the npm-plugin grunt-recurse")) or including existing Gruntfiles from sub-projects (like [grunt-load-gruntfile](https://www.npmjs.com/package/grunt-load-gruntfile "Read more about the npm-plugin grunt-load-gruntfile")), but none of them lets you redefine tasks of the subproject before calling them.
+
+I programmed a simple [Gruntfile](/gitweb/?p=examples/maven-grunt-integration;a=blob_plain;f=Gruntfile.js;hb=2.0.0 "Download the Gruntfile from juplo.de/gitweb"), that lets you do exactly this:
+
+```javascript
+
+module.exports = function(grunt) {
+
+  grunt.loadNpmTasks('grunt-newer');
+
+  grunt.registerTask('frontend','Build HTML & CSS for Frontend', function() {
+    var
+    done = this.async(),
+    path = './src/main/frontend';
+
+    grunt.util.spawn({
+      cmd: 'npm',
+      args: ['install'],
+      opts: { cwd: path, stdio: 'inherit' }
+    }, function (err, result, code) {
+      if (err || code > 0) {
+        grunt.fail.warn('Failed installing node modules in "' + path + '".');
+      }
+      else {
+        grunt.log.ok('Installed node modules in "' + path + '".');
+      }
+
+      process.chdir(path);
+      require(path + '/Gruntfile.js')(grunt);
+      grunt.task.run('newer:copy');
+      grunt.task.run('newer:less');
+      grunt.task.run('newer:svgstore');
+
+      done();
+    });
+  });
+
+  grunt.registerTask('default', [ 'frontend' ]);
+
+};
+
+```
+
+This Gruntfile loads the npm-taks [grunt-newer](https://www.npmjs.com/package/grunt-newer "Read more about the npm-plugin grunt-newer").
+Then, it registers a grunt-task called `frontend`, that loads the dependencies of the specified sub-project, read in its Gruntfile and runs redefined versions of the tasks `copy`, `less` and `svgstore`, which are defined in the sub-project.
+The sub-project itself does not register grunt-newer itself.
+This is done in this parent-project, to demonstrate how to register additional grunt-plugins and redefine tasks of the sub-project without touching it at all.
+
+The separated frontend-project can be used by the frontend-team to develop the temlates, needed by the backend-developers, without any knowledge of the maven-project.
+The frontend-project is then included into the backend, which is managed by maven, and can be used by the backend-developers without the need to know anything about the techniques that were used to develop the templates.
+
+The whole example can be browsed at [juplo.de/gitweb](/gitweb/?p=examples/maven-grunt-integration;a=tree;h=2.0.0 "Browse the example on juplo.de/gitweb") or cloned with:
+
+```bash
+
+git clone /git/examples/maven-grunt-integration
+
+```
+
+Be sure to checkout the tag `2.0.0` for the corresponding version after the cloning, in case i add more commits to demonstrate other stuff.
+Also, you have to init and clone the submodule after checkout:
+
+```bash
+
+git submodule init
+git submodule update
+
+```
+
+If you run `mvn jetty:run`, you will notice, that the frontend-maven-plugin will automatically download Nodejs into a the folder `node` of the parent-project.
+Afterwards, the dependencies of the parent-project are downloaded in the folder `node_modules` of the parent-project and the dpendencies of the sub-project are downloaded in the folder `src/main/frontend/node_modules` and the sub-project is build automatically in the folder `src/main/frontend/dist`, which is included into the directory-tree that is served by the [jetty-maven-plugin](http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html "Read more about the jetty-maven-plugin").
+
+The sub-project is fully usable standalone to drive the development of the frontend separately.
+You can [read more about it in this previous article](/serve-static-html-with-nodjs-and-grunt/ "Read more about the example development-environment").
+
+## Conclusion
+
+In this article, I showed how to integrate a separately developed frontend-project into a backend-project managed by Maven.
+This enables you to separate the development of the layout and the logic of a classic [ROCA](http://roca-style.org/ "Read more about the ROCA principles")-project nearly totally.
diff --git a/content/posts/java-lang-exception-method-xzy-should-have-no-parameters.md b/content/posts/java-lang-exception-method-xzy-should-have-no-parameters.md
new file mode 100644 (file)
index 0000000..492ca7e
--- /dev/null
@@ -0,0 +1,34 @@
+---
+_edit_last: "3"
+author: kai
+categories:
+  - java
+  - jmockit
+  - junit
+  - maven
+date: "2016-10-09T10:29:40+00:00"
+guid: http://juplo.de/?p=535
+parent_post_id: null
+post_id: "535"
+title: 'java.lang.Exception: Method XZY should have no parameters'
+url: /java-lang-exception-method-xzy-should-have-no-parameters/
+
+---
+Did you ever stumbled across the following error during developing test-cases with [JUnit](http://junit.org/ "Visit the homepage of the JUnit-Project") and [JMockit](http://jmockit.org/ "Visit the homepage of the JMockit-Project")?
+
+```bash
+java.lang.Exception: Method XZY should have no parameters
+
+```
+
+Here is the quick and easy fix for it:
+**Fix the ordering of the dependencies in your pom.xml.**
+The dependency for JMockit has to come first!
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/lange-ladezeiten-durch-openx-werbebanner-verhindern.md b/content/posts/lange-ladezeiten-durch-openx-werbebanner-verhindern.md
new file mode 100644 (file)
index 0000000..d6c07fd
--- /dev/null
@@ -0,0 +1,198 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+date: "2012-11-25T18:11:52+00:00"
+draft: "true"
+guid: http://juplo.de/?p=11
+parent_post_id: null
+post_id: "11"
+title: Lange Ladezeiten durch OpenX-Werbebanner verhindern
+url: /
+
+---
+Wer auf seiner Seite Banner mit Hilfe des freien Ad-Servers [OpenX](http://www.openx.com/community "Community-Seite des Ad-Servers OpenX besuchen...") Werbe-Banner einbindet, der kennt wahrscheinlich das Problem: **Die Seite lädt ewig lange und ist (insbesondere wenn JavaScript eingesetzt wird) erst dann wirklich bedienbar, wenn alle Werbebanner geladen sind.**
+
+## Single-Page-Call: Schmerzlinderung - aber keine Heilung
+
+Das Problem ist nicht unbekannt. Es gibt unzählige Anleitungen, wie man die Banner-Auslieferung mit Hilfe der [Single-Page-Call-Technik](http://www.openx.com/docs/tutorials/single+page+call "Single-Page-Call-Tutorial lesen") beschleunigen kann. Single-Page-Call fast die Anfragen, die für die einzelnen Banner an den Ad-Server gestellt werden müssen, in eine Anfrage zusammen und beschleunigt dadurch die Banner-Auslieferung, da unnötige HTTP-Anfragen vermieden werden. Doch das eigentliche Problem wird dadurch nur verringert - nicht behoben:
+
+## Das Laden der JavaScript-Skripte blockiert die Seite
+
+Der Browser muss ein `<scrpt>`-Tag in dem Moment laden und ausführen, in dem er es in dem HTML-Quellcode der Seite vorfindet. Denn es könnte z.B. einen `document.write()`-Aufruf enthalten, der die Seite an Ort und Stelle modifiziert. Verschärft wird dieser Umstand weiter dadruch, dass [der Browser keine anderen Ressourcen laden darf, während er das Skript herunterlädt](http://developer.yahoo.com/performance/rules.html#js_bottom "Yahoo-Tipps/Erklärungen zu JavaScript anzeigen").
+
+Dieser Umstand fällt besonders dann schnell unangenehm auf, wenn OpenX als "Banner" wiederum einen JavaScript-Code eines anderen Ad-Servers (z.B. Google-Ads) ausliefert, so dass sich die Wartezeiten, bis der Browser mit dem Rendern der Seite fortschreiten kann, aufaddieren. _Wenn nur einer der Ad-Server in so einer Kette gerade überlastet ist und langsam reagiert, muss der Browser warten!_
+
+## Die Lösung: JavaScript an das Ende der Seite...
+
+Die Lösung dieses Problems ist altbekannt. Die JavaScript-Tag's werden an das Ende der HTML-Seite verschoben. Möglichst direkt vor das schließende `</body>`-Tag. Ein einfacher Ansatz hierfür wäre, [einfach die Banner möglichst nah an das Seitenende zu schieben und dann via CSS zu platzieren](http://www.openxtips.com/2009/07/tip-20-protect-your-site-from-openx-hangs/ "Blog-Eintrag, der erklärt wie man die Banner-Codes möglichst weit an das Seitenende verschiebt"). Aber dieser Ansatz funktioniert nur mit Bannern vom Typ Superbanner oder Skyscraper. Sobald der Banner im Inhalt stehen soll, wird es schwer (bis unmöglich) dafür via CSS die richtige Menge Platz zu reservieren.
+
+Außerdem wäre es noch schöner, wenn man das Laden der Banner erst dann anstoßen könnte, wenn die Seite vollständig geladen ist (und/oder die eigenen Skripte angestoßen/abgearbeitet wurden), also z.B. über das JavaScript-Event `window.onload`, so daß die Seite bereits voll einsatzfähig ist, bevor die Banner fertig geladen sind.
+
+Das klingt alles einfach und schön - doch wie so oft gilt leider:
+
+## Der Teufel steckt im Detail
+
+```
+/** Optimierte Methoden für die Werbe-Einblendung via OpenX */
+
+/** see: http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/ */
+
+(function( coolibri, $, undefined ) {
+
+  var
+
+  /** Muss angepasst werden, wenn die Zonen in OpenX geändert/erweitert werden! */
+  zones =  {
+    'oa-superbanner' : 15, // Superbanner
+    'oa-skyscraper' : 16,  // Skyscraper
+    'oa-rectangle' : 14,   // Medium Rectangle
+    'oa-content' : 13,     // content quer
+    'oa-marginal' : 18,    // Restplatz marginalspalte
+    'oa-article' : 17,     // Restplatz unter Artikel
+    'oa-prime' : 19,       // Prime Place
+    'oa-gallery': 23       // Medium Rectangle Gallery
+  },
+
+  domain = document.location.protocol == 'https:' ? 'https://openx.coolibri.de:8443':'http://openx.coolibri.de',
+
+  id,
+  node,
+
+  count = 0,
+  slots = {},
+  queue = [],
+  ads = [],
+  output = [];
+
+  coolibri.show_ads = function() {
+
+    var name, src = domain;
+
+    /**
+     * Ohne diese Option, hängt jQuery an jede URL, die es per $.getScript()
+     * geholt wird einen Timestamp an. Dies kann mit bei Skripten von Dritt-
+     * Anbietern zu Problemen führen, wenn diese davon ausgehen, dass die
+     * Aufgerufene URL nicht verändert wird...
+     */
+    $.ajaxSetup({ cache: true });
+
+    src += "/www/delivery/spc.php?zones=";
+
+    /** Nur die Banner holen, die in dieser Seite wirklich benötigt werden */
+    for(name in zones) {
+      $('.oa').each(function() {
+        var
+        node = $(this),
+        id;
+        if (node.hasClass(name)) {
+          id = 'oa_' + ++count;
+          slots[id] = node;
+          queue.push(id);
+          src += escape(id + '=' + zones[name] + "|");
+        }
+      });
+    }
+
+    src += "&nz=1&source=" + escape(OA_source);
+    src += "&r=" + Math.floor(Math.random()*99999999);
+    src += "&block=1&charset=UTF-8";
+
+    if (window.location)   src += "&loc=" + escape(window.location);
+    if (document.referrer) src += "&referer=" + escape(document.referrer);
+
+    $.getScript(src, init_ads);
+
+    src = domain + '/www/delivery/fl.js';
+    $.getScript(src);
+
+  }
+
+  function init_ads() {
+
+    var i, id;
+    for (i=0; i 0) {
+
+      var result, src, inline, i;
+
+      id = ads.shift();
+      node = slots[id];
+
+      node.slideDown();
+
+      // node.append(id + ": " + node.attr('class'));
+
+      /**
+       * Falls zwischenzeitlich Ausgaben über document.write() gemacht wurden,
+       * sollen diese als erstes (also bevor die restlichen von dem OpenX-Server
+       * gelieferten Statements verarbeitet werden) ausgegeben werden.
+       */
+      insert_output();
+
+      while ((result = /<script/i.exec(OA_output[id])) != null) {
+        node.append(OA_output[id].slice(0,result.index));
+        /** OA_output[id] auf den Text ab "]*)>([\s\S]*?)/i.exec(OA_output[id]);
+        if (result == null) {
+          /** Ungültige Syntax in der OpenX-Antwort. Rest der Antwort ignorieren! */
+          // alert(OA_output[id]);
+          OA_output[id] = "";
+        }
+        else {
+          /** Iinline-Code merken, falls vorhanden */
+          src = result[1]
+          inline = result[2];
+          /** OA_output[id] auf den Text nach dem schließenden -Tag kürzen */
+          OA_output[id] = OA_output[id].slice(result[0].length,OA_output[id].length);
+          result = /src\s*=\s*['"]([^'"]*)['"]/i.exec(src);
+          if (result == null) {
+            /** script-Tag mit Inline-Anweisungen: Inline-Anweisungen ausführen! */
+            result = /^\s* 0)
+              /** Der Banner-Code wurde noch nicht vollständig ausgegeben! */
+              ads.unshift(id);
+            /** So - jetzt erst mal das Skript laden und verarbeiten... */
+            $.getScript(result[1], render_ads); // << jQuery.getScript() erzeugt onload-Handler für _alle_ Browser ;)
+            return;
+          }
+        }
+      }
+
+      node.append(OA_output[id]);
+      OA_output[id] = "";
+    }
+
+    /** Alle Einträge aus OA_output wurden gerendert */
+
+    id = undefined;
+    node = undefined;
+
+  }
+
+  /** Mit dieser Funktion werden document.write und document.writeln überschrieben */
+  function document_write() {
+
+    if (id == undefined)
+      return;
+
+    for (var i=0; i 0) {
+      output.push(OA_output[id]);
+      OA_output[id] = "";
+      for (i=0; i<output.length; i++)
+        OA_output[id] += output[i];
+      output = [];
+    }
+
+  }
+
+} ( window.coolibri = window.coolibri || {}, jQuery ));
+
+/** Weil sich der IE sonst ggf. über die nicht definierte Variable lautstark aufregt, wenn irgendetwas schief geht... */
+var OA_output = {};
+
+```
+
+## Weiterlesen...
+
+- [How can we keep Openx from blocking page load](http://stackoverflow.com/questions/3770570/how-can-we-keep-openx-from-blocking-page-load)
+- [Protect your site from OpenX-hangs](http://www.openxtips.com/2009/07/tip-20-protect-your-site-from-openx-hangs/)
+- [Loading scripts without blocking](http://www.stevesouders.com/blog/2009/04/27/loading-scripts-without-blocking/)
diff --git a/content/posts/log-out-from-wrong-account-with-maven-appengine-plugin.md b/content/posts/log-out-from-wrong-account-with-maven-appengine-plugin.md
new file mode 100644 (file)
index 0000000..afdf267
--- /dev/null
@@ -0,0 +1,26 @@
+---
+_edit_last: "2"
+_wp_old_slug: logout-from-wrong-account-with-maven-appengine-plugin
+author: kai
+categories:
+  - appengine
+  - java
+  - maven
+  - oauth2
+date: "2016-01-12T12:50:07+00:00"
+guid: http://juplo.de/?p=97
+parent_post_id: null
+post_id: "97"
+title: Log out from wrong Account with maven-appengine-plugin
+url: /log-out-from-wrong-account-with-maven-appengine-plugin/
+
+---
+Do you work with the [maven-appengine-plugin](https://developers.google.com/appengine/docs/java/tools/maven "Open documentation") and several google-accounts? If you do, or if you ever were logged in to the wrong google-account while executing `mvn appengine:update`, like me yesterday, you surely wondering, **how to logout from maven-appengine-plugin**.
+
+maven-appengine-plugin somehow miracolously stores your credentials for you, when you attemp to upload an app for the first time. This comes in very handy, if you work with just one google-account. But it might get a "pain-in-the-ass", if you work with several accounts. Because, if you once logged in into an account, there is no way (I mean: no goal of the maven-appengine-plugin) to log out, in order to change the account!
+
+## The solution: clear the credentials, that the maven-appengine-plugin stored on your behalf
+
+Only after hard googling, i found a solution to this problem in a [blog-post](http://www.radomirml.com/blog/2009/09/20/delete-cached-google-app-engine-credentials/ "Open the blog-post"): maven-appengine-plugin stores its oauth2-credentials in the file `.appcfg_oauth2_tokens_java` in your home directory (on Linux - sorry Windows-folks, you have to figure out yourself, where the plugin stores the credentials on Windows).
+
+**Just delete the file `.appcfg_oauth2_tokens_java` and your logged out!** The next time you call `mvn appengine:upload` you will be asked again to accept the request and, hence, can switch accounts. _If you are not using oauth2, just look for `.appcfg*`-files in your home directory. I am sure, you will find another file with stored credentials, that you can delet to logout, like Radomir, who [deleted `.appcfg_cookiesy` to log out](http://www.radomirml.com/blog/2009/09/20/delete-cached-google-app-engine-credentials/ "Open Radomir's Blog-Post to read more...")_.
diff --git a/content/posts/logging-request-and-response-data-from-requets-made-through-resttemplate.md b/content/posts/logging-request-and-response-data-from-requets-made-through-resttemplate.md
new file mode 100644 (file)
index 0000000..bc1fd63
--- /dev/null
@@ -0,0 +1,42 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - java
+  - spring
+date: "2015-02-09T10:52:15+00:00"
+guid: http://juplo.de/?p=326
+parent_post_id: null
+post_id: "326"
+title: Logging Request- and Response-Data From Requets Made Through RestTemplate
+url: /logging-request-and-response-data-from-requets-made-through-resttemplate/
+
+---
+Logging request- and response-data for requests made through Spring's `RestTemplate` is quite easy, if you know, what to do.
+But it is rather hard, if you have no clue where to start.
+Hence, I want to give you some hints in this post.
+
+In its default configuration, the `RestTemplate` uses the [HttpClient](https://hc.apache.org/httpcomponents-client-4.4.x/index.html "Visit the project homepage of httpcomponents-client") of the [Apache HttpComponents](https://hc.apache.org/index.html "Visit the project homepage of apache-httpcomonents") package.
+You can verify this and the used version with the mvn-command
+
+```bash
+
+mvn dependency:tree
+
+```
+
+To enable for example logging of the HTTP-Headers send and received, you then simply can add the following to your logging configuration:
+
+```xml
+
+<logger name="org.apache.http.headers">
+  <level value="debug"/>
+</logger>
+
+```
+
+## Possible Pitfalls
+
+If that does not work, you should check, which version of the Apache HttpComponents your project actually is using, because the name of the logger has changed between version `3.x` and `4.x`.
+Another common cause of problems is, that the Apache HttpComponets uses [Apache Commons Logging](http://commons.apache.org/proper/commons-logging/ "Visit the project homepage of commons-logging").
+If the jar for that library is missing, or if your project uses another logging library, the messages might get lost because of that.
diff --git a/content/posts/parsing-json-from-facebooks-graph-api-using-jackson-x-and-java-s-new-time-api.md b/content/posts/parsing-json-from-facebooks-graph-api-using-jackson-x-and-java-s-new-time-api.md
new file mode 100644 (file)
index 0000000..995a419
--- /dev/null
@@ -0,0 +1,34 @@
+---
+_edit_last: "2"
+_oembed_db18ba6b34f5522f0ecb8abddbb529da: '{{unknown}}'
+_oembed_e1a31eec970f0e7dfe4452df3c5b94aa: '{{unknown}}'
+author: kai
+categories:
+  - howto
+date: "2016-06-07T09:40:39+00:00"
+draft: "true"
+guid: http://juplo.de/?p=550
+parent_post_id: null
+post_id: "550"
+tags:
+  - createmedia.nrw
+  - facebook
+  - graph-api
+  - jackson
+  - java
+title: Parsing JSON From Facebooks Graph-API Using Jackson 2.x And Java's New Time-API
+url: /
+
+---
+https://github.com/FasterXML/jackson-datatype-jsr310/issues/17
+
+Auch noch:
+https://en.wikibooks.org/wiki/Java\_Persistence/Identity\_and\_Sequencing#Strange\_behavior.2C\_unique\_constraint\_violation.
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/problems-deploying-a-spring-boot-app-as-war.md b/content/posts/problems-deploying-a-spring-boot-app-as-war.md
new file mode 100644 (file)
index 0000000..b1aa76e
--- /dev/null
@@ -0,0 +1,50 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - explained
+date: "2016-04-08T20:38:35+00:00"
+guid: http://juplo.de/?p=735
+parent_post_id: null
+post_id: "735"
+tags:
+  - createmedia.nrw
+  - debian
+  - java
+  - spring
+  - spring-boot
+title: Problems Deploying A Spring-Boot-App As WAR
+url: /problems-deploying-a-spring-boot-app-as-war/
+
+---
+## Spring-Boot-App Is Not Started, When Deployed As WAR
+
+Recently, I had a lot of trouble, deploying my spring-boot-app as war under Tomcat 8 on Debian Jessie.
+The WAR was found and deployed by tomcat, but it was never started.
+Browsing the URL of the app resulted in a 404.
+And instead of [the fancy Spring-Boot ASCII-art banner](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html "See, what Spring-Boot usually shows, when starting..."), the only matching entry that showed up in my log-file was:
+
+```Bash
+INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Spring WebApplicationInitializers detected on classpath: [org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration$JerseyWebApplicationInitializer@1fe086c]
+
+```
+
+[A blog-post from Stefan Isle](http://stefan-isele.logdown.com/posts/201646 "A short overview of Springs startup-mechanism and what can go wrong") lead me to the solution, what was going wrong.
+In my case, there was no wrong version of Spring on the classpath.
+But my `WebApplicationInitializer` was not found, because I had it compiled with a version of Java, that was not available on my production system.
+
+## `WebApplicationInitializer` Not Found Because Of Wrong Java Version
+
+On my development box, I had compiled and tested the WAR with Java 8.
+But on my production system, running Debian 8 (Jessie), only Java 7 was available.
+And because of that, my `WebApplicationInitializer`
+
+After installing Java 8 from [debian-backports](http://backports.debian.org/Instructions/ "Learn more on debian-backports") on my production system, like described in this [nice debian-upgrade note](https://github.com/OpenTreeOfLife/germinator/wiki/Debian-upgrade-notes:-jessie-and-openjdk-8 "Read, how to install Java 8 from debian-backports"), the `WebApplicationInitializer` of my App was found and everything worked like a charme, again.
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/release-of-a-maven-plugin-to-maven-central-fails-with-error-unknown-tag-goal.md b/content/posts/release-of-a-maven-plugin-to-maven-central-fails-with-error-unknown-tag-goal.md
new file mode 100644 (file)
index 0000000..4170ee8
--- /dev/null
@@ -0,0 +1,90 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - explained
+date: "2016-03-08T00:29:46+00:00"
+guid: http://juplo.de/?p=711
+parent_post_id: null
+post_id: "711"
+tags:
+  - createmedia.nrw
+  - java
+  - maven
+title: 'Release Of A Maven-Plugin to Maven Central Fails With "error: unknown tag: goal"'
+url: /release-of-a-maven-plugin-to-maven-central-fails-with-error-unknown-tag-goal/
+
+---
+## error: unknown tag: goal
+
+Releasing a maven-plugin via Maven Central does not work, if you have switched to Java 8.
+This happens, because hidden in the `oss-parent`, that you have to configure as `parent` of your project to be able to release it via Sonatype, the `maven-javadoc-plugin` is configured for you.
+And the version of `javadoc`, that is shipped with Java 8, by default checks the syntax of the comments and fails, if anything unexpected is seen.
+
+**Unfortunatly, the special javadoc-tag's, like `@goal` or `@phase`, that are needed to configure the maven-plugin, are unexpected for javadoc.**
+
+## Solution 1: Turn Of The Linting Again
+
+As described elswehere, you can easily [turn of the linting](http://blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html "Read, how to turn of the automatic linting of javadoc in Java 8") in the plugins-section of your `pom.xml`:
+
+```xml
+<plugin>
+  <groupId>org.apache.maven.plugins</groupId>
+  <artifactId>maven-javadoc-plugin</artifactId>
+  <version>2.7</version>
+  <configuration>
+    <additionalparam>-Xdoclint:none</additionalparam>
+  </configuration>
+</plugin>
+
+```
+
+## Solution 2: Tell javadoc About The Unknown Tags
+
+Another not so well known approach, that I found in a [fix](https://github.com/julianhyde/hydromatic-resource/commit/da5b2f203402324c68dd2eb2e5ce628f722fefbb "Read the fix with the additional configuration for the unknown tags") for [an issue of some project](https://github.com/julianhyde/hydromatic-resource/issues/1 "See the issue, that lead me to the fix"), is, to add the unknown tag's in the configuration of the `maven-javadoc-plugin`:
+
+```xml
+<plugin>
+  <groupId>org.apache.maven.plugins</groupId>
+  <artifactId>maven-javadoc-plugin</artifactId>
+  <version>2.7</version>
+  <configuration>
+    <tags>
+      <tag>
+        <name>goal</name>
+        <placement>a</placement>
+        <head>Goal:</head>
+      </tag>
+      <tag>
+        <name>phase</name>
+        <placement>a</placement>
+        <head>Phase:</head>
+      </tag>
+      <tag>
+        <name>threadSafe</name>
+        <placement>a</placement>
+        <head>Thread Safe:</head>
+      </tag>
+      <tag>
+        <name>requiresDependencyResolution</name>
+        <placement>a</placement>
+        <head>Requires Dependency Resolution:</head>
+      </tag>
+      <tag>
+        <name>requiresProject</name>
+        <placement>a</placement>
+        <head>Requires Project:</head>
+      </tag>
+    </tags>
+  </configuration>
+</plugin>
+
+```
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/replace-text-by-graphic-without-extra-markup.md b/content/posts/replace-text-by-graphic-without-extra-markup.md
new file mode 100644 (file)
index 0000000..f48d0aa
--- /dev/null
@@ -0,0 +1,47 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - css
+  - html(5)
+date: "2015-05-08T12:05:44+00:00"
+guid: http://juplo.de/?p=339
+parent_post_id: null
+post_id: "339"
+title: Replace text by graphic without extra markup
+url: /replace-text-by-graphic-without-extra-markup/
+
+---
+Here is a little trick for you, to replace text by a graphic through pure CSS without the need to add extra markup:
+
+```java
+
+SELECTOR
+{
+  text-indent: -99em;
+  line-height: 0;
+}
+SELECTOR:after
+{
+  display: block;
+  text-indent: 0;
+  content: REPLACEMENT;
+}
+
+```
+
+`SELECTOR` can be any valid CSS-selector.
+`REPLACEMENT` references the graphic, which should replace the text.
+This can be a SVG-graphic, a vector-graphics from a font, any bitmap graphic or (quiet useless, but a simple case to understand the source like in [the first of my two examples](/wp-uploads/2015/05/replace-1.html "This example replaces the h1-heading with another text")) other text.
+SVG- and bitmap-graphics are simply referred by an url in the `content`-directive, like I have done it with a data-url in [my second example](/wp-uploads/2015/05/replace-2.html "This example replaces the h1-heading with a svg-graphic referenced through a data-url").
+For the case of an icon embedded in a vector you simply put the character-code of the icon in the `content`-directive, like described in [the according ALA-article](http://alistapart.com/article/the-era-of-symbol-fonts "See the alistapart-article to icon fonts").
+
+## Examples
+
+1. [Example 1](/wp-uploads/2015/05/replace-1.html "Replaces the h1-heading with another text")
+1. [Example 2](/wp-uploads/2015/05/replace-2.html "Replaces the h1-heading with a svg-graphic referenced through a data-url")
+
+## What is it good for?
+
+If you need backward compatibility for Internet Explorer 8 and below or Android 2.3 and below, you have to use icon-fonts to support these old browsers.
+I use this often, if I have a brand logo, that should be inserted in a accessible way and do not want to bloat up the html-markup with useless tag's, to achieve this.
diff --git a/content/posts/rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml.md b/content/posts/rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml.md
new file mode 100644 (file)
index 0000000..2b2306f
--- /dev/null
@@ -0,0 +1,66 @@
+---
+_edit_last: "3"
+author: kai
+categories:
+  - android
+  - hacking
+date: "2014-12-26T11:05:39+00:00"
+guid: http://juplo.de/?p=186
+parent_post_id: null
+post_id: "186"
+title: Rooting the hama 00054807 Internet TV Stick with the help of factory_update_param.aml
+url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
+
+---
+## No Play Store - No Fun
+
+Recently, I bought myself the [Hama 00054807 Internet TV Stick](https://de.hama.com/00054807/hama-internet-tv-stick_eng "Visit the product page"). This stick is a low-budget option, to pimp your TV, if it has a HDMI-port, but no built in smart-tv functionality (or a crapy one). You just plug in the stick and connect its dc-port to a USB-port of the TV (or the included adapter) and there you go.
+
+But one big drawback of the `Hama 00054807` is, that there are nearly no usefull apps preinstalled and Google forbidds Hama to install the original [Google Play Store](https://play.google.com/store?hl=en "Visit Google Play") on the device. Hence, you are locked out of any easy access to all the apps, that constitute the usability of android.
+
+Because of that, I decided to [root](http://en.wikipedia.org/wiki/Rooting_%28Android_OS%29 "Learn mor about rooting android devices") my `Hama00054807` as a first step on the way to fully utilize this neat little toy of mine.
+
+I began with opening the device and found the device-ID `B.AML8726.6B 12122`. But there seems to be [no one else, who ever tried it](https://www.google.de/search?q=root+B.AML8726.6B "Google for it"). But as it turned out, it is fairly easy, because stock recovery is not locked and so you can just install everything you want.
+
+## Boot Into Recovery
+
+{{< figure align="left" width=300 src="/wp-uploads/2014/02/hama%5F00054807%5Fstock%5Frecovery-300x199.jpg" alt="stock recovery screenshot" caption="stock recovery screenshot" >}}
+
+I found out, that you can boot into recovery, by pressing the reset-button, while the stick is booting. You can reach the reset-button without the need to open the case through a little hole in the back of the device. Just hold the button pressed, until recovery shows up (see screenshot).
+
+Unfortunatly, the keyboard does not work, while you are in recovery-mode. So at first glance, you can do nothing, expect looking at the nice picture of the android-bot being repaired.
+
+## Installing Updates Without Keyboard-Interaction
+
+But I found out, that you can control stock recovery with the help of a file called `factory_update_param.aml`, which is read from the external sd-card and interpreted by stock recovery on startup. Just create a text-file with the following content (I think it should use [unix stle newlines, aka LF](http://en.wikipedia.org/wiki/Newline#Representations "Learn more about line endings")):
+
+```html
+
+--update_package=/sdcard/update.zip
+
+```
+
+Place this file on the sd-card and name it `factory_update_param.aml`. Now you can place any suitable correctly signed android-update on the sd-card and rename it to `update.zip` and stock recovery will install it upon boot, if you boot into recovery with the sd-card inserted.
+
+If you want to wipe all data as well and factory reset your device, you can extend `factory_update_param.aml` like this:
+
+```html
+
+--update_package=/sdcard/update.zip
+--wipe_data
+--wipe_cache
+--wipe_media
+
+```
+
+But be carefull to remove these extra-lines later, because they are executed _every time_ you boot into recovery with the sd-card inserted! You have been warned :)
+
+## Let's root
+
+So, actually rooting the device is fairly easy now. You just have to download any correclty signed [Superuser](http://androidsu.com/superuser/ "Visit superuser home")-Update. For example this one from the [superuser homepage](http://androidsu.com/superuser/ "Visit superuser home"): [Superuser-3.1.3-arm-signed.zip](http://downloads.noshufou.netdna-cdn.com/superuser/Superuser-3.1.3-arm-signed.zip "Download Superuser-3.1.3-arm-signed.zip"). Then, put it on the sd-card, rename it to `update.zip`, boot into recovery with the sd-card inserted and that's it, you'r root!
+
+If you reboot your device, you should now find the superuser-app among your apps. To verify, that everything went right, you could install any app that requires root-privileges. If the app requests root-privileges, you should see a dialog from the superuser-app, that asks you if the privileges should be granted, or not. For example, you can install a [terminal-app](https://play.google.com/store/apps/details?id=jackpal.androidterm&hl=en "For example this one") and type `su` and hit return to request root-privileges.
+
+## What's next...
+
+So now your device is rooted and you are prepared to install custom updates on it. But still the Google Play Store is missing. I hope I will find some time to accomplish that, too. Stay tuned!
diff --git a/content/posts/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj.md b/content/posts/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj.md
new file mode 100644 (file)
index 0000000..fd5383c
--- /dev/null
@@ -0,0 +1,72 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - java
+  - maven
+date: "2014-07-18T10:36:19+00:00"
+guid: http://juplo.de/?p=306
+parent_post_id: null
+post_id: "306"
+title: Running aspectj-maven-plugin with the current Version 1.8.1 of AspectJ
+url: /running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/
+
+---
+Lately, I stumbled over a syntactically valid class, that [can not be compiled by the aspectj-maven-plugin](/aspectj-maven-plugin-can-not-compile-valid-java-7-0-code/ "Read more about the code, that triggers the AspectJ compilation error"), even so it is a valid Java-7.0 class.
+
+Using the current version ( [Version 1.8.1](http://search.maven.org/#artifactdetails|org.aspectj|aspectjtools|1.8.1|jar "See informations about the current version 1.8.1 of AspectJ on Maven Central")) of [AspectJ](http://www.eclipse.org/aspectj/ "Visit the homepage of the AspectJ-project") solves this issue.
+But unfortunatly, there is no new version of the [aspectj-maven-plugin](http://mojo.codehaus.org/aspectj-maven-plugin/ "Learn more about the aspectj-maven-plugin") available, that uses this new version of AspectJ.
+[The last version of the aspectj-maven-plugin](http://search.maven.org/#artifactdetails|org.codehaus.mojo|aspectj-maven-plugin|1.6|maven-plugin "Read more informations about the latest version of the aspectj-maven-plugin on Maven Central") was released to Maven Central on December the 4th 2013 and this versions is bundeled with the version 1.7.2 of AspectJ.
+
+The simple solution is, to bring the aspectj-maven-plugin to use the current version of AspectJ.
+This can be done, by overwriting its dependency to the bundled aspectj.
+This definition of the plugin does the trick:
+
+```xml
+
+<plugin>
+  <groupId>org.codehaus.mojo</groupId>
+  <artifactId>aspectj-maven-plugin</artifactId>
+  <version>1.6</version>
+  <configuration>
+    <complianceLevel>1.7</complianceLevel>
+    <aspectLibraries>
+      <aspectLibrary>
+        <groupId>org.springframework</groupId>
+        <artifactId>spring-aspects</artifactId>
+      </aspectLibrary>
+    </aspectLibraries>
+  </configuration>
+  <executions>
+    <execution>
+      <goals>
+        <goal>compile</goal>
+      </goals>
+    </execution>
+  </executions>
+  <dependencies>
+    <dependency>
+      <groupId>org.aspectj</groupId>
+      <artifactId>aspectjtools</artifactId>
+      <version>1.8.1</version>
+    </dependency>
+  </dependencies>
+</plugin>
+
+```
+
+The crucial part is the explicit dependency, the rest depends on your project and might have to be adjusted accordingly:
+
+```xml
+
+  <dependencies>
+    <dependency>
+      <groupId>org.aspectj</groupId>
+      <artifactId>aspectjtools</artifactId>
+      <version>1.8.1</version>
+    </dependency>
+  </dependencies>
+
+```
+
+I hope, that helps, folks!
diff --git a/content/posts/select-text-content-of-a-tag-with-thymeleaf-s-markup-selection.md b/content/posts/select-text-content-of-a-tag-with-thymeleaf-s-markup-selection.md
new file mode 100644 (file)
index 0000000..9788a4e
--- /dev/null
@@ -0,0 +1,16 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+classic-editor-remember: classic-editor
+date: "2019-12-28T14:06:47+00:00"
+draft: "true"
+guid: http://juplo.de/?p=1006
+parent_post_id: null
+post_id: "1006"
+title: Select Text-Content Of A Tag With Thymeleaf's Markup Selection
+url: /
+
+---
+
diff --git a/content/posts/serve-static-html-with-nodjs-and-grunt.md b/content/posts/serve-static-html-with-nodjs-and-grunt.md
new file mode 100644 (file)
index 0000000..f7d2c1e
--- /dev/null
@@ -0,0 +1,91 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - css
+  - grunt
+  - html(5)
+  - less
+  - nodejs
+date: "2015-08-25T20:25:28+00:00"
+guid: http://juplo.de/?p=500
+parent_post_id: null
+post_id: "500"
+title: Serving Static HTML With Nodjs And Grunt For Template-Development
+url: /serve-static-html-with-nodjs-and-grunt/
+
+---
+## A Simple Nodejs/Grunt-Development-Environment for static HTML-Templates
+
+Nowadays, [frontend-development](https://en.wikipedia.org/wiki/Front_end_development "Read more about frontend-development") is mostly done with [Nodjs](https://nodejs.org/ "Read more about Nodjs") and [Grunt](http://gruntjs.com/ "Read more about grunt").
+On [npm](https://www.npmjs.com/ "Read more about npm"), there are plenty of useful plugin's, that ease the development of HTML and CSS.
+For example [grunt-contrib-less](https://www.npmjs.com/package/grunt-contrib-less "Read the description of the plugin on npm") to automate the compilation of [LESS](http://lesscss.org/ "Read more about LESS")-sourcecode to CSS, or [grunt-svgstore](https://www.npmjs.com/package/grunt-svgstore "Read the description of the plugin on npm") to pack several SVG-graphics in a single SVG-sprite.
+
+Because of that, I decided to switch to Nodejs and Grunt to develop the HTML- and CSS-Markup for the templates, that I need for my [Spring](http://projects.spring.io/spring-framework/ "Read more about the spring-framework")/ [Thymeleaf](http://www.thymeleaf.org/ "Read more about the XML/XHTML/HTML5 template engine Thymeleaf")-Applications.
+But as with everything new, I had some hard work, to plug together what I needed.
+In this article I want to share, how I have set up a really minimalistic, but powerful development-environment for static HTML-templates, that suites all of my initial needs.
+
+This might not be the best solutions, but it is a good starting point for beginners like me and it is here to be improved through your feedback!
+
+You can browse the example-development-environment on [juplo.de/gitweb](/gitweb/?p=examples/template-development;a=tree;h=1.0.3;hb=1.0.3 "Browse the example development-environment on juplo.de/gitweb"), or clone it with:
+
+```bash
+
+git clone /git/examples/template-development
+
+```
+
+After [installing npm](https://docs.npmjs.com/getting-started/installing-node "Read how to install npm") you have to fetch the dependencies with:
+
+```bash
+
+npm install
+
+```
+
+Than you can fire up a build with:
+
+```bash
+
+grunt
+
+```
+
+...or start a webserver for development with:
+
+```bash
+
+git run-server
+
+```
+
+## Serving The HTML and CSS For Local Development
+
+The hardest part while putting together the development-environment was my need to automatically build the static HTML and CSS after file-changes and serve them via a local webserver.
+[As I wrote in an earlier article](/bypassing-the-same-origin-policiy-for-loal-files-during-development/ "Read the article 'Bypassing the Same-Origin-Policy For Local Files During Development'"), I often stumble over problems, that arise from the [Same-origin policy](https://en.wikipedia.org/wiki/Same-origin_policy "Read more about the Same-Origin Policy on wikipedia") when accessing the files locally through `file:///`-URI's).
+
+I was a bit surprised, that I could not find a simple explanation, how to set up a grunt-task to build the project automatically on file-changes and serve the generated HTML and CSS locally.
+That is the main reason, why I am writing this explanation now, in order to fill that gap ;)
+
+I realised that goal by implemnting a grunt-task, that spawn's a process that uses the [http-server](https://www.npmjs.com/package/http-server "Read the description of the plugin on npm") to serve up the files and combine that task with a common watch-task:
+
+```javascript
+
+grunt.registerTask('http-server', function() {
+
+  grunt.util.spawn({
+    cmd: 'node_modules/http-server/bin/http-server',
+    args: [ 'dist' ],
+    opts: { stdio: 'inherit' }
+  });
+
+});
+
+grunt.registerTask('run-server', [ 'default', 'http-server', 'watch' ]);
+
+```
+
+The rest of the configuration is really pretty self-explaining.
+I just put together the pieces I needed for my template development (copy some static HTML and generate CSS from the LESS-sources) and configured [grunt-contrib-watch](https://www.npmjs.com/package/grunt-contrib-watch "Read the description of the plugin on npm") to rebuild the project automatically, if anything changes.
+
+The result is put under `dist/` and is ready to be included in my Spring/Thymeleaf-Application as it is.
diff --git a/content/posts/show-spring-boot-auto-configuration-report-when-running-via-mvn-spring-boot-run.md b/content/posts/show-spring-boot-auto-configuration-report-when-running-via-mvn-spring-boot-run.md
new file mode 100644 (file)
index 0000000..dbc7edb
--- /dev/null
@@ -0,0 +1,52 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - howto
+date: "2016-06-23T10:49:03+00:00"
+guid: http://juplo.de/?p=754
+parent_post_id: null
+post_id: "754"
+tags:
+  - java
+  - maven
+  - spring
+  - spring-boot
+title: Show Spring-Boot Auto-Configuration-Report When Running Via "mvn spring-boot:run"
+url: /show-spring-boot-auto-configuration-report-when-running-via-mvn-spring-boot-run/
+
+---
+There are a lot of explanations, how to turn on the Auto-Configuration-Report offered by Spring-Boot to debug the configuration of ones app.
+For an good example take a look at this little [Spring boot troubleshooting auto-configuration](http://www.leveluplunch.com/java/tutorials/009-spring-boot-what-autoconfigurations-turned-on/ "This guide shows nearly all options, to turn on the report") guide.
+But most often, when I want to see the Auto-Configuration-Report, I am running my app via `mvn:spring-boot:run`.
+And, unfortunatly, none of the guids you can find by google tells you, how to turn on the Auto-Configuration-Report in this case.
+Hence, I hope I can help out, with this little tip.
+
+## How To Turn On The Auto-Configuration-Report When Running `mvn spring-boot:run`
+
+The report is shown, if the logging for `org.springframework.boot.autoconfigure.logging` is set to `DEBUG`.
+The most simple way to do that, is to add the following line to your `src/main/resources/application.properties`:
+
+```shell
+logging.level.org.springframework.boot.autoconfigure.logging=DEBUG
+
+```
+
+I was not able, to enable the logging via a command-line-switch.
+The seemingly obvious way to add the property to the command line with a `-D` like this:
+
+```shell
+mvn spring-boot:run -Dlogging.level.org.springframework.boot.autoconfigure.logging=DEBUG
+
+```
+
+did not work for me.
+If anyone could point out, how to do that in a comment to this post, I would be realy grateful!
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/posts/subscribe-to-facebook-s-real-time-updates-with-spring-security-oauth.md b/content/posts/subscribe-to-facebook-s-real-time-updates-with-spring-security-oauth.md
new file mode 100644 (file)
index 0000000..e8170c9
--- /dev/null
@@ -0,0 +1,15 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+date: "2014-02-26T23:29:24+00:00"
+draft: "true"
+guid: http://juplo.de/?p=266
+parent_post_id: null
+post_id: "266"
+title: Subscribe to Facebook's Real-Time Updates with Spring Security OAuth
+url: /
+
+---
+`invalid_request", error_description="{message=(#15) This method must be called with an app access_token., type=OAuthException, code=15}`
diff --git a/content/posts/testing-exception-handling-in-spring-mvc.md b/content/posts/testing-exception-handling-in-spring-mvc.md
new file mode 100644 (file)
index 0000000..fcf3c54
--- /dev/null
@@ -0,0 +1,91 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - java
+  - spring
+  - spring-boot
+classic-editor-remember: classic-editor
+date: "2020-10-03T15:00:17+00:00"
+guid: http://juplo.de/?p=1133
+parent_post_id: null
+post_id: "1133"
+title: Testing Exception-Handling in Spring-MVC
+url: /testing-exception-handling-in-spring-mvc/
+
+---
+## Specifying Exception-Handlers for Controllers in Spring MVC
+
+Spring offers the annotation **`@ExceptionHandler`** to handle exceptions thrown by controllers.
+The annotation can be added to methods of a specific controller, or to methods of a **`@Component`**-class, that is itself annotated with **`@ControllerAdvice`**.
+The latter defines global exception-handling, that will be carried out by the `DispaterServlet` for all controllers.
+The former specifies exception-handlers for a single controller-class.
+
+This mechanism is documented in the [Springframework Documentation](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/web.html#mvc-exceptionhandlers) and it is neatly summarized in the blog-article
+[Exception Handling in Spring MVC](https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc).
+**In this article, we will focus on testing the sepcified exception-handlers.**
+
+## Testing Exception-Handlers with the `@WebMvcTest`-Slice
+
+Spring-Boot offers the annotation **`@WebMvcTest`** for tests of the controller-layer of your application.
+For a test annotated with `@WebMvcTest`, Spring-Boot will:
+
+- Auto-configure Spring MVC, Jackson, Gson, Message converters etc.
+- Load relevant components ( `@Controller`, `@RestController`, `@JsonComponent` etc.)
+- Configure `MockMVC`
+
+All other beans configured in the app will be ignored.
+Hence, a `@WebMvcTest` fits perfectly for testing exception-handlers, which are part of the controller-layer.
+It enables us, to mock away the other layers of the application and concentrate on the part, that we want to test.
+
+Consider the following controller, that defines a request-handling and an accompanying exception-handler, for an
+`IllegalArgumentException`, that may by thrown in the business-logic:
+
+`@Controller
+public class ExampleController
+{
+  @Autowired
+  ExampleService service;
+  @RequestMapping("/")
+  public String controller(
+      @RequestParam(required = false) Integer answer,
+      Model model)
+  {
+    Boolean outcome = answer == null ? null : service.checkAnswer(answer);
+    model.addAttribute("answer", answer);
+    model.addAttribute("outcome", outcome);
+   return "view";
+  }
+  @ResponseStatus(HttpStatus.BAD_REQUEST)
+  @ExceptionHandler(IllegalArgumentException.class)
+  public ModelAndView illegalArgumentException(IllegalArgumentException e)
+  {
+    LOG.error("{}: {}", HttpStatus.BAD_REQUEST, e.getMessage());
+    ModelAndView mav = new ModelAndView("400");
+    mav.addObject("exception", e);
+    return mav;
+  }
+}`
+
+The exception-handler resolves the exception as `400: Bad Request` and renders the specialized error-view `400`.
+
+With the help of `@WebMvcTest`, we can easily mock away the actual implementation of the business-logic and concentrate on the code under test:
+our specialized exception-handler.
+
+`@WebMvcTest(ExampleController.class)
+class ExceptionHandlingApplicationTests
+{
+  @MockBean  ExampleService service;
+  @Autowired MockMvc mvc;
+  @Test
+  @Autowired
+  void test400ForExceptionInBusinessLogic() throws Exception {
+    when(service.checkAnswer(anyInt())).thenThrow(new IllegalArgumentException("FOO!"));
+    mvc
+      .perform(get(URI.create("http://FOO/?answer=1234")))
+      .andExpect(status().isBadRequest());
+    verify(service, times(1)).checkAnswer(anyInt());
+  }
+}`
+
+We preform a `GET` with the help of the provided `MockMvc` and check, that the status of the response fullfills our expectations, if we tell our mocked business-logic to throw the `IllegalArgumentException`, that is resolved by our exception-handler.
diff --git a/content/posts/testing-spring-webflux-with-springboottest.md b/content/posts/testing-spring-webflux-with-springboottest.md
new file mode 100644 (file)
index 0000000..bf15cee
--- /dev/null
@@ -0,0 +1,16 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - tips
+classic-editor-remember: classic-editor
+date: "2020-01-14T10:36:23+00:00"
+draft: "true"
+guid: http://juplo.de/?p=1034
+parent_post_id: null
+post_id: "1034"
+title: Testing Spring WebFlux with @SpringBootTest
+url: /
+
+---
+
diff --git a/content/posts/the-outbox-pattern-pro-contra-alternatives.md b/content/posts/the-outbox-pattern-pro-contra-alternatives.md
new file mode 100644 (file)
index 0000000..b8733f8
--- /dev/null
@@ -0,0 +1,35 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - explained
+classic-editor-remember: classic-editor
+date: "2021-02-12T08:57:51+00:00"
+draft: "true"
+guid: http://juplo.de/?p=1225
+parent_post_id: null
+post_id: "1225"
+title: The Outbox-Pattern - Pro / Contra / Alternatives
+url: /
+
+---
+## The Outbox
+
+The outbox is represented by an additionally table in the database, thate takes part in the transaction.
+All messages, that should be send if and only if the transaction is sucessfully completed, are stored in this table.
+The sending of this messages is thus postponed after the transaction is completed.
+
+If the table is read outside of the transaction context, only entries related to sucessfully commited transactions are visible.
+These entries can then be read and queued for sending.
+If the entries are only removed from the outbox-table after a successful transmission has been confirmed by the messaging middleware, no messages can be lost.
+
+## Drawback Of The Outbox-Pattern
+
+The biggest drawback of the Outbox-Pattern is the postponent of all messages, that are send as part of a transaction after the completion of the transaction.
+This changes the order in which the messages are sent.
+
+![Sending Order in the Outbox-Patern](/wp-uploads/2021/02/outbox-pattern-sending-order.png)
+
+Messages B1 and B2 of a transaction B, that started after a transation A will be sent before messages A1 and A2, that belong to transaction A, if transaction B completes before transaction A, even if the recording of messages A1 and A2 happend before the recording of messages B1 and B2.
+This happens, because all messages, that are written in transaction A will only become visible to the processing of the messages, after the completion of the transaction, because the processing of the messaging happens outside of the scope of the transaction.
+Therefore, the commit-order dictates the order, in which messages are sent.
diff --git a/content/posts/unittest-or-integrationtest-a-practical-guide.md b/content/posts/unittest-or-integrationtest-a-practical-guide.md
new file mode 100644 (file)
index 0000000..f062aee
--- /dev/null
@@ -0,0 +1,31 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+classic-editor-remember: classic-editor
+date: "2020-01-14T16:42:01+00:00"
+draft: "true"
+guid: http://juplo.de/?p=1013
+parent_post_id: null
+post_id: "1013"
+title: UnitTest or IntegrationTest? A Practical Guide
+url: /
+
+---
+_Idee:_ Zeigen, dass die Entscheidung nicht akademisch, sondern praktisch getroffen werden sollte / muss
+
+TODO
+
+- Am Beispiel von WebClient mit Mockito zeigen das Mocking schnell zu einem schlechten Unit-Test führt: Getestet werden Implementierungsdetails, wie genau wann die Fluid-API aufgerufen wird! Insbesondere gefährlich, wenn zusätzlich verifiziert wird
+- Außerdem: Häufig wird gar nicht mehr die Implementierung getestet, sondern irgendwelche Toos! Ein Beispiel: Commit-Schlechter-Unit-Tests. Z.B. zu sehen hier: https://stackoverflow.com/a/57196768/247276 und hier: https://www.baeldung.com/spring-mocking-webclient#mockito
+
+- Eigentlich will man: Das ggf. benötigte Verhalten möglichst unscharf aber passen erlauben. Eventuell: Aufrufe die als Seiteneffekte passieren müssen verifizieren
+- Als Konsequenz aus obigem auch:
+  - Wenn Mocking komplexer Klassen benötigt wird besser nicht mit UnitTest anfangen. Dann hätte man nämlich das Problem, das man ggf. noch gar nicht weiß, wie sich die ersetzte Klasse intern verhält.
+  - Besser hier mit einem _Narro_ Integration-Test anfangen. Der hat dann auch den schönen Nebeneffekt, dass man ihn wie den ersten Klienten des neu definierten Kontrakts betrachten kann! Erst wenn so klar geworden ist, wie der Kontrakt genau aussieht und welche einzelnen Methoden-Signaturen und -Kontrakte sich daraus ergeben diese in UnitTests überführen, die wesentlich schneller testbar sind.
+  - **Problem bei dieser Überlegung:** Abgrenzung / Kombination mit TDD!
+  - _Ggf. Antwort:_ Hier wird klar, wann die Unterscheidung zwischen Unit-Tests und Integration-Tests künstlich wird.
+  - Mit einem Unit-Test, der akademisch betrachtet schon ein Narrow Integration-Test ist, sollte sich TDD weiterhin problemlos durchhalten lassen
+- Mit einer Stub/Mock-Kombination ließe sich hier schon mehr ausrichten? Gemeint: Stub für alle aus Test-Sicht unwesenlichen Aufrufe und Unterklassen der Fluid-API des WebClient implementieren und das Verhalten von diesem an der für den Test wichtigen Stelle von außen konfigurierbar — `mockbar` — machen
+- Noch ein Schritt weiter (oder direkt überspringen): WebClient direkt benutzen und nur die Exchange-Function ersetzen: siehe https://dzone.com/articles/unit-tests-for-springs-webclient
diff --git a/content/posts/using-jackson-without-annotations-to-quickly-add-logging-of-object-graphs-as-json.md b/content/posts/using-jackson-without-annotations-to-quickly-add-logging-of-object-graphs-as-json.md
new file mode 100644 (file)
index 0000000..749f2eb
--- /dev/null
@@ -0,0 +1,34 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - jackson
+  - java
+  - tips
+classic-editor-remember: classic-editor
+date: "2020-08-15T17:02:52+00:00"
+guid: http://juplo.de/?p=1130
+parent_post_id: null
+post_id: "1130"
+title: Using Jackson Without Annotations To Quickly Add Logging Of Object-Graphs As JSON
+url: /using-jackson-without-annotations-to-quickly-add-logging-of-object-graphs-as-json/
+
+---
+Normally, you have to add Annotations to your classes, if you want to serialize them with Jackson.
+The following snippet shows, how you can configure Jackson in order to serialize vanilla classes without adding annotations.
+This is usefull, if you want to add logging-statements, that print out graphs of objects in JSON-notation for classes, that are not prepared for serialization.
+
+```sh
+
+ObjectMapper mapper = new ObjectMapper();
+mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
+mapper.enable(SerializationFeature.INDENT_OUTPUT);
+String str = mapper.writeValueAsString(new Bar());
+
+```
+
+I have put together a tiny sample-project, that demonstrates the approach.
+URL for cloning with GIT:
+[/git/demos/noanno/](/git/demos/noanno/)
+
+It can be executed with `mvn spring-boot:run`
diff --git a/content/posts/virtual-networking-with-linux-network-namespaces.md b/content/posts/virtual-networking-with-linux-network-namespaces.md
new file mode 100644 (file)
index 0000000..2f7cb57
--- /dev/null
@@ -0,0 +1,15 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+date: "2019-06-03T19:50:08+00:00"
+draft: "true"
+guid: http://juplo.de/?p=856
+parent_post_id: null
+post_id: "856"
+title: 'Virtual Networking With Linux: Network Namespaces'
+url: /
+
+---
+
diff --git a/content/posts/virtual-networking-with-linux-veth-pairs.md b/content/posts/virtual-networking-with-linux-veth-pairs.md
new file mode 100644 (file)
index 0000000..2265178
--- /dev/null
@@ -0,0 +1,355 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - explained
+date: "2019-06-04T15:19:22+00:00"
+draft: "true"
+guid: http://juplo.de/?p=835
+parent_post_id: null
+post_id: "835"
+title: 'Virtual Networking With Linux: Veth-Pairs'
+url: /
+
+---
+A veth-pair acts as a virtual patch-cable.
+Like a real cable, it always has two ends and data that enters one end is copied to the other.
+Unlike a real cable, each end comes with an attached network interface card (nic).
+To stick with the metaphor: using a veth-pair is like taking a patch-cable with a nic hardwired to each end and installing these nics.
+
+## Typical Usages
+
+- [Connect Two Network Namespaces](#netns2netns)
+- [Connect A Network Namespace To A Bridge](#netns2br)
+- [Connect Two Bridges](#br2br)
+
+### Connect Two Network Namespaces
+
+In this usage scenario, two [network namespaces](/virtual-networking-with-linux-network-namespaces "Network Namespaces Explained") (i.e., two virtual hosts) are connected with a virtual patch cable (the veth-pair).
+One of the two network namespaces may be the default network namespace, but not both (see [Pitfall: Pointless Usage Of Veth-Pairs](#pointless "See Pitfall: Wrong (Or Better: Pointless) Usage Of Veth-Pairs")).
+
+Receipt:
+
+1. Create two network namespaces and connect them with a veth-pair:
+
+   ```bash
+   sudo ip netns add host_1
+   sudo ip netns add host_2
+   sudo ip link add dev if_1 type veth peer name if_2
+   sudo ip link set dev if_1 netns host_1
+   sudo ip link set dev if_2 netns host_2
+
+   ```
+
+1. Configure the network interfaces and bring them up:
+
+   ```bash
+   sudo ip netns exec host_1 ip addr add 192.168.111.1/24 dev if_1
+   sudo ip netns exec host_1 ip link set dev if_1 up
+   sudo ip netns exec host_2 ip addr add 192.168.111.2/24 dev if_2
+   sudo ip netns exec host_2 ip link set dev if_2 up
+
+   ```
+
+1. Check the created configuration (same for `host_2`):
+
+   ```bash
+   sudo ip netns exec host_1 ip -d addr show
+   1: lo:  mtu 65536 qdisc noop state DOWN group default qlen 1
+       link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0
+   904: if_1@if903:  mtu 1500 qdisc noqueue state UP group default qlen 1000
+       link/ether 7e:02:d1:d3:36:7e brd ff:ff:ff:ff:ff:ff link-netnsid 1 promiscuity 0
+       veth
+       inet 192.168.111.1/32 scope global if_1
+          valid_lft forever preferred_lft forever
+       inet6 fe80::7c02:d1ff:fed3:367e/64 scope link
+          valid_lft forever preferred_lft forever
+
+   ```
+
+   ```bash
+   sudo ip netns exec host_1 ip route show
+   192.168.111.0/24 dev if_1  proto kernel  scope link  src 192.168.111.1
+
+   ```
+
+   Note, that all interfaces are numbered and that each end of a veth-pair explicitly states the number of the other end of the pair:
+
+   ```bash
+   sudo ip netns exec host_2 ip addr show
+   1: lo:  mtu 65536 qdisc noop state DOWN group default qlen 1
+       link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+   903: if_2@if904:  mtu 1500 qdisc noqueue state UP group default qlen 1000
+       link/ether 52:f4:5a:be:dc:9b brd ff:ff:ff:ff:ff:ff link-netnsid 0
+       inet 192.168.111.2/24 scope global if_2
+          valid_lft forever preferred_lft forever
+       inet6 fe80::50f4:5aff:febe:dc9b/64 scope link
+          valid_lft forever preferred_lft forever
+
+   ```
+
+   _Here:_ `if_2` with number 903 in the network namespace `host_2` states, that its other end has the number 904 — Compare this with the output for the network namespace `host_1` above!
+
+1. Validate the setup (same for `host_2`):
+
+   ```bash
+   sudo ip netns exec host_1 ping -c2 192.168.111.2
+   PING 192.168.111.2 (192.168.111.2) 56(84) bytes of data.
+   64 bytes from 192.168.111.2: icmp_seq=1 ttl=64 time=0.066 ms
+   64 bytes from 192.168.111.2: icmp_seq=2 ttl=64 time=0.059 ms
+
+   --- 192.168.111.2 ping statistics ---
+   2 packets transmitted, 2 received, 0% packet loss, time 999ms
+   rtt min/avg/max/mdev = 0.059/0.062/0.066/0.008 ms
+
+   ```
+
+   ```bash
+   sudo ip netns exec host_1 ping -c2 192.168.111.2
+   # And at the same time in another terminal:
+   sudo ip netns exec host_1 tcpdump -n -i if_1
+   tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
+   listening on if_1, link-type EN10MB (Ethernet), capture size 262144 bytes
+   ^C16:34:44.894396 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 14277, seq 1, length 64
+   16:34:44.894431 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 14277, seq 1, length 64
+   16:34:45.893385 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 14277, seq 2, length 64
+   16:34:45.893418 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 14277, seq 2, length 64
+
+   4 packets captured
+   4 packets received by filter
+   0 packets dropped by kernel
+
+   ```
+
+### Connect A Network Namespace To A Bridge
+
+In this usage scenario, a [network namespace](/virtual-networking-with-linux-network-namespaces "Network Namespaces Explained") (i.e., a virtual host) is connected to a [bridge](/virtual-networking-with-linux-virtual-bridges "Virtual Bridges Explained") (i.e. a virtual network/switch) with a virtual patch cable (the veth-pair).
+The network namespace may be the default network namespace (i.e., the local host).
+
+Receipt:
+
+1. Create a bridge and a network namespace.
+   Then connect the network namespace to the bridge with a veth-pair
+
+   ```bash
+   sudo ip link add dev switch type bridge
+   sudo ip netns add host_1
+   sudo ip link add dev veth0 type veth peer name link_1
+   sudo ip link set dev veth0 netns host_1
+
+   ```
+
+   You can think of the last step (the three last commands) as plugging the virtual host ( _the network namespace_) into the virtual switch ( _the bridge_) with the help of a patch-cable ( _the veth-pair_).
+
+1. Configure the network interfaces and bring all devices up:
+
+   ```bash
+   sudo ip link set dev switch up
+   sudo ip link set dev link_1 master switch
+   sudo ip link set dev link_1 up
+   sudo ip netns exec host_1 ip addr add 192.168.111.1/24 dev veth0
+   sudo ip netns exec host_1 ip link set dev veth0 up
+
+   ```
+
+_The bridge only needs its own IP, if the network has to be routable (see: [Virtual Bridges](/virtual-networking-with-linux-virtual-bridges "Read more about virtual bridges, if you want to learn why"))_
+
+1. Check the created configuration:
+
+   ```bash
+   sudo ip netns exec host_1 ip -d addr show
+   1: lo:  mtu 65536 qdisc noop state DOWN group default qlen 1
+       link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0
+   947: veth0@if946:  mtu 1500 qdisc noqueue state UP group default qlen 1000
+       link/ether 3e:70:06:77:fa:67 brd ff:ff:ff:ff:ff:ff link-netnsid 0 promiscuity 0
+       veth
+       inet 192.168.111.1/24 scope global veth0
+          valid_lft forever preferred_lft forever
+       inet6 fe80::3c70:6ff:fe77:fa67/64 scope link
+          valid_lft forever preferred_lft forever
+
+   ```
+
+   ```bash
+   sudo ip netns exec host_1 ip route show
+   192.168.111.0/24 dev veth0  proto kernel  scope link  src 192.168.111.1
+
+   ```
+
+1. In order to validate the setup, we need a second address in our virtual network for the `ping`-command.
+   There are three ways to achieve this.
+   _Choose only one!_  
+
+   (There are even more possibilities — for example connecting the bridge to the real network interface of the host —, but these are the most straight forward approaches...)
+
+   - Give the virtual network its own address, so that it becomes routable:
+
+     ```bash
+     sudo ip addr add 192.168.111.254/24 dev switch
+     ping -c2 192.168.111.1
+     sudo ip netns exec host_1 ping -c2 192.168.111.254
+
+     ```
+
+     In this commonly used approach, the kernel sets up all needed routing entries automatically.
+
+   - Add a second virtual host to the network:
+
+     ```bash
+     sudo ip netns add host_2
+     sudo ip link add dev veth0 type veth peer name link_2
+     sudo ip link set dev veth0 netns host_2
+     sudo ip link set dev link_2 master switch
+     sudo ip link set dev link_2 up
+     sudo ip netns exec host_2 ip addr add 192.168.111.2/24 dev veth0
+     sudo ip netns exec host_2 ip link set dev veth0 up
+     sudo ip netns exec host_2 ping -c2 192.168.111.1
+     sudo ip netns exec host_1 ping -c2 192.168.111.2
+
+     ```
+
+     In this approach, the virtual network is kept separated from the host.
+     Only the virtual hosts, that are plugged into the virtual network can reach each other.
+
+   - Connect the local host to the virtual network
+
+     ```bash
+     sudo ip link add dev veth0 type veth peer name link_2
+     sudo ip link set dev link_2 master switch
+     sudo ip link set dev link_2 up
+     sudo ip addr add 192.168.111.2/24 dev veth0
+     sudo ip link set dev veth0 up
+     ping -c2 192.168.111.1
+     sudo ip netns exec host_1 ping -c2 192.168.111.2
+
+     ```
+
+     Strictly speaking, this is a special case of the former approach, where the default network namespace is used instead of a private one.
+
+
+     In general, it is advisable, to use the first approach, if you do need a connection to the local host, because it does not clutter your default network namespace with two more interfaces (here: `veth0` and `link_2`).
+
+### Connect Two Bridges
+
+Receipt:
+
+1. ```bash
+
+   ```
+
+1. ```bash
+
+   ```
+
+1. ```bash
+
+   ```
+
+## Pitfalls
+
+- [Do Not Forget To Specifiy The Prefix-Length For The Addresses](#prefix-length)
+- [Capturing Packages On Virtual Interfaces](#capturing)
+- [Wrong (Or Better: Pointless) Usage Of Veth-Pairs](#pointless)
+
+### Do Not Forget To Specifiy The Prefix-Length For The Addressses
+
+**If you forget to specifiy the prefix-length for one of the addresses, you will not be able to ping the host on the other end of the veth-pair.**
+
+`192.168.111.1/24` specifies the address `192.168.111.1` as part of the subnet with the network-mask `255.255.255.0`. If you forget the prefix, the address will be interpreted as `192.168.111.1/32` and the kernel will not add a network-route. Hence, you will not be able to ping the other end ( `192.168.111.2`), because the kernel would not know, that it is reachable via the interface that belongs to the address `192.168.111.1`.
+
+### Capturing Packages On Virtual Interfaces
+
+If you run `tcpdump` on an interface in the default-namespace, the captured packages show up immediatly.
+I.e.: You can watch the exchange of ICMP-packages live, as it happens.
+But: **If you run `tcpdump` in a named network-namespace, the captured packages will not show up, until you stop the command with `CRTL-C`!**
+
+_Do not ask me why — I just witnessed that odd behaviour on my linux-box and found it noteworthy, because I thought, that my setup was not working several times, before I realised, that I had to kill `tcpdump` to see the captured packages._
+
+### Wrong (Or Better: Pointless) Usage Of Veth-Pairs
+
+This is another reason, why packages might not show up on the virtual interfaces of the configured veth-pair.
+Often, veth-pairs are used as a simple example for virtual networking like in the following snippet:
+
+```bash
+sudo ip link add dev if_1 type veth peer name if_2
+sudo ip addr add 192.168.111.1 dev if_1
+sudo ip link set dev if_1 up
+sudo ip addr add 192.168.111.2 dev if_2
+sudo ip link set dev if_2 up
+
+```
+
+_Note, that additionally, the prefix was not specified with the given addresses ( [compare with above](#prefix-length "Compare with the remarkes considering the prefix length"))!_
+_This works here, because both interfaces are local, so that the kernel does know how to reach them without any routing information._
+
+The setup is then _"validated"_ with a ping from one address to the other:
+
+```bash
+ping -c 3 -I 192.168.111.1 192.168.111.2
+PING 192.168.111.2 (192.168.111.2) from 192.168.111.1 : 56(84) bytes of data.
+64 bytes from 192.168.111.2: icmp_seq=1 ttl=64 time=0.068 ms
+64 bytes from 192.168.111.2: icmp_seq=2 ttl=64 time=0.079 ms
+64 bytes from 192.168.111.2: icmp_seq=3 ttl=64 time=0.105 ms
+
+--- 192.168.111.2 ping statistics ---
+3 packets transmitted, 3 received, 0% packet loss, time 2052ms
+rtt min/avg/max/mdev = 0.068/0.084/0.105/0.015 ms
+
+```
+
+Though it looks like the setup is working as intended, this is not the case:
+_The packets are not routed through the virtual network interfaces `if_1` and `if_2`_
+
+```bash
+sudo tcpdump -i if_1 -n
+tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
+listening on if_1, link-type EN10MB (Ethernet), capture size 262144 bytes
+^C
+0 packets captured
+0 packets received by filter
+0 packets dropped by kernel
+
+```
+
+Instead, they show up on the local interface:
+
+```bash
+sudo tcpdump -i lo -n
+tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
+listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
+12:20:09.899325 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 28048, seq 1, length 64
+12:20:09.899353 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 28048, seq 1, length 64
+12:20:10.909627 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 28048, seq 2, length 64
+12:20:10.909684 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 28048, seq 2, length 64
+12:20:11.933584 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 28048, seq 3, length 64
+12:20:11.933630 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 28048, seq 3, length 64
+^C
+6 packets captured
+12 packets received by filter
+0 packets dropped by kernel
+
+```
+
+This happens, because the kernel adds entries for both interfaces in the local routing table, since both interfaces are connected to the default network namespace of the host:
+
+```bash
+ip route show table local
+broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1
+local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1
+local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1
+broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1
+local 192.168.111.1 dev if_1  proto kernel  scope host  src 192.168.111.1
+local 192.168.111.2 dev if_2  proto kernel  scope host  src 192.168.111.2
+
+```
+
+When routing the packages, the kernel looks up this entries and consequently routes the packages through the `lo`-interface, since both addresses are local addresses.
+
+There is nothing strange or even wrong with this behavior.
+**If there is something wrong in this setup, it is the idea to create two connected virtual local interfaces.**
+That is equally pointless, as installing two nics into one computer and connecting both cards with a cross-over patch cable...
+
+## References
+
+- [Linux Virtual Interfaces](https://gabhijit.github.io/linux-virtual-interfaces.html "Linux Virtual Interfaces")
+- [Guide to IP Layer Network Administration with Linux](http://linux-ip.net/html/routing-tables.html "Guide to IP Layer Network Administration with Linux, Chapter 4. IP Routing, Section 4.8 Routing Tables")
diff --git a/content/posts/virtual-networking-with-linux-virtual-bridges.md b/content/posts/virtual-networking-with-linux-virtual-bridges.md
new file mode 100644 (file)
index 0000000..743fd0d
--- /dev/null
@@ -0,0 +1,15 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - uncategorized
+date: "2019-06-04T09:27:40+00:00"
+draft: "true"
+guid: http://juplo.de/?p=858
+parent_post_id: null
+post_id: "858"
+title: 'Virtual Networking With Linux: Virtual Bridges'
+url: /
+
+---
+
diff --git a/content/posts/xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace.md b/content/posts/xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace.md
new file mode 100644 (file)
index 0000000..97e66e9
--- /dev/null
@@ -0,0 +1,101 @@
+---
+_edit_last: "2"
+author: kai
+categories:
+  - explained
+date: "2018-09-28T08:38:10+00:00"
+guid: http://juplo.de/?p=762
+parent_post_id: null
+post_id: "762"
+title: XPath 2.0 deep-equal Does Not Match Like Expected - The Problem With Whitespace
+url: /xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace/
+
+---
+I just stumbled accros a problem with the `deep-equal()`-method introduced by `XPath 2.0`.
+It costs me two hours at minimum to find out, what was going on.
+So I want to share this with you, in case your are wasting time on the same problem and try to find a solution via google ;)
+
+If you never heard of `deep-equal()` and just wonder how to compare XML-nodes in the right way, you should probably read this [exelent article about equality in XSLT](http://www.xml.com/lpt/a/1589 "Read more about the posibilities to compare nodes in XSLT") as a starter.
+
+## My Problem
+
+My problem was, that I wanted to parse/output a node only, if there exists no node on the `ancestor`-axis, that has a exact duplicate of that node as a direct child.
+
+## The Difference Between A Comparison With `=` And With `deep-equal()`
+
+If you just use simple equality (with `=` or `eq`), the two compared nodes are converted into strings implicitly.
+That is no problem, if you are comparing attributes, or nodes, that only contain text.
+But in all other cases, you will only compare the text-contents of the two nodes and their children.
+Hence, if they differ only in an attribute, your test will report that they are equal, which might not be what you are expecting.
+
+For example, the XPath-expression
+
+```XPath
+//child/ref[ancestor::parent/ref=.]
+```
+
+will match the `<ref>`-node with `@id='bar'`, that is nested insiede the `<child>`-node in this example-XML, what I was not expecting:
+
+```Java
+<root>
+  <parent>
+    <ref id="foo"><content>Same Text-Content</content></ref>
+    <child>
+      <ref id="bar"><content>Same Text-Content</content></ref>
+    </child>
+  <parent>
+<list>
+```
+
+So, what I tried, after I found out about `deep-equal()` was the following `Xpath`-expression, which solves the problem in the above example:
+
+```XPath
+//child/ref[deep-equal(ancestor::parent/ref,.)]
+```
+
+## The Unexpected Behaviour Of `deep-equal()`
+
+But, moving on I stumbled accross cases, where I was expecting a match, but `deep-equal()` does not match the nodes.
+For example:
+
+```Java
+<root>
+  <parent>
+    <ref id="same">
+      <content>Same Text-Content</content>
+    </ref>
+    <child>
+      <ref id="same">
+        <content>Same Text-Content</content>
+      </ref>
+    </child>
+  <parent>
+<list>
+```
+
+You probably catch the diffrenece at first glance, since I laid out the examples accordingly and gave you a hint in the heading of this post - but it really took me a long time to get that:
+
+## It is all about whitespace!
+
+`deep-equal()` compares _all_ child-nodes and only yields a match, if the compared nodes have exactly the same child-nodes.
+But in the second example, the compared `<ref>`-nodes contain whitespace befor and after their child-node `<content>`.
+And these whitespace are in fact implicite child-nodes of type text.
+Hence, the two nodes in the second example differe, because the indentation on the second one has two more spaces.
+
+## The solution...?
+
+Unfortunatly, I do not really know a good solution.
+(If you come up with one, feel free to note or link it in the comments!)
+
+The best solution would be an option additional argument for `deep-equal()`, that can be selected to tell the function to ignore such whitespace.
+In fact, some XSLT-parsers do provide such an argument.
+
+The only other solution, I can think of, is, to write another XSLT-script to remove all the whitespaces between tags to circumvent this at the first glance unexpected behaviour of `deep-equal()`
+
+## Funded by the Europian Union
+
+This article was published in the course of a
+[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
+that is funded by the European Union and the federal state Northrhine-Wetphalia.
+
+[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/content/search.md b/content/search.md
new file mode 100644 (file)
index 0000000..6dea674
--- /dev/null
@@ -0,0 +1,8 @@
+
+---
+title: "Search" # in any language you want
+layout: "search" # necessary for search
+summary: "Search"
+url: "/search/"
+placeholder: "placeholder text in search input box"
+---
diff --git a/data/comments.yaml b/data/comments.yaml
new file mode 100644 (file)
index 0000000..7d4010a
--- /dev/null
@@ -0,0 +1,1303 @@
+- id: "55"
+  author_name: admin
+  author_email: kai@ich-geh-kaputt.de
+  author_url: ""
+  published: null
+  parent_id: "54"
+  content: |-
+    There is a private git-Repository.
+    <a href="http://juplo.de/hibernate4-maven-plugin/source-repository.html" rel="nofollow">Check the project-documentation!</a>
+
+    You can <a href="http://juplo.de/hibernate4-maven-plugin/team-list.html" rel="nofollow">send me</a> a patch or a pull-request to kai@juplo.de
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "50"
+  author_name: Victor
+  author_email: vtatai@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Hey I have modified your code to support envers and generate auditing tables, if you want I can send you a patch. Thanks!
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "51"
+  author_name: admin
+  author_email: kai@ich-geh-kaputt.de
+  author_url: ""
+  published: null
+  parent_id: "50"
+  content: |-
+    Your welcom.
+    Send it!
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "54"
+  author_name: Victor
+  author_email: vtatai@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "51"
+  content: Where to? Is there a github repo?
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "567"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "556"
+  content: |-
+    This plugin is only a tool to automate the generation of the SQL in your development-environment.
+    Questions on how to anotate your code correctly are better asked in a user-forum from hibernate or such.
+
+    Nevertheless, I think I can give you a usefull hint:
+    You are overwriting the automatically generated column-definition with "default TRUE".
+    Try it with
+
+    @Column(name = “financialEnabled”, nullable = false)
+    private boolean financialEnabled;
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "568"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "391"
+  content: Version 1.0.3 of the plugin can now scan for annotations in the dependencies, too.
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "556"
+  author_name: Jukes
+  author_email: hvegat@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    Hi thanks a lot for making this plugin available, great work!!
+    I have a problem generating postgres schema. Looks like the plugin ignores the data type when adding default values and that yields a syntax error from Postgres. Or maybe I'm doing something wrong. I'm using version 1.0.3.
+
+    For example I have in java:
+
+        @Column(name = "financialEnabled", nullable = false, columnDefinition = "default TRUE")
+        private boolean financialEnabled;
+
+    Generated SQL is:
+        financialEnabled default TRUE not null,
+
+    As you can see the data type boolean is not translated to the SQL script. Thanks a lot for your help.
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "391"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "390"
+  content: |-
+    Yes, I am working on the possibility, to scan for annotations in dependencies.
+    Unfortunatly, I have no example-project for this use-case by hand.
+    It would help a lot, if you could provide a sample-project on github or such.
+
+    Greetings kai
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "276"
+  author_name: mike
+  author_email: mjoecohen@gmail.com
+  author_url: http://bidlogix.com
+  published: null
+  parent_id: "0"
+  content: |-
+    Hello,
+
+    I'm upgrading from hibernate3 to to hibernate4 and have moved from the hibernate3-maven-plugin to this version. I haven't undertaken (and don't want to just yet) the big job of changing my hbm mapping files to annotations.
+
+    As far as I can see this is a show stopper for using your nice plugin. Can you please confirm if this is the case and whether you are planning to add support for scanning for hbm files?
+
+    Many thanks,
+
+    Mike Cohen.
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "277"
+  author_name: tortenheber
+  author_email: kai@ich-geh-kaputt.de
+  author_url: ""
+  published: null
+  parent_id: "276"
+  content: |-
+    Hello Mike,
+
+    I added the requested feature in the SNAPSHOT-version.
+    It would be nice, if you could test, if the new feature works, because I have no example project by hand, that still uses hibernate-mapping via XML.
+
+    You can download an actual build here:
+
+    https://oss.sonatype.org/content/repositories/snapshots//de/juplo/hibernate4-maven-plugin/1.0.2-SNAPSHOT/
+
+    or build it by yourself from the sources.
+    The feature is documented here:
+
+    http://juplo.de/hibernate4-maven-plugin-1.0.2-SNAPSHOT/export-mojo.html
+
+
+    Best regards
+
+    kai
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "285"
+  author_name: Pedro
+  author_email: pmmarques@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    Hi,
+
+    I have the following problem.
+    The project that I use to test (and use the plugin) has the annotated classes as a dependency.
+    I am getting the error:
+    No annotated classes found in directory /target/classes
+
+    Shouldn't the plugin scan all the dependencies also?
+
+    Thanks,
+    Pedro.
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "286"
+  author_name: Pedro
+  author_email: pmmarques@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    Following my previous question, here is the debug info
+
+    [DEBUG] Dependency: /Users/pmarques/.m2/repository/org/springframework/security/spring-security-acl/3.1.4.RELEASE/spring-security-acl-3.1.4.RELEASE.jar
+    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/atomikos-util/3.6.5/atomikos-util-3.6.5.jar
+    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-api/3.6.5/transactions-api-3.6.5.jar
+    [DEBUG] Dependency: /Users/pmarques/.m2/repository/javax/transaction/transaction-api/1.1/transaction-api-1.1.jar
+    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jdbc-deprecated/3.6.5/transactions-jdbc-deprecated-3.6.5.jar
+    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jdbc/3.6.5/transactions-jdbc-3.6.5.jar
+    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jta/3.6.5/transactions-jta-3.6.5.jar
+    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions/3.6.5/transactions-3.6.5.jar
+    [DEBUG] Dependency: /Users/pmarques/.m2/repository/org/apache/geronimo/specs/geronimo-jta_1.0.1B_spec/1.0.1/geronimo-jta_1.0.1B_spec-1.0.1.jar
+    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jms-deprecated/3.6.5/transactions-jms-deprecated-3.6.5.jar
+    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jms/3.6.5/transactions-jms-3.6.5.jar
+    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-hibernate3/3.6.5/transactions-hibernate3-3.6.5.jar
+    [INFO] Scanning directory /target/classes for annotated classes...
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "287"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "285"
+  content: |-
+    Hi Pedro,
+
+    I think, that your observation is right.
+    But otherwise, dependencies should only be scanned if requested, because automatic scanning of the dependencies might lead to errors in other situations.
+
+    If you can make your project available to me (for example via github, or simply by mailing zipped version), I would add a configuration-parameter to enable/disable dependency-scanning and upload the refined plugin to central.
+
+    Regards,
+
+    Kai Moritz
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "426"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "287"
+  content: The <a href="/hibernate4-maven-plugin-1-0-3-released/" title="Open the release-notes" rel="nofollow">new version 1.0.3</a> of the plugin adds support for annotated classes in dependencies!
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "390"
+  author_name: Milios
+  author_email: milos.gregor@deutsche-boerse.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: "Hi,\n\nlooks like a very nice plugin. Unfortunately, part of our entities are in other modules/dependencies.\nDo you plan to add the possibility to scan also for dependencies of the project or at least of the plugin?\n\nAlso, when I only want to generate the SQL and use the following configuration, I got nothing.\n\n\nConfig:\n            \n                de.juplo\n                hibernate4-maven-plugin\n                1.0.2\n                \n                    true\n                    SCRIPT\n                    NONE\n                    com.deutscheboerse.hibernate.PostgreSQLDialect\n                    ${project.build.directory}/hibernate4/cmm-schema.sql\n                \n                \n                    \n                        com.deutscheboerse.energy\n                        energy-commons-hibernate\n                        ${commons.hibernate.version}\n                    \n                    \n                        org.springframework.security\n                        spring-security-core\n                        ${spring.security.version}\n                    \n                    \n                        org.slf4j\n                        slf4j-log4j12\n                        ${slf4j.version}\n                    \n                \n            \n\n\nOutput:\nmvn hibernate4:export -e\n[INFO] Error stacktraces are turned on.\n[INFO] Scanning for projects...\n[INFO]\n[INFO] ------------------------------------------------------------------------\n[INFO] Building CMM WAR 1.0.0-RC5-SNAPSHOT\n[INFO] ------------------------------------------------------------------------\n[INFO]\n[INFO] --- hibernate4-maven-plugin:1.0.2:export (default-cli) @ cmm-war ---\n[INFO] Scanning directory D:\\_dev\\work\\ii\\src\\cmm\\trunk\\cmm-war\\target\\classes f\n[INFO] No hibernate-properties-file found! (Checked path: D:\\_dev\\work\\ii\\src\\cm\n[INFO] Gathered hibernate-configuration (turn on debugging for details):\n[INFO]   hibernate.dialect = com.deutscheboerse.hibernate.PostgreSQLDialect\n[INFO] HHH000400: Using dialect: com.deutscheboerse.hibernate.PostgreSQLDialect\n[INFO] ------------------------------------------------------------------------\n[INFO] BUILD SUCCESS\n[INFO] ------------------------------------------------------------------------\n[INFO] Total time: 10.932s\n[INFO] Finished at: Thu Oct 10 12:51:05 UTC 2013\n[INFO] Final Memory: 9M/23M\n[INFO] ------------------------------------------------------------------------\n\n\nThanks for any help,\nMilos."
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "1251"
+  author_name: hdave
+  author_email: david.h.vree@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "568"
+  content: Thats awesome - but you need to update your "Known Pitfalls" page then.
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "2654"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "2653"
+  content: |-
+    Multiple executions should work as expected, since the plugin obeys the standard rules for maven plugins.
+    I also have seen working examples of this kind of configuration...
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "2653"
+  author_name: JRG
+  author_email: jeromerg@gmx.net
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: "Hi, \nThank you for this very useful plugin! Is it possible to define multiple execution-configuration? We need to export two different scripts, on for the \"drop commands\" and one for the \"schema-creation commands\". I tried to configure multiple executions by following <a href=\"http://maven.apache.org/guides/mini/guide-configuring-plugins.html#Using_the_executions_Tag\" title=\"following steps\" rel=\"nofollow\">http://maven.apache.org/guides/mini/guide-configuring-plugins.html#Using_the_executions_Tag</a>, but maven build failed..."
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "1407"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "1251"
+  content: Thanks for the hint, I will update the page...
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "14954"
+  author_name: Tarek
+  author_email: tarekmnabil@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "426"
+  content: |-
+    Hi Kai,
+
+    Unlike Pedro, I do not want my dependencies to be scanned. I tried passing an empty value for the "hibernate.export.scan_dependencies" parameter, but it still used the default value (compile).
+
+    I tried passing something else like "system", the behaviour did not change.
+
+    How can I stop it from scanning my dependencies?
+
+    Thanks,
+    Tarek
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "17030"
+  author_name: Marcel
+  author_email: marcel@frightanic.com
+  author_url: http://frightanic.com
+  published: null
+  parent_id: "0"
+  content: 'If I may ask, what''s the reason you didn''t update the hibernate3-maven-plugin to work with Hibernate4 but rather started from scratch? Reference: https://developer.jboss.org/message/853856 and https://issues.jboss.org/browse/JBIDE-12445'
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "17088"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "17030"
+  content: |-
+    Like always: starting over new was easier than understanding the existing code :/
+    If I remember right, I took a quick view into the code of the hibernate3-maven-plugin and realised, that it can do a lot more, than simply generat the database schema.
+    So, I decided to start over with a slim layer above the tools from hibernate.
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "17092"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "14954"
+  content: Passing <code>-Dhibernate.export.scan_dependencies=none</code> to the call to maven or setting <code>&lt;scanDependencies&gt;none&lt;/scanDependencies&gt; in the configuration of the hibernate4-maven-plugin should do the trick.
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "52865"
+  author_name: Alexey
+  author_email: bostandyksoft@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "52862"
+  content: Hi. Should i set dependecy for the plugin, even class is part of project from dependecies?
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "52866"
+  author_name: Alexey
+  author_email: bostandyksoft@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "52862"
+  content: Many thanks. It works for me.
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "33336"
+  author_name: Ram
+  author_email: rkpunjal@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Hi, Can we facilitate the envers to be generated to a seperate file?
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "40079"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "33336"
+  content: Unfortunatly, that is not possible at the moment...
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "52859"
+  author_name: Alexey
+  author_email: bostandyksoft@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: "Hi. \n\nI tried to use version 1.0.3, but recieve exception \"no annotated classes found in directory\" (on MacOS El Capitan)\n \nI updated version to 1.1.0, but i have used a custom HibernateDialect class, that defined in my project and catch following exception \n\n<code>\nCaused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.tdh.crm.util.JsonPostgreSQLDialect\n        at de.juplo.plugins.hibernate4.ValidationConfiguration.secondPassCompile(ValidationConfiguration.java:46)\n</code>\n I sure, that it is public class with noarg constructor, that extends PostgreSQL9Dialect.\n\nCan you help me?\n\nBest regards."
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "52862"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "52859"
+  content: If this class is not part of your project, you have to define the dependency for the plugin like described <a href="http://juplo.de/hibernate4-maven-plugin/pitfalls.html" title="Jump to the FAQ" rel="nofollow">in the FAQ</a> for driver classes.
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "61651"
+  author_name: Simon
+  author_email: simon.kaufmann@adesso.ch
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    Hi thx for updating the plugin to support hibernate 5. :)
+
+    Is there a way to generate "NOT NULL" constraints in the generated "output file" via existing @NotNull annotations (javax.validation.constraints.NotNull) like in the version before?
+    I don't like to add @column(nullable = false) to every field.
+
+    Thx for your answer :)
+  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
+  post_id: "34"
+- id: "326"
+  author_name: Daniel McCafferty
+  author_email: daniel@danm.cc
+  author_url: http://danm.cc
+  published: null
+  parent_id: "0"
+  content: Hey, is there a mode for this plugin where it can generate update rather than create statements.
+  post_url: /hibernate4-maven-plugin-1-0-2-release/
+  post_id: "75"
+- id: "329"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "326"
+  content: |-
+    Unfortunatly: no.
+
+    The plugin is build around the <a href="http://docs.jboss.org/hibernate/core/4.2/manual/en-US/html/ch21.html#d5e9612" title="Documentaiton of the command-line-switches of SchemaExport" rel="nofollow">SchemaExport-Tool</a>, which does only support drop and create.
+  post_url: /hibernate4-maven-plugin-1-0-2-release/
+  post_id: "75"
+- id: "52833"
+  author_name: Nick Cotter
+  author_email: nick@extropy.net
+  author_url: http://cosmo-opticon.net
+  published: null
+  parent_id: "0"
+  content: Thanks muchly for posting this!
+  post_url: /log-out-from-wrong-account-with-maven-appengine-plugin/
+  post_id: "97"
+- id: "785"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "783"
+  content: |-
+    Hi Augustino,
+
+    thanks a lot for your bug-report, first.
+
+    If you could provide me with a small example-project, that triggers the error, that would ease and therefore speed up the bugfixing.
+    Youd could simply send it as .zip or .tgz to kai@juplo.de, or share it at githupb or something else.
+
+    Kind regards
+
+    Kai Moritz
+  post_url: /hibernate4-maven-plugin-1-0-3-released/
+  post_id: "114"
+- id: "783"
+  author_name: Agustino
+  author_email: agustino_alim@yahoo.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    Hi,
+
+    When using this plugin, this class package-info is ignored. You need to invoke Configuration.addPackage(packageName).
+  post_url: /hibernate4-maven-plugin-1-0-3-released/
+  post_id: "114"
+- id: "1544"
+  author_name: Andreas Kuhtz
+  author_email: andreas.kuhtz@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    Hi Kai,
+    Thank you for this great plugin!
+    When will the next version be released? We ran into an issue that is fixed on trunk (schema file created in non-existing subdirectory).
+    Regards,
+    Andreas
+  post_url: /hibernate4-maven-plugin-1-0-3-released/
+  post_id: "114"
+- id: "1315"
+  author_name: hdave
+  author_email: david.h.vree@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: I've got your plugin in production now and it works great.  Thanks a ton.  One thing however, it pumps out a lot of text during the maven build.  Our team works hard to cut down on the clutter.  Any chance of getting a "quiet" setting or level?
+  post_url: /hibernate4-maven-plugin-1-0-3-released/
+  post_id: "114"
+- id: "1558"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "1544"
+  content: |-
+    Hi Andreas,
+
+    I am working on the next release. Nearly everything is in place to put it online. The only thing missing is the fact, that I planed to add some test-cases to ensure, that the fixes does not break the known use-cases. I hope I will find some time in the next days, to complete this plan...
+
+    Regards,
+    Kai
+  post_url: /hibernate4-maven-plugin-1-0-3-released/
+  post_id: "114"
+- id: "1409"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "1315"
+  content: |-
+    That is a good idea!
+    I will include a switch in the next release...
+    Thanks for the clue.
+  post_url: /hibernate4-maven-plugin-1-0-3-released/
+  post_id: "114"
+- id: "2842"
+  author_name: xjoshyx92
+  author_email: joshua-schneider@freenet.de
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Nice work. But for me it is not working in the recovery it says everything went fine but after reboot nothing changed there is no super user and no root. Also tried to install gapps but the same here. Did you make a wipe bevore or after install or some other special kind of stuff?
+  post_url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
+  post_id: "186"
+- id: "4092"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "2842"
+  content: |-
+    I did not remember to make a wipe.
+    As far as I can say, I wrote down every little step, I have taken.
+    But, I never really used my TV-stick, before I rooted it.
+    So, it might help you, to do a complete wipe and factory reset!
+  post_url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
+  post_id: "186"
+- id: "14982"
+  author_name: Luca Tavecchio
+  author_email: tavecchio.luca@tiscali.it
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Hi, i came here looking for a solution with the same id device (B.AML8726.6B 12122.), mine is a branded in a different way (also the form factor, but that is just plastic) and come with google play store.. anyway i'm curious about the general wifi performance on your device? mine is quite poor yours? it was poor and you were maybe able to fix it in some way??
+  post_url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
+  post_id: "186"
+- id: "17089"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "14982"
+  content: |-
+    I am sorry, but up until now, I did not do a lot more with the stick, than just hack it.
+    I am too busy with other stuff...
+  post_url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
+  post_id: "186"
+- id: "43147"
+  author_name: Hama Internet TV Stick 00054807 19,95 Euro - Android-Hilfe.de
+  author_email: ""
+  author_url: http://www.android-hilfe.de/android-mini-pc-usb-hdmi-sticks-allgemein/674603-hama-internet-tv-stick-00054807-19-95-euro.html#post8838217
+  published: null
+  parent_id: "0"
+  content: '[&#8230;]  [&#8230;]'
+  post_url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
+  post_id: "186"
+- id: "33290"
+  author_name: Richard
+  author_email: rha@onlinehome.de
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    Hello,
+    I tried to update the old android version with android 4.2.1 and 4.2.2 using  c5ea6e959840.update_mysidspr_FH05_to_GA02.zip or  eaef14432ff5.signed-mantaray-JDQ39-from-JOP40D.eaef1443 (1).zip, but had errors like:
+    E: Badbootloader arguments "(null)"
+    ....
+    ....
+    ....
+    E: Signature verification failed
+    Installation aborted.
+
+    What did I make wrong?
+    (Can I also write to this blog in German?)
+
+    xmas-greetings from Ric
+  post_url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
+  post_id: "186"
+- id: "4454"
+  author_name: Eric
+  author_email: eric@hotmail.no
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Thanks for this! Perfect for devs trawling the net for a quick and easy solution to make https work for maven-jetty-plugin 9.x. Used this for 9.1.5.x and worked fine!
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "52409"
+  author_name: Goncalo Bv
+  author_email: goncalo.bv@hotmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Great post! Works as a charm.
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "43011"
+  author_name: Matteo
+  author_email: sgalahad@tiscal.it
+  author_url: https://twitter.com/matteopelucco
+  published: null
+  parent_id: "0"
+  content: |-
+    So useful.. many thanks!
+    Perfectly running with Jetty Maven Plugin 9.2.9.v20150224
+
+    Matteo
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "54943"
+  author_name: Simon
+  author_email: simonwck@yahoo.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: 'Thank you for the very helpful instructions. I am getting close but seeing "Failure: no valid keystore" error for 9.3.3. Any ideas or suggestions?'
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "20731"
+  author_name: romu
+  author_email: romu31@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: life saver , thanks alot
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "47820"
+  author_name: Mark
+  author_email: bigtrashcaninthesky@yahoo.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    <strong>Awesome job! Just download the files, copy three lines and presto, instant SSL without having to bash your head against the wall.
+
+    One question. Why do the files have to be in src/test and not src/main? I actually first put them in src/main and changed the jetty-ssl.xml file to have src/main as the default for the KeyStorePath and TrustStorePath properties.
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "49624"
+  author_name: Jayadev
+  author_email: jayadevpr@gmail.com
+  author_url: http://vedayaj.cm
+  published: null
+  parent_id: "0"
+  content: Awesome Post. Followed the steps and could easily configure the Jetty with SSL. Thanks a lot :)
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "52527"
+  author_name: Felipe
+  author_email: fzuleta@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Hi, this is awesome, I think the article needs updating, on jetty (9.3.5.v20151012) I had to place your jetty-ssl.xml in a jetty-ssl-context.xml  then it worked fine.  cheers and thank you!
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "53352"
+  author_name: Matt Tyson
+  author_email: matthewcarltyson@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Wow.  I can't believe how involved that is now.  Thanks for writing the only clear description on the internet.
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "58361"
+  author_name: java - Cómo usar https / ssl con Maven/Mortbay Jetty Plugin?
+  author_email: ""
+  author_url: https://rstopup.com/como-usar-https-ssl-con-maven-mortbay-jetty-plugin.html
+  published: null
+  parent_id: "0"
+  content: '[&#8230;] Aquí es el único de trabajo, claro el paso a paso que he encontrado para Jetty 9: juplo.de/configure-https-for-jetty-maven-plugin-9-0-x/&#8230; [&#8230;]'
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "55237"
+  author_name: Phil
+  author_email: philmkieti@hotmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Awesome tutorial. Works like magic. Better than the jetty docs.
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "57303"
+  author_name: java - Comment faire pour utiliser https / ssl avec Maven/Mortbay Jetée Plugin?
+  author_email: ""
+  author_url: https://askcodez.com/comment-faire-pour-utiliser-https-ssl-avec-maven-mortbay-jetee-plugin.html
+  published: null
+  parent_id: "0"
+  content: '[&#8230;] Ici est le seul à travailler, clairement, étape par étape, que j&#039;ai trouvé pour Jetty 9: juplo.de/configure-https-for-jetty-maven-plugin-9-0-x/... [&#8230;]'
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "53736"
+  author_name: Richard
+  author_email: ra22597@gmail.com
+  author_url: http://www.researchspace.com
+  published: null
+  parent_id: "0"
+  content: |-
+    Thanks very much ! I just used your 6 files verbatim and it and it all worked fine on Jetty 9.3.12
+    You have saved me endless hours resolving this...
+
+    Btw I have put the xml files and keystone in a a folder /jetty and it all works fine, to keep these config files out of application resource folders
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "53676"
+  author_name: Nikola
+  author_email: nikola.milikic@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Thanks a million! This worked like a charm.
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "62582"
+  author_name: Mike Croteau
+  author_email: croteau.mike@gmail.com
+  author_url: http://www.zeus.social
+  published: null
+  parent_id: "0"
+  content: Do you have a Patreon account? How can I buy you a coffee! This had to have taken a long time to configure. Thank you.
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "62195"
+  author_name: Mike Croteau
+  author_email: croteau.mike@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: "I am getting an invalid certificate on the browser window. What could be causing this? Everything seems to be exact. \n\nThank you by the way! Im excited to have gotten this far thanks to you."
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "57037"
+  author_name: Maurice Wipf
+  author_email: maurice@gmx.de
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    I had rtouble to access the webapp with https.
+
+    I figured out that there are two locahosts:
+
+    https://localhost:8443 and
+    http://localhost:8080.
+
+    The ports are configured in jetty-https.xml and jetty-http.xml.
+  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
+  post_id: "209"
+- id: "46574"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "46568"
+  content: |-
+    Hi Richard,
+
+    thank you for your hint.
+    I will take a look at it.
+    I was not able to find that plugin, when I first stumbled accross the problem.
+    So, it is good, this probably easier alternative is pointed out here.
+  post_url: /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/
+  post_id: "255"
+- id: "41602"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "41591"
+  content: |-
+    Hi Sofian,
+
+    I think, that that would be the effect of my code.
+    Unfortunatly, I cannot test this now, because I turned of the visual HTML-editor in my wordpress-installation, because I do not need it.
+    So, I think you will get what you are looking for.
+    But it would be nice, if you could report back, if my trick worked for you, so that future readers can profit from your work.
+  post_url: /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/
+  post_id: "255"
+- id: "41591"
+  author_name: sofian
+  author_email: sascha50000@gmx.de
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: "Hello, thanks for this post, I am in the same situation, I find WP's HTML Editor behaviour a joke. \n\nNow if I understood correctly, the use of remove_filter('the_content', 'wpautop'); should result in my p-tags to stay when i switch to visual and back, but they dont.\n\nIs this the effect that that code brings to you? Can you normally work now in your HTML Editor with all tags? Are they getting lost if you switch to visual and back?\n\nThank you\nSofian"
+  post_url: /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/
+  post_id: "255"
+- id: "46568"
+  author_name: Richard
+  author_email: Bower39@yahoo.co.uk
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    The Raw HTML plugin offers a "Disable automatic paragraphs" function.
+
+    Works for me to enable the Ordnance Survey OS API, for maps and POI markers.
+  post_url: /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/
+  post_id: "255"
+- id: "56975"
+  author_name: Pihu Gupta
+  author_email: refernloot@gmail.com
+  author_url: https://refernloot.com/
+  published: null
+  parent_id: "0"
+  content: Thanks, Actually I wants to adding a style code with using some multiple Input &amp; Id, Values in the Single Posts. But I just fix this. Thank You So Much Sir.
+  post_url: /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/
+  post_id: "255"
+- id: "61327"
+  author_name: steve
+  author_email: nope@web.de
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: wow, thanks!
+  post_url: /der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen/
+  post_id: "275"
+- id: "4093"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "0"
+  content: |-
+    Thanks to Tim Astle, who pointed out, that the 1.0.4-build was still missing from central.
+
+    I had forgotten, to perform the final step of the process: the release of the staging repository to centra. Sorry, folks.
+  post_url: /hibernate4-maven-plugin-1-0-4-released/
+  post_id: "288"
+- id: "4648"
+  author_name: Running aspectj-maven-plugin with the current Version 1.8.1 of AspectJ | juplo
+  author_email: ""
+  author_url: http://juplo.de/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/
+  published: null
+  parent_id: "0"
+  content: '[&#8230;] I stumbled over a syntactically valid class, that can not be compiled by the aspectj-maven-plugin, even so it is a valid Java-7.0 [&#8230;]'
+  post_url: /aspectj-maven-plugin-can-not-compile-valid-java-7-0-code/
+  post_id: "302"
+- id: "4649"
+  author_name: aspectj-maven-plugin can not compile valid Java-7.0-Code | juplo
+  author_email: ""
+  author_url: http://juplo.de/aspectj-maven-plugin-can-not-compile-valid-java-7-0-code/
+  published: null
+  parent_id: "0"
+  content: '[&#8230;] I found out, how to use the aspectj-maven-plugin with AspectJ 1.8.3. Read [&#8230;]'
+  post_url: /running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/
+  post_id: "306"
+- id: "39525"
+  author_name: yuxh
+  author_email: 28391418@qq.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    I tried appfuse 3.5 which intergrate with version 1.0.5 of hibernate4-maven-plugin. when I run &gt;mvn hibernate4:export -X ,I found:<code>
+    [DEBUG] Setting dialect [org.hibernate.dialect.Oracle10gDialect]
+    [INFO] HHH000227: Running hbm2ddl schema export
+    [DEBUG] Import file not found: /import.sql
+    [DEBUG]
+        drop table app_user cascade constraints
+
+        drop table app_user cascade constraints;
+    [ERROR] HHH000389: Unsuccessful: drop table app_user cascade constraints
+    [ERROR] ORA-00911: invalid character</code>
+    I didnot modify anything,can you help me.thank you
+  post_url: /hibernate4-maven-plugin-1-0-5-released/
+  post_id: "319"
+- id: "43007"
+  author_name: Anna
+  author_email: anna.fuczko.extern@bertelsmann.de
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: "Hi,\nI'm using as dialect a class which is specified in project where we are using your plugin. Since version 1.4 I'm getting\n\nCaused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: <strong>myDialect.MySQLServerDialect</strong>\n        at de.juplo.plugins.hibernate4.ValidationConfiguration.(ValidationConfiguration.java:36)\n        at de.juplo.plugins.hibernate4.Hbm2DdlMojo.execute(Hbm2DdlMojo.java:679)\n\nWith version 1.3 everything works fine. \n\nCould you guys check it please?"
+  post_url: /hibernate4-maven-plugin-1-0-5-released/
+  post_id: "319"
+- id: "30938"
+  author_name: Klaus Unger
+  author_email: klaus.unger@iq-consultancy.net
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    first things first ... thanks for the great plugin!!!
+
+    my colleague and myself have come across some minor issues:
+
+    We do have the following snippets
+
+    <code>
+    @ElementCollection
+    @CollectionTable(name = "T2", joinColumns = @JoinColumn(name = "T1_ID", foreignKey = @ForeignKey(name = "FK_T2_TO_T1")))
+    </code>
+
+    It seems, that the ForeignKey annotation embedded in the CollectionTable has no effect.
+
+    <code>
+    @Table(name = "T1", uniqueConstraints=@UniqueConstraint(name="U_REFERENZ", columnNames="REFERENCE"))
+    </code>
+
+    It also seems, that the uniqueConstraint annotation embedded in the table has no effect.
+
+    Are me missing some configuration part, is it by intention or have me spotted a minor glitch?
+    Thanks for a short reply.
+
+    Again ... thanks for the great plugin
+    cheers
+    Klaus
+  post_url: /hibernate4-maven-plugin-1-0-5-released/
+  post_id: "319"
+- id: "40075"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "39525"
+  content: |-
+    Hi  yuxh,
+
+    this does not look like a bug in the plugin.
+
+    It looks like there is some invalid data in the table, that stops the drop.
+
+    I would drop the table manually and give it a retry...
+  post_url: /hibernate4-maven-plugin-1-0-5-released/
+  post_id: "319"
+- id: "40080"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "30938"
+  content: |-
+    At the first glance, that does not look like a bug in the plugin.
+
+    Under the hood, the plugin is using the official SchemaExport-Tool from Hibernate (see: <a href="https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/toolsetguide.html#toolsetguide-s1-3" title="See the hibernate documentation" rel="nofollow">the offical Toolset-Guide</a>).
+
+    Try running the export manualy with that tool.
+    If the error persists, it is a hibernate-bug and you should ask that guys.
+    If not, please contact me again!
+  post_url: /hibernate4-maven-plugin-1-0-5-released/
+  post_id: "319"
+- id: "44012"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "43007"
+  content: If you can provide me with some example-code, that generates the error, I would look into it.
+  post_url: /hibernate4-maven-plugin-1-0-5-released/
+  post_id: "319"
+- id: "58167"
+  author_name: bijibuji
+  author_email: bijibuji@yahoo.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: What is the exact use case of "Page" &amp; "Main" titles according to a single blog page. Is "Page" the website name or the single blog title? What about "Main"? Also how do you deal with starting the page with an  heading as it is not valid (using W3C validator tells you that you have a missing  in your heading-level outline)
+  post_url: /a-perfect-outline/
+  post_id: "357"
+- id: "61251"
+  author_name: Izhari Ishak Aksa
+  author_email: izharishaksa@gmail.com
+  author_url: http://www.izharishaksa.com
+  published: null
+  parent_id: "0"
+  content: I think main navigation should be right below the page. Furthermore each section could also have their own navigation. For example in a product page there could navigation for specs, reviews, description etc.
+  post_url: /a-perfect-outline/
+  post_id: "357"
+- id: "50844"
+  author_name: Jérôme LELEU
+  author_email: leleuj@gmail.com
+  author_url: http://www.pac4j.org
+  published: null
+  parent_id: "0"
+  content: |-
+    Thanks for the tutorial.
+
+    spring-security-pac4j v1.3 is now based on Spring Security v4.
+  post_url: /configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login/
+  post_id: "462"
+- id: "53056"
+  author_name: Pascal
+  author_email: pnueesch@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    And how can I trigger the facebookEntryPoint with a "Facebook Login"-button on the login form page?
+
+    Thanks
+  post_url: /configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login/
+  post_id: "462"
+- id: "53556"
+  author_name: Zamir
+  author_email: zgarcia83@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    I've followed all instructions, but it doesn't intercept any URL. It doesn't show any error.
+
+    Can anyone help me?
+  post_url: /configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login/
+  post_id: "462"
+- id: "49153"
+  author_name: Integrating A Maven-Backend- With A Nodjs/Grunt-Fronted-Project | juplo
+  author_email: ""
+  author_url: https://juplo.de/integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project/
+  published: null
+  parent_id: "0"
+  content: '[&#8230;] I already wrote in a previous article, frontend-development is mostly done with Nodjs and Grunt nowadays. As I am planing to base the [&#8230;]'
+  post_url: /serve-static-html-with-nodjs-and-grunt/
+  post_id: "500"
+- id: "49119"
+  author_name: Bypassing the Same-Origin-Policy For Local Files During Development | juplo
+  author_email: ""
+  author_url: https://juplo.de/bypassing-the-same-origin-policiy-for-loal-files-during-development/
+  published: null
+  parent_id: "0"
+  content: '[&#8230;] content with a local webserver, so that you can access it through HTTP, like in production. You can read how to extend the example-project mentioned above to achieve that goal in a follow up [&#8230;]'
+  post_url: /serve-static-html-with-nodjs-and-grunt/
+  post_id: "500"
+- id: "52513"
+  author_name: Jifar Mekonnen
+  author_email: jifarh2@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: "I fixed my pom as you said and it worked! \n\nThank you!"
+  post_url: /java-lang-exception-method-xzy-should-have-no-parameters/
+  post_id: "535"
+- id: "53717"
+  author_name: dz
+  author_email: dz@email.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: It works! Thank you!
+  post_url: /java-lang-exception-method-xzy-should-have-no-parameters/
+  post_id: "535"
+- id: "52975"
+  author_name: Benny
+  author_email: bacta@gmx.net
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    I understand your point, if you deliver the app as war file, which will deployed inside a tomcat webapp dir.
+    But what if you want to deliver just a single, runnable jar?
+    And <code>spring.thymeleaf.cache = false</code> did quite a good job while developing. (using spring boot 1.3.2)
+
+    kind regards
+  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
+  post_id: "543"
+- id: "52855"
+  author_name: Jan
+  author_email: jan@will-not-give-it-away.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    Thank you very much!
+    Your advice helped me a lot with Netbeans 8.0.2. :-)
+  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
+  post_id: "543"
+- id: "52980"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "52975"
+  content: |-
+    I am not sure, what you are objecting against.
+    Does it work with spring boot 1.3.2 without moving the templates? Or do you say, that you do not need your templates to be accessible, when you deliver your app?
+  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
+  post_id: "543"
+- id: "53154"
+  author_name: Kai Tønder
+  author_email: kai@getshop.com
+  author_url: http://www.getshop.com
+  published: null
+  parent_id: "0"
+  content: |-
+    Thank you, what I did to solve this issue is to simply set this two lines in the beginning of the main function. (using netbeans too )
+
+               System.setProperty("spring.template.cache", "false");
+               System.setProperty("spring.thymeleaf.cache", "false");
+  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
+  post_id: "543"
+- id: "55310"
+  author_name: Pablo Caviglia
+  author_email: pablo.caviglia@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    excellent!
+    after doing every other way to fix it, your way worked at once... sincerely i dont understand why there are so much invalid ways to do it, and yours that's the simplest one no one mentions it...
+
+    Thanks a lot my friend!
+  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
+  post_id: "543"
+- id: "53789"
+  author_name: Hodglem
+  author_email: cory.hartford.1974@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Thank you! Been banging my head on this for hours.
+  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
+  post_id: "543"
+- id: "60433"
+  author_name: "no"
+  author_email: no@name.com
+  author_url: http://reergymerej.github.io/
+  published: null
+  parent_id: "0"
+  content: December 2019, still works.
+  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
+  post_id: "543"
+- id: "61382"
+  author_name: Konstantin
+  author_email: konstantinProskurnya@ya.ru
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Best solution ever!
+  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
+  post_id: "543"
+- id: "52940"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "52912"
+  content: |-
+    Hi Beppe,
+
+    thanks a lot for your comment.
+
+    I added the missing <code>git</code>.
+
+    The issues you noted in 2 and 3, arise from the fact, that I am messing around with the history of the repository a bit.
+
+    I decided, that it is more important, that each commit contains exactly the changes of the next step and that there are no obfuscating commits that only contain small bug-fixes of earlier commits.
+
+    This way, one can read the diffs and clearly see, what was changed and why.
+
+    On the downside, nasty things may happen, if somebody checks out the project, while I am in the middle of some cleaning up.
+
+    If you clone a fresh copy now, everything should work as expected and as described in the blog-article.
+  post_url: /develop-a-facebook-app-with-spring-social-part-00/
+  post_id: "558"
+- id: "53085"
+  author_name: Maxi Wu
+  author_email: maxi326@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    just started to try SpringSocial a few days ago. Their documents does not match their sample project. And there is so much stuff unrelated to the simplest basic thing which is really needed to connect with facebook.
+    I really like your post which remove unnecessary bits. thank you
+  post_url: /develop-a-facebook-app-with-spring-social-part-00/
+  post_id: "558"
+- id: "52912"
+  author_name: Beppe Serra
+  author_email: beppe.serra@yahoo.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: "Hello, here are the few problems I had and managed to fix.\n1) \"checkout part-00\" is actually \"git checkout part-00\"\n2) \"git checkout part-00\" fails with \"error: pathspec 'part-00' did not match any file(s) known to git.\" \"git tag\" shows that the only available tag is \"part-01\", so I proceeded with that one.\n3) in the mvn ... run command, change:\n-Dfacebook.app.id= and \n-Dfacebook.app.secret=\n to:\n-Dfacebook.client.id= and \n-Dfacebook.client.secret=\nto match the application.properties file contents.\n\nCheers,\n\n- Beppe -"
+  post_url: /develop-a-facebook-app-with-spring-social-part-00/
+  post_id: "558"
+- id: "61730"
+  author_name: Simon
+  author_email: simon.kaufmann@adesso.ch
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    Hey thanks for the update to hibernate 5.
+    We are just migrating from your older version and we have a question:
+    Is there a way to add support for @NotNull annotations (javax.validation.constraints)?
+
+    In the previous version (for hibernate 4) the plugin could handle those @NotNull annotated fields and generated a Not Null constraint.
+    But now with the current version all fields which only had @NotNull will rest nullable in the generated script until you add @Column(nullable = false).
+  post_url: /hibernate-maven-plugin-2-0-0-released/
+  post_id: "721"
+- id: "57054"
+  author_name: yashpal gandhi
+  author_email: yashpal.gandhi@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Plugin doesn't support hibernate-core v5.2.5 and above. Please update.
+  post_url: /xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace/
+  post_id: "762"
+- id: "59920"
+  author_name: Moni
+  author_email: stonebridge8@yahoo.it
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    Zookeeper with SSL works fine for me, but on kafka I get:
+    java.lang.ClassNotFoundException: org.apache.zookeeper.ClientCnxnSocketNetty
+
+    I'm running kafka_2.11-1.0.0, is there particular minimum kafka version to have the ssl support, or is there a way to have an old kafka connect to zookeeper in ssl ( maybe touching the classpath) ?
+  post_url: /encrypt-communication-between-kafka-and-zookeeper-with-tls/
+  post_id: "881"
+- id: "62211"
+  author_name: Peter
+  author_email: vtdang_1@yahoo.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    Hi, I ran your README.sh and after successful installation of certs and all the kafka configs completed, getting this message..
+    "nc: getaddrinfo for host "kafka-1" port 9193: Temporary failure in name resolution
+    Waiting for kafka-1" and nothing else happening.  Am I missing something here?
+    thanks,
+  post_url: /encrypt-communication-between-kafka-and-zookeeper-with-tls/
+  post_id: "881"
+- id: "60168"
+  author_name: Gan
+  author_email: gangadhar.balikai@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: "I am running kafka_2.12-2.3.0 and zookeeper-3.5.5. Configuration are exactly set to what you have described above. \n\nBut broker fails to init Zookeeper connection and fails with \njava.io.IOException: Couldn't instantiate org.apache.zookeeper.ClientCnxnSocketNetty\n        at org.apache.zookeeper.ZooKeeper.getClientCnxnSocket(ZooKeeper.java:1851)\n        at org.apache.zookeeper.ZooKeeper.(ZooKeeper.java:453)\n        at org.apache.zookeeper.ZooKeeper.(ZooKeeper.java:384)\n        at kafka.zookeeper.ZooKeeperClient.(ZooKeeperClient.scala:103)\n        at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1826)\n        at kafka.server.KafkaServer.createZkClient$1(KafkaServer.scala:364)\n        at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:387)\n        at kafka.server.KafkaServer.startup(KafkaServer.scala:207)\n        at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38)\n        at kafka.Kafka$.main(Kafka.scala:84)\n        at kafka.Kafka.main(Kafka.scala)\nCaused by: java.lang.NoSuchMethodException: org.apache.zookeeper.ClientCnxnSocketNetty.()\n        at java.lang.Class.getConstructor0(Class.java:3082)\n        at java.lang.Class.getDeclaredConstructor(Class.java:2178)\n        at org.apache.zookeeper.ZooKeeper.getClientCnxnSocket(ZooKeeper.java:1848)\n        ... 10 more\n\nHave you seen this issue before?"
+  post_url: /encrypt-communication-between-kafka-and-zookeeper-with-tls/
+  post_id: "881"
+- id: "60170"
+  author_name: Kai Moritz
+  author_email: kai@juplo.de
+  author_url: http://juplo.de
+  published: null
+  parent_id: "60168"
+  content: |-
+    No, haven't seen this before.
+    Sorry, that I cannot supply any helping information.
+  post_url: /encrypt-communication-between-kafka-and-zookeeper-with-tls/
+  post_id: "881"
+- id: "62518"
+  author_name: RB
+  author_email: ritesh.biltheria@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    Am getting below fatal error, any idea?
+
+    KeeperErrorCode = NoAuth for /brokers/ids
+  post_url: /encrypt-communication-between-kafka-and-zookeeper-with-tls/
+  post_id: "881"
+- id: "58795"
+  author_name: Encrypt Communication Between Kafka And ZooKeeper With TLS | juplo
+  author_email: ""
+  author_url: https://juplo.de/encrypt-communication-between-kafka-and-zookeeper-with-tls/
+  published: null
+  parent_id: "0"
+  content: '[&#8230;] You can read more about setting up a private CA in this post&#8230; [&#8230;]'
+  post_url: /create-self-signed-multi-domain-san-certificates/
+  post_id: "887"
+- id: "60423"
+  author_name: Cause Chung
+  author_email: cuzfrog@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    when use keytool -genkey
+
+    -keyalg RSA needs to be added
+
+    otherwise a possible cipher suite problem
+  post_url: /create-self-signed-multi-domain-san-certificates/
+  post_id: "887"
+- id: "64232"
+  author_name: Sharofiddin
+  author_email: pardayev.sharofiddin@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Thank you
+  post_url: /actuator-httptrace-does-not-work-with-spring-boot-2-2/
+  post_id: "970"
+- id: "61796"
+  author_name: Amir
+  author_email: amirtc@walla.co.il
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: |-
+    Thank you so much for your article
+    Actuator HTTP Trace Does Not Work With Spring Boot 2.2.x
+    A true life saver!
+  post_url: /actuator-httptrace-does-not-work-with-spring-boot-2-2/
+  post_id: "970"
+- id: "62909"
+  author_name: Vu Chu
+  author_email: anhvutnu@gmail.com
+  author_url: ""
+  published: null
+  parent_id: "0"
+  content: Very nice! Thank you for such informative post. Waiting for your part 3 and 4 of this series.
+  post_url: /how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/
+  post_id: "1037"
diff --git a/data/library.yaml b/data/library.yaml
new file mode 100644 (file)
index 0000000..7fdb213
--- /dev/null
@@ -0,0 +1,104 @@
+- path: /wp-uploads/2014/02/hama_00054807_stock_recovery.jpg
+  title: hama_00054807_stock_recovery
+  id: "193"
+  published: 2014-02-16T11:55:44Z
+- path: /wp-uploads/2014/02/jetty.keystore
+  title: jetty.keystore
+  id: "224"
+  published: 2014-02-23T10:34:53Z
+- path: /wp-uploads/2014/02/jetty.xml
+  title: jetty.xml
+  id: "225"
+  published: 2014-02-23T10:35:40Z
+- path: /wp-uploads/2014/02/jetty-http.xml
+  title: jetty-http.xml
+  id: "226"
+  published: 2014-02-23T10:35:40Z
+- path: /wp-uploads/2014/02/jetty-https.xml
+  title: jetty-https.xml
+  id: "227"
+  published: 2014-02-23T10:35:41Z
+- path: /wp-uploads/2014/02/jetty-ssl.xml
+  title: jetty-ssl.xml
+  id: "228"
+  published: 2014-02-23T10:35:41Z
+- path: /wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png
+  title: der-nutzer-ist-nicht-dazu-berechtigt
+  id: "276"
+  published: 2014-03-16T14:17:47Z
+- path: /wp-uploads/2015/05/replace-1.html
+  title: replace-1
+  id: "342"
+  published: 2015-05-08T12:06:56Z
+- path: /wp-uploads/2015/05/replace-2.html
+  title: replace-2
+  id: "343"
+  published: 2015-05-08T12:06:58Z
+- path: /wp-uploads/2015/06/example-06.html
+  title: example-06
+  id: "421"
+  published: 2015-06-23T18:33:56Z
+- path: /wp-uploads/2015/06/example-07.html
+  title: example-07
+  id: "422"
+  published: 2015-06-23T18:33:57Z
+- path: /wp-uploads/2015/06/example-08.html
+  title: example-08
+  id: "423"
+  published: 2015-06-23T18:33:57Z
+- path: /wp-uploads/2015/06/example-09.html
+  title: example-09
+  id: "430"
+  published: 2015-06-23T19:46:25Z
+- path: /wp-uploads/2015/06/example-01.html
+  title: example-01
+  id: "433"
+  published: 2015-06-23T20:18:20Z
+- path: /wp-uploads/2015/06/example-02.html
+  title: example-02
+  id: "434"
+  published: 2015-06-23T20:18:21Z
+- path: /wp-uploads/2015/06/example-03.html
+  title: example-03
+  id: "435"
+  published: 2015-06-23T20:18:21Z
+- path: /wp-uploads/2015/06/example-10.html
+  title: example-10
+  id: "440"
+  published: 2015-06-23T20:49:51Z
+- path: /wp-uploads/2015/06/example-04.html
+  title: example-04
+  id: "442"
+  published: 2015-06-23T20:58:53Z
+- path: /wp-uploads/2015/06/example-05.html
+  title: example-05
+  id: "444"
+  published: 2015-06-23T21:03:29Z
+- path: /wp-uploads/2015/06/example-11.html
+  title: example-11
+  id: "450"
+  published: 2015-06-23T21:23:01Z
+- path: /wp-uploads/2015/06/example-12.html
+  title: example-12
+  id: "454"
+  published: 2015-06-23T22:18:14Z
+- path: /wp-uploads/2015/06/example-13.html
+  title: example-13
+  id: "455"
+  published: 2015-06-23T22:18:14Z
+- path: /wp-uploads/2015/06/example-14.html
+  title: example-14
+  id: "458"
+  published: 2015-06-23T22:40:54Z
+- path: /wp-uploads/2020/03/real-life-meme.png
+  title: real-life-meme
+  id: "1038"
+  published: 2020-03-04T17:42:05Z
+- path: /wp-uploads/2020/03/github-example.jpg
+  title: github-example
+  id: "1105"
+  published: 2020-03-07T13:20:41Z
+- path: /wp-uploads/2021/02/outbox-pattern-sending-order.png
+  title: outbox-pattern--sending-order
+  id: "1212"
+  published: 2021-02-06T17:52:39Z
diff --git a/generated-2025-11-21-17-29-08/.gitignore b/generated-2025-11-21-17-29-08/.gitignore
deleted file mode 100644 (file)
index 8373a39..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-/.hugo_build.lock
-/public/
-/resources/
diff --git a/generated-2025-11-21-17-29-08/archetypes/default.md b/generated-2025-11-21-17-29-08/archetypes/default.md
deleted file mode 100644 (file)
index 0d5eebd..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
----
-date: '{{ .Date }}'
-draft: true
-title: '{{ replace .File.ContentBaseName "-" " " | title }}'
----
diff --git a/generated-2025-11-21-17-29-08/content/archives.md b/generated-2025-11-21-17-29-08/content/archives.md
deleted file mode 100644 (file)
index aaadc43..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-
----
-title: "All"
-layout: "archives"
-url: "/all/"
-summary: archives
----
diff --git a/generated-2025-11-21-17-29-08/content/pages/blog/index.md b/generated-2025-11-21-17-29-08/content/pages/blog/index.md
deleted file mode 100644 (file)
index 03e3e39..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
----
-_edit_last: "3"
-author: tortenheber
-date: "2013-10-10T20:43:16+00:00"
-guid: http://juplo.de/?page_id=108
-parent_post_id: null
-post_id: "108"
-title: Blog
-url: /blog/
-
----
-
diff --git a/generated-2025-11-21-17-29-08/content/pages/front/index.md b/generated-2025-11-21-17-29-08/content/pages/front/index.md
deleted file mode 100644 (file)
index 4c3bd53..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
----
-_edit_last: "3"
-author: tortenheber
-date: "2014-03-11T17:38:46+00:00"
-guid: http://juplo.de/?page_id=271
-parent_post_id: null
-post_id: "271"
-title: FRONT
-url: /
-
----
-## Funded by the Europian Union
-
-As partner of the company
-[yourSHOUTER UG (haftungsbeschränkt)](http://yourshouter.com "Visit the Homepage of the company")
-we publish results of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Westphalia.
-
-[![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
-
-## About juplo
-
-- [More about juplo](/about.html "Visit my about-pag")
-- [Blog](/blog/ "(Hopefully) helpful stuff")
-- [Projects](/projects/ "All current projects")
-- [Contact](/contact.html "All contact-information on a glance")
-
-## Work In Progress...
-
-Due to lack of time, this page is still under construction.
-
-![Man bashing his head on a computer-keyboard](/img/wip.gif)
-
-So, please be a litle more patiance with us...
-
-
-
-## hibernate-maven-plugin
-
-**A simple Plugin for generating a Database-Schema from Hibernate Mapping-Annotations**
-
-hibernate4-maven-plugin is a plugin for generating a database-schema from your Hibernate-Mappings and create or update your database accordingly. Its main usage is to automatically create and populate a test-database for unit-tests in cooperation with the dbunit-maven-plugin.
-
-[Learn more](/hibernate-maven-plugin/ "Visit the plugin-documentation")
diff --git a/generated-2025-11-21-17-29-08/content/pages/projects/index.md b/generated-2025-11-21-17-29-08/content/pages/projects/index.md
deleted file mode 100644 (file)
index 137b4e4..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
----
-_edit_last: "3"
-author: tortenheber
-date: "2014-03-11T17:54:09+00:00"
-guid: http://juplo.de/?page_id=111
-parent_post_id: null
-post_id: "111"
-title: Projects
-url: /projects/
-
----
-![Comming soon...](/img/comming-soon.png)
-
-**Lorem ipsum** dolor [sit amet](/projects/typo.html), consectetur adipisicing elit, sed do
-eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
-ad minim veniam, quis nostrud [exercitation](/projects/html-experimente.html) ullamco laboris nisi ut
-aliquip ex ea commodo consequat. Duis aute irure dolor in
-reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
-pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
-culpa qui officia deserunt mollit anim id est laborum.
-
-## Duis aute irure dolor
-
-- Operators and other mathematical stuff: -+/\*
-- Characters offten used in programming languages: {(<>)}@$?%\*#;:&/\\!^"'\`~
-- Special german characters: ÄäÖöÜü
-- Other special characters: @€¢§%°
-
-## Excepteur sint occaecat cupidatat
-
-Lorem ipsum dolor _sit amet_, consectetur adipisicing elit, sed do
-eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim
-ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
-aliquip ex ea commodo consequat. Duis aute irure dolor in
-reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
-pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
-culpa qui officia deserunt mollit anim id est laborum.
-
-Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
-eiusmod tempor incididunt ut labore et dolore magna aliqua. **Ut enim**
-**ad minim veniam, quis nostrud _exercitation ullamco_ laboris nisi ut**
-**aliquip ex ea commodo consequat**. Duis aute irure dolor in
-reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla
-pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
-culpa qui officia deserunt mollit anim id est laborum.
diff --git a/generated-2025-11-21-17-29-08/content/posts/a-perfect-outline.md b/generated-2025-11-21-17-29-08/content/posts/a-perfect-outline.md
deleted file mode 100644 (file)
index eda4b71..0000000
+++ /dev/null
@@ -1,720 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - html(5)
-date: "2020-04-10T11:53:39+00:00"
-guid: http://juplo.de/?p=357
-parent_post_id: null
-post_id: "357"
-title: A Perfect Outline
-url: /a-perfect-outline/
-
----
-## Point Out Your Content: Utilize the HTML5 Outline-Algorithm
-
-HTML5 introduces new semantic elements accompained by the definition of [a new algorithm to calculate the document-outline](https://developer.mozilla.org/de/docs/Web/Guide/HTML/Sections_and_Outlines_of_an_HTML5_document "Read all about the new possibilities to mark up the outline of your document") from the mark up.
-There are plenty of [good explanations](http://www.smashingmagazine.com/2011/08/16/html5-and-the-document-outlining-algorithm/ "This is a very good overview, because it also pointes out, what to watch out for") of these new possibilities, to point out your content in a more controlled way.
-But the most of these explanations fall short, if it comes to how to put these new markup into use, so that it results in a sensible outline of the document, that was marked up.
-
-In this article I will try to explain, how to use the new semantic markup, to produce an outline, that is usable as a real content table of the document - not just as an partially orderd overview of all headings.
-I will do so, by showing simple examples, that will illuminate the principles behind the new markup.
-
-## All Messed Up!
-
-Although, the ideas behind the new markup seems to be simple and clear, nearly nobody accomplishes to produce a sensible outline.
-Even the big players, who [guide us through the jungle of the new specifications](http://www.html5rocks.com/de/ "Great guidance - but bad outline") and are giving [great explanations about the subject](http://www.smashingmagazine.com/2013/01/18/the-importance-of-sections/ "Great explanation - but bad outline"), either fail on there sites (see by yourself with the help of the help of [the h5o HTML5 Outline Bookmarklet](https://h5o.github.io/ "Just drag and drop the bookmarklet to your favorites.")), or produce the outline in the old way by the usage of `h1`- `h6` only, like the fabulous HTML5-bible [Dive Into HTML5](http://diveintohtml5.info/semantics.html#footer-element "A wounderful introduction to the new possibilities of HTML5 - but the tid outline is produced the old way").
-
-This is, because there is a lot to mix up in a wrong way, when trying to adopt the new features.
-Here is, what I ended up with, on my first try to combine what I have learned about [semantic elements](http://www.w3schools.com/html/html5_semantic_elements.asp "Overview of the new semantic elements, available in HTML5") and the [document outline](http://html5doctor.com/outlines/ "An explanation, of what the specs told you about the document outline"):
-
-#### Example 01: Markup
-
-```html
-
-<!DOCTYPE html>
-<title>Example 01</title>
-<header>
-  <h2>Header</h2>
-  <nav>Navigation</nav>
-</header>
-<main>
-  <h1>Main</h1>
-  <section>
-    <h2>Section I</h2>
-  </section>
-  <section>
-    <h2>Section II</h2>
-    <section>
-      <h3>Subsection a</h3>
-    </section>
-    <section>
-      <h3>Subsection b</h3>
-    </section>
-  </section>
-  <section>
-    <h2>Section III</h2>
-    <section>
-      <h3>Subsection a</h3>
-    </section>
-  </section>
-</main>
-<aside>
-  <h1>Aside</h1>
-</aside>
-<footer>
-  <h2>Footer</h2>
-</footer>
-
-```
-
-#### Example 01: Outline
-
-1. Header
-1. _Untitled section_
-1. Main
-1. Section I
-1. Section II
-      1. Subsection a
-      1. Subsection b
-1. Section III
-      1. Subsection a
-1. Aside
-1. Footer
-
-[View example 01](/wp-uploads/2015/06/example-01.html)
-
-That quiet was not the outline, that I had expected.
-I planed, that _Header_, _Main_, _Aside_ and _Footer_ are ending up at the same level.
-Instead of that, _Aside_ and _Footer_ had become sections of my _Main_-content.
-And where the hell comes that _Untitled section_ from?!?
-My first thought on that was: No problem, I just forgot the `header`-tags.
-But after adding them, the only thing that cleared out, was where the _Untitled section_ was coming from:
-
-#### Example 02: Markup
-
-```html
-
-<!DOCTYPE html>
-<title>Example 02</title>
-<header>
-  <h2>Header</h2>
-  <nav>
-    <header><h3>Navigation</h3></header>
-  </nav>
-</header>
-<main>
-  <header><h1>Main</h1></header>
-  <section>
-    <header><h2>Section I</h2></header>
-  </section>
-  <section>
-    <header><h2>Section II</h2></header>
-    <section>
-      <header><h3>Subsection a</h3></header>
-    </section>
-    <section>
-      <header><h3>Subsection b</h3></header>
-    </section>
-  </section>
-  <section>
-    <header><h2>Section III</h2></header>
-    <section>
-      <header><h3>Subsection a</h3></header>
-    </section>
-  </section>
-</main>
-<footer>
-  <header><h2>Footer</h2></header>
-
-```
-
-#### Example 02: Outline
-
-1. Header
-1. Navigation
-1. Main
-1. Section I
-1. Section II
-      1. Subsection a
-      1. Subsection b
-1. Section III
-      1. Subsection a
-1. Aside
-1. Footer
-
-[View example 02](/wp-uploads/2015/06/example-02.html)
-
-So I thought: Maybe the `main`-tag was the wrong choice.
-Perhaps it should be replaced by an `article`.
-But after that change, the outline even got worse.
-Now, _Navigation_, _Main_ and _Aside_ appeared on the same level, all as a subsection of _Header_.
-At least, _Footer_ suddenly was a sibling of _Header_ as planed:
-
-#### Example 03: Markup
-
-```html
-
-<!DOCTYPE html>
-<title>Example 03</title>
-<header>
-  <h2>Header</h2>
-  <nav>
-    <header><h3>Navigation</h333></header>
-  </nav>
-</header>
-<article>
-  <header><h1>Article (Main)</h1></header>
-  <section>
-    <header><h2>Section I</h2></header>
-  </section>
-  <section>
-    <header><h2>Section II</h2></header>
-    <section>
-      <header><h3>Subsection a</h3></header>
-    </section>
-    <section>
-      <header><h3>Subsection b</h3></header>
-    </section>
-  </section>
-  <section>
-    <header><h2>Section III</h2></header>
-    <section>
-      <header><h3>Subsection a</h3></header>
-    </section>
-  </section>
-</article>
-<footer>
-  <header><h2>Footer</h2></header>
-</footer>
-
-```
-
-#### Example 03: Outline
-
-1. Header
-1. Navigation
-1. Main
-      1. Section I
-      1. Section II
-         1. Subsection a
-         1. Subsection b
-      1. Section III
-         1. Subsection a
-1. Aside
-1. Footer
-
-[View example 03](/wp-uploads/2015/06/example-03.html)
-
-After that, I was totally confused and decided, to sort it out step by step.
-That procedure finally gave me the clue, I want to share with you now.
-
-## Step by Step (Uh Baby!)
-
-### Step I: Investigate the Structured Part
-
-Let us start with the strictly structured part of the document: **the article and it's subsections**.
-At first a minimal example with no markup except the `article`\- and the `section`-tags:
-
-#### Example 04: Markup
-
-```html
-
-<!DOCTYPE html>
-<title>Example 04</title>
-<article>
-  Main
-  <section>
-    Section I
-  </section>
-  <section>
-    Section II
-    <section>
-      Subsection a
-    </section>
-    <section>
-      Subsection b
-    </section>
-  </section>
-  <section>
-    Section III
-    <section>
-      Subsection a
-    </section>
-  </section>
-</main>
-
-```
-
-#### Example 04: Outline
-
-1. _Untitled BODY_   1. _Untitled ARTICLE_      1. _Untitled SECTION_
-      1. _Untitled SECTION_         1. _Untitled SECTION_
-         1. _Untitled SECTION_
-      1. _Untitled SECTION_         1. _Untitled SECTION_
-
-[View Example 04](/wp-uploads/2015/06/example-04.html)
-
-Nothing really unexpected here.
-The `article`\- and `section`-tags are reflected in the outline according to their nesting.
-The only thing notably here is, that the `body` itself is also reflected in the outline.
-It appears on its own level as the root-element of all tags.
-We can think of it as the title of our document.
-
-We can add headings of any kind ( `h1`- `h6`) here and will always get an identically structured outline, that reflects the text of our headings.
-If we want to give the body a title, we have to place a heading outside and before any sectioning-elements:
-
-#### Example 05: Markup
-
-```html
-
-<!DOCTYPE html>
-<title>Example 05</title>
-<h1>Page</h1>
-<article>
-  <h1>Article</h1>
-  <section>
-    <h1>Section I</h1>
-  </section>
-  <section>
-    <h1>Section II</h1>
-    <section>
-      <h1>Subsection a</h1>
-    </section>
-    <section>
-      <h1>Subsection b</h1>
-    </section>
-  </section>
-  <section>
-    <h1>Section III</h1>
-    <section>
-      <h1>Subsection a</h1>
-    </section>
-  </section>
-</article>
-
-```
-
-#### Example 05: Outline
-
-1. Page
-1. Article
-      1. Section I
-      1. Section II
-         1. Subsection a
-         1. Subsection b
-      1. Section III
-         1. Subsection a
-
-[View Example 05](/wp-uploads/2015/06/example-05.html)
-
-This is the new part of the outline algorithm introduced in HTML5: _The nesting of elements, that define sections, defines the outline of the document._
-The rank of the heading element is ignored by this algorithm!
-
-Among the elements, that define sections in HTML5 are the `article` and the `section` tags.
-But there are more.
-[I will discuss them later](#sectioning-elemnts "Jump to the explanation of all sectioning-elements now").
-For now, you only have to know, that in HTML5, sectioning elements define the structure of the outline.
-Also, you should memorize, that the outline always has a single root without any siblings: the `body`.
-
-### Step II: Investigate the Page-Elements
-
-So, let us do the same with the tags that represent the different logical sections of a web-page: **the page-elements**.
-We start with a minimal example again, that contains no markup except the `header`\- the `main` and the `footer`-tags:
-
-#### Example 06: Markup
-
-```html
-
-<!DOCTYPE html>
-<title>Example 06</title>
-<header>Page</header>
-<main>Main</main>
-<footer>Footer</footer>
-
-```
-
-#### Example 06: Outline
-
-1. _Untitled BODY_
-
-[View Example 06](/wp-uploads/2015/06/example-06.html)
-
-That is wired, ehh?
-There is only one untitled element in the outline.
-The explanation for this is, that neither the `header`\- nor the `main`\- nor the `footer`-tag belong to the elements, that define a section in HTML5!
-This is often confused, because these elements define _the logical sections_ (header – main-content – footer) of a website.
-But these logical sections do not have to do anything with the structural sectioning of the document, that defines the outline.
-
-### Step III: Investigate the Headings
-
-So, what happens, if we add the desired markup for our headings?
-We want a `h1`-heading for our main-content, because it is the important part of our page.
-The header should have a `h2`-heading and the footer a `h3`-heading, because it is rather unimportant.
-
-#### Example 07: Markup
-
-```html
-
-<!DOCTYPE html>
-<title>Example 07</title>
-<header><h2>Page</h2></header>
-<main><h1>Main</h1></main>
-<footer><h3>Footer</h3></footer>
-
-```
-
-#### Example 07: Outline
-
-1. Page
-1. Main
-1. Footer
-
-[View Example 07](/wp-uploads/2015/06/example-07.html)
-
-Now, there is an outline again.
-But why?
-And why is it looking this way?
-
-What happens here, is [implicit sectioning](https://developer.mozilla.org/de/docs/Web/Guide/HTML/Sections_and_Outlines_of_an_HTML5_document#Implicit_Sectioning "Read all about implicit sectioning").
-In short, implicit sectioning is the outline algorithm of HTML4.
-HTML5 needs implicit sectioning, to keep compatible with HTML4, which still dominates the web.
-In fact, we could have used plain HTML4, with `div` instead of `header`, `main` and `footer`, and it would have yield the exact same outline:
-
-#### Example 08: Markup
-
-```html
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-  <head><title>Example 08</title></head>
-  <body>
-    <div class="header"><h2>Page</h2></div>
-    <div class="main"><h1>Main</h1></div>
-    <div class="footer"><h3>Footer</h3></div>
-  </body>
-</html>
-
-```
-
-#### Example 08: Outline
-
-1. Page
-1. Main
-1. Footer
-
-[View Example 08](/wp-uploads/2015/06/example-08.html)
-
-In HTML4, solely the headings ( `h1`- `h6`) define the outline of a document.
-The enclosing elements or any nesting of them are ignored altogether.
-The level, at which a heading appears in the outline, is defined by the rank of the heading alone.
-(Strictly speaking, HTML4 does not define anything like a document outline.
-But as a result of the common usage and interpretation, this is, how people outline their documents with HTML4.)
-
-The implicit sectioning of HTML5 works in a way, that is backward compatible with this way of outlining, but closes the gaps in the resulting hierarchy:
-_Each heading implicitly opens a section – hence the name –, but if there is a gap between its rank and the rank of its ancestor – that is the last preceding heading with a higher rank – it is placed in the level directly beneath its ancestor_:
-
-#### Example 09: Markup
-
-```html
-
-<!DOCTYPE html>
-<title>Example 09</title>
-<h4>h4</h4>
-<h2>h2</h2>
-<h4>h4</h4>
-<h3>h3</h3>
-<h2>h2</h2>
-<h1>h1</h1>
-<h2>h2</h2>
-<h3>h3</h3>
-
-```
-
-#### Example 09: Outline
-
-1. h4
-1. h2
-1. h4
-1. h3
-1. h2
-1. h1
-1. h2
-      1. h3
-
-[View Example 09](/wp-uploads/2015/06/example-09.html)
-
-See, how the first heading `h4` ends up on the same level as the second, which is a `h2`.
-Or, how the third and fourth headings are both on the same level under the `h2`, although they are of different rank.
-And note, how the `h2` and `h3` end up on different sectioning-levels as their earlier appearances, if they follow a `h1` in the natural order.
-
-### Step IV: Mixing it all together
-
-With the gathered clues in mind, we can now retry to layout our document with the desired outline.
-If we want, that _Header_, _Main_ and _Footer_ end up as top level citizens in our planed outline, we simply have to achieve, that they are all recognized as sections under the top level by the HTML5 outline algorithm.
-We can do that, by explicitly stating, that the `header` and the `footer` are section:
-
-#### Example 10: Markup
-
-```html
-
-<!DOCTYPE html>
-<title>Example 10</title>
-<header>
-  <section>
-    <h2>Main</h2>
-  </section>
-</header>
-<main>
-  <article>
-    <h1>Article</h1>
-    <section>
-      <h2>Section I</h2>
-    </section>
-    <section>
-      <h2>Section II</h2>
-      <section>
-        <h3>Subsection a</h3>
-      </section>
-      <section>
-        <h3>Subsection b</h3>
-      </section>
-    </section>
-    <section>
-      <h2>Section III</h2>
-      <section>
-        <h3>Subsection a</h3>
-      </section>
-    </section>
-  </article>
-</main>
-<footer>
-  <section>
-    <h3>Footer</h3>
-  </section>
-</footer>
-
-```
-
-#### Example 10: Outline
-
-1. _Untitled BODY_   1. Main
-1. Article
-      1. Section I
-      1. Section II
-         1. Subsection a
-         1. Subsection b
-      1. Section III
-         1. Subsection a
-1. Footer
-
-[View Example 10](/wp-uploads/2015/06/example-10.html)
-
-So far, so good.
-But what about the untitled body?
-We forgot about the single root of any outline, that is defined by the body, how we learned back in [step 1](#step-01 "Jump back to step 1, if you do not remember..."). As shown in [example 05](#example-05 "Revisit example 5"), we can simply name that by putting a heading outside and before any element, that defines a section:
-
-#### Example 11: Markup
-
-```html
-
-<!DOCTYPE html>
-<title>Example 11</title>
-<header>
-  <h2>Page</h2>
-  <section>
-    <h3>Header</h3>
-  </section>
-</header>
-<main>
-  <article>
-    <h1>Article</h1>
-    <section>
-      <h2>Section I</h2>
-    </section>
-    <section>
-      <h2>Section II</h2>
-      <section>
-        <h3>Subsection a</h3>
-      </section>
-      <section>
-        <h3>Subsection b</h3>
-      </section>
-    </section>
-    <section>
-      <h2>Section III</h2>
-      <section>
-        <h3>Subsection a</h3>
-      </section>
-    </section>
-  </article>
-</main>
-<footer>
-  <section>
-    <h3>Footer</h3>
-  </section>
-</footer>
-
-```
-
-#### Example 11: Outline
-
-1. _Page_   1. Header
-1. Main
-      1. Section I
-      1. Section II
-         1. Subsection a
-         1. Subsection b
-      1. Section III
-         1. Subsection a
-1. Footer
-
-[View Example 11](/wp-uploads/2015/06/example-11.html)
-
-### Step V: Be Aware, Which Elements Define Sections
-
-The eagle-eyed among you might have noticed, that I had "forgotten" the two element-types `nav` and `aside`, when we were investigating the elements, that define the logical structure of the page in [step 2](#step-2 "Revisit step 2").
-I did not forgot about these – I left them out intentionally.
-Because otherwise, the results of [example 07](#example-07 "Revisit example 07") would have been too confusing, to made my point about implicit sectioning.
-Let us look, what would have happend:
-
-#### Example 12: Markup
-
-```html
-
-<!DOCTYPE html>
-<title>Example 12</title>
-<header>
-  <h1>Page</h1>
-  <nav><h1>Navigation</h1></nav>
-</header>
-<main><h1>Main</h1></main>
-<aside><h1>Aside</h1></aside>
-<footer><h1>Footer</h1></footer>
-
-```
-
-#### Example 07: Outline
-
-1. Page
-1. Navigation
-1. Main
-1. Aside
-1. Footer
-
-[View Example 12](/wp-uploads/2015/06/example-12.html)
-
-What is wrong there?
-Why are _Navigation_ and _Aside_ showing up as children, albeit we marked up every element with headings of the same rank?
-The reason for this is, that `nav` and `aside` are sectioning elements:
-
-#### Example 12: Markup
-
-```html
-
-<!DOCTYPE html>
-<title>Example 13</title>
-<header>
-  Page
-  <nav>Navigation</nav>
-</header>
-<main>Main</main>
-<aside>Aside</aside>
-<footer>Footer</footer>
-
-```
-
-#### Example 07: Outline
-
-1. _Untitled BODY_   1. _Untitled NAV_
-1. _Untitled ASIDE_
-
-[View Example 13](/wp-uploads/2015/06/example-13.html)
-
-The HTML5 spec defines four [sectioning elements](http://www.w3.org/WAI/GL/wiki/Using_HTML5_section_elements "Read about the intended use of these sectioning elements"): `article`, `section`, `nav` and `aside`!
-Some explain the confusion about this fact with the constantly evolving standard, that leads to [structurally unclear specifications](http://www.smashingmagazine.com/2013/01/18/the-importance-of-sections/#cad-middle "Jump to this rather lame excuse in an otherwise great article").
-I will be frank:
-_I cannot imagine any good reason for this decision!_
-In my opinion, the concept would be much clearer, if `article` and `section` would be the only two sectioning elements and `nav` and `aside` would only define the logical structure of the page, like `header` and `footer`.
-
-## Putting It All Together
-
-Knowing, that `nav` and `aside` will define sections, we now can complete our outline skillfully avoiding the appearance of untitled sections:
-
-#### Example 14: Markup
-
-```html
-
-<!DOCTYPE html>
-<title>Example 14</title>
-<header>
-  <h2>Page</h2>
-  <section>
-    <h3>Header</h3>
-    <nav><h4>Navigation</h4></nav>
-  </section>
-</header>
-<main>
-  <article>
-    <h1>Main</h1>
-    <section>
-      <h2>Section I</h2>
-    </section>
-    <section>
-      <h2>Section II</h2>
-      <section>
-        <h3>Subsection a</h3>
-      </section>
-      <section>
-        <h3>Subsection b</h3>
-      </section>
-    </section>
-    <section>
-      <h2>Section III</h2>
-      <section>
-        <h3>Subsection a</h3>
-      </section>
-    </section>
-  </article>
-</main>
-<aside><h3>Aside</h3></aside>
-<footer>
-  <section>
-    <h3>Footer</h3>
-  </section>
-</footer>
-
-```
-
-#### Example 14: Outline
-
-1. _Page_   1. Header
-      1. Navigation
-1. Main
-      1. Section I
-      1. Section II
-         1. Subsection a
-         1. Subsection b
-      1. Section III
-         1. Subsection a
-1. Aside
-1. Footer
-
-[View Example 14](/wp-uploads/2015/06/example-14.html)
-
-_Et voilà: Our Perfect Outline!_
-
-If you memorize the concepts, that you have learned in this little tutorial, you should now be able to mark up your documents to generate _your perfect outline_...
-
-...but: one last word about headings:
-
-## A Word On The Ranks Of The Headings
-
-It is crucial to note, that [the new outline-algorithm still is a fiction](http://www.paciellogroup.com/blog/2013/10/html5-document-outline/ "Read, why it may be dangerous, to miss that it is not yet real"): most user agents do not implement the algorithm yet.
-Hence, you still should stick to the old [hints for keeping your content accessible](https://dequeuniversity.com/assets/html/jquery-summit/html5/slides/headings.html "Tipps, how to create a logical outline of your document the old way") and point out the most important heading to the search engines.
-
-But there is no reason, not to apply the new possibilities shown in this article to your markup: it will only make it more feature-proof.
-It is very likely, that [search engines will start to adopt the HTML5 outline algorithm](http://html5doctor.com/html5-seo-search-engine-optimisation/ "Read more about, what search engines already pick up from the new fruits, that HTML5 has to offer"), to make more sense out of your content in near feature - or are already doing so...
-So, why not be one of the first, to gain from that new technique.
-
-_I would advise you, to adopt the new possibilities to section your content and generate a sensible outline, while still keeping the old heading ranks to be backward compatible._
diff --git a/generated-2025-11-21-17-29-08/content/posts/actuator-httptrace-does-not-work-with-spring-boot-2-2.md b/generated-2025-11-21-17-29-08/content/posts/actuator-httptrace-does-not-work-with-spring-boot-2-2.md
deleted file mode 100644 (file)
index bafa43f..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
----
-_edit_last: "2"
-_oembed_0a2776cf844d7b8b543bf000729407fe: '{{unknown}}'
-_oembed_8a143b8145082a48cc586f0fdb19f9b5: '{{unknown}}'
-_oembed_4484ca19961800dfe51ad98d0b1fcfef: '{{unknown}}'
-_oembed_b0575eccf8471857f8e25e8d0f179f68: '{{unknown}}'
-author: kai
-categories:
-  - explained
-  - java
-  - spring-boot
-classic-editor-remember: classic-editor
-date: "2020-07-02T13:24:07+00:00"
-guid: http://juplo.de/?p=970
-parent_post_id: null
-post_id: "970"
-title: Actuator HTTP Trace Does Not Work With Spring Boot 2.2.x
-url: /actuator-httptrace-does-not-work-with-spring-boot-2-2/
-
----
-## TL;DR
-
-In Spring Boot 2.2.x, you have to instanciate a **`@Bean`** of type **`InMemoryHttpTraceRepository`** to enable the HTTP Trace Actuator.
-
-Jump to the [explanation](#explanation) of and [example code for the fix](#fix)
-
-## `Enabling HTTP Trace — Before 2.2.x...`
-
-Spring Boot comes with a very handy feature called [Actuator](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready "Show the Spring Boot Documentation for the Actuator Feature").
-Actuator provides a build-in production-ready REST-API, that can be used to monitor / menage / debug your bootified App.
-To enable it — _prior to 2.2.x_ —, one only had to:
-
-1. Specifiy the dependency for Spring Boot Actuator:
-
-   ```
-   <dependency>
-     <groupId>org.springframework.boot
-     <artifactId>spring-boot-starter-actuator
-   </dependency>
-
-   ```
-
-1. Expose the needed endpoints via HTTP:
-
-   ```properties
-   management.endpoints.web.exposure.include=*
-
-   ```
-
-   - This exposes **all available endpoints** via HTTP.
-   - _**Advise:** Do not copy this into a production config_  
-
-      (Without thinking about it twice and — at least — [enable some security measures](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-endpoints-security "Read, how to secure HTTP-endpoints in the documentation of Spring Boot") to protect the exposed endpoints!)
-
-## The problem: _It simply does not work any more in 2.2 :(_
-
-_But..._
-
-- If you upgrade your existing app with a working `httptrace`-actuator to Spring Boot 2.2.x, or
-- If you start with a fresh app in Spring Boot 2.2.x and try to enable the `httptrace`-actuator [as described in the documentation](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-endpoints-exposing-endpoints "Read, how to expose HTTP-endpoints in the documentation of Spring Boot")
-
-**...it simply does not work at all!**
-
-## The Fix
-
-The simple fix for this problem is, to add a `@Bean` of type `InMemoryHttpTraceRepository` to your **`@Configuration`**-class:
-
-```
-@Bean
-public HttpTraceRepository htttpTraceRepository()
-{
-  return new InMemoryHttpTraceRepository();
-}
-
-```
-
-## The Explanation
-
-The cause of this problem is not a bug, but a legitimate change in the default configuration.
-Unfortunately, this change is not noted in the according section of the documentation.
-Instead it is burried in the [Upgrade Notes for Spring Boot 2.2](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2.0-M3-Release-Notes#actuator-http-trace-and-auditing-are-disabled-by-default)
-
-The default-implementation stores the captured data in memory.
-Hence, it consumes much memory, without the user knowing, or even worse: needing it.
-This is especially undesirable in cluster environments, where memory is a precious good.
-_And remember:_ Spring Boot was invented to simplify cluster deployments!
-
-**That is, why this feature is now turned of by default and has to be turned on by the user explicitly, if needed.**
diff --git a/generated-2025-11-21-17-29-08/content/posts/arbeitspaket-a-entwicklung-eines-facebook-crawlers.md b/generated-2025-11-21-17-29-08/content/posts/arbeitspaket-a-entwicklung-eines-facebook-crawlers.md
deleted file mode 100644 (file)
index 92d1c83..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - facebook
-date: "2015-10-01T11:57:11+00:00"
-draft: "true"
-guid: http://juplo.de/?p=532
-parent_post_id: null
-post_id: "532"
-title: 'Arbeitspaket 1a: Entwicklung eines Facebook-Crawlers'
-url: /
-
----
-
diff --git a/generated-2025-11-21-17-29-08/content/posts/aspectj-maven-plugin-can-not-compile-valid-java-7-0-code.md b/generated-2025-11-21-17-29-08/content/posts/aspectj-maven-plugin-can-not-compile-valid-java-7-0-code.md
deleted file mode 100644 (file)
index 1a36b67..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - java
-  - maven
-date: "2014-07-18T10:32:21+00:00"
-guid: http://juplo.de/?p=302
-parent_post_id: null
-post_id: "302"
-title: aspectj-maven-plugin can not compile valid Java-7.0-Code
-url: /aspectj-maven-plugin-can-not-compile-valid-java-7-0-code/
-
----
-I stumbled over a valid construction, that can not be compiled by the [aspectj-maven-plugin](http://mojo.codehaus.org/aspectj-maven-plugin/ "Jump to the homepage of the aspectj-maven-plugin"):
-
-```java
-
-class Outer
-{
-  void outer(Inner inner)
-  {
-  }
-
-  class Inner
-  {
-    Outer outer;
-
-    void inner()
-    {
-      outer.outer(this);
-    }
-  }
-}
-
-```
-
-This code might look very useless.
-Originally, it `Inner` was a Thread, that wants to signal its enclosing class, that it has finished some work.
-I just striped down all other code, that was not needed, to trigger the error.
-
-If you put the class `Outer` in a maven-project and configure the aspectj-maven-plugin to weave this class with compliance-level 1.6, you will get the following error:
-
-```
-
-[ERROR] Failed to execute goal org.codehaus.mojo:aspectj-maven-plugin:1.6:compile (default-cli) on project shouter: Compiler errors:
-[ERROR] error at outer.inner(this);
-[ERROR]
-[ERROR] /home/kai/juplo/shouter/src/main/java/Outer.java:16:0::0 The method inner(Outer.Inner) is undefined for the type Outer
-[ERROR] error at queue.done(this, System.currentTimeMillis() - start);
-[ERROR]
-
-```
-
-The normal compilation works, because the class is syntactically correct Java-7.0-Code.
-But the AspectJ-Compiler (Version 1.7.4) bundeled with the aspectj-maven-pluign will fail!
-
-Fortunately, I found out, [how to use the aspectj-maven-plugin with AspectJ 1.8.3](/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/ "Read, how to run the aspectj-maven-plugin with a current version of AspectJ").
-
-So, if you have a similar problem, [read on...](/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/ "Read, how you can solve this ajc compilation error")
diff --git a/generated-2025-11-21-17-29-08/content/posts/bidirectional-association-with-elementcollection.md b/generated-2025-11-21-17-29-08/content/posts/bidirectional-association-with-elementcollection.md
deleted file mode 100644 (file)
index cefe6c7..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - hibernate
-  - java
-  - jpa
-date: "2013-10-03T09:11:36+00:00"
-guid: http://juplo.de/?p=90
-parent_post_id: null
-post_id: "90"
-title: Bidirectional Association with @ElementCollection
-url: /bidirectional-association-with-elementcollection/
-
----
-Have you ever wondered, how to map a bidirectional association from an entity to the instances of its element-collection? Actually, it is very easy, if you are using hibernate. It is just somehow hard to find in the documentation, if you are searching for it (look for chapter 2.4.3.4 in the [Hibernate-Annotationss-Documentation](http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec-property "Chapter 2.4.3 of the Hibernate-Annotation-Documentation")).
-
-## Hibernate
-
-So, here we go:
-Just add the `@Parent`-annotation to the attribute of your associated `@Embeddable`-class, that points back to its _parent_.
-
-```
-@Entity
-class Cat
-{
-  @Id
-  Long id;
-
-  @ElementCollection
-  Set kittens;
-
-  ...
-}
-
-@Embeddable
-class Kitten
-{
-  // Embeddable's have no ID-property!
-
-  @Parent
-  private Cat mother;
-
-  ...
-}
-
-```
-
-## Drawback
-
-But this clean approach has a drawback: it only works with hibernate. If you work with other JPA-implementations or plain old JPA itself, it will not work. Hence, it will not work in googles appengine, for example!
-
-Unfortunatly, there are no clean workarounds, to get bidirectional associations to `@ElementCollections`'s working with JPA. The only workarounds I found, only work for directly embedded instances - not for collections of embedded instances:
-
-- Applying `@Embedded` to a getter/setter pair rather than to the member itself (found on [stackoverflow.com](http://stackoverflow.com/a/5061089/247276 "Open the Answer in stackoverflow.com")).
-- Set the parent in the property set method (found in the [Java-Persistence WikiBook](http://en.wikibooks.org/wiki/Java_Persistence/Embeddables#Example_of_setting_a_relationship_in_an_embeddable_to_its_parent "Open the Java-Persistence WikiBook")).
-
-**If you want bidirectiona associations to the elements of your embedded collection, it works only with hibernate!**
diff --git a/generated-2025-11-21-17-29-08/content/posts/bypassing-the-same-origin-policiy-for-loal-files-during-development.md b/generated-2025-11-21-17-29-08/content/posts/bypassing-the-same-origin-policiy-for-loal-files-during-development.md
deleted file mode 100644 (file)
index 5c01ed6..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - css
-  - grunt
-  - html(5)
-  - less
-  - nodejs
-date: "2015-08-25T15:16:32+00:00"
-guid: http://juplo.de/?p=481
-parent_post_id: null
-post_id: "481"
-title: Bypassing the Same-Origin-Policy For Local Files During Development
-url: /bypassing-the-same-origin-policiy-for-loal-files-during-development/
-
----
-## downloadable font: download failed ...: status=2147500037
-
-Are you ever stumbled accross weired errors with font-files, that could not be loaded, or SVG-graphics, that are not shown during local development on your machine using `file:///`-URI's, though everything works as expected, if you push the content to a webserver and access it via HTTP?
-Furthermore, the browsers behave very differently here.
-Firefox, for example, just states, that the download of the font failed:
-
-```bash
-
-downloadable font: download failed (font-family: "XYZ" style:normal weight:normal stretch:normal src index:0): status=2147500037 source: file:///home/you/path/to/font/xyz.woff
-
-```
-
-Meanwhile, Chrome just happily uses the same font.
-Considering the SVG-graphics, that are not shown, Firefox just does not show them, like it would not be able to at all.
-Chrome logs an error:
-
-```bash
-
-Unsafe attempt to load URL file:///home/you/path/to/project/img/sprite.svg#logo from frame with URL file:///home/you/path/to/project/templates/layout.html. Domains, protocols and ports must match
-
-```
-
-...though, no protocol, domain or port is involved.
-
-## The Same-Origin Policy
-
-The reason for this strange behavior is the [Same-origin policy](https://en.wikipedia.org/wiki/Same-origin_policy "Read more about the Same-origin policy on wikipedia").
-Chrome gives you a hint in this direction with the remark that something does not match.
-I found the trail, that lead me to this explanation, while [googling for the strange error message](https://bugzilla.mozilla.org/show_bug.cgi?id=760436 "Read the bug-entry, that explains the meaning of the error-message"), that Firefox gives for the fonts, that can not be loaded.
-
-_The Same-origin policy forbids, that locally stored files can access any data, that is stored in a parent-directory._
-_They only have access to files, that reside in the same directory or in a directory beneath it._
-
-You can read more about that rule on [MDN](https://developer.mozilla.org/en-US/docs/Same-origin_policy_for_file%3A_URIs "Same-origin policy for file: URIs").
-
-I often violate that rule, when developing templates for dynamically rendered pages with [Thymeleaf](http://www.thymeleaf.org/ "Read more about the XML/XHTML/HTML5 template engine Thymeleaf"), or similar techniques.
-That is, because I like to place the template-files on a subdirectory of the directory, that contains my webapp ( `src/main/webapp` with Maven):
-
-```
-
-+ src/main/webapp/
-  + css/
-  + img/
-  + fonts/
-  + thymeleaf/templates/
-
-```
-
-I packed a simple example-project for developing static templates with [LESS](http://lesscss.org/ "Read more about less"), [nodejs](https://nodejs.org/ "Read more about nodejs") and [grunt](http://gruntjs.com/ "Read more about grunt"), that shows the problem and the [quick solution for Firefox](#quick-solution "Jump to the quick solution for Firefox") presented later.
-You can browse it on my [juplo.de/gitweb](/gitweb/?p=examples/template-development;a=tree;h=1.0.3;hb=1.0.3 "Browse the example-project on juplo.de/gitweb"), or clone it with:
-
-```bash
-
-git clone /git/examples/template-development
-
-```
-
-## Cross-Browser Solution
-
-Unfortunately, there is no simple cross-browser solution, if you want to access your files through `file:///`-URI's during development.
-The only real solution is, to access your files through the HTTP-protocol, like in production.
-If you do not want to do that, the only two cross-browser solutions are, to
-
-1. turn of the Same-origin policy for local files in all browsers, or
-
-1. rearrange your files in such a way, that they do not violate the Same-origin policy (as a rule, all resources linked in a HTML-file must reside in the same directory as the file, or beneath it).
-
-The only real cross-browser solution is to circumvent the problem altogether and serve the content with a local webserver, so that you can access it through HTTP, like in production.
-You can [read how to extend the example-project mentioned above to achieve that goal](/serve-static-html-with-nodjs-and-grunt/ "Read the article 'Serving Static HTML With Nodjs And Grunt For Template-Development'") in a follow up article.
-
-## Turn Of Security
-
-Turning of the Same-origin policy is not recommended.
-I would only do that, if you only use your browser, to access the HTML-files under development ‐ which I doubt, that it is the case.
-Anyway, this is a good quick test to validate, that the Same-origin policy is the source of your problems ‐ if you quickly re-enable it after the validation.
-
-Firefox:
- Set `security.fileuri.strict_origin_policy` to `false` on the [about:config](about:config)-page.
- Chrome:
- Restart Chrome with `--disable-web-security` or `--allow-file-access-from-files` (for more, see this [question on Stackoverflow)](http://stackoverflow.com/questions/3102819/disable-same-origin-policy-in-chrome "Read more on how to turn of the Same-origin policy in chrome").
-
-## Quick Fix For Firefox
-
-If you develop with Firefox, there is a quick fix, to bypass the Same-origin policy for local files.
-
-As the [explanation on MDM](https://developer.mozilla.org/en-US/docs/Same-origin_policy_for_file%3A_URIs "Read the explanation on MDM") stats, a file loaded in a frame shares the same origin as the file, that contains the frameset.
-This can be used to bypass the policy, if you place a file with a frameset in the topmost directory of your development-folder and load the template under development through that file.
-
-In [my case](#my-case "See the directory-tree I use this frameset with"), the frameset-file looks like this:
-
-```html
-
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
-<html>
-  <head>
-    <meta http-equiv="content-type" content="text/html; charset=utf-8">
-    <title>Frameset to Bypass Same-Origin-Policy
-  </head>
-  <frameset>
-    <frame src="thymeleaf/templates/layout.html">
-  </frameset>
-</html>
-
-```
diff --git a/generated-2025-11-21-17-29-08/content/posts/cat-any-file-in-any-commit-with-git.md b/generated-2025-11-21-17-29-08/content/posts/cat-any-file-in-any-commit-with-git.md
deleted file mode 100644 (file)
index 8e42488..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - tips
-classic-editor-remember: classic-editor
-date: "2020-01-13T16:13:13+00:00"
-guid: http://juplo.de/?p=1025
-parent_post_id: null
-post_id: "1025"
-tags:
-  - bash
-  - git
-title: Cat Any File in Any Commit With Git
-url: /cat-any-file-in-any-commit-with-git/
-
----
-Ever wanted to do take a quick look at the version of some file in a different commit without checking out that commit first? Then read on, here's how you can do it...
-
-## Goal
-
-- **Take a quick look at a special version of a file with _git_ withou checking out the commit first**
-- Commit may be anything denominatable by git (commit, branch, HEAD, remote-branch)
-- Branch may differ
-- Pipe into another command in the shell
-- Overwrite a file with an older version of itself
-
-## Tip
-
-### Syntax
-
-```bash
-git show BRANCH:PATH
-
-```
-
-### Examples
-
-- Show the content of file `file.txt` in commit `a09127`:
-
-  ```bash
-  git show a09127a:file.txt
-
-  ```
-
-  _The commit can be specified with any valid denominator and may belong to any local- or remote-branch..._
-  - Same as above, but specify the commit relativ to the checked-out commit (handy syntax):
-
-    ```bash
-    git show HEAD^^^^:file.txt
-
-    ```
-
-  - Same as above, but specify the commit relativ to the checked-out commit (readable syntax):
-
-    ```bash
-    git show HEAD~4:file.txt
-
-    ```
-
-  - Same as above for a remote-branch:
-
-    ```bash
-    git show remotes/origin/master~4:file.txt
-
-    ```
-
-  - Same as above for the branch `foo` in repository `bar`:
-
-    ```bash
-    git show remotes/bar/foo~4:file.txt
-
-    ```
-- Pipe the file into another command:
-
-  ```bash
-  git show a09127a:file.txt | wc -l
-
-  ```
-
-- Overwrite the file with its version four commits ago:
-
-  ```bash
-  git show HEAD~4:file.txt > file.txt
-
-  ```
-
-## Explanation
-
-If the path (aka _object name_) contains a colon ( **`:`**), git interprets the part before the colon as a commit and the part after it as the path in the tree, denominated by the commit.
-
-- The **commit** can be specified by its reference, or the name of a local or remote branch
-- The **path** is interpreted as absolut to the origin of the tree, denominated by the commit
-- If you want to use a relative path (i.e, current directory), prepend the path accordingly — for example **`./file`**.   
-_But in this case, be aware that the path is expanded against the checked-out version and not the version, that is specified before the colon!_
diff --git a/generated-2025-11-21-17-29-08/content/posts/changes-in-log4j-properties-are-ignored-when-running-sl4fj-under-tomcat.md b/generated-2025-11-21-17-29-08/content/posts/changes-in-log4j-properties-are-ignored-when-running-sl4fj-under-tomcat.md
deleted file mode 100644 (file)
index 2584b6b..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - java
-  - jetty
-date: "2014-06-03T09:55:28+00:00"
-guid: http://juplo.de/?p=291
-parent_post_id: null
-post_id: "291"
-title: Changes in log4j.properties are ignored, when running sl4fj under Tomcat
-url: /changes-in-log4j-properties-are-ignored-when-running-sl4fj-under-tomcat/
-
----
-Lately, I run into this very subtle bug:
-my logs were all visible, like intended and configured in `log4j.properties` (or `log4j.xml`), when I fired up my web-application in development-mode under [Jetty](http://www.eclipse.org/jetty/ "Lern more about Jetty") with `mvn jetty:run`.
-But if I installed the application on the production-server, which uses a [Tomcat 7](http://tomcat.apache.org/ "Lern more about Tomcat") servlet-container, no special logger-configuration where picked up from my configuration-file.
-_But - very strange - my configuration-file was not ignored completely._
-The appender-configuration and the log-level from the root-logger where picked up from my configuration-file.
-**Only all special logger-configuration were ignored**.
-
-## Erroneous logging-configuration
-
-Here is my configuration, as it was when I run into the problem:
-
-- Logging was done with [slf4j](http://www.slf4j.org "Learn more about slf4j")
-- Logs were written by [log4j](http://logging.apache.org/log4j/2.x/ "Learn more about log4j") with the help of **slf4j-log4j12**
-- Because I was using some legacy libraries, that were using other logging-frameworks, I had to include some [bridges](http://www.slf4j.org/legacy.html "Lern more about slf4j-bridges") to be able to include the log-messages, that were logged through this frameworks in my log-files.
-   I used: **jcl-over-slf4j** and **log4j-over-slf4j**.
-
-## Do not use sl4fj-log4j and log4j-over-slf4j together!
-
-As said before:
-_All worked as expected while developing under Jetty and in production under Tomcat, only special logger-confiugrations where ignored._
-
-Because of that, it took me quiet a while and a lot of reading, to figure out, that **this was not a configuration-issue, but a clash of libraries**.
-The cause of this strange behaviour were the fact, that **one must not use the log4j-binding _slf4j-log4j12_ and the log4j-bridge _log4j-over-slf4j_ together**.
-
-This fact is quiet logically, because it _should_ push all your logging-statements into an endless loop, where they are handed back and forth between sl4fj and log4j as stated in the sl4fj-documentation [here](http://www.slf4j.org/legacy.html#log4j-over-slf4j "Here you can read the warning in the documentation").
-But if you see all your log-messages in development and in production only the configuration behaves strangley, this mistake is realy hard to figure out!
-So, I hope I can save you some time by dragging your attention to this.
-
-## The solution
-
-Only the cause is hard to find.
-The solution is very simple:
-**Just switch from log4j to [logback](http://logback.qos.ch/index.html "Learn more about logback")**.
-
-There are some more good reasons, why you should do this anyway, over which you can [learn more here](http://logback.qos.ch/reasonsToSwitch.html "Learn why you should switch from log4j to logback anyway").
diff --git a/generated-2025-11-21-17-29-08/content/posts/combining-jetty-maven-plugin-and-wro4j-maven-plugin-for-dynamic-reloading-of-less-resources.md b/generated-2025-11-21-17-29-08/content/posts/combining-jetty-maven-plugin-and-wro4j-maven-plugin-for-dynamic-reloading-of-less-resources.md
deleted file mode 100644 (file)
index fc11159..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
----
-_edit_last: "3"
-author: kai
-categories:
-  - jetty
-  - less
-  - maven
-  - wro4j
-date: "2013-12-06T10:58:17+00:00"
-guid: http://juplo.de/?p=140
-parent_post_id: null
-post_id: "140"
-title: Combining jetty-maven-plugin and wro4j-maven-plugin for Dynamic Reloading of LESS-Resources
-url: /combining-jetty-maven-plugin-and-wro4j-maven-plugin-for-dynamic-reloading-of-less-resources/
-
----
-Ever searched for a simple configuration, that lets you use your [jetty-maven-plugin](http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin "See the documentation for mor information") as you are used to, while working with [LESS](http://www.lesscss.org/ "See LESS CSS documentation for mor informations") to simplify your stylesheets?
-
-You cannot do both, use the [Client-side mode](http://www.lesscss.org/#usage "More about the client-side usage of LESS") of LESS to ease development and use the [lesscss-maven-plugin](https://github.com/marceloverdijk/lesscss-maven-plugin "Homepage of the official LESS CSS maven plugin") to automatically compile the LESS-sources into CSS for production. That does not work, because your stylesheets must be linked in different ways if you are switching between the client-side mode - which is best for development - and the pre-compiled mode - which is best for production. For the client-side mode you need something like:
-
-```html
-
-<link rel="stylesheet/less" type="text/css" href="styles.less" />
-<script src="less.js" type="text/javascript"></script>
-
-```
-
-While, for the pre-compiled mode, you want to link to your stylesheets as usual, with:
-
-```html
-
-<link rel="stylesheet" type="text/css" href="styles.css" />
-
-```
-
-While looking for a solution to this dilemma, I stumbled accross [wro4j](https://code.google.com/p/wro4j/ "See the documentation of ths wounderfull tool"). Originally intended, to speed up page-delivery by combining and minimizing multiple resources into one through the use of a servlet-filter, this tool also comes with a maven-plugin, that let you do the same offline, while compiling your webapp.
-
-The idea is, to use the [wro4j-maven-plugin](http://code.google.com/p/wro4j/wiki/MavenPlugin "See the documentation of hte wro4j-maven-plugin") to compile and combine your LESS-sources into CSS for production and to use the [wro4j filter](http://code.google.com/p/wro4j/wiki/Installation "See how to configure the filter"), to dynamically deliver the compiled CSS while developing. This way, you do not have to alter your HTML-code, when switching between development and production, because you always link to the CSS-files.
-
-So, lets get dirty!
-
-## Step 1: Configure wro4j
-
-First, we configure **wro4j**, like as we want to use it to speed up our page. The details are explained and linked on wro4j's [Getting-Started-Page](http://code.google.com/p/wro4j/wiki/GettingStarted "Visit the Getting-Started-Page"). In short, we just need two files: **wro.xml** and **wro.properties**.
-
-### wro.xml
-
-wro.xml tells wro4j, which resources should be combined and how the result should be named. I am using the following configuration to generate all LESS-Sources beneath `base/` into one CSS-file called `base.css`:
-
-```xml
-
-<groups xmlns="http://www.isdc.ro/wro">
-  <group name="base">
-    <css>/less/base/*.less</css>
-  </group>
-
-```
-
-wro4j looks for `/less/base/*.less` inside the root of the web-context, which is equal to `src/main/webapp` in a normal maven-project. There are [other ways to specifie the resources](http://code.google.com/p/wro4j/wiki/ResourceTypes "See the resource locator documentation of wro4j for more details"), which enable you to store them elswhere. But this approach works best for our goal, because the path is understandable for both: the wro4j servlet-filter, we are configuring now for our development-environment, and the wro4j-maven-plugin, that we will configure later for build-time compilation.
-
-### wro.properties
-
-wro.properties in short tells wro4j, how or if it should convert the combined sources and how it should behave. I am using the following configuration to tell wro4j, that it should convert `*.less`-sources into CSS and do that on _every request_:
-
-```properties
-
-managerFactoryClassName=ro.isdc.wro.manager.factory.ConfigurableWroManagerFactory
-preProcessors=cssUrlRewriting,lessCssImport
-postProcessors=less4j
-disableCache=true
-
-```
-
-First of all we specify the `ConfigurableWroManagerFactory`, because otherwise, wro4j would not pick up our pre- and post-processor-configuration. This is a little bit confusing, because wro4j is already reading the `wro.properties`-file - otherwise wro4j would never detect the `managerFactoryClassName`-directive - and you might think: "Why? He is already interpreting our configuration!" But belive me, he is not! You can [read more about that in wro4j's documentation](http://code.google.com/p/wro4j/wiki/ConfigurableWroManagerFactory "Read the full story in wro4j's documentation"). The `disableCache=true` is also crucial, because otherwise, we would not see the changes take effect when developing with **jetty-maven-plugin** later on. The pre-processors `lessCssImport` and `cssUrlRewriting` merge together all our LESS-resources under `/less/base/*.less` and do some URL-rewriting, in case you have specified paths to images, fonts or other resources inside your LESS-code, to reflect that the resulting CSS is found under `/css/base.css` and not `/css/base/YOURFILE.css` like the LESS-resources.
-
-You can do much more with your resources here, for example [minimizing](https://code.google.com/p/wro4j/wiki/AvailableProcessors "See all available processors"). Also, there are countless [configuration options](http://code.google.com/p/wro4j/wiki/ConfigurationOptions "See all configuration options") to fine-tune the behaviour of wro4j. But for our goal, we are now only intrested in the compilation of our LESS-sources.
-
-## Step 2: Configure the wro4j servlet-filter
-
-Configuring the filter in the **web.xml** is easy. It is explained in wro4j's [installation-insctuctions](https://code.google.com/p/wro4j/wiki/Installation "See the installation instructions for the wro4j servlet-filter"). But the trick is, that we do not want to configure that filter for the production-version of our webapp, because we want to compile the resources offline, when the webapp is build. To acchieve this, we can use the `<overrideDescriptor>`-Parameter of the [jetty-maven-plugin](http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin#Configuring_Your_WebApp "Read more about the configuration of the jetty-maven-plugin").
-
-## <overrideDescriptor>
-
-This parameter lets you specify additional configuration options for the web.xml of your webapp. I am using the following configuration for my jetty-maven-plugin:
-
-```xml
-
-<plugin>
-  <groupId>org.eclipse.jetty</groupId>
-  <artifactId>jetty-maven-plugin</artifactId>
-  <configuration>
-    <webApp>
-      <overrideDescriptor>${project.basedir}/src/test/resources/jetty-web.xml</overrideDescriptor>
-    </webApp>
-  </configuration>
-  <dependencies>
-    <dependency>
-      <groupId>ro.isdc.wro4j</groupId>
-      <artifactId>wro4j-core</artifactId>
-      <version>${wro4j.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>ro.isdc.wro4j</groupId>
-      <artifactId>wro4j-extensions</artifactId>
-      <version>${wro4j.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>javax.servlet</groupId>
-          <artifactId>servlet-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.apache.commons</groupId>
-          <artifactId>commons-lang3</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-io</groupId>
-          <artifactId>commons-io</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.springframework</groupId>
-          <artifactId>spring-web</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.google.code.gson</groupId>
-          <artifactId>gson</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.google.javascript</groupId>
-          <artifactId>closure-compiler</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.github.lltyk</groupId>
-          <artifactId>dojo-shrinksafe</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.jruby</groupId>
-          <artifactId>jruby-core</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.jruby</groupId>
-          <artifactId>jruby-stdlib</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>me.n4u.sass</groupId>
-          <artifactId>sass-gems</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>nz.co.edmi</groupId>
-          <artifactId>bourbon-gem-jar</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.gmaven.runtime</groupId>
-          <artifactId>gmaven-runtime-1.7</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.webjars</groupId>
-          <artifactId>jshint</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.webjars</groupId>
-          <artifactId>emberjs</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.webjars</groupId>
-          <artifactId>handlebars</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.webjars</groupId>
-          <artifactId>coffee-script</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.webjars</groupId>
-          <artifactId>jslint</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.webjars</groupId>
-          <artifactId>json2</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.webjars</groupId>
-          <artifactId>jquery</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-  </dependencies>
-</plugin>
-
-```
-
-The dependencies to **wro4j-core** and **wro4j-extensions** are needed by jetty, to be able to enable the filter defined below. Unfortunatly, one of the transitive dependencies of `wro4j-extensions` triggers an uggly error when running the jetty-maven-plugin. Therefore, all unneeded dependencies of `wro4j-extensions` are excluded, as a workaround for this error/bug.
-
-## jetty-web.xml
-
-And my jetty-web.xml looks like this:
-
-```xml
-
-<?xml version="1.0" encoding="UTF-8"?>
-<web-app xmlns="http://java.sun.com/xml/ns/javaee"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
-  version="2.5">
-  <filter>
-    <filter-name>wro</filter-name>
-    <filter-class>ro.isdc.wro.http.WroFilter</filter-class>
-  </filter>
-  <filter-mapping>
-    <filter-name>wro</filter-name>
-    <url-pattern>*.css</url-pattern>
-  </filter-mapping>
-</web-app>
-
-```
-
-The filter processes any URI's that end with `.css`. This way, the wro4j servlet-filter makes `base.css` available under any path, because for exampl `/base.css`, `/css/base.css` and `/foo/bar/base.css` all end with `.css`.
-
-This is all, that is needed to develop with dynamically reloadable compiled LESS-resources. Just fire up your browser and browse to `/what/you/like/base.css`. (But do not forget to put some LESS-files in `src/main/webapp/less/base/` first!)
-
-## Step 3: Install wro4j-maven-plugin
-
-All that is left over to configure now, is the build-process. If you would build and deploy your webapp now, the CSS-file `base.css` would not be generated and the link to your stylesheet, that already works in our jetty-maven-plugin environment would point to a 404. Hence, we need to set up the **wro4j-maven-plugin**. I am using this configuration:
-
-```xml
-
-<plugin>
-  <groupId>ro.isdc.wro4j</groupId>
-  <artifactId>wro4j-maven-plugin</artifactId>
-  <version>${wro4j.version}</version>
-  <configuration>
-    <wroManagerFactory>ro.isdc.wro.maven.plugin.manager.factory.ConfigurableWroManagerFactory</wroManagerFactory>
-    <cssDestinationFolder>${project.build.directory}/${project.build.finalName}/css/</cssDestinationFolder>
-  </configuration>
-  <executions>
-    <execution>
-      <phase>prepare-package</phase>
-      <goals>
-        <goal>run</goal>
-      </goals>
-    </execution>
-  </executions>
-</plugin>
-
-```
-
-I connected the `run`-goal with the `package`-phase, because the statically compiled CSS-file is needed only in the final war. The `ConfigurableWroManagerFactory` tells wro4j, that it should look up further configuration options in our `wro.properties`-file, where we tell wro4j, that it should compile our LESS-resources. The `<cssDestinationFolder>`-tag tells wro4j, where it should put the generated CSS-file. You can adjust that to suite your needs.
-
-That's it: now the same CSS-file, which is created on the fly by the wro4j servlet-filter when using `mvn jetty:run` and, thus, enables dynamic reloading of our LESS-resources, is generated during the build-process by the wro4j-maven-plugin.
-
-## Cleanup and further considerations
-
-### lesscss-maven-plugin
-
-If you already compile your LESS-resources with the lesscss-maven-plugin, you can stick with it and skip step 3. But I strongly recommend giving wro4j-maven-plugin a try, because it is a much more powerfull tool, that can speed up your final webapp even more.
-
-### Clean up your mess
-
-With a configuration like the above one, your LESS-resources and wro4j-configuration-files will be packed into your production-war. That might be confusing later, because neither wro4j nor LESS is used in the final war. You can add the following to your `pom.xml` to exclude these files from your war for the sake of clarity:
-
-```xml
-
-<plugin>
-  <artifactId>maven-war-plugin</artifactId>
-  <configuration>
-    <warSourceExcludes>
-      WEB-INF/wro.*,
-      less/**
-    </warSourceExcludes>
-  </configuration>
-</plugin>
-
-```
-
-### What's next?
-
-We only scrached the surface, of what can be done with wro4j. Based on this configuration, you can easily enable additional features to fine-tune your final build for maximum speed. You really should take a look at the [list of available Processors](https://code.google.com/p/wro4j/wiki/AvailableProcessors "Available Processors")!
diff --git a/generated-2025-11-21-17-29-08/content/posts/compare-two-files-in-different-branches-with-git.md b/generated-2025-11-21-17-29-08/content/posts/compare-two-files-in-different-branches-with-git.md
deleted file mode 100644 (file)
index 4ee972d..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - tips
-classic-editor-remember: classic-editor
-date: "2020-01-13T16:20:34+00:00"
-guid: http://juplo.de/?p=1019
-parent_post_id: null
-post_id: "1019"
-tags:
-  - bash
-  - git
-title: Compare Two Files In Different Branches With Git
-url: /compare-two-files-in-different-branches-with-git/
-
----
-Ever wanted to do a quick diff between two different files in two different commits with git? Then read on, here's how you can do it...
-
-## Goal
-
-- **Compare two files in two commits with _git_**
-- Commit may be anything denominatable by git (commit, branch, HEAD, remote-branch)
-- Name / Path may differ
-- Branch may differ
-
-## Tip
-
-### Syntax
-
-```bash
-git diff BRANCH:PATH OTHER_BRANCH:OTHER_PATH
-
-```
-
-### Examples
-
-- Compare two different files in two different branches:
-
-  ```bash
-  git diff branch_a:file_a.txt branch_b:file_b.txt
-
-  ```
-
-- Compare a file with another version of itself in another commit
-
-  ```bash
-  git diff HEAD:file.txt a09127a:file.txt
-
-  ```
-
-- Same as above, but the commit is denominated by its branch:
-
-  ```bash
-  git diff HEAD:file.txt branchname:file.txt
-
-  ```
-
-- Same as above, but with shortcut-syntax for the currently checked-out commit:
-
-  ```bash
-  git diff :file.txt branchname:file.txt
-
-  ```
-
-- Compare a file with itself four commits ago (readable syntax):
-
-  ```bash
-  git diff :file.txt HEAD~4:file.txt
-
-  ```
-
-- Compare a file with itself four commits ago (handy syntax):
-
-  ```bash
-  git diff :file.txt HEAD~4:file.txt
-
-  ```
-
-- Compare a file with its latest version in the origin-repository:
-
-  ```bash
-  git diff :file.txt remotes/origin/master:file.txt
-
-  ```
-
-- Compare a file with its fourth-latest version in the `foo`-branch of the `bar`-repository:
-
-  ```bash
-  git diff :file.txt remotes/bar/foo~4:file.txt
-
-  ```
-
-## Explanation
-
-If the path (aka _object name_) contains a colon ( **`:`**), git interprets the part before the colon as a commit and the part after it as the path in the tree, denominated by the commit. (For more details refere to this post with [tips for `git show`](/cat-any-file-in-any-commit-with-git/ "Read more on how to cat any file in any commit with git, without checking it out first"))
diff --git a/generated-2025-11-21-17-29-08/content/posts/configure-https-for-jetty-maven-plugin-9-0-x.md b/generated-2025-11-21-17-29-08/content/posts/configure-https-for-jetty-maven-plugin-9-0-x.md
deleted file mode 100644 (file)
index 2069af2..0000000
+++ /dev/null
@@ -1,249 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - java
-  - jetty
-date: "2018-08-17T10:29:23+00:00"
-guid: http://juplo.de/?p=209
-parent_post_id: null
-post_id: "209"
-title: Configure HTTPS for jetty-maven-plugin 9.0.x
-url: /configure-https-for-jetty-maven-plugin-9-0-x/
-
----
-## For the impatient
-
-If you do not want to know why it does not work and how I fixed it, just [jump to the quick fix](#quick-fix)!
-
-## jetty-maven-plugin 9.0.x breaks the HTTPS-Connector
-
-With Jetty 9.0.x the configuration of the `jetty-maven-plugin` (formaly known as `maven-jetty-plugin`) has changed dramatically. Since then, it is no more possible to configure a HTTPS-Connector in the plugin easily. Normally, connecting your development-container via HTTPS was not often necessary. But since [Snowden](http://en.wikipedia.org/wiki/Edward_Snowden "Read more about Edward Snowden"), encryption is on everybodys mind. And so, testing the encrypted part of your webapp becomes more and more important.
-
-## Why it is "broken" in `jetty-maven-plugin` 9.0.x
-
-[A bug-report](https://bugs.eclipse.org/bugs/show_bug.cgi?id=408962 "Read the bug-report") stats, that
-
-Since the constructor signature changed for Connectors in jetty-9 to require the Server instance to be passed into it, it is no longer possible to configure Connectors directly with the plugin (because maven requires no-arg constructor for any <configuration> elements).
-
-[The documentation](http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html "Jump to the documentation of the jetty-maven-plugin") includes an example, [how to configure a HTTPS Connector with the help of a `jetty.xml`-file](http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html#maven-config-https "Jump to the example in the documentation of the jetty-maven-plugin"). But unfortunatly, this example is broken. Jetty refuses to start with the following error: `[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.0.5.v20130815:run (default-cli) on project FOOBAR: Failure: Unknown configuration type: New in org.eclipse.jetty.xml.XmlConfiguration@4809f93a -> [Help 1]`.
-
-## Get HTTPS running again
-
-So, here is, what you have to do to fix this [broken example](http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html#maven-config-https "Jump to the example in the documentation of the jetty-maven-plugin"): the content shown for the file `jetty.xml` in the example is wrong. It has to look like the other example-files. That is, ith has to start with a `<Configure>`-tag. The corrected content of the file looks like this:
-
-```html
-
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<!-- ============================================================= -->
-<!-- Configure the Http Configuration                              -->
-<!-- ============================================================= -->
-<Configure id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-  <Set name="secureScheme">https</Set>
-  <Set name="securePort"><Property name="jetty.secure.port" default="8443" /></Set>
-  <Set name="outputBufferSize">32768</Set>
-  <Set name="requestHeaderSize">8192</Set>
-  <Set name="responseHeaderSize">8192</Set>
-  <Set name="sendServerVersion">true</Set>
-  <Set name="sendDateHeader">false</Set>
-  <Set name="headerCacheSize">512</Set>
-
-  <!-- Uncomment to enable handling of X-Forwarded- style headers
-  <Call name="addCustomizer">
-    <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
-  </Call>
-  -->
-</Configure>
-
-```
-
-## But it's not running!
-
-If you are getting the error `[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.0.5.v20130815:run (default-cli) on project FOOBAR: Failure: etc/jetty.keystore (file or directory not found) -> [Help 1]` now, this is because you have to create/get a certificate for your HTTPS-Connector. For development, a selfsigned certificate is sufficient. You can easily create one like back in the [good old `maven-jetty-plugin`-times](http://mrhaki.blogspot.de/2009/05/configure-maven-jetty-plugin-for-ssl.html "Example for configuring the HTTPS-Connector of the old maven-jetty-plugin"), with this command: `keytool -genkey -alias jetty -keyalg RSA -keystore src/test/resources/jetty.keystore -storepass secret -keypass secret -dname "CN=localhost"`. Just be sure, to change the example file `jetty-ssl.xml`, to reflect the path to your new keystore file and password. Your `jetty-ssl.xml` should look like:
-
-```html
-
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<!-- ============================================================= -->
-<!-- Configure a TLS (SSL) Context Factory                         -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- and either jetty-https.xml or jetty-spdy.xml (but not both)   -->
-<!-- ============================================================= -->
-<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
-  <Set name="KeyStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.keystore" default="src/test/resources/jetty.keystore"/></Set>
-  <Set name="KeyStorePassword"><Property name="jetty.keystore.password" default="secret"/></Set>
-  <Set name="KeyManagerPassword"><Property name="jetty.keymanager.password" default="secret"/></Set>
-  <Set name="TrustStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.truststore" default="src/test/resources/jetty.keystore"/></Set>
-  <Set name="TrustStorePassword"><Property name="jetty.truststore.password" default="secret"/></Set>
-  <Set name="EndpointIdentificationAlgorithm"></Set>
-  <Set name="ExcludeCipherSuites">
-    <Array type="String">
-      <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
-      <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
-      <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
-      <Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
-      <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
-      <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
-      <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
-    </Array>
-  </Set>
-
-  <!-- =========================================================== -->
-  <!-- Create a TLS specific HttpConfiguration based on the        -->
-  <!-- common HttpConfiguration defined in jetty.xml               -->
-  <!-- Add a SecureRequestCustomizer to extract certificate and    -->
-  <!-- session information                                         -->
-  <!-- =========================================================== -->
-  <New id="sslHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-    <Arg><Ref refid="httpConfig"/></Arg>
-    <Call name="addCustomizer">
-      <Arg><New class="org.eclipse.jetty.server.SecureRequestCustomizer"/></Arg>
-    </Call>
-  </New>
-
-</Configure>
-
-```
-
-## But it's still not running!
-
-Unless you are running `mvn jetty:run` as `root`, you should see another error now: `[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.0.5.v20130815:run (default-cli) on project FOOBAR: Failure: Permission denied -> [Help 1]`. This is, because the ports are set to the numbers `80` and `443` of the privileged port-range.
-
-You have to change `jetty-http.xml` like this:
-
-```html
-
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<!-- ============================================================= -->
-<!-- Configure the Jetty Server instance with an ID "Server"       -->
-<!-- by adding a HTTP connector.                                   -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-  <!-- =========================================================== -->
-  <!-- Add a HTTP Connector.                                       -->
-  <!-- Configure an o.e.j.server.ServerConnector with a single     -->
-  <!-- HttpConnectionFactory instance using the common httpConfig  -->
-  <!-- instance defined in jetty.xml                               -->
-  <!--                                                             -->
-  <!-- Consult the javadoc of o.e.j.server.ServerConnector and     -->
-  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
-  <!-- that may be set here.                                       -->
-  <!-- =========================================================== -->
-  <Call name="addConnector">
-    <Arg>
-      <New class="org.eclipse.jetty.server.ServerConnector">
-        <Arg name="server"><Ref refid="Server" /></Arg>
-        <Arg name="factories">
-          <Array type="org.eclipse.jetty.server.ConnectionFactory">
-            <Item>
-              <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                <Arg name="config"><Ref refid="httpConfig" /></Arg>
-              </New>
-            </Item>
-          </Array>
-        </Arg>
-        <Set name="host"><Property name="jetty.host" /></Set>
-        <Set name="port"><Property name="jetty.port" default="8080" /></Set>
-        <Set name="idleTimeout"><Property name="http.timeout" default="30000"/></Set>
-      </New>
-    </Arg>
-  </Call>
-
-</Configure>
-
-```
-
-... and `jetty-https.xml` like this:
-
-```html
-
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-
-<!-- ============================================================= -->
-<!-- Configure a HTTPS connector.                                  -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- and jetty-ssl.xml.                                            -->
-<!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-  <!-- =========================================================== -->
-  <!-- Add a HTTPS Connector.                                      -->
-  <!-- Configure an o.e.j.server.ServerConnector with connection   -->
-  <!-- factories for TLS (aka SSL) and HTTP to provide HTTPS.      -->
-  <!-- All accepted TLS connections are wired to a HTTP connection.-->
-  <!--                                                             -->
-  <!-- Consult the javadoc of o.e.j.server.ServerConnector,        -->
-  <!-- o.e.j.server.SslConnectionFactory and                       -->
-  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
-  <!-- that may be set here.                                       -->
-  <!-- =========================================================== -->
-  <Call id="httpsConnector" name="addConnector">
-    <Arg>
-      <New class="org.eclipse.jetty.server.ServerConnector">
-        <Arg name="server"><Ref refid="Server" /></Arg>
-          <Arg name="factories">
-            <Array type="org.eclipse.jetty.server.ConnectionFactory">
-              <Item>
-                <New class="org.eclipse.jetty.server.SslConnectionFactory">
-                  <Arg name="next">http/1.1</Arg>
-                  <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg>
-                </New>
-              </Item>
-              <Item>
-                <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                  <Arg name="config"><Ref refid="sslHttpConfig"/></Arg>
-                </New>
-              </Item>
-            </Array>
-          </Arg>
-          <Set name="host"><Property name="jetty.host" /></Set>
-          <Set name="port"><Property name="https.port" default="8443" /></Set>
-          <Set name="idleTimeout"><Property name="https.timeout" default="30000"/></Set>
-        </New>
-    </Arg>
-  </Call>
-</Configure>
-
-```
-
-Now, it should be running, _but..._
-
-## That is all much to complex. I just want a quick fix to get it running!
-
-So, now it is working. But you still have to clutter your project with several files and avoid some pitfalls (belive me or not: if you put the filenames in the `<jettyXml>`-tag of your `pom.xml` on separate lines, jetty won't start!). Last but not least, the HTTP-Connector will stop working, if you forget to add the `jetty-http.xml`, that is mentioned at the end of the example.
-
-Because of that, I've created a simple 6-step quick-fix-guide to get the HTTPS-Connector of the `jetty-maven-plugin` running.
-
-## Quick Fix
-
-1. Download [jetty.xml](/wp-uploads/2014/02/jetty.xml) or copy it [from above](#jetty-xml) and place it in `src/test/resources/jetty.xml`
-1. Download [jetty-http.xml](/wp-uploads/2014/02/jetty-http.xml) or copy it [from above](#jetty-http-xml) and place it in `src/test/resources/jetty-http.xml`
-1. Download [jetty-ssl.xml](/wp-uploads/2014/02/jetty-ssl.xml) or copy it [from above](#jetty-ssl-xml) and place it in `src/test/resources/jetty-ssl.xml`
-1. Download [jetty-https.xml](/wp-uploads/2014/02/jetty-https.xml) or copy it [from above](#jetty-https-xml) and place it in `src/test/resources/jetty-https.xml`
-1. Download [jetty.keystore](/wp-uploads/2014/02/jetty.keystore) or generate it with the command [keytool-command from above](#keytool) and place it in `src/test/resources/jetty.keystore`
-1. Update the configuration of the `jetty-maven-plugin` in your `pom.xml` to include the XML-configurationfiles. But be aware, the ordering of the files is important and there should be no newlines inbetween. You have been warned! It should look like:
-
-   ```html
-
-   <plugin>
-     <groupId>org.eclipse.jetty</groupId>
-     <artifactId>jetty-maven-plugin</artifactId>
-     <configuration>
-       <jettyXml>
-         ${project.basedir}/src/test/resources/jetty.xml,${project.basedir}/src/test/resources/jetty-http.xml,${project.basedir}/src/test/resources/jetty-ssl.xml,${project.basedir}/src/test/resources/jetty-https.xml
-       </jettyXml>
-     </configuration>
-   </plugin>
-
-   ```
-
-That's it. You should be done!
diff --git a/generated-2025-11-21-17-29-08/content/posts/configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login.md b/generated-2025-11-21-17-29-08/content/posts/configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login.md
deleted file mode 100644 (file)
index 9231e1b..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - facebook
-  - java
-  - oauth2
-  - spring
-date: "2016-06-26T10:40:45+00:00"
-guid: http://juplo.de/?p=462
-parent_post_id: null
-post_id: "462"
-title: Configure pac4j for a Social-Login along with a Spring-Security based Form-Login
-url: /configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login/
-
----
-## The Problem – What will be explained
-
-If you just want to enable your spring-based webapplication to let users log in with their social accounts, without changing anything else, [pac4j](http://www.pac4j.org/#1 "The authentication solution for java") should be your first choice.
-But the [provided example](https://github.com/pac4j/spring-security-pac4j-demo "Clone the examples on GitHub") only shows, how to define all authentication mechanisms via pac4j.
-If you already have set up your log-in via spring-security, you have to reconfigure it with the appropriate pac4j-mechanism.
-That is a lot of unnecessary work, if you just want to supplement the already configured log in with the additionally possibility, to log in via a social provider.
-
-In this short article, I will show you, how to set that up along with the normal [form-based login of Spring-Security](http://docs.spring.io/spring-security/site/docs/4.0.1.RELEASE/reference/htmlsingle/#ns-form-and-basic "Read, how to set up the form-based login of Spring-Security").
-I will show this for a Login via Facabook along the Form-Login of Spring-Security.
-The method should work as well for [other social logins, that are supported by spring-security-pac4j](https://github.com/pac4j/spring-security-pac4j#providers-supported "See a list of all login-mechanisms, supported by spring-security-pac4j"), along other login-mechanisms provided by spring-security out-of-the-box.
-
-In this article I will not explain, how to store the user-profile-data, that was retrieved during the social login.
-Also, if you need more social interaction, than just a login and access to the default data in the user-profile you probably need [spring-social](http://projects.spring.io/spring-social/ "Homepage of the spring-social project"). How to combine spring-social with spring-security for that purpose, is explained in this nice article about how to [add social sign in to a spring-mvc weba-pplication](http://www.petrikainulainen.net/programming/spring-framework/adding-social-sign-in-to-a-spring-mvc-web-application-configuration/ "Read this article about how to integrate spring-security with spring-social").
-
-## Adding the Required Maven-Artifacts
-
-In order to use spring-security-pac4j to login to facebook, you need the following maven-artifacts:
-
-```xml
-
-<dependency>
-  <groupId>org.pac4j</groupId>
-  <artifactId>spring-security-pac4j</artifactId>
-  <version>1.2.5</version>
-</dependency>
-<dependency>
-  <groupId>org.pac4j</groupId>
-  <artifactId>pac4j-http</artifactId>
-  <version>1.7.1</version>
-</dependency>
-<dependency>
-  <groupId>org.pac4j</groupId>
-  <artifactId>pac4j-oauth</artifactId>
-  <version>1.7.1</version>
-</dependency>
-
-```
-
-## Configuration of Spring-Security (Without Social Login via pac4j)
-
-This is a bare minimal configuration to get the form-login via Spring-Security working:
-
-```xml
-
-<?xml version="1.0" encoding="UTF-8"?>
-<beans
-    xmlns="http://www.springframework.org/schema/beans"
-    xmlns:security="http://www.springframework.org/schema/security"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="
-      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
-      http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
-    ">
-
-  <security:http use-expressions="true">
-    <security:intercept-url pattern="/**" access="permitAll"/>
-    <security:intercept-url pattern="/home.html" access="isAuthenticated()"/>
-    <security:form-login login-page="/login.html" authentication-failure-url="/login.html?failure"/>
-    <security:logout/>
-    <security:remember-me/>
-  </security:http>
-
-  <security:authentication-manager>
-    <security:authentication-provider>
-      <security:user-service>
-       <security:user name="user" password="user" authorities="ROLE_USER" />
-      </security:user-service>
-    </security:authentication-provider>
-  </security:authentication-manager>
-
-</beans>
-
-```
-
-The `http` defines, that the access to the url `/home.html` is restriced and must be authenticated via a form-login on url `/login.html`.
-The `authentication-manager` defines an in-memory authentication-provider for testing purposes with just one user (username: `user`, password: `user`).
-For more details, see the [documentation of spring-security](http://docs.spring.io/spring-security/site/docs/4.0.1.RELEASE/reference/htmlsingle/#ns-form-and-basic "Read more about the available configuration-parameters in the spring-security documentation").
-
-## Enabling pac4j via spring-security-pac4j alongside
-
-To enable pac4j alongside, you have to add/change the following:
-
-```xml
-
-<?xml version="1.0" encoding="UTF-8"?>
-<beans
-    xmlns="http://www.springframework.org/schema/beans"
-    xmlns:security="http://www.springframework.org/schema/security"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="
-      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
-      http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd
-    ">
-
-  <security:http use-expressions="true">
-    <security:custom-filter position="OPENID_FILTER" ref="clientFilter"/>
-    <security:intercept-url pattern="/**" access="permitAll()"/>
-    <security:intercept-url pattern="/home.html" access="isAuthenticated()"/>
-    <security:form-login login-page="/login.html" authentication-failure-url="/login.html?failure"/>
-    <security:logout/>
-  </security:http>
-
-  <security:authentication-manager alias="authenticationManager">
-    <security:authentication-provider>
-      <security:user-service>
-       <security:user name="user" password="user" authorities="ROLE_USER" />
-      </security:user-service>
-    </security:authentication-provider>
-    <security:authentication-provider ref="clientProvider"/>
-  </security:authentication-manager>
-
-  <!-- entry points -->
-  <bean id="facebookEntryPoint" class="org.pac4j.springframework.security.web.ClientAuthenticationEntryPoint">
-    <property name="client" ref="facebookClient"/>
-  </bean>
-
-  <!-- client definitions -->
-  <bean id="facebookClient" class="org.pac4j.oauth.client.FacebookClient">
-    <property name="key" value="145278422258960"/>
-    <property name="secret" value="be21409ba8f39b5dae2a7de525484da8"/>
-  </bean>
-  <bean id="clients" class="org.pac4j.core.client.Clients">
-    <property name="callbackUrl" value="http://localhost:8080/callback"/>
-    <property name="clients">
-      <list>
-        <ref bean="facebookClient"/>
-      </list>
-    </property>
-  </bean>
-
-  <!-- common to all clients -->
-  <bean id="clientFilter" class="org.pac4j.springframework.security.web.ClientAuthenticationFilter">
-    <constructor-arg value="/callback"/>
-    <property name="clients" ref="clients"/>
-    <property name="sessionAuthenticationStrategy" ref="sas"/>
-    <property name="authenticationManager" ref="authenticationManager"/>
-  </bean>
-  <bean id="clientProvider" class="org.pac4j.springframework.security.authentication.ClientAuthenticationProvider">
-    <property name="clients" ref="clients"/>
-  </bean>
-  <bean id="httpSessionRequestCache" class="org.springframework.security.web.savedrequest.HttpSessionRequestCache"/>
-  <bean id="sas" class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy"/>
-
-</beans>
-
-```
-
-In short:
-
-1. You have to add an additional filter in `http`.
-   I added this filter on position `OPENID_FILTER`, because pac4j introduces a unified way to handle OpenID and OAuth and so on.
-   If you are using the OpenID-mechanism of spring-security, you have to use another position in the filter-chain (for example `CAS_FILTER`) or reconfigure OpenID to use the pac4j-mechanism, which should be fairly straight-forward.
-
-
-   The new Filter has the ID `clientFilter` and needs a reference to the `authenticationManager`.
-   Also, the callback-URL (here: `/callback`) must be mapped to your web-application!
-
-1. You have to add an additional `authentication-provider` to the `authentication-manager`, that references your newly defined pac4j-ClientProvider ( `clientProvider`).
-
-1. You have to configure your entry-points as pac4j-clients.
-   In the example above, only one pac4j-client, that authenticats the user via Facebook, is configured.
-   You easily can add more clients: just copy the definitions from the [spring-security-pac4j example](https://github.com/pac4j/spring-security-pac4j-demo "Browse the source of that example on GitHub").
-
-That should be all, that is necessary, to enable a Facebook-Login in your Spring-Security web-application.
-
-## Do Not Forget To Use Your Own APP-ID!
-
-The App-ID `145278422258960` and the accompanying secret `be21409ba8f39b5dae2a7de525484da8` were taken from the [spring-security-pac4j example](https://github.com/pac4j/spring-security-pac4j-demo "Browse the source of that example on GitHub") for simplicity.
-That works for a first test-run on `localhost`.
-_But you have to replace that with your own App-ID and -scecret, that you have to generate using [your App Dashboard on Facebook](https://developers.facebook.com/apps "You can generate your own apps on your App Dashboard")!_
-
-## More to come...
-
-This short article does not show, how to save the retrieved user-profiles in your user-database, if you need that.
-I hope, I will write a follow-up on that soon.
-In short:
-pac4j creates a Spring-Security `UserDetails`-Instance for every user, that was authenticated against it.
-You can use this, to access the data in the retrieved user-profile (for example to write out the name of the user in a greeting or contact him via e-mail).
diff --git a/generated-2025-11-21-17-29-08/content/posts/create-a-simulated-network-as-docker-does-it.md b/generated-2025-11-21-17-29-08/content/posts/create-a-simulated-network-as-docker-does-it.md
deleted file mode 100644 (file)
index 571e45c..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - howto
-date: "2019-06-03T16:05:21+00:00"
-draft: "true"
-guid: http://juplo.de/?p=831
-parent_post_id: null
-post_id: "831"
-title: Create A Simulated Network As Docker Does It
-url: /
-
----
-## Why
-
-In this mini-HOWTO, we will configure a simulated network in exact the same way, as Docker does it.
-
-Our goal is, to understand how Docker handles virtual networks.
-Later (in another post), we will use the gained understanding to simulate segmented multihop networks using Docker-Compose.
-
-## Step 1: Create The Bridge
-
-First, we have to create a bridge, that will act as the switch in our virtual network and bring it up.
-
-```bash
-sudo ip link add dev switch type bridge
-sudo ip link set dev switch up
-
-```
-
-_It is crucial, to activate each created device, since new devices are not activated by default._
-
-## Step 2: Create A Virtual Host
-
-Now we can create a virtual host.
-This is done by creating a new **network namespace**, that will act as the host:
-
-```bash
-sudo ip netns add host_1
-```
-
-This "virtual host" is not of much use at the moment, because it is not connected to any network, which we will do next...
-
-## Step 3: Connect The Virtual Host To The Network
-
-Connecting the host to the network is done with the help of a **[veth pair](/virtual-networking-with-linux-veth-pairs/ "Virtual Networking With Linux: Veth-Pairs")**:
-
-```bash
-sudo ip link add dev host_1 type veth peer name host_if
-
-```
-
-A veth-pair acts as a virtual patch-cable.
-As a real cable, it always has two ends and data that enters one end is copied to the other.
-Unlike a real cable, each end comes with a network interface card (nic).
-To stick with the metaphor: using a veth-pair is like taking a patch-cable with a nic hardwired to each end and installing these nics.
-
-## Pitfalls
-
-Some common pitfalls, when
-
-```bash
-# Create a bridge in the standard-networknamespace, that represents the switch
-sudo ip link add dev switch type bridge
-# Bring the bridge up
-sudo ip link set dev switch up
-
-# Create a veth-pair for the virtual peer host_1
-sudo ip link add dev host_1 type veth peer name host_if
-# Create a private namespace for host_1 and move the interface host_if into it
-sudo ip netns add host_1
-sudo ip link set dev host_if netns host_1
-# Rename the private interface to eth0
-sudo ip netns exec host_1 ip link set dev host_if name eth0
-# Set the IP for the interface eth0 and bring it up
-sudo ip netns exec host_1 ip addr add 192.168.10.1/24 dev eth0
-sudo ip netns exec host_1 ip link set dev eth0 up
-# Plug the other end into the virtual switch and bring it up
-sudo ip link set dev host_1 master switch
-sudo ip link set dev host_1 up
-
-# Create a veth-pair for the virtual peer host_2
-sudo ip link add dev host_2 type veth peer name host_if
-# Create a private namespace for host_2 and move the interface host_if into it
-sudo ip netns add host_2
-sudo ip link set dev host_if netns host_2
-# Rename the private interface to eth0
-sudo ip netns exec host_2 ip link set dev host_if name eth0
-# Set the IP for the interface eth0 and bring it up
-sudo ip netns exec host_2 ip addr add 192.168.10.2/24 dev eth0
-sudo ip netns exec host_2 ip link set dev eth0 up
-# Plug the other end into the virtual switch and bring it up
-sudo ip link set dev host_2 master switch
-sudo ip link set dev host_2 up
-
-# Create a veth-pair for the virtual peer host_3
-sudo ip link add dev host_3 type veth peer name host_if
-# Create a private namespace for host_3 and move the interface host_if into it
-sudo ip netns add host_3
-sudo ip link set dev host_if netns host_3
-# Rename the private interface to eth0
-sudo ip netns exec host_3 ip link set dev host_if name eth0
-# Set the IP for the interface eth0 and bring it up
-sudo ip netns exec host_3 ip addr add 192.168.10.3/24 dev eth0
-sudo ip netns exec host_3 ip link set dev eth0 up
-# Plug the other end into the virtual switch and bring it up
-sudo ip link set dev host_3 master switch
-sudo ip link set dev host_3 up
-
-# Create a veth-pair for the virtual peer host_4
-sudo ip link add dev host_4 type veth peer name host_if
-# Create a private namespace for host_4 and move the interface host_if into it
-sudo ip netns add host_4
-sudo ip link set dev host_if netns host_4
-# Rename the private interface to eth0
-sudo ip netns exec host_4 ip link set dev host_if name eth0
-# Set the IP for the interface eth0 and bring it up
-sudo ip netns exec host_4 ip addr add 192.168.10.4/24 dev eth0
-sudo ip netns exec host_4 ip link set dev eth0 up
-# Plug the other end into the virtual switch and bring it up
-sudo ip link set dev host_4 master switch
-sudo ip link set dev host_4 up
-
-# Create a veth-pair for the virtual peer host_5
-sudo ip link add dev host_5 type veth peer name host_if
-# Create a private namespace for host_5 and move the interface host_if into it
-sudo ip netns add host_5
-sudo ip link set dev host_if netns host_5
-# Rename the private interface to eth0
-sudo ip netns exec host_5 ip link set dev host_if name eth0
-# Set the IP for the interface eth0 and bring it up
-sudo ip netns exec host_5 ip addr add 192.168.10.5/24 dev eth0
-sudo ip netns exec host_5 ip link set dev eth0 up
-# Plug the other end into the virtual switch and bring it up
-sudo ip link set dev host_5 master switch
-sudo ip link set dev host_5 up
-
-```
diff --git a/generated-2025-11-21-17-29-08/content/posts/create-self-signed-multi-domain-san-certificates.md b/generated-2025-11-21-17-29-08/content/posts/create-self-signed-multi-domain-san-certificates.md
deleted file mode 100644 (file)
index dd95da9..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - howto
-classic-editor-remember: classic-editor
-date: "2019-12-09T17:55:30+00:00"
-guid: http://juplo.de/?p=887
-parent_post_id: null
-post_id: "887"
-title: Create Self-Signed Multi-Domain (SAN) Certificates
-url: /create-self-signed-multi-domain-san-certificates/
-
----
-## TL;DR
-
-The SAN-extension is removed during signing, if not respecified explicitly.
-To create a private CA with self-signed multi-domain certificats for your development setup, you simply have to:
-
-1. Run [create-ca.sh](/wp-uploads/selfsigned+san/create-ca.sh) to generate the root-certificate for your private CA.
-1. Run [gencert.sh NAME](/wp-uploads/selfsigned+san/gencert.sh) to generate selfsigned certificates for the CN NAME with an exemplary SAN-extension.
-
-## Subject Alternative Name (SAN) And Self-Signed Certificates
-
-Multi-Domain certificates are implemented as a certificate-extension called **Subject Alternative Name (SAN)**.
-One can simply specify the additional domains (or IP's) when creating a certificate.
-
-The following example shows the syntax for the **`keytool`**-command, that comes with the JDK and is frequently used by Java-programmers to create certificates:
-
-```bash
-keytool \
- -keystore test.jks -storepass confidential -keypass confidential \
- -genkey -alias test -validity 365 \
- -dname "CN=test,OU=security,O=juplo,L=Juist,ST=Niedersachsen,C=DE" \
- -ext "SAN=DNS:test,DNS:localhost,IP:127.0.0.1"
-
-```
-
-If you list the content of the newly created keystore with...
-
-```bash
-keytool -list -v -keystore test.jks
-
-```
-
-...you should see a section like the following one:
-
-```bash
-#1: ObjectId: 2.5.29.17 Criticality=false
-SubjectAlternativeName [
-  DNSName: test
-  DNSName: localhost
-  IPAddress: 127.0.0.1
-]
-
-```
-
-The certificate is also valid for this additionally specified domains and IP's.
-
-The problem is, that it is not signed and will not be trusted, unless you publicize it explicitly through a truststore.
-This is feasible, if you just want to authenticate and encrypt one point-2-point communication.
-But if more clients and/or servers have to be authenticated to each other, updating and distributing the truststore will soon become hell.
-
-The common solution in this situation is, to create a private CA, that can sign newly created certificates.
-This way, only the root-certificate of that private CA has to be distributed.
-Clients, that know the root-certificate of the private CA will automatically trust all certificates, that are signed by that CA.
-
-But unfortunatly, **if you sign your certificate, the SAN-extension vanishes**: the signed certificate is only valid for the CN.
-_(One may think, that you just have to specify the export of the SAN-extension into the certificate-signing-request - which is not exported by default - but the SAN will still be lost after signing the extended request...)_
-
-This removal of the SAN-extension is not a bug, but a feature.
-A CA has to be in control, which domains and IP's it signes certificates for.
-If a client could write arbitrary additional domains in the SAN-extension of his certificate-signing-request, he could fool the CA into signing a certificate for any domain.
-Hence, all entries in a SAN-extension are removed by default during signing.
-
-This default behavior is very annoying, if you just want to run your own private CA, to authenticate all your services to each other.
-
-In the following sections, I will walk you through a solution to circumvent this pitfall.
-If you just need a working solution for your development setup, you may skip the explanation and just [download the scripts](#scripts "Jump to the downloads"), that combine the presented steps.
-
-## Recipe To Create A Private CA With Self-Signed Multi-Domain Certificates
-
-### Create And Distribute The Root-Certificate Of The CA
-
-We are using **`openssl`** to create the root-certificate of our private CA:
-
-```bash
-openssl req \
-  -new -x509 -subj "/C=DE/ST=Niedersachsen/L=Juist/O=juplo/OU=security/CN=Root-CA" \
-  -keyout ca-key -out ca-cert -days 365 -passout pass:extraconfidential
-
-```
-
-This should create two files:
-
-- **`ca-cert`**, the root-certificate of your CA
-- **`ca-key`**, the private key of your CA with the password **`extraconfidential`**
-
-_Be sure to protect `ca-key` and its password, because anyone who has access to both of them, can sign certificates in the name of your CA!_
-
-To distribute the root-certificate, so that your Java-clients can trust all certificates, that are signed by your CA, you have to import the root-certificate into a truststore and make that truststore available to your Java-clients:
-
-```bash
-keytool \
-  -keystore truststore.jks -storepass confidential \
-  -import -alias ca-root -file ca-cert -noprompt
-
-```
-
-### Create A Certificate-Signing-Request For Your Certificat
-
-We are reusing the already created certificate here.
-If you create a new one, there is no need to specify the SAN-extension, since it will not be exported into the request and this version of the certificate will be overwritten, when the signed certificate is reimported:
-
-```bash
-keytool \
-  -keystore test.jks -storepass confidential \
-  -certreq -alias test -file cert-file
-
-```
-
-This will create the file **`cert-file`**, which contains the certificate-signing-request.
-This file can be deleted, after the certificate is signed (which is done in the next step).
-
-### Sign The Request, Adding The Additional Domains In A SAN-Extension
-
-We use **`openssl x509`** to sign the request:
-
-```bash
-openssl x509 \
-  -req -CA ca-cert -CAkey ca-key -in cert-file -out test.pem \
-  -days 365 -CAcreateserial -passin pass:extraconfidential \
-  -extensions SAN -extfile <(printf "\n[SAN]\nsubjectAltName=DNS:test,DNS:localhost,IP:127.0.0.1")
-
-```
-
-This can also be done with `openssl ca`, which has a slightly different and little bit more complicated API.
-`openssl ca` is ment to manage a real full-blown CA.
-But we do not need the extra options and complexity for our simple private CA.
-
-The important part here is all that comes after **`-extensions SAN`**.
-It specifies the _Subject-Alternative-Name_-section, that we want to include additionally into the signed certificate.
-Because we are in full control of our private CA, we can specify any domains and/or IP's here, that we want.
-The other options are ordinary certificate-signing-stuff, that is [already better explained elswhere](https://stackoverflow.com/a/21340898 "For example, you can read more in this answer on stackoverflow.com").
-
-We use a special syntax with the option `-extfile`, that allows us to specify the contents of a virtual file as part of the command.
-You can as well write your SAN-extension into a file and hand over the name of that file here, as it is done usually.
-If you want to specify the same SAN-extension in a file, that file would have to contain:
-
-```bash
-[SAN]
-subjectAltName=DNS:test,DNS:localhost,IP:127.0.0.1
-
-```
-
-Note, that the name that you give the extension on the command-line with `-extension SAN` has to match the header in the (virtual) file ( `[SAN]`).
-
-As a result of the command, the file **`test.pem`** will be created, which contains the signed x509-certificate.
-You can disply the contents of that certificate in a human readable form with:
-
-```bash
-openssl x509 -in test.pem -text
-
-```
-
-_It should display something similar to this [example-output](/wp-uploads/selfsigned+san/pem.txt "Display the example-output for a x509-certificate in PEM-format")_
-
-### Import The Root-Certificate Of The CA And The Signed Certificate Into The Keystore
-
-If you want your clients, that do only know the root-certificate of your CA, to trust your Java-service, you have to build up a _Chain-of-Trust_, that leads from the known root-certificate to the signed certificate, that your service uses to authenticate itself.
-_(Note: SSL-encryption always includes the authentication of the service a clients connects to through its certificate!)_
-In our case, that chain only has two entries, because our certificate was directly signed by the root-certificate.
-Therefore, you have to import the root-certificate ( `ca-cert`) and your signed certificate ( `test.pem`) into a keystore and make that keystore available to the Java-service, in order to enable it to authentificate itself using the signed certificate, when a client connects.
-
-Import the root-certificate of the CA:
-
-```bash
-keytool \
- -keystore test.jks -storepass confidential \
- -import -alias ca-root -file ca-cert -noprompt
-
-```
-
-Import the signed certificate (this will overwrite the unsigned version):
-
-```bash
-keytool \
- -keystore test.jks -storepass confidential \
- -import -alias test -file test.pem
-
-```
-
-**That's it: we are done!**
-
-You can validate the contents of the created keystore with:
-
-```bash
-keytool \
- -keystore test.jks -storepass confidential \
- -list -v
-
-```
-
-_It should display something similar to this [example-output](/wp-uploads/selfsigned+san/jks.txt "Display the example-output for a JKS-keystore")_
-
-To authenticate service A against client B you will have to:
-
-- make the keystore **`test.jks`** available to the service **A**
-- make the truststore **`truststore.jks`** available to the client **B**
-
-_If you want, that your clients also authentificate themselfs to your services, so that only clients with a trusted certificate can connect (2-Way-Authentication), client B also needs its own signed certificate to authenticate against service A and service A also needs access to the truststore, to be able to trust that certificate._
-
-## Simple Example-Scripts To Create A Private CA And Self-Signed Certificates With SAN-Extension
-
-The following two scripts automate the presented steps and may be useful, when setting up a private CA for Java-development:
-
-- Run [create-ca.sh](/wp-uploads/selfsigned+san/create-ca.sh "Read the source of create-ca.sh") to create the root-certificate for the CA and import it into a truststore (creates **`ca-cert`** and **`ca-key`** and the truststore **`truststore.p12`**)
-- Run [gencert.sh CN](/wp-uploads/selfsigned+san/gencert.sh "Read the source of gencert.sh") to create a certificate for the common name CN, sign it using the private CA (also exemplarily adding alternative names) and building up a valid Chain-of-Trust in a keystore (creates **`CN.pem`** and the keystore **`CN.p12`**)
-- Global options can be set in the configuration file [settings.conf](/wp-uploads/selfsigned+san/settings.conf "Read the source of setings.conf")
-
-_Read the source for more options..._
-
-Differing from the steps shown above, these scripts use the keystore-format PKCS12.
-This is, because otherwise, `keytool` is nagging about the non-standard default-format JKS in each and every step.
-
-**Note:** PKCS12 does not distinguish between a store-password and a key-password. Hence, only a store-passwort is specified in the scripts.
diff --git a/generated-2025-11-21-17-29-08/content/posts/debugging-the-oauth-flow-in-spring-security.md b/generated-2025-11-21-17-29-08/content/posts/debugging-the-oauth-flow-in-spring-security.md
deleted file mode 100644 (file)
index a7769d3..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
----
-_edit_last: "2"
-_oembed_0a2776cf844d7b8b543bf000729407fe: '{{unknown}}'
-_oembed_4484ca19961800dfe51ad98d0b1fcfef: '{{unknown}}'
-_oembed_b0575eccf8471857f8e25e8d0f179f68: '{{unknown}}'
-author: kai
-categories:
-  - hacking
-  - java
-  - oauth2
-  - spring-boot
-classic-editor-remember: classic-editor
-date: "2019-12-28T00:34:36+00:00"
-draft: "true"
-guid: http://juplo.de/?p=971
-parent_post_id: null
-post_id: "971"
-title: Debugging The OAuth2-Flow in Spring Security
-url: /
-
----
-## TL;DR
-
-Use **`CommonsRequestLoggingFilter`** and place it befor the filter, that represents Spring Security.
-
-Jump to the [configuration details](details)
-
-## The problem: Logging the Request/Response-Flow
-
-If you want to understand the OAuth2-Flow or have to debug any issues involving it, the crucial part about it is the request/response-flow between your application and the provider.
-**Unfortunately, this**
-
-**```properties**
-**spring.security.filter.order=-100**
-
-**```**
-
-**https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#security-properties**
-
-**https://mtyurt.net/post/spring-how-to-insert-a-filter-before-springsecurityfilterchain.html**
-
-**https://spring.io/guides/topicals/spring-security-architecture#\_web\_security**
-
-**```properties**
-**logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG**
-
-**```**
-
-**```java**
-**@Bean**
-**public FilterRegistrationBean requestLoggingFilter()**
-**{**
-**CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter();**
-
-**loggingFilter.setIncludeClientInfo(true);**
-**loggingFilter.setIncludeQueryString(true);**
-**loggingFilter.setIncludeHeaders(true);**
-**loggingFilter.setIncludePayload(true);**
-**loggingFilter.setMaxPayloadLength(64000);**
-
-**FilterRegistrationBean reg = new FilterRegistrationBean(loggingFilter);**
-**reg.setOrder(-101); // Default for spring.security.filter.order is -100**
-**return reg;**
-**}**
-
-**```**
diff --git a/generated-2025-11-21-17-29-08/content/posts/deduplicating-partitioned-data-with-kafka-streams.md b/generated-2025-11-21-17-29-08/content/posts/deduplicating-partitioned-data-with-kafka-streams.md
deleted file mode 100644 (file)
index 0b8c9d0..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - demos
-  - java
-  - kafka
-  - spring-boot
-classic-editor-remember: classic-editor
-date: "2020-10-10T20:02:49+00:00"
-guid: http://juplo.de/?p=1147
-parent_post_id: null
-post_id: "1147"
-title: Deduplicating Partitioned Data With a Kafka Streams ValueTransformer
-url: /deduplicating-partitioned-data-with-kafka-streams/
-
----
-Inspired by a current customer project and this article about
-[deduplicating events with Kafka Streams](https://blog.softwaremill.com/de-de-de-de-duplicating-events-with-kafka-streams-ed10cfc59fbe)
-I want to share a simple but powerful implementation of a deduplication mechanism, that works well for partitioned data and does not suffer of memory leaks, because a countless number of message-keys has to be stored.
-
-Yet, the presented approach does not work for all use-cases, because it presumes, that a strictly monotonically increasing sequence numbering can be established across all messages - at least concerning all messages, that are routed to the same partition.
-
-## The Problem
-
-A source produces messages, with reliably unique ID's.
-From time to time, sending these messages to Kafka may fail.
-The order, in which these messages are send, is crucial with respect to the incedent, they belong to.
-Resending the messages in correct order after a failure (or downtime) is no problem.
-But some of the messages may be send twice (or more often), because the producer does not know exactly, which messages were send successful.
-
-`Incident A - { id: 1,  data: "ab583cc8f8" }
-Incident B - { id: 2,  data: "83ccc8f8f8" }
-Incident C - { id: 3,  data: "115tab5b58" }
-Incident C - { id: 4,  data: "83caac564b" }
-Incident B - { id: 5,  data: "a583ccc8f8" }
-Incident A - { id: 6,  data: "8f8bc8f890" }
-Incident A - { id: 7,  data: "07583ab583" }
-<< DOWNTIME OR FAILURE >>
-Incident C - { id: 4,  data: "83caac564b" }
-Incident B - { id: 5,  data: "a583ccc8f8" }
-Incident A - { id: 6,  data: "8f8bc8f890" }
-Incident A - { id: 7,  data: "07583ab583" }
-Incident A - { id: 8,  data: "930fce58f3" }
-Incident B - { id: 9,  data: "7583ab93ab" }
-Incident C - { id: 10, data: "7583aab583" }
-Incident B - { id: 11, data: "b583075830" }
-`
-
-Since eache message has a unique ID, all messages are inherently idempotent:
-**Deduplication is no problem, if the receiver keeps track of the messages, he has already seen.**
-
-_Where is the problem?_, you may ask. _That's trivial, I just code the deduplication into my consumer!_
-
-But this approach has several drawbacks, including:
-
-- Implementing the trivial algorithm described above is not efficent, since the algorithm in general has to remember the IDs of all messages for an indefinit period of time.
-- Implementing the algorithm over and over again for every consumer is cumbersome and errorprone.
-
-_Wouldn't it be much nicer, if we had an efficient and bulletproof algorithm, that we can simply plug into our Kafka-pipelines?_
-
-## The Idea
-
-In his [blog-article](https://blog.softwaremill.com/de-de-de-de-duplicating-events-with-kafka-streams-ed10cfc59fbe)
-Jaroslaw Kijanowski describes three deduplication algorithms.
-The first does not scale well, because it does only work for single-partition topics.
-The third aims at a slightly different problem and might fail deduplicating some messages, if the timing is not tuned correctly.
-The looks like a robust solution.
-But it also looks a bit hacky and is unnecessary complex in my opinion.
-
-Playing around with his ideas, i have come up with the following algorithm, that combines elements of all three solutions:
-
-- All messages are keyed by an ID that represents the incident - not the message.
-  _This guarantees, that all messages concerning a specific incident will be stored in the same partition, so that their ordering is retained._
-- We generate unique strictly monotonically increasing sequence numbers, that are assigned to each message.
-  _If the IDs of the messages fullfill these requirements and are stored in the value (like above), they can be reused as sequence numbers_
-- We keep track of the sequence number last seen for each partition.
-- We drop all messages with sequnce numbers, that are not greater than the last sequence number, that we saw on that partition.
-
-The algorithm uses the well known approach, that TCP/IP uses to detect and drop duplicate packages.
-It is efficient, since we never have to store more sequence numbers, than partitions, that we are handling.
-The algorithm can be implemented easily based on a `ValueTransformer`, because Kafka Streams provides the ability to store state locally.
-
-## A simplified example-implementation
-
-To clearify the idea, I further simplified the problem for the example implementation:
-
-- Key and value of the messages are of type `String`, for easy scripting.
-
-- In the example implementation, person-names take the part of the ID of the incident, that acts out as message-key.
-
-- The value of the message solely consists of the sequence number.
-  _In a real-world use-case, the sequence number would be stored in the message-value and would have to be extracted from there._
-  _Or it would be stored as a message-header._
-
-That is, our message stream is simply a mapping from names to unique sequence numbers and we want to be able to separate out the contained sequence for a single person, without duplicate entries and without jeopardizing the order of that sequence.
-
-In this simplified setup, the implementation effectively boils down to the following method-override:
-
-`@Override
-public Iterable<String> transform(String value)
-{
-  Integer partition = context.partition();
-  long sequenceNumber = Long.parseLong(value);
-  Long seen = store.get(partition);
-  if (seen == null || seen < sequenceNumber)
-  {
-    store.put(partition, sequenceNumber);
-    return Arrays.asList(value);
-  }
-  return Collections.emptyList();
-}
-`
-
-- We can get the active partition from the `ProcessorContext`, that is handed to our Instance in the constructor, which is not shown here for brevity.
-- Parsing the `String`-value of the message as `long` corresponds to the extraction of the sequence number from the value of the message in our simplified setup.
-- We then check the local state, if a sequence-number was already seen for the active partition.
-  _Kafka Streams takes care of the initialization and resurection of the local state._
-  _Take a look at the [full source-code](https://github.com/juplo/demos-kafka-deduplication "Browse the source on github.com") see, how we instruct Kafka Streams to do so._
-- If this is the first sequence-number, that we see for this partition, or if the sequence-number is greater (that is: newer) than the stored one, we store it in our local state and return the value of the message, because it was seen for the first time.
-
-- Otherwise, we instruct Kafka Streams to drop the current (duplicate!) value, by returning an empty array.
-
-We can use our `ValueTransformer` with **`flatTransformValues()`**,
-to let Kafka Streams drop the detected duplicate values:
-
-`streamsBuilder
-    .stream("input")
-    .flatTransformValues(
-        new ValueTransformerSupplier()
-        {
-          @Override
-          public ValueTransformer get()
-          {
-            return new DeduplicationTransformer();
-          }
-        },
-        "SequenceNumbers")
-    .to("output");
-`
-
-One has to register an appropriate store to the `StreamsBuilder` under the referenced name.
-
-[The full source is available on github.com](https://github.com/juplo/demos-kafka-deduplication "Browse the source on github.com")
-
-## Recapping Our Assumptions...
-
-The presented deduplication algorithm presumes some assumptions, that may not fit your use-case.
-It is crucial, that these prerequisites are not violated.
-Therefor, I will spell them out once more:
-
-1. We can generate **unique strictly monotonically increasing sequence numbers** for all messages (of a partition).
-
-1. We have a **strict ordering of all messages** (per partition).
-
-1. And hence, since we want to handle more than one partition:
-   **The data is partitioned by key**.
-   That is, all messages for a specific key must always be routed to the same partition.
-
-As a conclusion of this assumptions, we have to note:
-**We can only deduplicate messages, that are routed to the same partition.**
-This follows, because we can only guarantee message-order per partition. But it should not be a problem for the same reason:
-**We assume a use-case, where all messages concerning a specific incident are captured in the same partition.**
-
-## What is _not_ needed - _but also does not hurt_
-
-Since we are only deduplicating messages, that are routed to the same partition, we do not need globally unique sequence numbers.
-Our sequence numbers only have to be unique per partition, to enable us to detect, that we have seen a specific message before on that partition.
-Golbally unique sequence numbers clearly are a stronger condition:
-**It does not hurt, if the sequence numbers are globally unique, because they are always unique per partition, if they are also globally unique.**
-
-We detect unseen messages, by the fact that their sequence number is greater than the last stored hight watermark for the partition, they are routed to.
-Hence, we do not rely on a seamless numbering without gaps.
-**It does not hurt, if the series of sequence numbers does not have any gaps, as long as two different messages on the same partition never are assigned to the same sequence number.**
-
-That said, it should be clear, that a globally unique seamless numbering of all messages across all partitions - as in our simple example-implementation - does fit well with our approach, because the numbering is still unique, if one only considers the messages in one partition, and the gaps in the numbering, that are introduced by focusing only on the messages of a single partition, are not violating our assumptions.
-
-## Pointless / Contradictorily Usage Of The Presented Approach
-
-Last but not least, I want to point out, that this approach silently assumes, that the sequence number of the message is not identically to the key of the message.
-On the contrary: **The sequence number is expected to be different from the key of the message!**
-
-If one would use the key of the message as its sequence number (provided that it is unique and represents a strictly increasing sequence of numbers), one would indeed assure, that all duplicates can be detected, but he would at once force the implementation to be indifferent, concerning the order of the messages.
-
-That is, because subsequent messages are forced to have different keys, because all messages are required to have unique sequence numbers.
-But messages with different keys may be routed to different partitions - and Kafka can only guarantee message ordering for messages, that live on the same partition.
-Hence, one has to assume, that the order in which the messages are send is not retained, if he uses the message-keys as sequence numbers - _unless,_ only one partition is utilized, which is contradictory to our primary goal here: enabling scalability through data-sharding.
-
-This is also true, if the key of a message contains an invariant ID and only embeds the changing sequence number.
-Because, the default partitioning algorithm always considers the key as a whole, and if any part of it changes, the outcome of the algorithm might change.
-
-In a production-ready implementation of the presented approach, I would advice, to store the sequence number in a message header, or provide a configurable extractor, that can derive the sequence number from the contents of the value of the message.
-It would be perfectly o.k., if the IDs of the messages are used as sequence numbers, as long as they are unique and monotonically increasing and are stored in the value of the message - not in / as the key!
diff --git a/generated-2025-11-21-17-29-08/content/posts/der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen.md b/generated-2025-11-21-17-29-08/content/posts/der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen.md
deleted file mode 100644 (file)
index 54ba6d0..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-classic-editor-remember: classic-editor
-date: "2020-04-22T17:45:06+00:00"
-guid: http://juplo.de/?p=275
-parent_post_id: null
-post_id: "275"
-title: Der Benutzer ist nicht dazu berechtigt, diese Anwendung zu sehen
-url: /der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen/
-
----
-Du bist gerade bei Facebook über die folgende Fehlermeldung gestolpert:
-
-**Fehler**  
-
-Der Nutzer ist nicht dazu berechtigt, diese Anwendung zu sehen.:  
-
-Der Benutzer ist nicht berrechtigt diese Applikation an zusehen. Der Entwickler hat dies so eingestellt.
-
-[![Fehler Der Nutzer ist nicht dazu berechtigt, diese Anwendung zu sehen.: Der Benutzer ist nicht berrechtigt diese Applikation an zusehen. Der Entwickler hat dies so eingestellt.](/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt-300x150.png)](/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png)
-
-Da dazu nichts bei Googel zu finden war, hier die einfache Erklärung, was da schief läuft:
-
-**Du hast die bei Facebook als Testbenutzer einer deiner Apps eingeloggt und das beim Zugriff auf eine andere App vergessen!**
-
-Die Testbenutzer einer App dürfen offensichtlich nur auf diese App und sonst auf keine Seiten/Apps in Facebook zugreifen - macht ja auch Sinn.
-Verwirrend nur, dass Facebook behauptet, man hättte da etwas selber von Hand eingestellt...
diff --git a/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-00.md b/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-00.md
deleted file mode 100644 (file)
index be50d3e..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
----
-_edit_last: "2"
-_wp_old_slug: develop-a-facebook-app-with-spring-social-part-0
-author: kai
-categories:
-  - howto
-date: "2016-02-01T18:33:47+00:00"
-guid: http://juplo.de/?p=558
-parent_post_id: null
-post_id: "558"
-tags:
-  - createmedia.nrw
-  - facebook
-  - graph-api
-  - java
-  - oauth2
-  - spring
-  - spring-boot
-  - spring-social
-title: 'Develop a Facebook-App with Spring-Social - Part 0: Prepare'
-url: /develop-a-facebook-app-with-spring-social-part-00/
-
----
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social").
-
-The goal of this series is not, to show how simple it is to set up your first social app with Spring Social.
-Even though the usual getting-started guides, like [the one this series is based on](http://spring.io/guides/gs/accessing-facebook/ "Read the official guide, that was the starting point of this series"), are really simple at first glance, they IMHO tend to be confusing, if you try to move on.
-I started with [the example from the original Getting-Started guide "Accessing Facebook Data"](https://github.com/spring-guides/gs-accessing-facebook.git "Browse the source of the original example") and planed to extend it to handle a sign-in via the canvas-page of facebook, like in the [Spring Social Canvas-Example](https://github.com/spring-projects/spring-social-samples/tree/master/spring-social-canvas "Browse the source of the Spring Social Canvas-Example").
-But I was not able to achieve that simple refinement and ran into multiple obstacles.
-
-Because of that, I wanted to show the refinement-process from a simple example up to a full-fledged facebook-app.
-My goal is, that you should be able to reuse the final result of the last part of this series as blueprint and starting-point for your own project.
-At the same time, you should be able to jump back to earlier posts and read all about the design-decisions, that lead up to that result.
-
-This part of my series will handle the preconditions of our first real development-steps.
-
-## The Source is With You
-
-The source-code can be found on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
-and [browsed via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
-For every part I will add a corresponding tag, that denotes the differences between the earlier and the later development steps.
-
-## Keep it Simple
-
-We will start with the most simple app possible, that just displays the public profile data of the logged in user.
-This app is based on the code of [the original Getting-Started guide "Accessing Facebook Data" from Spring-Social](http://spring.io/guides/gs/accessing-facebook/ "Jump to the original guide").
-
-But it is simplified and cleand a little.
-And I fixed some small bugs: the original code from
-[https://github.com/spring-guides/gs-accessing-facebook.git](https://github.com/spring-guides/gs-accessing-facebook.git "Link to clone the original code")
-produces a
-[NullPointerException](https://github.com/spring-guides/gs-accessing-facebook/issues/15 "Read more about this bug") and won't work with the current version 2.0.3.RELEASE of spring-social-facebook, because it uses the [depreceated](https://developers.facebook.com/docs/facebook-login/permissions#reference-read_stream) scope `read_stream`.
-
-The code for this.logging.level.de.juplo.yourshouter= part is tagged with `part-00`.
-Appart from the HTML-templates, the attic for spring-boot and the build-definitions in the `pom.xml` it mainly consists of one file:
-
-```Java
-@Controller
-@RequestMapping("/")
-public class HomeController
-{
-  private final static Logger LOG = LoggerFactory.getLogger(HomeController.class);
-
-  private final Facebook facebook;
-
-  @Inject.logging.level.de.juplo.yourshouter=
-  public HomeController(Facebook facebook)
-  {
-    this.facebook = facebook;
-  }
-
-  @RequestMapping(method = RequestMethod.GET)
-  public String helloFacebook(Model model)
-  {
-    boolean authorized = true;
-    try
-    {
-      authorized = facebook.isAuthorized();
-    }
-    catch (NullPointerException e)
-    {
-      LOG.debug("NPE while acessing Facebook: {}", e);
-      authorized = false;
-    }
-    if (!authorized)
-    {
-      LOG.info("no authorized user, redirecting to /connect/facebook");
-      return "redirect:/connect/facebook";
-    }
-
-    User user = facebook.userOperations().getUserProfile();
-    LOG.info("authorized user {}, id: {}", user.getName(), user.getId());
-    model.addAttribute("user", user);
-    return "home";
-  }
-}
-
-```
-
-I removed every unnecessary bit, to clear the view for the relevant part.
-You can add your styling and stuff by yourself later...
-
-## Automagic
-
-The magic of Spring-Social is hidden in the autoconfiguration of [Spring-Boot](http://projects.spring.io/spring-boot/ "Learn more about Spring Boot"), which will be revealed and refined/replaced in the next parts of this series.
-
-## Run it!
-
-You can clone the repository, checkout the right version and run it with the following commands:
-
-```bash
-git clone /git/examples/facebook-app/
-cd facebook-app
-checkout part-00
-mvn spring-boot:run \
-    -Dfacebook.app.id=YOUR_ID \
-    -Dfacebook.app.secret=YOUR_SECRET
-
-```
-
-Of course, you have to replace `YOUR_ID` and `YOUR_SECRET` with the ID and secret of your Facebook-App.
-What you have to do to register as a facebook-developer and start your first facebook-app is described in this ["Getting Started"-guide from Spring-Social](http://spring.io/guides/gs/register-facebook-app/ "Read, how to register your first facebook-app").
-
-In addition to what is described there, you have to **configure the URL of your website**.
-To do so, you have to navigate to the _Settings_-panel of your newly registered facebook-app.
-Click on _Add Platform_ and choose _Website_.
-Then, enter `http://localhost:8080/` as the URL of your website.
-
-After maven has downloaded all dependencies and started the Spring-Boot application in the embedded tomcat, you can point your browser to [http://localhost:8080](http://localhost:8080 "Jump to your first Facebook-App"), connect, go back to the welcome-page and view the public data of the account you connected with your app.
-
-## Coming next...
-
-Now, you are prepared to learn Spring-Social and develop your first app step by step.
-I will guide you through the process in the upcoming parts of this series.
-
-In [the next part](develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes "Jump to the next part of this series and read on...") of this series I will explain, why this example from the "Getting Started"-guide would not work as a real application and what has to be done, to fix that.
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes.md b/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes.md
deleted file mode 100644 (file)
index d0969e2..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - howto
-date: "2016-01-22T16:19:12+00:00"
-guid: http://juplo.de/?p=579
-parent_post_id: null
-post_id: "579"
-tags:
-  - createmedia.nrw
-  - facebook
-  - graph-api
-  - java
-  - oauth2
-  - spring
-  - spring-boot
-  - spring-social
-title: 'Develop a Facebook-App with Spring-Social - Part I: Behind the Scenes'
-url: /develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes/
-
----
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social").
-
-In [the last and first part of this series](/develop-a-facebook-app-with-spring-social-part-00/ "Read part 0 of this series, to get prepared!"), I prepared you for our little course.
-
-In this part we will take a look behind the scenes and learn more about the autoconfiguration performed by Spring-Boot, which made our first small example so automagically.
-
-## The Source is With You
-
-You can find the source-code on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
-and [browse it via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
-Check out `part-01` to get the source for this part of the series.
-
-## Our Silent Servant Behind the Scenes: Spring-Boot
-
-While looking at our simple example from the last part of this series, you may have wondered, how all this is wired up.
-You can log in a user from facebook, access his public profile and all this without one line of configuration.
-
-**This is achieved via [Spring-Boot autoconfiguration](http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-auto-configuration "Learn more about Spring-Boot's autoconfiguration-mechanism").**
-
-What comes in very handy in the beginning, sometimes get's in your way, when your project grows.
-This may happen, because these parts of the code are not under your control and you do not know what the autoconfiguration is doing on your behalf.
-Because of that, in this part of our series, we will rebuild the most relevant parts of the configuration by hand.
-As you will see later, this is not only an exercise, but will lead us to the first improvement of our little example.
-
-## What Is Going On Here?
-
-In our case, two Spring-Boot configuration-classes are defining the configuration.
-These two classes are [SocialWebAutoConfiguration](https://github.com/spring-projects/spring-boot/blob/v1.3.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java "View the class on github") and [FacebookAutoConfiguration](https://github.com/spring-projects/spring-boot/blob/v1.3.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/FacebookAutoConfiguration.java "View the class on github").
-Both classes are located in the package [spring-boot-autoconfigure](https://github.com/spring-projects/spring-boot/tree/v1.3.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social "View the package on github").
-
-The first one configures the `ConnectController`, sets up an instance of `InMemoryUsersConnectionRepository` as persitent store for user/connection-mappings and sets up a `UserIdService` on our behalf, that always returns the user-id `anonymous`.
-
-The second one adds an instance of `FacebookConnectionFactory` to the list of available connection-factories, if the required properties ( `spring.social.facebook.appId` and `spring.social.facebook.appSecret`) are available.
-It also configures, that a request-scoped bean of the type `Connection<Facebook>` is created for each request, that has a known user, who is connected to the Graph-API.
-
-## Rebuild This Configuration By Hand
-
-The following class rebuilds the same configuration explicitly:
-
-```Java
-@Configuration
-@EnableSocial
-public class SocialConfig extends SocialConfigurerAdapter
-{
-  /**
-   * Add a {@link FacebookConnectionFactory} to the configuration.
-   * The factory is configured through the keys <code>facebook.app.id</code>
-   * and <,code>facebook.app.secret</code>.
-   *
-   * @param config
-   * @param env
-   */
-  @Override
-  public void addConnectionFactories(
-      ConnectionFactoryConfigurer config,
-      Environment env
-      )
-  {
-    config.addConnectionFactory(
-        new FacebookConnectionFactory(
-            env.getProperty("facebook.app.id"),
-            env.getProperty("facebook.app.secret")
-            )
-        );
-  }
-
-  /**
-   * Configure an instance of {@link InMemoryUsersConnection} as persistent
-   * store of user/connection-mappings.
-   *
-   * At the moment, no special configuration is needed.
-   *
-   * @param connectionFactoryLocator
-   *     The {@link ConnectionFactoryLocator} will be injected by Spring.
-   * @return
-   *     The configured {@link UsersConnectionRepository}.
-   */
-  @Override
-  public UsersConnectionRepository getUsersConnectionRepository(
-      ConnectionFactoryLocator connectionFactoryLocator
-      )
-  {
-    InMemoryUsersConnectionRepository repository =
-        new InMemoryUsersConnectionRepository(connectionFactoryLocator);
-    return repository;
-  }
-
-  /**
-   * Configure a {@link UserIdSource}, that is equivalent to the one, that is
-   * created by Spring-Boot.
-   *
-   * @return
-   *     An instance of {@link AnonymousUserIdSource}.
-   *
-   * @see {@link AnonymousUserIdSource}
-   */
-  @Override
-  public UserIdSource getUserIdSource()
-  {
-    return new AnonymousUserIdSource();
-  }
-
-  /**
-   * Configuration of the controller, that handles the authorization against
-   * the Facebook-API, to connect a user to Facebook.
-   *
-   * At the moment, no special configuration is needed.
-   *
-   * @param factoryLocator
-   *     The {@link ConnectionFactoryLocator} will be injected by Spring.
-   * @param repository
-   *     The {@link ConnectionRepository} will be injected by Spring.
-   * @return
-   *     The configured controller.
-   */
-  @Bean
-  public ConnectController connectController(
-      ConnectionFactoryLocator factoryLocator,
-      ConnectionRepository repository
-      )
-  {
-    ConnectController controller =
-        new ConnectController(factoryLocator, repository);
-    return controller;
-  }
-
-  /**
-   * Configure a scoped bean named <code>facebook</code>, that enables
-   * access to the Graph-API in the name of the current user.
-   *
-   * @param repository
-   *     The {@link ConnectionRepository} will be injected by Spring.
-   * @return
-   *     A {@Connection}, that represents the authorization of the
-   *     current user against the Graph-API, or null, if the
-   *     current user is not connected to the API.
-   */
-  @Bean
-  @Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
-  public Facebook facebook(ConnectionRepository repository)
-  {
-    Connection connection =
-        repository.findPrimaryConnection(Facebook.class);
-    return connection != null ? connection.getApi() : null;
-  }
-}
-
-```
-
-If you run this refined version of our app, you will see, that it behaves in exact the same way, as the initial version.
-
-## Coming next
-
-You may ask, why we should rebuild the configuration by hand, if it does the same thing.
-This is, because the example, so far, would not work as a real app.
-The first step, to refine it, is to take control of the configuration.
-
-In [the next part](develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works "Jump to the third part of this series and read on...") of this series, I will show you, why this is necessary.
-But, first, we have to take a short look into Spring Social.
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works.md b/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works.md
deleted file mode 100644 (file)
index 5d93567..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - howto
-date: "2016-01-22T23:10:04+00:00"
-guid: http://juplo.de/?p=592
-parent_post_id: null
-post_id: "592"
-tags:
-  - createmedia.nrw
-  - facebook
-  - graph-api
-  - java
-  - oauth2
-  - spring
-  - spring-boot
-  - spring-social
-title: 'Develop a Facebook-App with Spring-Social - Part II: How Spring Social Works'
-url: /develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works/
-
----
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social").
-
-In [the last part of this series](/develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes/ "Read part 1 of this series, to take a look behind the scenes!"), we took control of the autoconfiguration, that Spring Boot had put in place for us.
-But there is still a lot of magic in our little example, that was borrowed from [the offical "Getting Started"-guides](http://spring.io/guides/gs/accessing-facebook/ "Read the official guide") or at least, it looks so.
-
-## First Time In The Electric-Wonder-Land
-
-When I first run the example, I wondered like _"Wow, how does this little piece of code figures out which data to fetch? How is Spring Social told, which data to fetch? That must be stored in the session, or so! But where is that configured?"_ and so on and so on.
-
-When we connect to Facebook, Facebook tells Spring Social, which user is logged in and if this user authorizes the requested access.
-We get an access-token from facebook, that can be used to retrieve user-related data from the Graph-API.
-Our application has to manage this data.
-
-Spring Social assists us on that task.
-But in the end, we have to make the decisions, how to deal with it.
-
-## Whom Are You Intrested In?
-
-Spring Social provides the concept of a `ConnectionRepository`, which is used to persist the connections of specific user.
-Spring Social also provides the concept of a `UsersConnectionRepository`, which stores, whether a user is connected to a specific social service or not.
-As described in [the official documentation](http://docs.spring.io/spring-social/docs/1.1.4.RELEASE/reference/htmlsingle/#configuring-connectcontroller "For further details, please read  the official implementations"), Spring Social uses the `UsersConnectionRepository` to create a request-scoped `ConnectionRepository` bean (the bean named `facebook` in [our little example](/develop-a-facebook-app-with-spring-social-part-00/#HomeController "Go back to part 00, to reread the code-example, that uses this bean to access the facebook-data")), that is used by us to access the Graph-API.
-
-**But to be able to do so, it must know _which user_ we are interested in!**
-
-Hence, Spring Social requires us to configure a `UserIdSource`.
-Every time, when it prepares a request for us, Spring Social will ask this source, which user we are interested in.
-
-Attentive readers might have noticed, that we have configured such a source, when we were [explicitly rebuilding](/develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes/ "Jump back to re-read our explicitly rebuild configuration") the automatic default-configuration of Spring Boot:
-
-```Java
-public class AnonymousUserIdSource implements UserIdSource
-{
-  @Override
-  public String getUserId()
-  {
-    return "anonymous";
-  }
-}
-
-```
-
-## No One Special...
-
-But what is that?!?
-All the time we are only interested in one and the same user, whose connections should be stored under the key `anonymous`?
-
-**And what will happen, if a second user connects to our app?**
-
-## Let's Test That!
-
-To see what happens, if more than one user connects to your app, you have to create a [test user](https://developers.facebook.com/docs/apps/test-users "Read more about test users").
-This is very simple.
-Just go to the dashboard of your app, select the menu-item _"Roles"_ and click on the tab _"Test Users"_.
-Select a test user (or create a new one) and click on the _"Edit"_-button.
-There you can select _"Log in as this test user"_.
-
-**If you first connect to the app as yourself and afterwards as test user, you will see, that your data is presented to the test user.**
-
-That is, because we are telling Spring Social that every user is called `anonymous`.
-Hence, every user is the same for Spring Social!
-When the test user fetches the page, after you have connected to Facebook as yourself, Spring-Social is thinking, that the same user is returning and serves your data.
-
-## Coming next...
-
-In [the next part](develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source "Jump to the next part of this series and read on...") of this series, we will try to teach Spring Social to distinguish between several users.
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source.md b/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source.md
deleted file mode 100644 (file)
index f3241df..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - howto
-date: "2016-01-25T13:43:26+00:00"
-guid: http://juplo.de/?p=613
-parent_post_id: null
-post_id: "613"
-tags:
-  - createmedia.nrw
-  - facebook
-  - graph-api
-  - java
-  - oauth2
-  - spring
-  - spring-boot
-  - spring-social
-title: 'Develop a Facebook-App with Spring-Social – Part III: Implementing a UserIdSource'
-url: /develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source/
-
----
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social")
-
-In [the last part of this series](/develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works/ "Read part 2 of this series, to understand, why the first example cannot work as a real app!"), I explained, why the nice little example from the Getting-Started-Guide " [Accessing Facebook Data](http://spring.io/guides/gs/accessing-facebook/ "Read the official Getting-Started-Guide")" cannot function as a real facebook-app.
-
-In this part, we will try to solve that problem, by implementing a `UserIdSource`, that tells Spring Social, which user it should connect to the API.
-
-## The Source is With You
-
-You can find the source-code on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
-and [browse it via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
-Check out `part-03` to get the source for this part of the series.
-
-## Introducing `UserIdSource`
-
-The `UserIdSource` is used by Spring Social to ask us, which user it should connect with the social net.
-Clearly, to answer that question, we must remeber, which user we are currently interested in!
-
-## Remember Your Visitors
-
-In order to remember the current user, we implement a simple mechanism, that stores the ID of the current user in a cookie and retrieves it from there for subsequent calls.
-This concept was borrowed — again — from [the official code examples](https://github.com/spring-projects/spring-social-samples "Clone the official code examples from GitHub").
-You can find it for example in the [quickstart-example](https://github.com/spring-projects/spring-social-samples/tree/master/spring-social-quickstart "Clone the quickstart-example from GitHub").
-
-**It is crucial to stress, that this concept is inherently insecure and should never be used in a production-environment.**
-As the ID of the user is stored in a cookie, an attacker could simply take over control by sending the ID of any currently connected user, he is interested in.
-
-The concept is implemented here only for educational purposes.
-It will be replaced by Spring Security later on.
-But for the beginning, it is easier to understand, how Spring Social works, if we implement a simple version of the mechanism ourself.
-
-## Pluging in Our New Memory
-
-The internals of our implementation are not of interest.
-You may explore them by yourself.
-In short, it stores the ID of each new user in a cookie.
-By inspecting that cookie, it can restore the ID of the user on subsequent calls.
-
-What is from interest here is, how we can plug in this simple example-mechanism in Spring Social.
-
-Mainly, there are two hooks to do that, that means: two interfaces, we have to implement:
-
-1. **UserIdSource**:
-   Spring Social uses an instance of this interface to ask us, which users authorizations it should load from its persistent store of user/connection-mappings.
-   We already have seen an implementation of that one in [the last part of our series](develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works/#AnonymousUserIdSource "Jump back to the last part of our series").
-
-1. **ConnectionSignUp**:
-   Spring Social uses an instance of this interface, to ask us about the name it should use for a new user during sign-up.
-
-## Implementation
-
-The implementation of `ConnectionSignUp` simply uses the ID, that is provided by the social network.
-Since we are only signing in users from Facebook, these ID's are guaranteed to be unique.
-
-```Java
-public class ProviderUserIdConnectionSignUp implements ConnectionSignUp
-{
-  @Override
-  public String execute(Connection connection)
-  {
-    return connection.getKey().getProviderUserId();
-  }
-}
-
-```
-
-The implementation of `UserIdSource` retrieves the ID, that was stored in the `SecurityContext` (our simple implementation — not to be confused with the class from Spring Security).
-If no user is stored in the `SecurityContext`, it falls back to the old behavior and returns the fix id `anonymous`.
-
-```Java
-public class SecurityContextUserIdSource implements UserIdSource
-{
-  private final static Logger LOG =
-      LoggerFactory.getLogger(SecurityContextUserIdSource.class);
-
-  @Override
-  public String getUserId()
-  {
-    String user = SecurityContext.getCurrentUser();
-    if (user != null)
-    {
-      LOG.debug("found user \"{}\" in the security-context", user);
-    }
-    else
-    {
-      LOG.info("found no user in the security-context, using \"anonymous\"");
-      user = "anonymous";
-    }
-    return user;
-  }
-}
-
-```
-
-## Actual Plumbing
-
-To replace the `AnonymousUserIdSource` by our new implementation, we simply instantiate that instead of the old one in our configuration-class `SocialConfig`:
-
-```Java
-@Override
-public UserIdSource getUserIdSource()
-{
-  return new SecurityContextUserIdSource();
-}
-
-```
-
-There are several ways to plug in the `ConnectionSignUp`.
-I decided, to plug it into the instance of `InMemoryUsersConnectionRepository`, that our configuration uses, because this way, the user will be signed up automatically on sign in, if it is not known to the application:
-
-```Java
-@Override
-public UsersConnectionRepository getUsersConnectionRepository(
-    ConnectionFactoryLocator connectionFactoryLocator
-    )
-{
-  InMemoryUsersConnectionRepository repository =
-      new InMemoryUsersConnectionRepository(connectionFactoryLocator);
-  repository.setConnectionSignUp(new ProviderUserIdConnectionSignUp());
-  return repository;
-}
-
-```
-
-This makes sense, because our facebook-app uses Facebook, to sign in its users, and, because of that, does not have its own user-model.
-It can just reuse the user-data provided by facebook.
-
-The other approach would be, to officially sign up users, that are not known to the app.
-This is achieved, by redirecting to a special URL, if a sign-in fails, because the user is unknown.
-These URL then presents a formular for sign-up, which can be prepopulated with the user-data provided by the social network.
-You can read more about this approach in the [official documentation](http://docs.spring.io/spring-social/docs/1.1.4.RELEASE/reference/htmlsingle/#signing-up-after-a-failed-sign-in "Read more on signing up after a faild sign-in in the official documentation").
-
-## Run It!
-
-So, let us see, if our refinement works. Run the following command and log into your app with at least two different users:
-
-```bash
-git clone /git/examples/facebook-app/
-cd facebook-app
-checkout part-00
-mvn spring-boot:run \
-    -Dfacebook.app.id=YOUR_ID \
-    -Dfacebook.app.secret=YOUR_SECRET \
-    -Dlogging.level.de.juplo.yourshouter=debug
-
-```
-
-(The last part of the command turns on the `DEBUG` logging-level, to see in detail, what is going on.
-
-## But What The \*\#! Is Going On There?!?
-
-**Unfortunately, our application shows exactly the same behavior as, before our last refinement.**
-Why that?
-
-If you run the application in a debugger and put a breakpoint in our implementation of `ConnectionSignUp`, you will see, that this code is never called.
-But it is plugged in in the right place and should be called, if _a new user signs in_!
-
-The solution is, that we are using the wrong mechanism.
-We are still using the `ConnectController` which was configured in the simple example, we extended.
-But this controller is meant to connect a _known user_ to one or more _new social services_.
-This controller assumes, that the user is already signed in to the application and can be retrieved via the configured `UserIdSource`.
-
-**To sign in a user to our application, we have to use the `ProviderSignInController` instead!**
-
-## Coming next...
-
-In [the next part](/develop-a-facebook-app-with-spring-social-part-04-signing-in-users "Jump to the next part of this series and read on...") of this series, I will show you, how to change the configuration, so that the `ProviderSignInController` is used to sign in (and automatically sign up) users, that were authenticated through the Graph-API from Facebook.
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-04-signing-in-users.md b/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-04-signing-in-users.md
deleted file mode 100644 (file)
index fd02246..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - howto
-date: "2016-01-25T17:59:59+00:00"
-guid: http://juplo.de/?p=626
-parent_post_id: null
-post_id: "626"
-tags:
-  - createmedia.nrw
-  - facebook
-  - graph-api
-  - java
-  - oauth2
-  - spring
-  - spring-boot
-  - spring-social
-title: 'Develop a Facebook-App with Spring-Social – Part IV: Signing In Users'
-url: /develop-a-facebook-app-with-spring-social-part-04-signing-in-users/
-
----
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social")
-
-In [the last part of this series](/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source "Go back to part 3 of this series, to learn how you plug in user-recognition into Spring Social"), we tried to teach Spring Social how to remember our signed in users and learned, that we have to sign in a user first.
-
-In this part, I will show you, how you sign (and automatically sign up) users, that are authenticated via the Graph-API.
-
-## The Source is With You
-
-You can find the source-code on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
-and [browse it via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
-Check out `part-04` to get the source for this part of the series.
-
-## In Or Up? Up And In!
-
-In the last part of our series we ran in the problem, that we wanted to connect several (new) users to our application.
-We tried to achieve that, by extending our initial configuration.
-But the mistake was, that we tried to _connect_ new users.
-In the world of Spring Social we can only connect a _known user_ to a _new social service_.
-
-To know a user, Spring Social requires us to _sign in_ that user.
-But again, if you try to _sign in_ a _new user_, Spring Social requires us to _sign up_ that user first.
-Because of that, we had already implemented a [`ConnectionSignUp`](/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source/#ProviderUserIdConnectionSignUp "Jump back to the last part and view the source of our implementation") and [configured Spring Social to call it](/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source/#plumbing-ConnectionSignUp "Jump back to the last part to view how we pluged in our ConnectionSignUp"), whenever it does not know a user, that was authenticated by Facebook.
-If you forget that (or if you remove the according configuration, that tells Spring Social to use our `ConnectionSignUp`), Spring Social will redirect you to the URL `/signup` — a Sign-Up page you have to implement — after a successfull authentication of a user, that Spring Social does not know yet.
-
-The confusion — or, to be honest, _my_ confusion — about _sign in_ and _sign up_ arises from the fact, that we are developing a Facebook-Application.
-We do not care about signing up users.
-Each user, that is known to Facebook — that is, who has signed up to Facebook — should be able to use our application.
-An explicit sign-up to our application is not needed and not wanted.
-So, in our use-case, we have to implement the automatically sign-up of new users.
-But Spring Social is designed for a much wider range of use cases.
-Hence, it has to distinguish between sign-in and sign-up.
-
-## Implementation Of The Sign-In
-
-Spring Social provides the interface `SignInAdapter`, that it calls every time, it has authenticated a user against a social service.
-This enables us, to be aware of that event and remember the user for subsequent calls.
-Our implementation stores the user in our `SecurityContext` to sign him in and creates a cookie to remember him for subsequent calls:
-
-```Java
-public class UserCookieSignInAdapter implements SignInAdapter
-{
-  private final static Logger LOG =
-      LoggerFactory.getLogger(UserCookieSignInAdapter.class);
-
-  @Override
-  public String signIn(
-      String user,
-      Connection connection,
-      NativeWebRequest request
-      )
-  {
-    LOG.info(
-        "signing in user {} (connected via {})",
-        user,
-        connection.getKey().getProviderId()
-        );
-    SecurityContext.setCurrentUser(user);
-    UserCookieGenerator
-        .INSTANCE
-        .addCookie(usSigning In Userser, request.getNativeResponse(HttpServletResponse.class));
-
-    return null;
-  }
-}
-
-```
-
-It returns `null`, to indicate, that the user should be redirected to the default-URL after an successful sign-in.
-This URL can be configured in the `ProviderSignInController` and defaults to `/`, which matches our use-case.
-If you return a string here, for example `/welcome.html`, the controller would ignore the configured URL and redirect to that URL after a successful sign-in.
-
-## Configuration Of The Sign-In
-
-To enable the Sign-In, we have to plug our `SignInAdapter` into the `ProviderSignInController`:
-
-```Java
-@Bean
-public ProviderSignInController signInController(
-    ConnectionFactoryLocator factoryLocator,
-    UsersConnectionRepository repository
-    )
-{
-  ProviderSignInController controller = new ProviderSignInController(
-      factoryLocator,
-      repository,
-      new UserCookieSignInAdapter()
-      );
-  return controller;
-}
-
-```
-
-Since we are using Spring Boot, an alternative configuration would have been to just create a bean-instance of our implementation named `signInAdapter`.
-Then, the auto-configuration of Spring Boot would discover that bean, create an instance of `ProviderSignInController` and plug in our implementation for us.
-If you want to learn, how that works, take a look at the implementation of the auto-configuration in the class [SocialWebAutoConfiguration](https://github.com/spring-projects/spring-boot/blob/v1.3.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java#L112 "Jump to GitHub to study the implementation of the SocialWebAutoConfiguration"), lines 112ff.
-
-## Run it!
-
-If you run our refined example and visit it after impersonating different facebook-users, you will see that everything works as expected now.
-If you visit the app for the first time (after a restart) with a new user, the user is signed up and in automatically and a cookie is generated, that stores the Facebook-ID of the user in the browser.
-On subsequent calls, his ID is read from this cookie and the corresponding connection is restored from the persistent store by Spring Social.
-
-## Coming Next...
-
-In [the next part](/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic "Jump to the next part of this series and read on...") of this little series, we will move the redirect-if-unknown logic from our `HomeController` into our `UserCookieInterceptor`, so that the behavior of our so-called "security"-concept more closely resembles the behavior of Spring Security.
-That will ease the migration to that solution in a later step.
-
-Perhaps you want to skip that, rather short and boring step and jump to the part after the next, that explains, how to sign in users by the `signed_request`, that Facebook sends, if you integrate your app as a canvas-page.
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic.md b/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic.md
deleted file mode 100644 (file)
index 2f571ba..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - howto
-date: "2016-01-26T14:34:23+00:00"
-guid: http://juplo.de/?p=644
-parent_post_id: null
-post_id: "644"
-tags:
-  - createmedia.nrw
-  - facebook
-  - graph-api
-  - java
-  - oauth2
-  - spring
-  - spring-boot
-  - spring-social
-title: 'Develop a Facebook-App with Spring-Social – Part V: Refactor The Redirect-Logic'
-url: /develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic/
-
----
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social")
-
-In [the last part of this series](/develop-a-facebook-app-with-spring-social-part-04-signing-in-users "Go back to part 4 of this series, to learn how to sign in users"), we reconfigured our app, so that users are signed in after an authentication against Facebook and new users are signed up automatically on the first visit.
-
-In this part, we will refactor our redirect-logic for unauthenticated users, so that it more closely resembles the behavior of Spring Social, hence, easing the planed switch to that technology in a feature step.
-
-## The Source is With You
-
-You can find the source-code on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
-and [browse it via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
-Check out `part-05` to get the source for this part of the series.
-
-## Mimic Spring Security
-
-**To stress that again: our simple authentication-concept is only meant for educational purposes. [It is inherently insecure!](/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source#remember "Jump back to part 3 to learn, why our authentication-concept is insecure")**
-We are not refining it here, to make it better or more secure.
-We are refining it, so that it can be replaced with Spring Security later on, without a hassle!
-
-In our current implementation, a user, who is not yet authenticated, would be redirected to our sign-in-page only, if he visits the root of our webapp ( `/`).
-To move all redirect-logic out of `HomeController` and redirect unauthenicated users from all pages to our sign-in-page, we can simply modify our interceptor `UserCookieInterceptor`, which already intercepts each and every request.
-
-We refine the method `preHandle`, so that it redirects every request to our sign-in-page, that is not authenticated:
-
-```Java
-@Override
-public boolean preHandle(
-    HttpServletRequest request,
-    HttpServletResponse response,
-    Object handler
-    )
-    throws
-      Exception
-{
-  if (request.getServletPath().startsWith("/signin"))
-    return true;
-
-  String user = UserCookieGenerator.INSTANCE.readCookieValue(request);
-  if (user != null)
-  {
-    if (!repository
-        .findUserIdsConnectedTo("facebook", Collections.singleton(user))
-        .isEmpty()
-        )
-    {
-      LOG.info("loading user {} from cookie", user);
-      SecurityContext.setCurrentUser(user);
-      return true;
-    }
-    else
-    {
-      LOG.warn("user {} is not known!", user);
-      UserCookieGenerator.INSTANCE.removeCookie(response);
-    }
-  }
-
-  response.sendRedirect("/signin.html");
-  return false;
-}
-
-```
-
-If the user, that is identified by the cookie, is not known to Spring Security, we send a redirect to our sign-in-page and flag the request as already handled, by returning `false`.
-To prevent an endless loop of redirections, we must not redirect request, that were already redirected to our sign-in-page.
-Since these requests hit our webapp as a new request for the different location, we can filter out and wave through at the beginning of this method.
-
-## Run It!
-
-That is all there is to do.
-Run the app and call the page `http://localhost:8080/profile.html` as first request.
-You will see, that you will be redirected to our sigin-in-page.
-
-## Cleaning Up Behind Us...
-
-As it is now not possible, to call any page except the sigin-up-page, without beeing redirected to our sign-in-page, if you are not authenticated, it is impossible to call any page without being authenticated.
-Hence, we can (and should!) refine our `UserIdSource`, to throw an exception, if that happens anyway, because it has to be a sign for a bug:
-
-```Java
-public class SecurityContextUserIdSource implements UserIdSource
-{
-
-  @Override
-  public String getUserId()
-  {
-    Assert.state(SecurityContext.userSignedIn(), "No user signed in!");
-    return SecurityContext.getCurrentUser();
-  }
-}
-
-```
-
-## Coming Next...
-
-In the next part of this series, we will enable users to sign in through the canvas-page of our app.
-The canvas-page is the page that Facebook embeds into its webpage, if we render our app inside of Facebook.
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page.md b/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page.md
deleted file mode 100644 (file)
index 3ed3ef5..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - howto
-date: "2016-01-26T16:05:28+00:00"
-guid: http://juplo.de/?p=671
-parent_post_id: null
-post_id: "671"
-tags:
-  - createmedia.nrw
-  - facebook
-  - graph-api
-  - java
-  - oauth2
-  - spring
-  - spring-boot
-  - spring-social
-title: 'Develop a Facebook-App with Spring-Social – Part VI: Sign In Users Through The Canvas-Page'
-url: /develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page/
-
----
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social")
-
-In [the last part of this series](/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic/ "Read part 5 of this series"), we refactored our authentication-concept, so that it can be replaced by Spring Security later on more easy.
-
-In this part, we will turn our app into a real Facebook-App, that is rendered inside Facebook and signs in users through the `signed_request`.
-
-## The Source is With You
-
-You can find the source-code on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
-and [browse it via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
-Check out `part-06` to get the source for this part of the series.
-
-## What The \*\#&! Is a `signed_request`
-
-If you add the platform **Facebook Canvas** to your app, you can present your app inside of Facebook.
-It will be accessible on a URL like **`https://apps.facebook.com/YOUR_NAMESPACE`** then and if a (known!) user accesses this URL, facebook will send a [`signed_request`](https://developers.facebook.com/docs/reference/login/signed-request "Read more about the fields, that are contained in the signed_request"), that already contains some data of this user an an authorization to retrieve more.
-
-## Sign In Users With `signed_request` In 5 Simple Steps
-
-As I first tried to extend the [simple example](http://spring.io/guides/gs/accessing-facebook/ "Read the original guide, this article-series is based on"), this article-series is based on, I stumbled across multiple misunderstandings.
-But now, as I guided you around all that obstacles, it is fairly easy to refine our app, so that is can sign in users through the signed\_request, send to a Canvas-Page.
-
-You just have to:
-
-1. Add the platform "Facebook Canvas" in the settings of your app and choose a canvas-URL.
-1. Reconfigure your app to support HTTPS, because Facebook requires the canvas-URL to be secured by SSL.
-1. Configure the `CanvasSignInController`.
-1. Allow the URL of the canvas-page to be accessed unauthenticated.
-1. Enable Sign-Up throw your canvas-page.
-
-That is all, there is to do.
-But now, step by step...
-
-## Step 1: Turn Your App Into A Canvas-Page
-
-Go to the settings-panel of your app on [https://developers.facebook.com/apps](https://developers.facebook.com/apps "Log in to your developer-account on Facebook now") and click on _Add Platform_.
-Choose _Facebook Canvas_.
-Pick a secure URL, where your app will serve the canvas-page.
-
-For example: `https://localhost:8443`.
-
-Be aware, that the URL has to be publicly available, if you want to enable other users to access your app.
-But that also counts for the Website-URL `http://localhost:8080`, that we are using already.
-
-Just remember, if other people should be able to access your app later, you have to change these URL's to something, they can access, because all the content of your app is served by you, not by Facebook.
-A Canvas-App just embedds your content in an iFrame inside of Facebook.
-
-## Step 2: Reconfigure Your App To Support HTTPS
-
-Add the following lines to your `src/main/resources/application.properties`:
-
-```properties
-server.port: 8443
-server.ssl.key-store: keystore
-server.ssl.key-store-password: secret
-
-```
-
-I have included a self-signed `keystore` with the password `secret` in the source, that you can use for development and testing.
-But of course, later, you have to create your own keystore with a certificate that is signed by an official certificate authority, that is known by the browsers of your users.
-
-Since your app now listens on `8443` an uses `HTTPS`, you have to change the URL, that is used for the platform "Website", if you want your sign-in-page to continue to work in parallel to the sign-in through the canvas-page.
-
-For now, you can simply change it to `https://locahost:8443/` in the settings-panel of your app.
-
-## Step 3: Configure the `CanvasSignInController`
-
-To actually enable the [automatic handling](https://developers.facebook.com/docs/games/gamesonfacebook/login#usingsignedrequest "Read about all the cumbersome steps, that would be necesarry, if you had to handle a signed_requst by yourself") of the `signed_request`, that is, decoding the `signed_request` and sign in the user with the data provided in the `signed_request`, you just have to add the `CanvasSignInController` as a bean in your `SocialConfig`:
-
-```Java
-@Bean
-public CanvasSignInController canvasSignInController(
-    ConnectionFactoryLocator connectionFactoryLocator,
-    UsersConnectionRepository usersConnectionRepository,
-    Environment env
-    )
-{
-  return
-      new CanvasSignInController(
-          connectionFactoryLocator,
-          usersConnectionRepository,
-          new UserCookieSignInAdapter(),
-          env.getProperty("facebook.app.id"),
-          env.getProperty("facebook.app.secret"),
-          env.getProperty("facebook.app.canvas")
-          );
-}
-
-```
-
-## Step 4: Allow the URL Of Your Canvas-Page To Be Accessed Unauthenticated
-
-Since [we have "secured" all of our pages](/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic "Read more about the refactoring, that ensures, that every request, that is made to our app, is authenticated") except of our sign-in-page `/signin*`, so that they can only be accessed by an authenticated user, we have to explicitly allow unauthenticated access to our new special sign-in-page.
-
-To achieve that, we have to refine our [`UserCookieInterceptor`](/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic#redirect "Compare the changes to the unchanged method of our UserCookieInterceptor") as follows.
-First add a pattern for all pages, that are allowed to be accessed unauthenticated:
-
-```Java
-private final static Pattern PATTERN = Pattern.compile("^/signin|canvas");
-
-```
-
-Then match the requests against this pattern, instead of the fixed string `/signin`:
-
-```Java
-if (PATTERN.matcher(request.getServletPath()).find())
-  return true;
-
-```
-
-## Step 5: Enable Sign-Up Through Your Canvas-Page
-
-Facebook always sends a `signed_request` to your app, if a user visits your app through the canvas-page.
-But on the first visit of a user, the `signed_request` does not authenticate the user.
-In this case, the only data that is presented to your page is the language and locale of the user and his or her age.
-
-Because the data, that is needed to sign in the user, is missing, the `CanvasSignInController` will issue an explicit authentication-request to the Graph-API via a so called [Server-Side Log-In](https://developers.facebook.com/docs/games/gamesonfacebook/login#serversidelogin "Read more details about the process of a Server-Side Log-In on Facebook").
-This process includes a redirect to the Login-Dialog of Facebook and then a second redirect back to your app.
-It requires the specification of a full absolute URL to redirect back to.
-
-Since we are configuring the canvas-login-in, we want, that new users are redirected to the canvas-page of our app.
-Hence, you should use the Facebook-URL of your app: `https://apps.facebook.com/YOUR_NAMESPACE`.
-This will result in a call to your canvas-page with a `signed_request`, that authenticates the new user, if the user accepts to share the requested data with your app.
-
-Any other page of your app would work as well, but the result would be a call to the stand-alone version of your app (the version of your app that is called the "Website"-platform of your app by Facebook), meaning, that your app is not rendered inside of Facebook.
-Also it requires one more call of your app to the Graph-API to actually sign-in the new user, because Facebook sends the `signed_request` only the canvas-page of your app.
-
-To specify the URL I have introduced a new attribute `facebook.app.canvas` that is handed to the `CanvasSignInController`.
-You can specifiy it, when starting your app:
-
-```bash
-mvn spring-boot:run \
-    -Dfacebook.app.id=YOUR_ID \
-    -Dfacebook.app.secret=YOUR_SECRET \
-    -Dfacebook.app.canvas=https://apps.facebook.com/YOUR_NAMESPACE
-
-```
-
-Be aware, that this process requires the automatic sign-up of new users, that we enabled in [part 3](/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source#plumbing-UserIdSource "Jump back to part 3 of this series to reread, how we enabled the automatic sign-up") of this series.
-Otherwise, the user would be redirected to the sign-up-page of your application, after he allowed your app to access the requested data.
-Obviously, that would be very confusing for the user, so we really nead automati sign-up in this use-case!
-
-## Coming Next...
-
-In [the next part](/develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire/ "Jump to the next part of this series and learn how to turn on debugging for the HTTP-communication between your app and the Graph-API") of this series, I will show you, how you can debug the calls, that Spring Social makes to the Graph-API, by turning on the debugging of the classes, that process the HTTP-requests and -responses, that your app is making.
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire.md b/generated-2025-11-21-17-29-08/content/posts/develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire.md
deleted file mode 100644 (file)
index 8ba4d91..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
----
-_edit_last: "2"
-_wp_old_slug: develop-a-facebook-app-with-spring-social-part-07-whats-on-the-wire
-author: kai
-categories:
-  - howto
-date: "2016-01-29T09:18:33+00:00"
-guid: http://juplo.de/?p=694
-parent_post_id: null
-post_id: "694"
-tags:
-  - createmedia.nrw
-  - facebook
-  - graph-api
-  - java
-  - oauth2
-  - spring
-  - spring-boot
-  - spring-social
-title: 'Develop a Facebook-App with Spring-Social – Part VII: What is Going On On The Wire'
-url: /develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire/
-
----
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of [Spring-Social](http://projects.spring.io/spring-social/ "Learn more about Spring-Social")
-
-In [the last part of this series](/develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page "Read part 6 of this series to learn, how you turn your spring-social-app into a real facebook-app"), I showed you, how you can sign-in your users through the `signed_request`, that is send to your canvas-page.
-
-In this part, I will show you, how to turn on logging of the HTTP-requests, that your app sends to, and the -responses it recieves from the Facebook Graph-API.
-
-## The Source is With You
-
-You can find the source-code on [/git/examples/facebook-app/](/git/examples/facebook-app/ "Link for cloning")
-and [browse it via gitweb](/gitweb/?p=examples/facebook-app;a=summary "Browse the source-code now").
-Check out `part-07` to get the source for this part of the series.
-
-## Why You Want To Listen On The Wire
-
-If you are developing your app, you will often wonder, why something does not work as expected.
-In this case, it is often very usefull to be able to debug the communitation between your app and the Graph-API.
-But since all requests to the Graph-API are secured by SSL you can not simply listen in with tcpdump or wireshark.
-
-Fortunately, you can turn on the debugging of the underling classes, that process theses requests, to sidestep this problem.
-
-## Introducing HttpClient
-
-In its default-configuration, the Spring Framework will use the `HttpURLConnection`, which comes with the JDK, as http-client.
-As described in the [documentation](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#rest-client-access "Read more about that in the Spring-documentation"), some advanced methods are not available, when using `HttpURLConnection`
-Besides, the package [`HttpClient`](https://hc.apache.org/httpcomponents-client-4.5.x/index.html "Visit the project home of Apache HttpClient"), which is part of Apaches `HttpComponents` is a much more mature, powerful and configurable alternative.
-For example, you easily can plug in connection pooling, to speed up the connection handling, or caching to reduce the amount of requests that go through the wire.
-In production, you should always use this implementation, instead of the default-one, that comes with the JDK.
-
-Hence, we will switch our configuration to use the `HttpClient` from Apache, before turning on the debug-logging.
-
-## Switching From Apaches `HttpCompnents` To `HttpClient`
-
-To siwtch from the default client, that comes with the JDK to Apaches `HttpClient`, you have to configure an instance of `HttpComponentsClientHttpRequestFactory` as `HttpRequestFactory` in your `SocialConfig`:
-
-```Java
-@Bean
-public HttpComponentsClientHttpRequestFactory requestFactory(Environment env)
-{
-  HttpComponentsClientHttpRequestFactory factory =
-      new HttpComponentsClientHttpRequestFactory();
-  factory.setConnectTimeout(
-      Integer.parseInt(env.getProperty("httpclient.timeout.connection"))
-      );
-  factory.setReadTimeout(
-      Integer.parseInt(env.getProperty("httpclient.timeout.read"))
-      );
-  return factory;
-}
-
-```
-
-To use this configuration, you also have to add the dependency `org.apache.httpcomonents:httpclient` in your `pom.xml`.
-
-As you can see, this would also be the right place to enable other specialized configuration-options.
-
-## Logging The Headers From HTTP-Requests And Responses
-
-I configured a short-cut to enable the logging of the HTTP-headers of the communication between the app and the Graph-API.
-Simply run the app with the additionally switch `-Dhttpclient.logging.level=DEBUG`
-
-## Take Full Control
-
-If the headers are not enough to answer your questions, you can enable a lot more debugging messages.
-You just have to overwrite the default logging-levels.
-Read [the original documentation of `HttpClient`](https://hc.apache.org/httpcomponents-client-4.5.x/logging.html "Jump to the logging-guide form HttpClient now."), for more details.
-
-For example, to enable logging of the headers and the content of all requests, you have to start your app like this:
-
-```bash
-mvn spring-boot:run \
-    -Dfacebook.app.id=YOUR_ID \
-    -Dfacebook.app.secret=YOUR_SECRET \
-    -Dfacebook.app.canvas=https://apps.facebook.com/YOUR_NAMESPACE
-    -Dlogging.level.org.apache.http=DEBUG \
-    -Dlogging.level.org.apache.http.wire=DEBUG
-
-```
-
-The second switch is necessary, because I defined the default-level `ERROR` for that logger in our `src/main/application.properties`, to enable the short-cut for logging only the headers.
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can.md b/generated-2025-11-21-17-29-08/content/posts/disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can.md
deleted file mode 100644 (file)
index 07c7d00..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - html(5)
-  - wordpress
-date: "2018-07-20T11:23:50+00:00"
-guid: http://juplo.de/?p=255
-parent_post_id: null
-post_id: "255"
-title: Disable automatic p and br tags in the wordpress editor - and do it as early, as you can!
-url: /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/
-
----
-## Why you should disable them as early, as you can
-
-I don't like visual HTML-editors, because they always mess up your HTML. So the first thing, that I've done in my wordpress-profile, was checking the check-box `Disable the visual editor when writing`.
-But today I found out, that this is worth nothing.
-Even when in text-mode, wordpress is adding some `<p>-` and `<br>`-tags automagically and, hence, is automagically messing up my neatly hand-crafted HTML-code.
-
-**Fuck wordpress!** _(Ehem - sorry for that outburst)_...
-
-But what is even worse: after [really turning off wordpress's automagically-messup-functionality](#disable "Jump to the tech-section, if you only want to find out, how to disable wordpress's auto-messup functionality"), nearly all my handwritten `<p>`-tags were gone, too.
-So, if you want to turn of automatic `<p>-` and `<br>`-tags, you should really do it as early, as you can. Otherwise, you will have to clean up all your old posts afterwards like me. TI've lost some hours with usless HTML-editing today, because of that sh#%&\*!
-
-## How to disable them
-
-The [wordpress-documentation of the build-in HTML-editor](https://codex.wordpress.org/TinyMCE#Automatic_use_of_Paragraph_Tags) links to [this post](http://redrokk.com/2010/08/16/removing-p-tags-in-wordpress/), which describs how to disable autmatic use of paragraph tags.
-Simple open the file `wp-includes/default-filters.php` of you wordpress-installation and comment out the following line:
-
-```html
-
-addfilter('the_content', 'wpautop');
-
-```
-
-If you are building your own wordpress-theme - like me - you alternatively can add the following to the `functions.php`-file of your theme:
-
-```html
-
-remove_filter('the_content', 'wpautop');
-
-```
-
-## Why you should disable automatic paragraph tags
-
-For example, I was wondering a while, where all that whitespace in my posts were coming from.
-Being used to handcraft my HTML, I often wrote one sentence per line, or put some empty lines inbetween to clearly arange my code.
-There comes wordpress, messing everything up by automagically putting every sentence in its own paragraph, because it was written on its own line and putting `<br>` inbetween, to reflect my empty lines.
-
-But even worse, wordpress also puts these unwanted `<p>`-tags [arround HTML-code, that breaks because of it](http://wordpress.org/support/topic/disable-automatic-p-and-br-tags-in-html-editor "Another example is described in this forum-request. One guy puts a plugin in his post, but it does not work, because wordpress automagically messed up his HTML...").
-For example, I eventually found out about this auto-messup functionallity, because I was checking my blog-post with a [html-validator](http://validator.w3.org/) and was wondering, why the validator was grumping about a `<quote>`-tag inside [flow content](http://dev.w3.org/html5/html-author/#flow-content), which I've never put there. It turned out, that wordpress had put it there for me...
diff --git a/generated-2025-11-21-17-29-08/content/posts/disable-spring-autowireing-for-junit-tests.md b/generated-2025-11-21-17-29-08/content/posts/disable-spring-autowireing-for-junit-tests.md
deleted file mode 100644 (file)
index b6093c7..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-date: "2014-04-01T08:46:44+00:00"
-draft: "true"
-guid: http://juplo.de/?p=283
-parent_post_id: null
-post_id: "283"
-title: Disable Spring-Autowireing for Junit-Tests
-url: /
-
----
-```java
-
-import java.beans.PropertyDescriptor;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.PropertyValues;
-import org.springframework.beans.factory.BeanCreationException;
-import org.springframework.beans.factory.BeanFactory;
-import org.springframework.beans.factory.NoSuchBeanDefinitionException;
-import org.springframework.beans.factory.support.RootBeanDefinition;
-import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
-
-/**
- * Swallows all {@link NoSuchBeanDefinitionException}s, and
- * {@link BeanCreationException}s, that might be thrown
- * during autowireing.
- *
- * @author kai@juplo.de
- */
-public class ForgivableCommonAnnotationBeanPostProcessor
-    extends
-      CommonAnnotationBeanPostProcessor
-{
-  private static final Logger log =
-      LoggerFactory.getLogger(ForgivableCommonAnnotationBeanPostProcessor.class);
-
-  @Override
-  protected Object autowireResource(BeanFactory factory, LookupElement element, String requestingBeanName) throws BeansException
-  {
-    try
-    {
-       return super.autowireResource(factory, element, requestingBeanName);
-    }
-    catch (NoSuchBeanDefinitionException e)
-    {
-      log.warn(e.getMessage());
-      return null;
-    }
-  }
-
-  @Override
-  public Object postProcessBeforeInitialization(Object bean, String beanName)
-  {
-    try
-    {
-      return super.postProcessBeforeInitialization(bean, beanName);
-    }
-    catch (BeanCreationException e)
-    {
-      log.warn(e.getMessage());
-      return bean;
-    }
-  }
-}
-
-```
diff --git a/generated-2025-11-21-17-29-08/content/posts/enabling-decoupled-template-logic-for-thymeleaf-in-a-spring-boot-app.md b/generated-2025-11-21-17-29-08/content/posts/enabling-decoupled-template-logic-for-thymeleaf-in-a-spring-boot-app.md
deleted file mode 100644 (file)
index afc905b..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-classic-editor-remember: classic-editor
-date: "2019-12-28T00:36:30+00:00"
-draft: "true"
-guid: http://juplo.de/?p=1004
-parent_post_id: null
-post_id: "1004"
-title: Enabling Decoupled Template Logic For Thymeleaf In A Spring-Boot App
-url: /
-
----
-
diff --git a/generated-2025-11-21-17-29-08/content/posts/encrypt-communication-between-kafka-and-zookeeper-with-tls.md b/generated-2025-11-21-17-29-08/content/posts/encrypt-communication-between-kafka-and-zookeeper-with-tls.md
deleted file mode 100644 (file)
index d2a2f3c..0000000
+++ /dev/null
@@ -1,342 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - howto
-classic-editor-remember: classic-editor
-date: "2020-09-25T23:23:17+00:00"
-guid: http://juplo.de/?p=881
-parent_post_id: null
-post_id: "881"
-tags:
-  - encryption
-  - java
-  - kafka
-  - security
-  - tls
-  - zookeeper
-title: Encrypt Communication Between Kafka And ZooKeeper With TLS
-url: /encrypt-communication-between-kafka-and-zookeeper-with-tls/
-
----
-## TL;DR
-
-1. Download and unpack [zookeeper+tls.tgz](/wp-uploads/zookeeper+tls.tgz).
-1. Run [README.sh](/wp-uploads/zookeeper+tls/README.sh) for a fully automated example of the presented setup.
-
-Copy and paste to execute the two steps on Linux:
-
-```bash
-curl -sc - /wp-uploads/zookeeper+tls.tgz | tar -xzv && cd zookeeper+tls && ./README.sh
-
-```
-
-A [german translation](https://www.trion.de/news/2019/06/28/kafka-zookeeper-tls.html "Hier findest du eine deutsche Übersetzung dieses Artikels") of this article can be found on [http://trion.de](https://www.trion.de/news/ "A lot of intresting posts about Java, Docker, Kubernetes, Spring Boot and so on can be found @trion").
-
-## Current Kafka Cannot Encrypt ZooKeeper-Communication
-
-Up until now ( [Version 2.3.0 of Apache Kafka](https://kafka.apache.org/documentation/#security_overview "Read more about the supported options in the original documentation of version 2.3.0")) it is not possible, to encrypt the communication between the Kafka-Brokers and their ZooKeeper-ensemble.
-This is not possiible, because ZooKeeper 3.4.13, which is shipped with Apache Kafka 2.3.0, lacks support for TLS-encryption.
-
-The documentation deemphasizes this, with the observation, that usually only non-sensitive data (configuration-data and status information) is stored in ZooKeeper and that it would not matter, if this data is world-readable, as long as it can be protected against manipulation, which can be done through proper authentication and ACL's for zNodes:
-
-> _The rationale behind this decision is that the data stored in ZooKeeper is not sensitive, but inappropriate manipulation of znodes can cause cluster disruption._ ( [Kafka-Documentation](https://kafka.apache.org/documentation/#zk_authz "Read the documentation about how to secure ZooKeeper"))
-
-This quote obfuscates the [elsewhere mentioned fact](https://kafka.apache.org/documentation/#security_sasl_scram_security "The security considerations for SASL/SCRAM are clearly stating, that ZooKeeper must be protected, because it stores sensitive authentication data in this case"), that there are use-cases that store sensible data in ZooKeeper.
-For example, if authentication via [SASL/SCRAM](https://kafka.apache.org/documentation/#security_sasl_scram_clientconfig "Read more about authentication via SASL/SCRAM") or [Delegation Tokens](https://kafka.apache.org/documentation/#security_delegation_token) is used.
-Accordingly, the documentation often stresses, that usually there is no need to make ZooKeeper accessible to normal clients.
-Nowadays, only admin-tools need direct access to the ZooKeeper-ensemble.
-Hence, it is stated as a best practice, to make the ensemble only available on a local network, hidden behind a firewall or such.
-
-**In cleartext: One must not run a Kafka-Cluster, that spans more than one data-center — or at least make sure, that all communication is tunneled through a virtual private network.**
-
-## ZooKeeper 3.5.5 To The Rescue
-
-On may the 20th 2019, [version 3.5.5 of ZooKeeper](http://zookeeper.apache.org/releases.html#releasenotes "Read the release notes") has been released.
-Version 3.5.5 is the first stable release of the 3.5.x branch, that introduces the support for TLS-encryption, the community has yearned for so long.
-It supports the encryption of all communication between the nodes of a ZooKeeper-ensemble and between ZooKeeper-Servers and -Clients.
-
-Part of ZooKeeper is a sophisticated client-API, that provide a convenient abstraction for the communication between clients and servers over the _Atomic Broadcast Protocol_.
-The TLS-encryption is applied by this API transparently.
-Because of that, all client-implementations can profit from this new feature through a simple library-upgrade from 3.4.13 to 3.5.5.
-**This article will walk you through an example, that shows how to carry out such a library-upgrade for Apache Kafka 2.3.0 and configure a cluster to use TLS-encryption, when communicating with a standalone ZooKeeper.**
-
-## Disclaimer
-
-**The presented setup is ment for evaluation only!**
-
-It fiddles with the libraries, used by Kafka, which might cause unforseen issues.
-Furthermore, using TLS-encryption in ZooKeeper requires one to switch from the battle-tested `NIOServerCnxnFactory`, which uses the [NIO-API](https://en.wikipedia.org/wiki/Non-blocking_I/O_(Java) "Learn more about non-blocking I/O in Java") directly, to the newly introduced `NettyServerCnxnFactory`, which is build on top of [Netty](https://netty.io/ "Learn more about Netty").
-
-## Recipe To Enable TLS Between Broker And ZooKeeper
-
-The article will walk you step by step through the setup now.
-If you just want to evaluate the example, you can [jump to the download-links](#scripts "I am so inpatient, just get me to the fully automated example").
-
-All commands must be executed in the same directory.
-We recommend, to create a new directory for that purpose.
-
-### Download Kafka and ZooKeeper
-
-First of all: Download version 2.3.0 of Apache Kafka and version 3.5.5 of Apache ZooKeeper:
-
-```bash
-curl -sc - http://ftp.fau.de/apache/zookeeper/zookeeper-3.5.5/apache-zookeeper-3.5.5-bin.tar.gz | tar -xzv
-curl -sc - http://ftp.fau.de/apache/kafka/2.3.0/kafka_2.12-2.3.0.tgz | tar -xzv
-
-```
-
-### Switch Kafka 2.3.0 from ZooKeeper 3.4.13 to ZooKeeper 3.5.5
-
-Remove the 3.4.13-version from the `libs`-directory of Apache Kafka:
-
-```bash
-rm -v kafka_2.12-2.3.0/libs/zookeeper-3.4.14.jar
-
-```
-
-Then copy the JAR's of the new version of Apache ZooKeeper into that directory. (The last JAR is only needed for CLI-clients, like for example `zookeeper-shell.sh`.)
-
-```bash
-cp -av apache-zookeeper-3.5.5-bin/lib/zookeeper-3.5.5.jar kafka_2.12-2.3.0/libs/
-cp -av apache-zookeeper-3.5.5-bin/lib/zookeeper-jute-3.5.5.jar kafka_2.12-2.3.0/libs/
-cp -av apache-zookeeper-3.5.5-bin/lib/netty-all-4.1.29.Final.jar kafka_2.12-2.3.0/libs/
-cp -av apache-zookeeper-3.5.5-bin/lib/commons-cli-1.2.jar kafka_2.12-2.3.0/libs/
-
-```
-
-That is all there is to do to upgrade ZooKeeper.
-If you run one of the Kafka-commands, it will use ZooKeeper 3.5.5. from now on.
-
-### Create A Private CA And The Needed Certificates
-
-_You can [read more about setting up a private CA in this post](/create-self-signed-multi-domain-san-certificates/ "Lern how to set up a private CA and create self-signed certificates")..._
-
-Create the root-certificate for the CA and store it in a Java-truststore:
-
-```bash
-openssl req -new -x509 -days 365 -keyout ca-key -out ca-cert -subj "/C=DE/ST=NRW/L=MS/O=juplo/OU=kafka/CN=Root-CA" -passout pass:superconfidential
-keytool -keystore truststore.jks -storepass confidential -import -alias ca-root -file ca-cert -noprompt
-
-```
-
-The following commands will create a self-signed certificate in **`zookeeper.jks`**.
-What happens is:
-
-1. Create a new key-pair and certificate for `zookeeper`
-1. Generate a certificate-signing-request for that certificate
-1. Sign the request with the key of private CA and also add a SAN-extension, so that the signed certificate is also valid for `localhost`
-1. Import the root-certificate of the private CA into the keystore `zookeeper.jks`
-1. Import the signed certificate for `zookeeper` into the keystore `zookeeper.jks`
-
-_You can [read more about creating self-signed certificates with multiple domains and building a Chain-of-Trust here](/create-self-signed-multi-domain-san-certificates/#sign-with-san "Lern how to sign certificates with SAN-extension")..._
-
-```bash
-NAME=zookeeper
-keytool -keystore $NAME.jks -storepass confidential -alias $NAME -validity 365 -genkey -keypass confidential -dname "CN=$NAME,OU=kafka,O=juplo,L=MS,ST=NRW,C=DE"
-keytool -keystore $NAME.jks -storepass confidential -alias $NAME -certreq -file cert-file
-openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out $NAME.pem -days 365 -CAcreateserial -passin pass:superconfidential -extensions SAN -extfile <(printf "\n[SAN]\nsubjectAltName=DNS:$NAME,DNS:localhost")
-keytool -keystore $NAME.jks -storepass confidential -import -alias ca-root -file ca-cert -noprompt
-keytool -keystore $NAME.jks -storepass confidential -import -alias $NAME -file $NAME.pem
-
-```
-
-Repeat this with:
-
-- **`NAME=kafka-1`**
-- **`NAME=kafka-2`**
-- **`NAME=client`**
-
-Now we have signed certificates for all participants in our small example, that are stored in separate keystores, each with a Chain-of-Trust set up, that is rooting in our private CA.
-We also have a truststore, that will validate all these certificates, because it contains the root-certificate of the Chain-of-Trust: the certificate of our private CA.
-
-### Configure And Start ZooKeeper
-
-_We hightlight/explain only the configuration-options here, that are needed for TLS-encryption!_
-
-In our setup, the standalone ZooKeeper essentially needs two specially tweaked configuration files, to use encryption.
-
-Create the file **`java.env`**:
-
-```bash
-SERVER_JVMFLAGS="-Xms512m -Xmx512m -Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory"
-ZOO_LOG_DIR=.
-
-```
-
-- The Java-Environmentvariable **`zookeeper.serverCnxnFactory`** switches the connection-factory to use the Netty-Framework.  
-**Without this, TLS is not possible!**
-
-Create the file **`zoo.cfg`**:
-
-```bash
-dataDir=/tmp/zookeeper
-secureClientPort=2182
-maxClientCnxns=0
-authProvider.1=org.apache.zookeeper.server.auth.X509AuthenticationProvider
-ssl.keyStore.location=zookeeper.jks
-ssl.keyStore.password=confidential
-ssl.trustStore.location=truststore.jks
-ssl.trustStore.password=confidential
-
-```
-
-- **`secureClientPort`**: We only allow encrypted connections!  
-(If we want to allow unencrypted connections too, we can just specify `clientPort` additionally.)
-- **`authProvider.1`**: Selects authentification through client certificates
-- **`ssl.keyStore.*`**: Specifies the path to and password of the keystore, with the `zookeeper`-certificate
-- **`ssl.trustStore.*`**: Specifies the path to and password of the common truststore with the root-certificate of our private CA
-
-Copy the file **`log4j.properties`** into the current working directory, to enable logging for ZooKeeper (see also `java.env`):
-
-```bash
-cp -av apache-zookeeper-3.5.5-bin/conf/log4j.properties .
-
-```
-
-Start the ZooKeeper-Server:
-
-```bash
-apache-zookeeper-3.5.5-bin/bin/zkServer.sh --config . start
-
-```
-
-- **`--config .`**: The script should search in the current directory for the configration data and certificates.
-
-### Konfigure And Start The Brokers
-
-_We hightlight/explain only the configuration-options and start-parameters here, that are needed to encrypt the communication between the Kafka-Brokers and the ZooKeeper-Server!_
-
-The other parameters shown here, that are concerned with SSL are only needed for securing the communication between the Brokers itself and between Brokers and Clients.
-You can read all about them in the [standard documentation](https://kafka.apache.org/documentation/#security).
-In short: This example is set up, to use SSL for authentication between the brokers and SASL/PLAIN for client-authentification — both channels are encrypted with TLS.
-
-TLS for the ZooKeeper Client-API is configured through Java-Environmentvariables.
-Hence, most of the SSL-configuration for connecting to ZooKeeper has to be specified, when starting the broker.
-Only the address and port for the connction itself is specified in the configuration-file.
-
-Create the file **`kafka-1.properties`**:
-
-```bash
-broker.id=1
-zookeeper.connect=zookeeper:2182
-listeners=SSL://kafka-1:9193,SASL_SSL://kafka-1:9194
-security.inter.broker.protocol=SSL
-ssl.client.auth=required
-ssl.keystore.location=kafka-1.jks
-ssl.keystore.password=confidential
-ssl.key.password=confidential
-ssl.truststore.location=truststore.jks
-ssl.truststore.password=confidential
-listener.name.sasl_ssl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required user_consumer="pw4consumer" user_producer="pw4producer";
-sasl.enabled.mechanisms=PLAIN
-log.dirs=/tmp/kafka-1-logs
-offsets.topic.replication.factor=2
-transaction.state.log.replication.factor=2
-transaction.state.log.min.isr=2
-
-```
-
-- **`zookeeper.connect`**: If you allow unsecure connections too, be sure to specify the right port here!
-- _All other options are not relevant for encrypting the connections to ZooKeeper_
-
-Start the broker in the background and remember its PID in the file **`KAFKA-1`**:
-
-```bash
-(
-  export KAFKA_OPTS="
-    -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
-    -Dzookeeper.client.secure=true
-    -Dzookeeper.ssl.keyStore.location=kafka-1.jks
-    -Dzookeeper.ssl.keyStore.password=confidential
-    -Dzookeeper.ssl.trustStore.location=truststore.jks
-    -Dzookeeper.ssl.trustStore.password=confidential
-  "
-  kafka_2.12-2.3.0/bin/kafka-server-start.sh kafka-1.properties & echo $! > KAFKA-1
-) > kafka-1.log &
-
-```
-
-Check the logfile **`kafka-1.log`** to confirm that the broker starts without errors!
-
-- **`zookeeper.clientCnxnSocket`**: Switches from NIO to the Netty-Framework.  
-**Without this, the ZooKeeper Client-API (just like the ZooKeeper-Server) cannot use TLS!**
-- **`zookeeper.client.secure=true`**: Switches on TLS-encryption, for all connections to any ZooKeeper-Server
-- **`zookeeper.ssl.keyStore.*`**: Specifies the path to and password of the keystore, with the `kafka-1`-certificate
-- **`zookeeper.ssl.trustStore.*`**: Specifies the path to and password of the common truststore with the root-certificate of our private CA
-
-_Do the same for **`kafka-2`**!_
-_And do not forget, to adapt the config-file accordingly — or better: just [download a copy](/wp-uploads/zookeeper+tls/kafka-2.properties)..._
-
-### Configure And Execute The CLI-Clients
-
-All scripts from the Apache-Kafka-Distribution that connect to ZooKeeper are configured in the same way as seen for `kafka-server-start.sh`.
-For example, to create a topic, you will run:
-
-```bash
-export KAFKA_OPTS="
-  -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
-  -Dzookeeper.client.secure=true
-  -Dzookeeper.ssl.keyStore.location=client.jks
-  -Dzookeeper.ssl.keyStore.password=confidential
-  -Dzookeeper.ssl.trustStore.location=truststore.jks
-  -Dzookeeper.ssl.trustStore.password=confidential
-"
-kafka_2.12-2.3.0/bin/kafka-topics.sh \
-  --zookeeper zookeeper:2182 \
-  --create --topic test \
-  --partitions 1 --replication-factor 2
-
-```
-
-_Note:_ A different keystore is used here ( `client.jks`)!
-
-CLI-clients, that connect to the brokers, can be called as usual.
-
-In this example, they use an encrypted listener on port 9194 (for `kafka-1`) and are authenticated using SASL/PLAIN.
-The client-configuration is kept in the files `consumer.config` and `producer.config`.
-Take a look at that files and compare them with the broker-configuration above.
-If you want to lern more about securing broker/client-communication, we refere you to the [official documentation](https://kafka.apache.org/documentation/#security "The official documentation does a good job on this topic!").
-
-_If you have trouble to start these clients, download the scripts and take a look at the examples in [README.sh](/wp-uploads/zookeeper+tls/README.sh)_
-
-### TBD: Further Steps To Take...
-
-This recipe only activates TLS-encryption between Kafka-Brokers and a Standalone ZooKeeper.
-It does not show, how to enable TLS between ZooKeeper-Nodes (which should be easy) or if it is possible to authenticate Kafka-Brokers via TLS-certificates. These topics will be covered in future articles...
-
-## Fully Automated Example Of The Presented Setup
-
-Download and unpack [zookeeper+tls.tgz](/wp-uploads/zookeeper+tls.tgz) for an evaluation of the presented setup:
-
-```bash
-curl -sc - /wp-uploads/zookeeper+tls.tgz | tar -xzv
-
-```
-
-The archive contains a fully automated example.
-Just run [README.sh](/wp-uploads/zookeeper+tls/README.sh) in the unpacked directory.
-
-It downloads the required software, carries out the library-upgrade, creates the required certificates and starts a standalone ZooKeeper and two Kafka-Brokers, that use TLS to encrypt all communication.
-It also executes a console-consumer and a console-producer, that read and write to a topic, and a zookeeper-shell, that communicates directly with the ZooKeeper-node, to proof, that the setup is working.
-The ZooKeeper and the Brokers-instances are left running, to enable the evaluation of the fully encrypted cluster.
-
-### Usage
-
-- Run **`README.sh`**, to execute the automated example
-- After running `README.sh`, the Kafka-Cluster will be still running, so that one can experiment with commands from `README.sh` by hand
-- `README.sh` can be executed repeatedly: it will skip all setup-steps, that are already done automatically
-- Run **`README.sh stop`**, to stop the Kafka-Cluster (it can be restarted by re-running `README.sh`)
-- Run **`README.sh cleanup`**, to stop the Cluster and remove all created files and data (only the downloaded packages will be left untouched)
-
-### Separate Downloads For The Packaged Files
-
-- [README.sh](/wp-uploads/zookeeper+tls/README.sh)
-- [create-certs.sh](/wp-uploads/zookeeper+tls/create-certs.sh)
-- [gencert.sh](/wp-uploads/zookeeper+tls/gencert.sh)
-- [zoo.cfg](/wp-uploads/zookeeper+tls/zoo.cfg)
-- [java.env](/wp-uploads/zookeeper+tls/java.env)
-- [kafka-1.properties](/wp-uploads/zookeeper+tls/kafka-1.properties)
-- [kafka-2.properties](/wp-uploads/zookeeper+tls/kafka-2.properties)
-- [consumer.config](/wp-uploads/zookeeper+tls/consumer.config)
-- [producer.config](/wp-uploads/zookeeper+tls/producer.config)
diff --git a/generated-2025-11-21-17-29-08/content/posts/entwicklung-einer-crowdgestutzten-vertikalen-suchmaschine-fur-veranstaltungen-und-locations.md b/generated-2025-11-21-17-29-08/content/posts/entwicklung-einer-crowdgestutzten-vertikalen-suchmaschine-fur-veranstaltungen-und-locations.md
deleted file mode 100644 (file)
index 623da09..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-date: "2015-10-01T11:55:54+00:00"
-draft: "true"
-guid: http://juplo.de/?p=530
-parent_post_id: null
-post_id: "530"
-title: Entwicklung einer crowdgestützten vertikalen Suchmaschine für Veranstaltungen und Locations
-url: /
-
----
-
diff --git a/generated-2025-11-21-17-29-08/content/posts/fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun.md b/generated-2025-11-21-17-29-08/content/posts/fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun.md
deleted file mode 100644 (file)
index 1ec528b..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
----
-_edit_last: "3"
-author: kai
-categories:
-  - java
-  - spring
-  - spring-boot
-  - thymeleaf
-date: "2020-05-01T14:06:13+00:00"
-guid: http://juplo.de/?p=543
-parent_post_id: null
-post_id: "543"
-title: Fix Hot Reload of Thymeleaf-Templates In spring-boot:run
-url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
-
----
-## The Problem: Hot-Reload Of Thymeleaf-Templates Does Not Work, When The Application Is Run With `spring-boot:run`
-
-A lot of people seem to have problems with hot reloading of static HTML-ressources when developing a [Spring-Boot](http://projects.spring.io/spring-boot/#quick-start "Learn more about Spring-Boot") application that uses [Thymeleaf](http://www.thymeleaf.org/ "Learn more about Thymeleaf") as templateing engine with [`spring-boot:run`](http://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html "Learn more about the spring-boot-maven-plugin").
-There are a lot of tips out there, how to fix that problem:
-
-- [The official Hot-Swapping-Guide](http://docs.spring.io/spring-boot/docs/current/reference/html/howto-hotswapping.html "Read the official guide") says, that you just have to add `spring.thymeleaf.cache=false` in your application-configuration in `src/main/resources/application.properties`.
-- [Some say](http://stackoverflow.com/a/26562302/247276 "Read the whole suggestion"), that you have to disable caching by setting `spring.template.cache=false` **and** `spring.thymeleaf.cache=false` and/or run the application in debugging mode.
-- [Others say](http://stackoverflow.com/a/31641587/247276 "Read the suggestion"), that you have to add a dependency to `org.springframework:springloaded` to the configuration of the `spring-boot-maven-plugin`.
-- There is even a [bug-report on GitHub](https://github.com/spring-projects/spring-boot/issues/34 "Read the whole bug-report on GitHub"), that says, that you have to run the application from your favored IDE.
-
-But none of that fixes worked for me.
-Some may work, if I would switch my IDE (I am using Netbeans), but I have not tested that, because I am not willing to switch my beloved IDE because of that issue.
-
-## The Solution: Move Your Thymeleaf-Templates Back To `src/main/webapp`
-
-Fortunatly, I found a simple solution, to fix the issue without all the above stuff.
-**You simply have to move your Thymeleaf-Templates back to where they belong (IMHO): `src/main/webapp` and turn of the caching.**
-It is not necessary to run the application in debugging mode and/or from your IDE, nor is it necessary to add the dependency to `springloaded` or more configuration-switches.
-
-To move the templates and disable caching, just add the following to your application configuration in `src/main/application.properties`:
-
-```properties
-spring.thymeleaf.prefix=/thymeleaf/
-spring.thymeleaf.cache=false
-
-```
-
-Of course, you also have to move your Thymeaf-Templates from `src/main/resources/templates/` to `src/main/webapp/thymeleaf/`.
-In my opinion, the templates belong there anyway, in order to have them accessible as normal static HTML(5)-files.
-If they are locked away in the classpath you cannot access them, which foils the approach of Thymeleaf, that you can view your templates in a browser as thy are.
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/hibernate-maven-plugin-2-0-0-released.md b/generated-2025-11-21-17-29-08/content/posts/hibernate-maven-plugin-2-0-0-released.md
deleted file mode 100644 (file)
index 395d0ed..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - projects
-date: "2020-06-24T11:32:38+00:00"
-guid: http://juplo.de/?p=721
-parent_post_id: null
-post_id: "721"
-tags:
-  - createmedia.nrw
-  - hibernate
-  - java
-  - jpa
-  - maven
-title: hibernate-maven-plugin 2.0.0 released!
-url: /hibernate-maven-plugin-2-0-0-released/
-
----
-Today we released the version 2.0.0 of [hibernate-maven-plugin](/hibernate-maven-plugin "hibernate-maven-plugin") to [Central](http://search.maven.org/#search|gav|1|g%3A%22de.juplo%22%20AND%20a%3A%22hibernate-maven-plugin%22 "Central")!
-
-## Why Now?
-
-During one of our other projects ‐ the development of [a vertical search-engine for events and locations](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Read more about our project"), which is [funded by the mistery of economy of NRW](http://yourshouter.com/partner/mweimh-nrw.html "Read more about the support by the ministery") ‐, we realized, that we were in the need of Hibernate 5 and some of the more sophisticated JPA-configuration-options.
-
-Unfortunatly ‐ _for us_ ‐ the old releases of this plugin neither support Hibernate 5 nor all configuration options, that are available for use in the `META-INF/persistence.xml`.
-
-Fortunatly ‐ _for you_ ‐ we decided, that we really need all that and have to integrate it in our little plugin.
-
-## Nearly Complete Rewrite
-
-Due to [changes in the way Hibernate has to be configured internally](http://docs.jboss.org/hibernate/orm/5.0/integrationsGuide/en-US/html_single/ "Read more about this changes in the official Integrations Guide for Hibernate 5"), this release is a nearly complete rewrite.
-It was no longer possible, to just use the [SchemaExport](https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/toolsetguide.html#toolsetguide-s1-3)-Tool to build up the configuration and support all possible configuration-approaches.
-Hence, the plugin now builds up the configuration using [Services and Registries](http://docs.jboss.org/hibernate/orm/5.0/integrationsGuide/en-US/html_single/#services "Read more about services and registries"), like described in the Integration Guide.
-
-## Simplified Configuration: No Drop-In-Replacement!
-
-We also took the opportunity, to simplify the configuration.
-Beforehand, the plugin had just used the configuration, that was set up in the class [SchemaExport](https://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/tool/hbm2ddl/SchemaExport.html).
-This reliefed us from the burden, to understand the configuration internals, but brought up some oddities of the internal implementation of the tool.
-It also turned out to be a bad decision in the long run, because some configuration options are hard coded in that class and cannot be changed.
-
-By building up the whole configuration by hand, it is now possible to implement separate goals for creating and dropping the schema.
-Also, it enables us to add a goal `update` in one of the next releases.
-Because of all this improvements, you have to revise your configuration, if you want to switch from 1.x to 2.x.
-
-**Be warned: this release is _no drop-in replacement_ of the previous releases!**
-
-## Not Only For 4, But For Any Version
-
-While rewirting the plugin, we focused on Hibernate 5, which was not supported by the older releases, because of some of the oddities of the internal implementation of the SchemaExport-tool.
-We tried to maintain backward compatibility.
-
-You should be able to use the new plugin with Hibernate 5 and also with older versions of Hibernate (we only tested that for Hibernate 4).
-Because of that, we dropped the 4 in the name of the plugin!
-
-## Extended Support For JPA-Configurations
-
-We tried to support all possible configuration-approaches, that Hibernate 5 understands.
-Including hard coded XML-mapping-files in the `META-INF/persistence.xml`, that do not seem to be used very often, but which we needed in one of our own projects.
-
-Therefore, the plugin now understands all (or most of?) the relevant configuration options, that one can specify through a standard JPA-configuration.
-The plugin now should work with any configuration, that you drop in from your existing JPA- or Hibernate-projects.
-All recognized configuration from the different possible configuration-sources are merged together, considering the [configuration-method-precedence](/hibernate-maven-plugin/configuration.html#precedence "Jump to the documentation to read more about the configuration-method-precedence"), described in the documentation.
-
-We hope, we did not make any unhandy assumptions, while designing the merge-process.
-_Please let us know, if something wents wrong in your projects and you think it is, because we messed it up!_
-
-## Release notes:
-
-```
-commit 64b7446c958efc15daf520c1ca929c6b8d3b8af5
-Author: Kai Moritz
-Date:   Tue Mar 8 00:25:50 2016 +0100
-
-    javadoc hat to be configured multiple times for release:prepare
-
-commit 1730d92a6da63bdcc81f7a1c9020e73cdc0adc13
-Author: Kai Moritz
-Date:   Tue Mar 8 00:13:10 2016 +0100
-
-    Added the special javadoc-tags for maven-plugins to the configuration
-
-commit 0611db682bc69b80d8567bf9316668a1b6161725
-Author: Kai Moritz
-Date:   Mon Mar 7 16:01:59 2016 +0100
-
-    Updated documentation
-
-commit a275df25c52fdb7b5b4275fcf9a359194f7b9116
-Author: Kai Moritz
-Date:   Mon Mar 7 17:56:16 2016 +0100
-
-    Fixed missing menu on generated site: moved template from skin to project
-
-commit e8263ad80b1651b812618c964fb02f7e5ddf3d7e
-Author: Kai Moritz
-Date:   Mon Mar 7 14:44:53 2016 +0100
-
-    Turned of doclint, that was introduced in Java 8
-
-    See: http://blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html
-
-commit 62ec2b1b98d5ce144f1ac41815b94293a52e91e6
-Author: Kai Moritz
-Date:   Tue Dec 22 19:56:41 2015 +0100
-
-    Fixed ConcurrentModificationException
-
-commit 9d6e06c972ddda45bf0cd2e6a5e11d8fa319c290
-Author: Kai Moritz
-Date:   Mon Dec 21 17:01:42 2015 +0100
-
-    Fixed bug regarding the skipping of unmodified builds
-
-    If a property or class was removed, its value or md5sum stayed in the set
-    of md5sums, so that each following build (without a clean) was juged as
-    modified.
-
-commit dc652540d007799fb23fc11d06186aa5325058db
-Author: Kai Moritz
-Date:   Sun Dec 20 21:06:37 2015 +0100
-
-    All packages up to the root are checked for annotations
-
-commit 851ced4e14fefba16b690155b698e7a39670e196
-Author: Kai Moritz
-Date:   Sun Dec 20 13:32:48 2015 +0100
-
-    Fixed bug: the execution is no more skipped after a failed build
-
-    After a failed build, further executions of the plugin were skipped, because
-    the MD5-summs suggested, that nothing is to do because nothing has changed.
-    Because of that, the MD5-summs are now removed in case of a failure.
-
-commit 08649780d2cd70f2861298d683aa6b1945d43cda
-Author: Kai Moritz
-Date:   Sat Dec 19 18:02:02 2015 +0100
-
-    Mappings from JPA-mapping-files are considered
-
-commit bb8b638714db7fc02acdc1a9032cc43210fe5c0e
-Author: Kai Moritz
-Date:   Sat Dec 19 03:46:49 2015 +0100
-
-    Fixed minor misconfiguration in integration-test dependency test
-
-    Error because of multiple persistence-units by repeated execution
-
-commit 3a7590b8862c3be691b05110f423865f6674f6f6
-Author: Kai Moritz
-Date:   Thu Dec 17 03:10:33 2015 +0100
-
-    Considering mapping-configuration from persistence.xml and hibernate.cfg.xml
-
-commit 23668ccaa93bfbc583c1697214bae116bd9f4ef6
-Author: Kai Moritz
-Date:   Thu Dec 17 02:53:38 2015 +0100
-
-    Sidestepped bug in Hibernate 5
-
-commit 8e5921c9e76b4540f1d4b75e05e338001145ff6d
-Author: Kai Moritz
-Date:   Wed Dec 16 22:09:00 2015 +0100
-
-    Introduced the goal "drop"
-
-     * Fixed integration-test hibernate4-maven-plugin-envers-sample by adapting
-       it to the new drop-goal
-     * Adapted the other integration-tests to the new naming schema for the
-       create-script
-
-commit 6dff3bfb0f9ea7a1d0cc56398aaad29e31a17b91
-Author: Kai Moritz
-Date:   Wed Dec 16 18:08:56 2015 +0100
-
-    Reworked configuration and the tracking thereof
-
-     * Moved common parameters from CreateMojo to AbstractSchemaMojo
-     * Reordered parameters into sensible groups
-     * Renamed the maven-property-names of the parameters
-     * All configuration-parameters are tracked, not only hibernate-parameters
-     * Introduced special treatment for some of the plugin-parameters (export
-       and show)
-
-commit b316a5b4122c3490047b68e1e4a6df205645aad5
-Author: Kai Moritz
-Date:   Wed Oct 21 11:49:56 2015 +0200
-
-    Reworked plugin-configuration: worshipped the DRY-principle
-
-commit 4940080670944a15916c68fb294e18a6bfef12d5
-Author: Kai Moritz
-Date:   Fri Oct 16 12:16:30 2015 +0200
-
-    Refined reimplementation of the plugin for Hibernate 5.x
-
-    Renamed the plugin from hibernate4-maven-plugin to hibernate-maven-plugin,
-    because the goal is, to support all recent older versions with the new
-    plugin.
-
-commit fdda82a6f76deefd10f83da89d7e82054e3c3ecd
-Author: Kai Moritz
-Date:   Wed Oct 21 12:18:29 2015 +0200
-
-    Integration-Tests are skiped, if "maven.test.skip" is set to true
-
-commit b971570e28cbdc3b27eca15a7395586bee787446
-Author: Kai Moritz
-Date:   Tue Sep 8 13:55:43 2015 +0200
-
-    Updated version of juplo-skin for generation of documentation
-
-commit 3541cf3742dd066b94365d351a3ca39a35e3d3c8
-Author: Kai Moritz
-Date:   Tue May 19 21:41:50 2015 +0200
-
-    Added new configuration sources in documentation about precedence
-
-```
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-1-released.md b/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-1-released.md
deleted file mode 100644 (file)
index 67094a5..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - hibernate
-  - java
-  - maven
-date: "2013-01-15T23:10:59+00:00"
-guid: http://juplo.de/?p=64
-parent_post_id: null
-post_id: "64"
-title: hibernate4-maven-plugin 1.0.1 released!
-url: /hibernate4-maven-plugin-1-0-1-released/
-
----
-Today we released the bugfix-version 1.0.1 of [hibernate4-maven-plugin](/hibernate4-maven-plugin "hibernate4-maven-plugin") to [Central](http://search.maven.org/ "Central").
-
-Appart from two bugfixes, this version includes some minor improvements, which might come in handy for you.
-
-**[hibernate4-maven-plugin 1.0.1](/hibernate4-maven-plugin/ "hibernate4-maven-plugin")** should be available in the [Central Maven Repository](http://search.maven.org/#artifactdetails|de.juplo|hibernate4-maven-plugin|1.0.1|maven-plugin "Central Maven Repository") in a few hours.
-
-- [hibernate4-maven-plugin?](/hibernate4-maven-plugin/ "hibernate4-maven-plugin") What's that for?!?
-- [Read more about the hibernate4-maven-plugin...](/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/ "About the hibernate4-maven-plugin")
-- [Jump to the quickstart-guide!](/hibernate4-maven-plugin/configuration.html "Quickstart")
-
-## Release notes:
-
- `
-commit 4b507b15b0122ac180e44b8418db8d9143ae9c3a
-Author: Kai Moritz
-Date:   Tue Jan 15 23:09:01 2013 +0100
-    Reworked documentation: splited and reorderd pages and menu
-commit 65bbbdbaa7df1edcc92a3869122ff06a3895fe57
-Author: Kai Moritz
-Date:   Tue Jan 15 22:39:39 2013 +0100
-    Added breadcrumb to site
-commit a8c4f4178a570da392c94e384511f9e671b0d040
-Author: Kai Moritz
-Date:   Tue Jan 15 22:33:48 2013 +0100
-    Added Google-Analytics tracking-code to site
-commit 1feb1053532279981a464cef954072cfefbe01a5
-Author: Kai Moritz
-Date:   Tue Jan 15 22:21:54 2013 +0100
-    Added release information to site
-commit bf5e8c39287713b9eb236ca441473f723059357a
-Author: Kai Moritz
-Date:   Tue Dec 18 00:14:08 2012 +0100
-    Reworked documentation: added documentation for new features etc.
-commit 36af74be42d47438284677134037ce399ea0b58e
-Author: Kai Moritz
-Date:   Tue Jan 15 10:40:09 2013 +0100
-    Test-Classes can now be included into the scanning for Hibernate-Annotations
-commit bcf07578452d7c31dc97410bc495c73bd0f87748
-Author: Kai Moritz
-Date:   Tue Jan 15 09:09:05 2013 +0100
-    Bugfix: database-parameters for connection were not taken from properties
-
-    The hibernate-propertiesfile was read and used for the configuration of
-    the SchemaExport-class, but the database-parameters from these source were
-    ignored, when the database-connection was opened.
-commit 54b22b88de40795a73397ac8b3725716bc80b6c4
-Author: Kai Moritz
-Date:   Wed Jan 9 20:57:22 2013 +0100
-    Bugfix: connection was closed, even when it was never created
-
-    Bugreport from: Adriano Machado
-
-    When only the script is generated and no export is executed, no database-
-    connection is opend. Nevertheless, the code tried to close it in the
-    finally-block, which lead to a NPE.
-commit b9ab24b21d3eb65e2a2208be658ff447c1846894
-Author: Kai Moritz
-Date:   Tue Dec 18 00:31:22 2012 +0100
-    Implemented new parameter "force"
-
-    If -Dhibernate.export.force is specified, the schema-export will be forced.
-commit 19740023bb37770ad8e08c8e50687cb507e2fbfd
-Author: Kai Moritz
-Date:   Fri Dec 14 02:16:44 2012 +0100
-    Plugin ignores upper- or lower-case mismatches for "type" and "target"
-commit 8a2e08b6409034fd692c4bea72058f785e6802ad
-Author: Kai Moritz
-Date:   Fri Dec 14 02:13:05 2012 +0100
-    The Targets EXPORT and NONE force excecution
-
-    Otherwise, an explicitly requestes SQL-export or mapping-test-run would be
-    skipped, if no annotated class was modified.
-
-    If the export is skipped, this is signaled via the maven-property
-    hibernate.export.skipped.
-
-    Refactored name of the skip-property to an public final static String
-commit 55a33e35422b904b974a19d3d6368ded60ea1811
-Author: Kai Moritz
-Date:   Fri Dec 14 01:43:45 2012 +0100
-    Configuration via properties reworked
-
-     * export-type and -target are now also configurable via properties
-     * schema-filename, -delemiter and -format are now also configurable via
-       porperties
-commit 5002604d2f9024dd7119190915b6c62c75fbe1d6
-Author: Kai Moritz
-Date:   Thu Dec 13 16:19:55 2012 +0100
-    schema is now rebuild, when SQL-dialect changes
-commit a2859d3177a64880ca429d4dfd9437a7fb78dede
-Author: Kai Moritz
-Date:   Tue Dec 11 17:30:19 2012 +0100
-    Skipping of unchanged scenarios is now based on MD5-sums of all classes
-
-    When working with Netbeans, the schema was often rebuild without need.
-    The cause of this behaviour was, that Netbeans (or Maven itself) sometimes
-    touches unchanged classes. To avoid this, hibernat4-maven-plugin now
-    calculates MD5-sums for all annotated classes and compares these instead of
-    the last-modified value.
-commit a4de03f352b21ce6abad570d2753467e3a972a10
-Author: Kai Moritz
-Date:   Tue Dec 11 17:02:14 2012 +0100
-    hibernate4:export is skipped, when annotated classes are unchanged
-
-    Hbm2DdlMojo now checks the last-modified-timestamp of all found annotated
-    classes and aborts the schema-generation, when no class has changed and no
-    new class was added since the last execution.
-
-    It then sets a maven-property, to indicate to other plugins, that the
-    generation was skipped.
-commit 2f3807b9fbde5c1230e3a22010932ddec722871b
-Author: Kai Moritz
-Date:   Thu Nov 29 18:23:59 2012 +0100
-    Found annotated classes get logged now
-`
diff --git a/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-2-release.md b/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-2-release.md
deleted file mode 100644 (file)
index fc809ff..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - hibernate
-  - java
-  - maven
-date: "2013-09-08T00:51:18+00:00"
-guid: http://juplo.de/?p=75
-parent_post_id: null
-post_id: "75"
-title: hibernate4-maven-plugin 1.0.2 released!
-url: /hibernate4-maven-plugin-1-0-2-release/
-
----
-Today we released the version 1.0.2 of [hibernate4-maven-plugin](/hibernate4-maven-plugin "hibernate4-maven-plugin") to [Central](http://search.maven.org/ "Central").
-
-This release includes:
-
-- Improved documentation (thanks to Adriano Machado)
-- Support for the `hibernateNamingStrategy`-configuration-option (thanks to Lorenzo Nicora)
-- Mapping via `*.hbm.xml`-files (old approach without annotations)
-
-**[hibernate4-maven-plugin 1.0.2](/hibernate4-maven-plugin/ "hibernate4-maven-plugin")** is available in the [Central Maven Repository](http://search.maven.org/#artifactdetails|de.juplo|hibernate4-maven-plugin|1.0.2|maven-plugin "Central Maven Repository").
-
-- [hibernate4-maven-plugin?](/hibernate4-maven-plugin/ "hibernate4-maven-plugin") What's that for?!?
-- [Read more about the hibernate4-maven-plugin...](/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/ "About the hibernate4-maven-plugin")
-- [Jump to the quickstart-guide!](/hibernate4-maven-plugin/configuration.html "Quickstart")
-
-## Release notes:
-
- `
-commit 4edef457d2b747d939a141de24bec5e32abbc0c7
-Author: Kai Moritz
-Date:   Fri Aug 2 00:37:40 2013 +0200
-    Last preparations for release
-commit 82eada1297cdc295dcec9f43660763a04c1b1deb
-Author: Kai Moritz
-Date:   Fri Aug 2 00:37:22 2013 +0200
-    Upgrade to Hibernate 4.2.3.Final
-commit 3d355800b5a5d2a536270b714f37a84d50b12168
-Author: Kai Moritz
-Date:   Thu Aug 1 12:41:06 2013 +0200
-    Mapping-configurations are opend as given before searched in resources
-commit 1ba817af3ae5ab23232fca001061f8050cecd6a7
-Author: Kai Moritz
-Date:   Thu Aug 1 01:45:22 2013 +0200
-    Improved documentaion (new FAQ-entries)
-commit 02312592d27d628cc7e0d8e28cc40bf74a80de21
-Author: Kai Moritz
-Date:   Wed Jul 31 23:07:26 2013 +0200
-    Added support for mapping-configuration through mapping-files (*.hbm.xml)
-commit b6ac188a40136102edc51b6824875dfb07c89955
-Author: nicus
-Date:   Fri Apr 19 15:27:21 2013 +0200
-    Fixed problem with NamingStrategy (contribution from Lorenzo Nicora)
-
-     * NamingStrategy is set explicitly on Hibernate Configuration (not
-       passed by properties)
-     * Added  'hibernateNamingStrategy' configuration property
-commit c2135b5dedc55fc9e3f4dd9fe53f8c7b4141204c
-Author: Kai Moritz
-Date:   Mon Feb 25 22:35:33 2013 +0100
-    Integration of the maven-plugin-plugin for automated helpmojo-generation
-
-    Thanks to Adriano Machado, who contributed this patch!
-`
diff --git a/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-3-released.md b/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-3-released.md
deleted file mode 100644 (file)
index f2ee8af..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - hibernate
-  - java
-  - maven
-date: "2014-01-15T20:12:55+00:00"
-guid: http://juplo.de/?p=114
-parent_post_id: null
-post_id: "114"
-title: hibernate4-maven-plugin 1.0.3 released!
-url: /hibernate4-maven-plugin-1-0-3-released/
-
----
-Today we released the version 1.0.3 of [hibernate4-maven-plugin](/hibernate4-maven-plugin "hibernate4-maven-plugin") to [Central](http://search.maven.org/ "Central").
-
-## Scanning dependencies
-
-This release of the plugin now supports scanning of dependencies. By default all dependencies in the scope `compile` are scanned for annotated classes. Thanks to Guido Wimmel, who pointed out, that this was really missing and supported the implementation with a little test-project for this use-case. [Learn more...](/hibernate4-maven-plugin/export-mojo.html#scanDependencies "Configuring dependency-scanning")
-
-## Support for Hibernate Envers
-
-Another new feature of this release is support for [Hibernate Envers - Easy Entity Auditing](http://docs.jboss.org/envers/docs/ "Open documentation"). Thanks a lot to Victor Tatai, how implemented this, and Erik-Berndt Scheper, who helped integrating it and who supported the testin with a little test-project, that demonstrates the new feature. You can [visit it at bitbucket](https://bitbucket.org/fbascheper/hibernate4-maven-plugin-envers-sample "Open the example project") as a starting point for your own experiments with this technique.
-
-## Less bugs!
-
-Many thanks also to Stephen Johnson and Eduard Szente, who pointed out bugs and helped eleminating them...
-
-## Get your hands on - on central!
-
-**[hibernate4-maven-plugin 1.0.3](/hibernate4-maven-plugin/ "hibernate4-maven-plugin")** is available in the [Central Maven Repository](http://search.maven.org/#artifactdetails|de.juplo|hibernate4-maven-plugin|1.0.3|maven-plugin "Central Maven Repository").
-
-- hibernate4-maven-plugin? [What's that for?!?](/hibernate4-maven-plugin/ "hibernate4-maven-plugin")
-- [Read more about the hibernate4-maven-plugin...](/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/ "About the hibernate4-maven-plugin")
-- [Jump to the quickstart-guide!](/hibernate4-maven-plugin/configuration.html "Quickstart")
-
-## Release notes:
-
- `
-commit adb20bc4da63d4cec663ca68648db0f808e3d181
-Author: Kai Moritz
-Date:   Fri Oct 18 01:52:27 2013 +0200
-    Added missing documentation for skip-configuration
-commit 99a7eaddd1301df0d151f01791e3d177297670aa
-Author: Kai Moritz
-Date:   Fri Oct 18 00:38:29 2013 +0200
-    Added @since-Annotation to configuration-parameters
-commit 221d977368ee1897377f80bfcdd50dcbcd1d4b83
-Author: Kai Moritz
-Date:   Wed Oct 16 01:18:53 2013 +0200
-    The plugin now scans for annotated classes in dependencies too
-commit ef1233a6095a475d9cdded754381267c5d1e336f
-Author: Kai Moritz
-Date:   Wed Oct 9 21:37:58 2013 +0200
-    Project-Documentation now uses the own skin juplo-skin
-commit 84e8517be79d88d7e2bec2688a8f965f591394bf
-Author: Kai Moritz
-Date:   Wed Oct 9 21:30:28 2013 +0200
-    Reworked APT-Documentation: page-titles were missing
-commit f27134cdec6c38b4c8300efb0bb34fc8ed381033
-Author: Kai Moritz
-Date:   Wed Oct 9 21:29:30 2013 +0200
-    maven-site-plugin auf Version 3.3 aktualisiert
-commit d38b2386641c7ca00f54d69cb3f576c20b0cdccc
-Author: Kai Moritz
-Date:   Wed Sep 18 23:59:13 2013 +0200
-    Reverted to old behaviour: export is skipped, when maven.test.skip=true
-commit 7d935b61a3d80260b9cacf959984e14708c3a96b
-Author: Kai Moritz
-Date:   Wed Sep 18 18:15:38 2013 +0200
-    No configuration for hibernate.dialect might be a valid configuration too
-commit caa492b70dc1daeaef436748db38df1c19554943
-Author: Kai Moritz
-Date:   Wed Sep 18 18:14:54 2013 +0200
-    Improved log-messages
-commit 2b1147d5e99c764c1f6816f4d4f000abe260097c
-Author: Kai Moritz
-Date:   Wed Sep 18 18:10:32 2013 +0200
-    Variable "envers" should not be put into hibernate.properties
-
-    "hibernate.exoprt.envers" is no Hibernate-Configuration-Parameter.
-    Hence, it should not be put into the hibernate.properties-file.
-commit 0a52dca3dd6729b8b6a43cc3ef3b69eb22755b0a
-Author: Erik-Berndt Scheper
-Date:   Tue Sep 10 16:18:47 2013 +0200
-    Rename envers property to hibernate.export.envers
-commit 0fb85d6754939b2f30ca4fc18823c5f7da1add31
-Author: Erik-Berndt Scheper
-Date:   Tue Sep 10 08:20:23 2013 +0200
-    Ignore IntelliJ project files
-commit e88830c968c1aabc5c32df8a061a8b446c26505c
-Author: Victor Tatai
-Date:   Mon Feb 25 16:23:29 2013 -0300
-    Adding envers support (contribution from Victor Tatai)
-commit e59ac1191dda44d69dfb8f3afd0770a0253a785c
-Author: Kai Moritz
-Date:   Tue Sep 10 20:46:55 2013 +0200
-    Added Link to old Version 1.0.2 in documentation
-commit 97a45d03e1144d30b90f2f566517be22aca39358
-Author: Kai Moritz
-Date:   Tue Sep 10 20:29:15 2013 +0200
-    Execution is only skipped, if explicitly told so
-commit 8022611f93ad6f86534ddf3568766f88acf863f3
-Author: Kai Moritz
-Date:   Sun Sep 8 00:25:51 2013 +0200
-    Upgrade to Scannotation 1.0.3
-commit 9ab53380a87c4a1624654f654158a701cfeb0cae
-Author: Kai Moritz
-Date:   Sun Sep 8 00:25:02 2013 +0200
-    Upgrade to Hibernate 4.2.5.Final
-commit 5715c7e29252ed230389cfce9c1a0376fec82813
-Author: Kai Moritz
-Date:   Sat Aug 31 09:01:43 2013 +0200
-    Fixed failure when target/classes does not exist when runnin mvn test phase
-
-    Thanks to Stephen Johnson
-
-    Details from the original email:
-    ---------
-    The following patch stops builds failing when target/classes (or no main java exists), and target/test-classes and src/tests exist.
-
-    So for example calling
-
-    mvn test -> invokes compiler:compile and if you have export bound to process-classes phase in executions it will fail.  Maybe better to give info and carry on.  Say for example they want to leave the executions in place that deal with process-classes and also process-test-classes but they do not want it to fail if there is no java to annotate in src/classes.  The other way would be to comment out the executions bound to process-classes.  What about export being bound to process-class by default?  Could this also cause issues?
-
-    In either case I think the plugin code did checks for src/classes directory existing, in which case even call "mvn test" would fail as src/classes would not exist as no java existed in src/main only in src/test.  Have a look through the patch and see if its of any use.
-commit 9414e11c9ffb27e195193f5fa53c203c6297c7a4
-Author: Kai Moritz
-Date:   Sat Aug 31 11:28:51 2013 +0200
-    Improved log-messages
-commit da0b3041b8fbcba6175d05a2561b38c365111ed8
-Author: Kai Moritz
-Date:   Sat Aug 31 08:51:03 2013 +0200
-    Fixed NPE when using nested classes in entities with @EmbeddedId/@Embeddable
-
-    Patch supplied by Eduard Szente
-
-    Details:
-    ----------------
-    Hi,
-
-    when using your plugin for schema export the presence of nested classes
-    in entities (e.g. when using @EmbeddedId/@Embeddable and defining the Id
-    within the target entity class)
-    yields to NPEs.
-
-    public class Entity {
-
-      @EmbeddedId
-      private Id id;
-
-      @Embeddable
-      public static class Id implements Serializable {
-        ....
-      }
-
-    }
-
-    Entity.Id.class.getSimplename == "Id", while the compiled class is named
-    "Entity$Id.class"
-
-    Patch appended.
-
-    Best regards,
-    Eduard
-`
diff --git a/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-4-released.md b/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-4-released.md
deleted file mode 100644 (file)
index b5d3a2f..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - hibernate
-  - java
-  - maven
-date: "2014-06-17T10:32:30+00:00"
-guid: http://juplo.de/?p=288
-parent_post_id: null
-post_id: "288"
-title: hibernate4-maven-plugin 1.0.4 released!
-url: /hibernate4-maven-plugin-1-0-4-released/
-
----
-We finally did it.
-Today we released the version 1.0.4 of [hibernate4-maven-plugin](/hibernate4-maven-plugin "hibernate4-maven-plugin") to [Central](http://search.maven.org/#search|gav|1|g%3A%22de.juplo%22%20AND%20a%3A%22hibernate4-maven-plugin%22 "Central")!
-
-This release mainly is a library-upgrade to version 4.3.1.Final of hibernate.
-It also includes some bug-fixes provided by the community.
-Please see the release notes for details.
-
-It took us quiet some time, to release this version and we are sorry for that.
-But with a growing number of users, we are becoming more anxious to break some special use-cases.
-Because of that, we started to add some integration-tests, to avoid that hassle, and that took us some time...
-
-If you have some special small-sized (example) use-cases for the plugin, we would appreciate it, if you would provide them to us, so we can add them es additional integration-tests.
-
-## Release notes:
-
- `
-commit f3dabc0e6e3676244986b5bbffdb67d427c8383c
-Author: Kai Moritz
-Date:   Mon Jun 2 10:31:12 2014 +0200
-    [maven-release-plugin] prepare release hibernate4-maven-plugin-1.0.4
-commit 856dd31c9b90708e841163c91261a865f9efd224
-Author: Kai Moritz
-Date:   Mon Jun 2 10:12:24 2014 +0200
-    Updated documentation
-commit 64900890db2575b7a28790c5e4d5f45083ee94b3
-Author: Kai Moritz
-Date:   Tue Apr 29 20:43:15 2014 +0200
-    Switched documentation to xhtml, to be able to integrate google-pretty-print
-commit bd78c276663790bf7a3f121db85a0d62c64ce38c
-Author: Kai Moritz
-Date:   Tue Apr 29 19:42:41 2014 +0200
-    Fixed bug in site-configuration
-commit 1628bcf6c9290a729352215ee22e5b48fa628c4c
-Author: Kai Moritz
-Date:   Tue Apr 29 18:07:44 2014 +0200
-    Verifying generated SQL in integration-test hibernate4-maven-plugin-envers-sample
-commit 25079f13c0eda6807d5aee67086a21ddde313213
-Author: Kai Moritz
-Date:   Tue Apr 29 18:01:10 2014 +0200
-    Added integration-test provided by Erik-Berndt Scheper
-commit 69458703cddc2aea1f67e06db43bce6950c6f3cb
-Author: Kai Moritz
-Date:   Tue Apr 29 17:52:17 2014 +0200
-    Verifying generated SQL in integration-test schemaexport-example
-commit a53a2ad438038084200a8449c557a41159e409dc
-Author: Kai Moritz
-Date:   Tue Apr 29 17:46:05 2014 +0200
-    Added integration-test provided by Guido Wimmel
-commit f18f820198878cddcea8b98c2a5e0c9843b923d2
-Author: Kai Moritz
-Date:   Tue Apr 29 09:43:06 2014 +0200
-    Verifying generated SQL in integration-test hib-test
-commit 4bb462610138332087d808a62c84a0c9776b24cc
-Author: Kai Moritz
-Date:   Tue Apr 29 08:58:33 2014 +0200
-    Added integration-test provided by Joel Johnson
-commit c5c4c7a4007bc2bd58b850150adb78f8518788da
-Author: Kai Moritz
-Date:   Tue Apr 29 08:43:28 2014 +0200
-    Prepared POM for integration-tests via invoker-maven-plugin
-commit d8647fedfe936f49476a5c1f095d51a9f5703d3d
-Author: Kai Moritz
-Date:   Tue Apr 29 08:41:50 2014 +0200
-    Upgraded Version of maven from 3.0.4 to 3.2.1
-commit 1979c6349fc2a9e0fe3f028fa1cc76557b32031c
-Author: Frank Schimmel
-Date:   Wed Feb 12 15:16:18 2014 +0100
-    Properly support constraints expressed by bean validation (jsr303) annotations.
-
-     * Access public method of package-visible TypeSafeActivator class without reflection.
-     * Fix arguments to call of TypeSafeActivator.applyRelationalConstraints().
-     * Use hibernate version 4.3.1.Final for all components.
-     * Minor refactorings in exception handling.
-commit c3a16dc3704517d53501914bb8a0f95f856585f4
-Author: Kai Moritz
-Date:   Fri Jan 17 09:05:05 2014 +0100
-    Added last contributors to the POM
-commit 5fba40e135677130cbe0ff3c59f6055228293d92
-Author: Mark Robinson
-Date:   Fri Jan 17 08:53:47 2014 +0100
-    Generated schema now corresponds to hibernate validators set on the beans
-commit aedcc19cfb89a8b387399a978afab1166be816e3
-Author: Kai Moritz
-Date:   Thu Jan 16 18:33:32 2014 +0100
-    Upgrade to Hibernate 4.3.0.Final
-commit 734356ab74d2896ec8d7530af0d2fa60ff58001f
-Author: Kai Moritz
-Date:   Thu Jan 16 18:23:12 2014 +0100
-    Improved documentation of the dependency-scanning on the pitfalls-page
-commit f2955fc974239cbb266922c04e8e11101d7e9dd9
-Author: Joel Johnson
-Date:   Thu Dec 26 14:33:51 2013 -0700
-    Text cleanup, spelling, etc.
-commit 727d1a35bb213589270b097d04d5a1f480bffef6
-Author: Joel Johnson
-Date:   Thu Dec 26 14:02:29 2013 -0700
-    Make output file handling more robust
-
-    * Ensure output file directory path exists
-    * Anchor relative paths in build directory
-commit eeb182205a51c4507e61e1862af184341e65dbd3
-Author: Joel Johnson
-Date:   Thu Dec 26 13:53:37 2013 -0700
-    Check that md5 path is file and has content
-commit 64c0a52bdd82142a4c8caef18ab0671a74fdc6c1
-Author: Joel Johnson
-Date:   Thu Dec 26 11:25:34 2013 -0700
-    Use more descriptive filename for schema md5
-commit ba2e48a347a839be63cbce4b7ca2469a600748c6
-Author: Joel Johnson
-Date:   Thu Dec 26 11:20:24 2013 -0700
-    Offer explicit disable option
-
-    Use an explicit disable property, but still default it to test state
-commit e44434257040745e66e0596b262dd0227b085729
-Author: Kai Moritz
-Date:   Fri Oct 18 01:55:11 2013 +0200
-    [maven-release-plugin] prepare for next development iteration
-`
diff --git a/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-5-released.md b/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-5-released.md
deleted file mode 100644 (file)
index 59f46e0..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - hibernate
-  - java
-  - maven
-date: "2015-05-03T13:52:31+00:00"
-guid: http://juplo.de/?p=319
-parent_post_id: null
-post_id: "319"
-title: hibernate4-maven-plugin 1.0.5 released!
-url: /hibernate4-maven-plugin-1-0-5-released/
-
----
-Today we released the version 1.0.5 of [hibernate4-maven-plugin](/hibernate4-maven-plugin "hibernate4-maven-plugin") to [Central](http://search.maven.org/#search|gav|1|g%3A%22de.juplo%22%20AND%20a%3A%22hibernate4-maven-plugin%22 "Central")!
-
-This release mainly fixes a NullPointerException-bug, that was introduced in 1.0.4.
-The NPE was triggered, if a `hibernate.properties`-file is present and the dialect is specified in that file and not in the plugin configuration.
-Thanks to Paulo Pires and and everflux, for pointing me at that bug.
-
-But there are also some minor improvements to talk about:
-
-- Package level annotations are now supported (Thanks to Joachim Van der Auwera for that)
-- `Hibernate Core` was upgraded to 4.3.7.Final
-- `Hibernate Envers` was upgraded to 4.3.7.Final
-- `Hibernate Validator` was upgrades to 5.1.3.Final
-
-The upgrade of `Hibernate Validator` is a big step, because 5.x supports Bean Validation 1.1 ( [JSR 349](https://jcp.org/en/jsr/detail?id=349 "Read the specification at jpc.org")).
-See [the FAQ of hibernate-validator](http://hibernate.org/validator/faq/ "Read the first entry for more details on the supported version of Bean Validation") for more details on this.
-
-Because `Hibernate Validator 5` requires the Unified Expression Language (EL) in version 2.2 or later, a dependency to `javax.el-api:3.0.0` was added.
-That does the trick for the integration-tests included in the source code of the plugin.
-But, because I am not using `Hibernate Validator` in any of my own projects, at the moment, the upgrade may rise some backward compatibility errors, that I am not aware of.
-_If you stumble across any problems, please let me know!_
-
-## Release notes:
-
- `
-commit ec30af2068f2d12a9acf65474ca1a4cdc1aa7122
-Author: Kai Moritz
-Date:   Tue Nov 11 15:28:12 2014 +0100
-    [maven-release-plugin] prepare for next development iteration
-commit 18840e3c775584744199d8323eb681b73b98e9c4
-Author: Kai Moritz
-Date:   Tue Nov 11 15:27:57 2014 +0100
-    [maven-release-plugin] prepare release hibernate4-maven-plugin-1.0.5
-commit b95416ef16bbaafecb3d40888fe97e70cdd75c77
-Author: Kai Moritz
-Date:   Tue Nov 11 15:10:32 2014 +0100
-    Upgraded hibernate-validator from 4.3.2.Final to 5.1.3.Final
-
-    Hibernate Validator 5 requires the Unified Expression Language (EL) in
-    version 2.2 or later. Therefore, a dependency to javax.el-api:3.0.0 was
-    added. (Without that, the compilation of some integration-tests fails!)
-commit ad979a8a82a7701a891a59a183ea4be66672145b
-Author: Kai Moritz
-Date:   Tue Nov 11 14:32:42 2014 +0100
-    Upgraded hibernate-core, hibernate-envers, hibernate-validator and maven-core
-
-     * Upgraded hibernate-core      from 4.3.1.Final to 4.3.7.Final
-     * Upgraded hibernate-envers    from 4.3.1.Final to 4.3.7.Final
-     * Upgraded hibernate-validator from 4.3.1.Final to 4.3.2.Final
-     * Upgraded maven-core          from 3.2.1       to 3.2.3
-commit 347236c3cea0f204cefd860c605d9f086e674e8b
-Author: Kai Moritz
-Date:   Tue Nov 11 14:29:23 2014 +0100
-    Added FAQ-entry for problem with whitespaces in the path under Windows
-commit 473c3ef285c19e0f0b85643b67bbd77e06c0b926
-Author: Kai Moritz
-Date:   Tue Oct 28 23:37:45 2014 +0100
-    Explained how to suppress dependency-scanning in documentation
-
-    Also added a test-case to be sure, that dependency-scanning is skipped, if
-    the parameter "dependencyScanning" is set to "none".
-commit 74c0dd783b84c90e116f3e7f1c8d6109845ba71f
-Author: Kai Moritz
-Date:   Mon Oct 27 09:04:48 2014 +0100
-    Fixed NullPointerException, when dialect is specified in properties-file
-
-    Also added an integration test-case, that proofed, that the error was
-    solved.
-commit d27f7af23c82167e873ce143e50ce9d9a65f5e61
-Author: Kai Moritz
-Date:   Sun Oct 26 11:16:00 2014 +0100
-    Renamed an integration-test to test for whitespaces in the filename
-commit 426d18e689b89f33bf71601becfa465a00067b10
-Author: Kai Moritz
-Date:   Sat Oct 25 17:29:41 2014 +0200
-    Added patch by Joachim Van der Auwera to support package level annotations
-commit 3a3aeaabdb1841faf5e1bf8d220230597fb22931
-Author: Kai Moritz
-Date:   Sat Oct 25 16:52:34 2014 +0200
-    Integrated integration test provided by Claus Graf (clausgraf@gmail.com)
-commit 3dd832edbd50b1499ea6d53e4bcd0ad4c79640ed
-Author: Kai Moritz
-Date:   Mon Jun 2 10:31:13 2014 +0200
-    [maven-release-plugin] prepare for next development iteration
-`
diff --git a/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-released.md b/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-0-released.md
deleted file mode 100644 (file)
index 16cd104..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
----
-_edit_last: "2"
-_wp_old_slug: hibernat4-maven-plugin-1-0-released
-author: kai
-categories:
-  - hibernate
-  - java
-  - maven
-date: "2012-11-29T20:04:25+00:00"
-guid: http://juplo.de/?p=55
-parent_post_id: null
-post_id: "55"
-title: hibernate4-maven-plugin 1.0 released!
-url: /hibernate4-maven-plugin-1-0-released/
-
----
-**Yeah!** We successfully released our first artifact to [Central](http://search.maven.org/ "Central").
-
-**[hibernate4-maven-plugin](/hibernate4-maven-plugin/ "hibernate4-maven-plugin")** is now available in the [Central Maven Repository](http://search.maven.org/#artifactdetails|de.juplo|hibernate4-maven-plugin|1.0|maven-plugin "Central Maven Repository")
-
-That means, that you now can use it without manually downloading and adding it to your local repository.
-
-Simply define it in your `plugins`-section...
-
-```
-
-  de.juplo
-  hibernate4-maven-plugin
-  1.0
-
-```
-
-...and there you go!
-
-- [hibernate4-maven-plugin?](/hibernate4-maven-plugin/ "hibernate4-maven-plugin") What's that for?!?
-- [Read more about the hibernate4-maven-plugin...](/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/ "About the hibernate4-maven-plugin")
-- [Jump to the quickstart-guide!](/hibernate4-maven-plugin-1.0/examples.html "Quickstart")
diff --git a/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-1-0-released.md b/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-1-1-0-released.md
deleted file mode 100644 (file)
index 1628f46..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - hibernate
-  - java
-  - jpa
-  - maven
-  - uncategorized
-date: "2015-05-16T14:52:37+00:00"
-guid: http://juplo.de/?p=348
-parent_post_id: null
-post_id: "348"
-title: hibernate4-maven-plugin 1.1.0 released!
-url: /hibernate4-maven-plugin-1-1-0-released/
-
----
-Today we released the version 1.1.0 of [hibernate4-maven-plugin](/hibernate4-maven-plugin "hibernate4-maven-plugin") to [Central](http://search.maven.org/#search|gav|1|g%3A%22de.juplo%22%20AND%20a%3A%22hibernate4-maven-plugin%22 "Central")!
-
-The main work in this release were modification to the process of configuration-gathering.
-The plugin now also is looking for a `hibernate.cfg.xml` on the classpath or a persistence-unit specified in a `META-INF/persistence.xml`.
-
-With this enhancement, the plugin is now able to deal with all examples from the official
-[Hibernate Getting Started Guide](https://docs.jboss.org/hibernate/orm/3.6/quickstart/en-US/html/index.html "Read the Tutorial").
-
-All configuration infos found are merged together with the same default precedences applied by hibernate.
-So, the overall order, in which possible configuration-sources are checked is now (each later source might overwrite settings of a previous source):
-
-1. `hibernate.properties`
-1. `hibernate.cfg.xml`
-1. `persistence.xml`
-1. maven properties
-1. plugin configuration
-
-Because the possible new configuration-sources might change the expected behavior of the plugin, we lifted the version to 1.1.
-
-This release also fixes a bug, that occured on some platforms, if the path to the project includes one or more space characters.
-
-## Release notes:
-
- `
-commit 94e6b2e93fe107e75c9d20aa1eb3126e78a5ed0a
-Author: Kai Moritz
-Date:   Sat May 16 14:14:44 2015 +0200
-    Added script to check outcome of the hibernate-tutorials
-commit b3f8db2fdd9eddbaac002f94068dd1b4e6aef9a8
-Author: Kai Moritz
-Date:   Tue May 5 12:43:15 2015 +0200
-    Configured hibernate-tutorials to use the plugin
-commit 4b6fc12d443b0594310e5922e6ad763891d5d8fe
-Author: Kai Moritz
-Date:   Tue May 5 12:21:39 2015 +0200
-    Fixed the settings in the pom's of the tutorials
-commit 70bd20689badc18bed866b3847565e1278433503
-Author: Kai Moritz
-Date:   Tue May 5 11:49:30 2015 +0200
-    Added tutorials of the hibernate-release 4.3.9.Final as integration-tests
-commit 7e3e9b90d61b077e48b59fc0eb63059886c68cf5
-Author: Kai Moritz
-Date:   Sat May 16 11:04:36 2015 +0200
-    JPA-jdbc-properties are used, if appropriate hibernate-properties are missing
-commit c573877a186bec734915fdb3658db312e66a9083
-Author: Kai Moritz
-Date:   Thu May 14 23:43:13 2015 +0200
-    Hibernate configuration is gathered from class-path by default
-commit 2a85cb05542795f9cd2eed448f212f92842a85e8
-Author: Kai Moritz
-Date:   Wed May 13 09:44:18 2015 +0200
-    Found no way to check, that mapped classes were found
-commit 038ccf9c60be6c77e2ba9c2d2a2a0d261ce02ccb
-Author: Kai Moritz
-Date:   Tue May 12 22:13:23 2015 +0200
-    Upgraded scannotation from 1.0.3 to 1.0.4
-
-    This fixes the bug that occures on some platforms, if the path contains a
-    space. Created a fork of scannotation to bring the latest bug-fixes from SVN
-    to maven central...
-commit c43094689043d7da04df6ca55529d0f0c089d820
-Author: Kai Moritz
-Date:   Sun May 10 19:06:27 2015 +0200
-    Added javadoc-jar to deployed artifact
-commit 524cb8c971de87c21d0d9f0e04edf6bd30f77acc
-Author: Kai Moritz
-Date:   Sat May 9 23:48:39 2015 +0200
-    Be sure to relase all resources (closing db-connections!)
-commit 1e5cca792c49d60e20d7355eb97b13d591d80af6
-Author: Kai Moritz
-Date:   Sat May 9 22:07:31 2015 +0200
-    Settings in a hibernate.cfg.xml are read
-commit 9156c5f6414b676d34eb0c934e70604ba822d09a
-Author: Kai Moritz
-Date:   Tue May 5 23:42:40 2015 +0200
-    Catched NPE, if hibernate-dialect is not set
-commit 62859b260a47e70870e795304756bba2750392e3
-Author: Kai Moritz
-Date:   Sun May 3 18:53:24 2015 +0200
-    Upgraded oss-type, maven-plugin-api and build/report-plugins
-commit c1b3b60be4ad2c5c78cb1e3706019dfceb390f89
-Author: Kai Moritz
-Date:   Sun May 3 18:53:04 2015 +0200
-    Upgraded hibernate to 4.3.9.Final
-commit 038ccf9c60be6c77e2ba9c2d2a2a0d261ce02ccb
-Author: Kai Moritz
-Date:   Tue May 12 22:13:23 2015 +0200
-    Upgraded scannotation from 1.0.3 to 1.0.4
-
-    This fixes the bug that occures on some platforms, if the path contains a
-    space. Created a fork of scannotation to bring the latest bug-fixes from SVN
-    to maven central...
-commit c43094689043d7da04df6ca55529d0f0c089d820
-Author: Kai Moritz
-Date:   Sun May 10 19:06:27 2015 +0200
-    Added javadoc-jar to deployed artifact
-commit 524cb8c971de87c21d0d9f0e04edf6bd30f77acc
-Author: Kai Moritz
-Date:   Sat May 9 23:48:39 2015 +0200
-    Be sure to relase all resources (closing db-connections!)
-commit 1e5cca792c49d60e20d7355eb97b13d591d80af6
-Author: Kai Moritz
-Date:   Sat May 9 22:07:31 2015 +0200
-    Settings in a hibernate.cfg.xml are read
-commit 9156c5f6414b676d34eb0c934e70604ba822d09a
-Author: Kai Moritz
-Date:   Tue May 5 23:42:40 2015 +0200
-    Catched NPE, if hibernate-dialect is not set
-commit 62859b260a47e70870e795304756bba2750392e3
-Author: Kai Moritz
-Date:   Sun May 3 18:53:24 2015 +0200
-    Upgraded oss-type, maven-plugin-api and build/report-plugins
-commit c1b3b60be4ad2c5c78cb1e3706019dfceb390f89
-Author: Kai Moritz
-Date:   Sun May 3 18:53:04 2015 +0200
-    Upgraded hibernate to 4.3.9.Final
-commit 038ccf9c60be6c77e2ba9c2d2a2a0d261ce02ccb
-Author: Kai Moritz
-Date:   Tue May 12 22:13:23 2015 +0200
-    Upgraded scannotation from 1.0.3 to 1.0.4
-
-    This fixes the bug that occures on some platforms, if the path contains a
-    space. Created a fork of scannotation to bring the latest bug-fixes from SVN
-    to maven central...
-commit c43094689043d7da04df6ca55529d0f0c089d820
-Author: Kai Moritz
-Date:   Sun May 10 19:06:27 2015 +0200
-    Added javadoc-jar to deployed artifact
-commit 524cb8c971de87c21d0d9f0e04edf6bd30f77acc
-Author: Kai Moritz
-Date:   Sat May 9 23:48:39 2015 +0200
-    Be sure to relase all resources (closing db-connections!)
-commit 1e5cca792c49d60e20d7355eb97b13d591d80af6
-Author: Kai Moritz
-Date:   Sat May 9 22:07:31 2015 +0200
-    Settings in a hibernate.cfg.xml are read
-commit 9156c5f6414b676d34eb0c934e70604ba822d09a
-Author: Kai Moritz
-Date:   Tue May 5 23:42:40 2015 +0200
-    Catched NPE, if hibernate-dialect is not set
-commit 62859b260a47e70870e795304756bba2750392e3
-Author: Kai Moritz
-Date:   Sun May 3 18:53:24 2015 +0200
-    Upgraded oss-type, maven-plugin-api and build/report-plugins
-commit c1b3b60be4ad2c5c78cb1e3706019dfceb390f89
-Author: Kai Moritz
-Date:   Sun May 3 18:53:04 2015 +0200
-    Upgraded hibernate to 4.3.9.Final
-commit 248ff3220acc8a2c11281959a1496adc024dd4df
-Author: Kai Moritz
-Date:   Sun May 3 18:09:12 2015 +0200
-    Renamed nex release to 1.1.0
-commit 2031d4cfdb8b2d16e4f2c7bbb5c03a15b4f64b21
-Author: Kai Moritz
-Date:   Sun May 3 16:48:43 2015 +0200
-    Generation of tables and rows for auditing is now default
-commit 42465d2a5e4a5adc44fbaf79104ce8cc25ecd8fd
-Author: Kai Moritz
-Date:   Sun May 3 16:20:58 2015 +0200
-    Fixed mojo to scan for properties in persistence.xml
-commit d5a4326bf1fe2045a7b2183cfd3d8fdb30fcb406
-Author: Kai Moritz
-Date:   Sun May 3 14:51:12 2015 +0200
-    Added an integration-test, that depends on properties from a persistence.xml
-commit 5da1114d419ae10f94a83ad56cea9856a39f00b6
-Author: Kai Moritz
-Date:   Sun May 3 14:51:46 2015 +0200
-    Switched to usage of a ServiceRegistry
-commit fed9fc9e4e053c8b61895e78d1fbe045fadf7348
-Author: Kai Moritz
-Date:   Sun May 3 11:42:54 2015 +0200
-    Integration-Test for envers really generates the SQL
-commit fee05864d61145a06ee870fbffd3bff1e95af08c
-Author: Kai Moritz
-Date:   Sun Mar 15 16:56:22 2015 +0100
-    Extended integration-test "hib-test" to check for package-level annotations
-commit 7518f2a7e8a3d900c194dbe61609efa34ef047bd
-Author: Kai Moritz
-Date:   Sun Mar 15 15:42:01 2015 +0100
-    Added support for m2e
-
-    Thanks to Andreas Khutz
-`
diff --git a/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations.md b/generated-2025-11-21-17-29-08/content/posts/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations.md
deleted file mode 100644 (file)
index 109e6c9..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
----
-_edit_last: "1"
-author: kai
-categories:
-  - hibernate
-  - java
-  - maven
-date: "2020-06-15T19:15:58+00:00"
-guid: http://juplo.de/?p=34
-parent_post_id: null
-post_id: "34"
-title: hibernate4-maven-plugin
-url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-
----
-## A simple Plugin for generating a Database-Schema from Hibernate 4 Mapping-Annotations
-
-Hibernate comes with the buildin functionality, to automatically create or update the database schema. This functionality is configured in the session-configuraton via the parameter `hbm2ddl.auto` (see [Hibernate Reference Documentation - Chapter 3.4. Optional configuration properties](http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#configuration-optional)). But doing so [is not very wise](http://stackoverflow.com/questions/221379/hibernate-hbm2ddl-auto-update-in-production), because you can easily corrupt or erase your production database, if this configuration parameter slips through to your production environment.
-
-Alternatively, you can [run the tools **SchemaExport** or **SchemaUpdate** by hand](http://stackoverflow.com/questions/835961/how-to-creata-database-schema-using-hibernate). But that is not very comfortable and being used to maven you will quickly long for a plugin, that does that job automatically for you, when you fire up your test cases.
-
-In the good old times, there was the [Maven Hibernate3 Plugin](http://mojo.codehaus.org/maven-hibernate3/hibernate3-maven-plugin/), that does this for you. But unfortunatly, this plugin is not compatible with Hibernate 4.x. Since there does not seem to be any successor for the Maven Hibernate3 Plugin and [googeling](http://www.google.de/search?q=hibernate4+maven+plugin) does not help, I decided to write up this simple plugin (inspired by these two articles I found: [Schema Export with Hibernate 4 and Maven](http://www.tikalk.com/alm/blog/schema-export-hibernate-4-and-maven) and [Schema generation with Hibernate 4, JPA and Maven](http://doingenterprise.blogspot.de/2012/05/schema-generation-with-hibernate-4-jpa.html)).
-
-I hope, the resulting simple to use buletproof [hibernate4-maven-plugin](/hibernate4-maven-plugin/) is usefull!
-
-**[Try it out now!](/hibernate4-maven-plugin/)**
diff --git a/generated-2025-11-21-17-29-08/content/posts/how-to-instantiatiate-multiple-beans-dinamically-in-spring-boot-based-on-configuration-properties.md b/generated-2025-11-21-17-29-08/content/posts/how-to-instantiatiate-multiple-beans-dinamically-in-spring-boot-based-on-configuration-properties.md
deleted file mode 100644 (file)
index f3d635a..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - demos
-  - explained
-  - howto
-  - java
-  - spring
-  - spring-boot
-classic-editor-remember: classic-editor
-date: "2020-11-21T10:12:57+00:00"
-guid: http://juplo.de/?p=1185
-parent_post_id: null
-post_id: "1185"
-title: How To Instantiatiate Multiple Beans Dinamically in Spring-Boot Depending on Configuration-Properties
-url: /how-to-instantiatiate-multiple-beans-dinamically-in-spring-boot-based-on-configuration-properties/
-
----
-## TL;DR
-
-In this mini-HowTo I will show a way, how to instantiate multiple beans dinamically in Spring-Boot, depending on configuration-properties.
-We will:
-
-- write a **`ApplicationContextInitializer`** to add the beans to the context, before it is refreshed
-- write a **`EnvironmentPostProcessor`** to access the configured configuration sources
-- register the `EnvironmentPostProcessor` with Spring-Boot
-
-## Write an ApplicationContextInitializer
-
-Additionally Beans can be added programatically very easy with the help of an `ApplicationContextInitializer`:
-
-`@AllArgsConstructor
-public class MultipleBeansApplicationContextInitializer
-    implements
-      ApplicationContextInitializer
-{
-  private final String[] sites;
-  @Override
-  public void initialize(ConfigurableApplicationContext context)
-  {
-    ConfigurableListableBeanFactory factory =
-        context.getBeanFactory();
-    for (String site : sites)
-    {
-      SiteController controller =
-          new SiteController(site, "Descrition of site " + site);
-      factory.registerSingleton("/" + site, controller);
-    }
-  }
-}
-`
-
-This simplified example is configured with a list of strings that should be registered as controllers with the `DispatcherServlet`.
-All "sites" are insances of the same controller `SiteController`, which are instanciated and registered dynamically.
-
-The instances are registered as beans with the method **`registerSingleton(String name, Object bean)`**
-of a `ConfigurableListableBeanFactory` that can be accessed through the provided `ConfigurableApplicationContext`
-
-The array of strings represents the accessed configuration properties in the simplified example.
-The array will most probably hold more complex data-structures in a real-world application.
-
-_But how do we get access to the configuration-parameters, that are injected in this array here...?_
-
-## Accessing the Configured Property-Sources
-
-Instantiating and registering the additionally beans is easy.
-The real problem is to access the configuration properties in the early plumbing-stage of the application-context, in that our `ApplicationContextInitializer` runs in:
-
-_The initializer cannot be instantiated and autowired by Spring!_
-
-**The Bad News:** In the early stage we are running in, we cannot use autowiring or access any of the other beans that will be instantiated by spring - especially not any of the beans, that are instantiated via `@ConfigurationProperties`, we are intrested in.
-
-**The Good News:** We will present a way, how to access initialized instances of all property sources, that will be presented to your app
-
-## Write an EnvironmentPostProcessor
-
-If you write an **`EnvironmentPostProcessor`**, you will get access to an instance of `ConfigurableEnvironment`, that contains a complete list of all `PropertySource`'s, that are configured for your Spring-Boot-App.
-
-`public class MultipleBeansEnvironmentPostProcessor
-    implements
-      EnvironmentPostProcessor
-{
-  @Override
-  public void postProcessEnvironment(
-      ConfigurableEnvironment environment,
-      SpringApplication application)
-  {
-    String sites =
-        environment.getRequiredProperty("juplo.sites", String.class);
-    application.addInitializers(
-        new MultipleBeansApplicationContextInitializer(
-            Arrays
-                .stream(sites.split(","))
-                .map(site -> site.trim())
-                .toArray(size -> new String[size])));
-  }
-}
-`
-
-**The Bad News:**
-Unfortunately, you have to scan all property-sources for the parameters, that you are interested in.
-Also, all values are represented as stings in this early startup-phase of the application-context, because Spring's convenient conversion mechanisms are not available yet.
-So, you have to convert any values by yourself and stuff them in more complex data-structures as needed.
-
-**The Good News:**
-The property names are consistently represented in standard Java-Properties-Notation, regardless of the actual type ( `.properties` / `.yml`) of the property source.
-
-## Register the EnvironmentPostProcessor
-
-Finally, you have to [register](https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-customize-the-environment-or-application-context "Read more on details and/or alternatives of the mechanism") the `EnvironmentPostProcessor` with your Spring-Boot-App.
-This is done in the **`META-INF/spring.factories`**:
-
-`org.springframework.boot.env.EnvironmentPostProcessor=\
-  de.juplo.demos.multiplebeans.MultipleBeansEnvironmentPostProcessor
-`
-
-**That's it, your done!**
-
-## Source Code
-
-You can find the whole source code in a working mini-application on juplo.de and GitHub:
-
-- [/git/demos/multiple-beans/](/git/demos/multiple-beans/)
-- [https://github.com/juplo/demos-multiple-beans](https://github.com/juplo/demos-multiple-beans)
-
-## Other Blog-Posts On The Topic
-
-- The blog-post [Dynamic Beans in Spring](https://blog.pchudzik.com/201705/dynamic-beans/) shows a way to register beans dynamically, but does not show how to access the configuration. Also, meanwhile another interface was added to spring, that facilitates this approach: `BeanDefinitionRegistryPostProcessor `
-- Benjamin shows in [How To Create Your Own Dynamic Bean Definitions In Spring](https://comsystoreply.de/blog-post/how-to-create-your-own-dynamic-bean-definitions-in-spring), how this interface can be applied and how one can access the configuration. But his example only works with plain Spring in a Servlet Container
diff --git a/generated-2025-11-21-17-29-08/content/posts/how-to-keep-the-time-zone-when-deserializing-a-zoneddatetime-with-jackson.md b/generated-2025-11-21-17-29-08/content/posts/how-to-keep-the-time-zone-when-deserializing-a-zoneddatetime-with-jackson.md
deleted file mode 100644 (file)
index c82278f..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
----
-_edit_last: "3"
-author: kai
-categories:
-  - jackson
-  - java
-  - leitmarkt-wettbewerb-createmedia.nrw
-date: "2015-11-12T15:12:05+00:00"
-guid: http://juplo.de/?p=554
-parent_post_id: null
-post_id: "554"
-title: How To Keep The Time-Zone When Deserializing A ZonedDateTime With Jackson
-url: /how-to-keep-the-time-zone-when-deserializing-a-zoneddatetime-with-jackson/
-
----
-## The Problem: Jackson Loses The Time-Zone During Dezerialization Of A ZonedDateTime
-
-In its default configuration [Jackson](http://wiki.fasterxml.com/JacksonHome "Visit the homepage of the Jackson-project") adjusts the time-zone of a `ZonedDateTime` to the time-zone of the local context.
-As, by default, the time-zone of the local context is not set and has to be configured manually, Jackson adjusts the time-zone to GMT.
-
-This behavior is very unintuitive and not well documented.
-[It looks like Jackson just loses the time-zone during deserialization](http://stackoverflow.com/questions/19460004/jackson-loses-time-offset-from-dates-when-deserializing-to-jodatime/33674296 "Read this question on Stackoverflow for example") and, [if you serialize and deserialize a `ZonedDateTime`, the result will not equal the original instance](https://github.com/FasterXML/jackson-datatype-jsr310/issues/22 "See this issue on the jackson-datatype-jsr310 on GitHub"), because it has a different time-zone.
-
-## The Solution: Tell Jackson, Not To Adjust the Time-Zone
-
-Fortunately, there is a quick and simple fix for this odd default-behavior: you just have to tell Jackson, not to adjust the time-zone.
-Tis can be done with this line of code:
-
-```java
-mapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
-```
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/how-to-redirect-to-spring-security-oauth-behind-a-gateway-proxy-part-debugging-the-oauth-flow.md b/generated-2025-11-21-17-29-08/content/posts/how-to-redirect-to-spring-security-oauth-behind-a-gateway-proxy-part-debugging-the-oauth-flow.md
deleted file mode 100644 (file)
index 65afb0a..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-classic-editor-remember: classic-editor
-date: "2020-03-07T15:58:36+00:00"
-draft: "true"
-guid: http://juplo.de/?p=1116
-parent_post_id: null
-post_id: "1116"
-title: 'How To Redirect To Spring Security OAuth2 Behind a Gateway/Proxy -- Part 3: Debugging The OAuth2-Flow'
-url: /
-
----
-If you only see something like the following, after starting NGINX, you have forgotten, to start your app before (in the network `juplo`):
-
-```sh
-2020/03/06 14:31:20 [emerg] 1#1: host not found in upstream "app:8080" in /etc/nginx/conf.d/proxy.conf:2
-nginx: [emerg] host not found in upstream "app:8080" in /etc/nginx/conf.d/proxy.conf:2
-
-```
-
-```sh
-
-```
-
-```sh
-
-```
diff --git a/generated-2025-11-21-17-29-08/content/posts/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway.md b/generated-2025-11-21-17-29-08/content/posts/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway.md
deleted file mode 100644 (file)
index a916f39..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - howto
-  - java
-  - oauth2
-  - spring
-  - spring-boot
-classic-editor-remember: classic-editor
-date: "2020-11-10T07:20:07+00:00"
-guid: http://juplo.de/?p=1037
-parent_post_id: null
-post_id: "1037"
-title: 'How To Redirect To Spring Security OAuth2 Behind a Gateway/Proxy -- Part 2: Hiding The App Behind A Reverse-Proxy (Aka Gateway)'
-url: /how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/
-
----
-This post is part of a series of Mini-Howtos, that gather some help, to get you started, when switching from localhost to production with SSL and a reverse-proxy (aka gateway) in front of your app, that forwards the requests to your app that listens on a different name/IP, port and protocol.
-
-## In This Series We...
-
-1. [Run the official Spring-Boot-OAuth2-Tutorial as a container in docker](/howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker/)
-1. Simulate production by hiding the app behind a gateway (this part)
-1. Show how to debug the oauth2-flow for the whole crap!
-1. Enable SSL on our gateway
-1. Show how to do the same with Facebook, instead of GitHub
-
-I will also give some advice for those of you, who are new to Docker - _but just enough to enable you to follow_.
-
-This is **part 2** of this series, that shows how to **run a Spring-Boot OAuth2 App behind a gateway**
-\- Part 1 is linked above.
-
-## Our Plan: Simulating A Production-Setup
-
-We will simulate a production-setup by adding the domain, that will be used in production - `example.com` in our case -, as an alias for `localhost`.
-
-Additionally, we will start an [NGINX](https://nginx.com) as reverse-proxy alongside our app and put both containers into a virtual network.
-This simulates a real-world secenario, where your app will be running behinde a gateway together with a bunch of other apps and will have to deal with forwarded requests.
-
-Together, this enables you to test the production-setup of your oauth2-provider against a locally running development environment, including the configuration of the finally used URIs and nasty forwarding-errors.
-
-To reach this goal we will have to:
-
-1. [Reconfigure our oauth-provider for the new domain](#provider-production-setup)
-1. [Add the domain as an alias for localhost](#set-alias-for-domain)
-1. [Create a virtual network](#create-virtual-network)
-1. [Move the app into the created virtual network](#move-app-into-virtual-network)
-1. [Configure and start nginx as gateway in the virtual network](#start-gateway-in-virtual-network)
-
-_By the way:_
-Any other server, that can act as reverse proxy, or some real gateway,like [Zuul](https://github.com/Netflix/zuul "In real real-world you should consider something like Zuul of similar") would work as well, but we stick with good old NGINX, to keep it simple.
-
-## Switching The Setup Of Your OAuth2-Provider To Production
-
-In our example we are using GitHub as oauth2-provider and `example.com` as the domain, where the app should be found after the release.
-So, we will have to change the **Authorization callback URL** to
-**`http://example.de/login/oauth2/code/github`**
-
-![](/wp-uploads/2020/03/github-example.jpg)
-
-O.k., that's done.
-
-But we haven't released yet and nothing can be found on the reals server, that hosts `example.com`...
-But still, we really would like to test that production-setup to be sure that we configured all bits and pieces correctly!
-
-_In order to tackle this chicken-egg-problem, we will fool our locally running browser to belive, that `example.com` is our local development system._
-
-## Setting Up The Alias for `example.com`
-
-On Linux/Unix this can be simply done by editing **`/etc/hosts`**.
-You just have to add the domain ( `example.com`) at the end of the line that starts with `127.0.0.1`:
-
-```hosts
-127.0.0.1      localhost example.com
-
-```
-
-Locally running programms - like your browser - will now resolve `example.com` as `127.0.0.1`
-
-## Create A Virtual Network With Docker
-
-Next, we have to create a virtual network, where we can put in both containers:
-
-```sh
-docker network create juplo
-
-```
-
-Yes, with Docker it is as simple as that.
-
-Docker networks also come with some extra goodies.
-Especially one, which is extremly handy for our use-case is: They are enabling automatic name-resolving for the connected containers.
-Because of that, we do not need to know the IP-addresses of the participating containers, if we give each connected container a name.
-
-## Docker vs. Kubernetes vs. Docker-Compose
-
-We are using Docker here on purpose.
-Using Kubernetes just to test / experiment on a DevOp-box would be overkill.
-Using Docker-Compose might be an option.
-But we want to keep it as simple as possible for now, hence we stick with Docker.
-Also, we are just experimenting here.
-
-_You might want to switch to Docker-Compose later._
-_Especially, if you plan to set up an environment, that you will frequently reuse for manual tests or such._
-
-## Move The App Into The Virtual Network
-
-To move our app into the virtual network, we have to start it again with the additional parameter **`--network`**.
-We also want to give it a name this time, by using **`--name`**, to be able to contact it by name.
-
-_You have to stop and remove the old container from part 1 of this HowTo-series with `CTRL-C` beforehand, if it is still running - Removing is done automatically, because we specified `--rm`_:
-
-```sh
-docker run \
-  -d \
-  --name app \
-  --rm \
-  --network juplo \
-  juplo/social-logout:0.0.1 \
-  --server.use-forward-headers=true \
-  --spring.security.oauth2.client.registration.github.client-id=YOUR_GITHUB_ID \
-  --spring.security.oauth2.client.registration.github.client-secret=YOUR_GITHUB_SECRET
-
-```
-
-Summary of the changes in comparison to [the statement used in part 1](/howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker/#build-a-docker-image "Skip back to part 1, if you want to compare..."):
-
-- We added **`-d`** to run the container in the background - _See tips below..._
-- We added **`--server.use-forward-headers=true`**, which is needed, because our app is running behind a gateway now - _I will explain this in more detail later_
-- _And:_ Do not forget the **`--network juplo`**,
-  which is necessary to put the app in our virtual network `juplo`, and **`--name app`**, which is necessary to enable DNS-resolving.
-
-- You do not need the port-mapping this time, because we will only talk to our app through the gateway.  
-
-  Remember: _We are **hiding** our app behind the gateway!_
-
-## Some quick tips to Docker-newbies
-
-- Since we are starting multiple containers, that shall run in parallel, you have to start each command in a separate terminal, because **`CTRL-C`** will stop (and in our case remove) the container again.
-
-- Alternatively, you can add the parameter **`-d`** (for daemonize) to start the container in the background.
-
-- Then, you can look at its output with **`docker logs -f NAME`** (safely disruptable with `CTRL-C`) and stop (and in our case remove) the container with **`docker stop NAME`**.
-
-- If you wonder, which containers are actually running, **`docker ps`** is your friend.
-
-## Starting the Reverse-Proxy Aka Gateway
-
-Next, we will start NGINX alongside our app and configure it as reverse-proxy:
-
-1. Create a file **`proxy.conf`** with the following content:
-
-   ```sh
-   upstream upstream_a {
-     server        app:8080;
-   }
-
-   server {
-     listen        80;
-     server_name   example.com;
-
-     proxy_set_header     X-Real-IP           $remote_addr;
-     proxy_set_header     X-Forwarded-For     $proxy_add_x_forwarded_for;
-     proxy_set_header     X-Forwarded-Proto   $scheme;
-     proxy_set_header     Host                $host;
-     proxy_set_header     X-Forwarded-Host    $host;
-     proxy_set_header     X-Forwarded-Port    $server_port;
-
-     location / {
-       proxy_pass  http://upstream_a;
-     }
-   }
-
-   ```
-
-   - We define a server, that listens to requests for the host **`example.com`** ( `server_name`) on port **`80`**.
-   - With the `location`-directive we tell this server, that all requests shall be handled by the upstream-server **`upstream_a`**.
-   - This server was defined in the `upstream`-block at the beginning of the configuration-file to be a forward to **`app:8080`**
-   - **`app`** is simply the name of the container, that is running our oauth2-app - Rembember: the name is resolvable via DNS
-   - **`8080`** is the port, our app listens on in that container.
-   - The `proxy_set_header`-directives are needed by Spring-Boot Security, for dealing correctly with the circumstance, that it is running behind a reverse-proxy.
-
-_In part 3, we will survey the `proxy_set_header`-directives in more detail._
-1. Start nginx in the virtual network and connect port `80` to `localhost`:
-
-   ```sh
-   docker run \
-     --name proxy \
-     --rm \
-     --network juplo -p 80:80 \
-     --volume $(pwd)/proxy.conf:/etc/nginx/conf.d/proxy.conf:ro \
-     nginx:1.17
-
-   ```
-
-   _This command has to be executed in the direcotry, where you have created the file `proxy.conf`._
-
-   - I use NGINX here, because I want to demystify the work of a gateway  
-_[traefik](https://docs.traefik.io/ "Read more about this great tool") would have been easier to configure in this setup, but it would have disguised, what is going on behind the scene: with NGINX we have to configure all manually, which is more explicitly and hence, more informative_
-   - We can use port `80` on localhost, since the docker-daemon runs with root-privileges and hence, can use this privileged port - _if you do not have another webserver running locally there_.
-   - `$(pwd)` resolves to your current working-directory - This is the most convenient way to produce the absolute path to `proxy.conf`, that is required by `--volume` to work correclty.
-
-If you have reproduced the receipt exacly, your app should be up and running now.
-That is:
-
-   - Because we set the alias `example.com` to point at `localhost` you should now be able to open your app as **`http://example.com` in a locally running browser**
-   - You then should be able to login/logount without errors
-   - If you have configured everything correctly, neither your app nor GitHub should mutter at you during the redirect to GitHub and back to your app
-
-## Whats next... is what can go wrong!
-
-In this simulated production-setup a lot of stuff can go wrong!
-You may face nearly any problem from configuration-mismatches considering the redirect-URIs to nasty and hidden redirect-issues due to forwarded requests.
-
-_Do not mutter at me..._
-_**Remember:** That was the reason, we set up this simulated production-setup in the first place!_
-
-In the next part of this series I will explain some of the most common problems in a production-setup with forwarded requests.
-I will also show, how you can debug the oauth2-flow in your simulated production-setup, to discover and solve these problems
diff --git a/generated-2025-11-21-17-29-08/content/posts/howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker.md b/generated-2025-11-21-17-29-08/content/posts/howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker.md
deleted file mode 100644 (file)
index fccdf35..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
----
-_edit_last: "2"
-_wp_old_date: "2020-03-06"
-author: kai
-categories:
-  - howto
-  - java
-  - oauth2
-  - spring
-  - spring-boot
-classic-editor-remember: classic-editor
-date: "2020-03-06T22:02:44+00:00"
-guid: http://juplo.de/?p=1064
-parent_post_id: null
-post_id: "1064"
-title: 'How To Redirect To Spring Security OAuth2 Behind a Gateway/Proxy - Part 1: Running Your  App In Docker'
-url: /howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker/
-
----
-## Switching From Tutorial-Mode (aka POC) To Production Is Hard
-
-Developing Your first OAuth2-App on [`localhost`](https://www.google.com/search?q=there+no+place+like+%22127.0.0.1%22&tbm=isch&ved=2ahUKEwjF-8XirIHoAhWzIMUKHWcZBJYQ2-cCegQIABAA&oq=there+no+place+like+%22127.0.0.1%22&gs_l=img.3..0i30l3j0i8i30l4.8396.18840..19156...0.0..0.114.2736.30j1......0....1..gws-wiz-img.......35i39j0j0i19j0i30i19j0i8i30i19.joOmqxpmfsw&ei=EeZfXoWvIrPBlAbnspCwCQ&bih=949&biw=1853) with [OAuth2 Boot](https://docs.spring.io/spring-security-oauth2-boot/docs/current/reference/htmlsingle/ "Learn more about OAuth2 Boot") may be easy, ...
-
-...but what about running it in **real life**?
-
-![Looking for the real life](/wp-uploads/2020/03/real-life-meme-300x297.png)
-
-This is the first post of a series of Mini-Howtos, that gather some help, to get you started, when switching from localhost to production with SSL and a reverse-proxy (aka gateway) in front of your app, that forwards the requests to your app that listens on a different name/IP, port and protocol.
-
-## In This Series We Will...
-
-1. [Start with](#spring-boot-oauth2) the fantastic official [OAuth2-Tutorial](https://spring.io/guides/tutorials/spring-boot-oauth2/ "You definitely should work through this tutorial first!") from the Spring-Boot folks - _love it!_ \- and [run it as a container in docker](#build-a-docker-image)
-1. [Hide that behind a reverse-proxy, like in production - _nginx in our case, but could be any pice of software, that can act as a gateway_](/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/ "Jump to part 2 and learn how to set up a simulated production-installation")
- [Show how to debug the oauth2-flow for the whole crap!\
-Enable SSL for our gateway - because oauth2-providers (like Facebook) are pressing us to do so\
-Show how to do the same with Facebook, instead of GitHub](/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/ "Jump to part 2 and learn how to set up a simulated production-installation")
-
-[I will also give some advice for those of you, who are new to Docker - _but just enough to enable you to follow_.\
-\
-This is **Part 1** of this series, that shows how to **package a Spring-Boot-App as Docker-Image and run it as a container**\
-**`tut-spring-boot-oauth2/logout`**](/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/ "Jump to part 2 and learn how to set up a simulated production-installation")
-
-[As an example for a simple app, that uses](/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/ "Jump to part 2 and learn how to set up a simulated production-installation") [OAuth2](https://tools.ietf.org/html/rfc6749 "Read all about OAuth2 in the RFC 6749") for authentication, we will use the third step of the [Spring-Boot OAuth2-Tutorial](https://spring.io/guides/tutorials/spring-boot-oauth2/ "You definitely should work through this tutorial first!").
-
-You should work through that tutorial up until that step - called **logout** -, if you have not done yet.
-This will guide you through programming and setting up a simple app, that uses the [GitHub-API](https://developer.github.com/v3/ "Learn more about the API provided by GitHub") to authenticate its users.
-
-Especially, it explains, how to **[create and set up a OAuth2-App on GitHub](https://spring.io/guides/tutorials/spring-boot-oauth2/#github-register-application "This links directly to the part of the tutorial, that explains the setup & configuration needed in GitHub Developers")** \- _Do not miss out on that part: You need your own app-ID and -secret and a correctly configured **redirect URI**_.
-
-You should be able to build the app as JAR and start that with the ID/secret of your GitHub-App without changing code or configuration-files as follows:
-
-```docker
-mvn package
-java -jar target/social-logout-0.0.1-SNAPSHOT.jar \
-  --spring.security.oauth2.client.registration.github.client-id=YOUR_GITHUB_APP_ID
-  --spring.security.oauth2.client.registration.github.client-secret=YOUR_GITHUB_APP_SECRET
-
-```
-
-_If the app is running corectly, you should be able to Login/Logout via **`http://localhost:8080/`**_
-
-The folks at Spring-Boot are keeping the guide and this repository up-to-date pretty well.
-At the date of the writing of this article it is up to date with version [2.2.2.RELEASE](https://github.com/spring-guides/tut-spring-boot-oauth2/commit/274b864a2bcab5326979bc2ba370e32180510362 "Check out the exact version of this example-project, that is used in this article, if you want") of Spring-Boot.
-
-_You may as well use any other OAuth2-application here. For example your own POC, if you already have build one that works while running on `localhost`_
-
-## Some Short Notes On OAuth2
-
-I will only explain the protocol in very short words here, so that you can understand what goes wrong in case you stumble across one of the many pitfalls, when setting up oauth2.
-You can [read more about oauth2 elswhere](https://www.oauth.com/oauth2-servers/getting-ready/ "And you most probably should: At least if you are planning to use it in production!")
-
-For authentication, [oauth2](https://tools.ietf.org/html/rfc6749 "OAuth2 is a standardized protocol, that was implemented by several authorities and organizations") redirects the browser of your user to a server of your oauth2-provider.
-This server authenticates the user and redirects the browser back to your server, providing additionally information and ressources, that lets your server know that the user was authenticated successfully and enables it to request more information in the name of the user.
-
-Hence, when configuring oath2 one have to:
-
-1. Provide the URI of the server of your oauth2-provider, the browser will be redirected to for authentication
-1. Tell the server of the oauth2-provider the URL, the browser will be redirected to back after authentication
-1. Also, your app has to provide some identification - a client-ID and -secret - when redirecting to the server of your oauth2-provider, which it has to know
-
-There are a lot more things, which can be configured in oauth2, because the protocol is designed to fit a wide range of use-cases.
-But in our case, it usually boils down to the parameters mentioned above.
-
-Considering our combination of **`spring-security-oauth2`** with **GitHub** this means:
-
-1. The redirect-URIs of well known oauth2-providers like GitHub are build into the library and do not have to be configured explicitly.
-1. The URI, the provider has to redirect the browser back to after authenticating the user, is predefined by the library as well.  
-_But as an additional security measure, almost every oauth2-provider requires you, to also specify this redirect-URI in the configuration on the side of the oauth2-provider._  
-
-   This is a good and necessary protection against fraud, but at the same time the primary source for missconfiguration:
-   **If the specified URI in the configuration of your app and on the server of your oauth2-provider does not match, ALL WILL FAIL!**
-1. The ID and secret of the client (your GitHub-app) always have to be specified explicitly by hand.
-
-Again, everything can be manually overriden, if needed.
-Configuration-keys starting with **`spring.security.oauth2.client.registration.github`** are choosing GitHub as the oauth2-provider and trigger a bunch of predifined default-configuration.
-If you have set up your own oauth2-provider, you have to configure everything manually.
-
-## Running The App Inside Docker
-
-To faciliate the debugging - and because this most probably will be the way you are deploying your app anyway - we will start by building a docker-image from the app
-
-For this, you do not have to change a single character in the example project - _all adjustments to the configuration will be done, when the image is started as a container_.
-Just change to the subdirectory [`logout`](https://github.com/spring-guides/tut-spring-boot-oauth2/tree/master/logout "This is the subdirectory of the GitHub-Porject, that contains that step of the guide") of the checked out project and create the following `Dockerfile` there:
-
-```docker
-FROM openjdk:8-jre-buster
-
-COPY  target/social-logout-0.0.1-SNAPSHOT.jar /opt/app.jar
-EXPOSE 8080
-ENTRYPOINT [ "/usr/local/openjdk-8/bin/java", "-jar", "/opt/app.jar" ]
-CMD []
-
-```
-
-This defines a docker-image, that will run the app.
-
-- The image deduces from **`openjdk:8-jre-buster`**, which is an installation of the latest [OpenJDK-JDK8](https://openjdk.java.net/projects/jdk8/) on a [Debian-Buster](https://www.debian.org/releases/stable/index.de.html "Have a look at the Release notes of that Debian-Version")
-- The app will listen on port **`8080`**
-- By default, a container instanciated from this image will automatically start the Java-app
-- The **`CMD []`** overwrites the default from the parent-image with an empty list - _this enables us to pass command-line parameters to our spring-boot app which we will need to pass in our configuration_
-
-You can build and tag this image with the following commands:
-
-```sh
-mvn clean package
-docker build -t juplo/social-logout:0.0.1 .
-
-```
-
-This will tag your image as **`juplo/social-logout:0.0.1`** \- you obviously will/should use your own tag here, for example: `myfancytag`
-
-_Do not miss out on the flyspeck ( `.`) at the end of the last line!_
-
-You can run this new image with the follwing command - _and you should do that, to test that everything works as expected_:
-
-```sh
-docker run \
-  --rm \
-  -p 8080:8080 \
-  juplo/social-logout:0.0.1 \
-  --spring.security.oauth2.client.registration.github.client-id=YOUR_GITHUB_ID \
-  --spring.security.oauth2.client.registration.github.client-secret=YOUR_GITHUB_SECRET
-
-```
-
-- **`--rm`** removes this test-container automatically, once it is stopped again
-- **`-p 8080:8080`** redirects port `8080` on `localhost` to the app
-
-Everything _after_ the specification of the image (here: `juplo/social-logout:0.0.1`) is handed as a command-line parameter to the started Spring-Boot app - That is, why we needed to declare `CMD []` in our `Dockerfile`
-
-We utilize this here to pass the ID and secret of your GitHub-app into the docker container -- just like when we started the JAR directly
-
-The app should behave exactly the same now lik in the test above, where we started it directly by calling the JAR.
-
-That means, that you should still be able to login into and logout of your app, if you browse to `http://localhost:8080` --
-_At least, if you correctly configured `http://localhost:8080/login/oauth2/code/github` as authorization callback URL in the [settings of your OAuth App](https://github.com/settings/developers "If you have any problems here, you should check your settings: do not proceede, until this works!") on GitHub_.
-
-## Comming Next...
-
-In the [next part](/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/ "Jump to the next part and read on...") of this series, we will hide the app behind a proxy and simulate that the setup is running on our real server **`example.com`**.
diff --git a/generated-2025-11-21-17-29-08/content/posts/implementing-narrow-integrationtests-by-combining-mockserver-with-testcontainers.md b/generated-2025-11-21-17-29-08/content/posts/implementing-narrow-integrationtests-by-combining-mockserver-with-testcontainers.md
deleted file mode 100644 (file)
index 2ac9755..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-classic-editor-remember: classic-editor
-date: "2020-01-11T13:41:39+00:00"
-draft: "true"
-guid: http://juplo.de/?p=1009
-parent_post_id: null
-post_id: "1009"
-title: Implementing Narrow IntegrationTests By Combining MockServer With Testcontainers
-url: /
-
----
-
diff --git a/generated-2025-11-21-17-29-08/content/posts/implementing-the-outbox-pattern-with-kafka-part-0-the-example.md b/generated-2025-11-21-17-29-08/content/posts/implementing-the-outbox-pattern-with-kafka-part-0-the-example.md
deleted file mode 100644 (file)
index a614c26..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - demos
-  - explained
-  - java
-  - kafka
-  - spring
-  - spring-boot
-classic-editor-remember: classic-editor
-date: "2021-02-05T17:59:38+00:00"
-guid: http://juplo.de/?p=1201
-parent_post_id: null
-post_id: "1201"
-title: 'Implementing The Outbox-Pattern With Kafka - Part 0: The example'
-url: /implementing-the-outbox-pattern-with-kafka-part-0-the-example/
-
----
-_This article is part of a Blog-Series_
-
-Based on a [very simple example-project](/implementing-the-outbox-pattern-with-kafka-part-0-the-example/)
-we will implemnt the [Outbox-Pattern](https://microservices.io/patterns/data/transactional-outbox.html) with [Kafka](https://kafka.apache.org/quickstart).
-
-- Part 0: The Example-Project
-- [Part 1: Writing In The Outbox-Table](/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table/ "Jump to the explanation what has to be added, to enqueue messages in an outbox for successfully written transactions")
-
-## TL;DR
-
-In this part, a small example-project is introduced, that features a component, which has to inform another component upon every succsessfully completed operation.
-
-## The Plan
-
-In this mini-series I will implement the [Outbox-Pattern](https://microservices.io/patterns/data/transactional-outbox.html)
-as described on Chris Richardson's fabolous website [microservices.io](https://microservices.io/).
-
-The pattern enables you, to send a message as part of a database transaction in a reliable way, effectively turining the writing of the data
-to the database and the sending of the message into an **[atomic operation](https://en.wikipedia.org/wiki/Atomicity_(database_systems))**:
-either both operations are successful or neither.
-
-The pattern is well known and implementing it with [Kafka](https://kafka.apache.org/quickstart) looks like an easy straight forward job at first glance.
-However, there are many obstacles that easily lead to an incomplete or incorrect implementation.
-In this blog-series, we will circumnavigate these obstacles together step by step.
-
-## The Example Project
-
-To illustrate our implementation, we will use a simple example-project.
-It mimics a part of the registration process for an web application:
-a (very!) simplistic service takes registration orders for new users.
-
-- Successfull registration requests will return a 201 (Created), that carries the URI, under which the data of the newly registered user can be accessed in the `Location`-header:
-
-`echo peter | http :8080/users
-  HTTP/1.1 201
-  Content-Length: 0
-  Date: Fri, 05 Feb 2021 14:44:51 GMT
-  Location: http://localhost:8080/users/peter
-  `
-- Requests to registrate an already existing user will result in a 400 (Bad Request):
-
-`echo peter | http :8080/users
-  HTTP/1.1 400
-  Connection: close
-  Content-Length: 0
-  Date: Fri, 05 Feb 2021 14:44:53 GMT
-  `
-- Successfully registrated users can be listed:
-  `http :8080/users
-  HTTP/1.1 200
-  Content-Type: application/json;charset=UTF-8
-  Date: Fri, 05 Feb 2021 14:53:59 GMT
-  Transfer-Encoding: chunked
-  [
-      {
-          "created": "2021-02-05T10:38:32.301",
-          "loggedIn": false,
-          "username": "peter"
-      },
-      ...
-  ]
-  `
-
-## The Messaging Use-Case
-
-As our messaging use-case imagine, that there has to happen several processes after a successful registration of a new user.
-This may be the generation of an invoice, some business analytics or any other lengthy process that is best carried out asynchronously.
-Hence, we have to generate an event, that informs the responsible services about new registrations.
-
-Obviously, these events should only be generated, if the registration is completed successfully.
-The event must not be fired, if the registration is rejected, because a duplicate username.
-
-On the other hand, the publication of the event must happen reliably, because otherwise, the new might not be charged for the services, we offer...
-
-## The Transaction
-
-The users are stored in a database and the creation of a new user happens in a transaction.
-A "brilliant" colleague came up with the idea, to trigger an `IncorrectResultSizeDataAccessException` to detect duplicate usernames:
-
-`User user = new User(username);
-repository.save(user);
-// Triggers an Exception, if more than one entry is found
-repository.findByUsername(username);
-`
-
-The query for the user by its names triggers an `IncorrectResultSizeDataAccessException`, if more than one entry is found.
-The uncaught exception will mark the transaction for rollback, hence, canceling the requested registration.
-The 400-response is then generated by a corresponding `ExceptionHandler`:
-
-`@ExceptionHandler
-public ResponseEntity incorrectResultSizeDataAccessException(
-    IncorrectResultSizeDataAccessException e)
-{
-  LOG.info("User already exists!");
-  return ResponseEntity.badRequest().build();
-}
-`
-
-Please do not code this at home...
-
-But his weired implementation perfectly illustrates the requirements for our messaging use-case:
-The user is written into the database.
-But the registration is not successfully completed until the transaction is commited.
-If the transaction is rolled back, no message must be send, because no new user was registered.
-
-## Decoupling with Springs EventPublisher
-
-In the example implementation I am using an `EventPublisher` to decouple the business logic from the implementation of the messaging.
-The controller publishes an event, when a new user is registered:
-
-`publisher.publishEvent(new UserEvent(this, usernam));
-`
-
-A listener annotated with `@TransactionalEventListener` receives the events and handles the messaging:
-
-`@TransactionalEventListener
-public void onUserEvent(UserEvent event)
-{
-    // Sending the message happens here...
-}
-`
-
-In non-critical use-cases, it might be sufficient to actually send the message to Kafka right here.
-Spring ensures, that the message of the listener is only called, if the transaction completes successfully.
-But in the case of a failure this naive implementation can loose messages.
-If the application crashes, after the transaction has completed, but before the message could be send, the event would be lost.
-
-In the following blog posts, we will step by step implement a solution based on the Outbox-Pattern, that can guarantee Exactly-Once semantics for the send messages.
-
-## May The Source Be With You!
-
-The complete source code of the example-project can be cloned here:
-
-- `git clone /git/demos/spring/data-jdbc`
-- `git clone https://github.com/juplo/demos-spring-data-jdbc.git`
-
-It includes a [Setup for Docker Compose](https://github.com/juplo/demos-spring-data-jdbc/blob/master/docker-compose.yml), that can be run without compiling
-the project. And a runnable [README.sh](https://github.com/juplo/demos-spring-data-jdbc/blob/master/README.sh), that compiles and run the application and illustrates the example.
diff --git a/generated-2025-11-21-17-29-08/content/posts/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table.md b/generated-2025-11-21-17-29-08/content/posts/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table.md
deleted file mode 100644 (file)
index 5cb1c33..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - demos
-  - explained
-  - java
-  - kafka
-  - spring
-  - spring-boot
-classic-editor-remember: classic-editor
-date: "2021-02-14T18:10:38+00:00"
-guid: http://juplo.de/?p=1209
-parent_post_id: null
-post_id: "1209"
-title: 'Implementing The Outbox-Pattern With Kafka - Part 1: Writing In The Outbox-Table'
-url: /implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table/
-
----
-_This article is part of a Blog-Series_
-
-Based on a [very simple example-project](/implementing-the-outbox-pattern-with-kafka-part-0-the-example/)
-we will implemnt the [Outbox-Pattern](https://microservices.io/patterns/data/transactional-outbox.html) with [Kafka](https://kafka.apache.org/quickstart).
-
-- [Part 0: The Example-Project](/implementing-the-outbox-pattern-with-kafka-part-0-the-example/ "Jump to the explanation of the example project")
-- Part 1: Writing In The Outbox-Table
-
-## TL;DR
-
-In this part, we will implement the outbox (aka: the queueing of the messages in a database-table).
-
-## The Outbox Table
-
-The outbox is represented by an additionall table in the database.
-This table acts as a queue for messages, that should be send as part of the transaction.
-Instead of sending the messages, the application stores them in the outbox-table.
-The actual sending of the messages occures outside of the transaction.
-
-Because the messages are read from the table outside of the transaction context, only entries related to sucessfully commited transactions are visible.
-Hence, the sending of the message effectively becomes a part of the transaction.
-It happens only, if the transaction was successfully completed.
-Messages associated to an aborted transaction will not be send.
-
-## The Implementation
-
-No special measures need to be taken when writing the messages to the table.
-The only thing to be sure of is that the writing takes part in the transaction.
-
-In our implementation, we simply store the **serialized message**, together with a **key**, that is needed for the partitioning of your data in Kafka, in case the order of the messages is important.
-We also store a timestamp, that we plan to record as [Event Time](https://kafka.apache.org/0110/documentation/streams/core-concepts) later.
-
-One more thing that is worth noting is that we utilize the database to create an unique record-ID.
-The generated **unique and monotonically increasing id** is required later, for the implementation of **Exactly-Once** semantics.
-
-[The SQL for the table](https://github.com/juplo/demos-spring-data-jdbc/blob/part-1/src/main/resources/db/migration/h2/V2__Table_outbox.sql) looks like this:
-
- `CREATE TABLE outbox (
-  id BIGINT PRIMARY KEY AUTO_INCREMENT,
-  key VARCHAR(127),
-  value varchar(1023),
-  issued timestamp
-);
-`
-
-## Decoupling The Business Logic
-
-In order to decouple the business logic from the implementation of the messaging mechanism, I have implemented a thin layer, that uses [Spring Application Events](https://docs.spring.io/spring-integration/docs/current/reference/html/event.html) to publish the messages.
-
-Messages are send as a [subclass of `ApplicationEvent`](https://github.com/juplo/demos-spring-data-jdbc/blob/part-1/src/main/java/de/juplo/kafka/outbox/OutboxEvent.java):
-
-`publisher.publishEvent(
-  new UserEvent(
-    this,
-    username,
-    CREATED,
-    ZonedDateTime.now(clock)));
-`
-
-The event takes a key ( `username`) and an object as value (an instance of an enum in our case).
-An `EventListener` receives the events and writes them in the outbox table:
-
-`@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
-public void onUserEvent(OutboxEvent event)
-{
-  try
-  {
-    repository.save(
-        event.getKey(),
-        mapper.writeValueAsString(event.getValue()),
-        event.getTime());
-  }
-  catch (JsonProcessingException e)
-  {
-    throw new RuntimeException(e);
-  }
-}
-`
-
-The `@TransactionalEventListener` is not really needed here.
-A normal `EventListener` would also suffice, because spring immediately executes all registered normal event listeners.
-Therefore, the registered listeners would run in the same thread, that published the event, and participate in the existing transaction.
-
-But if a `@TransactionalEventListener` is used, like in our example project, it is crucial, that the phase is switched to `BEFORE_COMMIT` when the Outbox Pattern is introduced.
-This is, because the listener has to be executed in the same transaction context in which the event was published.
-Otherwise, the writing of the messages would not be coupled to the success or abortion of the transaction, thus violating the idea of the pattern.
-
-## May The Source Be With You!
-
-Since this part of the implementation only stores the messages in a normal database, it can be published as an independent component that does not require any dependencies on Kafka.
-To highlight this, the implementation of this step does not use Kafka at all.
-In a later step, we will separate the layer, that decouples the business code from our messaging logic in a separate package.
-
-The complete source code of the example-project can be cloned here:
-
-- `git clone -b part-1 /git/demos/spring/data-jdbc`
-- `git clone -b part-1 https://github.com/juplo/demos-spring-data-jdbc.git`
-
-This version only includes the logic, that is needed to fill the outbox-tabel.
-Reading the messages from this table and sending them through Kafka will be the topic of the next part of this blog-series.
-
-The sources include a [Setup for Docker Compose](https://github.com/juplo/demos-spring-data-jdbc/blob/master/docker-compose.yml), that can be run without compiling
-the project. And a runnable [README.sh](https://github.com/juplo/demos-spring-data-jdbc/blob/master/README.sh), that compiles and run the application and illustrates the example.
diff --git a/generated-2025-11-21-17-29-08/content/posts/implementing-the-outbox-pattern-with-kafka-part-sending-messages-from-the-outbox.md b/generated-2025-11-21-17-29-08/content/posts/implementing-the-outbox-pattern-with-kafka-part-sending-messages-from-the-outbox.md
deleted file mode 100644 (file)
index 79b2c7e..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-classic-editor-remember: classic-editor
-date: "2021-05-16T14:56:45+00:00"
-draft: "true"
-guid: http://juplo.de/?p=1257
-parent_post_id: null
-post_id: "1257"
-title: 'Implementing The Outbox-Pattern With Kafka - Part 2: Sending Messages From The Outbox'
-url: /
-
----
-_This article is part of a Blog-Series_
-
-Based on a [very simple example-project](/implementing-the-outbox-pattern-with-kafka-part-0-the-example/)
-we will implemnt the [Outbox-Pattern](https://microservices.io/patterns/data/transactional-outbox.html) with [Kafka](https://kafka.apache.org/quickstart).
-
-- [Part 0: The Example-Project](/implementing-the-outbox-pattern-with-kafka-part-0-the-example/ "Jump to the explanation of the example project")
-- [Part 1: Writing In The Outbox-Table](/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table/ "Jump to the explanation what has to be added, to enqueue messages in an outbox for successfully written transactions")
-- Part 2: Sending Messages From The Outbox
-
-## TL;DR
-
-In this part, we will add a first simple version of the logic, that is needed to poll the outbox-table and send the found entries as messages into a Apache Kafka topic.
diff --git a/generated-2025-11-21-17-29-08/content/posts/in-need-of-a-mockwebclient-mock-webclient-with-a-short-circuit-exchangefunction.md b/generated-2025-11-21-17-29-08/content/posts/in-need-of-a-mockwebclient-mock-webclient-with-a-short-circuit-exchangefunction.md
deleted file mode 100644 (file)
index b537dc1..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-classic-editor-remember: classic-editor
-date: "2020-01-11T13:45:04+00:00"
-draft: "true"
-guid: http://juplo.de/?p=1011
-parent_post_id: null
-post_id: "1011"
-title: In Need Of A MockWebClient? Mock WebClient With A Short-Circuit-ExchangeFunction
-url: /
-
----
-
diff --git a/generated-2025-11-21-17-29-08/content/posts/install-google-play-on-hama.md b/generated-2025-11-21-17-29-08/content/posts/install-google-play-on-hama.md
deleted file mode 100644 (file)
index 35f3726..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-date: "2014-02-17T01:25:20+00:00"
-draft: "true"
-guid: http://juplo.de/?p=203
-parent_post_id: null
-post_id: "203"
-title: Install Google Play on Hama...
-url: /
-
----
-[Google Aps](http://goo-inside.me/gapps/gapps-ics-20120317-signed.zip "Download Google Apps for Android 4.0.x (Ice Cream Sandwich)")
-
-You need the Google Apps for Android 4.0.x (called Ice Cream Sandwich internally). These accord to Cyanogenmod 9 and download-links can be found on the [Cyanogenmod's "Google Apps"-page](http://wiki.cyanogenmod.org/w/Google_Apps "Google Apps download-page from cyanogenmod").
diff --git a/generated-2025-11-21-17-29-08/content/posts/integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project.md b/generated-2025-11-21-17-29-08/content/posts/integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project.md
deleted file mode 100644 (file)
index eacc59c..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - bootstrap
-  - css
-  - grunt
-  - java
-  - less
-  - maven
-  - nodejs
-  - spring
-  - thymeleaf
-date: "2015-08-26T11:57:43+00:00"
-guid: http://juplo.de/?p=509
-parent_post_id: null
-post_id: "509"
-title: Integrating A Maven-Backend- With A Nodjs/Grunt-Fronted-Project
-url: /integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project/
-
----
-## Frontend-Development With Nodjs and Grunt
-
-As I already wrote in [a previous article](/serve-static-html-with-nodjs-and-grunt/ "Serving Static HTML With Nodjs And Grunt For Template-Development"), frontend-development is mostly done with [Nodjs](https://nodejs.org/ "Read more about nodjs") and [Grunt](http://gruntjs.com/ "Read more about grunt") nowadays.
-As I am planing to base the frontend of my next Spring-Application on [Bootstrap](http://getbootstrap.com/ "Read more about Bootstrap"), I was looking for a way to integrate my backend, which is build using [Spring](http://projects.spring.io/spring-framework/ "Read more about the Springframework") and [Thymeleaf](http://www.thymeleaf.org/ "Read more about Thymeleaf") and managed with Maven, with a frontend, which is based on Bootstrap and, hence, build with Nodjs and Grunt.
-
-## Integrate The Frontend-Build Into The Maven-Build-Process
-
-As I found out, one can integrate a npm-based build into a maven project with the help of the [frontend-maven-plugin](https://github.com/eirslett/frontend-maven-plugin "Read more about the frontend-maven-plugin").
-This plugin automates the managment of Nodjs and its libraries and ensures that the version of Node and NPM being run is the same in every build environment.
-As a backend-developer, you do not have to install any of the frontend-tools manualy.
-Because of that, this plugin is ideal to integrate a separately developed frontend into a maven-build, without bothering the backend-developers with details of the frontend-build-process.
-
-## Seperate The Frontend-Project From The Maven-Based Backend-Project
-
-The drawback with this approach is, that the backend- and the frontend-project are tightly coupled.
-You can configure the frontend-maven-plugin to use a separate subdirectory as working-directory (for example `src/main/frontend`) and utilize this to separate the frontend-project in its own repository (for example by using [the submodule-functions of git](https://git-scm.com/book/en/v2/Git-Tools-Submodules "Read more about how to use git-submodules")).
-But the grunt-tasks, that you call in the frontend-project through the frontend-maven-plugin, must be defined in that project.
-
-Since I am planing to integrate a ‐ slightly modified ‐ version of Bootstrap as frontend into my project, that would mean that I have to mess around with the configuration of the Bootstrap-project a lot.
-But that is not a very good idea, because it hinders upgrades of the Bootstrap-base, because merge-conflicts became more and more likely.
-
-So, I decided to program a special `Gruntfile.js`, that resides in the base-folder of my Maven-project and lets me redefine and call tasks of a separated frontend-project in a subdirectory.
-
-## Redefine And Call Tasks Of An Included Gruntfile From A Sub-Project
-
-As it turned out, there are several npm-plugins for managing and building sub-projects (like [grunt-subgrunt](https://www.npmjs.com/package/grunt-subgrunt "Read more about the npm-plugin grunt-subgrunt") or [grunt-recurse](https://www.npmjs.com/package/grunt-recurse "Read more about the npm-plugin grunt-recurse")) or including existing Gruntfiles from sub-projects (like [grunt-load-gruntfile](https://www.npmjs.com/package/grunt-load-gruntfile "Read more about the npm-plugin grunt-load-gruntfile")), but none of them lets you redefine tasks of the subproject before calling them.
-
-I programmed a simple [Gruntfile](/gitweb/?p=examples/maven-grunt-integration;a=blob_plain;f=Gruntfile.js;hb=2.0.0 "Download the Gruntfile from juplo.de/gitweb"), that lets you do exactly this:
-
-```javascript
-
-module.exports = function(grunt) {
-
-  grunt.loadNpmTasks('grunt-newer');
-
-  grunt.registerTask('frontend','Build HTML & CSS for Frontend', function() {
-    var
-    done = this.async(),
-    path = './src/main/frontend';
-
-    grunt.util.spawn({
-      cmd: 'npm',
-      args: ['install'],
-      opts: { cwd: path, stdio: 'inherit' }
-    }, function (err, result, code) {
-      if (err || code > 0) {
-        grunt.fail.warn('Failed installing node modules in "' + path + '".');
-      }
-      else {
-        grunt.log.ok('Installed node modules in "' + path + '".');
-      }
-
-      process.chdir(path);
-      require(path + '/Gruntfile.js')(grunt);
-      grunt.task.run('newer:copy');
-      grunt.task.run('newer:less');
-      grunt.task.run('newer:svgstore');
-
-      done();
-    });
-  });
-
-  grunt.registerTask('default', [ 'frontend' ]);
-
-};
-
-```
-
-This Gruntfile loads the npm-taks [grunt-newer](https://www.npmjs.com/package/grunt-newer "Read more about the npm-plugin grunt-newer").
-Then, it registers a grunt-task called `frontend`, that loads the dependencies of the specified sub-project, read in its Gruntfile and runs redefined versions of the tasks `copy`, `less` and `svgstore`, which are defined in the sub-project.
-The sub-project itself does not register grunt-newer itself.
-This is done in this parent-project, to demonstrate how to register additional grunt-plugins and redefine tasks of the sub-project without touching it at all.
-
-The separated frontend-project can be used by the frontend-team to develop the temlates, needed by the backend-developers, without any knowledge of the maven-project.
-The frontend-project is then included into the backend, which is managed by maven, and can be used by the backend-developers without the need to know anything about the techniques that were used to develop the templates.
-
-The whole example can be browsed at [juplo.de/gitweb](/gitweb/?p=examples/maven-grunt-integration;a=tree;h=2.0.0 "Browse the example on juplo.de/gitweb") or cloned with:
-
-```bash
-
-git clone /git/examples/maven-grunt-integration
-
-```
-
-Be sure to checkout the tag `2.0.0` for the corresponding version after the cloning, in case i add more commits to demonstrate other stuff.
-Also, you have to init and clone the submodule after checkout:
-
-```bash
-
-git submodule init
-git submodule update
-
-```
-
-If you run `mvn jetty:run`, you will notice, that the frontend-maven-plugin will automatically download Nodejs into a the folder `node` of the parent-project.
-Afterwards, the dependencies of the parent-project are downloaded in the folder `node_modules` of the parent-project and the dpendencies of the sub-project are downloaded in the folder `src/main/frontend/node_modules` and the sub-project is build automatically in the folder `src/main/frontend/dist`, which is included into the directory-tree that is served by the [jetty-maven-plugin](http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html "Read more about the jetty-maven-plugin").
-
-The sub-project is fully usable standalone to drive the development of the frontend separately.
-You can [read more about it in this previous article](/serve-static-html-with-nodjs-and-grunt/ "Read more about the example development-environment").
-
-## Conclusion
-
-In this article, I showed how to integrate a separately developed frontend-project into a backend-project managed by Maven.
-This enables you to separate the development of the layout and the logic of a classic [ROCA](http://roca-style.org/ "Read more about the ROCA principles")-project nearly totally.
diff --git a/generated-2025-11-21-17-29-08/content/posts/java-lang-exception-method-xzy-should-have-no-parameters.md b/generated-2025-11-21-17-29-08/content/posts/java-lang-exception-method-xzy-should-have-no-parameters.md
deleted file mode 100644 (file)
index 492ca7e..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
----
-_edit_last: "3"
-author: kai
-categories:
-  - java
-  - jmockit
-  - junit
-  - maven
-date: "2016-10-09T10:29:40+00:00"
-guid: http://juplo.de/?p=535
-parent_post_id: null
-post_id: "535"
-title: 'java.lang.Exception: Method XZY should have no parameters'
-url: /java-lang-exception-method-xzy-should-have-no-parameters/
-
----
-Did you ever stumbled across the following error during developing test-cases with [JUnit](http://junit.org/ "Visit the homepage of the JUnit-Project") and [JMockit](http://jmockit.org/ "Visit the homepage of the JMockit-Project")?
-
-```bash
-java.lang.Exception: Method XZY should have no parameters
-
-```
-
-Here is the quick and easy fix for it:
-**Fix the ordering of the dependencies in your pom.xml.**
-The dependency for JMockit has to come first!
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/lange-ladezeiten-durch-openx-werbebanner-verhindern.md b/generated-2025-11-21-17-29-08/content/posts/lange-ladezeiten-durch-openx-werbebanner-verhindern.md
deleted file mode 100644 (file)
index d6c07fd..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-date: "2012-11-25T18:11:52+00:00"
-draft: "true"
-guid: http://juplo.de/?p=11
-parent_post_id: null
-post_id: "11"
-title: Lange Ladezeiten durch OpenX-Werbebanner verhindern
-url: /
-
----
-Wer auf seiner Seite Banner mit Hilfe des freien Ad-Servers [OpenX](http://www.openx.com/community "Community-Seite des Ad-Servers OpenX besuchen...") Werbe-Banner einbindet, der kennt wahrscheinlich das Problem: **Die Seite lädt ewig lange und ist (insbesondere wenn JavaScript eingesetzt wird) erst dann wirklich bedienbar, wenn alle Werbebanner geladen sind.**
-
-## Single-Page-Call: Schmerzlinderung - aber keine Heilung
-
-Das Problem ist nicht unbekannt. Es gibt unzählige Anleitungen, wie man die Banner-Auslieferung mit Hilfe der [Single-Page-Call-Technik](http://www.openx.com/docs/tutorials/single+page+call "Single-Page-Call-Tutorial lesen") beschleunigen kann. Single-Page-Call fast die Anfragen, die für die einzelnen Banner an den Ad-Server gestellt werden müssen, in eine Anfrage zusammen und beschleunigt dadurch die Banner-Auslieferung, da unnötige HTTP-Anfragen vermieden werden. Doch das eigentliche Problem wird dadurch nur verringert - nicht behoben:
-
-## Das Laden der JavaScript-Skripte blockiert die Seite
-
-Der Browser muss ein `<scrpt>`-Tag in dem Moment laden und ausführen, in dem er es in dem HTML-Quellcode der Seite vorfindet. Denn es könnte z.B. einen `document.write()`-Aufruf enthalten, der die Seite an Ort und Stelle modifiziert. Verschärft wird dieser Umstand weiter dadruch, dass [der Browser keine anderen Ressourcen laden darf, während er das Skript herunterlädt](http://developer.yahoo.com/performance/rules.html#js_bottom "Yahoo-Tipps/Erklärungen zu JavaScript anzeigen").
-
-Dieser Umstand fällt besonders dann schnell unangenehm auf, wenn OpenX als "Banner" wiederum einen JavaScript-Code eines anderen Ad-Servers (z.B. Google-Ads) ausliefert, so dass sich die Wartezeiten, bis der Browser mit dem Rendern der Seite fortschreiten kann, aufaddieren. _Wenn nur einer der Ad-Server in so einer Kette gerade überlastet ist und langsam reagiert, muss der Browser warten!_
-
-## Die Lösung: JavaScript an das Ende der Seite...
-
-Die Lösung dieses Problems ist altbekannt. Die JavaScript-Tag's werden an das Ende der HTML-Seite verschoben. Möglichst direkt vor das schließende `</body>`-Tag. Ein einfacher Ansatz hierfür wäre, [einfach die Banner möglichst nah an das Seitenende zu schieben und dann via CSS zu platzieren](http://www.openxtips.com/2009/07/tip-20-protect-your-site-from-openx-hangs/ "Blog-Eintrag, der erklärt wie man die Banner-Codes möglichst weit an das Seitenende verschiebt"). Aber dieser Ansatz funktioniert nur mit Bannern vom Typ Superbanner oder Skyscraper. Sobald der Banner im Inhalt stehen soll, wird es schwer (bis unmöglich) dafür via CSS die richtige Menge Platz zu reservieren.
-
-Außerdem wäre es noch schöner, wenn man das Laden der Banner erst dann anstoßen könnte, wenn die Seite vollständig geladen ist (und/oder die eigenen Skripte angestoßen/abgearbeitet wurden), also z.B. über das JavaScript-Event `window.onload`, so daß die Seite bereits voll einsatzfähig ist, bevor die Banner fertig geladen sind.
-
-Das klingt alles einfach und schön - doch wie so oft gilt leider:
-
-## Der Teufel steckt im Detail
-
-```
-/** Optimierte Methoden für die Werbe-Einblendung via OpenX */
-
-/** see: http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/ */
-
-(function( coolibri, $, undefined ) {
-
-  var
-
-  /** Muss angepasst werden, wenn die Zonen in OpenX geändert/erweitert werden! */
-  zones =  {
-    'oa-superbanner' : 15, // Superbanner
-    'oa-skyscraper' : 16,  // Skyscraper
-    'oa-rectangle' : 14,   // Medium Rectangle
-    'oa-content' : 13,     // content quer
-    'oa-marginal' : 18,    // Restplatz marginalspalte
-    'oa-article' : 17,     // Restplatz unter Artikel
-    'oa-prime' : 19,       // Prime Place
-    'oa-gallery': 23       // Medium Rectangle Gallery
-  },
-
-  domain = document.location.protocol == 'https:' ? 'https://openx.coolibri.de:8443':'http://openx.coolibri.de',
-
-  id,
-  node,
-
-  count = 0,
-  slots = {},
-  queue = [],
-  ads = [],
-  output = [];
-
-  coolibri.show_ads = function() {
-
-    var name, src = domain;
-
-    /**
-     * Ohne diese Option, hängt jQuery an jede URL, die es per $.getScript()
-     * geholt wird einen Timestamp an. Dies kann mit bei Skripten von Dritt-
-     * Anbietern zu Problemen führen, wenn diese davon ausgehen, dass die
-     * Aufgerufene URL nicht verändert wird...
-     */
-    $.ajaxSetup({ cache: true });
-
-    src += "/www/delivery/spc.php?zones=";
-
-    /** Nur die Banner holen, die in dieser Seite wirklich benötigt werden */
-    for(name in zones) {
-      $('.oa').each(function() {
-        var
-        node = $(this),
-        id;
-        if (node.hasClass(name)) {
-          id = 'oa_' + ++count;
-          slots[id] = node;
-          queue.push(id);
-          src += escape(id + '=' + zones[name] + "|");
-        }
-      });
-    }
-
-    src += "&nz=1&source=" + escape(OA_source);
-    src += "&r=" + Math.floor(Math.random()*99999999);
-    src += "&block=1&charset=UTF-8";
-
-    if (window.location)   src += "&loc=" + escape(window.location);
-    if (document.referrer) src += "&referer=" + escape(document.referrer);
-
-    $.getScript(src, init_ads);
-
-    src = domain + '/www/delivery/fl.js';
-    $.getScript(src);
-
-  }
-
-  function init_ads() {
-
-    var i, id;
-    for (i=0; i 0) {
-
-      var result, src, inline, i;
-
-      id = ads.shift();
-      node = slots[id];
-
-      node.slideDown();
-
-      // node.append(id + ": " + node.attr('class'));
-
-      /**
-       * Falls zwischenzeitlich Ausgaben über document.write() gemacht wurden,
-       * sollen diese als erstes (also bevor die restlichen von dem OpenX-Server
-       * gelieferten Statements verarbeitet werden) ausgegeben werden.
-       */
-      insert_output();
-
-      while ((result = /<script/i.exec(OA_output[id])) != null) {
-        node.append(OA_output[id].slice(0,result.index));
-        /** OA_output[id] auf den Text ab "]*)>([\s\S]*?)/i.exec(OA_output[id]);
-        if (result == null) {
-          /** Ungültige Syntax in der OpenX-Antwort. Rest der Antwort ignorieren! */
-          // alert(OA_output[id]);
-          OA_output[id] = "";
-        }
-        else {
-          /** Iinline-Code merken, falls vorhanden */
-          src = result[1]
-          inline = result[2];
-          /** OA_output[id] auf den Text nach dem schließenden -Tag kürzen */
-          OA_output[id] = OA_output[id].slice(result[0].length,OA_output[id].length);
-          result = /src\s*=\s*['"]([^'"]*)['"]/i.exec(src);
-          if (result == null) {
-            /** script-Tag mit Inline-Anweisungen: Inline-Anweisungen ausführen! */
-            result = /^\s* 0)
-              /** Der Banner-Code wurde noch nicht vollständig ausgegeben! */
-              ads.unshift(id);
-            /** So - jetzt erst mal das Skript laden und verarbeiten... */
-            $.getScript(result[1], render_ads); // << jQuery.getScript() erzeugt onload-Handler für _alle_ Browser ;)
-            return;
-          }
-        }
-      }
-
-      node.append(OA_output[id]);
-      OA_output[id] = "";
-    }
-
-    /** Alle Einträge aus OA_output wurden gerendert */
-
-    id = undefined;
-    node = undefined;
-
-  }
-
-  /** Mit dieser Funktion werden document.write und document.writeln überschrieben */
-  function document_write() {
-
-    if (id == undefined)
-      return;
-
-    for (var i=0; i 0) {
-      output.push(OA_output[id]);
-      OA_output[id] = "";
-      for (i=0; i<output.length; i++)
-        OA_output[id] += output[i];
-      output = [];
-    }
-
-  }
-
-} ( window.coolibri = window.coolibri || {}, jQuery ));
-
-/** Weil sich der IE sonst ggf. über die nicht definierte Variable lautstark aufregt, wenn irgendetwas schief geht... */
-var OA_output = {};
-
-```
-
-## Weiterlesen...
-
-- [How can we keep Openx from blocking page load](http://stackoverflow.com/questions/3770570/how-can-we-keep-openx-from-blocking-page-load)
-- [Protect your site from OpenX-hangs](http://www.openxtips.com/2009/07/tip-20-protect-your-site-from-openx-hangs/)
-- [Loading scripts without blocking](http://www.stevesouders.com/blog/2009/04/27/loading-scripts-without-blocking/)
diff --git a/generated-2025-11-21-17-29-08/content/posts/log-out-from-wrong-account-with-maven-appengine-plugin.md b/generated-2025-11-21-17-29-08/content/posts/log-out-from-wrong-account-with-maven-appengine-plugin.md
deleted file mode 100644 (file)
index afdf267..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
----
-_edit_last: "2"
-_wp_old_slug: logout-from-wrong-account-with-maven-appengine-plugin
-author: kai
-categories:
-  - appengine
-  - java
-  - maven
-  - oauth2
-date: "2016-01-12T12:50:07+00:00"
-guid: http://juplo.de/?p=97
-parent_post_id: null
-post_id: "97"
-title: Log out from wrong Account with maven-appengine-plugin
-url: /log-out-from-wrong-account-with-maven-appengine-plugin/
-
----
-Do you work with the [maven-appengine-plugin](https://developers.google.com/appengine/docs/java/tools/maven "Open documentation") and several google-accounts? If you do, or if you ever were logged in to the wrong google-account while executing `mvn appengine:update`, like me yesterday, you surely wondering, **how to logout from maven-appengine-plugin**.
-
-maven-appengine-plugin somehow miracolously stores your credentials for you, when you attemp to upload an app for the first time. This comes in very handy, if you work with just one google-account. But it might get a "pain-in-the-ass", if you work with several accounts. Because, if you once logged in into an account, there is no way (I mean: no goal of the maven-appengine-plugin) to log out, in order to change the account!
-
-## The solution: clear the credentials, that the maven-appengine-plugin stored on your behalf
-
-Only after hard googling, i found a solution to this problem in a [blog-post](http://www.radomirml.com/blog/2009/09/20/delete-cached-google-app-engine-credentials/ "Open the blog-post"): maven-appengine-plugin stores its oauth2-credentials in the file `.appcfg_oauth2_tokens_java` in your home directory (on Linux - sorry Windows-folks, you have to figure out yourself, where the plugin stores the credentials on Windows).
-
-**Just delete the file `.appcfg_oauth2_tokens_java` and your logged out!** The next time you call `mvn appengine:upload` you will be asked again to accept the request and, hence, can switch accounts. _If you are not using oauth2, just look for `.appcfg*`-files in your home directory. I am sure, you will find another file with stored credentials, that you can delet to logout, like Radomir, who [deleted `.appcfg_cookiesy` to log out](http://www.radomirml.com/blog/2009/09/20/delete-cached-google-app-engine-credentials/ "Open Radomir's Blog-Post to read more...")_.
diff --git a/generated-2025-11-21-17-29-08/content/posts/logging-request-and-response-data-from-requets-made-through-resttemplate.md b/generated-2025-11-21-17-29-08/content/posts/logging-request-and-response-data-from-requets-made-through-resttemplate.md
deleted file mode 100644 (file)
index bc1fd63..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - java
-  - spring
-date: "2015-02-09T10:52:15+00:00"
-guid: http://juplo.de/?p=326
-parent_post_id: null
-post_id: "326"
-title: Logging Request- and Response-Data From Requets Made Through RestTemplate
-url: /logging-request-and-response-data-from-requets-made-through-resttemplate/
-
----
-Logging request- and response-data for requests made through Spring's `RestTemplate` is quite easy, if you know, what to do.
-But it is rather hard, if you have no clue where to start.
-Hence, I want to give you some hints in this post.
-
-In its default configuration, the `RestTemplate` uses the [HttpClient](https://hc.apache.org/httpcomponents-client-4.4.x/index.html "Visit the project homepage of httpcomponents-client") of the [Apache HttpComponents](https://hc.apache.org/index.html "Visit the project homepage of apache-httpcomonents") package.
-You can verify this and the used version with the mvn-command
-
-```bash
-
-mvn dependency:tree
-
-```
-
-To enable for example logging of the HTTP-Headers send and received, you then simply can add the following to your logging configuration:
-
-```xml
-
-<logger name="org.apache.http.headers">
-  <level value="debug"/>
-</logger>
-
-```
-
-## Possible Pitfalls
-
-If that does not work, you should check, which version of the Apache HttpComponents your project actually is using, because the name of the logger has changed between version `3.x` and `4.x`.
-Another common cause of problems is, that the Apache HttpComponets uses [Apache Commons Logging](http://commons.apache.org/proper/commons-logging/ "Visit the project homepage of commons-logging").
-If the jar for that library is missing, or if your project uses another logging library, the messages might get lost because of that.
diff --git a/generated-2025-11-21-17-29-08/content/posts/parsing-json-from-facebooks-graph-api-using-jackson-x-and-java-s-new-time-api.md b/generated-2025-11-21-17-29-08/content/posts/parsing-json-from-facebooks-graph-api-using-jackson-x-and-java-s-new-time-api.md
deleted file mode 100644 (file)
index 995a419..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
----
-_edit_last: "2"
-_oembed_db18ba6b34f5522f0ecb8abddbb529da: '{{unknown}}'
-_oembed_e1a31eec970f0e7dfe4452df3c5b94aa: '{{unknown}}'
-author: kai
-categories:
-  - howto
-date: "2016-06-07T09:40:39+00:00"
-draft: "true"
-guid: http://juplo.de/?p=550
-parent_post_id: null
-post_id: "550"
-tags:
-  - createmedia.nrw
-  - facebook
-  - graph-api
-  - jackson
-  - java
-title: Parsing JSON From Facebooks Graph-API Using Jackson 2.x And Java's New Time-API
-url: /
-
----
-https://github.com/FasterXML/jackson-datatype-jsr310/issues/17
-
-Auch noch:
-https://en.wikibooks.org/wiki/Java\_Persistence/Identity\_and\_Sequencing#Strange\_behavior.2C\_unique\_constraint\_violation.
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/problems-deploying-a-spring-boot-app-as-war.md b/generated-2025-11-21-17-29-08/content/posts/problems-deploying-a-spring-boot-app-as-war.md
deleted file mode 100644 (file)
index b1aa76e..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - explained
-date: "2016-04-08T20:38:35+00:00"
-guid: http://juplo.de/?p=735
-parent_post_id: null
-post_id: "735"
-tags:
-  - createmedia.nrw
-  - debian
-  - java
-  - spring
-  - spring-boot
-title: Problems Deploying A Spring-Boot-App As WAR
-url: /problems-deploying-a-spring-boot-app-as-war/
-
----
-## Spring-Boot-App Is Not Started, When Deployed As WAR
-
-Recently, I had a lot of trouble, deploying my spring-boot-app as war under Tomcat 8 on Debian Jessie.
-The WAR was found and deployed by tomcat, but it was never started.
-Browsing the URL of the app resulted in a 404.
-And instead of [the fancy Spring-Boot ASCII-art banner](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html "See, what Spring-Boot usually shows, when starting..."), the only matching entry that showed up in my log-file was:
-
-```Bash
-INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Spring WebApplicationInitializers detected on classpath: [org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration$JerseyWebApplicationInitializer@1fe086c]
-
-```
-
-[A blog-post from Stefan Isle](http://stefan-isele.logdown.com/posts/201646 "A short overview of Springs startup-mechanism and what can go wrong") lead me to the solution, what was going wrong.
-In my case, there was no wrong version of Spring on the classpath.
-But my `WebApplicationInitializer` was not found, because I had it compiled with a version of Java, that was not available on my production system.
-
-## `WebApplicationInitializer` Not Found Because Of Wrong Java Version
-
-On my development box, I had compiled and tested the WAR with Java 8.
-But on my production system, running Debian 8 (Jessie), only Java 7 was available.
-And because of that, my `WebApplicationInitializer`
-
-After installing Java 8 from [debian-backports](http://backports.debian.org/Instructions/ "Learn more on debian-backports") on my production system, like described in this [nice debian-upgrade note](https://github.com/OpenTreeOfLife/germinator/wiki/Debian-upgrade-notes:-jessie-and-openjdk-8 "Read, how to install Java 8 from debian-backports"), the `WebApplicationInitializer` of my App was found and everything worked like a charme, again.
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/release-of-a-maven-plugin-to-maven-central-fails-with-error-unknown-tag-goal.md b/generated-2025-11-21-17-29-08/content/posts/release-of-a-maven-plugin-to-maven-central-fails-with-error-unknown-tag-goal.md
deleted file mode 100644 (file)
index 4170ee8..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - explained
-date: "2016-03-08T00:29:46+00:00"
-guid: http://juplo.de/?p=711
-parent_post_id: null
-post_id: "711"
-tags:
-  - createmedia.nrw
-  - java
-  - maven
-title: 'Release Of A Maven-Plugin to Maven Central Fails With "error: unknown tag: goal"'
-url: /release-of-a-maven-plugin-to-maven-central-fails-with-error-unknown-tag-goal/
-
----
-## error: unknown tag: goal
-
-Releasing a maven-plugin via Maven Central does not work, if you have switched to Java 8.
-This happens, because hidden in the `oss-parent`, that you have to configure as `parent` of your project to be able to release it via Sonatype, the `maven-javadoc-plugin` is configured for you.
-And the version of `javadoc`, that is shipped with Java 8, by default checks the syntax of the comments and fails, if anything unexpected is seen.
-
-**Unfortunatly, the special javadoc-tag's, like `@goal` or `@phase`, that are needed to configure the maven-plugin, are unexpected for javadoc.**
-
-## Solution 1: Turn Of The Linting Again
-
-As described elswehere, you can easily [turn of the linting](http://blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html "Read, how to turn of the automatic linting of javadoc in Java 8") in the plugins-section of your `pom.xml`:
-
-```xml
-<plugin>
-  <groupId>org.apache.maven.plugins</groupId>
-  <artifactId>maven-javadoc-plugin</artifactId>
-  <version>2.7</version>
-  <configuration>
-    <additionalparam>-Xdoclint:none</additionalparam>
-  </configuration>
-</plugin>
-
-```
-
-## Solution 2: Tell javadoc About The Unknown Tags
-
-Another not so well known approach, that I found in a [fix](https://github.com/julianhyde/hydromatic-resource/commit/da5b2f203402324c68dd2eb2e5ce628f722fefbb "Read the fix with the additional configuration for the unknown tags") for [an issue of some project](https://github.com/julianhyde/hydromatic-resource/issues/1 "See the issue, that lead me to the fix"), is, to add the unknown tag's in the configuration of the `maven-javadoc-plugin`:
-
-```xml
-<plugin>
-  <groupId>org.apache.maven.plugins</groupId>
-  <artifactId>maven-javadoc-plugin</artifactId>
-  <version>2.7</version>
-  <configuration>
-    <tags>
-      <tag>
-        <name>goal</name>
-        <placement>a</placement>
-        <head>Goal:</head>
-      </tag>
-      <tag>
-        <name>phase</name>
-        <placement>a</placement>
-        <head>Phase:</head>
-      </tag>
-      <tag>
-        <name>threadSafe</name>
-        <placement>a</placement>
-        <head>Thread Safe:</head>
-      </tag>
-      <tag>
-        <name>requiresDependencyResolution</name>
-        <placement>a</placement>
-        <head>Requires Dependency Resolution:</head>
-      </tag>
-      <tag>
-        <name>requiresProject</name>
-        <placement>a</placement>
-        <head>Requires Project:</head>
-      </tag>
-    </tags>
-  </configuration>
-</plugin>
-
-```
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/replace-text-by-graphic-without-extra-markup.md b/generated-2025-11-21-17-29-08/content/posts/replace-text-by-graphic-without-extra-markup.md
deleted file mode 100644 (file)
index f48d0aa..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - css
-  - html(5)
-date: "2015-05-08T12:05:44+00:00"
-guid: http://juplo.de/?p=339
-parent_post_id: null
-post_id: "339"
-title: Replace text by graphic without extra markup
-url: /replace-text-by-graphic-without-extra-markup/
-
----
-Here is a little trick for you, to replace text by a graphic through pure CSS without the need to add extra markup:
-
-```java
-
-SELECTOR
-{
-  text-indent: -99em;
-  line-height: 0;
-}
-SELECTOR:after
-{
-  display: block;
-  text-indent: 0;
-  content: REPLACEMENT;
-}
-
-```
-
-`SELECTOR` can be any valid CSS-selector.
-`REPLACEMENT` references the graphic, which should replace the text.
-This can be a SVG-graphic, a vector-graphics from a font, any bitmap graphic or (quiet useless, but a simple case to understand the source like in [the first of my two examples](/wp-uploads/2015/05/replace-1.html "This example replaces the h1-heading with another text")) other text.
-SVG- and bitmap-graphics are simply referred by an url in the `content`-directive, like I have done it with a data-url in [my second example](/wp-uploads/2015/05/replace-2.html "This example replaces the h1-heading with a svg-graphic referenced through a data-url").
-For the case of an icon embedded in a vector you simply put the character-code of the icon in the `content`-directive, like described in [the according ALA-article](http://alistapart.com/article/the-era-of-symbol-fonts "See the alistapart-article to icon fonts").
-
-## Examples
-
-1. [Example 1](/wp-uploads/2015/05/replace-1.html "Replaces the h1-heading with another text")
-1. [Example 2](/wp-uploads/2015/05/replace-2.html "Replaces the h1-heading with a svg-graphic referenced through a data-url")
-
-## What is it good for?
-
-If you need backward compatibility for Internet Explorer 8 and below or Android 2.3 and below, you have to use icon-fonts to support these old browsers.
-I use this often, if I have a brand logo, that should be inserted in a accessible way and do not want to bloat up the html-markup with useless tag's, to achieve this.
diff --git a/generated-2025-11-21-17-29-08/content/posts/rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml.md b/generated-2025-11-21-17-29-08/content/posts/rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml.md
deleted file mode 100644 (file)
index 2b2306f..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
----
-_edit_last: "3"
-author: kai
-categories:
-  - android
-  - hacking
-date: "2014-12-26T11:05:39+00:00"
-guid: http://juplo.de/?p=186
-parent_post_id: null
-post_id: "186"
-title: Rooting the hama 00054807 Internet TV Stick with the help of factory_update_param.aml
-url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
-
----
-## No Play Store - No Fun
-
-Recently, I bought myself the [Hama 00054807 Internet TV Stick](https://de.hama.com/00054807/hama-internet-tv-stick_eng "Visit the product page"). This stick is a low-budget option, to pimp your TV, if it has a HDMI-port, but no built in smart-tv functionality (or a crapy one). You just plug in the stick and connect its dc-port to a USB-port of the TV (or the included adapter) and there you go.
-
-But one big drawback of the `Hama 00054807` is, that there are nearly no usefull apps preinstalled and Google forbidds Hama to install the original [Google Play Store](https://play.google.com/store?hl=en "Visit Google Play") on the device. Hence, you are locked out of any easy access to all the apps, that constitute the usability of android.
-
-Because of that, I decided to [root](http://en.wikipedia.org/wiki/Rooting_%28Android_OS%29 "Learn mor about rooting android devices") my `Hama00054807` as a first step on the way to fully utilize this neat little toy of mine.
-
-I began with opening the device and found the device-ID `B.AML8726.6B 12122`. But there seems to be [no one else, who ever tried it](https://www.google.de/search?q=root+B.AML8726.6B "Google for it"). But as it turned out, it is fairly easy, because stock recovery is not locked and so you can just install everything you want.
-
-## Boot Into Recovery
-
-{{< figure align="left" width=300 src="/wp-uploads/2014/02/hama%5F00054807%5Fstock%5Frecovery-300x199.jpg" alt="stock recovery screenshot" caption="stock recovery screenshot" >}}
-
-I found out, that you can boot into recovery, by pressing the reset-button, while the stick is booting. You can reach the reset-button without the need to open the case through a little hole in the back of the device. Just hold the button pressed, until recovery shows up (see screenshot).
-
-Unfortunatly, the keyboard does not work, while you are in recovery-mode. So at first glance, you can do nothing, expect looking at the nice picture of the android-bot being repaired.
-
-## Installing Updates Without Keyboard-Interaction
-
-But I found out, that you can control stock recovery with the help of a file called `factory_update_param.aml`, which is read from the external sd-card and interpreted by stock recovery on startup. Just create a text-file with the following content (I think it should use [unix stle newlines, aka LF](http://en.wikipedia.org/wiki/Newline#Representations "Learn more about line endings")):
-
-```html
-
---update_package=/sdcard/update.zip
-
-```
-
-Place this file on the sd-card and name it `factory_update_param.aml`. Now you can place any suitable correctly signed android-update on the sd-card and rename it to `update.zip` and stock recovery will install it upon boot, if you boot into recovery with the sd-card inserted.
-
-If you want to wipe all data as well and factory reset your device, you can extend `factory_update_param.aml` like this:
-
-```html
-
---update_package=/sdcard/update.zip
---wipe_data
---wipe_cache
---wipe_media
-
-```
-
-But be carefull to remove these extra-lines later, because they are executed _every time_ you boot into recovery with the sd-card inserted! You have been warned :)
-
-## Let's root
-
-So, actually rooting the device is fairly easy now. You just have to download any correclty signed [Superuser](http://androidsu.com/superuser/ "Visit superuser home")-Update. For example this one from the [superuser homepage](http://androidsu.com/superuser/ "Visit superuser home"): [Superuser-3.1.3-arm-signed.zip](http://downloads.noshufou.netdna-cdn.com/superuser/Superuser-3.1.3-arm-signed.zip "Download Superuser-3.1.3-arm-signed.zip"). Then, put it on the sd-card, rename it to `update.zip`, boot into recovery with the sd-card inserted and that's it, you'r root!
-
-If you reboot your device, you should now find the superuser-app among your apps. To verify, that everything went right, you could install any app that requires root-privileges. If the app requests root-privileges, you should see a dialog from the superuser-app, that asks you if the privileges should be granted, or not. For example, you can install a [terminal-app](https://play.google.com/store/apps/details?id=jackpal.androidterm&hl=en "For example this one") and type `su` and hit return to request root-privileges.
-
-## What's next...
-
-So now your device is rooted and you are prepared to install custom updates on it. But still the Google Play Store is missing. I hope I will find some time to accomplish that, too. Stay tuned!
diff --git a/generated-2025-11-21-17-29-08/content/posts/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj.md b/generated-2025-11-21-17-29-08/content/posts/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj.md
deleted file mode 100644 (file)
index fd5383c..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - java
-  - maven
-date: "2014-07-18T10:36:19+00:00"
-guid: http://juplo.de/?p=306
-parent_post_id: null
-post_id: "306"
-title: Running aspectj-maven-plugin with the current Version 1.8.1 of AspectJ
-url: /running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/
-
----
-Lately, I stumbled over a syntactically valid class, that [can not be compiled by the aspectj-maven-plugin](/aspectj-maven-plugin-can-not-compile-valid-java-7-0-code/ "Read more about the code, that triggers the AspectJ compilation error"), even so it is a valid Java-7.0 class.
-
-Using the current version ( [Version 1.8.1](http://search.maven.org/#artifactdetails|org.aspectj|aspectjtools|1.8.1|jar "See informations about the current version 1.8.1 of AspectJ on Maven Central")) of [AspectJ](http://www.eclipse.org/aspectj/ "Visit the homepage of the AspectJ-project") solves this issue.
-But unfortunatly, there is no new version of the [aspectj-maven-plugin](http://mojo.codehaus.org/aspectj-maven-plugin/ "Learn more about the aspectj-maven-plugin") available, that uses this new version of AspectJ.
-[The last version of the aspectj-maven-plugin](http://search.maven.org/#artifactdetails|org.codehaus.mojo|aspectj-maven-plugin|1.6|maven-plugin "Read more informations about the latest version of the aspectj-maven-plugin on Maven Central") was released to Maven Central on December the 4th 2013 and this versions is bundeled with the version 1.7.2 of AspectJ.
-
-The simple solution is, to bring the aspectj-maven-plugin to use the current version of AspectJ.
-This can be done, by overwriting its dependency to the bundled aspectj.
-This definition of the plugin does the trick:
-
-```xml
-
-<plugin>
-  <groupId>org.codehaus.mojo</groupId>
-  <artifactId>aspectj-maven-plugin</artifactId>
-  <version>1.6</version>
-  <configuration>
-    <complianceLevel>1.7</complianceLevel>
-    <aspectLibraries>
-      <aspectLibrary>
-        <groupId>org.springframework</groupId>
-        <artifactId>spring-aspects</artifactId>
-      </aspectLibrary>
-    </aspectLibraries>
-  </configuration>
-  <executions>
-    <execution>
-      <goals>
-        <goal>compile</goal>
-      </goals>
-    </execution>
-  </executions>
-  <dependencies>
-    <dependency>
-      <groupId>org.aspectj</groupId>
-      <artifactId>aspectjtools</artifactId>
-      <version>1.8.1</version>
-    </dependency>
-  </dependencies>
-</plugin>
-
-```
-
-The crucial part is the explicit dependency, the rest depends on your project and might have to be adjusted accordingly:
-
-```xml
-
-  <dependencies>
-    <dependency>
-      <groupId>org.aspectj</groupId>
-      <artifactId>aspectjtools</artifactId>
-      <version>1.8.1</version>
-    </dependency>
-  </dependencies>
-
-```
-
-I hope, that helps, folks!
diff --git a/generated-2025-11-21-17-29-08/content/posts/select-text-content-of-a-tag-with-thymeleaf-s-markup-selection.md b/generated-2025-11-21-17-29-08/content/posts/select-text-content-of-a-tag-with-thymeleaf-s-markup-selection.md
deleted file mode 100644 (file)
index 9788a4e..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-classic-editor-remember: classic-editor
-date: "2019-12-28T14:06:47+00:00"
-draft: "true"
-guid: http://juplo.de/?p=1006
-parent_post_id: null
-post_id: "1006"
-title: Select Text-Content Of A Tag With Thymeleaf's Markup Selection
-url: /
-
----
-
diff --git a/generated-2025-11-21-17-29-08/content/posts/serve-static-html-with-nodjs-and-grunt.md b/generated-2025-11-21-17-29-08/content/posts/serve-static-html-with-nodjs-and-grunt.md
deleted file mode 100644 (file)
index f7d2c1e..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - css
-  - grunt
-  - html(5)
-  - less
-  - nodejs
-date: "2015-08-25T20:25:28+00:00"
-guid: http://juplo.de/?p=500
-parent_post_id: null
-post_id: "500"
-title: Serving Static HTML With Nodjs And Grunt For Template-Development
-url: /serve-static-html-with-nodjs-and-grunt/
-
----
-## A Simple Nodejs/Grunt-Development-Environment for static HTML-Templates
-
-Nowadays, [frontend-development](https://en.wikipedia.org/wiki/Front_end_development "Read more about frontend-development") is mostly done with [Nodjs](https://nodejs.org/ "Read more about Nodjs") and [Grunt](http://gruntjs.com/ "Read more about grunt").
-On [npm](https://www.npmjs.com/ "Read more about npm"), there are plenty of useful plugin's, that ease the development of HTML and CSS.
-For example [grunt-contrib-less](https://www.npmjs.com/package/grunt-contrib-less "Read the description of the plugin on npm") to automate the compilation of [LESS](http://lesscss.org/ "Read more about LESS")-sourcecode to CSS, or [grunt-svgstore](https://www.npmjs.com/package/grunt-svgstore "Read the description of the plugin on npm") to pack several SVG-graphics in a single SVG-sprite.
-
-Because of that, I decided to switch to Nodejs and Grunt to develop the HTML- and CSS-Markup for the templates, that I need for my [Spring](http://projects.spring.io/spring-framework/ "Read more about the spring-framework")/ [Thymeleaf](http://www.thymeleaf.org/ "Read more about the XML/XHTML/HTML5 template engine Thymeleaf")-Applications.
-But as with everything new, I had some hard work, to plug together what I needed.
-In this article I want to share, how I have set up a really minimalistic, but powerful development-environment for static HTML-templates, that suites all of my initial needs.
-
-This might not be the best solutions, but it is a good starting point for beginners like me and it is here to be improved through your feedback!
-
-You can browse the example-development-environment on [juplo.de/gitweb](/gitweb/?p=examples/template-development;a=tree;h=1.0.3;hb=1.0.3 "Browse the example development-environment on juplo.de/gitweb"), or clone it with:
-
-```bash
-
-git clone /git/examples/template-development
-
-```
-
-After [installing npm](https://docs.npmjs.com/getting-started/installing-node "Read how to install npm") you have to fetch the dependencies with:
-
-```bash
-
-npm install
-
-```
-
-Than you can fire up a build with:
-
-```bash
-
-grunt
-
-```
-
-...or start a webserver for development with:
-
-```bash
-
-git run-server
-
-```
-
-## Serving The HTML and CSS For Local Development
-
-The hardest part while putting together the development-environment was my need to automatically build the static HTML and CSS after file-changes and serve them via a local webserver.
-[As I wrote in an earlier article](/bypassing-the-same-origin-policiy-for-loal-files-during-development/ "Read the article 'Bypassing the Same-Origin-Policy For Local Files During Development'"), I often stumble over problems, that arise from the [Same-origin policy](https://en.wikipedia.org/wiki/Same-origin_policy "Read more about the Same-Origin Policy on wikipedia") when accessing the files locally through `file:///`-URI's).
-
-I was a bit surprised, that I could not find a simple explanation, how to set up a grunt-task to build the project automatically on file-changes and serve the generated HTML and CSS locally.
-That is the main reason, why I am writing this explanation now, in order to fill that gap ;)
-
-I realised that goal by implemnting a grunt-task, that spawn's a process that uses the [http-server](https://www.npmjs.com/package/http-server "Read the description of the plugin on npm") to serve up the files and combine that task with a common watch-task:
-
-```javascript
-
-grunt.registerTask('http-server', function() {
-
-  grunt.util.spawn({
-    cmd: 'node_modules/http-server/bin/http-server',
-    args: [ 'dist' ],
-    opts: { stdio: 'inherit' }
-  });
-
-});
-
-grunt.registerTask('run-server', [ 'default', 'http-server', 'watch' ]);
-
-```
-
-The rest of the configuration is really pretty self-explaining.
-I just put together the pieces I needed for my template development (copy some static HTML and generate CSS from the LESS-sources) and configured [grunt-contrib-watch](https://www.npmjs.com/package/grunt-contrib-watch "Read the description of the plugin on npm") to rebuild the project automatically, if anything changes.
-
-The result is put under `dist/` and is ready to be included in my Spring/Thymeleaf-Application as it is.
diff --git a/generated-2025-11-21-17-29-08/content/posts/show-spring-boot-auto-configuration-report-when-running-via-mvn-spring-boot-run.md b/generated-2025-11-21-17-29-08/content/posts/show-spring-boot-auto-configuration-report-when-running-via-mvn-spring-boot-run.md
deleted file mode 100644 (file)
index dbc7edb..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - howto
-date: "2016-06-23T10:49:03+00:00"
-guid: http://juplo.de/?p=754
-parent_post_id: null
-post_id: "754"
-tags:
-  - java
-  - maven
-  - spring
-  - spring-boot
-title: Show Spring-Boot Auto-Configuration-Report When Running Via "mvn spring-boot:run"
-url: /show-spring-boot-auto-configuration-report-when-running-via-mvn-spring-boot-run/
-
----
-There are a lot of explanations, how to turn on the Auto-Configuration-Report offered by Spring-Boot to debug the configuration of ones app.
-For an good example take a look at this little [Spring boot troubleshooting auto-configuration](http://www.leveluplunch.com/java/tutorials/009-spring-boot-what-autoconfigurations-turned-on/ "This guide shows nearly all options, to turn on the report") guide.
-But most often, when I want to see the Auto-Configuration-Report, I am running my app via `mvn:spring-boot:run`.
-And, unfortunatly, none of the guids you can find by google tells you, how to turn on the Auto-Configuration-Report in this case.
-Hence, I hope I can help out, with this little tip.
-
-## How To Turn On The Auto-Configuration-Report When Running `mvn spring-boot:run`
-
-The report is shown, if the logging for `org.springframework.boot.autoconfigure.logging` is set to `DEBUG`.
-The most simple way to do that, is to add the following line to your `src/main/resources/application.properties`:
-
-```shell
-logging.level.org.springframework.boot.autoconfigure.logging=DEBUG
-
-```
-
-I was not able, to enable the logging via a command-line-switch.
-The seemingly obvious way to add the property to the command line with a `-D` like this:
-
-```shell
-mvn spring-boot:run -Dlogging.level.org.springframework.boot.autoconfigure.logging=DEBUG
-
-```
-
-did not work for me.
-If anyone could point out, how to do that in a comment to this post, I would be realy grateful!
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/posts/subscribe-to-facebook-s-real-time-updates-with-spring-security-oauth.md b/generated-2025-11-21-17-29-08/content/posts/subscribe-to-facebook-s-real-time-updates-with-spring-security-oauth.md
deleted file mode 100644 (file)
index e8170c9..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-date: "2014-02-26T23:29:24+00:00"
-draft: "true"
-guid: http://juplo.de/?p=266
-parent_post_id: null
-post_id: "266"
-title: Subscribe to Facebook's Real-Time Updates with Spring Security OAuth
-url: /
-
----
-`invalid_request", error_description="{message=(#15) This method must be called with an app access_token., type=OAuthException, code=15}`
diff --git a/generated-2025-11-21-17-29-08/content/posts/testing-exception-handling-in-spring-mvc.md b/generated-2025-11-21-17-29-08/content/posts/testing-exception-handling-in-spring-mvc.md
deleted file mode 100644 (file)
index fcf3c54..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - java
-  - spring
-  - spring-boot
-classic-editor-remember: classic-editor
-date: "2020-10-03T15:00:17+00:00"
-guid: http://juplo.de/?p=1133
-parent_post_id: null
-post_id: "1133"
-title: Testing Exception-Handling in Spring-MVC
-url: /testing-exception-handling-in-spring-mvc/
-
----
-## Specifying Exception-Handlers for Controllers in Spring MVC
-
-Spring offers the annotation **`@ExceptionHandler`** to handle exceptions thrown by controllers.
-The annotation can be added to methods of a specific controller, or to methods of a **`@Component`**-class, that is itself annotated with **`@ControllerAdvice`**.
-The latter defines global exception-handling, that will be carried out by the `DispaterServlet` for all controllers.
-The former specifies exception-handlers for a single controller-class.
-
-This mechanism is documented in the [Springframework Documentation](https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/web.html#mvc-exceptionhandlers) and it is neatly summarized in the blog-article
-[Exception Handling in Spring MVC](https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc).
-**In this article, we will focus on testing the sepcified exception-handlers.**
-
-## Testing Exception-Handlers with the `@WebMvcTest`-Slice
-
-Spring-Boot offers the annotation **`@WebMvcTest`** for tests of the controller-layer of your application.
-For a test annotated with `@WebMvcTest`, Spring-Boot will:
-
-- Auto-configure Spring MVC, Jackson, Gson, Message converters etc.
-- Load relevant components ( `@Controller`, `@RestController`, `@JsonComponent` etc.)
-- Configure `MockMVC`
-
-All other beans configured in the app will be ignored.
-Hence, a `@WebMvcTest` fits perfectly for testing exception-handlers, which are part of the controller-layer.
-It enables us, to mock away the other layers of the application and concentrate on the part, that we want to test.
-
-Consider the following controller, that defines a request-handling and an accompanying exception-handler, for an
-`IllegalArgumentException`, that may by thrown in the business-logic:
-
-`@Controller
-public class ExampleController
-{
-  @Autowired
-  ExampleService service;
-  @RequestMapping("/")
-  public String controller(
-      @RequestParam(required = false) Integer answer,
-      Model model)
-  {
-    Boolean outcome = answer == null ? null : service.checkAnswer(answer);
-    model.addAttribute("answer", answer);
-    model.addAttribute("outcome", outcome);
-   return "view";
-  }
-  @ResponseStatus(HttpStatus.BAD_REQUEST)
-  @ExceptionHandler(IllegalArgumentException.class)
-  public ModelAndView illegalArgumentException(IllegalArgumentException e)
-  {
-    LOG.error("{}: {}", HttpStatus.BAD_REQUEST, e.getMessage());
-    ModelAndView mav = new ModelAndView("400");
-    mav.addObject("exception", e);
-    return mav;
-  }
-}`
-
-The exception-handler resolves the exception as `400: Bad Request` and renders the specialized error-view `400`.
-
-With the help of `@WebMvcTest`, we can easily mock away the actual implementation of the business-logic and concentrate on the code under test:
-our specialized exception-handler.
-
-`@WebMvcTest(ExampleController.class)
-class ExceptionHandlingApplicationTests
-{
-  @MockBean  ExampleService service;
-  @Autowired MockMvc mvc;
-  @Test
-  @Autowired
-  void test400ForExceptionInBusinessLogic() throws Exception {
-    when(service.checkAnswer(anyInt())).thenThrow(new IllegalArgumentException("FOO!"));
-    mvc
-      .perform(get(URI.create("http://FOO/?answer=1234")))
-      .andExpect(status().isBadRequest());
-    verify(service, times(1)).checkAnswer(anyInt());
-  }
-}`
-
-We preform a `GET` with the help of the provided `MockMvc` and check, that the status of the response fullfills our expectations, if we tell our mocked business-logic to throw the `IllegalArgumentException`, that is resolved by our exception-handler.
diff --git a/generated-2025-11-21-17-29-08/content/posts/testing-spring-webflux-with-springboottest.md b/generated-2025-11-21-17-29-08/content/posts/testing-spring-webflux-with-springboottest.md
deleted file mode 100644 (file)
index bf15cee..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - tips
-classic-editor-remember: classic-editor
-date: "2020-01-14T10:36:23+00:00"
-draft: "true"
-guid: http://juplo.de/?p=1034
-parent_post_id: null
-post_id: "1034"
-title: Testing Spring WebFlux with @SpringBootTest
-url: /
-
----
-
diff --git a/generated-2025-11-21-17-29-08/content/posts/the-outbox-pattern-pro-contra-alternatives.md b/generated-2025-11-21-17-29-08/content/posts/the-outbox-pattern-pro-contra-alternatives.md
deleted file mode 100644 (file)
index b8733f8..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - explained
-classic-editor-remember: classic-editor
-date: "2021-02-12T08:57:51+00:00"
-draft: "true"
-guid: http://juplo.de/?p=1225
-parent_post_id: null
-post_id: "1225"
-title: The Outbox-Pattern - Pro / Contra / Alternatives
-url: /
-
----
-## The Outbox
-
-The outbox is represented by an additionally table in the database, thate takes part in the transaction.
-All messages, that should be send if and only if the transaction is sucessfully completed, are stored in this table.
-The sending of this messages is thus postponed after the transaction is completed.
-
-If the table is read outside of the transaction context, only entries related to sucessfully commited transactions are visible.
-These entries can then be read and queued for sending.
-If the entries are only removed from the outbox-table after a successful transmission has been confirmed by the messaging middleware, no messages can be lost.
-
-## Drawback Of The Outbox-Pattern
-
-The biggest drawback of the Outbox-Pattern is the postponent of all messages, that are send as part of a transaction after the completion of the transaction.
-This changes the order in which the messages are sent.
-
-![Sending Order in the Outbox-Patern](/wp-uploads/2021/02/outbox-pattern-sending-order.png)
-
-Messages B1 and B2 of a transaction B, that started after a transation A will be sent before messages A1 and A2, that belong to transaction A, if transaction B completes before transaction A, even if the recording of messages A1 and A2 happend before the recording of messages B1 and B2.
-This happens, because all messages, that are written in transaction A will only become visible to the processing of the messages, after the completion of the transaction, because the processing of the messaging happens outside of the scope of the transaction.
-Therefore, the commit-order dictates the order, in which messages are sent.
diff --git a/generated-2025-11-21-17-29-08/content/posts/unittest-or-integrationtest-a-practical-guide.md b/generated-2025-11-21-17-29-08/content/posts/unittest-or-integrationtest-a-practical-guide.md
deleted file mode 100644 (file)
index f062aee..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-classic-editor-remember: classic-editor
-date: "2020-01-14T16:42:01+00:00"
-draft: "true"
-guid: http://juplo.de/?p=1013
-parent_post_id: null
-post_id: "1013"
-title: UnitTest or IntegrationTest? A Practical Guide
-url: /
-
----
-_Idee:_ Zeigen, dass die Entscheidung nicht akademisch, sondern praktisch getroffen werden sollte / muss
-
-TODO
-
-- Am Beispiel von WebClient mit Mockito zeigen das Mocking schnell zu einem schlechten Unit-Test führt: Getestet werden Implementierungsdetails, wie genau wann die Fluid-API aufgerufen wird! Insbesondere gefährlich, wenn zusätzlich verifiziert wird
-- Außerdem: Häufig wird gar nicht mehr die Implementierung getestet, sondern irgendwelche Toos! Ein Beispiel: Commit-Schlechter-Unit-Tests. Z.B. zu sehen hier: https://stackoverflow.com/a/57196768/247276 und hier: https://www.baeldung.com/spring-mocking-webclient#mockito
-
-- Eigentlich will man: Das ggf. benötigte Verhalten möglichst unscharf aber passen erlauben. Eventuell: Aufrufe die als Seiteneffekte passieren müssen verifizieren
-- Als Konsequenz aus obigem auch:
-  - Wenn Mocking komplexer Klassen benötigt wird besser nicht mit UnitTest anfangen. Dann hätte man nämlich das Problem, das man ggf. noch gar nicht weiß, wie sich die ersetzte Klasse intern verhält.
-  - Besser hier mit einem _Narro_ Integration-Test anfangen. Der hat dann auch den schönen Nebeneffekt, dass man ihn wie den ersten Klienten des neu definierten Kontrakts betrachten kann! Erst wenn so klar geworden ist, wie der Kontrakt genau aussieht und welche einzelnen Methoden-Signaturen und -Kontrakte sich daraus ergeben diese in UnitTests überführen, die wesentlich schneller testbar sind.
-  - **Problem bei dieser Überlegung:** Abgrenzung / Kombination mit TDD!
-  - _Ggf. Antwort:_ Hier wird klar, wann die Unterscheidung zwischen Unit-Tests und Integration-Tests künstlich wird.
-  - Mit einem Unit-Test, der akademisch betrachtet schon ein Narrow Integration-Test ist, sollte sich TDD weiterhin problemlos durchhalten lassen
-- Mit einer Stub/Mock-Kombination ließe sich hier schon mehr ausrichten? Gemeint: Stub für alle aus Test-Sicht unwesenlichen Aufrufe und Unterklassen der Fluid-API des WebClient implementieren und das Verhalten von diesem an der für den Test wichtigen Stelle von außen konfigurierbar — `mockbar` — machen
-- Noch ein Schritt weiter (oder direkt überspringen): WebClient direkt benutzen und nur die Exchange-Function ersetzen: siehe https://dzone.com/articles/unit-tests-for-springs-webclient
diff --git a/generated-2025-11-21-17-29-08/content/posts/using-jackson-without-annotations-to-quickly-add-logging-of-object-graphs-as-json.md b/generated-2025-11-21-17-29-08/content/posts/using-jackson-without-annotations-to-quickly-add-logging-of-object-graphs-as-json.md
deleted file mode 100644 (file)
index 749f2eb..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - jackson
-  - java
-  - tips
-classic-editor-remember: classic-editor
-date: "2020-08-15T17:02:52+00:00"
-guid: http://juplo.de/?p=1130
-parent_post_id: null
-post_id: "1130"
-title: Using Jackson Without Annotations To Quickly Add Logging Of Object-Graphs As JSON
-url: /using-jackson-without-annotations-to-quickly-add-logging-of-object-graphs-as-json/
-
----
-Normally, you have to add Annotations to your classes, if you want to serialize them with Jackson.
-The following snippet shows, how you can configure Jackson in order to serialize vanilla classes without adding annotations.
-This is usefull, if you want to add logging-statements, that print out graphs of objects in JSON-notation for classes, that are not prepared for serialization.
-
-```sh
-
-ObjectMapper mapper = new ObjectMapper();
-mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
-mapper.enable(SerializationFeature.INDENT_OUTPUT);
-String str = mapper.writeValueAsString(new Bar());
-
-```
-
-I have put together a tiny sample-project, that demonstrates the approach.
-URL for cloning with GIT:
-[/git/demos/noanno/](/git/demos/noanno/)
-
-It can be executed with `mvn spring-boot:run`
diff --git a/generated-2025-11-21-17-29-08/content/posts/virtual-networking-with-linux-network-namespaces.md b/generated-2025-11-21-17-29-08/content/posts/virtual-networking-with-linux-network-namespaces.md
deleted file mode 100644 (file)
index 2f7cb57..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-date: "2019-06-03T19:50:08+00:00"
-draft: "true"
-guid: http://juplo.de/?p=856
-parent_post_id: null
-post_id: "856"
-title: 'Virtual Networking With Linux: Network Namespaces'
-url: /
-
----
-
diff --git a/generated-2025-11-21-17-29-08/content/posts/virtual-networking-with-linux-veth-pairs.md b/generated-2025-11-21-17-29-08/content/posts/virtual-networking-with-linux-veth-pairs.md
deleted file mode 100644 (file)
index 2265178..0000000
+++ /dev/null
@@ -1,355 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - explained
-date: "2019-06-04T15:19:22+00:00"
-draft: "true"
-guid: http://juplo.de/?p=835
-parent_post_id: null
-post_id: "835"
-title: 'Virtual Networking With Linux: Veth-Pairs'
-url: /
-
----
-A veth-pair acts as a virtual patch-cable.
-Like a real cable, it always has two ends and data that enters one end is copied to the other.
-Unlike a real cable, each end comes with an attached network interface card (nic).
-To stick with the metaphor: using a veth-pair is like taking a patch-cable with a nic hardwired to each end and installing these nics.
-
-## Typical Usages
-
-- [Connect Two Network Namespaces](#netns2netns)
-- [Connect A Network Namespace To A Bridge](#netns2br)
-- [Connect Two Bridges](#br2br)
-
-### Connect Two Network Namespaces
-
-In this usage scenario, two [network namespaces](/virtual-networking-with-linux-network-namespaces "Network Namespaces Explained") (i.e., two virtual hosts) are connected with a virtual patch cable (the veth-pair).
-One of the two network namespaces may be the default network namespace, but not both (see [Pitfall: Pointless Usage Of Veth-Pairs](#pointless "See Pitfall: Wrong (Or Better: Pointless) Usage Of Veth-Pairs")).
-
-Receipt:
-
-1. Create two network namespaces and connect them with a veth-pair:
-
-   ```bash
-   sudo ip netns add host_1
-   sudo ip netns add host_2
-   sudo ip link add dev if_1 type veth peer name if_2
-   sudo ip link set dev if_1 netns host_1
-   sudo ip link set dev if_2 netns host_2
-
-   ```
-
-1. Configure the network interfaces and bring them up:
-
-   ```bash
-   sudo ip netns exec host_1 ip addr add 192.168.111.1/24 dev if_1
-   sudo ip netns exec host_1 ip link set dev if_1 up
-   sudo ip netns exec host_2 ip addr add 192.168.111.2/24 dev if_2
-   sudo ip netns exec host_2 ip link set dev if_2 up
-
-   ```
-
-1. Check the created configuration (same for `host_2`):
-
-   ```bash
-   sudo ip netns exec host_1 ip -d addr show
-   1: lo:  mtu 65536 qdisc noop state DOWN group default qlen 1
-       link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0
-   904: if_1@if903:  mtu 1500 qdisc noqueue state UP group default qlen 1000
-       link/ether 7e:02:d1:d3:36:7e brd ff:ff:ff:ff:ff:ff link-netnsid 1 promiscuity 0
-       veth
-       inet 192.168.111.1/32 scope global if_1
-          valid_lft forever preferred_lft forever
-       inet6 fe80::7c02:d1ff:fed3:367e/64 scope link
-          valid_lft forever preferred_lft forever
-
-   ```
-
-   ```bash
-   sudo ip netns exec host_1 ip route show
-   192.168.111.0/24 dev if_1  proto kernel  scope link  src 192.168.111.1
-
-   ```
-
-   Note, that all interfaces are numbered and that each end of a veth-pair explicitly states the number of the other end of the pair:
-
-   ```bash
-   sudo ip netns exec host_2 ip addr show
-   1: lo:  mtu 65536 qdisc noop state DOWN group default qlen 1
-       link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
-   903: if_2@if904:  mtu 1500 qdisc noqueue state UP group default qlen 1000
-       link/ether 52:f4:5a:be:dc:9b brd ff:ff:ff:ff:ff:ff link-netnsid 0
-       inet 192.168.111.2/24 scope global if_2
-          valid_lft forever preferred_lft forever
-       inet6 fe80::50f4:5aff:febe:dc9b/64 scope link
-          valid_lft forever preferred_lft forever
-
-   ```
-
-   _Here:_ `if_2` with number 903 in the network namespace `host_2` states, that its other end has the number 904 — Compare this with the output for the network namespace `host_1` above!
-
-1. Validate the setup (same for `host_2`):
-
-   ```bash
-   sudo ip netns exec host_1 ping -c2 192.168.111.2
-   PING 192.168.111.2 (192.168.111.2) 56(84) bytes of data.
-   64 bytes from 192.168.111.2: icmp_seq=1 ttl=64 time=0.066 ms
-   64 bytes from 192.168.111.2: icmp_seq=2 ttl=64 time=0.059 ms
-
-   --- 192.168.111.2 ping statistics ---
-   2 packets transmitted, 2 received, 0% packet loss, time 999ms
-   rtt min/avg/max/mdev = 0.059/0.062/0.066/0.008 ms
-
-   ```
-
-   ```bash
-   sudo ip netns exec host_1 ping -c2 192.168.111.2
-   # And at the same time in another terminal:
-   sudo ip netns exec host_1 tcpdump -n -i if_1
-   tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
-   listening on if_1, link-type EN10MB (Ethernet), capture size 262144 bytes
-   ^C16:34:44.894396 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 14277, seq 1, length 64
-   16:34:44.894431 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 14277, seq 1, length 64
-   16:34:45.893385 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 14277, seq 2, length 64
-   16:34:45.893418 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 14277, seq 2, length 64
-
-   4 packets captured
-   4 packets received by filter
-   0 packets dropped by kernel
-
-   ```
-
-### Connect A Network Namespace To A Bridge
-
-In this usage scenario, a [network namespace](/virtual-networking-with-linux-network-namespaces "Network Namespaces Explained") (i.e., a virtual host) is connected to a [bridge](/virtual-networking-with-linux-virtual-bridges "Virtual Bridges Explained") (i.e. a virtual network/switch) with a virtual patch cable (the veth-pair).
-The network namespace may be the default network namespace (i.e., the local host).
-
-Receipt:
-
-1. Create a bridge and a network namespace.
-   Then connect the network namespace to the bridge with a veth-pair
-
-   ```bash
-   sudo ip link add dev switch type bridge
-   sudo ip netns add host_1
-   sudo ip link add dev veth0 type veth peer name link_1
-   sudo ip link set dev veth0 netns host_1
-
-   ```
-
-   You can think of the last step (the three last commands) as plugging the virtual host ( _the network namespace_) into the virtual switch ( _the bridge_) with the help of a patch-cable ( _the veth-pair_).
-
-1. Configure the network interfaces and bring all devices up:
-
-   ```bash
-   sudo ip link set dev switch up
-   sudo ip link set dev link_1 master switch
-   sudo ip link set dev link_1 up
-   sudo ip netns exec host_1 ip addr add 192.168.111.1/24 dev veth0
-   sudo ip netns exec host_1 ip link set dev veth0 up
-
-   ```
-
-_The bridge only needs its own IP, if the network has to be routable (see: [Virtual Bridges](/virtual-networking-with-linux-virtual-bridges "Read more about virtual bridges, if you want to learn why"))_
-
-1. Check the created configuration:
-
-   ```bash
-   sudo ip netns exec host_1 ip -d addr show
-   1: lo:  mtu 65536 qdisc noop state DOWN group default qlen 1
-       link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0
-   947: veth0@if946:  mtu 1500 qdisc noqueue state UP group default qlen 1000
-       link/ether 3e:70:06:77:fa:67 brd ff:ff:ff:ff:ff:ff link-netnsid 0 promiscuity 0
-       veth
-       inet 192.168.111.1/24 scope global veth0
-          valid_lft forever preferred_lft forever
-       inet6 fe80::3c70:6ff:fe77:fa67/64 scope link
-          valid_lft forever preferred_lft forever
-
-   ```
-
-   ```bash
-   sudo ip netns exec host_1 ip route show
-   192.168.111.0/24 dev veth0  proto kernel  scope link  src 192.168.111.1
-
-   ```
-
-1. In order to validate the setup, we need a second address in our virtual network for the `ping`-command.
-   There are three ways to achieve this.
-   _Choose only one!_  
-
-   (There are even more possibilities — for example connecting the bridge to the real network interface of the host —, but these are the most straight forward approaches...)
-
-   - Give the virtual network its own address, so that it becomes routable:
-
-     ```bash
-     sudo ip addr add 192.168.111.254/24 dev switch
-     ping -c2 192.168.111.1
-     sudo ip netns exec host_1 ping -c2 192.168.111.254
-
-     ```
-
-     In this commonly used approach, the kernel sets up all needed routing entries automatically.
-
-   - Add a second virtual host to the network:
-
-     ```bash
-     sudo ip netns add host_2
-     sudo ip link add dev veth0 type veth peer name link_2
-     sudo ip link set dev veth0 netns host_2
-     sudo ip link set dev link_2 master switch
-     sudo ip link set dev link_2 up
-     sudo ip netns exec host_2 ip addr add 192.168.111.2/24 dev veth0
-     sudo ip netns exec host_2 ip link set dev veth0 up
-     sudo ip netns exec host_2 ping -c2 192.168.111.1
-     sudo ip netns exec host_1 ping -c2 192.168.111.2
-
-     ```
-
-     In this approach, the virtual network is kept separated from the host.
-     Only the virtual hosts, that are plugged into the virtual network can reach each other.
-
-   - Connect the local host to the virtual network
-
-     ```bash
-     sudo ip link add dev veth0 type veth peer name link_2
-     sudo ip link set dev link_2 master switch
-     sudo ip link set dev link_2 up
-     sudo ip addr add 192.168.111.2/24 dev veth0
-     sudo ip link set dev veth0 up
-     ping -c2 192.168.111.1
-     sudo ip netns exec host_1 ping -c2 192.168.111.2
-
-     ```
-
-     Strictly speaking, this is a special case of the former approach, where the default network namespace is used instead of a private one.
-
-
-     In general, it is advisable, to use the first approach, if you do need a connection to the local host, because it does not clutter your default network namespace with two more interfaces (here: `veth0` and `link_2`).
-
-### Connect Two Bridges
-
-Receipt:
-
-1. ```bash
-
-   ```
-
-1. ```bash
-
-   ```
-
-1. ```bash
-
-   ```
-
-## Pitfalls
-
-- [Do Not Forget To Specifiy The Prefix-Length For The Addresses](#prefix-length)
-- [Capturing Packages On Virtual Interfaces](#capturing)
-- [Wrong (Or Better: Pointless) Usage Of Veth-Pairs](#pointless)
-
-### Do Not Forget To Specifiy The Prefix-Length For The Addressses
-
-**If you forget to specifiy the prefix-length for one of the addresses, you will not be able to ping the host on the other end of the veth-pair.**
-
-`192.168.111.1/24` specifies the address `192.168.111.1` as part of the subnet with the network-mask `255.255.255.0`. If you forget the prefix, the address will be interpreted as `192.168.111.1/32` and the kernel will not add a network-route. Hence, you will not be able to ping the other end ( `192.168.111.2`), because the kernel would not know, that it is reachable via the interface that belongs to the address `192.168.111.1`.
-
-### Capturing Packages On Virtual Interfaces
-
-If you run `tcpdump` on an interface in the default-namespace, the captured packages show up immediatly.
-I.e.: You can watch the exchange of ICMP-packages live, as it happens.
-But: **If you run `tcpdump` in a named network-namespace, the captured packages will not show up, until you stop the command with `CRTL-C`!**
-
-_Do not ask me why — I just witnessed that odd behaviour on my linux-box and found it noteworthy, because I thought, that my setup was not working several times, before I realised, that I had to kill `tcpdump` to see the captured packages._
-
-### Wrong (Or Better: Pointless) Usage Of Veth-Pairs
-
-This is another reason, why packages might not show up on the virtual interfaces of the configured veth-pair.
-Often, veth-pairs are used as a simple example for virtual networking like in the following snippet:
-
-```bash
-sudo ip link add dev if_1 type veth peer name if_2
-sudo ip addr add 192.168.111.1 dev if_1
-sudo ip link set dev if_1 up
-sudo ip addr add 192.168.111.2 dev if_2
-sudo ip link set dev if_2 up
-
-```
-
-_Note, that additionally, the prefix was not specified with the given addresses ( [compare with above](#prefix-length "Compare with the remarkes considering the prefix length"))!_
-_This works here, because both interfaces are local, so that the kernel does know how to reach them without any routing information._
-
-The setup is then _"validated"_ with a ping from one address to the other:
-
-```bash
-ping -c 3 -I 192.168.111.1 192.168.111.2
-PING 192.168.111.2 (192.168.111.2) from 192.168.111.1 : 56(84) bytes of data.
-64 bytes from 192.168.111.2: icmp_seq=1 ttl=64 time=0.068 ms
-64 bytes from 192.168.111.2: icmp_seq=2 ttl=64 time=0.079 ms
-64 bytes from 192.168.111.2: icmp_seq=3 ttl=64 time=0.105 ms
-
---- 192.168.111.2 ping statistics ---
-3 packets transmitted, 3 received, 0% packet loss, time 2052ms
-rtt min/avg/max/mdev = 0.068/0.084/0.105/0.015 ms
-
-```
-
-Though it looks like the setup is working as intended, this is not the case:
-_The packets are not routed through the virtual network interfaces `if_1` and `if_2`_
-
-```bash
-sudo tcpdump -i if_1 -n
-tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
-listening on if_1, link-type EN10MB (Ethernet), capture size 262144 bytes
-^C
-0 packets captured
-0 packets received by filter
-0 packets dropped by kernel
-
-```
-
-Instead, they show up on the local interface:
-
-```bash
-sudo tcpdump -i lo -n
-tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
-listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
-12:20:09.899325 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 28048, seq 1, length 64
-12:20:09.899353 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 28048, seq 1, length 64
-12:20:10.909627 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 28048, seq 2, length 64
-12:20:10.909684 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 28048, seq 2, length 64
-12:20:11.933584 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 28048, seq 3, length 64
-12:20:11.933630 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 28048, seq 3, length 64
-^C
-6 packets captured
-12 packets received by filter
-0 packets dropped by kernel
-
-```
-
-This happens, because the kernel adds entries for both interfaces in the local routing table, since both interfaces are connected to the default network namespace of the host:
-
-```bash
-ip route show table local
-broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1
-local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1
-local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1
-broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1
-local 192.168.111.1 dev if_1  proto kernel  scope host  src 192.168.111.1
-local 192.168.111.2 dev if_2  proto kernel  scope host  src 192.168.111.2
-
-```
-
-When routing the packages, the kernel looks up this entries and consequently routes the packages through the `lo`-interface, since both addresses are local addresses.
-
-There is nothing strange or even wrong with this behavior.
-**If there is something wrong in this setup, it is the idea to create two connected virtual local interfaces.**
-That is equally pointless, as installing two nics into one computer and connecting both cards with a cross-over patch cable...
-
-## References
-
-- [Linux Virtual Interfaces](https://gabhijit.github.io/linux-virtual-interfaces.html "Linux Virtual Interfaces")
-- [Guide to IP Layer Network Administration with Linux](http://linux-ip.net/html/routing-tables.html "Guide to IP Layer Network Administration with Linux, Chapter 4. IP Routing, Section 4.8 Routing Tables")
diff --git a/generated-2025-11-21-17-29-08/content/posts/virtual-networking-with-linux-virtual-bridges.md b/generated-2025-11-21-17-29-08/content/posts/virtual-networking-with-linux-virtual-bridges.md
deleted file mode 100644 (file)
index 743fd0d..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - uncategorized
-date: "2019-06-04T09:27:40+00:00"
-draft: "true"
-guid: http://juplo.de/?p=858
-parent_post_id: null
-post_id: "858"
-title: 'Virtual Networking With Linux: Virtual Bridges'
-url: /
-
----
-
diff --git a/generated-2025-11-21-17-29-08/content/posts/xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace.md b/generated-2025-11-21-17-29-08/content/posts/xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace.md
deleted file mode 100644 (file)
index 97e66e9..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
----
-_edit_last: "2"
-author: kai
-categories:
-  - explained
-date: "2018-09-28T08:38:10+00:00"
-guid: http://juplo.de/?p=762
-parent_post_id: null
-post_id: "762"
-title: XPath 2.0 deep-equal Does Not Match Like Expected - The Problem With Whitespace
-url: /xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace/
-
----
-I just stumbled accros a problem with the `deep-equal()`-method introduced by `XPath 2.0`.
-It costs me two hours at minimum to find out, what was going on.
-So I want to share this with you, in case your are wasting time on the same problem and try to find a solution via google ;)
-
-If you never heard of `deep-equal()` and just wonder how to compare XML-nodes in the right way, you should probably read this [exelent article about equality in XSLT](http://www.xml.com/lpt/a/1589 "Read more about the posibilities to compare nodes in XSLT") as a starter.
-
-## My Problem
-
-My problem was, that I wanted to parse/output a node only, if there exists no node on the `ancestor`-axis, that has a exact duplicate of that node as a direct child.
-
-## The Difference Between A Comparison With `=` And With `deep-equal()`
-
-If you just use simple equality (with `=` or `eq`), the two compared nodes are converted into strings implicitly.
-That is no problem, if you are comparing attributes, or nodes, that only contain text.
-But in all other cases, you will only compare the text-contents of the two nodes and their children.
-Hence, if they differ only in an attribute, your test will report that they are equal, which might not be what you are expecting.
-
-For example, the XPath-expression
-
-```XPath
-//child/ref[ancestor::parent/ref=.]
-```
-
-will match the `<ref>`-node with `@id='bar'`, that is nested insiede the `<child>`-node in this example-XML, what I was not expecting:
-
-```Java
-<root>
-  <parent>
-    <ref id="foo"><content>Same Text-Content</content></ref>
-    <child>
-      <ref id="bar"><content>Same Text-Content</content></ref>
-    </child>
-  <parent>
-<list>
-```
-
-So, what I tried, after I found out about `deep-equal()` was the following `Xpath`-expression, which solves the problem in the above example:
-
-```XPath
-//child/ref[deep-equal(ancestor::parent/ref,.)]
-```
-
-## The Unexpected Behaviour Of `deep-equal()`
-
-But, moving on I stumbled accross cases, where I was expecting a match, but `deep-equal()` does not match the nodes.
-For example:
-
-```Java
-<root>
-  <parent>
-    <ref id="same">
-      <content>Same Text-Content</content>
-    </ref>
-    <child>
-      <ref id="same">
-        <content>Same Text-Content</content>
-      </ref>
-    </child>
-  <parent>
-<list>
-```
-
-You probably catch the diffrenece at first glance, since I laid out the examples accordingly and gave you a hint in the heading of this post - but it really took me a long time to get that:
-
-## It is all about whitespace!
-
-`deep-equal()` compares _all_ child-nodes and only yields a match, if the compared nodes have exactly the same child-nodes.
-But in the second example, the compared `<ref>`-nodes contain whitespace befor and after their child-node `<content>`.
-And these whitespace are in fact implicite child-nodes of type text.
-Hence, the two nodes in the second example differe, because the indentation on the second one has two more spaces.
-
-## The solution...?
-
-Unfortunatly, I do not really know a good solution.
-(If you come up with one, feel free to note or link it in the comments!)
-
-The best solution would be an option additional argument for `deep-equal()`, that can be selected to tell the function to ignore such whitespace.
-In fact, some XSLT-parsers do provide such an argument.
-
-The only other solution, I can think of, is, to write another XSLT-script to remove all the whitespaces between tags to circumvent this at the first glance unexpected behaviour of `deep-equal()`
-
-## Funded by the Europian Union
-
-This article was published in the course of a
-[resarch-project](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project"),
-that is funded by the European Union and the federal state Northrhine-Wetphalia.
-
-[![Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung](/img/EFRE_Foerderhinweis_deutsch_farbig.svg)![EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung](/img/Ziel2NRW_4c_1809_eps.svg)](http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html "Show details about the funded resarch-project")
diff --git a/generated-2025-11-21-17-29-08/content/search.md b/generated-2025-11-21-17-29-08/content/search.md
deleted file mode 100644 (file)
index 6dea674..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-
----
-title: "Search" # in any language you want
-layout: "search" # necessary for search
-summary: "Search"
-url: "/search/"
-placeholder: "placeholder text in search input box"
----
diff --git a/generated-2025-11-21-17-29-08/data/comments.yaml b/generated-2025-11-21-17-29-08/data/comments.yaml
deleted file mode 100644 (file)
index 7d4010a..0000000
+++ /dev/null
@@ -1,1303 +0,0 @@
-- id: "55"
-  author_name: admin
-  author_email: kai@ich-geh-kaputt.de
-  author_url: ""
-  published: null
-  parent_id: "54"
-  content: |-
-    There is a private git-Repository.
-    <a href="http://juplo.de/hibernate4-maven-plugin/source-repository.html" rel="nofollow">Check the project-documentation!</a>
-
-    You can <a href="http://juplo.de/hibernate4-maven-plugin/team-list.html" rel="nofollow">send me</a> a patch or a pull-request to kai@juplo.de
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "50"
-  author_name: Victor
-  author_email: vtatai@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Hey I have modified your code to support envers and generate auditing tables, if you want I can send you a patch. Thanks!
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "51"
-  author_name: admin
-  author_email: kai@ich-geh-kaputt.de
-  author_url: ""
-  published: null
-  parent_id: "50"
-  content: |-
-    Your welcom.
-    Send it!
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "54"
-  author_name: Victor
-  author_email: vtatai@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "51"
-  content: Where to? Is there a github repo?
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "567"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "556"
-  content: |-
-    This plugin is only a tool to automate the generation of the SQL in your development-environment.
-    Questions on how to anotate your code correctly are better asked in a user-forum from hibernate or such.
-
-    Nevertheless, I think I can give you a usefull hint:
-    You are overwriting the automatically generated column-definition with "default TRUE".
-    Try it with
-
-    @Column(name = “financialEnabled”, nullable = false)
-    private boolean financialEnabled;
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "568"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "391"
-  content: Version 1.0.3 of the plugin can now scan for annotations in the dependencies, too.
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "556"
-  author_name: Jukes
-  author_email: hvegat@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    Hi thanks a lot for making this plugin available, great work!!
-    I have a problem generating postgres schema. Looks like the plugin ignores the data type when adding default values and that yields a syntax error from Postgres. Or maybe I'm doing something wrong. I'm using version 1.0.3.
-
-    For example I have in java:
-
-        @Column(name = "financialEnabled", nullable = false, columnDefinition = "default TRUE")
-        private boolean financialEnabled;
-
-    Generated SQL is:
-        financialEnabled default TRUE not null,
-
-    As you can see the data type boolean is not translated to the SQL script. Thanks a lot for your help.
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "391"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "390"
-  content: |-
-    Yes, I am working on the possibility, to scan for annotations in dependencies.
-    Unfortunatly, I have no example-project for this use-case by hand.
-    It would help a lot, if you could provide a sample-project on github or such.
-
-    Greetings kai
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "276"
-  author_name: mike
-  author_email: mjoecohen@gmail.com
-  author_url: http://bidlogix.com
-  published: null
-  parent_id: "0"
-  content: |-
-    Hello,
-
-    I'm upgrading from hibernate3 to to hibernate4 and have moved from the hibernate3-maven-plugin to this version. I haven't undertaken (and don't want to just yet) the big job of changing my hbm mapping files to annotations.
-
-    As far as I can see this is a show stopper for using your nice plugin. Can you please confirm if this is the case and whether you are planning to add support for scanning for hbm files?
-
-    Many thanks,
-
-    Mike Cohen.
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "277"
-  author_name: tortenheber
-  author_email: kai@ich-geh-kaputt.de
-  author_url: ""
-  published: null
-  parent_id: "276"
-  content: |-
-    Hello Mike,
-
-    I added the requested feature in the SNAPSHOT-version.
-    It would be nice, if you could test, if the new feature works, because I have no example project by hand, that still uses hibernate-mapping via XML.
-
-    You can download an actual build here:
-
-    https://oss.sonatype.org/content/repositories/snapshots//de/juplo/hibernate4-maven-plugin/1.0.2-SNAPSHOT/
-
-    or build it by yourself from the sources.
-    The feature is documented here:
-
-    http://juplo.de/hibernate4-maven-plugin-1.0.2-SNAPSHOT/export-mojo.html
-
-
-    Best regards
-
-    kai
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "285"
-  author_name: Pedro
-  author_email: pmmarques@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    Hi,
-
-    I have the following problem.
-    The project that I use to test (and use the plugin) has the annotated classes as a dependency.
-    I am getting the error:
-    No annotated classes found in directory /target/classes
-
-    Shouldn't the plugin scan all the dependencies also?
-
-    Thanks,
-    Pedro.
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "286"
-  author_name: Pedro
-  author_email: pmmarques@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    Following my previous question, here is the debug info
-
-    [DEBUG] Dependency: /Users/pmarques/.m2/repository/org/springframework/security/spring-security-acl/3.1.4.RELEASE/spring-security-acl-3.1.4.RELEASE.jar
-    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/atomikos-util/3.6.5/atomikos-util-3.6.5.jar
-    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-api/3.6.5/transactions-api-3.6.5.jar
-    [DEBUG] Dependency: /Users/pmarques/.m2/repository/javax/transaction/transaction-api/1.1/transaction-api-1.1.jar
-    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jdbc-deprecated/3.6.5/transactions-jdbc-deprecated-3.6.5.jar
-    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jdbc/3.6.5/transactions-jdbc-3.6.5.jar
-    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jta/3.6.5/transactions-jta-3.6.5.jar
-    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions/3.6.5/transactions-3.6.5.jar
-    [DEBUG] Dependency: /Users/pmarques/.m2/repository/org/apache/geronimo/specs/geronimo-jta_1.0.1B_spec/1.0.1/geronimo-jta_1.0.1B_spec-1.0.1.jar
-    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jms-deprecated/3.6.5/transactions-jms-deprecated-3.6.5.jar
-    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jms/3.6.5/transactions-jms-3.6.5.jar
-    [DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-hibernate3/3.6.5/transactions-hibernate3-3.6.5.jar
-    [INFO] Scanning directory /target/classes for annotated classes...
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "287"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "285"
-  content: |-
-    Hi Pedro,
-
-    I think, that your observation is right.
-    But otherwise, dependencies should only be scanned if requested, because automatic scanning of the dependencies might lead to errors in other situations.
-
-    If you can make your project available to me (for example via github, or simply by mailing zipped version), I would add a configuration-parameter to enable/disable dependency-scanning and upload the refined plugin to central.
-
-    Regards,
-
-    Kai Moritz
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "426"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "287"
-  content: The <a href="/hibernate4-maven-plugin-1-0-3-released/" title="Open the release-notes" rel="nofollow">new version 1.0.3</a> of the plugin adds support for annotated classes in dependencies!
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "390"
-  author_name: Milios
-  author_email: milos.gregor@deutsche-boerse.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: "Hi,\n\nlooks like a very nice plugin. Unfortunately, part of our entities are in other modules/dependencies.\nDo you plan to add the possibility to scan also for dependencies of the project or at least of the plugin?\n\nAlso, when I only want to generate the SQL and use the following configuration, I got nothing.\n\n\nConfig:\n            \n                de.juplo\n                hibernate4-maven-plugin\n                1.0.2\n                \n                    true\n                    SCRIPT\n                    NONE\n                    com.deutscheboerse.hibernate.PostgreSQLDialect\n                    ${project.build.directory}/hibernate4/cmm-schema.sql\n                \n                \n                    \n                        com.deutscheboerse.energy\n                        energy-commons-hibernate\n                        ${commons.hibernate.version}\n                    \n                    \n                        org.springframework.security\n                        spring-security-core\n                        ${spring.security.version}\n                    \n                    \n                        org.slf4j\n                        slf4j-log4j12\n                        ${slf4j.version}\n                    \n                \n            \n\n\nOutput:\nmvn hibernate4:export -e\n[INFO] Error stacktraces are turned on.\n[INFO] Scanning for projects...\n[INFO]\n[INFO] ------------------------------------------------------------------------\n[INFO] Building CMM WAR 1.0.0-RC5-SNAPSHOT\n[INFO] ------------------------------------------------------------------------\n[INFO]\n[INFO] --- hibernate4-maven-plugin:1.0.2:export (default-cli) @ cmm-war ---\n[INFO] Scanning directory D:\\_dev\\work\\ii\\src\\cmm\\trunk\\cmm-war\\target\\classes f\n[INFO] No hibernate-properties-file found! (Checked path: D:\\_dev\\work\\ii\\src\\cm\n[INFO] Gathered hibernate-configuration (turn on debugging for details):\n[INFO]   hibernate.dialect = com.deutscheboerse.hibernate.PostgreSQLDialect\n[INFO] HHH000400: Using dialect: com.deutscheboerse.hibernate.PostgreSQLDialect\n[INFO] ------------------------------------------------------------------------\n[INFO] BUILD SUCCESS\n[INFO] ------------------------------------------------------------------------\n[INFO] Total time: 10.932s\n[INFO] Finished at: Thu Oct 10 12:51:05 UTC 2013\n[INFO] Final Memory: 9M/23M\n[INFO] ------------------------------------------------------------------------\n\n\nThanks for any help,\nMilos."
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "1251"
-  author_name: hdave
-  author_email: david.h.vree@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "568"
-  content: Thats awesome - but you need to update your "Known Pitfalls" page then.
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "2654"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "2653"
-  content: |-
-    Multiple executions should work as expected, since the plugin obeys the standard rules for maven plugins.
-    I also have seen working examples of this kind of configuration...
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "2653"
-  author_name: JRG
-  author_email: jeromerg@gmx.net
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: "Hi, \nThank you for this very useful plugin! Is it possible to define multiple execution-configuration? We need to export two different scripts, on for the \"drop commands\" and one for the \"schema-creation commands\". I tried to configure multiple executions by following <a href=\"http://maven.apache.org/guides/mini/guide-configuring-plugins.html#Using_the_executions_Tag\" title=\"following steps\" rel=\"nofollow\">http://maven.apache.org/guides/mini/guide-configuring-plugins.html#Using_the_executions_Tag</a>, but maven build failed..."
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "1407"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "1251"
-  content: Thanks for the hint, I will update the page...
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "14954"
-  author_name: Tarek
-  author_email: tarekmnabil@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "426"
-  content: |-
-    Hi Kai,
-
-    Unlike Pedro, I do not want my dependencies to be scanned. I tried passing an empty value for the "hibernate.export.scan_dependencies" parameter, but it still used the default value (compile).
-
-    I tried passing something else like "system", the behaviour did not change.
-
-    How can I stop it from scanning my dependencies?
-
-    Thanks,
-    Tarek
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "17030"
-  author_name: Marcel
-  author_email: marcel@frightanic.com
-  author_url: http://frightanic.com
-  published: null
-  parent_id: "0"
-  content: 'If I may ask, what''s the reason you didn''t update the hibernate3-maven-plugin to work with Hibernate4 but rather started from scratch? Reference: https://developer.jboss.org/message/853856 and https://issues.jboss.org/browse/JBIDE-12445'
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "17088"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "17030"
-  content: |-
-    Like always: starting over new was easier than understanding the existing code :/
-    If I remember right, I took a quick view into the code of the hibernate3-maven-plugin and realised, that it can do a lot more, than simply generat the database schema.
-    So, I decided to start over with a slim layer above the tools from hibernate.
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "17092"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "14954"
-  content: Passing <code>-Dhibernate.export.scan_dependencies=none</code> to the call to maven or setting <code>&lt;scanDependencies&gt;none&lt;/scanDependencies&gt; in the configuration of the hibernate4-maven-plugin should do the trick.
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "52865"
-  author_name: Alexey
-  author_email: bostandyksoft@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "52862"
-  content: Hi. Should i set dependecy for the plugin, even class is part of project from dependecies?
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "52866"
-  author_name: Alexey
-  author_email: bostandyksoft@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "52862"
-  content: Many thanks. It works for me.
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "33336"
-  author_name: Ram
-  author_email: rkpunjal@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Hi, Can we facilitate the envers to be generated to a seperate file?
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "40079"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "33336"
-  content: Unfortunatly, that is not possible at the moment...
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "52859"
-  author_name: Alexey
-  author_email: bostandyksoft@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: "Hi. \n\nI tried to use version 1.0.3, but recieve exception \"no annotated classes found in directory\" (on MacOS El Capitan)\n \nI updated version to 1.1.0, but i have used a custom HibernateDialect class, that defined in my project and catch following exception \n\n<code>\nCaused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.tdh.crm.util.JsonPostgreSQLDialect\n        at de.juplo.plugins.hibernate4.ValidationConfiguration.secondPassCompile(ValidationConfiguration.java:46)\n</code>\n I sure, that it is public class with noarg constructor, that extends PostgreSQL9Dialect.\n\nCan you help me?\n\nBest regards."
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "52862"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "52859"
-  content: If this class is not part of your project, you have to define the dependency for the plugin like described <a href="http://juplo.de/hibernate4-maven-plugin/pitfalls.html" title="Jump to the FAQ" rel="nofollow">in the FAQ</a> for driver classes.
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "61651"
-  author_name: Simon
-  author_email: simon.kaufmann@adesso.ch
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    Hi thx for updating the plugin to support hibernate 5. :)
-
-    Is there a way to generate "NOT NULL" constraints in the generated "output file" via existing @NotNull annotations (javax.validation.constraints.NotNull) like in the version before?
-    I don't like to add @column(nullable = false) to every field.
-
-    Thx for your answer :)
-  post_url: /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/
-  post_id: "34"
-- id: "326"
-  author_name: Daniel McCafferty
-  author_email: daniel@danm.cc
-  author_url: http://danm.cc
-  published: null
-  parent_id: "0"
-  content: Hey, is there a mode for this plugin where it can generate update rather than create statements.
-  post_url: /hibernate4-maven-plugin-1-0-2-release/
-  post_id: "75"
-- id: "329"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "326"
-  content: |-
-    Unfortunatly: no.
-
-    The plugin is build around the <a href="http://docs.jboss.org/hibernate/core/4.2/manual/en-US/html/ch21.html#d5e9612" title="Documentaiton of the command-line-switches of SchemaExport" rel="nofollow">SchemaExport-Tool</a>, which does only support drop and create.
-  post_url: /hibernate4-maven-plugin-1-0-2-release/
-  post_id: "75"
-- id: "52833"
-  author_name: Nick Cotter
-  author_email: nick@extropy.net
-  author_url: http://cosmo-opticon.net
-  published: null
-  parent_id: "0"
-  content: Thanks muchly for posting this!
-  post_url: /log-out-from-wrong-account-with-maven-appengine-plugin/
-  post_id: "97"
-- id: "785"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "783"
-  content: |-
-    Hi Augustino,
-
-    thanks a lot for your bug-report, first.
-
-    If you could provide me with a small example-project, that triggers the error, that would ease and therefore speed up the bugfixing.
-    Youd could simply send it as .zip or .tgz to kai@juplo.de, or share it at githupb or something else.
-
-    Kind regards
-
-    Kai Moritz
-  post_url: /hibernate4-maven-plugin-1-0-3-released/
-  post_id: "114"
-- id: "783"
-  author_name: Agustino
-  author_email: agustino_alim@yahoo.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    Hi,
-
-    When using this plugin, this class package-info is ignored. You need to invoke Configuration.addPackage(packageName).
-  post_url: /hibernate4-maven-plugin-1-0-3-released/
-  post_id: "114"
-- id: "1544"
-  author_name: Andreas Kuhtz
-  author_email: andreas.kuhtz@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    Hi Kai,
-    Thank you for this great plugin!
-    When will the next version be released? We ran into an issue that is fixed on trunk (schema file created in non-existing subdirectory).
-    Regards,
-    Andreas
-  post_url: /hibernate4-maven-plugin-1-0-3-released/
-  post_id: "114"
-- id: "1315"
-  author_name: hdave
-  author_email: david.h.vree@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: I've got your plugin in production now and it works great.  Thanks a ton.  One thing however, it pumps out a lot of text during the maven build.  Our team works hard to cut down on the clutter.  Any chance of getting a "quiet" setting or level?
-  post_url: /hibernate4-maven-plugin-1-0-3-released/
-  post_id: "114"
-- id: "1558"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "1544"
-  content: |-
-    Hi Andreas,
-
-    I am working on the next release. Nearly everything is in place to put it online. The only thing missing is the fact, that I planed to add some test-cases to ensure, that the fixes does not break the known use-cases. I hope I will find some time in the next days, to complete this plan...
-
-    Regards,
-    Kai
-  post_url: /hibernate4-maven-plugin-1-0-3-released/
-  post_id: "114"
-- id: "1409"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "1315"
-  content: |-
-    That is a good idea!
-    I will include a switch in the next release...
-    Thanks for the clue.
-  post_url: /hibernate4-maven-plugin-1-0-3-released/
-  post_id: "114"
-- id: "2842"
-  author_name: xjoshyx92
-  author_email: joshua-schneider@freenet.de
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Nice work. But for me it is not working in the recovery it says everything went fine but after reboot nothing changed there is no super user and no root. Also tried to install gapps but the same here. Did you make a wipe bevore or after install or some other special kind of stuff?
-  post_url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
-  post_id: "186"
-- id: "4092"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "2842"
-  content: |-
-    I did not remember to make a wipe.
-    As far as I can say, I wrote down every little step, I have taken.
-    But, I never really used my TV-stick, before I rooted it.
-    So, it might help you, to do a complete wipe and factory reset!
-  post_url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
-  post_id: "186"
-- id: "14982"
-  author_name: Luca Tavecchio
-  author_email: tavecchio.luca@tiscali.it
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Hi, i came here looking for a solution with the same id device (B.AML8726.6B 12122.), mine is a branded in a different way (also the form factor, but that is just plastic) and come with google play store.. anyway i'm curious about the general wifi performance on your device? mine is quite poor yours? it was poor and you were maybe able to fix it in some way??
-  post_url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
-  post_id: "186"
-- id: "17089"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "14982"
-  content: |-
-    I am sorry, but up until now, I did not do a lot more with the stick, than just hack it.
-    I am too busy with other stuff...
-  post_url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
-  post_id: "186"
-- id: "43147"
-  author_name: Hama Internet TV Stick 00054807 19,95 Euro - Android-Hilfe.de
-  author_email: ""
-  author_url: http://www.android-hilfe.de/android-mini-pc-usb-hdmi-sticks-allgemein/674603-hama-internet-tv-stick-00054807-19-95-euro.html#post8838217
-  published: null
-  parent_id: "0"
-  content: '[&#8230;]  [&#8230;]'
-  post_url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
-  post_id: "186"
-- id: "33290"
-  author_name: Richard
-  author_email: rha@onlinehome.de
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    Hello,
-    I tried to update the old android version with android 4.2.1 and 4.2.2 using  c5ea6e959840.update_mysidspr_FH05_to_GA02.zip or  eaef14432ff5.signed-mantaray-JDQ39-from-JOP40D.eaef1443 (1).zip, but had errors like:
-    E: Badbootloader arguments "(null)"
-    ....
-    ....
-    ....
-    E: Signature verification failed
-    Installation aborted.
-
-    What did I make wrong?
-    (Can I also write to this blog in German?)
-
-    xmas-greetings from Ric
-  post_url: /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/
-  post_id: "186"
-- id: "4454"
-  author_name: Eric
-  author_email: eric@hotmail.no
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Thanks for this! Perfect for devs trawling the net for a quick and easy solution to make https work for maven-jetty-plugin 9.x. Used this for 9.1.5.x and worked fine!
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "52409"
-  author_name: Goncalo Bv
-  author_email: goncalo.bv@hotmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Great post! Works as a charm.
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "43011"
-  author_name: Matteo
-  author_email: sgalahad@tiscal.it
-  author_url: https://twitter.com/matteopelucco
-  published: null
-  parent_id: "0"
-  content: |-
-    So useful.. many thanks!
-    Perfectly running with Jetty Maven Plugin 9.2.9.v20150224
-
-    Matteo
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "54943"
-  author_name: Simon
-  author_email: simonwck@yahoo.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: 'Thank you for the very helpful instructions. I am getting close but seeing "Failure: no valid keystore" error for 9.3.3. Any ideas or suggestions?'
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "20731"
-  author_name: romu
-  author_email: romu31@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: life saver , thanks alot
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "47820"
-  author_name: Mark
-  author_email: bigtrashcaninthesky@yahoo.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    <strong>Awesome job! Just download the files, copy three lines and presto, instant SSL without having to bash your head against the wall.
-
-    One question. Why do the files have to be in src/test and not src/main? I actually first put them in src/main and changed the jetty-ssl.xml file to have src/main as the default for the KeyStorePath and TrustStorePath properties.
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "49624"
-  author_name: Jayadev
-  author_email: jayadevpr@gmail.com
-  author_url: http://vedayaj.cm
-  published: null
-  parent_id: "0"
-  content: Awesome Post. Followed the steps and could easily configure the Jetty with SSL. Thanks a lot :)
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "52527"
-  author_name: Felipe
-  author_email: fzuleta@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Hi, this is awesome, I think the article needs updating, on jetty (9.3.5.v20151012) I had to place your jetty-ssl.xml in a jetty-ssl-context.xml  then it worked fine.  cheers and thank you!
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "53352"
-  author_name: Matt Tyson
-  author_email: matthewcarltyson@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Wow.  I can't believe how involved that is now.  Thanks for writing the only clear description on the internet.
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "58361"
-  author_name: java - Cómo usar https / ssl con Maven/Mortbay Jetty Plugin?
-  author_email: ""
-  author_url: https://rstopup.com/como-usar-https-ssl-con-maven-mortbay-jetty-plugin.html
-  published: null
-  parent_id: "0"
-  content: '[&#8230;] Aquí es el único de trabajo, claro el paso a paso que he encontrado para Jetty 9: juplo.de/configure-https-for-jetty-maven-plugin-9-0-x/&#8230; [&#8230;]'
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "55237"
-  author_name: Phil
-  author_email: philmkieti@hotmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Awesome tutorial. Works like magic. Better than the jetty docs.
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "57303"
-  author_name: java - Comment faire pour utiliser https / ssl avec Maven/Mortbay Jetée Plugin?
-  author_email: ""
-  author_url: https://askcodez.com/comment-faire-pour-utiliser-https-ssl-avec-maven-mortbay-jetee-plugin.html
-  published: null
-  parent_id: "0"
-  content: '[&#8230;] Ici est le seul à travailler, clairement, étape par étape, que j&#039;ai trouvé pour Jetty 9: juplo.de/configure-https-for-jetty-maven-plugin-9-0-x/... [&#8230;]'
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "53736"
-  author_name: Richard
-  author_email: ra22597@gmail.com
-  author_url: http://www.researchspace.com
-  published: null
-  parent_id: "0"
-  content: |-
-    Thanks very much ! I just used your 6 files verbatim and it and it all worked fine on Jetty 9.3.12
-    You have saved me endless hours resolving this...
-
-    Btw I have put the xml files and keystone in a a folder /jetty and it all works fine, to keep these config files out of application resource folders
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "53676"
-  author_name: Nikola
-  author_email: nikola.milikic@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Thanks a million! This worked like a charm.
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "62582"
-  author_name: Mike Croteau
-  author_email: croteau.mike@gmail.com
-  author_url: http://www.zeus.social
-  published: null
-  parent_id: "0"
-  content: Do you have a Patreon account? How can I buy you a coffee! This had to have taken a long time to configure. Thank you.
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "62195"
-  author_name: Mike Croteau
-  author_email: croteau.mike@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: "I am getting an invalid certificate on the browser window. What could be causing this? Everything seems to be exact. \n\nThank you by the way! Im excited to have gotten this far thanks to you."
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "57037"
-  author_name: Maurice Wipf
-  author_email: maurice@gmx.de
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    I had rtouble to access the webapp with https.
-
-    I figured out that there are two locahosts:
-
-    https://localhost:8443 and
-    http://localhost:8080.
-
-    The ports are configured in jetty-https.xml and jetty-http.xml.
-  post_url: /configure-https-for-jetty-maven-plugin-9-0-x/
-  post_id: "209"
-- id: "46574"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "46568"
-  content: |-
-    Hi Richard,
-
-    thank you for your hint.
-    I will take a look at it.
-    I was not able to find that plugin, when I first stumbled accross the problem.
-    So, it is good, this probably easier alternative is pointed out here.
-  post_url: /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/
-  post_id: "255"
-- id: "41602"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "41591"
-  content: |-
-    Hi Sofian,
-
-    I think, that that would be the effect of my code.
-    Unfortunatly, I cannot test this now, because I turned of the visual HTML-editor in my wordpress-installation, because I do not need it.
-    So, I think you will get what you are looking for.
-    But it would be nice, if you could report back, if my trick worked for you, so that future readers can profit from your work.
-  post_url: /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/
-  post_id: "255"
-- id: "41591"
-  author_name: sofian
-  author_email: sascha50000@gmx.de
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: "Hello, thanks for this post, I am in the same situation, I find WP's HTML Editor behaviour a joke. \n\nNow if I understood correctly, the use of remove_filter('the_content', 'wpautop'); should result in my p-tags to stay when i switch to visual and back, but they dont.\n\nIs this the effect that that code brings to you? Can you normally work now in your HTML Editor with all tags? Are they getting lost if you switch to visual and back?\n\nThank you\nSofian"
-  post_url: /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/
-  post_id: "255"
-- id: "46568"
-  author_name: Richard
-  author_email: Bower39@yahoo.co.uk
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    The Raw HTML plugin offers a "Disable automatic paragraphs" function.
-
-    Works for me to enable the Ordnance Survey OS API, for maps and POI markers.
-  post_url: /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/
-  post_id: "255"
-- id: "56975"
-  author_name: Pihu Gupta
-  author_email: refernloot@gmail.com
-  author_url: https://refernloot.com/
-  published: null
-  parent_id: "0"
-  content: Thanks, Actually I wants to adding a style code with using some multiple Input &amp; Id, Values in the Single Posts. But I just fix this. Thank You So Much Sir.
-  post_url: /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/
-  post_id: "255"
-- id: "61327"
-  author_name: steve
-  author_email: nope@web.de
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: wow, thanks!
-  post_url: /der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen/
-  post_id: "275"
-- id: "4093"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "0"
-  content: |-
-    Thanks to Tim Astle, who pointed out, that the 1.0.4-build was still missing from central.
-
-    I had forgotten, to perform the final step of the process: the release of the staging repository to centra. Sorry, folks.
-  post_url: /hibernate4-maven-plugin-1-0-4-released/
-  post_id: "288"
-- id: "4648"
-  author_name: Running aspectj-maven-plugin with the current Version 1.8.1 of AspectJ | juplo
-  author_email: ""
-  author_url: http://juplo.de/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/
-  published: null
-  parent_id: "0"
-  content: '[&#8230;] I stumbled over a syntactically valid class, that can not be compiled by the aspectj-maven-plugin, even so it is a valid Java-7.0 [&#8230;]'
-  post_url: /aspectj-maven-plugin-can-not-compile-valid-java-7-0-code/
-  post_id: "302"
-- id: "4649"
-  author_name: aspectj-maven-plugin can not compile valid Java-7.0-Code | juplo
-  author_email: ""
-  author_url: http://juplo.de/aspectj-maven-plugin-can-not-compile-valid-java-7-0-code/
-  published: null
-  parent_id: "0"
-  content: '[&#8230;] I found out, how to use the aspectj-maven-plugin with AspectJ 1.8.3. Read [&#8230;]'
-  post_url: /running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/
-  post_id: "306"
-- id: "39525"
-  author_name: yuxh
-  author_email: 28391418@qq.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    I tried appfuse 3.5 which intergrate with version 1.0.5 of hibernate4-maven-plugin. when I run &gt;mvn hibernate4:export -X ,I found:<code>
-    [DEBUG] Setting dialect [org.hibernate.dialect.Oracle10gDialect]
-    [INFO] HHH000227: Running hbm2ddl schema export
-    [DEBUG] Import file not found: /import.sql
-    [DEBUG]
-        drop table app_user cascade constraints
-
-        drop table app_user cascade constraints;
-    [ERROR] HHH000389: Unsuccessful: drop table app_user cascade constraints
-    [ERROR] ORA-00911: invalid character</code>
-    I didnot modify anything,can you help me.thank you
-  post_url: /hibernate4-maven-plugin-1-0-5-released/
-  post_id: "319"
-- id: "43007"
-  author_name: Anna
-  author_email: anna.fuczko.extern@bertelsmann.de
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: "Hi,\nI'm using as dialect a class which is specified in project where we are using your plugin. Since version 1.4 I'm getting\n\nCaused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: <strong>myDialect.MySQLServerDialect</strong>\n        at de.juplo.plugins.hibernate4.ValidationConfiguration.(ValidationConfiguration.java:36)\n        at de.juplo.plugins.hibernate4.Hbm2DdlMojo.execute(Hbm2DdlMojo.java:679)\n\nWith version 1.3 everything works fine. \n\nCould you guys check it please?"
-  post_url: /hibernate4-maven-plugin-1-0-5-released/
-  post_id: "319"
-- id: "30938"
-  author_name: Klaus Unger
-  author_email: klaus.unger@iq-consultancy.net
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    first things first ... thanks for the great plugin!!!
-
-    my colleague and myself have come across some minor issues:
-
-    We do have the following snippets
-
-    <code>
-    @ElementCollection
-    @CollectionTable(name = "T2", joinColumns = @JoinColumn(name = "T1_ID", foreignKey = @ForeignKey(name = "FK_T2_TO_T1")))
-    </code>
-
-    It seems, that the ForeignKey annotation embedded in the CollectionTable has no effect.
-
-    <code>
-    @Table(name = "T1", uniqueConstraints=@UniqueConstraint(name="U_REFERENZ", columnNames="REFERENCE"))
-    </code>
-
-    It also seems, that the uniqueConstraint annotation embedded in the table has no effect.
-
-    Are me missing some configuration part, is it by intention or have me spotted a minor glitch?
-    Thanks for a short reply.
-
-    Again ... thanks for the great plugin
-    cheers
-    Klaus
-  post_url: /hibernate4-maven-plugin-1-0-5-released/
-  post_id: "319"
-- id: "40075"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "39525"
-  content: |-
-    Hi  yuxh,
-
-    this does not look like a bug in the plugin.
-
-    It looks like there is some invalid data in the table, that stops the drop.
-
-    I would drop the table manually and give it a retry...
-  post_url: /hibernate4-maven-plugin-1-0-5-released/
-  post_id: "319"
-- id: "40080"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "30938"
-  content: |-
-    At the first glance, that does not look like a bug in the plugin.
-
-    Under the hood, the plugin is using the official SchemaExport-Tool from Hibernate (see: <a href="https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/toolsetguide.html#toolsetguide-s1-3" title="See the hibernate documentation" rel="nofollow">the offical Toolset-Guide</a>).
-
-    Try running the export manualy with that tool.
-    If the error persists, it is a hibernate-bug and you should ask that guys.
-    If not, please contact me again!
-  post_url: /hibernate4-maven-plugin-1-0-5-released/
-  post_id: "319"
-- id: "44012"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "43007"
-  content: If you can provide me with some example-code, that generates the error, I would look into it.
-  post_url: /hibernate4-maven-plugin-1-0-5-released/
-  post_id: "319"
-- id: "58167"
-  author_name: bijibuji
-  author_email: bijibuji@yahoo.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: What is the exact use case of "Page" &amp; "Main" titles according to a single blog page. Is "Page" the website name or the single blog title? What about "Main"? Also how do you deal with starting the page with an  heading as it is not valid (using W3C validator tells you that you have a missing  in your heading-level outline)
-  post_url: /a-perfect-outline/
-  post_id: "357"
-- id: "61251"
-  author_name: Izhari Ishak Aksa
-  author_email: izharishaksa@gmail.com
-  author_url: http://www.izharishaksa.com
-  published: null
-  parent_id: "0"
-  content: I think main navigation should be right below the page. Furthermore each section could also have their own navigation. For example in a product page there could navigation for specs, reviews, description etc.
-  post_url: /a-perfect-outline/
-  post_id: "357"
-- id: "50844"
-  author_name: Jérôme LELEU
-  author_email: leleuj@gmail.com
-  author_url: http://www.pac4j.org
-  published: null
-  parent_id: "0"
-  content: |-
-    Thanks for the tutorial.
-
-    spring-security-pac4j v1.3 is now based on Spring Security v4.
-  post_url: /configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login/
-  post_id: "462"
-- id: "53056"
-  author_name: Pascal
-  author_email: pnueesch@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    And how can I trigger the facebookEntryPoint with a "Facebook Login"-button on the login form page?
-
-    Thanks
-  post_url: /configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login/
-  post_id: "462"
-- id: "53556"
-  author_name: Zamir
-  author_email: zgarcia83@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    I've followed all instructions, but it doesn't intercept any URL. It doesn't show any error.
-
-    Can anyone help me?
-  post_url: /configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login/
-  post_id: "462"
-- id: "49153"
-  author_name: Integrating A Maven-Backend- With A Nodjs/Grunt-Fronted-Project | juplo
-  author_email: ""
-  author_url: https://juplo.de/integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project/
-  published: null
-  parent_id: "0"
-  content: '[&#8230;] I already wrote in a previous article, frontend-development is mostly done with Nodjs and Grunt nowadays. As I am planing to base the [&#8230;]'
-  post_url: /serve-static-html-with-nodjs-and-grunt/
-  post_id: "500"
-- id: "49119"
-  author_name: Bypassing the Same-Origin-Policy For Local Files During Development | juplo
-  author_email: ""
-  author_url: https://juplo.de/bypassing-the-same-origin-policiy-for-loal-files-during-development/
-  published: null
-  parent_id: "0"
-  content: '[&#8230;] content with a local webserver, so that you can access it through HTTP, like in production. You can read how to extend the example-project mentioned above to achieve that goal in a follow up [&#8230;]'
-  post_url: /serve-static-html-with-nodjs-and-grunt/
-  post_id: "500"
-- id: "52513"
-  author_name: Jifar Mekonnen
-  author_email: jifarh2@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: "I fixed my pom as you said and it worked! \n\nThank you!"
-  post_url: /java-lang-exception-method-xzy-should-have-no-parameters/
-  post_id: "535"
-- id: "53717"
-  author_name: dz
-  author_email: dz@email.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: It works! Thank you!
-  post_url: /java-lang-exception-method-xzy-should-have-no-parameters/
-  post_id: "535"
-- id: "52975"
-  author_name: Benny
-  author_email: bacta@gmx.net
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    I understand your point, if you deliver the app as war file, which will deployed inside a tomcat webapp dir.
-    But what if you want to deliver just a single, runnable jar?
-    And <code>spring.thymeleaf.cache = false</code> did quite a good job while developing. (using spring boot 1.3.2)
-
-    kind regards
-  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
-  post_id: "543"
-- id: "52855"
-  author_name: Jan
-  author_email: jan@will-not-give-it-away.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    Thank you very much!
-    Your advice helped me a lot with Netbeans 8.0.2. :-)
-  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
-  post_id: "543"
-- id: "52980"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "52975"
-  content: |-
-    I am not sure, what you are objecting against.
-    Does it work with spring boot 1.3.2 without moving the templates? Or do you say, that you do not need your templates to be accessible, when you deliver your app?
-  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
-  post_id: "543"
-- id: "53154"
-  author_name: Kai Tønder
-  author_email: kai@getshop.com
-  author_url: http://www.getshop.com
-  published: null
-  parent_id: "0"
-  content: |-
-    Thank you, what I did to solve this issue is to simply set this two lines in the beginning of the main function. (using netbeans too )
-
-               System.setProperty("spring.template.cache", "false");
-               System.setProperty("spring.thymeleaf.cache", "false");
-  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
-  post_id: "543"
-- id: "55310"
-  author_name: Pablo Caviglia
-  author_email: pablo.caviglia@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    excellent!
-    after doing every other way to fix it, your way worked at once... sincerely i dont understand why there are so much invalid ways to do it, and yours that's the simplest one no one mentions it...
-
-    Thanks a lot my friend!
-  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
-  post_id: "543"
-- id: "53789"
-  author_name: Hodglem
-  author_email: cory.hartford.1974@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Thank you! Been banging my head on this for hours.
-  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
-  post_id: "543"
-- id: "60433"
-  author_name: "no"
-  author_email: no@name.com
-  author_url: http://reergymerej.github.io/
-  published: null
-  parent_id: "0"
-  content: December 2019, still works.
-  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
-  post_id: "543"
-- id: "61382"
-  author_name: Konstantin
-  author_email: konstantinProskurnya@ya.ru
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Best solution ever!
-  post_url: /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/
-  post_id: "543"
-- id: "52940"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "52912"
-  content: |-
-    Hi Beppe,
-
-    thanks a lot for your comment.
-
-    I added the missing <code>git</code>.
-
-    The issues you noted in 2 and 3, arise from the fact, that I am messing around with the history of the repository a bit.
-
-    I decided, that it is more important, that each commit contains exactly the changes of the next step and that there are no obfuscating commits that only contain small bug-fixes of earlier commits.
-
-    This way, one can read the diffs and clearly see, what was changed and why.
-
-    On the downside, nasty things may happen, if somebody checks out the project, while I am in the middle of some cleaning up.
-
-    If you clone a fresh copy now, everything should work as expected and as described in the blog-article.
-  post_url: /develop-a-facebook-app-with-spring-social-part-00/
-  post_id: "558"
-- id: "53085"
-  author_name: Maxi Wu
-  author_email: maxi326@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    just started to try SpringSocial a few days ago. Their documents does not match their sample project. And there is so much stuff unrelated to the simplest basic thing which is really needed to connect with facebook.
-    I really like your post which remove unnecessary bits. thank you
-  post_url: /develop-a-facebook-app-with-spring-social-part-00/
-  post_id: "558"
-- id: "52912"
-  author_name: Beppe Serra
-  author_email: beppe.serra@yahoo.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: "Hello, here are the few problems I had and managed to fix.\n1) \"checkout part-00\" is actually \"git checkout part-00\"\n2) \"git checkout part-00\" fails with \"error: pathspec 'part-00' did not match any file(s) known to git.\" \"git tag\" shows that the only available tag is \"part-01\", so I proceeded with that one.\n3) in the mvn ... run command, change:\n-Dfacebook.app.id= and \n-Dfacebook.app.secret=\n to:\n-Dfacebook.client.id= and \n-Dfacebook.client.secret=\nto match the application.properties file contents.\n\nCheers,\n\n- Beppe -"
-  post_url: /develop-a-facebook-app-with-spring-social-part-00/
-  post_id: "558"
-- id: "61730"
-  author_name: Simon
-  author_email: simon.kaufmann@adesso.ch
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    Hey thanks for the update to hibernate 5.
-    We are just migrating from your older version and we have a question:
-    Is there a way to add support for @NotNull annotations (javax.validation.constraints)?
-
-    In the previous version (for hibernate 4) the plugin could handle those @NotNull annotated fields and generated a Not Null constraint.
-    But now with the current version all fields which only had @NotNull will rest nullable in the generated script until you add @Column(nullable = false).
-  post_url: /hibernate-maven-plugin-2-0-0-released/
-  post_id: "721"
-- id: "57054"
-  author_name: yashpal gandhi
-  author_email: yashpal.gandhi@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Plugin doesn't support hibernate-core v5.2.5 and above. Please update.
-  post_url: /xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace/
-  post_id: "762"
-- id: "59920"
-  author_name: Moni
-  author_email: stonebridge8@yahoo.it
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    Zookeeper with SSL works fine for me, but on kafka I get:
-    java.lang.ClassNotFoundException: org.apache.zookeeper.ClientCnxnSocketNetty
-
-    I'm running kafka_2.11-1.0.0, is there particular minimum kafka version to have the ssl support, or is there a way to have an old kafka connect to zookeeper in ssl ( maybe touching the classpath) ?
-  post_url: /encrypt-communication-between-kafka-and-zookeeper-with-tls/
-  post_id: "881"
-- id: "62211"
-  author_name: Peter
-  author_email: vtdang_1@yahoo.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    Hi, I ran your README.sh and after successful installation of certs and all the kafka configs completed, getting this message..
-    "nc: getaddrinfo for host "kafka-1" port 9193: Temporary failure in name resolution
-    Waiting for kafka-1" and nothing else happening.  Am I missing something here?
-    thanks,
-  post_url: /encrypt-communication-between-kafka-and-zookeeper-with-tls/
-  post_id: "881"
-- id: "60168"
-  author_name: Gan
-  author_email: gangadhar.balikai@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: "I am running kafka_2.12-2.3.0 and zookeeper-3.5.5. Configuration are exactly set to what you have described above. \n\nBut broker fails to init Zookeeper connection and fails with \njava.io.IOException: Couldn't instantiate org.apache.zookeeper.ClientCnxnSocketNetty\n        at org.apache.zookeeper.ZooKeeper.getClientCnxnSocket(ZooKeeper.java:1851)\n        at org.apache.zookeeper.ZooKeeper.(ZooKeeper.java:453)\n        at org.apache.zookeeper.ZooKeeper.(ZooKeeper.java:384)\n        at kafka.zookeeper.ZooKeeperClient.(ZooKeeperClient.scala:103)\n        at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1826)\n        at kafka.server.KafkaServer.createZkClient$1(KafkaServer.scala:364)\n        at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:387)\n        at kafka.server.KafkaServer.startup(KafkaServer.scala:207)\n        at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38)\n        at kafka.Kafka$.main(Kafka.scala:84)\n        at kafka.Kafka.main(Kafka.scala)\nCaused by: java.lang.NoSuchMethodException: org.apache.zookeeper.ClientCnxnSocketNetty.()\n        at java.lang.Class.getConstructor0(Class.java:3082)\n        at java.lang.Class.getDeclaredConstructor(Class.java:2178)\n        at org.apache.zookeeper.ZooKeeper.getClientCnxnSocket(ZooKeeper.java:1848)\n        ... 10 more\n\nHave you seen this issue before?"
-  post_url: /encrypt-communication-between-kafka-and-zookeeper-with-tls/
-  post_id: "881"
-- id: "60170"
-  author_name: Kai Moritz
-  author_email: kai@juplo.de
-  author_url: http://juplo.de
-  published: null
-  parent_id: "60168"
-  content: |-
-    No, haven't seen this before.
-    Sorry, that I cannot supply any helping information.
-  post_url: /encrypt-communication-between-kafka-and-zookeeper-with-tls/
-  post_id: "881"
-- id: "62518"
-  author_name: RB
-  author_email: ritesh.biltheria@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    Am getting below fatal error, any idea?
-
-    KeeperErrorCode = NoAuth for /brokers/ids
-  post_url: /encrypt-communication-between-kafka-and-zookeeper-with-tls/
-  post_id: "881"
-- id: "58795"
-  author_name: Encrypt Communication Between Kafka And ZooKeeper With TLS | juplo
-  author_email: ""
-  author_url: https://juplo.de/encrypt-communication-between-kafka-and-zookeeper-with-tls/
-  published: null
-  parent_id: "0"
-  content: '[&#8230;] You can read more about setting up a private CA in this post&#8230; [&#8230;]'
-  post_url: /create-self-signed-multi-domain-san-certificates/
-  post_id: "887"
-- id: "60423"
-  author_name: Cause Chung
-  author_email: cuzfrog@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    when use keytool -genkey
-
-    -keyalg RSA needs to be added
-
-    otherwise a possible cipher suite problem
-  post_url: /create-self-signed-multi-domain-san-certificates/
-  post_id: "887"
-- id: "64232"
-  author_name: Sharofiddin
-  author_email: pardayev.sharofiddin@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Thank you
-  post_url: /actuator-httptrace-does-not-work-with-spring-boot-2-2/
-  post_id: "970"
-- id: "61796"
-  author_name: Amir
-  author_email: amirtc@walla.co.il
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: |-
-    Thank you so much for your article
-    Actuator HTTP Trace Does Not Work With Spring Boot 2.2.x
-    A true life saver!
-  post_url: /actuator-httptrace-does-not-work-with-spring-boot-2-2/
-  post_id: "970"
-- id: "62909"
-  author_name: Vu Chu
-  author_email: anhvutnu@gmail.com
-  author_url: ""
-  published: null
-  parent_id: "0"
-  content: Very nice! Thank you for such informative post. Waiting for your part 3 and 4 of this series.
-  post_url: /how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/
-  post_id: "1037"
diff --git a/generated-2025-11-21-17-29-08/data/library.yaml b/generated-2025-11-21-17-29-08/data/library.yaml
deleted file mode 100644 (file)
index 7fdb213..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-- path: /wp-uploads/2014/02/hama_00054807_stock_recovery.jpg
-  title: hama_00054807_stock_recovery
-  id: "193"
-  published: 2014-02-16T11:55:44Z
-- path: /wp-uploads/2014/02/jetty.keystore
-  title: jetty.keystore
-  id: "224"
-  published: 2014-02-23T10:34:53Z
-- path: /wp-uploads/2014/02/jetty.xml
-  title: jetty.xml
-  id: "225"
-  published: 2014-02-23T10:35:40Z
-- path: /wp-uploads/2014/02/jetty-http.xml
-  title: jetty-http.xml
-  id: "226"
-  published: 2014-02-23T10:35:40Z
-- path: /wp-uploads/2014/02/jetty-https.xml
-  title: jetty-https.xml
-  id: "227"
-  published: 2014-02-23T10:35:41Z
-- path: /wp-uploads/2014/02/jetty-ssl.xml
-  title: jetty-ssl.xml
-  id: "228"
-  published: 2014-02-23T10:35:41Z
-- path: /wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png
-  title: der-nutzer-ist-nicht-dazu-berechtigt
-  id: "276"
-  published: 2014-03-16T14:17:47Z
-- path: /wp-uploads/2015/05/replace-1.html
-  title: replace-1
-  id: "342"
-  published: 2015-05-08T12:06:56Z
-- path: /wp-uploads/2015/05/replace-2.html
-  title: replace-2
-  id: "343"
-  published: 2015-05-08T12:06:58Z
-- path: /wp-uploads/2015/06/example-06.html
-  title: example-06
-  id: "421"
-  published: 2015-06-23T18:33:56Z
-- path: /wp-uploads/2015/06/example-07.html
-  title: example-07
-  id: "422"
-  published: 2015-06-23T18:33:57Z
-- path: /wp-uploads/2015/06/example-08.html
-  title: example-08
-  id: "423"
-  published: 2015-06-23T18:33:57Z
-- path: /wp-uploads/2015/06/example-09.html
-  title: example-09
-  id: "430"
-  published: 2015-06-23T19:46:25Z
-- path: /wp-uploads/2015/06/example-01.html
-  title: example-01
-  id: "433"
-  published: 2015-06-23T20:18:20Z
-- path: /wp-uploads/2015/06/example-02.html
-  title: example-02
-  id: "434"
-  published: 2015-06-23T20:18:21Z
-- path: /wp-uploads/2015/06/example-03.html
-  title: example-03
-  id: "435"
-  published: 2015-06-23T20:18:21Z
-- path: /wp-uploads/2015/06/example-10.html
-  title: example-10
-  id: "440"
-  published: 2015-06-23T20:49:51Z
-- path: /wp-uploads/2015/06/example-04.html
-  title: example-04
-  id: "442"
-  published: 2015-06-23T20:58:53Z
-- path: /wp-uploads/2015/06/example-05.html
-  title: example-05
-  id: "444"
-  published: 2015-06-23T21:03:29Z
-- path: /wp-uploads/2015/06/example-11.html
-  title: example-11
-  id: "450"
-  published: 2015-06-23T21:23:01Z
-- path: /wp-uploads/2015/06/example-12.html
-  title: example-12
-  id: "454"
-  published: 2015-06-23T22:18:14Z
-- path: /wp-uploads/2015/06/example-13.html
-  title: example-13
-  id: "455"
-  published: 2015-06-23T22:18:14Z
-- path: /wp-uploads/2015/06/example-14.html
-  title: example-14
-  id: "458"
-  published: 2015-06-23T22:40:54Z
-- path: /wp-uploads/2020/03/real-life-meme.png
-  title: real-life-meme
-  id: "1038"
-  published: 2020-03-04T17:42:05Z
-- path: /wp-uploads/2020/03/github-example.jpg
-  title: github-example
-  id: "1105"
-  published: 2020-03-07T13:20:41Z
-- path: /wp-uploads/2021/02/outbox-pattern-sending-order.png
-  title: outbox-pattern--sending-order
-  id: "1212"
-  published: 2021-02-06T17:52:39Z
diff --git a/generated-2025-11-21-17-29-08/hugo.yaml b/generated-2025-11-21-17-29-08/hugo.yaml
deleted file mode 100644 (file)
index 5da12cc..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-baseURL: https://juplo.de
-languageCode: en-US
-title: juplo
-theme: PaperMod
-taxonomies:
-  category: categories
-  tag: tags
-params:
-  description: Java bits from nerds for nerds
-  defaultTheme: auto
-  disableThemeToggle: true
-  showShareButtons: true
-  showReadingTime: true
-  showToc: false
-  showBreadCrumbs: true
-  showCodeCopyButtons: true
-  comments: true
-  hideFooter: true
-  assets:
-    favicon: /favicon.ico
-    disableHLJS: true
-markup:
-  highlight:
-    codeFences: true
-    guessSyntax: true
-    style: monokai
-  goldmark:
-    renderer:
-      unsafe: true
-outputs:
-  home:
-    - HTML
-    - RSS
-    - JSON
-outputFormats:
-  RSS:
-    mediaType: application/rss+xml
-    baseName: feed
-menu:
-  main: []
diff --git a/generated-2025-11-21-17-29-08/layouts/partials/comments.html b/generated-2025-11-21-17-29-08/layouts/partials/comments.html
deleted file mode 100644 (file)
index cca573f..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-
-<!-- fetch /data/comments.yaml -->
-{{ $site_comments := .Site.Data.comments }}
-
-<!-- /data/comments.yaml not found: abort -->
-{{ if not $site_comments }}
-       {{ return "" }}
-{{ end }}
-
-<!-- find all comments whose post_id matches current post/page post_id -->
-{{ with (where .Site.Data.comments "post_id" .Params.post_id ) }}
-  <ul id="comments" style="list-style: none;">
-    <!-- Call the top level of comments (parent_id = 0). Each of them will call their own children (replies) internally -->
-    {{ template "comments" (dict "post_comments" . "site_comments" $site_comments "parent_id" "0" ) }}
-  </ul>
-{{ end }}
-
-{{- define "comments" -}}
-
-  {{ $site_comments := .site_comments }}
-  {{ $query_parent_id := .parent_id }}
-
-  <!-- Note : we iterate over comments using the order in which they appear
-  in /data/comments.yaml. WordPress exports them in increasing order of ID
-  and ID is incremented with time, so this is chronological without having to sort -->
-  {{ range .post_comments }}
-    {{ $author_name := index . "author_name" }}
-    {{ $author_link := index . "author_url" }}
-    {{ $date := index . "published" }}
-    {{ $parent_id := index . "parent_id" }}
-    {{ $id := index . "id" }}
-
-    <!-- Only current-level parent comments. -->
-    {{ if eq $parent_id $query_parent_id }}
-      <li id="comment-{{ $id }}" data-reply-to="comment-{{ $parent_id }}" >
-        <div class="comment-meta">
-          <!-- Optional: get Gravatar profile pic from email -->
-          <img src="https://gravatar.com/avatar/{{ sha256 (index . "author_email") }}" />
-
-          <!-- Optional: keep author URL -->
-          {{ with $author_link }}
-            <a href="{{ . }}" rel="nofollow" target="_blank">{{ $author_name }}</a>
-          {{ else }}
-            {{ $author_name }}
-          {{ end }}
-
-          <time pubdate datetime="{{ $date | time.Format "2006-01-02" }}" title="Publication date" property="created">
-            {{ $date | time.Format ":date_long" }}
-          </time>
-        </div>
-
-        <div class="comment-content">
-          {{ index . "content" | markdownify | safeHTML }}<!-- don't escape HTML if content uses it -->
-        </div>
-
-        <!-- Embed children comments (replies), aka find comments whose parent_id match current id -->
-        {{ with (where $site_comments "parent_id" $id) }}
-          <ul class="children-comments" style="list-style: none;">
-            {{ template "comments" (dict "post_comments" . "site_comments" $site_comments "parent_id" $id ) }}
-          </ul>
-        {{ end }}
-
-      </li>
-    {{ end }}
-  {{ end }}
-{{- end -}}
diff --git a/generated-2025-11-21-17-29-08/layouts/rss.xml b/generated-2025-11-21-17-29-08/layouts/rss.xml
deleted file mode 100644 (file)
index 8d1df27..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-{{- /* Deprecate site.Author.email in favor of site.Params.author.email */}}
-{{- $authorEmail := "" }}
-{{- with site.Params.author }}
-  {{- if reflect.IsMap . }}
-    {{- with .email }}
-      {{- $authorEmail = . }}
-    {{- end }}
-  {{- end }}
-{{- else }}
-  {{- with site.Author.email }}
-    {{- $authorEmail = . }}
-    {{- warnf "The author key in site configuration is deprecated. Use params.author.email instead." }}
-  {{- end }}
-{{- end }}
-
-{{- /* Deprecate site.Author.name in favor of site.Params.author.name */}}
-{{- $authorName := "" }}
-{{- with site.Params.author }}
-  {{- if reflect.IsMap . }}
-    {{- with .name }}
-      {{- $authorName = . }}
-    {{- end }}
-  {{- else }}
-    {{- $authorName  = . }}
-  {{- end }}
-{{- else }}
-  {{- with site.Author.name }}
-    {{- $authorName = . }}
-    {{- warnf "The author key in site configuration is deprecated. Use params.author.name instead." }}
-  {{- end }}
-{{- end }}
-
-{{- $pctx := . }}
-{{- if .IsHome }}{{ $pctx = site }}{{ end }}
-{{- $pages := slice }}
-{{- if or $.IsHome $.IsSection }}
-{{- $pages = $pctx.RegularPages }}
-{{- else }}
-{{- $pages = $pctx.Pages }}
-{{- end }}
-{{- $limit := site.Config.Services.RSS.Limit }}
-{{- if ge $limit 1 }}
-{{- $pages = $pages | first $limit }}
-{{- end }}
-{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
-<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
-  <channel>
-    <title>{{ if eq .Title site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ site.Title }}{{ end }}</title>
-    <link>{{ .Permalink }}</link>
-    <description>Recent content {{ if ne .Title site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ site.Title }}</description>
-    {{- with site.Params.images }}
-    <image>
-      <title>{{ site.Title }}</title>
-      <url>{{ index . 0 | absURL }}</url>
-      <link>{{ index . 0 | absURL }}</link>
-    </image>
-    {{- end }}
-    <generator>Hugo -- {{ hugo.Version }}</generator>
-    <language>{{ site.Language.LanguageCode }}</language>{{ with $authorEmail }}
-    <managingEditor>{{.}}{{ with $authorName }} ({{ . }}){{ end }}</managingEditor>{{ end }}{{ with $authorEmail }}
-    <webMaster>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</webMaster>{{ end }}{{ with site.Copyright }}
-    <copyright>{{ . | markdownify | plainify | strings.TrimPrefix "© " }}</copyright>{{ end }}{{ if not .Date.IsZero }}
-    <lastBuildDate>{{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
-    {{- with .OutputFormats.Get "RSS" }}
-    {{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
-    {{- end }}
-    {{- range $pages }}
-    {{- if and (ne .Layout `search`) (ne .Layout `archives`) }}
-    <item>
-      <title>{{ .Title }}</title>
-      <link>{{ .Permalink }}</link>
-      <pubDate>{{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
-      {{- with $authorEmail }}<author>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</author>{{ end }}
-      {{ if .Params.GUID }} <guid isPermaLink="false">{{ .Params.guid }}</guid> {{ else }} <guid isPermaLink="false">{{ .Permalink }}</guid> {{ end }}
-      <description>{{ with .Description | html }}{{ . }}{{ else }}{{ .Summary | html }}{{ end -}}</description>
-      {{- if and site.Params.ShowFullTextinRSS .Content }}
-      <content:encoded>{{ (printf "<![CDATA[%s]]>" .Content) | safeHTML }}</content:encoded>
-      {{- end }}
-    </item>
-    {{- end }}
-    {{- end }}
-  </channel>
-</rss>
diff --git a/generated-2025-11-21-17-29-08/layouts/shortcodes/audio.html b/generated-2025-11-21-17-29-08/layouts/shortcodes/audio.html
deleted file mode 100644 (file)
index 90cd060..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-
-<audio controls preload="metadata">
-  <source src="{{ .Get "src" }}" type="audio/{{ replace (path.Ext (.Get "src")) "." ""}}">
-  Your browser does not support the audio element.
-</audio>
diff --git a/generated-2025-11-21-17-29-08/layouts/shortcodes/catlist.html b/generated-2025-11-21-17-29-08/layouts/shortcodes/catlist.html
deleted file mode 100644 (file)
index 90c5da8..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-{{ $category := .Get "category" }}
-{{ $catLink := .Get "catlink" | default true }}
-{{ $count := .Get "count" | default 5 }}
-
-{{ $p := site.AllPages }}
-{{ $p = where $p "Params.category" "intersect" (slice $category) }}
-
-{{ $categoryTitle := title $category }}
-{{ $categoryTitle = strings.Replace $categoryTitle "-" " " }}
-
-<h3>
-  {{ if $catLink }}
-    <a href="/category/{{ urlquery $category }}"> {{$categoryTitle }} </a>
-  {{ else }}
-    {{ $categoryTitle }}
-  {{ end }}
-
-</h3>
-<ul>
-  {{ range first $count $p}}
-      <li><a href="{{ .RelPermalink }}">{{ .Title }}</a>
-      </li>
-  {{ end }}
-</ul>
diff --git a/generated-2025-11-21-17-29-08/layouts/shortcodes/gallery.html b/generated-2025-11-21-17-29-08/layouts/shortcodes/gallery.html
deleted file mode 100644 (file)
index 69be59a..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-
-{{ $p := .Page }}
-<div class="gallery gallery-cols-{{ .Get "cols" | default 1 }}">
-{{- print .Inner | $p.RenderString  -}}
-</div>
diff --git a/generated-2025-11-21-17-29-08/layouts/shortcodes/googlemaps.html b/generated-2025-11-21-17-29-08/layouts/shortcodes/googlemaps.html
deleted file mode 100644 (file)
index c37c434..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<iframe loading="lazy"
-        src="https://www.google.com/maps/d/embed?mid={{ .Get "src" }}"
-        width="{{ .Get "width" }}"
-        height="{{ .Get "height" }}">
-</iframe>
diff --git a/generated-2025-11-21-17-29-08/layouts/shortcodes/parallaxblur.html b/generated-2025-11-21-17-29-08/layouts/shortcodes/parallaxblur.html
deleted file mode 100644 (file)
index 7f1ef90..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-{{ $imgURL := .Get "src" }}
-{{ $id := substr (md5 .Inner) 0 16 }}
-
-<style>
-#div-{{$id}} {
-    position: relative; /* Allows layering elements */
-    height: auto; /* Adjust height as needed */
-}
-
-#div-{{$id}}:after {
-    content: "";
-    position: absolute; /* Overlays content */
-    top: 0;
-    left: 0;
-    width: 100%;
-    height: 100%;
-    background-image: url("{{ $imgURL }}");
-    background-attachment: fixed;
-    background-size: cover;
-    background-position: center;
-    filter: blur(0px); /* Initial blur */
-    transition: filter 0.5s ease; /* Smooth transition */
-}
-
-#div-{{$id}} p {
-    text-align: center;
-}
-
-
-#div-{{$id}} a {
-    color: white; /* Adjust text color for contrast */
-    text-align: center;
-    text-shadow: 0 3px 0 gray;
-    position: relative; /* Allows text to stay above blur */
-    z-index: 1; /* Ensures text is on top of blurred background */
-    backdrop-filter: blur(5px); /* Amount of blur on text */
-    padding: 0.5rem;
-}
-
-#div-{{$id}} a:link,a:visited,a:hover,a:active {
-   text-decoration: none !important;
-   text-decoration-style: unset !important;
-   text-decoration-thickness: 0 !important;
-}
-
-/* Increase blur on scroll */
-#div-{{$id}}:after {
-    opacity: 0.8; /* Semi-transparent background */
-}
-
-#div-{{$id}}:hover:after,
-#div-{{$id}}:active:after,
-#div-{{$id}}:focus:after,
-#div-{{$id}}:target:after {
-    filter: blur(10px); /* Amount of blur on interaction */
-}
-</style>
-
-<div class="container" id="div-{{ $id }}">
-    {{ .Inner | markdownify }}
-</div>
diff --git a/generated-2025-11-21-17-29-08/nginx.conf b/generated-2025-11-21-17-29-08/nginx.conf
deleted file mode 100644 (file)
index fddf769..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-user nginx;
-worker_processes auto;
-
-events {
-    worker_connections 1024;
-}
-
-http {
-    include       /etc/nginx/mime.types;
-    default_type  application/octet-stream;
-
-    server {
-        listen 1313;
-        server_name localhost;
-
-        location / {
-            root /home/static;
-            index index.html index.htm;
-            # Add rules like this
-            # if ($query_string = "p=2") {
-            #    return 302 /about/;
-            # }
-            
-            if ($query_string = "p=64") { return 302 /hibernate4-maven-plugin-1-0-1-released/; }
-            if ($query_string = "p=711") { return 302 /release-of-a-maven-plugin-to-maven-central-fails-with-error-unknown-tag-goal/; }
-            if ($query_string = "p=1037") { return 302 /how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/; }
-            if ($query_string = "page_id=271") { return 302 /; }
-            if ($query_string = "p=11") { return 302 /; }
-            if ($query_string = "p=302") { return 302 /aspectj-maven-plugin-can-not-compile-valid-java-7-0-code/; }
-            if ($query_string = "p=306") { return 302 /running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/; }
-            if ($query_string = "p=348") { return 302 /hibernate4-maven-plugin-1-1-0-released/; }
-            if ($query_string = "p=694") { return 302 /develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire/; }
-            if ($query_string = "p=858") { return 302 /; }
-            if ($query_string = "p=1006") { return 302 /; }
-            if ($query_string = "p=140") { return 302 /combining-jetty-maven-plugin-and-wro4j-maven-plugin-for-dynamic-reloading-of-less-resources/; }
-            if ($query_string = "p=209") { return 302 /configure-https-for-jetty-maven-plugin-9-0-x/; }
-            if ($query_string = "p=721") { return 302 /hibernate-maven-plugin-2-0-0-released/; }
-            if ($query_string = "p=1147") { return 302 /deduplicating-partitioned-data-with-kafka-streams/; }
-            if ($query_string = "p=266") { return 302 /; }
-            if ($query_string = "p=530") { return 302 /; }
-            if ($query_string = "p=558") { return 302 /develop-a-facebook-app-with-spring-social-part-00/; }
-            if ($query_string = "p=856") { return 302 /; }
-            if ($query_string = "p=55") { return 302 /hibernate4-maven-plugin-1-0-released/; }
-            if ($query_string = "p=90") { return 302 /bidirectional-association-with-elementcollection/; }
-            if ($query_string = "p=1064") { return 302 /howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker/; }
-            if ($query_string = "p=835") { return 302 /; }
-            if ($query_string = "p=550") { return 302 /; }
-            if ($query_string = "p=1225") { return 302 /; }
-            if ($query_string = "p=288") { return 302 /hibernate4-maven-plugin-1-0-4-released/; }
-            if ($query_string = "p=326") { return 302 /logging-request-and-response-data-from-requets-made-through-resttemplate/; }
-            if ($query_string = "p=500") { return 302 /serve-static-html-with-nodjs-and-grunt/; }
-            if ($query_string = "p=509") { return 302 /integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project/; }
-            if ($query_string = "p=881") { return 302 /encrypt-communication-between-kafka-and-zookeeper-with-tls/; }
-            if ($query_string = "p=1116") { return 302 /; }
-            if ($query_string = "p=114") { return 302 /hibernate4-maven-plugin-1-0-3-released/; }
-            if ($query_string = "p=481") { return 302 /bypassing-the-same-origin-policiy-for-loal-files-during-development/; }
-            if ($query_string = "p=735") { return 302 /problems-deploying-a-spring-boot-app-as-war/; }
-            if ($query_string = "p=1185") { return 302 /how-to-instantiatiate-multiple-beans-dinamically-in-spring-boot-based-on-configuration-properties/; }
-            if ($query_string = "p=203") { return 302 /; }
-            if ($query_string = "p=1011") { return 302 /; }
-            if ($query_string = "p=357") { return 302 /a-perfect-outline/; }
-            if ($query_string = "p=592") { return 302 /develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works/; }
-            if ($query_string = "p=754") { return 302 /show-spring-boot-auto-configuration-report-when-running-via-mvn-spring-boot-run/; }
-            if ($query_string = "p=831") { return 302 /; }
-            if ($query_string = "p=532") { return 302 /; }
-            if ($query_string = "p=1009") { return 302 /; }
-            if ($query_string = "p=1013") { return 302 /; }
-            if ($query_string = "p=1257") { return 302 /; }
-            if ($query_string = "p=644") { return 302 /develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic/; }
-            if ($query_string = "p=671") { return 302 /develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page/; }
-            if ($query_string = "p=543") { return 302 /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/; }
-            if ($query_string = "p=97") { return 302 /log-out-from-wrong-account-with-maven-appengine-plugin/; }
-            if ($query_string = "p=186") { return 302 /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/; }
-            if ($query_string = "p=275") { return 302 /der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen/; }
-            if ($query_string = "p=579") { return 302 /develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes/; }
-            if ($query_string = "p=613") { return 302 /develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source/; }
-            if ($query_string = "p=1019") { return 302 /compare-two-files-in-different-branches-with-git/; }
-            if ($query_string = "p=1025") { return 302 /cat-any-file-in-any-commit-with-git/; }
-            if ($query_string = "p=1130") { return 302 /using-jackson-without-annotations-to-quickly-add-logging-of-object-graphs-as-json/; }
-            if ($query_string = "p=283") { return 302 /; }
-            if ($query_string = "p=255") { return 302 /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/; }
-            if ($query_string = "p=970") { return 302 /actuator-httptrace-does-not-work-with-spring-boot-2-2/; }
-            if ($query_string = "p=291") { return 302 /changes-in-log4j-properties-are-ignored-when-running-sl4fj-under-tomcat/; }
-            if ($query_string = "p=339") { return 302 /replace-text-by-graphic-without-extra-markup/; }
-            if ($query_string = "p=462") { return 302 /configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login/; }
-            if ($query_string = "p=626") { return 302 /develop-a-facebook-app-with-spring-social-part-04-signing-in-users/; }
-            if ($query_string = "p=762") { return 302 /xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace/; }
-            if ($query_string = "p=887") { return 302 /create-self-signed-multi-domain-san-certificates/; }
-            if ($query_string = "p=1133") { return 302 /testing-exception-handling-in-spring-mvc/; }
-            if ($query_string = "p=1201") { return 302 /implementing-the-outbox-pattern-with-kafka-part-0-the-example/; }
-            if ($query_string = "p=554") { return 302 /how-to-keep-the-time-zone-when-deserializing-a-zoneddatetime-with-jackson/; }
-            if ($query_string = "p=535") { return 302 /java-lang-exception-method-xzy-should-have-no-parameters/; }
-            if ($query_string = "p=1209") { return 302 /implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table/; }
-            if ($query_string = "page_id=111") { return 302 /projects/; }
-            if ($query_string = "p=75") { return 302 /hibernate4-maven-plugin-1-0-2-release/; }
-            if ($query_string = "p=971") { return 302 /; }
-            if ($query_string = "p=34") { return 302 /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/; }
-            if ($query_string = "p=1034") { return 302 /; }
-            if ($query_string = "p=319") { return 302 /hibernate4-maven-plugin-1-0-5-released/; }
-            if ($query_string = "page_id=108") { return 302 /blog/; }
-            if ($query_string = "p=1004") { return 302 /; }
-        }
-    }
-}
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/hama_00054807_stock_recovery.jpg b/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/hama_00054807_stock_recovery.jpg
deleted file mode 100644 (file)
index 20db95c..0000000
Binary files a/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/hama_00054807_stock_recovery.jpg and /dev/null differ
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty-http.xml b/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty-http.xml
deleted file mode 100644 (file)
index 7b742cc..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-<!-- ============================================================= -->
-<!-- Configure the Jetty Server instance with an ID "Server"       -->
-<!-- by adding a HTTP connector.                                   -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-  <!-- =========================================================== -->
-  <!-- Add a HTTP Connector.                                       -->
-  <!-- Configure an o.e.j.server.ServerConnector with a single     -->
-  <!-- HttpConnectionFactory instance using the common httpConfig  -->
-  <!-- instance defined in jetty.xml                               -->
-  <!--                                                             -->
-  <!-- Consult the javadoc of o.e.j.server.ServerConnector and     -->
-  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
-  <!-- that may be set here.                                       -->
-  <!-- =========================================================== -->
-  <Call name="addConnector">
-    <Arg>
-      <New class="org.eclipse.jetty.server.ServerConnector">
-        <Arg name="server"><Ref refid="Server" /></Arg>
-        <Arg name="factories">
-          <Array type="org.eclipse.jetty.server.ConnectionFactory">
-            <Item>
-              <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                <Arg name="config"><Ref refid="httpConfig" /></Arg>
-              </New>
-            </Item>
-          </Array>
-        </Arg>
-        <Set name="host"><Property name="jetty.host" /></Set>
-        <Set name="port"><Property name="jetty.port" default="8080" /></Set>
-        <Set name="idleTimeout"><Property name="http.timeout" default="30000"/></Set>
-      </New>
-    </Arg>
-  </Call>
-</Configure>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty-https.xml b/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty-https.xml
deleted file mode 100644 (file)
index 9d11217..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-<!-- ============================================================= -->
-<!-- Configure a HTTPS connector.                                  -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- and jetty-ssl.xml.                                            -->
-<!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-  <!-- =========================================================== -->
-  <!-- Add a HTTPS Connector.                                      -->
-  <!-- Configure an o.e.j.server.ServerConnector with connection   -->
-  <!-- factories for TLS (aka SSL) and HTTP to provide HTTPS.      -->
-  <!-- All accepted TLS connections are wired to a HTTP connection.-->
-  <!--                                                             -->
-  <!-- Consult the javadoc of o.e.j.server.ServerConnector,        -->
-  <!-- o.e.j.server.SslConnectionFactory and                       -->
-  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
-  <!-- that may be set here.                                       -->
-  <!-- =========================================================== -->
-  <Call id="httpsConnector" name="addConnector">
-    <Arg>
-      <New class="org.eclipse.jetty.server.ServerConnector">
-        <Arg name="server"><Ref refid="Server" /></Arg>
-          <Arg name="factories">
-            <Array type="org.eclipse.jetty.server.ConnectionFactory">
-              <Item>
-                <New class="org.eclipse.jetty.server.SslConnectionFactory">
-                  <Arg name="next">http/1.1</Arg>
-                  <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg>
-                </New>
-              </Item>
-              <Item>
-                <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                  <Arg name="config"><Ref refid="sslHttpConfig"/></Arg>
-                </New>
-              </Item>
-            </Array>
-          </Arg>
-          <Set name="host"><Property name="jetty.host" /></Set>
-          <Set name="port"><Property name="https.port" default="8443" /></Set>
-          <Set name="idleTimeout"><Property name="https.timeout" default="30000"/></Set>
-        </New>
-    </Arg>
-  </Call>
-</Configure>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty-ssl.xml b/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty-ssl.xml
deleted file mode 100644 (file)
index 760b9ba..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-<!-- ============================================================= -->
-<!-- Configure a TLS (SSL) Context Factory                         -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- and either jetty-https.xml or jetty-spdy.xml (but not both)   -->
-<!-- ============================================================= -->
-<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
-  <Set name="KeyStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.keystore" default="src/test/resources/jetty.keystore"/></Set>
-  <Set name="KeyStorePassword"><Property name="jetty.keystore.password" default="secret"/></Set>
-  <Set name="KeyManagerPassword"><Property name="jetty.keymanager.password" default="secret"/></Set>
-  <Set name="TrustStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.truststore" default="src/test/resources/jetty.keystore"/></Set>
-  <Set name="TrustStorePassword"><Property name="jetty.truststore.password" default="secret"/></Set>
-  <Set name="EndpointIdentificationAlgorithm"></Set>
-  <Set name="ExcludeCipherSuites">
-    <Array type="String">
-      <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
-      <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
-      <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
-      <Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
-      <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
-      <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
-      <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
-    </Array>
-  </Set>
-  <!-- =========================================================== -->
-  <!-- Create a TLS specific HttpConfiguration based on the        -->
-  <!-- common HttpConfiguration defined in jetty.xml               -->
-  <!-- Add a SecureRequestCustomizer to extract certificate and    -->
-  <!-- session information                                         -->
-  <!-- =========================================================== -->
-  <New id="sslHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-    <Arg><Ref refid="httpConfig"/></Arg>
-    <Call name="addCustomizer">
-      <Arg><New class="org.eclipse.jetty.server.SecureRequestCustomizer"/></Arg>
-    </Call>
-  </New>
-</Configure>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty.keystore b/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty.keystore
deleted file mode 100644 (file)
index 75b82ef..0000000
Binary files a/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty.keystore and /dev/null differ
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty.xml b/generated-2025-11-21-17-29-08/static/wp-uploads/2014/02/jetty.xml
deleted file mode 100644 (file)
index cd8962d..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
-<!-- ============================================================= -->
-<!-- Configure the Http Configuration                              -->
-<!-- ============================================================= -->
-<Configure id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-  <Set name="secureScheme">https</Set>
-  <Set name="securePort"><Property name="jetty.secure.port" default="8443" /></Set>
-  <Set name="outputBufferSize">32768</Set>
-  <Set name="requestHeaderSize">8192</Set>
-  <Set name="responseHeaderSize">8192</Set>
-  <Set name="sendServerVersion">true</Set>
-  <Set name="sendDateHeader">false</Set>
-  <Set name="headerCacheSize">512</Set>
-  <!-- Uncomment to enable handling of X-Forwarded- style headers
-  <Call name="addCustomizer">
-    <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
-  </Call>
-  -->
-</Configure>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png b/generated-2025-11-21-17-29-08/static/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png
deleted file mode 100644 (file)
index b466500..0000000
Binary files a/generated-2025-11-21-17-29-08/static/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png and /dev/null differ
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/05/replace-1.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/05/replace-1.html
deleted file mode 100644 (file)
index d55a96c..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>Example how to replace text by a graphic</title>
-
-  <style type="text/css">
-    h1
-    {
-      text-indent: -99em;
-      line-height: 0;
-    }
-    h1:after
-    {
-      display: block;
-      text-indent: 0;
-      content: "blub";
-    }
-  </style>
-</head>
-
-  <body>
-    <h1>Bla</h1>
-  </body>
-
-</html>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/05/replace-2.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/05/replace-2.html
deleted file mode 100644 (file)
index fafe0fd..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-
-<head>
-
-  <meta charset="utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge">
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-
-  <title>Example how to replace text by a graphic</title>
-
-  <style type="text/css">
-    h1
-    {
-      text-indent: -99em;
-      line-height: 0;
-    }
-    h1:after
-    {
-      display: block;
-      text-indent: 0;
-      content: url("data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMzAuNiIgaGVpZ2h0PSI3MC42IiB2ZXJzaW9uPSIxLjEiPjxzdHlsZT4uczB7ZmlsbDpub25lO308L3N0eWxlPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC05NS4wNDkyMTUsLTM3OS45MDg3OSkiPjx0ZXh0IHhtbDpzcGFjZT0icHJlc2VydmUiIHg9IjMwNC4xIiB5PSI1OTguOCIgc3R5bGU9ImZpbGw6IzAwMDtmb250LWZhbWlseTpTYW5zO2ZvbnQtc2l6ZTo0MDtsZXR0ZXItc3BhY2luZzowO2xpbmUtaGVpZ2h0OjEyNTt3b3JkLXNwYWNpbmc6MCI+PHRzcGFuIHg9IjMwNC4xIiB5PSI1OTguOCIvPjwvdGV4dD48cGF0aCBkPSJtOTUgMzc5LjljMCAyNS41IDAgNDggMCA3MC42IDQ1LjkgMCA5MC4xIDAgMTMwLjYgMCAwLTIxLjggMC00My41IDAtNjUuM2wwLTUuM2MtNDQuOSAwLTg5IDAtMTMwLjYgMHptMTguMiAxMC42IDM0LjMgMC0xNy4yIDE3LjJ6bTUyLjUgMCA0OS40IDAgMCA0OS40LTQ5LjQgMHptMjQuNyA2Yy0xMC4zIDAtMTguNyA4LjQtMTguNyAxOC43IDAgMTAuMyA4LjQgMTguNyAxOC43IDE4LjcgMTAuMyAwIDE4LjctOC40IDE4LjctMTguNyAwLTEwLjMtOC40LTE4LjctMTguNy0xOC43em0tODQuNyAxLjVjOC4yIDguMiAxNi41IDE2LjUgMjQuNyAyNC43IDguMi04LjIgMTYuNS0xNi41IDI0LjctMjQuN2wwIDQxLjktNDkuNCAwem04NC43IDkuMWM0LjUgMCA4LjEgMy42IDguMSA4LjEgMCA0LjUtMy41IDguMS04LjEgOC4xLTQuNSAwLTguMS0zLjUtOC4xLTguMSAwLTQuNSAzLjUtOC4xIDguMS04LjF6IiBzdHlsZT0iLWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zO2Jhc2VsaW5lLXNoaWZ0OmJhc2VsaW5lO2Jsb2NrLXByb2dyZXNzaW9uOnRiO2RpcmVjdGlvbjpsdHI7ZmlsbDojMDAwO2ZvbnQtZmFtaWx5OlNhbnM7Zm9udC1zaXplOm1lZGl1bTtsZXR0ZXItc3BhY2luZzpub3JtYWw7bGluZS1oZWlnaHQ6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7dGV4dC1hbmNob3I6c3RhcnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC1pbmRlbnQ6MDt0ZXh0LXRyYW5zZm9ybTpub25lO3dvcmQtc3BhY2luZzpub3JtYWw7d3JpdGluZy1tb2RlOmxyLXRiIi8+PHJlY3Qgd2lkdGg9IjEzMC42IiBoZWlnaHQ9IjcwLjYiIHg9Ijk1IiB5PSIzNzkuOSIgZmlsbD0ibm9uZSIvPjxyZWN0IHdpZHRoPSI1LjciIGhlaWdodD0iNzcuNSIgeD0iMTYwIiB5PSIzNjIuNCIgZmlsbD0ibm9uZSIvPjxyZWN0IHdpZHRoPSI2NS43IiBoZWlnaHQ9IjE3LjUiIHg9IjE2MCIgeT0iMzYyLjQiIGZpbGw9Im5vbmUiLz48L2c+PC9zdmc+");
-    }
-  </style>
-</head>
-
-  <body>
-    <h1>mo</h1>
-  </body>
-
-</html>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-01.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-01.html
deleted file mode 100644 (file)
index 9a4e40c..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<title>Example 01</title>
-<header>
-  <h2>Header</h2>
-  <nav>Navigation</nav>
-</header>
-<main>
-  <h1>Main</h1>
-  <section>
-    <h2>Section I</h2>
-  </section>
-  <section>
-    <h2>Section II</h2>
-    <section>
-      <h3>Subsection a</h3>
-    </section>
-    <section>
-      <h3>Subsection b</h3>
-    </section>
-  </section>
-  <section>
-    <h2>Section III</h2>
-    <section>
-      <h3>Subsection a</h3>
-    </section>
-  </section>
-</main>
-<aside>
-  <h1>Aside</h1>
-</aside>
-<footer>
-  <h2>Footer</h2>
-</footer>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-02.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-02.html
deleted file mode 100644 (file)
index b403e3f..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<title>Example 02</title>
-<header>
-  <h2>Header</h2>
-  <nav>
-    <header><h3>Navigation</h3></header>
-  </nav>
-</header>
-<main>
-  <header><h1>Main</h1></header>
-  <section>
-    <header><h2>Section I</h2></header>
-  </section>
-  <section>
-    <header><h2>Section II</h2></header>
-    <section>
-      <header><h3>Subsection a</h3></header>
-    </section>
-    <section>
-      <header><h3>Subsection b</h3></header>
-    </section>
-  </section>
-  <section>
-    <header><h2>Section III</h2></header>
-    <section>
-      <header><h3>Subsection a</h3></header>
-    </section>
-  </section>
-</main>
-<aside>
-  <header><h1>Aside</h1></header>
-</aside>
-<footer>
-  <header><h2>Footer</h2></header>
-</footer>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-03.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-03.html
deleted file mode 100644 (file)
index c19622b..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<title>Example 03</title>
-<header>
-  <h2>Header</h2>
-  <nav>
-    <header><h3>Navigation</h333></header>
-  </nav>
-</header>
-<article>
-  <header><h1>Article (Main)</h1></header>
-  <section>
-    <header><h2>Section I</h2></header>
-  </section>
-  <section>
-    <header><h2>Section II</h2></header>
-    <section>
-      <header><h3>Subsection a</h3></header>
-    </section>
-    <section>
-      <header><h3>Subsection b</h3></header>
-    </section>
-  </section>
-  <section>
-    <header><h2>Section III</h2></header>
-    <section>
-      <header><h3>Subsection a</h3></header>
-    </section>
-  </section>
-</article>
-<aside>
-  <header><h1>Aside</h1></header>
-</aside>
-<footer>
-  <header><h2>Footer</h2></header>
-</footer>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-04.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-04.html
deleted file mode 100644 (file)
index 2bcc8ca..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<title>Example 04</title>
-<article>
-  Main
-  <section>
-    Section I
-  </section>
-  <section>
-    Section II
-    <section>
-      Subsection a
-    </section>
-    <section>
-      Subsection b
-    </section>
-  </section>
-  <section>
-    Section III
-    <section>
-      Subsection a
-    </section>
-  </section>
-</main>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-05.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-05.html
deleted file mode 100644 (file)
index 03333d8..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-<!DOCTYPE html>
-<title>Example 05</title>
-<h1>Page</h1>
-<article>
-  <h1>Article</h1>
-  <section>
-    <h1>Section I</h1>
-  </section>
-  <section>
-    <h1>Section II</h1>
-    <section>
-      <h1>Subsection a</h1>
-    </section>
-    <section>
-      <h1>Subsection b</h1>
-    </section>
-  </section>
-  <section>
-    <h1>Section III</h1>
-    <section>
-      <h1>Subsection a</h1>
-    </section>
-  </section>
-</article>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-06.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-06.html
deleted file mode 100644 (file)
index 39d2775..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<!DOCTYPE html>
-<title>Example 06</title>
-<header>Page</header>
-<main>Main</main>
-<footer>Footer</footer>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-07.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-07.html
deleted file mode 100644 (file)
index ca18ec1..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-<!DOCTYPE html>
-<title>Example 07</title>
-<header><h2>Page</h2></header>
-<main><h1>Main</h1></main>
-<footer><h3>Footer</h3></footer>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-08.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-08.html
deleted file mode 100644 (file)
index 39bb0a9..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-  <head><title>Example 08</title></head>
-  <body>
-    <div class="header"><h2>Page</h2></div>
-    <div class="main"><h1>Main</h1></div>
-    <div class="footer"><h3>Footer</h3></div>
-  </body>
-</html>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-09.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-09.html
deleted file mode 100644 (file)
index 5b90f0d..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<title>Example 09</title>
-<h4>h4</h4>
-<h2>h2</h2>
-<h4>h4</h4>
-<h3>h3</h3>
-<h2>h2</h2>
-<h1>h1</h1>
-<h2>h2</h2>
-<h3>h3</h3>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-10.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-10.html
deleted file mode 100644 (file)
index 097d9d5..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-<!DOCTYPE html>
-<title>Example 10</title>
-<header>
-  <section>
-    <h2>Header</h2>
-  </section>
-</header>
-<main>
-  <article>
-    <h1>Main</h1>
-    <section>
-      <h2>Section I</h2>
-    </section>
-    <section>
-      <h2>Section II</h2>
-      <section>
-        <h3>Subsection a</h3>
-      </section>
-      <section>
-        <h3>Subsection b</h3>
-      </section>
-    </section>
-    <section>
-      <h2>Section III</h2>
-      <section>
-        <h3>Subsection a</h3>
-      </section>
-    </section>
-  </article>
-</main>
-<footer>
-  <section>
-    <h3>Footer</h3>
-  </section>
-</footer>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-11.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-11.html
deleted file mode 100644 (file)
index 929d5c0..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<title>Example 11</title>
-<header>
-  <h2>Page</h2>
-  <section>
-    <h3>Header</h3>
-  </section>
-</header>
-<main>
-  <article>
-    <h1>Main</h1>
-    <section>
-      <h2>Section I</h2>
-    </section>
-    <section>
-      <h2>Section II</h2>
-      <section>
-        <h3>Subsection a</h3>
-      </section>
-      <section>
-        <h3>Subsection b</h3>
-      </section>
-    </section>
-    <section>
-      <h2>Section III</h2>
-      <section>
-        <h3>Subsection a</h3>
-      </section>
-    </section>
-  </article>
-</main>
-<footer>
-  <section>
-    <h3>Footer</h3>
-  </section>
-</footer>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-12.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-12.html
deleted file mode 100644 (file)
index 4b1ccd4..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<title>Example 12</title>
-<header>
-  <h1>Page</h1>
-  <nav><h1>Navigation</h1></nav>
-</header>
-<main><h1>Main</h1></main>
-<aside><h1>Aside</h1></aside>
-<footer><h1>Footer</h1></footer>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-13.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-13.html
deleted file mode 100644 (file)
index ac8209e..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-<!DOCTYPE html>
-<title>Example 13</title>
-<header>
-  Page
-  <nav>Navigation</nav>
-</header>
-<main>Main</main>
-<aside>Aside</aside>
-<footer>Footer</footer>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-14.html b/generated-2025-11-21-17-29-08/static/wp-uploads/2015/06/example-14.html
deleted file mode 100644 (file)
index d3c1a28..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<!DOCTYPE html>
-<title>Example 14</title>
-<header>
-  <h2>Page</h2>
-  <section>
-    <h3>Header</h3>
-    <nav><h4>Navigation</h4></nav>
-  </section>
-</header>
-<main>
-  <article>
-    <h1>Main</h1>
-    <section>
-      <h2>Section I</h2>
-    </section>
-    <section>
-      <h2>Section II</h2>
-      <section>
-        <h3>Subsection a</h3>
-      </section>
-      <section>
-        <h3>Subsection b</h3>
-      </section>
-    </section>
-    <section>
-      <h2>Section III</h2>
-      <section>
-        <h3>Subsection a</h3>
-      </section>
-    </section>
-  </article>
-</main>
-<aside><h3>Aside</h3></aside>
-<footer>
-  <section>
-    <h3>Footer</h3>
-  </section>
-</footer>
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2020/03/github-example.jpg b/generated-2025-11-21-17-29-08/static/wp-uploads/2020/03/github-example.jpg
deleted file mode 100644 (file)
index 36ed859..0000000
Binary files a/generated-2025-11-21-17-29-08/static/wp-uploads/2020/03/github-example.jpg and /dev/null differ
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2020/03/real-life-meme.png b/generated-2025-11-21-17-29-08/static/wp-uploads/2020/03/real-life-meme.png
deleted file mode 100644 (file)
index 7bb414d..0000000
Binary files a/generated-2025-11-21-17-29-08/static/wp-uploads/2020/03/real-life-meme.png and /dev/null differ
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/2021/02/outbox-pattern-sending-order.png b/generated-2025-11-21-17-29-08/static/wp-uploads/2021/02/outbox-pattern-sending-order.png
deleted file mode 100644 (file)
index 5e55c73..0000000
Binary files a/generated-2025-11-21-17-29-08/static/wp-uploads/2021/02/outbox-pattern-sending-order.png and /dev/null differ
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/create-ca.sh b/generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/create-ca.sh
deleted file mode 100755 (executable)
index 8f2eaaf..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/bash
-#
-# Example-script to show, how to set up a self-signed CA
-#
-# Usage:
-# ./create-ca.sh PASSWORD VALIDITY
-
-. settings.conf
-
-if [ -z "$1" ]
-then
-  PASSWORD=$DEFAULT_PASSWORD
-else
-  PASSWORD="$1"
-fi
-
-if [ -z "$2" ]
-then
-  VALIDITY=$DEFAULT_VALIDITY
-else
-  VALIDITY="$2"
-fi
-
-if [ -a ca-cert ]
-then
-  echo "The root-certificate for the CA already exists..."
-else
-  echo "Creating a x509-certificate for the CA..."
-  openssl req -new -x509 -subj "/C=$C/ST=$ST/L=$L/O=$O/OU=$OU/CN=Root-CA" -keyout ca-key -out ca-cert -days $VALIDITY -passout pass:$PASSWORD
-fi
-#
-
-if [ -a truststore.p12 ]
-then
-  echo "The keystore truststore.jks already exists!"
-else
-  echo "Importing the root-certificate of the CA into truststore.jks..."
-  keytool -keystore truststore.p12 -storetype pkcs12 -storepass $PASSWORD -alias CARoot -import -file ca-cert -noprompt
-fi
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/gencert.sh b/generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/gencert.sh
deleted file mode 100755 (executable)
index a62a6d9..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/bin/bash
-#
-# Example-script to show, how to create and sign a selfsigned certificate, that
-# contains multiple DNS-entries (SAN-extension)
-#
-# Usage:
-# ./gencert.sh CN [CA_PASSWORD [KEYSTORE_PASSWORD [VALIDITY]]]
-
-
-. settings.conf
-
-if [ -z "$1" ];
-then
-  echo "CN must not be empty!"
-  echo "$0 CN [CA_PASSWORD [KEYSTORE_PASSWORD [VALIDITY]]]"
-  exit;
-fi
-
-if [ -a $1.p12 ];
-then
-  echo "The keystore $1.jks already exists";
-  exit;
-fi
-
-
-if [ -z "$2" ]
-then
-  CA_PASSWORD=$DEFAULT_PASSWORD
-else
-  CA_PASSWORD="$2"
-fi
-
-if [ -z "$3" ]
-then
-  KEYSTORE_PASSWORD=$DEFAULT_PASSWORD
-else
-  KEYSTORE_PASSWORD="$3"
-fi
-
-if [ -z "$4" ]
-then
-  VALIDITY=365
-else
-  VALIDITY="$4"
-fi
-
-
-echo "Creating keystore $1.jks with a certificate and a key-pair for CN $1"
-keytool -keystore $1.p12 -storetype pkcs12 -alias $1 -validity $VALIDITY -genkey -storepass $KEYSTORE_PASSWORD -dname "CN=$1,OU=$OU,O=$O,L=$L,ST=$ST,C=$C"
-
-echo "Creating a Certificate-Signing-Request for the generated certificate"
-keytool -keystore $1.p12 -storetype pkcs12 -alias $1 -certreq -file cert-file -storepass $KEYSTORE_PASSWORD
-
-echo "Signing the Certificate-Signing-Request and adding an additional DNS-entry for localhost"
-openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out $1.pem -days $VALIDITY -CAcreateserial -passin pass:$CA_PASSWORD -extensions SAN -extfile <(printf "\n[SAN]\nsubjectAltName=DNS:$1,DNS:localhost")
-
-echo "Importing the root-certificate for the CA into the keystore $1.jks"
-keytool -keystore $1.p12 -storetype pkcs12 -alias ca-root -import -file ca-cert -storepass $KEYSTORE_PASSWORD -noprompt
-
-echo "Importing the signed certificate for CN $1 into the keystore $1.jks"
-keytool -keystore $1.p12 -storetype pkcs12 -alias $1 -import -file $1.pem -storepass $KEYSTORE_PASSWORD
-
-echo "Removing obsolet files..."
-rm -v cert-file
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/jks.txt b/generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/jks.txt
deleted file mode 100644 (file)
index e6aa425..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-Keystore-Typ: jks
-Keystore-Provider: SUN
-
-Keystore enthält 2 Einträge
-
-Aliasname: ca-root
-Erstellungsdatum: 26.06.2019
-Eintragstyp: trustedCertEntry
-
-Eigentümer: CN=Root-CA, OU=security, O=juplo, L=Juist, ST=Niedersachsen, C=DE
-Aussteller: CN=Root-CA, OU=security, O=juplo, L=Juist, ST=Niedersachsen, C=DE
-Seriennummer: 8c62092a6d59c829
-Gültig von: Wed Jun 26 10:26:50 CEST 2019 bis: Thu Jun 25 10:26:50 CEST 2020
-Zertifikatfingerprints:
-        MD5: EE:55:36:1F:19:7A:01:58:3F:54:C3:8B:BF:D9:3C:36
-        SHA1: 3B:D6:01:F1:A1:9D:B1:6E:CA:4D:E7:FA:A6:C1:A1:3A:D8:CA:FD:0C
-        SHA256: 38:5F:6E:2A:E4:25:8A:54:31:57:91:5C:34:FA:E6:9A:E0:1A:2A:27:8C:D7:E5:B0:FB:8B:D7:1A:F6:79:CC:5E
-Signaturalgorithmusname: SHA256withRSA
-Algorithmus des Public Key von Betreff: 2048-Bit-RSA-Schlüssel
-Version: 3
-
-Erweiterungen: 
-
-#1: ObjectId: 2.5.29.35 Criticality=false
-AuthorityKeyIdentifier [
-KeyIdentifier [
-0000: 9D 29 BD 63 D1 D7 C1 98   26 E4 47 3E 27 6A DE AC  .).c....&.G>'j..
-0010: ED 8A 75 2F                                        ..u/
-]
-]
-
-#2: ObjectId: 2.5.29.19 Criticality=false
-BasicConstraints:[
-  CA:true
-  PathLen:2147483647
-]
-
-#3: ObjectId: 2.5.29.14 Criticality=false
-SubjectKeyIdentifier [
-KeyIdentifier [
-0000: 9D 29 BD 63 D1 D7 C1 98   26 E4 47 3E 27 6A DE AC  .).c....&.G>'j..
-0010: ED 8A 75 2F                                        ..u/
-]
-]
-
-
-
-*******************************************
-*******************************************
-
-
-Aliasname: test
-Erstellungsdatum: 26.06.2019
-Eintragstyp: PrivateKeyEntry
-Zertifikatskettenlänge: 2
-Zertifikat[1]:
-Eigentümer: CN=test, OU=security, O=juplo, L=Juist, ST=Niedersachsen, C=DE
-Aussteller: CN=Root-CA, OU=security, O=juplo, L=Juist, ST=Niedersachsen, C=DE
-Seriennummer: b75834de7e0b9b26
-Gültig von: Wed Jun 26 10:27:23 CEST 2019 bis: Thu Jun 25 10:27:23 CEST 2020
-Zertifikatfingerprints:
-        MD5: 3F:3E:46:A4:45:28:18:3C:E4:C3:11:6B:6A:AC:88:94
-        SHA1: 24:27:02:2F:6A:68:32:EA:5F:9D:53:C5:28:65:F7:FC:6D:5D:BC:B7
-        SHA256: 7C:2B:D4:36:06:0C:69:4E:93:75:0F:F9:9C:D8:9D:DD:02:50:14:72:49:95:E3:AC:4C:B4:7A:E6:CE:9D:05:D5
-Signaturalgorithmusname: SHA256withRSA
-Algorithmus des Public Key von Betreff: 2048-Bit-DSA-Schlüssel
-Version: 3
-
-Erweiterungen: 
-
-#1: ObjectId: 2.5.29.17 Criticality=false
-SubjectAlternativeName [
-  DNSName: test
-  DNSName: localhost
-  IPAddress: 127.0.0.1
-]
-
-Zertifikat[2]:
-Eigentümer: CN=Root-CA, OU=security, O=juplo, L=Juist, ST=Niedersachsen, C=DE
-Aussteller: CN=Root-CA, OU=security, O=juplo, L=Juist, ST=Niedersachsen, C=DE
-Seriennummer: 8c62092a6d59c829
-Gültig von: Wed Jun 26 10:26:50 CEST 2019 bis: Thu Jun 25 10:26:50 CEST 2020
-Zertifikatfingerprints:
-        MD5: EE:55:36:1F:19:7A:01:58:3F:54:C3:8B:BF:D9:3C:36
-        SHA1: 3B:D6:01:F1:A1:9D:B1:6E:CA:4D:E7:FA:A6:C1:A1:3A:D8:CA:FD:0C
-        SHA256: 38:5F:6E:2A:E4:25:8A:54:31:57:91:5C:34:FA:E6:9A:E0:1A:2A:27:8C:D7:E5:B0:FB:8B:D7:1A:F6:79:CC:5E
-Signaturalgorithmusname: SHA256withRSA
-Algorithmus des Public Key von Betreff: 2048-Bit-RSA-Schlüssel
-Version: 3
-
-Erweiterungen: 
-
-#1: ObjectId: 2.5.29.35 Criticality=false
-AuthorityKeyIdentifier [
-KeyIdentifier [
-0000: 9D 29 BD 63 D1 D7 C1 98   26 E4 47 3E 27 6A DE AC  .).c....&.G>'j..
-0010: ED 8A 75 2F                                        ..u/
-]
-]
-
-#2: ObjectId: 2.5.29.19 Criticality=false
-BasicConstraints:[
-  CA:true
-  PathLen:2147483647
-]
-
-#3: ObjectId: 2.5.29.14 Criticality=false
-SubjectKeyIdentifier [
-KeyIdentifier [
-0000: 9D 29 BD 63 D1 D7 C1 98   26 E4 47 3E 27 6A DE AC  .).c....&.G>'j..
-0010: ED 8A 75 2F                                        ..u/
-]
-]
-
-
-
-*******************************************
-*******************************************
-
-
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/pem.txt b/generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/pem.txt
deleted file mode 100644 (file)
index b5ac413..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-Certificate:
-    Data:
-        Version: 3 (0x2)
-        Serial Number: 13211367637093423910 (0xb75834de7e0b9b26)
-    Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=DE, ST=Niedersachsen, L=Juist, O=juplo, OU=security, CN=Root-CA
-        Validity
-            Not Before: Jun 26 08:27:23 2019 GMT
-            Not After : Jun 25 08:27:23 2020 GMT
-        Subject: C=DE, ST=Niedersachsen, L=Juist, O=juplo, OU=security, CN=test
-        Subject Public Key Info:
-            Public Key Algorithm: dsaEncryption
-                pub: 
-                    00:8d:f8:cc:68:da:ab:56:e0:30:b1:cf:68:49:6f:
-                    ff:30:ba:fe:b6:63:c7:7f:70:e4:db:f4:c1:b5:7d:
-                    90:34:58:a1:93:2a:90:cc:19:2f:eb:e8:f9:81:1d:
-                    19:a4:ad:18:23:b1:5e:94:27:a3:1d:87:60:6a:d6:
-                    44:b1:40:d2:86:e7:53:3e:95:86:ec:c6:3f:2a:f5:
-                    6a:2a:79:40:08:d9:a9:c9:04:83:3f:65:6b:81:75:
-                    5d:ec:78:3d:df:a5:0f:49:98:9a:ef:98:b3:c9:8e:
-                    61:ee:b2:c1:e5:08:4a:13:20:d6:5b:33:0e:bd:38:
-                    e5:cb:f7:dc:7c:43:bb:fc:33:a4:b0:81:8b:3c:24:
-                    10:0f:8f:d6:fe:8c:52:05:1d:07:8f:f7:06:86:e8:
-                    77:20:32:b6:ec:26:cf:19:e1:aa:48:66:ba:d4:be:
-                    8b:7d:e3:a9:3b:45:ca:fc:18:04:19:ec:53:f1:86:
-                    9b:b3:0b:c0:86:8a:ca:47:01:02:8e:ba:91:54:89:
-                    9e:43:d5:0a:73:47:31:36:39:2e:26:07:92:a7:5d:
-                    26:cd:2c:2a:b3:aa:97:d1:65:34:8f:2a:fc:1a:19:
-                    7f:03:b7:ca:88:0f:73:31:bf:0c:d1:8d:9a:3c:d7:
-                    a1:56:76:ee:f0:ad:f3:77:2f:0b:2a:d6:c9:8b:70:
-                    27:cd
-                P:   
-                    00:8f:79:35:d9:b9:aa:e9:bf:ab:ed:88:7a:cf:49:
-                    51:b6:f3:2e:c5:9e:3b:af:37:18:e8:ea:c4:96:1f:
-                    3e:fd:36:06:e7:43:51:a9:c4:18:33:39:b8:09:e7:
-                    c2:ae:1c:53:9b:a7:47:5b:85:d0:11:ad:b8:b4:79:
-                    87:75:49:84:69:5c:ac:0e:8f:14:b3:36:08:28:a2:
-                    2f:fa:27:11:0a:3d:62:a9:93:45:34:09:a0:fe:69:
-                    6c:46:58:f8:4b:dd:20:81:9c:37:09:a0:10:57:b1:
-                    95:ad:cd:00:23:3d:ba:54:84:b6:29:1f:9d:64:8e:
-                    f8:83:44:86:77:97:9c:ec:04:b4:34:a6:ac:2e:75:
-                    e9:98:5d:e2:3d:b0:29:2f:c1:11:8c:9f:fa:9d:81:
-                    81:e7:33:8d:b7:92:b7:30:d7:b9:e3:49:59:2f:68:
-                    09:98:72:15:39:15:ea:3d:6b:8b:46:53:c6:33:45:
-                    8f:80:3b:32:a4:c2:e0:f2:72:90:25:6e:4e:3f:8a:
-                    3b:08:38:a1:c4:50:e4:e1:8c:1a:29:a3:7d:df:5e:
-                    a1:43:de:4b:66:ff:04:90:3e:d5:cf:16:23:e1:58:
-                    d4:87:c6:08:e9:7f:21:1c:d8:1d:ca:23:cb:6e:38:
-                    07:65:f8:22:e3:42:be:48:4c:05:76:39:39:60:1c:
-                    d6:67
-                Q:   
-                    00:ba:f6:96:a6:85:78:f7:df:de:e7:fa:67:c9:77:
-                    c7:85:ef:32:b2:33:ba:e5:80:c0:bc:d5:69:5d
-                G:   
-                    16:a6:5c:58:20:48:50:70:4e:75:02:a3:97:57:04:
-                    0d:34:da:3a:34:78:c1:54:d4:e4:a5:c0:2d:24:2e:
-                    e0:4f:96:e6:1e:4b:d0:90:4a:bd:ac:8f:37:ee:b1:
-                    e0:9f:31:82:d2:3c:90:43:cb:64:2f:88:00:41:60:
-                    ed:f9:ca:09:b3:20:76:a7:9c:32:a6:27:f2:47:3e:
-                    91:87:9b:a2:c4:e7:44:bd:20:81:54:4c:b5:5b:80:
-                    2c:36:8d:1f:a8:3e:d4:89:e9:4e:0f:a0:68:8e:32:
-                    42:8a:5c:78:c4:78:c6:8d:05:27:b7:1c:9a:3a:bb:
-                    0b:0b:e1:2c:44:68:96:39:e7:d3:ce:74:db:10:1a:
-                    65:aa:2b:87:f6:4c:68:26:db:3e:c7:2f:4b:55:99:
-                    83:4b:b4:ed:b0:2f:7c:90:e9:a4:96:d3:a5:5d:53:
-                    5b:eb:fc:45:d4:f6:19:f6:3f:3d:ed:bb:87:39:25:
-                    c2:f2:24:e0:77:31:29:6d:a8:87:ec:1e:47:48:f8:
-                    7e:fb:5f:de:b7:54:84:31:6b:22:32:de:e5:53:dd:
-                    af:02:11:2b:0d:1f:02:da:30:97:32:24:fe:27:ae:
-                    da:8b:9d:4b:29:22:d9:ba:8b:e3:9e:d9:e1:03:a6:
-                    3c:52:81:0b:c6:88:b7:e2:ed:43:16:e1:ef:17:db:
-                    de
-        X509v3 extensions:
-            X509v3 Subject Alternative Name: 
-                DNS:test, DNS:localhost, IP Address:127.0.0.1
-    Signature Algorithm: sha256WithRSAEncryption
-         60:80:c4:5e:7d:c6:cf:88:94:14:69:8d:c2:d7:ce:af:b4:97:
-         1c:08:9b:ff:65:db:77:24:c5:8a:87:1e:6f:30:70:71:a1:c5:
-         ac:af:67:49:ce:b0:91:b9:5a:55:27:12:49:72:be:7d:f5:45:
-         12:ff:32:1a:ee:b1:f9:44:cd:62:1f:20:48:ac:0f:5a:f4:c7:
-         b0:1b:05:b0:84:20:fe:da:6d:73:92:da:32:f6:77:3c:df:07:
-         5b:da:fd:c3:f3:6f:08:e8:4d:3e:ba:35:b2:a8:cc:a5:b3:9c:
-         5c:61:c0:cb:35:ea:fe:c8:d2:e7:d3:ea:e0:0e:3b:7d:fb:22:
-         60:e6:96:34:af:a4:bc:cb:70:e0:60:75:f9:93:0d:31:f1:60:
-         aa:50:34:8a:87:50:13:d1:8a:db:ee:d9:59:17:25:d9:b2:ad:
-         55:14:09:92:9a:80:54:70:01:9f:65:ed:bf:e5:10:65:f5:8b:
-         b8:7c:72:48:65:72:60:56:d8:de:b3:9f:90:9a:58:a4:ed:eb:
-         27:b2:a1:ae:90:52:0f:a4:d6:52:bd:36:b1:bb:d1:49:54:d1:
-         df:d9:1a:92:55:4a:56:e1:47:e7:f2:7e:52:c6:64:68:db:70:
-         87:cc:a5:ed:e7:fe:93:5b:bc:21:57:c9:02:06:0c:2b:c5:5d:
-         29:57:95:76
------BEGIN CERTIFICATE-----
-MIIFmTCCBIGgAwIBAgIJALdYNN5+C5smMA0GCSqGSIb3DQEBCwUAMGoxCzAJBgNV
-BAYTAkRFMRYwFAYDVQQIDA1OaWVkZXJzYWNoc2VuMQ4wDAYDVQQHDAVKdWlzdDEO
-MAwGA1UECgwFanVwbG8xETAPBgNVBAsMCHNlY3VyaXR5MRAwDgYDVQQDDAdSb290
-LUNBMB4XDTE5MDYyNjA4MjcyM1oXDTIwMDYyNTA4MjcyM1owZzELMAkGA1UEBhMC
-REUxFjAUBgNVBAgTDU5pZWRlcnNhY2hzZW4xDjAMBgNVBAcTBUp1aXN0MQ4wDAYD
-VQQKEwVqdXBsbzERMA8GA1UECxMIc2VjdXJpdHkxDTALBgNVBAMTBHRlc3QwggND
-MIICNQYHKoZIzjgEATCCAigCggEBAI95Ndm5qum/q+2Ies9JUbbzLsWeO683GOjq
-xJYfPv02BudDUanEGDM5uAnnwq4cU5unR1uF0BGtuLR5h3VJhGlcrA6PFLM2CCii
-L/onEQo9YqmTRTQJoP5pbEZY+EvdIIGcNwmgEFexla3NACM9ulSEtikfnWSO+INE
-hneXnOwEtDSmrC516Zhd4j2wKS/BEYyf+p2BgeczjbeStzDXueNJWS9oCZhyFTkV
-6j1ri0ZTxjNFj4A7MqTC4PJykCVuTj+KOwg4ocRQ5OGMGimjfd9eoUPeS2b/BJA+
-1c8WI+FY1IfGCOl/IRzYHcojy244B2X4IuNCvkhMBXY5OWAc1mcCHQC69pamhXj3
-397n+mfJd8eF7zKyM7rlgMC81WldAoIBABamXFggSFBwTnUCo5dXBA002jo0eMFU
-1OSlwC0kLuBPluYeS9CQSr2sjzfuseCfMYLSPJBDy2QviABBYO35ygmzIHannDKm
-J/JHPpGHm6LE50S9IIFUTLVbgCw2jR+oPtSJ6U4PoGiOMkKKXHjEeMaNBSe3HJo6
-uwsL4SxEaJY559POdNsQGmWqK4f2TGgm2z7HL0tVmYNLtO2wL3yQ6aSW06VdU1vr
-/EXU9hn2Pz3tu4c5JcLyJOB3MSltqIfsHkdI+H77X963VIQxayIy3uVT3a8CESsN
-HwLaMJcyJP4nrtqLnUspItm6i+Oe2eEDpjxSgQvGiLfi7UMW4e8X294DggEGAAKC
-AQEAjfjMaNqrVuAwsc9oSW//MLr+tmPHf3Dk2/TBtX2QNFihkyqQzBkv6+j5gR0Z
-pK0YI7FelCejHYdgatZEsUDShudTPpWG7MY/KvVqKnlACNmpyQSDP2VrgXVd7Hg9
-36UPSZia75izyY5h7rLB5QhKEyDWWzMOvTjly/fcfEO7/DOksIGLPCQQD4/W/oxS
-BR0Hj/cGhuh3IDK27CbPGeGqSGa61L6LfeOpO0XK/BgEGexT8YabswvAhorKRwEC
-jrqRVImeQ9UKc0cxNjkuJgeSp10mzSwqs6qX0WU0jyr8Ghl/A7fKiA9zMb8M0Y2a
-PNehVnbu8K3zdy8LKtbJi3AnzaMkMCIwIAYDVR0RBBkwF4IEdGVzdIIJbG9jYWxo
-b3N0hwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQBggMRefcbPiJQUaY3C186vtJcc
-CJv/Zdt3JMWKhx5vMHBxocWsr2dJzrCRuVpVJxJJcr599UUS/zIa7rH5RM1iHyBI
-rA9a9MewGwWwhCD+2m1zktoy9nc83wdb2v3D828I6E0+ujWyqMyls5xcYcDLNer+
-yNLn0+rgDjt9+yJg5pY0r6S8y3DgYHX5kw0x8WCqUDSKh1AT0Yrb7tlZFyXZsq1V
-FAmSmoBUcAGfZe2/5RBl9Yu4fHJIZXJgVtjes5+Qmlik7esnsqGukFIPpNZSvTax
-u9FJVNHf2RqSVUpW4Ufn8n5SxmRo23CHzKXt5/6TW7whV8kCBgwrxV0pV5V2
------END CERTIFICATE-----
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/settings.conf b/generated-2025-11-21-17-29-08/static/wp-uploads/selfsigned+san/settings.conf
deleted file mode 100644 (file)
index 5715d82..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-DEFAULT_PASSWORD=confidential
-DEFAULT_VALIDITY=365
-
-OU=security
-O=juplo
-L=Juist
-ST=Niedersachsen
-C=DE
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/README.sh b/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/README.sh
deleted file mode 100755 (executable)
index efe60ab..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-#!/bin/bash
-#
-# Example-script to show, how to encrypt the communication between two
-# Kafka-brokers and a standalone ZooKeeper
-#
-# Usage:
-# ./README.sh         -- Download Kafka/ZooKeeper, create the needed
-#                        certificates and start a ZooKeeper and two brokers
-#                        --------
-#                        Will not shut down the services, so that one can
-#                        experiment with single commands from this example.
-#                        Can be run multiple times: certificates are only
-#                        recreated and services are only restart, if they were
-#                        removed / stopped
-# ./README.sh stop    -- Stop the standalone ZooKeeper and the two brokers
-# ./README.sh cleanup -- Stop the standalone ZooKeeper and the two brokers,
-#                        then remove all data, the created certificates and
-#                        the written logs (does not remove dowloaded data)
-
-
-ZOOKEEPER_DOWNLOAD=http://ftp.fau.de/apache/zookeeper/zookeeper-3.5.5/apache-zookeeper-3.5.5-bin.tar.gz
-ZOOKEEPER_DIR=apache-zookeeper-3.5.5-bin
-KAFKA_DOWNLOAD=http://ftp.fau.de/apache/kafka/2.3.0/kafka_2.12-2.3.0.tgz
-KAFKA_DIR=kafka_2.12-2.3.0
-
-PASSWORD=confidential
-
-
-# Stops all services (Kafka and ZooKeeper)
-#
-function stop
-{
-  if [ -a ZOOKEEPER ]
-  then
-    ZOOPIDFILE=ZOOKEEPER $ZOOKEEPER_DIR/bin/zkServer.sh --config . stop
-  fi
-  if [ -a KAFKA-1 ]
-  then
-    kill $(cat KAFKA-1)
-    rm -f KAFKA-1
-  fi
-  if [ -a KAFKA-2 ]
-  then
-    kill $(cat KAFKA-2)
-    rm -f KAFKA-2
-  fi
-
-  if [ -a CONSUMER ]
-  then
-    kill $(cat CONSUMER)
-    rm -f CONSUMER
-  fi
-  if [ -a PRODUCER ]
-  then
-    kill $(cat PRODUCER)
-    rm -f PRODUCER
-  fi
-}
-
-
-# Stops all services (Kafka/ZooKeeper)
-#
-if [ "$1" = "stop" ]
-then
-  stop
-  exit
-fi
-
-# Removes data, certificates and logs (does not remove the downloads)
-#
-if [ "$1" = "cleanup" ]
-then
-
-  stop
-
-  rm -rvf /tmp/zookeeper
-  rm -rvf /tmp/kafka-1-logs
-  rm -rvf /tmp/kafka-2-logs
-
-  rm -rfv *.log *.out ca-cert* ca-key *.jks
-
-  exit
-
-fi
-
-
-if [ -x "$ZOOKEEPER_DIR" ];
-then
-  echo "Version 3.5.5 of Apache ZooKeeper already downloaded";
-else
-  echo "Downloading version 3.5.5 of Apache ZooKeeper...";
-  curl -sc - $ZOOKEEPER_DOWNLOAD | tar -xzv
-  cp -av $ZOOKEEPER_DIR/conf/log4j.properties ./
-fi
-
-if [ -x "$KAFKA_DIR" ];
-then
-  echo "Version 2.3.0 of Apache Kafka already downloaded";
-else
-  echo "Downloading version 2.3.0 of Apache Kafka...";
-  curl -sc - $KAFKA_DOWNLOAD | tar -xzv
-  echo "Replacing ZooKeeper-libs in Kafka with versions from 3.5.5..."
-  rm -v $KAFKA_DIR/libs/zookeeper-3.4.14.jar
-  cp -av $ZOOKEEPER_DIR/lib/zookeeper-3.5.5.jar $KAFKA_DIR/libs/
-  cp -av $ZOOKEEPER_DIR/lib/zookeeper-jute-3.5.5.jar $KAFKA_DIR/libs/
-  cp -av $ZOOKEEPER_DIR/lib/netty-all-4.1.29.Final.jar $KAFKA_DIR/libs/
-  echo "Only needed for ZooKeeper-CLI-clients (for example zookeeper-shell.sh):"
-  cp -av $ZOOKEEPER_DIR/lib/commons-cli-1.2.jar $KAFKA_DIR/libs/
-fi
-
-
-./create-certs.sh
-
-
-if [ -a ZOOKEEPER ]
-then
-  echo "zookeeper is already running!"
-else
-  echo "Starting zookeeper on port 2128..."
-  (
-    ZOOPIDFILE=ZOOKEEPER $ZOOKEEPER_DIR/bin/zkServer.sh --config . start
-  )
-fi
-
-if [ -a KAFKA-1 ]
-then
-  echo "kafka-1 is already running!"
-else
-  echo "Starting kafka-1 on port 9193/9194..."
-  (
-    export KAFKA_OPTS="
-      -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
-      -Dzookeeper.client.secure=true
-      -Dzookeeper.ssl.keyStore.location=kafka-1.jks
-      -Dzookeeper.ssl.keyStore.password=$PASSWORD
-      -Dzookeeper.ssl.trustStore.location=truststore.jks
-      -Dzookeeper.ssl.trustStore.password=$PASSWORD
-    "
-    $KAFKA_DIR/bin/kafka-server-start.sh kafka-1.properties & echo $! > KAFKA-1
-  ) > kafka-1.log &
-fi
-if [ -a KAFKA-2 ]
-then
-  echo "kafka-2 is already running!"
-else
-  echo "Starting kafka-2 on port 9293/9294..."
-  (
-    export KAFKA_OPTS="
-      -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
-      -Dzookeeper.client.secure=true
-      -Dzookeeper.ssl.keyStore.location=kafka-2.jks
-      -Dzookeeper.ssl.keyStore.password=$PASSWORD
-      -Dzookeeper.ssl.trustStore.location=truststore.jks
-      -Dzookeeper.ssl.trustStore.password=$PASSWORD
-    "
-    $KAFKA_DIR/bin/kafka-server-start.sh kafka-2.properties & echo $! > KAFKA-2
-  ) > kafka-2.log &
-fi
-
-
-while ! nc -w1 kafka-1 9193; do echo "Waiting for kafka-1..."; sleep 1; done
-while ! nc -w1 kafka-1 9293; do echo "Waiting for kafka-2..."; sleep 1; done
-
-# Creates topic "test", if it does not exist already
-# Note the usage of KAFKA_OPTS, to configure the SSL-encryption
-(
-  export KAFKA_OPTS="
-    -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
-    -Dzookeeper.client.secure=true
-    -Dzookeeper.ssl.keyStore.location=client.jks
-    -Dzookeeper.ssl.keyStore.password=$PASSWORD
-    -Dzookeeper.ssl.trustStore.location=truststore.jks
-    -Dzookeeper.ssl.trustStore.password=$PASSWORD
-  "
-  $KAFKA_DIR/bin/kafka-topics.sh --zookeeper zookeeper:2182 --if-not-exists --create --topic test --partitions 1 --replication-factor 2
-)
-# Prints information about topic "test"
-# Note the usage of KAFKA_OPTS, to configure the SSL-encryption
-(
-  export KAFKA_OPTS="
-    -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
-    -Dzookeeper.client.secure=true
-    -Dzookeeper.ssl.keyStore.location=client.jks
-    -Dzookeeper.ssl.keyStore.password=$PASSWORD
-    -Dzookeeper.ssl.trustStore.location=truststore.jks
-    -Dzookeeper.ssl.trustStore.password=$PASSWORD
-  "
-  $KAFKA_DIR/bin/kafka-topics.sh --zookeeper zookeeper:2182 --describe --topic test
-)
-
-# Starts a console-consumer, that reads 3 messages from the topic "test"
-# See consumer.config for the configuration of the SSL-encryption
-{ $KAFKA_DIR/bin/kafka-console-consumer.sh --bootstrap-server kafka-1:9194 --consumer.config consumer.config --topic test --from-beginning --max-messages 3 & echo $! > CONSUMER ; } |& tee consumer.log &
-echo "Started consumer with PID $(cat CONSUMER)"
-
-# Starts a console-consumer, that writes some messages to the topic "test"
-# See producer.config for the configuration of the SSL-encryption
-{ echo -e "Foo\nBar\nFooBar\n" | $KAFKA_DIR/bin/kafka-console-producer.sh --broker-list kafka-1:9194 --producer.config producer.config --topic test & echo $! > PRODUCER ; } |& tee producer.log &
-echo "Started producer with PID $(cat PRODUCER)"
-
-echo "Waiting for consumer/producer..."
-wait
-rm -f PRODUCER CONSUMER
-
-# Connect to ZooKeeper and get some informations about the broker 1
-# Note the usage of KAFKA_OPTS, to configure the SSL-encryption
-(
-  export KAFKA_OPTS="
-    -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
-    -Dzookeeper.client.secure=true
-    -Dzookeeper.ssl.keyStore.location=client.jks
-    -Dzookeeper.ssl.keyStore.password=$PASSWORD
-    -Dzookeeper.ssl.trustStore.location=truststore.jks
-    -Dzookeeper.ssl.trustStore.password=$PASSWORD
-  "
-  $KAFKA_DIR/bin/zookeeper-shell.sh  zookeeper:2182 get /brokers/ids/1
-)
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/consumer.config b/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/consumer.config
deleted file mode 100644 (file)
index 960ae66..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-security.protocol=SASL_SSL
-sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="consumer" password="pw4consumer";
-sasl.mechanism=PLAIN
-ssl.truststore.location=truststore.jks
-ssl.truststore.password=confidential
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/create-certs.sh b/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/create-certs.sh
deleted file mode 100755 (executable)
index a989bf7..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-#
-# Example-script to show, how to set up a self-signed CA
-#
-# Usage:
-# ./create-certs.sh
-
-VALIDITY=365
-PASSWORD=confidential
-if [ -a ca-cert ];
-then
-  echo "The root-certificate for the CA already exists...";
-else
-  echo "Creating a x509-certificate for the CA...";
-  openssl req -new -x509 -subj "/C=DE/ST=NRW/L=MS/O=trion/OU=kafka/CN=Root-CA" -keyout ca-key -out ca-cert -days $VALIDITY -passout pass:$PASSWORD
-fi
-#
-
-if [ -a truststore.jks ];
-then
-  echo "The keystore truststore.jks already exists!";
-else
-  echo "Importing the root-certificate of the CA into truststore.jks..."
-  keytool -keystore truststore.jks -storepass $PASSWORD -alias CARoot -import -file ca-cert -noprompt
-fi
-
-
-# Generating certificates for the standalone ZooKeeper, an example CLI-client
-# and the two Kafka-Brokers
-./gencert.sh zookeeper
-./gencert.sh client
-./gencert.sh kafka-1
-./gencert.sh kafka-2
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/gencert.sh b/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/gencert.sh
deleted file mode 100755 (executable)
index dbdd032..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/bash
-#
-# Example-script to show, how to create and sign a selfsigned certificate, that
-# contains multiple DNS-entries (SAN-extension)
-#
-# Usage:
-# ./gencert.sh NAME
-
-VALIDITY=365
-PASSWORD=confidential
-
-if [ -a $1.jks ];
-then
-  echo "The keystore $1.jks already exists";
-  exit;
-fi
-
-echo "Creating keystore $1.jks with a certificate and a key-pair for CN $1"
-keytool -keystore $1.jks -alias $1 -validity $VALIDITY -genkey -storepass $PASSWORD -keypass $PASSWORD -dname "CN=$1,OU=kafka,O=trion,L=MS,ST=NRW,C=DE"
-echo "Creating a Certificate-Signing-Request for the generated certificate"
-keytool -keystore $1.jks -alias $1 -certreq -file cert-file -storepass $PASSWORD
-echo "Signing the Certificate-Signing-Request and adding an additional DNS-entry for localhost"
-openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days $VALIDITY -CAcreateserial -passin pass:$PASSWORD -extensions SAN -extfile <(printf "\n[SAN]\nsubjectAltName=DNS:$1,DNS:localhost")
-echo "Importing the root-certificate for the CA into the keystore $1.jks"
-keytool -keystore $1.jks -alias CARoot -import -file ca-cert -storepass $PASSWORD -noprompt
-echo "Importing the signed certificate for CN $1 into the keystore $1.jks"
-keytool -keystore $1.jks -alias $1 -import -file cert-signed -storepass $PASSWORD
-echo "Removing obsolet files..."
-rm -v cert-file cert-signed
-
-
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/java.env b/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/java.env
deleted file mode 100644 (file)
index e3ebca6..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-SERVER_JVMFLAGS="-Xms512m -Xmx512m -Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory"
-ZOO_LOG_DIR=.
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/kafka-1.properties b/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/kafka-1.properties
deleted file mode 100644 (file)
index 1e7c305..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-broker.id=1
-zookeeper.connect=zookeeper:2182
-listeners=SSL://kafka-1:9193,SASL_SSL://kafka-1:9194
-security.inter.broker.protocol=SSL
-ssl.client.auth=required
-ssl.keystore.location=kafka-1.jks
-ssl.keystore.password=confidential
-ssl.key.password=confidential
-ssl.truststore.location=truststore.jks
-ssl.truststore.password=confidential
-listener.name.sasl_ssl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required user_consumer="pw4consumer" user_producer="pw4producer";
-sasl.enabled.mechanisms=PLAIN
-
-log.dirs=/tmp/kafka-1-logs
-offsets.topic.replication.factor=2
-transaction.state.log.replication.factor=2
-transaction.state.log.min.isr=2
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/kafka-2.properties b/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/kafka-2.properties
deleted file mode 100644 (file)
index ec53f9b..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-broker.id=2
-zookeeper.connect=zookeeper:2182
-listeners=SSL://kafka-2:9293,SASL_SSL://kafka-2:9294
-security.inter.broker.protocol=SSL
-ssl.client.auth=required
-ssl.keystore.location=kafka-2.jks
-ssl.keystore.password=confidential
-ssl.key.password=confidential
-ssl.truststore.location=truststore.jks
-ssl.truststore.password=confidential
-listener.name.sasl_ssl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required user_consumer="pw4consumer" user_producer="pw4producer";
-sasl.enabled.mechanisms=PLAIN
-
-log.dirs=/tmp/kafka-2-logs
-offsets.topic.replication.factor=2
-transaction.state.log.replication.factor=2
-transaction.state.log.min.isr=2
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/producer.config b/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/producer.config
deleted file mode 100644 (file)
index 5809edf..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-security.protocol=SASL_SSL
-sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="producer" password="pw4producer";
-sasl.mechanism=PLAIN
-ssl.truststore.location=truststore.jks
-ssl.truststore.password=confidential
diff --git a/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/zoo.cfg b/generated-2025-11-21-17-29-08/static/wp-uploads/zookeeper+tls/zoo.cfg
deleted file mode 100644 (file)
index ad80add..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-dataDir=/tmp/zookeeper
-secureClientPort=2182
-maxClientCnxns=0
-authProvider.1=org.apache.zookeeper.server.auth.X509AuthenticationProvider
-ssl.keyStore.location=zookeeper.jks
-ssl.keyStore.password=confidential
-ssl.trustStore.location=truststore.jks
-ssl.trustStore.password=confidential
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/.github/ISSUE_TEMPLATE/bug.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/.github/ISSUE_TEMPLATE/bug.yaml
deleted file mode 100644 (file)
index d7d7656..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-name: Bug Report 🐞
-description: Create a report to help us improve
-title: "[Bug]: "
-labels: ["bug", "triage"]
-body:
-  - type: markdown
-    attributes:
-      value: |
-        Thanks for taking the time to fill out this bug report :)
-        - Kindly **DO NOT** ask for instructions.
-        - Use [Discussions](https://github.com/adityatelange/hugo-PaperMod/discussions) section if you have a query or doubts or any other relevant question.
-        - You may join [Discord community](https://discord.gg/ahpmTvhVmp) to interact with fellow contributors and users
-        - Read project's [Wiki](https://github.com/adityatelange/hugo-PaperMod/wiki) for detailed documentation.
-        - Read project's [FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs) section for Frequently asked questions.
-        - Search for previous [Issues](https://github.com/adityatelange/hugo-PaperMod/issues)/[Pull Requests](https://github.com/adityatelange/hugo-PaperMod/pulls) if this issue is already reported or fix has been created.
-  - type: textarea
-    id: what_happened
-    attributes:
-      label: What happened?
-      description: Also tell us, what did you expect to happen?
-      placeholder: A bug happened! Here are the screenshots.. Tell us what you see!
-    validations:
-      required: true
-  - type: textarea
-    id: steps_to_reproduce
-    attributes:
-      label: Steps to reproduce
-      description: How to reproduce this issue. Here are the steps...
-      placeholder:  |
-        1. Go to '...'
-        2. Click on '....'
-        3. Scroll down to '....'
-        4. See error
-    validations:
-      required: true
-  - type: dropdown
-    id: hugo_version
-    attributes:
-      label: Hugo Version
-      description: What version of Hugo are you running?
-      options:
-        - Hugo >= 0.146.0 (Recommended - Minimum version required for PaperMod)
-        - Hugo < 0.146.0  (Incompatible - Not recommended to build PaperMod on lower versions)
-    validations:
-      required: true
-  - type: input
-    id: papermod_version
-    attributes:
-      label: PaperMod Version
-      description: What version of PaperMod are you running?
-      placeholder:  |
-        PaperMod v7.0 or
-        Branch master or
-        Commit-id: 3f50861a0ced88f9b614a43662edeb4c0bc45da8
-    validations:
-      required: true
-  - type: dropdown
-    id: browser_type
-    attributes:
-      label: What kind of devices are you seeing the problem on?
-      multiple: true
-      options:
-        - Mobile
-        - Desktop
-    validations:
-      required: false
-  - type: dropdown
-    id: browsers
-    attributes:
-      label: What browsers are you seeing the problem on?
-      multiple: true
-      options:
-        - Firefox
-        - Chrome
-        - Safari
-        - Microsoft Edge
-    validations:
-      required: false
-  - type: input
-    id: browser_version
-    attributes:
-      label: Browser Version
-      description: Please add browser version or enter user agent string (navigator.userAgent)
-      placeholder: ex. Google Chrome 86.0
-    validations:
-      required: false
-  - type: textarea
-    id: logs
-    attributes:
-      label: Relevant log output
-      description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
-      render: shell
-    validations:
-      required: true
-  - type: input
-    id: repo_url
-    attributes:
-      label: Repository/Source Code link where this issue can be reproduced
-      description: Please add url of the repository where this issue can be reproduced
-      placeholder: https://github.com/<username>/<repo name>
-    validations:
-      required: false
-  - type: checkboxes
-    id: terms
-    attributes:
-      label: Code of Conduct
-      description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/adityatelange/hugo-PaperMod?tab=coc-ov-file#readme).
-      options:
-        - label: I agree to follow this project's Code of Conduct
-          required: true
-    validations:
-      required: true
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/.github/ISSUE_TEMPLATE/config.yml b/generated-2025-11-21-17-29-08/themes/PaperMod/.github/ISSUE_TEMPLATE/config.yml
deleted file mode 100644 (file)
index eeb6e55..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-blank_issues_enabled: false
-contact_links:
-  - name: PaperMod Discussions
-    url: https://github.com/adityatelange/hugo-PaperMod/discussions
-    about: Please ask and answer questions/doubts here, DO NOT open an issue for questions.
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/.github/ISSUE_TEMPLATE/enhancement.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/.github/ISSUE_TEMPLATE/enhancement.yaml
deleted file mode 100644 (file)
index 3976a80..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-name: Enhancement 🚀
-description: Propose a new feature or change for enhancing the experience.
-title: "[Enhancement]: "
-labels: ["enhancement", "triage"]
-body:
-  - type: markdown
-    attributes:
-      value: |
-        Thanks for taking the time to fill out this enhancement form :)
-        - Use [Discussions](https://github.com/adityatelange/hugo-PaperMod/discussions) section if you have a query or doubts or any other relevant question.
-        - You may join [Discord community](https://discord.gg/ahpmTvhVmp) to interact with fellow contributors and users
-        - Read project's [Wiki](https://github.com/adityatelange/hugo-PaperMod/wiki) for detailed documentation.
-        - Read project's [FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs) section for Frequently asked questions.
-        - Search for previous [Issues](https://github.com/adityatelange/hugo-PaperMod/issues)/[Pull Requests](https://github.com/adityatelange/hugo-PaperMod/pulls) if this issue is already reported or fix has been created.
-  - type: textarea
-    id: what_happened
-    attributes:
-      label: What you'd like to propose?
-      description:
-      placeholder:
-    validations:
-      required: true
-  - type: checkboxes
-    id: terms
-    attributes:
-      label: Code of Conduct
-      description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/adityatelange/hugo-PaperMod?tab=coc-ov-file#readme).
-      options:
-        - label: I agree to follow this project's Code of Conduct
-          required: true
-    validations:
-      required: true
\ No newline at end of file
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/.github/PULL_REQUEST_TEMPLATE.md b/generated-2025-11-21-17-29-08/themes/PaperMod/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644 (file)
index 673d1c4..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<!--
-
-## READ BEFORE OPENING A PR
-
-Thank you for contributing to hugo-PaperMod!
-Please fill out the following questions to make it easier for us to review your
-changes. You do not need to check all the boxes below.
-
-**NOTE**: PaperMod does not have any external dependencies fetched from 3rd party
-CDN servers. However we do have custom Head/Footer extender templates which you can use
-to add those to your website.
-https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#custom-head--footer
-
--->
-
-
-**What does this PR change? What problem does it solve?**
-
-<!--
-Describe the changes and their purpose here, as detailed as and if needed.
-
-Please do not add 2 unrelated changes in a single PR as it is difficult to track/revert those in future.
--->
-
-
-**Was the change discussed in an issue or in the Discussions before?**
-
-<!--
-Link issues and relevant Discussions posts here.
-
-If this PR resolves an issue on GitHub, use "Closes #1234" so that the issue
-is closed automatically when this PR is merged.
--->
-
-
-## PR Checklist
-
-- [ ] This change adds/updates translations and I have used the [template present here](https://github.com/adityatelange/hugo-PaperMod/wiki/Translations#want-to-add-your-language-).
-- [ ] I have enabled [maintainer edits for this PR](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork).
-- [ ] I have verified that the code works as described/as intended.
-- [ ] This change adds a Social Icon which has a permissive license to use it.
-- [ ] This change **does not** include any CDN resources/links.
-- [ ] This change **does not** include any unrelated scripts such as bash and python scripts.
-- [ ] This change updates the overridden internal templates from HUGO's repository.
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/.github/workflows/gh-pages.yml b/generated-2025-11-21-17-29-08/themes/PaperMod/.github/workflows/gh-pages.yml
deleted file mode 100644 (file)
index 7dc6f1c..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-name: Deploy Hugo PaperMod Demo to Pages
-
-on:
-  push:
-    paths-ignore:
-      - "images/**"
-      - "LICENSE"
-      - "README.md"
-    branches:
-      - master
-      - exampleSite
-  workflow_dispatch:
-    # manual run
-    inputs:
-      hugoVersion:
-        description: "Hugo Version"
-        required: false
-        default: "0.146.0"
-
-# Allow one concurrent deployment
-concurrency:
-  group: "pages"
-  cancel-in-progress: true
-
-# Default to bash
-defaults:
-  run:
-    shell: bash
-
-# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
-permissions:
-  contents: read
-  pages: write
-  id-token: write
-
-jobs:
-  # Build job
-  build:
-    runs-on: ubuntu-latest
-    env:
-      HUGO_VERSION: ${{ github.event.inputs.hugoVersion || '0.146.0' }}
-    steps:
-      - name: Install Hugo CLI
-        run: |
-          wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-amd64.deb \
-          && sudo dpkg -i ${{ runner.temp }}/hugo.deb
-      - name: Checkout
-        uses: actions/checkout@v4
-        with:
-          ref: exampleSite
-      - name: Setup Pages
-        id: pages
-        uses: actions/configure-pages@v5
-      - name: Get Theme
-        run: git submodule update --init --recursive
-      - name: Update theme to Latest commit
-        run: git submodule update --remote --merge
-      - name: Build with Hugo
-        run: |
-          hugo \
-            --buildDrafts --gc \
-            --baseURL ${{ steps.pages.outputs.base_url }}
-      - name: Upload artifact
-        uses: actions/upload-pages-artifact@v3
-        with:
-          path: ./public
-  # Deployment job
-  deploy:
-    environment:
-      name: github-pages
-      url: ${{ steps.deployment.outputs.page_url }}
-    runs-on: ubuntu-latest
-    needs: build
-    steps:
-      - name: Deploy to GitHub Pages
-        id: deployment
-        uses: actions/deploy-pages@v4
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/LICENSE b/generated-2025-11-21-17-29-08/themes/PaperMod/LICENSE
deleted file mode 100644 (file)
index 533adaf..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-MIT License
-
-Copyright (c) 2020 nanxiaobei and adityatelange
-Copyright (c) 2021-2025 adityatelange
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/README.md b/generated-2025-11-21-17-29-08/themes/PaperMod/README.md
deleted file mode 100644 (file)
index 7b2956e..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-<h1 align=center>Hugo PaperMod | <a href="https://adityatelange.github.io/hugo-PaperMod/" rel="nofollow">Demo</a></h1>
-
-<h4 align=center>☄️ Fast | ☁️ Fluent | 🌙 Smooth | 📱 Responsive</h4>
-<br>
-
-> Hugo PaperMod is a theme based on [hugo-paper](https://github.com/nanxiaobei/hugo-paper/tree/4330c8b12aa48bfdecbcad6ad66145f679a430b3).<br>
-> The goal of this project is to add more features and customization to the og theme.
-
-**Documentation** can be found here: [**📚 Wiki**](https://github.com/adityatelange/hugo-PaperMod/wiki)
-
-**ExampleSite** can be found here: [**exampleSite**](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite). Demo is built up with [exampleSite](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite) as source.
-
-[![hugo-papermod](https://img.shields.io/badge/Hugo--Themes-@PaperMod-blue)](https://themes.gohugo.io/themes/hugo-papermod/)
-[![Minimum Hugo Version](https://img.shields.io/static/v1?label=min-HUGO-version&message=>=v0.146.0&color=blue&logo=hugo)](https://github.com/gohugoio/hugo/releases/tag/v0.146.0)
-[![Discord](https://img.shields.io/discord/971046860317921340?label=Discord&logo=discord)](https://discord.gg/ahpmTvhVmp)
-[![GitHub](https://img.shields.io/github/license/adityatelange/hugo-PaperMod)](https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE)
-![code-size](https://img.shields.io/github/languages/code-size/adityatelange/hugo-PaperMod)
-[![X (formerly Twitter) URL](https://img.shields.io/badge/-Share%20on%20X-gray?style=flat&logo=x)](https://x.com/intent/tweet/?text=Checkout%20Hugo%20PaperMod%20%E2%9C%A8%0AA%20fast,%20clean,%20responsive%20Hugo%20theme.&url=https://github.com/adityatelange/hugo-PaperMod&hashtags=Hugo,PaperMod)
-
-
----
-
-<p align="center">
-  <kbd><img src="https://user-images.githubusercontent.com/21258296/114303440-bfc0ae80-9aeb-11eb-8cfa-48a4bb385a6d.png" alt="Mockup image" title="Mockup"/></kbd>
-</p>
-
----
-
-## Features/Mods 💥
-
--   Uses Hugo's asset generator with pipelining, fingerprinting, bundling and minification by default.
--   3 Modes:
-    -   [Regular Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#regular-mode-default-mode)
-    -   [Home-Info Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#home-info-mode)
-    -   [Profile Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#profile-mode)
--   Table of Content Generation (newer implementation).
--   Archive of posts.
--   Social Icons (home-info and profile-mode).
--   Social-Media Share buttons on posts.
--   Menu location indicator.
--   Multilingual support. (with language selector).
--   Taxonomies.
--   Cover image for each post (with Responsive image support).
--   Light/Dark theme (automatic theme switch a/c to browser theme and theme-switch button).
--   SEO Friendly.
--   Multiple Author support.
--   Search Page with Fuse.js
--   Other Posts suggestion below a post
--   Breadcrumb Navigation.
--   Code Block Copy buttons.
--   Hugo's Chroma syntax highlighter.
--   No webpack, nodejs and other dependencies are required to edit the theme.
-
-Read Wiki For More Details => **[PaperMod - Features](https://github.com/adityatelange/hugo-PaperMod/wiki/Features)**
-
----
-
-## Install/Update 📥
-
-Read Wiki For More Details => **[PaperMod - Installation](https://github.com/adityatelange/hugo-PaperMod/wiki/Installation)**
-
----
-
-## FAQs / How To's Guide 🙋
-
-Read Wiki For More Details => **[PaperMod-FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs)**
-
----
-
-## Social-Icons/Share-Icons 🖼️
-
-Read Wiki For More Details => **[PaperMod-Icons](https://github.com/adityatelange/hugo-PaperMod/wiki/Icons)**
-
----
-
-## Release Changelog 📃
-
-Release ChangeLog has info about stuff added: **[Releases](https://github.com/adityatelange/hugo-PaperMod/releases)**
-
----
-
-## [Pagespeed Insights (100% ?)](https://pagespeed.web.dev/report?url=https://adityatelange.github.io/hugo-PaperMod/) 👀
-
----
-
-## Support 🫶
-
--   Star 🌟 this repository.
--   Help spread the word about PaperMod by sharing it on social media and recommending it to your friends. 🗣️
--   You can also sponsor 🏅 on [Github Sponsors](https://github.com/sponsors/adityatelange) / [Ko-Fi](https://ko-fi.com/adityatelange).
-
----
-
-## Special Thanks 🌟
-
--   [**Highlight.js**](https://github.com/highlightjs/highlight.js)
--   [**Fuse.js**](https://github.com/krisk/fuse)
--   [**Feather Icons**](https://github.com/feathericons/feather)
--   [**Simple Icons**](https://github.com/simple-icons/simple-icons)
--   **All Contributors and Supporters**
-
----
-
-## Stargazers over time 📈
-
-[![Stargazers over time](https://starchart.cc/adityatelange/hugo-PaperMod.svg?background=%23ffffff00&axis=%23858585&line=%236b63ff)](https://starchart.cc/adityatelange/hugo-PaperMod)
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/404.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/404.css
deleted file mode 100644 (file)
index 8a23430..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-.not-found {
-    position: absolute;
-    left: 0;
-    right: 0;
-    display: flex;
-    align-items: center;
-    justify-content: center;
-    height: 80%;
-    font-size: 160px;
-    font-weight: 700;
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/archive.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/archive.css
deleted file mode 100644 (file)
index 7e7e245..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-.archive-posts {
-    width: 100%;
-    font-size: 16px;
-}
-
-.archive-year {
-    margin-top: 40px;
-}
-
-.archive-year:not(:last-of-type) {
-    border-bottom: 2px solid var(--border);
-}
-
-.archive-month {
-    display: flex;
-    align-items: flex-start;
-    padding: 10px 0;
-}
-
-.archive-month-header {
-    margin: 25px 0;
-    width: 200px;
-}
-
-.archive-month:not(:last-of-type) {
-    border-bottom: 1px solid var(--border);
-}
-
-.archive-entry {
-    position: relative;
-    padding: 5px;
-    margin: 10px 0;
-}
-
-.archive-entry-title {
-    margin: 5px 0;
-    font-weight: 400;
-}
-
-.archive-count,
-.archive-meta {
-    color: var(--secondary);
-    font-size: 14px;
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/footer.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/footer.css
deleted file mode 100644 (file)
index 5addb1e..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-.footer,
-.top-link {
-    font-size: 12px;
-    color: var(--secondary);
-}
-
-.footer {
-    max-width: calc(var(--main-width) + var(--gap) * 2);
-    margin: auto;
-    padding: calc((var(--footer-height) - var(--gap)) / 2) var(--gap);
-    text-align: center;
-    line-height: 24px;
-}
-
-.footer span {
-    margin-inline-start: 1px;
-    margin-inline-end: 1px;
-}
-
-.footer span:last-child {
-    white-space: nowrap;
-}
-
-.footer a {
-    color: inherit;
-    border-bottom: 1px solid var(--secondary);
-}
-
-.footer a:hover {
-    border-bottom: 1px solid var(--primary);
-}
-
-.top-link {
-    visibility: hidden;
-    position: fixed;
-    bottom: 60px;
-    right: 30px;
-    z-index: 99;
-    background: var(--tertiary);
-    width: 42px;
-    height: 42px;
-    padding: 12px;
-    border-radius: 64px;
-    transition: visibility 0.5s, opacity 0.8s linear;
-}
-
-.top-link,
-.top-link svg {
-    filter: drop-shadow(0px 0px 0px var(--theme));
-}
-
-.footer a:hover,
-.top-link:hover {
-    color: var(--primary);
-}
-
-.top-link:focus,
-#theme-toggle:focus {
-    outline: 0;
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/header.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/header.css
deleted file mode 100644 (file)
index 6896433..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-.nav {
-    display: flex;
-    flex-wrap: wrap;
-    justify-content: space-between;
-    max-width: calc(var(--nav-width) + var(--gap) * 2);
-    margin-inline-start: auto;
-    margin-inline-end: auto;
-    line-height: var(--header-height);
-}
-
-.nav a {
-    display: block;
-}
-
-.logo,
-#menu {
-    display: flex;
-    margin: auto var(--gap);
-}
-
-.logo {
-    flex-wrap: inherit;
-}
-
-.logo a {
-    font-size: 24px;
-    font-weight: 700;
-}
-
-.logo a img, .logo a svg {
-    display: inline;
-    vertical-align: middle;
-    pointer-events: none;
-    transform: translate(0, -10%);
-    border-radius: 6px;
-    margin-inline-end: 8px;
-}
-
-button#theme-toggle {
-    font-size: 26px;
-    margin: auto 4px;
-}
-
-[data-theme="dark"] #moon {
-    display: none;
-}
-
-[data-theme="light"] #sun {
-    display: none;
-}
-
-#menu {
-    list-style: none;
-    word-break: keep-all;
-    overflow-x: auto;
-    white-space: nowrap;
-}
-
-#menu li + li {
-    margin-inline-start: var(--gap);
-}
-
-#menu a {
-    font-size: 16px;
-}
-
-#menu .active {
-    font-weight: 500;
-    border-bottom: 2px solid currentColor;
-}
-
-.lang-switch li,
-.lang-switch ul,
-.logo-switches {
-    display: inline-flex;
-    margin: auto 4px;
-}
-
-.lang-switch {
-    display: flex;
-    flex-wrap: inherit;
-}
-
-.lang-switch a {
-    margin: auto 3px;
-    font-size: 16px;
-    font-weight: 500;
-}
-
-.logo-switches {
-    flex-wrap: inherit;
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/main.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/main.css
deleted file mode 100644 (file)
index 25ae4da..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-.main {
-    position: relative;
-    min-height: calc(100vh - var(--header-height) - var(--footer-height));
-    max-width: calc(var(--main-width) + var(--gap) * 2);
-    margin: auto;
-    padding: var(--gap);
-}
-
-.page-header h1 {
-    font-size: 40px;
-}
-
-.pagination {
-    display: flex;
-}
-
-.pagination a {
-    color: var(--theme);
-    font-size: 13px;
-    line-height: 36px;
-    background: var(--primary);
-    border-radius: calc(36px / 2);
-    padding: 0 16px;
-}
-
-.pagination .next {
-    margin-inline-start: auto;
-}
-
-
-.social-icons a {
-    display: inline-flex;
-    padding: 10px;
-}
-
-.social-icons a svg {
-    height: 26px;
-    width: 26px;
-}
-
-code {
-    direction: ltr;
-}
-
-div.highlight,
-pre {
-    position: relative;
-}
-
-.copy-code {
-    display: none;
-    position: absolute;
-    top: 4px;
-    right: 4px;
-    color: rgba(255, 255, 255, 0.8);
-    background: rgba(78, 78, 78, 0.8);
-    border-radius: var(--radius);
-    padding: 0 5px;
-    font-size: 14px;
-    user-select: none;
-}
-
-div.highlight:hover .copy-code,
-pre:hover .copy-code {
-    display: block;
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/post-entry.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/post-entry.css
deleted file mode 100644 (file)
index db9cd3f..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-.first-entry {
-    position: relative;
-    display: flex;
-    flex-direction: column;
-    justify-content: center;
-    min-height: 320px;
-    margin: var(--gap) 0 calc(var(--gap) * 2) 0;
-}
-
-.first-entry .entry-header {
-    overflow: hidden;
-    display: -webkit-box;
-    -webkit-box-orient: vertical;
-    -webkit-line-clamp: 3;
-}
-
-.first-entry .entry-header h1 {
-    font-size: 34px;
-    line-height: 1.3;
-}
-
-.first-entry .entry-content {
-    margin: 14px 0;
-    font-size: 16px;
-    -webkit-line-clamp: 3;
-}
-
-.first-entry .entry-footer {
-    font-size: 14px;
-}
-
-.home-info .entry-content {
-    -webkit-line-clamp: unset;
-}
-
-.post-entry {
-    position: relative;
-    margin-bottom: var(--gap);
-    padding: var(--gap);
-    background: var(--entry);
-    border-radius: var(--radius);
-    transition: transform 0.1s;
-    border: 1px solid var(--border);
-}
-
-.post-entry:active {
-    transform: scale(0.96);
-}
-
-.tag-entry .entry-cover {
-    display: none;
-}
-
-.entry-header h2 {
-    font-size: 24px;
-    line-height: 1.3;
-}
-
-.entry-content {
-    margin: 8px 0;
-    color: var(--secondary);
-    font-size: 14px;
-    line-height: 1.6;
-    overflow: hidden;
-    display: -webkit-box;
-    -webkit-box-orient: vertical;
-    -webkit-line-clamp: 2;
-}
-
-.entry-footer {
-    color: var(--secondary);
-    font-size: 13px;
-}
-
-.entry-link {
-    position: absolute;
-    left: 0;
-    right: 0;
-    top: 0;
-    bottom: 0;
-}
-
-.entry-hint {
-    color: var(--secondary);
-}
-
-.entry-hint-parent {
-    display: flex;
-    justify-content: space-between;
-}
-
-.entry-cover {
-    font-size: 14px;
-    margin-bottom: var(--gap);
-    text-align: center;
-}
-
-.entry-cover img {
-    border-radius: var(--radius);
-    width: 100%;
-    height: auto;
-}
-
-.entry-cover a {
-    box-shadow: 0 1px 0 var(--primary);
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/post-single.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/post-single.css
deleted file mode 100644 (file)
index 8906c1f..0000000
+++ /dev/null
@@ -1,417 +0,0 @@
-.page-header,
-.post-header {
-    margin: 24px auto var(--content-gap) auto;
-}
-
-.post-title {
-    margin-bottom: 2px;
-    font-size: 40px;
-}
-
-.post-description {
-    margin-top: 10px;
-    margin-bottom: 5px;
-}
-
-.post-meta,
-.breadcrumbs {
-    color: var(--secondary);
-    font-size: 14px;
-}
-
-.breadcrumbs {
-    display: flex;
-    flex-wrap: wrap;
-    align-items: center;
-}
-
-.i18n_list {
-    display: inline-flex;
-}
-
-.post-meta .i18n_list li {
-    list-style: none;
-    margin: auto 3px;
-}
-
-.breadcrumbs a {
-    font-size: 16px;
-}
-
-.post-content {
-    color: var(--content);
-    margin: 30px 0;
-}
-
-.post-content h3,
-.post-content h4,
-.post-content h5,
-.post-content h6 {
-    margin: 24px 0 16px;
-}
-
-.post-content h1 {
-    margin: 40px auto 32px;
-    font-size: 40px;
-}
-
-.post-content h2 {
-    margin: 32px auto 24px;
-    font-size: 32px;
-}
-
-.post-content h3 {
-    font-size: 24px;
-}
-
-.post-content h4 {
-    font-size: 16px;
-}
-
-.post-content h5 {
-    font-size: 14px;
-}
-
-.post-content h6 {
-    font-size: 12px;
-}
-
-.post-content a,
-.post-meta .i18n_list li a,
-.toc a:hover {
-    box-shadow: 0 1px 0;
-    box-decoration-break: clone;
-    -webkit-box-decoration-break: clone;
-}
-
-.post-content a code {
-    margin: auto 0;
-    border-radius: 0;
-    box-shadow: 0 -1px 0 var(--primary) inset;
-}
-
-.post-content del {
-    text-decoration: line-through;
-}
-
-.post-content dl,
-.post-content ol,
-.post-content p,
-.post-content figure,
-.post-content ul {
-    margin-bottom: var(--content-gap);
-}
-
-.post-content ol,
-.post-content ul {
-    padding-inline-start: 20px;
-}
-
-.post-content li {
-    margin-top: 5px;
-}
-
-.post-content li p {
-    margin-bottom: 0;
-}
-
-.post-content dl {
-    display: flex;
-    flex-wrap: wrap;
-    margin: 0;
-}
-
-.post-content dt {
-    width: 25%;
-    font-weight: 700;
-}
-
-.post-content dd {
-    width: 75%;
-    margin-inline-start: 0;
-    padding-inline-start: 10px;
-}
-
-.post-content dd~dd,
-.post-content dt~dt {
-    margin-top: 10px;
-}
-
-.post-content table {
-    margin-bottom: var(--content-gap);
-}
-
-.post-content table th,
-.post-content table:not(.highlighttable, .highlight table, .gist .highlight) td {
-    min-width: 80px;
-    padding: 8px 5px;
-    line-height: 1.5;
-    border-bottom: 1px solid var(--border);
-}
-
-.post-content table th {
-    text-align: start;
-}
-
-.post-content table:not(.highlighttable) td code:only-child {
-    margin: auto 0;
-}
-
-.post-content .highlight table {
-    border-radius: var(--radius);
-}
-
-.post-content .highlight:not(table) {
-    margin: 10px auto;
-    background: var(--code-block-bg) !important;
-    border-radius: var(--radius);
-    direction: ltr;
-}
-
-.post-content li>.highlight {
-    margin-inline-end: 0;
-}
-
-.post-content ul pre {
-    margin-inline-start: calc(var(--gap) * -2);
-}
-
-.post-content .highlight pre {
-    margin: 0;
-}
-
-.post-content .highlighttable {
-    table-layout: fixed;
-}
-
-.post-content .highlighttable td:first-child {
-    width: 40px;
-}
-
-.post-content .highlighttable td .linenodiv {
-    padding-inline-end: 0 !important;
-}
-
-.post-content .highlighttable td .highlight,
-.post-content .highlighttable td .linenodiv pre {
-    margin-bottom: 0;
-}
-
-.post-content code {
-    margin: auto 4px;
-    padding: 4px 6px;
-    font-size: 0.78em;
-    line-height: 1.5;
-    background: var(--code-bg);
-    border-radius: 2px;
-}
-
-.post-content pre code {
-    display: grid;
-    margin: auto 0;
-    padding: 10px;
-    color: rgb(213, 213, 214);
-    background: var(--code-block-bg) !important;
-    border-radius: var(--radius);
-    overflow-x: auto;
-    word-break: break-all;
-}
-
-.post-content blockquote {
-    margin: 20px 0;
-    padding: 0 14px;
-    border-inline-start: 3px solid var(--primary);
-}
-
-.post-content hr {
-    margin: 30px 0;
-    height: 2px;
-    background: var(--tertiary);
-    border: 0;
-}
-
-.post-content iframe {
-    max-width: 100%;
-}
-
-.post-content img {
-    border-radius: 4px;
-    margin: 1rem 0;
-}
-
-.post-content img[src*="#center"] {
-    margin: 1rem auto;
-}
-
-.post-content figure.align-center {
-    text-align: center;
-}
-
-.post-content figure>figcaption {
-    color: var(--primary);
-    font-size: 16px;
-    font-weight: bold;
-    margin: 8px 0 16px;
-}
-
-.post-content figure>figcaption>p {
-    color: var(--secondary);
-    font-size: 14px;
-    font-weight: normal;
-}
-
-.toc {
-    margin-bottom: var(--content-gap);
-    border: 1px solid var(--border);
-    background: var(--code-bg);
-    border-radius: var(--radius);
-    padding: 0.4em;
-}
-
-[data-theme="dark"] .toc {
-    background: var(--entry);
-}
-
-.toc details summary {
-    cursor: zoom-in;
-    margin-inline-start: 10px;
-    user-select: none;
-}
-
-.toc details[open] summary {
-    cursor: zoom-out;
-}
-
-.toc .details {
-    display: inline;
-    font-weight: 500;
-}
-
-.toc .inner {
-    margin: 5px 20px;
-    padding: 0 10px;
-    opacity: 0.9;
-}
-
-.toc li ul {
-    margin-inline-start: var(--gap);
-}
-
-.toc summary:focus {
-    outline: 0;
-}
-
-.post-footer {
-    margin-top: var(--content-gap);
-}
-
-.post-footer>* {
-    margin-bottom: 10px;
-}
-
-.post-tags {
-    display: flex;
-    flex-wrap: wrap;
-    gap: 10px;
-}
-
-.post-tags li {
-    display: inline-block;
-}
-
-.post-tags a,
-.share-buttons,
-.paginav {
-    border-radius: var(--radius);
-    background: var(--code-bg);
-    border: 1px solid var(--border);
-}
-
-.post-tags a {
-    display: block;
-    padding: 0 14px;
-    color: var(--secondary);
-    font-size: 14px;
-    line-height: 34px;
-    background: var(--code-bg);
-}
-
-.post-tags a:hover,
-.paginav a:hover {
-    background: var(--border);
-}
-
-.share-buttons {
-    padding: 10px;
-    display: flex;
-    justify-content: center;
-    overflow-x: auto;
-    gap: 10px;
-}
-
-.share-buttons li,
-.share-buttons a {
-    display: inline-flex;
-}
-
-.share-buttons a:not(:last-of-type) {
-    margin-inline-end: 12px;
-}
-
-h1:hover .anchor,
-h2:hover .anchor,
-h3:hover .anchor,
-h4:hover .anchor,
-h5:hover .anchor,
-h6:hover .anchor {
-    display: inline-flex;
-    color: var(--secondary);
-    margin-inline-start: 8px;
-    font-weight: 500;
-    user-select: none;
-}
-
-.paginav {
-    display: flex;
-    line-height: 30px;
-}
-
-.paginav a {
-    padding-inline-start: 14px;
-    padding-inline-end: 14px;
-    border-radius: var(--radius);
-}
-
-.paginav .title {
-    letter-spacing: 1px;
-    text-transform: uppercase;
-    font-size: small;
-    color: var(--secondary);
-}
-
-.paginav .prev,
-.paginav .next {
-    width: 50%;
-}
-
-.paginav span:hover:not(.title) {
-    box-shadow: 0 1px 0;
-}
-
-.paginav .next {
-    margin-inline-start: auto;
-    text-align: right;
-}
-
-[dir="rtl"] .paginav .next {
-    text-align: left;
-}
-
-h1>a>svg {
-    display: inline;
-}
-
-img.in-text {
-    display: inline;
-    margin: auto;
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/profile-mode.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/profile-mode.css
deleted file mode 100644 (file)
index 9e98df5..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-.buttons,
-.main .profile {
-    display: flex;
-    justify-content: center;
-}
-
-.main .profile {
-    align-items: center;
-    min-height: calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));
-    text-align: center;
-}
-
-.profile .profile_inner {
-    display: flex;
-    flex-direction: column;
-    align-items: center;
-    gap: 10px;
-}
-
-.profile img {
-    border-radius: 50%;
-}
-
-.buttons {
-    flex-wrap: wrap;
-    max-width: 400px;
-}
-
-.button {
-    background: var(--tertiary);
-    border-radius: var(--radius);
-    margin: 8px;
-    padding: 6px;
-    transition: transform 0.1s;
-}
-
-.button-inner {
-    padding: 0 8px;
-}
-
-.button:active {
-    transform: scale(0.96);
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/search.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/search.css
deleted file mode 100644 (file)
index 38d5b6b..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-#searchbox input {
-    padding: 4px 10px;
-    width: 100%;
-    color: var(--primary);
-    font-weight: bold;
-    border: 2px solid var(--tertiary);
-    border-radius: var(--radius);
-}
-
-#searchbox input:focus {
-    border-color: var(--secondary);
-}
-
-#searchResults li {
-    list-style: none;
-    border-radius: var(--radius);
-    padding: 10px;
-    margin: 10px 0;
-    position: relative;
-    font-weight: 500;
-}
-
-#searchResults {
-    margin: 10px 0;
-    width: 100%;
-}
-
-#searchResults li:active {
-    transition: transform 0.1s;
-    transform: scale(0.98);
-}
-
-#searchResults a {
-    position: absolute;
-    width: 100%;
-    height: 100%;
-    top: 0px;
-    left: 0px;
-    outline: none;
-}
-
-#searchResults .focus {
-    transform: scale(0.98);
-    border: 2px solid var(--tertiary);
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/terms.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/common/terms.css
deleted file mode 100644 (file)
index 244614b..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-.terms-tags li {
-    display: inline-block;
-    margin: 10px;
-    font-weight: 500;
-}
-
-.terms-tags a {
-    display: block;
-    padding: 3px 10px;
-    background: var(--tertiary);
-    border-radius: 6px;
-    transition: transform 0.1s;
-}
-
-.terms-tags a:active {
-    background: var(--tertiary);
-    transform: scale(0.96);
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/core/license.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/core/license.css
deleted file mode 100644 (file)
index 47b9c6f..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-/*
-  PaperMod v8+
-  License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE
-  Copyright (c) 2020 nanxiaobei and adityatelange
-  Copyright (c) 2021-2025 adityatelange
-*/
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/core/reset.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/core/reset.css
deleted file mode 100644 (file)
index 7393d57..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-*,
-::after,
-::before {
-    box-sizing: border-box;
-}
-
-html {
-    -webkit-tap-highlight-color: transparent;
-    overflow-y: scroll;
-    -webkit-text-size-adjust: 100%;
-    text-size-adjust: 100%;
-}
-
-a,
-button,
-body,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-    color: var(--primary);
-}
-
-body {
-    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
-    font-size: 18px;
-    line-height: 1.6;
-    word-break: break-word;
-    background: var(--theme);
-}
-
-article,
-aside,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-nav,
-section,
-table {
-    display: block;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
-    line-height: 1.2;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-p {
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-ul {
-    padding: 0;
-}
-
-a {
-    text-decoration: none;
-}
-
-body,
-figure,
-ul {
-    margin: 0;
-}
-
-table {
-    width: 100%;
-    border-collapse: collapse;
-    border-spacing: 0;
-    overflow-x: auto;
-    word-break: keep-all;
-}
-
-button,
-input,
-textarea {
-    padding: 0;
-    font: inherit;
-    background: 0 0;
-    border: 0;
-}
-
-input,
-textarea {
-    outline: 0;
-}
-
-button,
-input[type=button],
-input[type=submit] {
-    cursor: pointer;
-}
-
-input:-webkit-autofill,
-textarea:-webkit-autofill {
-    box-shadow: 0 0 0 50px var(--theme) inset;
-}
-
-img {
-    display: block;
-    max-width: 100%;
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/core/theme-vars.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/core/theme-vars.css
deleted file mode 100644 (file)
index 1ce34ef..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-:root {
-    --gap: 24px;
-    --content-gap: 20px;
-    --nav-width: 1024px;
-    --main-width: 720px;
-    --header-height: 60px;
-    --footer-height: 60px;
-    --radius: 8px;
-    --theme: rgb(255, 255, 255);
-    --entry: rgb(255, 255, 255);
-    --primary: rgb(30, 30, 30);
-    --secondary: rgb(108, 108, 108);
-    --tertiary: rgb(214, 214, 214);
-    --content: rgb(31, 31, 31);
-    --code-block-bg: rgb(28, 29, 33);
-    --code-bg: rgb(245, 245, 245);
-    --border: rgb(238, 238, 238);
-    color-scheme: light;
-}
-
-:root[data-theme="dark"] {
-    --theme: rgb(29, 30, 32);
-    --entry: rgb(46, 46, 51);
-    --primary: rgb(218, 218, 219);
-    --secondary: rgb(155, 156, 157);
-    --tertiary: rgb(65, 66, 68);
-    --content: rgb(196, 196, 197);
-    --code-block-bg: rgb(46, 46, 51);
-    --code-bg: rgb(55, 56, 62);
-    --border: rgb(51, 51, 51);
-    color-scheme: dark;
-}
-
-.list {
-    background: var(--code-bg);
-}
-
-[data-theme="dark"] .list {
-    background: var(--theme);
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/core/zmedia.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/core/zmedia.css
deleted file mode 100644 (file)
index a68fd71..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-@media screen and (max-width: 768px) {
-    /* theme-vars */
-    :root {
-        --gap: 14px;
-    }
-
-    /* profile-mode */
-    .profile img {
-        transform: scale(0.85);
-    }
-
-    /* post-entry */
-    .first-entry {
-        min-height: 260px;
-    }
-
-    /* archive */
-    .archive-month {
-        flex-direction: column;
-    }
-
-    .archive-year {
-        margin-top: 20px;
-    }
-
-    /* footer */
-    .footer {
-        padding: calc((var(--footer-height) - var(--gap) - 10px) / 2) var(--gap);
-    }
-}
-
-/* footer */
-@media screen and (max-width: 900px) {
-    .list .top-link {
-        transform: translateY(-5rem);
-    }
-}
-
-@media screen and (max-width: 340px) {
-    .share-buttons {
-        justify-content: unset;
-    }
-}
-
-@media (prefers-reduced-motion) {
-    /* terms; profile-mode; post-single; post-entry; post-entry; search; search */
-    .terms-tags a:active,
-    .button:active,
-    .post-entry:active,
-    .top-link,
-    #searchResults .focus,
-    #searchResults li:active {
-        transform: none;
-    }
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/extended/blank.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/extended/blank.css
deleted file mode 100644 (file)
index 9e2469d..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
-This is just a placeholder blank stylesheet so as to support adding custom styles budled with theme's default styles
-
-Read https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#bundling-custom-css-with-themes-assets for more info
-*/
-
-body {
-       font-family: 'Lexend', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
-       font-size: 18px;
-       line-height: 1.6;
-       word-break: break-word;
-       background: var(--theme);
-}
-
-.gallery {
-       display: flex;
-       flex-wrap: wrap;
-}
-.gallery figure,
-.gallery figure img {
-       text-align: center;
-}
-.gallery figure img {
-       margin: 1rem auto;
-}
-.gallery-cols-1 figure {
-       width: 100%;
-}
-.gallery-cols-2 figure {
-       width: 50%;
-}
-.gallery-cols-3 figure {
-       width: 33.3333333333%;
-}
-.gallery-cols-4 figure {
-       width: 25%;
-}
-.gallery-cols-5 figure {
-       width: 25%;
-}
-.gallery-cols-6 figure {
-       width: 16.666666666%;
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/includes/chroma-mod.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/includes/chroma-mod.css
deleted file mode 100644 (file)
index ad89b96..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-.chroma {
-    background-color: unset !important;
-}
-
-.chroma .hl {
-    display: flex;
-}
-
-.chroma .lnt {
-    padding: 0 0 0 12px;
-}
-
-.highlight pre.chroma code {
-    padding: 8px 0;
-}
-
-.highlight pre.chroma .line .cl,
-.chroma .ln {
-    padding: 0 10px;
-}
-
-.chroma .lntd:last-of-type {
-    width: 100%;
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/includes/chroma-styles.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/includes/chroma-styles.css
deleted file mode 100644 (file)
index 63a73ab..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/* Background */ .bg { color: #cad3f5; background-color: #24273a; }
-/* PreWrapper */ .chroma { color: #cad3f5; background-color: #24273a; }
-/* Other */ .chroma .x {  }
-/* Error */ .chroma .err { color: #ed8796 }
-/* CodeLine */ .chroma .cl {  }
-/* LineLink */ .chroma .lnlinks { outline: none; text-decoration: none; color: inherit }
-/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
-/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
-/* LineHighlight */ .chroma .hl { background-color: #474733 }
-/* LineNumbersTable */ .chroma .lnt { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #8087a2 }
-/* LineNumbers */ .chroma .ln { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #8087a2 }
-/* Line */ .chroma .line { display: flex; }
-/* Keyword */ .chroma .k { color: #c6a0f6 }
-/* KeywordConstant */ .chroma .kc { color: #f5a97f }
-/* KeywordDeclaration */ .chroma .kd { color: #ed8796 }
-/* KeywordNamespace */ .chroma .kn { color: #8bd5ca }
-/* KeywordPseudo */ .chroma .kp { color: #c6a0f6 }
-/* KeywordReserved */ .chroma .kr { color: #c6a0f6 }
-/* KeywordType */ .chroma .kt { color: #ed8796 }
-/* Name */ .chroma .n {  }
-/* NameAttribute */ .chroma .na { color: #8aadf4 }
-/* NameBuiltin */ .chroma .nb { color: #91d7e3 }
-/* NameBuiltinPseudo */ .chroma .bp { color: #91d7e3 }
-/* NameClass */ .chroma .nc { color: #eed49f }
-/* NameConstant */ .chroma .no { color: #eed49f }
-/* NameDecorator */ .chroma .nd { color: #8aadf4; font-weight: bold }
-/* NameEntity */ .chroma .ni { color: #8bd5ca }
-/* NameException */ .chroma .ne { color: #f5a97f }
-/* NameFunction */ .chroma .nf { color: #8aadf4 }
-/* NameFunctionMagic */ .chroma .fm { color: #8aadf4 }
-/* NameLabel */ .chroma .nl { color: #91d7e3 }
-/* NameNamespace */ .chroma .nn { color: #f5a97f }
-/* NameOther */ .chroma .nx {  }
-/* NameProperty */ .chroma .py { color: #f5a97f }
-/* NameTag */ .chroma .nt { color: #c6a0f6 }
-/* NameVariable */ .chroma .nv { color: #f4dbd6 }
-/* NameVariableClass */ .chroma .vc { color: #f4dbd6 }
-/* NameVariableGlobal */ .chroma .vg { color: #f4dbd6 }
-/* NameVariableInstance */ .chroma .vi { color: #f4dbd6 }
-/* NameVariableMagic */ .chroma .vm { color: #f4dbd6 }
-/* Literal */ .chroma .l {  }
-/* LiteralDate */ .chroma .ld {  }
-/* LiteralString */ .chroma .s { color: #a6da95 }
-/* LiteralStringAffix */ .chroma .sa { color: #ed8796 }
-/* LiteralStringBacktick */ .chroma .sb { color: #a6da95 }
-/* LiteralStringChar */ .chroma .sc { color: #a6da95 }
-/* LiteralStringDelimiter */ .chroma .dl { color: #8aadf4 }
-/* LiteralStringDoc */ .chroma .sd { color: #6e738d }
-/* LiteralStringDouble */ .chroma .s2 { color: #a6da95 }
-/* LiteralStringEscape */ .chroma .se { color: #8aadf4 }
-/* LiteralStringHeredoc */ .chroma .sh { color: #6e738d }
-/* LiteralStringInterpol */ .chroma .si { color: #a6da95 }
-/* LiteralStringOther */ .chroma .sx { color: #a6da95 }
-/* LiteralStringRegex */ .chroma .sr { color: #8bd5ca }
-/* LiteralStringSingle */ .chroma .s1 { color: #a6da95 }
-/* LiteralStringSymbol */ .chroma .ss { color: #a6da95 }
-/* LiteralNumber */ .chroma .m { color: #f5a97f }
-/* LiteralNumberBin */ .chroma .mb { color: #f5a97f }
-/* LiteralNumberFloat */ .chroma .mf { color: #f5a97f }
-/* LiteralNumberHex */ .chroma .mh { color: #f5a97f }
-/* LiteralNumberInteger */ .chroma .mi { color: #f5a97f }
-/* LiteralNumberIntegerLong */ .chroma .il { color: #f5a97f }
-/* LiteralNumberOct */ .chroma .mo { color: #f5a97f }
-/* Operator */ .chroma .o { color: #91d7e3; font-weight: bold }
-/* OperatorWord */ .chroma .ow { color: #91d7e3; font-weight: bold }
-/* Punctuation */ .chroma .p {  }
-/* Comment */ .chroma .c { color: #6e738d; font-style: italic }
-/* CommentHashbang */ .chroma .ch { color: #6e738d; font-style: italic }
-/* CommentMultiline */ .chroma .cm { color: #6e738d; font-style: italic }
-/* CommentSingle */ .chroma .c1 { color: #6e738d; font-style: italic }
-/* CommentSpecial */ .chroma .cs { color: #6e738d; font-style: italic }
-/* CommentPreproc */ .chroma .cp { color: #6e738d; font-style: italic }
-/* CommentPreprocFile */ .chroma .cpf { color: #6e738d; font-weight: bold; font-style: italic }
-/* Generic */ .chroma .g {  }
-/* GenericDeleted */ .chroma .gd { color: #ed8796; background-color: #363a4f }
-/* GenericEmph */ .chroma .ge { font-style: italic }
-/* GenericError */ .chroma .gr { color: #ed8796 }
-/* GenericHeading */ .chroma .gh { color: #f5a97f; font-weight: bold }
-/* GenericInserted */ .chroma .gi { color: #a6da95; background-color: #363a4f }
-/* GenericOutput */ .chroma .go {  }
-/* GenericPrompt */ .chroma .gp {  }
-/* GenericStrong */ .chroma .gs { font-weight: bold }
-/* GenericSubheading */ .chroma .gu { color: #f5a97f; font-weight: bold }
-/* GenericTraceback */ .chroma .gt { color: #ed8796 }
-/* GenericUnderline */ .chroma .gl { text-decoration: underline }
-/* TextWhitespace */ .chroma .w {  }
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/includes/scroll-bar.css b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/css/includes/scroll-bar.css
deleted file mode 100644 (file)
index e88430b..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/* from reset */
-::-webkit-scrollbar-track {
-    background: 0 0;
-}
-
-::-webkit-scrollbar-thumb {
-    background: var(--tertiary);
-    border: 5px solid var(--theme);
-    border-radius: var(--radius);
-}
-
-[data-theme="light"] .list::-webkit-scrollbar-thumb {
-    border: 5px solid var(--code-bg);
-}
-
-::-webkit-scrollbar-thumb:hover {
-    background: var(--secondary);
-}
-
-::-webkit-scrollbar:not(.highlighttable, .highlight table, .gist .highlight) {
-    background: var(--theme);
-}
-
-/* from post-single */
-.post-content .highlighttable td .highlight pre code::-webkit-scrollbar {
-    display: none;
-}
-
-.post-content :not(table) ::-webkit-scrollbar-thumb {
-    border: 2px solid var(--code-block-bg);
-    background: rgb(113, 113, 117);
-}
-
-.post-content :not(table) ::-webkit-scrollbar-thumb:hover {
-    background: rgb(163, 163, 165);
-}
-
-.gist table::-webkit-scrollbar-thumb {
-    border: 2px solid rgb(255, 255, 255);
-    background: rgb(173, 173, 173);
-}
-
-.gist table::-webkit-scrollbar-thumb:hover {
-    background: rgb(112, 112, 112);
-}
-
-.post-content table::-webkit-scrollbar-thumb {
-    border-width: 2px;
-}
-
-/* from zmedia */
-@media screen and (min-width: 768px) {
-
-    /* reset */
-    ::-webkit-scrollbar {
-        width: 19px;
-        height: 11px;
-    }
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/js/fastsearch.js b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/js/fastsearch.js
deleted file mode 100644 (file)
index 9484e75..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-import * as params from '@params';
-
-let fuse; // holds our search engine
-let resList = document.getElementById('searchResults');
-let sInput = document.getElementById('searchInput');
-let first, last, current_elem = null
-let resultsAvailable = false;
-
-// load our search index
-window.onload = function () {
-    let xhr = new XMLHttpRequest();
-    xhr.onreadystatechange = function () {
-        if (xhr.readyState === 4) {
-            if (xhr.status === 200) {
-                let data = JSON.parse(xhr.responseText);
-                if (data) {
-                    // fuse.js options; check fuse.js website for details
-                    let options = {
-                        distance: 100,
-                        threshold: 0.4,
-                        ignoreLocation: true,
-                        keys: [
-                            'title',
-                            'permalink',
-                            'summary',
-                            'content'
-                        ]
-                    };
-                    if (params.fuseOpts) {
-                        options = {
-                            isCaseSensitive: params.fuseOpts.iscasesensitive ?? false,
-                            includeScore: params.fuseOpts.includescore ?? false,
-                            includeMatches: params.fuseOpts.includematches ?? false,
-                            minMatchCharLength: params.fuseOpts.minmatchcharlength ?? 1,
-                            shouldSort: params.fuseOpts.shouldsort ?? true,
-                            findAllMatches: params.fuseOpts.findallmatches ?? false,
-                            keys: params.fuseOpts.keys ?? ['title', 'permalink', 'summary', 'content'],
-                            location: params.fuseOpts.location ?? 0,
-                            threshold: params.fuseOpts.threshold ?? 0.4,
-                            distance: params.fuseOpts.distance ?? 100,
-                            ignoreLocation: params.fuseOpts.ignorelocation ?? true
-                        }
-                    }
-                    fuse = new Fuse(data, options); // build the index from the json file
-                }
-            } else {
-                console.log(xhr.responseText);
-            }
-        }
-    };
-    xhr.open('GET', "../index.json");
-    xhr.send();
-}
-
-function activeToggle(ae) {
-    document.querySelectorAll('.focus').forEach(function (element) {
-        // rm focus class
-        element.classList.remove("focus")
-    });
-    if (ae) {
-        ae.focus()
-        document.activeElement = current_elem = ae;
-        ae.parentElement.classList.add("focus")
-    } else {
-        document.activeElement.parentElement.classList.add("focus")
-    }
-}
-
-function reset() {
-    resultsAvailable = false;
-    resList.innerHTML = sInput.value = ''; // clear inputbox and searchResults
-    sInput.focus(); // shift focus to input box
-}
-
-// execute search as each character is typed
-sInput.onkeyup = function (e) {
-    // run a search query (for "term") every time a letter is typed
-    // in the search box
-    if (fuse) {
-        let results;
-        if (params.fuseOpts) {
-            results = fuse.search(this.value.trim(), {limit: params.fuseOpts.limit}); // the actual query being run using fuse.js along with options
-        } else {
-            results = fuse.search(this.value.trim()); // the actual query being run using fuse.js
-        }
-        if (results.length !== 0) {
-            // build our html if result exists
-            let resultSet = ''; // our results bucket
-
-            for (let item in results) {
-                resultSet += `<li class="post-entry"><header class="entry-header">${results[item].item.title}&nbsp;»</header>` +
-                    `<a href="${results[item].item.permalink}" aria-label="${results[item].item.title}"></a></li>`
-            }
-
-            resList.innerHTML = resultSet;
-            resultsAvailable = true;
-            first = resList.firstChild;
-            last = resList.lastChild;
-        } else {
-            resultsAvailable = false;
-            resList.innerHTML = '';
-        }
-    }
-}
-
-sInput.addEventListener('search', function (e) {
-    // clicked on x
-    if (!this.value) reset()
-})
-
-// kb bindings
-document.onkeydown = function (e) {
-    let key = e.key;
-    let ae = document.activeElement;
-
-    let inbox = document.getElementById("searchbox").contains(ae)
-
-    if (ae === sInput) {
-        let elements = document.getElementsByClassName('focus');
-        while (elements.length > 0) {
-            elements[0].classList.remove('focus');
-        }
-    } else if (current_elem) ae = current_elem;
-
-    if (key === "Escape") {
-        reset()
-    } else if (!resultsAvailable || !inbox) {
-        return
-    } else if (key === "ArrowDown") {
-        e.preventDefault();
-        if (ae == sInput) {
-            // if the currently focused element is the search input, focus the <a> of first <li>
-            activeToggle(resList.firstChild.lastChild);
-        } else if (ae.parentElement != last) {
-            // if the currently focused element's parent is last, do nothing
-            // otherwise select the next search result
-            activeToggle(ae.parentElement.nextSibling.lastChild);
-        }
-    } else if (key === "ArrowUp") {
-        e.preventDefault();
-        if (ae.parentElement == first) {
-            // if the currently focused element is first item, go to input box
-            activeToggle(sInput);
-        } else if (ae != sInput) {
-            // if the currently focused element is input box, do nothing
-            // otherwise select the previous search result
-            activeToggle(ae.parentElement.previousSibling.lastChild);
-        }
-    } else if (key === "ArrowRight") {
-        ae.click(); // click on active link
-    }
-}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/js/fuse.basic.min.js b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/js/fuse.basic.min.js
deleted file mode 100644 (file)
index 7457721..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/**
- * Fuse.js v7.0.0 - Lightweight fuzzy-search (http://fusejs.io)
- *
- * Copyright (c) 2023 Kiro Risk (http://kiro.me)
- * All Rights Reserved. Apache Software License 2.0
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- */
-var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?e(Object(r),!0).forEach((function(e){a(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):e(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,h(r.key),r)}}function o(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}function a(e,t,n){return(t=h(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function c(e){return function(e){if(Array.isArray(e))return s(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function h(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}function u(e){return Array.isArray?Array.isArray(e):"[object Array]"===m(e)}var l=1/0;function d(e){return null==e?"":function(e){if("string"==typeof e)return e;var t=e+"";return"0"==t&&1/e==-l?"-0":t}(e)}function f(e){return"string"==typeof e}function v(e){return"number"==typeof e}function g(e){return!0===e||!1===e||function(e){return function(e){return"object"===n(e)}(e)&&null!==e}(e)&&"[object Boolean]"==m(e)}function y(e){return null!=e}function p(e){return!e.trim().length}function m(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}var b=function(e){return"Missing ".concat(e," property in key")},k=function(e){return"Property 'weight' in key '".concat(e,"' must be a positive integer")},M=Object.prototype.hasOwnProperty,w=function(){function e(t){var n=this;r(this,e),this._keys=[],this._keyMap={};var i=0;t.forEach((function(e){var t=x(e);n._keys.push(t),n._keyMap[t.id]=t,i+=t.weight})),this._keys.forEach((function(e){e.weight/=i}))}return o(e,[{key:"get",value:function(e){return this._keyMap[e]}},{key:"keys",value:function(){return this._keys}},{key:"toJSON",value:function(){return JSON.stringify(this._keys)}}]),e}();function x(e){var t=null,n=null,r=null,i=1,o=null;if(f(e)||u(e))r=e,t=L(e),n=S(e);else{if(!M.call(e,"name"))throw new Error(b("name"));var a=e.name;if(r=a,M.call(e,"weight")&&(i=e.weight)<=0)throw new Error(k(a));t=L(a),n=S(a),o=e.getFn}return{path:t,id:n,weight:i,src:r,getFn:o}}function L(e){return u(e)?e:e.split(".")}function S(e){return u(e)?e.join("."):e}var _={useExtendedSearch:!1,getFn:function(e,t){var n=[],r=!1;return function e(t,i,o){if(y(t))if(i[o]){var a=t[i[o]];if(!y(a))return;if(o===i.length-1&&(f(a)||v(a)||g(a)))n.push(d(a));else if(u(a)){r=!0;for(var c=0,s=a.length;c<s;c+=1)e(a[c],i,o+1)}else i.length&&e(a,i,o+1)}else n.push(t)}(e,f(t)?t.split("."):t,0),r?n:n[0]},ignoreLocation:!1,ignoreFieldNorm:!1,fieldNormWeight:1},O=t(t(t(t({},{isCaseSensitive:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:function(e,t){return e.score===t.score?e.idx<t.idx?-1:1:e.score<t.score?-1:1}}),{includeMatches:!1,findAllMatches:!1,minMatchCharLength:1}),{location:0,threshold:.6,distance:100}),_),j=/[^ ]+/g,A=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?O.getFn:n,o=t.fieldNormWeight,a=void 0===o?O.fieldNormWeight:o;r(this,e),this.norm=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(j).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),a=parseFloat(Math.round(o*r)/r);return n.set(i,a),a},clear:function(){n.clear()}}}(a,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,f(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();f(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t<n;t+=1)this.records[t].i-=1}},{key:"getValueForItemAtKeyId",value:function(e,t){return e[this._keysMap[t]]}},{key:"size",value:function(){return this.records.length}},{key:"_addString",value:function(e,t){if(y(e)&&!p(e)){var n={v:e,i:t,n:this.norm.get(e)};this.records.push(n)}}},{key:"_addObject",value:function(e,t){var n=this,r={i:t,$:{}};this.keys.forEach((function(t,i){var o=t.getFn?t.getFn(e):n.getFn(e,t.path);if(y(o))if(u(o)){for(var a=[],c=[{nestedArrIndex:-1,value:o}];c.length;){var s=c.pop(),h=s.nestedArrIndex,l=s.value;if(y(l))if(f(l)&&!p(l)){var d={v:l,i:h,n:n.norm.get(l)};a.push(d)}else u(l)&&l.forEach((function(e,t){c.push({nestedArrIndex:t,value:e})}))}r.$[i]=a}else if(f(o)&&!p(o)){var v={v:o,n:n.norm.get(o)};r.$[i]=v}})),this.records.push(r)}},{key:"toJSON",value:function(){return{keys:this.keys,records:this.records}}}]),e}();function E(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?O.getFn:r,o=n.fieldNormWeight,a=void 0===o?O.fieldNormWeight:o,c=new A({getFn:i,fieldNormWeight:a});return c.setKeys(e.map(x)),c.setSources(t),c.create(),c}function I(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,a=t.expectedLocation,c=void 0===a?0:a,s=t.distance,h=void 0===s?O.distance:s,u=t.ignoreLocation,l=void 0===u?O.ignoreLocation:u,d=r/e.length;if(l)return d;var f=Math.abs(c-o);return h?d+f/h:f?1:d}var F=32;function C(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?O.location:i,a=r.distance,c=void 0===a?O.distance:a,s=r.threshold,h=void 0===s?O.threshold:s,u=r.findAllMatches,l=void 0===u?O.findAllMatches:u,d=r.minMatchCharLength,f=void 0===d?O.minMatchCharLength:d,v=r.includeMatches,g=void 0===v?O.includeMatches:v,y=r.ignoreLocation,p=void 0===y?O.ignoreLocation:y;if(t.length>F)throw new Error("Pattern length exceeds max of ".concat(F,"."));for(var m,b=t.length,k=e.length,M=Math.max(0,Math.min(o,k)),w=h,x=M,L=f>1||g,S=L?Array(k):[];(m=e.indexOf(t,x))>-1;){var _=I(t,{currentLocation:m,expectedLocation:M,distance:c,ignoreLocation:p});if(w=Math.min(_,w),x=m+b,L)for(var j=0;j<b;)S[m+j]=1,j+=1}x=-1;for(var A=[],E=1,C=b+k,N=1<<b-1,P=0;P<b;P+=1){for(var W=0,T=C;W<T;)I(t,{errors:P,currentLocation:M+T,expectedLocation:M,distance:c,ignoreLocation:p})<=w?W=T:C=T,T=Math.floor((C-W)/2+W);C=T;var $=Math.max(1,M-T+1),D=l?k:Math.min(M+T,k)+b,K=Array(D+2);K[D+1]=(1<<P)-1;for(var z=D;z>=$;z-=1){var J=z-1,R=n[e.charAt(J)];if(L&&(S[J]=+!!R),K[z]=(K[z+1]<<1|1)&R,P&&(K[z]|=(A[z+1]|A[z])<<1|1|A[z+1]),K[z]&N&&(E=I(t,{errors:P,currentLocation:J,expectedLocation:M,distance:c,ignoreLocation:p}))<=w){if(w=E,(x=J)<=M)break;$=Math.max(1,2*M-x)}}if(I(t,{errors:P+1,currentLocation:M,expectedLocation:M,distance:c,ignoreLocation:p})>w)break;A=K}var U={isMatch:x>=0,score:Math.max(.001,E)};if(L){var B=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:O.minMatchCharLength,n=[],r=-1,i=-1,o=0,a=e.length;o<a;o+=1){var c=e[o];c&&-1===r?r=o:c||-1===r||((i=o-1)-r+1>=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}(S,f);B.length?g&&(U.indices=B):U.isMatch=!1}return U}function N(e){for(var t={},n=0,r=e.length;n<r;n+=1){var i=e.charAt(n);t[i]=(t[i]||0)|1<<r-n-1}return t}var P=function(){function e(t){var n=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,a=void 0===o?O.location:o,c=i.threshold,s=void 0===c?O.threshold:c,h=i.distance,u=void 0===h?O.distance:h,l=i.includeMatches,d=void 0===l?O.includeMatches:l,f=i.findAllMatches,v=void 0===f?O.findAllMatches:f,g=i.minMatchCharLength,y=void 0===g?O.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?O.isCaseSensitive:p,b=i.ignoreLocation,k=void 0===b?O.ignoreLocation:b;if(r(this,e),this.options={location:a,threshold:s,distance:u,includeMatches:d,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:k},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var M=function(e,t){n.chunks.push({pattern:e,alphabet:N(e),startIndex:t})},w=this.pattern.length;if(w>F){for(var x=0,L=w%F,S=w-L;x<S;)M(this.pattern.substr(x,F),x),x+=F;if(L){var _=w-F;M(this.pattern.substr(_),_)}}else M(this.pattern,0)}}return o(e,[{key:"searchIn",value:function(e){var t=this.options,n=t.isCaseSensitive,r=t.includeMatches;if(n||(e=e.toLowerCase()),this.pattern===e){var i={isMatch:!0,score:0};return r&&(i.indices=[[0,e.length-1]]),i}var o=this.options,a=o.location,s=o.distance,h=o.threshold,u=o.findAllMatches,l=o.minMatchCharLength,d=o.ignoreLocation,f=[],v=0,g=!1;this.chunks.forEach((function(t){var n=t.pattern,i=t.alphabet,o=t.startIndex,y=C(e,n,i,{location:a+o,distance:s,threshold:h,findAllMatches:u,minMatchCharLength:l,includeMatches:r,ignoreLocation:d}),p=y.isMatch,m=y.score,b=y.indices;p&&(g=!0),v+=m,p&&b&&(f=[].concat(c(f),c(b)))}));var y={isMatch:g,score:g?v/this.chunks.length:1};return g&&r&&(y.indices=f),y}}]),e}(),W=[];function T(e,t){for(var n=0,r=W.length;n<r;n+=1){var i=W[n];if(i.condition(e,t))return new i(e,t)}return new P(e,t)}function $(e,t){var n=e.matches;t.matches=[],y(n)&&n.forEach((function(e){if(y(e.indices)&&e.indices.length){var n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.src),e.idx>-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function D(e,t){t.score=e.score}var K=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;if(r(this,e),this.options=t(t({},O),i),this.options.useExtendedSearch)throw new Error("Extended search is not available");this._keyStore=new w(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof A))throw new Error("Incorrect 'index' type");this._myIndex=t||E(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){y(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n<r;n+=1){var i=this._docs[n];e(i,n)&&(this.removeAt(n),n-=1,r-=1,t.push(i))}return t}},{key:"removeAt",value:function(e){this._docs.splice(e,1),this._myIndex.removeAt(e)}},{key:"getIndex",value:function(){return this._myIndex}},{key:"search",value:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).limit,n=void 0===t?-1:t,r=this.options,i=r.includeMatches,o=r.includeScore,a=r.shouldSort,c=r.sortFn,s=r.ignoreFieldNorm,h=f(e)?f(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return function(e,t){var n=t.ignoreFieldNorm,r=void 0===n?O.ignoreFieldNorm:n;e.forEach((function(e){var t=1;e.matches.forEach((function(e){var n=e.key,i=e.norm,o=e.score,a=n?n.weight:null;t*=Math.pow(0===o&&a?Number.EPSILON:o,(a||1)*(r?1:i))})),e.score=t}))}(h,{ignoreFieldNorm:s}),a&&h.sort(c),v(n)&&n>-1&&(h=h.slice(0,n)),function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?O.includeMatches:r,o=n.includeScore,a=void 0===o?O.includeScore:o,c=[];return i&&c.push($),a&&c.push(D),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return c.length&&c.forEach((function(t){t(e,r)})),r}))}(h,this._docs,{includeMatches:i,includeScore:o})}},{key:"_searchStringList",value:function(e){var t=T(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(y(n)){var a=t.searchIn(n),c=a.isMatch,s=a.score,h=a.indices;c&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:h}]})}})),r}},{key:"_searchLogical",value:function(e){throw new Error("Logical search is not available")}},{key:"_searchObjectList",value:function(e){var t=this,n=T(e,this.options),r=this._myIndex,i=r.keys,o=r.records,a=[];return o.forEach((function(e){var r=e.$,o=e.i;if(y(r)){var s=[];i.forEach((function(e,i){s.push.apply(s,c(t._findMatches({key:e,value:r[i],searcher:n})))})),s.length&&a.push({idx:o,item:r,matches:s})}})),a}},{key:"_findMatches",value:function(e){var t=e.key,n=e.value,r=e.searcher;if(!y(n))return[];var i=[];if(u(n))n.forEach((function(e){var n=e.v,o=e.i,a=e.n;if(y(n)){var c=r.searchIn(n),s=c.isMatch,h=c.score,u=c.indices;s&&i.push({score:h,key:t,value:n,idx:o,norm:a,indices:u})}}));else{var o=n.v,a=n.n,c=r.searchIn(o),s=c.isMatch,h=c.score,l=c.indices;s&&i.push({score:h,key:t,value:o,norm:a,indices:l})}return i}}]),e}();return K.version="7.0.0",K.createIndex=E,K.parseIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?O.getFn:n,i=t.fieldNormWeight,o=void 0===i?O.fieldNormWeight:i,a=e.keys,c=e.records,s=new A({getFn:r,fieldNormWeight:o});return s.setKeys(a),s.setIndexRecords(c),s},K.config=O,K},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t();
\ No newline at end of file
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/assets/js/license.js b/generated-2025-11-21-17-29-08/themes/PaperMod/assets/js/license.js
deleted file mode 100644 (file)
index 47b9c6f..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-/*
-  PaperMod v8+
-  License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE
-  Copyright (c) 2020 nanxiaobei and adityatelange
-  Copyright (c) 2021-2025 adityatelange
-*/
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/go.mod b/generated-2025-11-21-17-29-08/themes/PaperMod/go.mod
deleted file mode 100644 (file)
index af95855..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-module github.com/adityatelange/hugo-PaperMod
-
-go 1.12
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ar.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ar.yaml
deleted file mode 100644 (file)
index 52990c2..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-- id: prev_page
-  translation: "السابق"
-
-- id: next_page
-  translation: "التالي"
-
-- id: read_time
-  translation:
-    one: "دقيقة واحدة"
-    two: "دقيقتان"
-    few: "بضع ثوان"
-    zero: "الآن"
-    other: "دقائق {{ .Count }}"
-
-- id: toc
-  translation: "فهرس المحتوى"
-
-- id: translations
-  translation: "ترجمات أخرى"
-  
-- id: home
-  translation: "الصفحة الرئيسية"
-
-- id: code_copied
-  translation: "تم النسخ!"
-
-- id: code_copy
-  translation: "نسخ الكود"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/be.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/be.yaml
deleted file mode 100644 (file)
index 22902ab..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-- id: prev_page
-  translation: "Папярэдняя"
-
-- id: next_page
-  translation: "Наступная"
-
-- id: read_time
-  translation:
-    zero: "0 хвілін"
-    one: "1 хвіліна"
-    few: "{{ .Count }} хвіліны"
-    many: "{{ .Count }} хвілін"
-    other: "{{ .Count }} хвілін"
-
-- id: words
-  translation:
-    zero: "няма слоў"
-    one: "1 слова"
-    few: "{{ .Count }} слова"
-    many: "{{ .Count }} слоў"
-    other: "{{ .Count }} слова"
-
-- id: toc
-  translation: "Змест"
-
-- id: translations
-  translation: "Пераклады"
-
-- id: home
-  translation: "Галоўная"
-
-- id: edit_post
-  translation: "Рэдагаваць"
-
-- id: code_copy
-  translation: "капіяваць"
-
-- id: code_copied
-  translation: "скапіявана!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/bg.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/bg.yaml
deleted file mode 100644 (file)
index 1e314af..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-- id: prev_page
-  translation: "Предишна страница"
-
-- id: next_page
-  translation: "Следваща страница"
-
-- id: read_time
-  translation:
-    one : "1 мин"
-    other: "{{ .Count }} мин"
-
-- id: toc
-  translation: "Съдържание"
-
-- id: translations
-  translation: "Преводи"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/bn.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/bn.yaml
deleted file mode 100644 (file)
index f42780f..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "পূর্ববর্তী"
-
-- id: next_page
-  translation: "পরবর্তী"
-
-- id: read_time
-  translation:
-    one : "১ মিনিট"
-    other: "{{ .Count }} মিনিট"
-    
-- id: words
-  translation:
-    one : "১ টি শব্দ"
-    other: "{{ .Count }} টি শব্দ"
-
-- id: toc
-  translation: "সূচিপত্র"
-
-- id: translations
-  translation: "অনুবাদসমূহ"
-
-- id: home
-  translation: "হোম"
-
-- id: edit_post
-  translation: "সম্পাদনা করুন"
-
-- id: code_copy
-  translation: "কপি করুন"
-
-- id: code_copied
-  translation: "কপি হয়েছে!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ca.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ca.yaml
deleted file mode 100644 (file)
index 15713e1..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-- id: prev_page
-  translation: "Pàgina anterior"
-
-- id: next_page
-  translation: "Pàgina següent"
-
-- id: read_time
-  translation:
-    one : "1 min"
-    other: "{{ .Count }} min"
-
-- id: toc
-  translation: "Taula de Continguts"
-
-- id: translations
-  translation: "Traduccions"
-
-- id: home
-  translation: "Inici"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ckb.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ckb.yaml
deleted file mode 100644 (file)
index 25789d1..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-- id: prev_page
-  translation: "پەڕەی پێشتر"
-
-- id: next_page
-  translation: "پەڕەی دواتر"
-
-- id: read_time
-  translation:
-    one : "1 خولەک"
-    other: "{{ .Count }} خولەک"
-
-- id: toc
-  translation: "پێڕست"
-
-- id: translations
-  translation: "وەرگێڕانەکان"
-
-- id: home
-  translation: "ماڵەوە"
-
-- id: code_copy
-  translation: "لەبەری بگرەوە"
-
-- id: code_copied
-  translation: "لەبەر گیرایەوە!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/cs.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/cs.yaml
deleted file mode 100644 (file)
index 058c3a1..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Předchozí"
-
-- id: next_page
-  translation: "Další"
-
-- id: read_time
-  translation:
-    one : "1 min"
-    other: "{{ .Count }} min"
-
-- id: words
-  translation:
-    one : "slovo"
-    other: "{{ .Count }} slov"
-
-- id: toc
-  translation: "Obsah"
-
-- id: translations
-  translation: "Překlady"
-
-- id: home
-  translation: "Domů"
-
-- id: edit_post
-  translation: "Upravit"
-
-- id: code_copy
-  translation: "kopírovat"
-
-- id: code_copied
-  translation: "zkopírováno!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/da.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/da.yaml
deleted file mode 100644 (file)
index 03b0abe..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-- id: prev_page
-  translation: "Forrige Side"
-
-- id: next_page
-  translation: "Næste Side"
-
-- id: read_time
-  translation:
-    one: "1 min"
-    other: "{{ .Count }} min"
-
-- id: toc
-  translation: "Indholdsfortegnelse"
-
-- id: translations
-  translation: "Oversættelser"
-
-- id: home
-  translation: "Start"
-
-- id: edit_post
-  translation: "Rediger"
-
-- id: code_copy
-  translation: "kopier"
-
-- id: code_copied
-  translation: "kopieret!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/de.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/de.yaml
deleted file mode 100644 (file)
index f64aad9..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Vorherige"
-
-- id: next_page
-  translation: "Nächste"
-
-- id: read_time
-  translation:
-    one: "1 Minute"
-    other: "{{ .Count }} Minuten"
-
-- id: words
-  translation:
-    one : "Wort"
-    other: "{{ .Count }} Wörter"
-
-- id: toc
-  translation: "Inhaltsverzeichnis"
-
-- id: translations
-  translation: "Übersetzungen"
-
-- id: home
-  translation: "Home"
-
-- id: edit_post
-  translation: "Bearbeiten"
-
-- id: code_copy
-  translation: "Kopieren"
-
-- id: code_copied
-  translation: "Kopiert!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/el.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/el.yaml
deleted file mode 100644 (file)
index 4257bac..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Προηγούμενο"
-
-- id: next_page
-  translation: "Επόμενο"
-
-- id: read_time
-  translation:
-    one: "1 λεπτό"
-    other: "{{ .Count }} λεπτά"
-
-- id: words
-  translation:
-    one: "λέξη"
-    other: "{{ .Count }} λέξεις"
-
-- id: toc
-  translation: "Πίνακας Περιεχομένων"
-
-- id: translations
-  translation: "Μεταφράσεις"
-
-- id: home
-  translation: "Αρχική"
-
-- id: edit_post
-  translation: "Επεξεργασία"
-
-- id: code_copy
-  translation: "αντιγραφή"
-
-- id: code_copied
-  translation: "αντιγράφηκε!"
\ No newline at end of file
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/en.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/en.yaml
deleted file mode 100644 (file)
index 3a1e215..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Prev"
-
-- id: next_page
-  translation: "Next"
-
-- id: read_time
-  translation:
-    one : "1 min"
-    other: "{{ .Count }} min"
-
-- id: words
-  translation:
-    one : "word"
-    other: "{{ .Count }} words"
-
-- id: toc
-  translation: "Table of Contents"
-
-- id: translations
-  translation: "Translations"
-
-- id: home
-  translation: "Home"
-
-- id: edit_post
-  translation: "Edit"
-
-- id: code_copy
-  translation: "copy"
-
-- id: code_copied
-  translation: "copied!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/eo.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/eo.yaml
deleted file mode 100644 (file)
index de5d744..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-- id: prev_page
-  translation: "antaŭa paĝo"
-
-- id: next_page
-  translation: "sekva paĝo"
-
-- id: read_time
-  translation:
-    one : "1 min"
-    other: "{{ .Count }} min"
-
-- id: toc
-  translation: "Enhavo"
-
-- id: translations
-  translation: "tradukoj"
-
-- id: home
-  translation: "ĉefpaĝo"
-
-- id: code_copy
-  translation: "kopii"
-
-- id: code_copied
-  translation: "kopiite!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/es.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/es.yaml
deleted file mode 100644 (file)
index 52a559c..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Anterior"
-
-- id: next_page
-  translation: "Siguiente"
-
-- id: read_time
-  translation:
-    one : "1 min"
-    other: "{{ .Count }} min"
-
-- id: words
-  translation:
-    one : "palabra"
-    other: "{{ .Count }} palabras"
-
-- id: toc
-  translation: "Tabla de Contenidos"
-
-- id: translations
-  translation: "Traducciones"
-
-- id: home
-  translation: "Inicio"
-
-- id: edit_post
-  translation: "Editar"
-
-- id: code_copy
-  translation: "copiar"
-
-- id: code_copied
-  translation: "¡copiado!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/fa.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/fa.yaml
deleted file mode 100644 (file)
index 3fd5927..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-- id: prev_page
-  translation: "صفحه قبلی"
-
-- id: next_page
-  translation: "صفحه بعدی"
-
-- id: read_time
-  translation:
-    one: "۱ دقیقه"
-    other: "{{ .Count }} دقیقه"
-
-- id: toc
-  translation: "فهرست مطالب"
-
-- id: translations
-  translation: "ترجمه ها"
-
-- id: home
-  translation: "خانه"
-
-- id: edit_post
-  translation: "ویرایش"
-
-- id: code_copy
-  translation: "کپی"
-
-- id: code_copied
-  translation: "کپی شد!"
\ No newline at end of file
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/fi.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/fi.yaml
deleted file mode 100644 (file)
index cbbf3c4..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Edellinen"
-
-- id: next_page
-  translation: "Seuraava"
-
-- id: read_time
-  translation:
-    one : "1 min"
-    other: "{{ .Count }} minuuttia"
-
-- id: words
-  translation:
-    one : "sana"
-    other: "{{ .Count }} sanaa"
-
-- id: toc
-  translation: "Sisällysluettelo"
-
-- id: translations
-  translation: "Käännökset"
-
-- id: home
-  translation: "Etusivu"
-
-- id: edit_post
-  translation: "Muokkaa"
-
-- id: code_copy
-  translation: "Kopioi"
-
-- id: code_copied
-  translation: "Kopioitu!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/fr.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/fr.yaml
deleted file mode 100644 (file)
index e48d8e9..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Précédent"
-
-- id: next_page
-  translation: "Suivant"
-
-- id: read_time
-  translation:
-    one : "1 min"
-    other: "{{ .Count }} min"
-
-- id: words
-  translation:
-    one : "mot"
-    other: "{{ .Count }} mots"
-
-- id: toc
-  translation: "Table des matières"
-
-- id: translations
-  translation: "Traductions"
-
-- id: home
-  translation: "Accueil"
-
-- id: edit_post
-  translation: "Modifier"
-
-- id: code_copy
-  translation: "Copier"
-
-- id: code_copied
-  translation: "Copié !"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/he.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/he.yaml
deleted file mode 100644 (file)
index 30c3e74..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "הקודם"
-
-- id: next_page
-  translation: "הבא"
-
-- id: read_time
-  translation:
-    one: "דקה אחת"
-    other: "{{ .Count }} דקות"
-
-- id: words
-  translation:
-    one: "מילה אחת"
-    other: "{{ .Count }} מילים"
-
-- id: toc
-  translation: "תוכן עניינים"
-
-- id: translations
-  translation: "תרגומים"
-
-- id: home
-  translation: "בית"
-
-- id: edit_post
-  translation: "ערוך"
-
-- id: code_copy
-  translation: "העתק"
-
-- id: code_copied
-  translation: "הועתק!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/hi.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/hi.yaml
deleted file mode 100644 (file)
index 681efdc..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-- id: prev_page
-  translation: "पिछला"
-
-- id: next_page
-  translation: "अगला"
-
-- id: read_time
-  translation:
-    one : "एक मिनट"
-    other: "{{ .Count }} मिनट"
-
-- id: edit_post
-  translation: "सुधारें"
-
-- id: toc
-  translation: "विषय - सूची"
-
-- id: translations
-  translation: "अनुवाद"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/hr.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/hr.yaml
deleted file mode 100644 (file)
index 2f2d228..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Prethodna stranica"
-
-- id: next_page
-  translation: "Sljedeća stranica"
-
-- id: read_time
-  translation:
-    one : "1 minuta"
-    other: "{{ .Count }} minute"
-
-- id: words
-  translation:
-    one : "riječ"
-    other: "{{ .Count }} riječi"
-
-- id: toc
-  translation: "Tablica Sadržaja"
-
-- id: translations
-  translation: "Prijevodi"
-
-- id: home
-  translation: "Početna stranica"
-
-- id: edit_post
-  translation: "Promjeni"
-
-- id: code_copy
-  translation: "kopiraj"
-
-- id: code_copied
-  translation: "kopirano!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/hu.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/hu.yaml
deleted file mode 100644 (file)
index a039dda..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-- id: prev_page
-  translation: "Előző oldal"
-
-- id: next_page
-  translation: "Következő oldal"
-
-- id: read_time
-  translation:
-    one: "1 perc"
-    other: "{{ .Count }} perc"
-
-- id: toc
-  translation: "Tartalomjegyzék"
-
-- id: translations
-  translation: "Fordítások"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/id.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/id.yaml
deleted file mode 100644 (file)
index 93d34f5..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Sebelumnya"
-
-- id: next_page
-  translation: "Selanjutnya"
-
-- id: read_time
-  translation:
-    one : "1 menit"
-    other: "{{ .Count }} menit"
-
-- id: words
-  translation:
-    one : "kata"
-    other: "{{ .Count }} kata"
-
-- id: toc
-  translation: "Daftar isi"
-
-- id: translations
-  translation: "Terjemahan"
-
-- id: home
-  translation: "Beranda"
-
-- id: edit_post
-  translation: "Sunting"
-
-- id: code_copy
-  translation: "salin"
-
-- id: code_copied
-  translation: "disalin!"
\ No newline at end of file
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/it.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/it.yaml
deleted file mode 100644 (file)
index c87c95d..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Precedente"
-
-- id: next_page
-  translation: "Successivo"
-
-- id: read_time
-  translation:
-    one: "1 minuto"
-    other: "{{ .Count }} minuti"
-
-- id: words
-  translation:
-    one : "parola"
-    other: "{{ .Count }} parole"
-
-- id: toc
-  translation: "Indice contenuti"
-
-- id: translations
-  translation: "Traduzioni"
-
-- id: home
-  translation: "Home"
-
-- id: edit_post
-  translation: "Modifica"
-
-- id: code_copy
-  translation: "copia"
-
-- id: code_copied
-  translation: "copiato!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ja.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ja.yaml
deleted file mode 100644 (file)
index 93948d3..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "前へ"
-
-- id: next_page
-  translation: "次へ"
-
-- id: read_time
-  translation:
-    one : "1 分"
-    other: "{{ .Count }} 分"
-
-- id: words
-  translation:
-    one: "文字"
-    other: "{{ .Count }} 文字"
-
-- id: toc
-  translation: "目次"
-
-- id: translations
-  translation: "言語"
-
-- id: home
-  translation: "ホーム"
-
-- id: edit_post
-  translation: "編集"
-
-- id: code_copy
-  translation: "コピー"
-
-- id: code_copied
-  translation: "コピーされました!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ko.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ko.yaml
deleted file mode 100644 (file)
index 777dd93..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "이전 페이지"
-
-- id: next_page
-  translation: "다음 페이지"
-
-- id: read_time
-  translation:
-    one : "1 분"
-    other: "{{ .Count }} 분"
-
-- id: words
-  translation:
-    one : "단어"
-    other: "{{ .Count }} 단어"
-
-- id: toc
-  translation: "목차"
-
-- id: translations
-  translation: "번역"
-
-- id: home
-  translation: "홈"
-
-- id: edit_post
-  translation: "편집"
-
-- id: code_copy
-  translation: "복사"
-
-- id: code_copied
-  translation: "복사 완료!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ku.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ku.yaml
deleted file mode 100644 (file)
index d1d30a5..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-- id: prev_page
-  translation: "Rûpela Paş"
-
-- id: next_page
-  translation: "Rûpela Pêş"
-
-- id: read_time
-  translation:
-    one : "1 xulek"
-    other: "{{ .Count }} xulek"
-
-- id: toc
-  translation: "Pêrist"
-
-- id: translations
-  translation: "Wergeran"
-
-- id: home
-  translation: "Xanî"
-
-- id: code_copy
-  translation: "Jê bigire"
-
-- id: code_copied
-  translation: "Hat jêgirtin!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/mn.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/mn.yaml
deleted file mode 100644 (file)
index dbce2ce..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-- id: prev_page
-  translation: "Ѳмнѳх"
-
-- id: next_page
-  translation: "Дараах"
-
-- id: read_time
-  translation:
-    one : "1 МИН"
-    other: "{{ .Count }} МИН"
-
-- id: toc
-  translation: "Агуулга"
-
-- id: translations
-  translation: "Орчуулга"
-
-- id: home
-  translation: "Нүүр"
-
-- id: code_copy
-  translation: "хуулах"
-
-- id: code_copied
-  translation: "хуулсан!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ms.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ms.yaml
deleted file mode 100644 (file)
index d8a9eff..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-- id: prev_page
-  translation: "Halaman Sebelumnya"
-
-- id: next_page
-  translation: "Halaman Seterusnya"
-
-- id: read_time
-  translation:
-    one: "1 minit"
-    other: "{{ .Count }} minit"
-
-- id: toc
-  translation: "Isi Kandungan"
-
-- id: translations
-  translation: "Terjemahan"
-
-- id: home
-  translation: "Home"
-
-- id: edit_post
-  translation: "Sunting"
-
-- id: code_copy
-  translation: "Salin"
-
-- id: code_copied
-  translation: "Disalin!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/nl.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/nl.yaml
deleted file mode 100644 (file)
index e9d06fa..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Vorige"
-
-- id: next_page
-  translation: "Volgende"
-
-- id: read_time
-  translation:
-      one: "1 min"
-      other: "{{ .Count }} min"
-
-- id: words
-  translation:
-    one : "woord"
-    other: "{{ .Count }} woorden"
-
-- id: toc
-  translation: "Inhoudsopgave"
-
-- id: translations
-  translation: "Vertalingen"
-
-- id: home
-  translation: "Startpagina"
-
-- id: edit_post
-  translation: "Bewerk"
-
-- id: code_copy
-  translation: "kopieer"
-
-- id: code_copied
-  translation: "gekopieerd!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/no.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/no.yaml
deleted file mode 100644 (file)
index 2400348..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Forrige Side"
-
-- id: next_page
-  translation: "Neste Side"
-
-- id: read_time
-  translation:
-    one: "1 min"
-    other: "{{ .Count }} min"
-
-- id: words
-  translation:
-    one: "ord"
-    other: "{{ .Count }} ord"
-
-- id: toc
-  translation: "Innholdsfortegnelse"
-
-- id: translations
-  translation: "Oversettelser"
-
-- id: home
-  translation: "Hjem"
-
-- id: edit_post
-  translation: "Rediger"
-
-- id: code_copy
-  translation: "Kopier"
-
-- id: code_copied
-  translation: "Kopiert!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/oc.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/oc.yaml
deleted file mode 100644 (file)
index 9292fd8..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Prec."
-
-- id: next_page
-  translation: "Seg."
-
-- id: read_time
-  translation:
-    one : "1 min"
-    other: "{{ .Count }} min"
-
-- id: words
-  translation:
-    one : "mot"
-    other: "{{ .Count }} motss"
-
-- id: toc
-  translation: "Taula de contengut"
-
-- id: translations
-  translation: "Traduccions"
-
-- id: home
-  translation: "Acuèlh"
-
-- id: edit_post
-  translation: "Modificar"
-
-- id: code_copy
-  translation: "copiar"
-
-- id: code_copied
-  translation: "copiat !"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/pa.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/pa.yaml
deleted file mode 100644 (file)
index 32192c5..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "ਪਿਛਲਾ"
-
-- id: next_page
-  translation: "ਅਗਲਾ"
-
-- id: read_time
-  translation:
-    one: "1 ਮਿੰਟ"
-    other: "{{ .Count }} ਮਿੰਟ"
-
-- id: words
-  translation:
-    one: "ਸ਼ਬਦ"
-    other: "{{ .Count }} ਸ਼ਬਦ"
-
-- id: toc
-  translation: "ਤਤਕਰਾ"
-
-- id: translations
-  translation: "ਅਨੁਵਾਦ"
-
-- id: home
-  translation: "ਘਰ"
-
-- id: edit_post
-  translation: "ਸੋਧ"
-
-- id: code_copy
-  translation: "ਕਾਪੀ"
-
-- id: code_copied
-  translation: "ਕਾਪੀ ਕੀਤੀ ਗਈ!!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/pl.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/pl.yaml
deleted file mode 100644 (file)
index 81b0e77..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Poprzednia"
-
-- id: next_page
-  translation: "Następna"
-
-- id: read_time
-  translation:
-      one: "1 min"
-      other: "{{ .Count }} min"
-
-- id: words
-  translation:
-    one : "słowo"
-    other: "{{ .Count }} słów"
-
-- id: toc
-  translation: "Spis treści"
-
-- id: translations
-  translation: "Tłumaczenia"
-
-- id: home
-  translation: "Strona Główna"
-
-- id: edit_post
-  translation: "Edytuj"
-
-- id: code_copy
-  translation: "Kopiuj"
-
-- id: code_copied
-  translation: "Skopiowano!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/pnb.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/pnb.yaml
deleted file mode 100644 (file)
index fa2f8a8..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "پِچھلا"
-
-- id: next_page
-  translation: "اگلا"
-
-- id: read_time
-  translation:
-    one: "ایک منٹ"
-    other: "مِنٹ {{ .Count }}"
-
-- id: words
-  translation:
-    one: "لفظ"
-    other: "لفظ {{ .Count }}"
-
-- id: toc
-  translation: "تتکرا"
-
-- id: translations
-  translation: "انوواد"
-
-- id: home
-  translation: "گھر"
-
-- id: edit_post
-  translation: "سودھ"
-
-- id: code_copy
-  translation: "کاپی"
-
-- id: code_copied
-  translation: "کاپی کیتی گئی!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/pt.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/pt.yaml
deleted file mode 100644 (file)
index ab06429..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Página Anterior"
-
-- id: next_page
-  translation: "Próxima Página"
-
-- id: read_time
-  translation:
-    one: "1 minuto"
-    other: "{{ .Count }} minutos"
-
-- id: words
-  translation:
-    one : "palavra"
-    other: "{{ .Count }} palavras"
-
-- id: toc
-  translation: "Conteúdo"
-
-- id: translations
-  translation: "Traduções"
-  
-- id: home
-  translation: "Início"
-
-- id: edit_post
-  translation: "Editar"
-
-- id: code_copy
-  translation: "copiar"
-
-- id: code_copied
-  translation: "copiado!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ro.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ro.yaml
deleted file mode 100644 (file)
index 694f20b..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Înapoi"
-
-- id: next_page
-  translation: "Înainte"
-
-- id: read_time
-  translation:
-    one : "1 minut"
-    other: "{{ .Count }} minute"
-
-- id: words
-  translation:
-    one : "cuvânt"
-    other: "{{ .Count }} cuvinte"
-
-- id: toc
-  translation: "Sumar"
-
-- id: translations
-  translation: "Traduceri"
-
-- id: home
-  translation: "Acasă"
-
-- id: edit_post
-  translation: "Editează"
-
-- id: code_copy
-  translation: "copiază"
-
-- id: code_copied
-  translation: "copiat!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ru.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/ru.yaml
deleted file mode 100644 (file)
index a5dbb5c..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-- id: prev_page
-  translation: "Предыдущая"
-
-- id: next_page
-  translation: "Следующая"
-
-- id: read_time
-  translation:
-    zero: "0 минут"
-    one: "1 минута"
-    few: "{{ .Count }} минуты"
-    many: "{{ .Count }} минут"
-    other: "{{ .Count }} минута"
-
-- id: words
-  translation:
-    zero: "0 слов"
-    one: "1 слово"
-    few: "{{ .Count }} слова"
-    many: "{{ .Count }} слов"
-    other: "{{ .Count }} слово"
-
-- id: toc
-  translation: "Оглавление"
-
-- id: translations
-  translation: "Переводы"
-
-- id: home
-  translation: "Главная"
-
-- id: edit_post
-  translation: "Редактировать"
-
-- id: code_copy
-  translation: "копировать"
-
-- id: code_copied
-  translation: "скопировано!"
\ No newline at end of file
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/sk.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/sk.yaml
deleted file mode 100644 (file)
index f129d37..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Predch"
-
-- id: next_page
-  translation: "Ďaľší"
-
-- id: read_time
-  translation:
-    one : "1 min"
-    other: "{{ .Count }} min"
-
-- id: words
-  translation:
-    one : "slovo"
-    other: "{{ .Count }} slov"
-
-- id: toc
-  translation: "Obsah"
-
-- id: translations
-  translation: "Preklady"
-
-- id: home
-  translation: "Domov"
-
-- id: edit_post
-  translation: "Upraviť"
-
-- id: code_copy
-  translation: "kopírovať"
-
-- id: code_copied
-  translation: "skopírované!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/sv.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/sv.yaml
deleted file mode 100644 (file)
index 65ce422..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-- id: prev_page
-  translation: "Förra Sidan"
-
-- id: next_page
-  translation: "Nästa Sida"
-
-- id: read_time
-  translation:
-    one: "1 min"
-    other: "{{ .Count }} min"
-
-- id: toc
-  translation: "Innehållsförteckning"
-
-- id: translations
-  translation: "Översättningar"
-
-- id: home
-  translation: "Hem"
-
-- id: edit_post
-  translation: "Redigera"
-
-- id: code_copy
-  translation: "kopiera"
-
-- id: code_copied
-  translation: "kopierad!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/sw.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/sw.yaml
deleted file mode 100644 (file)
index 5fceb1a..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Uliopita"
-
-- id: next_page
-  translation: "Ujao"
-
-- id: read_time
-  translation:
-    one : "dakika 1"
-    other: "dakika {{ .Count }}"
-
-- id: words
-  translation:
-    one : "neno"
-    other: "maneno {{ .Count }}"
-
-- id: toc
-  translation: "Jedwali la Yaliyomo"
-
-- id: translations
-  translation: "Tafsiri"
-
-- id: home
-  translation: "Mwanzo"
-
-- id: edit_post
-  translation: "Hariri"
-
-- id: code_copy
-  translation: "nakili"
-
-- id: code_copied
-  translation: "nakiliwa!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/th.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/th.yaml
deleted file mode 100644 (file)
index d8036ae..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "ก่อนหน้า"
-
-- id: next_page
-  translation: "ถัดไป"
-
-- id: read_time
-  translation:
-    one : "1 นาที"
-    other: "{{ .Count }} นาที"
-
-- id: words
-  translation:
-    one : "คำ"
-    other: "{{ .Count }} คำ"
-
-- id: toc
-  translation: "สารบัญ"
-
-- id: translations
-  translation: "การแปล"
-
-- id: home
-  translation: "หน้าหลัก"
-
-- id: edit_post
-  translation: "แก้ไข"
-
-- id: code_copy
-  translation: "คัดลอก"
-
-- id: code_copied
-  translation: "คัดลอกแล้ว!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/tr.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/tr.yaml
deleted file mode 100644 (file)
index b014a15..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Önceki"
-
-- id: next_page
-  translation: "Sonraki"
-
-- id: read_time
-  translation:
-    one : "1 dk"
-    other: "{{ .Count }} dk"
-
-- id: words
-  translation:
-    one : "sözcük"
-    other: "{{ .Count }} sözcük"
-
-- id: toc
-  translation: "İçindekiler"
-
-- id: translations
-  translation: "Çeviriler"
-
-- id: home
-  translation: "Ana Sayfa"
-
-- id: edit_post
-  translation: "Düzenle"
-
-- id: code_copy
-  translation: "Kopyala"
-
-- id: code_copied
-  translation: "Kopyalandı!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/uk.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/uk.yaml
deleted file mode 100644 (file)
index 41be964..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-- id: prev_page
-  translation: "Попередня"
-
-- id: next_page
-  translation: "Наступна"
-
-- id: read_time
-  translation:
-    one : "1 хвилина"
-    other: "{{ .Count }} хвилин"
-
-- id: toc
-  translation: "Зміст"
-
-- id: translations
-  translation: "Переклади"
-
-- id: home
-  translation: "Головна"
-
-- id: code_copy
-  translation: "копіювати"
-
-- id: code_copied
-  translation: "скопійовано!"
\ No newline at end of file
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/uz.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/uz.yaml
deleted file mode 100644 (file)
index c9f2375..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-- id: prev_page\r
-  translation: "Oldingi sahifa"\r
-\r
-- id: next_page\r
-  translation: "Keyingi sahifa"\r
-\r
-- id: read_time\r
-  translation:\r
-    one : "Bir daqiqa"\r
-    other: "{{ .Count }} daqiqa"\r
-\r
-- id: toc\r
-  translation: "Mundarija"\r
-\r
-- id: translations\r
-  translation: "Tarjimalar"\r
-\r
-- id: home\r
-  translation: "Bosh sahifa"\r
-  \r
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/vi.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/vi.yaml
deleted file mode 100644 (file)
index 2eb05d0..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "Trang trước"
-
-- id: next_page
-  translation: "Trang tiếp theo"
-
-- id: read_time
-  translation:
-    one: "1 phút"
-    other: "{{ .Count }} phút"
-
-- id: words
-  translation:
-    one: "từ"
-    other: "{{ .Count }} từ"
-
-- id: toc
-  translation: "Mục lục"
-
-- id: translations
-  translation: "Bản dịch"
-
-- id: home
-  translation: "Trang chủ"
-
-- id: edit_post
-  translation: "Chỉnh sửa"
-
-- id: code_copy
-  translation: "Sao chép"
-
-- id: code_copied
-  translation: "Đã sao chép!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/zh-tw.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/zh-tw.yaml
deleted file mode 100644 (file)
index 48b84d2..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page\r
-  translation: "上一頁"\r
-\r
-- id: next_page\r
-  translation: "下一頁"\r
-\r
-- id: read_time\r
-  translation:\r
-    one : "1 分鐘"\r
-    other: "{{ .Count }} 分鐘"\r
-\r
-- id: words\r
-  translation:\r
-    one: "字"\r
-    other: "{{ .Count }} 字"\r
-\r
-- id: toc\r
-  translation: "目錄"\r
-\r
-- id: translations\r
-  translation: "語言"\r
-\r
-- id: home\r
-  translation: "首頁"\r
-\r
-- id: edit_post\r
-  translation: "編輯"\r
-\r
-- id: code_copy\r
-  translation: "複製"\r
-\r
-- id: code_copied\r
-  translation: "已複製!"\r
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/zh.yaml b/generated-2025-11-21-17-29-08/themes/PaperMod/i18n/zh.yaml
deleted file mode 100644 (file)
index 0280425..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-- id: prev_page
-  translation: "上一页"
-
-- id: next_page
-  translation: "下一页"
-
-- id: read_time
-  translation:
-    one : "1 分钟"
-    other: "{{ .Count }} 分钟"
-
-- id: words
-  translation: 
-    one: "字"
-    other: "{{ .Count }} 字"
-
-- id: toc
-  translation: "目录"
-
-- id: translations
-  translation: "语言"
-
-- id: home
-  translation: "主页"
-
-- id: edit_post
-  translation: "编辑"
-
-- id: code_copy
-  translation: "复制"
-
-- id: code_copied
-  translation: "已复制!"
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/images/screenshot.png b/generated-2025-11-21-17-29-08/themes/PaperMod/images/screenshot.png
deleted file mode 100644 (file)
index a37c485..0000000
Binary files a/generated-2025-11-21-17-29-08/themes/PaperMod/images/screenshot.png and /dev/null differ
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/images/tn.png b/generated-2025-11-21-17-29-08/themes/PaperMod/images/tn.png
deleted file mode 100644 (file)
index cf83179..0000000
Binary files a/generated-2025-11-21-17-29-08/themes/PaperMod/images/tn.png and /dev/null differ
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/404.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/404.html
deleted file mode 100644 (file)
index a405573..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-{{- define "main" }}
-<div class="not-found">404</div>
-{{- end }}{{/* end main */ -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/_markup/render-image.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/_markup/render-image.html
deleted file mode 100644 (file)
index f368ff8..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-{{- $u := urls.Parse .Destination -}}
-{{- $src := $u.String -}}
-{{- if not $u.IsAbs -}}
-  {{- $path := strings.TrimPrefix "./" $u.Path }}
-  {{- with or (.PageInner.Resources.Get $path) (resources.Get $path) -}}
-    {{- $src = .RelPermalink -}}
-    {{- with $u.RawQuery -}}
-      {{- $src = printf "%s?%s" $src . -}}
-    {{- end -}}
-    {{- with $u.Fragment -}}
-      {{- $src = printf "%s#%s" $src . -}}
-    {{- end -}}
-  {{- end -}}
-{{- end -}}
-{{- $attributes := merge .Attributes (dict "alt" .Text "src" $src "title" (.Title | transform.HTMLEscape) "loading" "lazy") -}}
-<img
-  {{- range $k, $v := $attributes -}}
-    {{- if $v -}}
-      {{- printf " %s=%q" $k $v | safeHTMLAttr -}}
-    {{- end -}}
-  {{- end -}}>
-{{- /**/ -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/archives.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/archives.html
deleted file mode 100644 (file)
index eea3fc8..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-{{- define "main" }}
-
-<header class="page-header">
-  <h1>
-    {{ .Title }}
-    {{- if (.Param "ShowRssButtonInSectionTermList") }}
-    {{- $rss := (.OutputFormats.Get "rss") }}
-    {{- if (eq .Kind `page`) }}
-    {{- $rss = (.Parent.OutputFormats.Get "rss") }}
-    {{- end }}
-    {{- with $rss }}
-    <a href="{{ .RelPermalink }}" title="RSS" aria-label="RSS">
-      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-        stroke-linecap="round" stroke-linejoin="round" height="23">
-        <path d="M4 11a9 9 0 0 1 9 9" />
-        <path d="M4 4a16 16 0 0 1 16 16" />
-        <circle cx="5" cy="19" r="1" />
-      </svg>
-    </a>
-    {{- end }}
-    {{- end }}
-  </h1>
-  {{- if .Description }}
-  <div class="post-description">
-    {{ .Description }}
-  </div>
-  {{- end }}
-</header>
-
-{{- $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}
-
-{{- if site.Params.ShowAllPagesInArchive }}
-{{- $pages = site.RegularPages }}
-{{- end }}
-
-{{- range $pages.GroupByPublishDate "2006" }}
-{{- if ne .Key "0001" }}
-<div class="archive-year">
-  {{- $year := replace .Key "0001" "" }}
-  <h2 class="archive-year-header" id="{{ $year }}">
-    <a class="archive-header-link" href="#{{ $year }}">
-      {{- $year -}}
-    </a>
-    <sup class="archive-count">&nbsp;{{ len .Pages }}</sup>
-  </h2>
-  {{- range .Pages.GroupByDate "January" }}
-  <div class="archive-month">
-    <h3 class="archive-month-header" id="{{ $year }}-{{ .Key }}">
-      <a class="archive-header-link" href="#{{ $year }}-{{ .Key }}">
-        {{- .Key -}}
-      </a>
-      <sup class="archive-count">&nbsp;{{ len .Pages }}</sup>
-    </h3>
-    <div class="archive-posts">
-      {{- range .Pages }}
-      {{- if eq .Kind "page" }}
-      <div class="archive-entry">
-        <h3 class="archive-entry-title entry-hint-parent">
-          {{- .Title | markdownify }}
-          {{- if .Draft }}
-          <span class="entry-hint" title="Draft">
-            <svg xmlns="http://www.w3.org/2000/svg" height="15" viewBox="0 -960 960 960" fill="currentColor">
-              <path
-                d="M160-410v-60h300v60H160Zm0-165v-60h470v60H160Zm0-165v-60h470v60H160Zm360 580v-123l221-220q9-9 20-13t22-4q12 0 23 4.5t20 13.5l37 37q9 9 13 20t4 22q0 11-4.5 22.5T862.09-380L643-160H520Zm300-263-37-37 37 37ZM580-220h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19Z" />
-            </svg>
-          </span>
-          {{- end }}
-        </h3>
-        <div class="archive-meta">
-          {{- partial "post_meta.html" . -}}
-        </div>
-        <a class="entry-link" aria-label="post link to {{ .Title | plainify }}" href="{{ .Permalink }}"></a>
-      </div>
-      {{- end }}
-      {{- end }}
-    </div>
-  </div>
-  {{- end }}
-</div>
-{{- end }}
-{{- end }}
-
-{{- end }}{{/* end main */}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/baseof.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/baseof.html
deleted file mode 100644 (file)
index c577599..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-{{- if lt hugo.Version "0.146.0" }}
-{{- errorf "=> hugo v0.146.0 or greater is required for hugo-PaperMod to build " }}
-{{- end -}}
-
-<!DOCTYPE html>
-{{- $theme := site.Params.defaultTheme | default "auto" }}
-{{- if eq $theme "dark" }}
-<html lang="{{ site.Language }}" dir="{{ .Language.LanguageDirection | default "auto" }}" data-theme="dark">
-{{- else if eq $theme "light" }}
-<html lang="{{ site.Language }}" dir="{{ .Language.LanguageDirection | default "auto" }}" data-theme="light">
-{{- else }}
-<html lang="{{ site.Language }}" dir="{{ .Language.LanguageDirection | default "auto" }}" data-theme="auto">
-{{- end }}
-
-<head>
-    {{- partial "head.html" . }}
-</head>
-
-{{- if (or (ne .Kind `page` ) (eq .Layout `archives`) (eq .Layout `search`)) }}
-<body class="list" id="top">
-{{- else }}
-<body id="top">
-{{- end }}
-    {{ partialCached "header.html" . .Page -}}
-    <main class="main">
-        {{- block "main" . }}{{ end }}
-    </main>
-    {{ partialCached "footer.html" . .Layout .Kind (.Param "hideFooter") (.Param "ShowCodeCopyButtons") -}}
-</body>
-
-</html>
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/index.json b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/index.json
deleted file mode 100644 (file)
index feeb437..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-{{- $.Scratch.Add "index" slice -}}
-{{- range site.RegularPages -}}
-    {{- if and (not .Params.searchHidden) (ne .Layout `archives`) (ne .Layout `search`) }}
-    {{- $.Scratch.Add "index" (dict "title" .Title "content" .Plain "permalink" .Permalink "summary" .Summary) -}}
-    {{- end }}
-{{- end -}}
-{{- $.Scratch.Get "index" | jsonify -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/list.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/list.html
deleted file mode 100644 (file)
index 81aea6e..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-{{- define "main" }}
-
-{{- if (and site.Params.profileMode.enabled .IsHome) }}
-{{- partial "index_profile.html" . }}
-{{- else }} {{/* if not profileMode */}}
-
-{{- if not .IsHome | and .Title }}
-<header class="page-header">
-  {{- partial "breadcrumbs.html" . }}
-  <h1>
-    {{ .Title }}
-    {{- if and (or (eq .Kind `term`) (eq .Kind `section`)) (.Param "ShowRssButtonInSectionTermList") }}
-    {{- with .OutputFormats.Get "rss" }}
-    <a href="{{ .RelPermalink }}" title="RSS" aria-label="RSS">
-      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-        stroke-linecap="round" stroke-linejoin="round" height="23">
-        <path d="M4 11a9 9 0 0 1 9 9" />
-        <path d="M4 4a16 16 0 0 1 16 16" />
-        <circle cx="5" cy="19" r="1" />
-      </svg>
-    </a>
-    {{- end }}
-    {{- end }}
-  </h1>
-  {{- if .Description }}
-  <div class="post-description">
-    {{ .Description | markdownify }}
-  </div>
-  {{- end }}
-</header>
-{{- end }}
-
-{{- if .Content }}
-<div class="post-content">
-  {{- if not (.Param "disableAnchoredHeadings") }}
-  {{- partial "anchored_headings.html" .Content -}}
-  {{- else }}{{ .Content }}{{ end }}
-</div>
-{{- end }}
-
-{{- $pages := union .RegularPages .Sections }}
-
-{{- if .IsHome }}
-{{- $pages = where site.RegularPages "Type" "in" site.Params.mainSections }}
-{{- $pages = where $pages "Params.hiddenInHomeList" "!=" "true"  }}
-{{- end }}
-
-{{- $paginator := .Paginate $pages }}
-
-{{- if and .IsHome site.Params.homeInfoParams (eq $paginator.PageNumber 1) }}
-{{- partial "home_info.html" . }}
-{{- end }}
-
-{{- $term := .Data.Term }}
-{{- range $index, $page := $paginator.Pages }}
-
-{{- $class := "post-entry" }}
-
-{{- $user_preferred := or site.Params.disableSpecial1stPost site.Params.homeInfoParams }}
-{{- if (and $.IsHome (eq $paginator.PageNumber 1) (eq $index 0) (not $user_preferred)) }}
-{{- $class = "first-entry" }}
-{{- else if $term }}
-{{- $class = "post-entry tag-entry" }}
-{{- end }}
-
-<article class="{{ $class }}">
-  {{- $isHidden := (.Param "cover.hiddenInList") | default (.Param "cover.hidden") | default false }}
-  {{- partial "cover.html" (dict "cxt" . "IsSingle" false "isHidden" $isHidden) }}
-  <header class="entry-header">
-    <h2 class="entry-hint-parent">
-      {{- .Title }}
-      {{- if .Draft }}
-      <span class="entry-hint" title="Draft">
-        <svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" fill="currentColor">
-          <path
-            d="M160-410v-60h300v60H160Zm0-165v-60h470v60H160Zm0-165v-60h470v60H160Zm360 580v-123l221-220q9-9 20-13t22-4q12 0 23 4.5t20 13.5l37 37q9 9 13 20t4 22q0 11-4.5 22.5T862.09-380L643-160H520Zm300-263-37-37 37 37ZM580-220h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19Z" />
-        </svg>
-      </span>
-      {{- end }}
-    </h2>
-  </header>
-  {{- if (ne (.Param "hideSummary") true) }}
-  <div class="entry-content">
-    <p>{{ .Summary | plainify | htmlUnescape }}{{ if .Truncated }}...{{ end }}</p>
-  </div>
-  {{- end }}
-  {{- if not (.Param "hideMeta") }}
-  <footer class="entry-footer">
-    {{- partial "post_meta.html" . -}}
-  </footer>
-  {{- end }}
-  <a class="entry-link" aria-label="post link to {{ .Title | plainify }}" href="{{ .Permalink }}"></a>
-</article>
-{{- end }}
-
-{{- if gt $paginator.TotalPages 1 }}
-<footer class="page-footer">
-  <nav class="pagination">
-    {{- if $paginator.HasPrev }}
-    <a class="prev" href="{{ $paginator.Prev.URL | absURL }}">
-      «&nbsp;{{ i18n "prev_page" }}&nbsp;
-      {{- if (.Param "ShowPageNums") }}
-      {{- sub $paginator.PageNumber 1 }}/{{ $paginator.TotalPages }}
-      {{- end }}
-    </a>
-    {{- end }}
-    {{- if $paginator.HasNext }}
-    <a class="next" href="{{ $paginator.Next.URL | absURL }}">
-      {{- i18n "next_page" }}&nbsp;
-      {{- if (.Param "ShowPageNums") }}
-      {{- add 1 $paginator.PageNumber }}/{{ $paginator.TotalPages }}
-      {{- end }}&nbsp;»
-    </a>
-    {{- end }}
-  </nav>
-</footer>
-{{- end }}
-
-{{- end }}{{/* end profileMode */}}
-
-{{- end }}{{- /* end main */ -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/rss.xml b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/rss.xml
deleted file mode 100644 (file)
index fed8ae9..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-{{- /* Deprecate site.Author.email in favor of site.Params.author.email */}}
-{{- $authorEmail := "" }}
-{{- with site.Params.author }}
-  {{- if reflect.IsMap . }}
-    {{- with .email }}
-      {{- $authorEmail = . }}
-    {{- end }}
-  {{- end }}
-{{- else }}
-  {{- with site.Author.email }}
-    {{- $authorEmail = . }}
-    {{- warnf "The author key in site configuration is deprecated. Use params.author.email instead." }}
-  {{- end }}
-{{- end }}
-
-{{- /* Deprecate site.Author.name in favor of site.Params.author.name */}}
-{{- $authorName := "" }}
-{{- with site.Params.author }}
-  {{- if reflect.IsMap . }}
-    {{- with .name }}
-      {{- $authorName = . }}
-    {{- end }}
-  {{- else }}
-    {{- $authorName  = . }}
-  {{- end }}
-{{- else }}
-  {{- with site.Author.name }}
-    {{- $authorName = . }}
-    {{- warnf "The author key in site configuration is deprecated. Use params.author.name instead." }}
-  {{- end }}
-{{- end }}
-
-{{- $pctx := . }}
-{{- if .IsHome }}{{ $pctx = site }}{{ end }}
-{{- $pages := slice }}
-{{- if or $.IsHome $.IsSection }}
-{{- $pages = $pctx.RegularPages }}
-{{- else }}
-{{- $pages = $pctx.Pages }}
-{{- end }}
-{{- $limit := site.Config.Services.RSS.Limit }}
-{{- if ge $limit 1 }}
-{{- $pages = $pages | first $limit }}
-{{- end }}
-{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
-<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
-  <channel>
-    <title>{{ if eq .Title site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ site.Title }}{{ end }}</title>
-    <link>{{ .Permalink }}</link>
-    <description>Recent content {{ if ne .Title site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ site.Title }}</description>
-    {{- with site.Params.images }}
-    <image>
-      <title>{{ site.Title }}</title>
-      <url>{{ index . 0 | absURL }}</url>
-      <link>{{ index . 0 | absURL }}</link>
-    </image>
-    {{- end }}
-    <generator>Hugo -- {{ hugo.Version }}</generator>
-    <language>{{ site.Language.LanguageCode }}</language>{{ with $authorEmail }}
-    <managingEditor>{{.}}{{ with $authorName }} ({{ . }}){{ end }}</managingEditor>{{ end }}{{ with $authorEmail }}
-    <webMaster>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</webMaster>{{ end }}{{ with site.Copyright }}
-    <copyright>{{ . | markdownify | plainify | strings.TrimPrefix "© " }}</copyright>{{ end }}{{ if not .Date.IsZero }}
-    <lastBuildDate>{{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
-    {{- with .OutputFormats.Get "RSS" }}
-    {{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
-    {{- end }}
-    {{- range $pages }}
-    {{- if and (ne .Layout `search`) (ne .Layout `archives`) }}
-    <item>
-      <title>{{ .Title }}</title>
-      <link>{{ .Permalink }}</link>
-      <pubDate>{{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
-      {{- with $authorEmail }}<author>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</author>{{ end }}
-      <guid>{{ .Permalink }}</guid>
-      <description>{{ with .Description | html }}{{ . }}{{ else }}{{ .Summary | html }}{{ end -}}</description>
-      {{- if and site.Params.ShowFullTextinRSS .Content }}
-      <content:encoded>{{ (printf "<![CDATA[%s]]>" .Content) | safeHTML }}</content:encoded>
-      {{- end }}
-    </item>
-    {{- end }}
-    {{- end }}
-  </channel>
-</rss>
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/search.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/search.html
deleted file mode 100644 (file)
index bb7d436..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-{{- define "main" }}
-
-<header class="page-header">
-    <h1>{{- (printf "%s&nbsp;" .Title ) | htmlUnescape -}}
-        <svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none"
-            stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
-            <circle cx="11" cy="11" r="8"></circle>
-            <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
-        </svg>
-    </h1>
-    {{- if .Description }}
-    <div class="post-description">
-        {{ .Description }}
-    </div>
-    {{- end }}
-    {{- if not (.Param "hideMeta") }}
-    <div class="post-meta">
-        {{- partial "translation_list.html" . -}}
-    </div>
-    {{- end }}
-</header>
-
-<div id="searchbox">
-    <input id="searchInput" autofocus placeholder="{{ .Params.placeholder | default (printf "%s ↵" .Title) }}"
-        aria-label="search" type="search" autocomplete="off" maxlength="64">
-    <ul id="searchResults" aria-label="search results"></ul>
-</div>
-
-{{- end }}{{/* end main */}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/single.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/single.html
deleted file mode 100644 (file)
index 19a624f..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-{{- define "main" }}
-
-<article class="post-single">
-  <header class="post-header">
-    {{ partial "breadcrumbs.html" . }}
-    <h1 class="post-title entry-hint-parent">
-      {{ .Title }}
-      {{- if .Draft }}
-      <span class="entry-hint" title="Draft">
-        <svg xmlns="http://www.w3.org/2000/svg" height="35" viewBox="0 -960 960 960" fill="currentColor">
-          <path
-            d="M160-410v-60h300v60H160Zm0-165v-60h470v60H160Zm0-165v-60h470v60H160Zm360 580v-123l221-220q9-9 20-13t22-4q12 0 23 4.5t20 13.5l37 37q9 9 13 20t4 22q0 11-4.5 22.5T862.09-380L643-160H520Zm300-263-37-37 37 37ZM580-220h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19Z" />
-        </svg>
-      </span>
-      {{- end }}
-    </h1>
-    {{- if .Description }}
-    <div class="post-description">
-      {{ .Description }}
-    </div>
-    {{- end }}
-    {{- if not (.Param "hideMeta") }}
-    <div class="post-meta">
-      {{- partial "post_meta.html" . -}}
-      {{- partial "translation_list.html" . -}}
-      {{- partial "edit_post.html" . -}}
-      {{- partial "post_canonical.html" . -}}
-    </div>
-    {{- end }}
-  </header>
-  {{- $isHidden := (.Param "cover.hiddenInSingle") | default (.Param "cover.hidden") | default false }}
-  {{- partial "cover.html" (dict "cxt" . "IsSingle" true "isHidden" $isHidden) }}
-  {{- if (.Param "ShowToc") }}
-  {{- partial "toc.html" . }}
-  {{- end }}
-
-  {{- if .Content }}
-  <div class="post-content">
-    {{- if not (.Param "disableAnchoredHeadings") }}
-    {{- partial "anchored_headings.html" .Content -}}
-    {{- else }}{{ .Content }}{{ end }}
-  </div>
-  {{- end }}
-
-  <footer class="post-footer">
-    {{- $tags := .Language.Params.Taxonomies.tag | default "tags" }}
-    <ul class="post-tags">
-      {{- range ($.GetTerms $tags) }}
-      <li><a href="{{ .Permalink }}">{{ .LinkTitle }}</a></li>
-      {{- end }}
-    </ul>
-    {{- if (.Param "ShowPostNavLinks") }}
-    {{- partial "post_nav_links.html" . }}
-    {{- end }}
-    {{- if (and site.Params.ShowShareButtons (ne .Params.disableShare true)) }}
-    {{- partial "share_icons.html" . -}}
-    {{- end }}
-  </footer>
-
-  {{- if (.Param "comments") }}
-  {{- partial "comments.html" . }}
-  {{- end }}
-</article>
-
-{{- end }}{{/* end main */}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/terms.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/_default/terms.html
deleted file mode 100644 (file)
index 6fd2654..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-{{- define "main" }}
-
-{{- if .Title }}
-<header class="page-header">
-    <h1>{{ .Title }}</h1>
-    {{- if .Description }}
-    <div class="post-description">
-        {{ .Description }}
-    </div>
-    {{- end }}
-</header>
-{{- end }}
-
-<ul class="terms-tags">
-    {{- $type := .Type }}
-    {{- range $key, $value := .Data.Terms.Alphabetical }}
-    {{- $name := .Name }}
-    {{- $count := .Count }}
-    {{- with site.GetPage (printf "/%s/%s" $type $name) }}
-    <li>
-        <a href="{{ .Permalink }}">{{ .Name }} <sup><strong><sup>{{ $count }}</sup></strong></sup> </a>
-    </li>
-    {{- end }}
-    {{- end }}
-</ul>
-
-{{- end }}{{/* end main */ -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/anchored_headings.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/anchored_headings.html
deleted file mode 100644 (file)
index 377af89..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-{{- /* formats .Content headings by adding an anchor */ -}}
-{{ . | replaceRE "(<h[1-6] id=\"([^\"]+)\".+)(</h[1-6]+>)" "${1}<a hidden class=\"anchor\" aria-hidden=\"true\" href=\"#${2}\">#</a>${3}" | safeHTML }}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/author.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/author.html
deleted file mode 100644 (file)
index 8f2758f..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{{- if or .Params.author site.Params.author }}
-{{- $author := (.Params.author | default site.Params.author) }}
-{{- $author_type := (printf "%T" $author) }}
-{{- if (or (eq $author_type "[]string") (eq $author_type "[]interface {}")) }}
-{{- (delimit $author ", " ) }}
-{{- else }}
-{{- $author }}
-{{- end }}
-{{- end -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/breadcrumbs.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/breadcrumbs.html
deleted file mode 100644 (file)
index 2686ca0..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-{{- if (.Param "ShowBreadCrumbs") -}}
-<div class="breadcrumbs">
-    {{- $url := replace .Parent.Permalink (printf "%s" site.Home.Permalink) "" }}
-    {{- $lang_url := strings.TrimPrefix (printf "%s/" .Lang) $url -}}
-
-    <a href="{{ "" | absLangURL }}">{{ i18n "home" | default "Home" }}</a>
-    {{- $scratch := newScratch }}
-    {{- range $index, $element := split $lang_url "/" }}
-
-    {{- $scratch.Add "path" (printf "%s/" $element )}}
-    {{- $bc_pg := site.GetPage ($scratch.Get "path") -}}
-
-    {{- if (and ($bc_pg) (gt (len . ) 0))}}
-    {{- print "&nbsp;»&nbsp;" | safeHTML -}}<a href="{{ $bc_pg.Permalink }}">{{ $bc_pg.Name }}</a>
-    {{- end }}
-
-    {{- end -}}
-</div>
-{{- end -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/comments.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/comments.html
deleted file mode 100644 (file)
index 918451a..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-{{- /* Comments area start */ -}}
-{{- /* to add comments read => https://gohugo.io/content-management/comments/ */ -}}
-{{- /* Comments area end */ -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/cover.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/cover.html
deleted file mode 100644 (file)
index 9c1f9ea..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-{{- with .cxt}} {{/* Apply proper context from dict */}}
-{{- if (and .Params.cover.image (not $.isHidden)) }}
-<figure class="entry-cover">
-    {{- $loading := cond $.IsSingle "eager" "lazy" }}
-    {{- $addLink := (and site.Params.cover.linkFullImages $.IsSingle) }}
-    {{- $prod := (hugo.IsProduction | or (eq site.Params.env "production")) }}
-    {{- $alt := (.Params.cover.alt | default .Params.cover.caption | plainify) }}
-    {{- $responsiveImages := (.Params.cover.responsiveImages | default site.Params.cover.responsiveImages) | default true }}
-
-    {{- $pageBundleCover := (.Resources.ByType "image").GetMatch (printf "*%s*" (.Params.cover.image)) }}
-    {{- $globalResourcesCover := (resources.ByType "image").GetMatch (printf "*%s*" (.Params.cover.image)) }}
-    {{- $cover := (or $pageBundleCover $globalResourcesCover)}}
-    {{- /* We are not using the .Param.cover.relative to decide the location of image */}}
-    {{- /* If we have the image in pageBundle or globalResources we can process the image */}}
-
-    {{- $sizes := (slice "360" "480" "720" "1080" "1500") }}
-    {{- $processableFormats := (slice "jpg" "jpeg" "png" "tif" "bmp" "gif") -}}
-    {{- if hugo.IsExtended -}}
-        {{- $processableFormats = $processableFormats | append "webp" -}}
-    {{- end -}}
-
-    {{- $imgdl := (.Params.cover.image) | absURL }}
-    {{- if $cover -}}
-        {{- $imgdl = $cover.Permalink }}
-    {{- end -}}
-
-    {{- if $addLink }}
-        <a href="{{ $imgdl }}" target="_blank" rel="noopener noreferrer">
-    {{- end }}
-
-    {{- if $cover -}}
-        {{/* i.e it is present in page bundle */}}
-        {{- if (and (in $processableFormats $cover.MediaType.SubType) ($responsiveImages) (eq $prod true)) }}
-            <img loading="{{$loading}}"
-                srcset='{{- range $size := $sizes -}}
-                            {{- if (ge $cover.Width $size) }}
-                                {{- printf "%s %s" (($cover.Resize (printf "%sx" $size)).Permalink) (printf "%sw," $size) }}
-                            {{- end }}
-                        {{- end }}
-                        {{- printf "%s %dw" ($cover.Permalink) ($cover.Width) }}'
-                src="{{ $cover.Permalink }}"
-                sizes="(min-width: 768px) 720px, 100vw"
-                width="{{ $cover.Width }}" height="{{ $cover.Height }}"
-                alt="{{ $alt }}">
-        {{- else }}{{/* Unprocessable image or responsive images disabled */}}
-            <img loading="{{ $loading }}" src="{{ $imgdl }}" alt="{{ $alt }}">
-        {{- end }}
-    {{- else }}
-        {{- /* For absolute urls and external links, no img processing here */}}
-        <img loading="{{ $loading }}" src="{{ $imgdl }}" alt="{{ $alt }}">
-    {{- end }}
-
-    {{- if $addLink }}
-        </a>
-    {{- end -}}
-
-    {{- /*  Display Caption  */}}
-    {{- if $.IsSingle }}
-        {{ with .Params.cover.caption -}}
-            <figcaption>{{ . | markdownify }}</figcaption>
-        {{- end }}
-    {{- end }}
-</figure>
-{{- end }}{{/* End image */}}
-{{- end -}}{{/* End context */ -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/edit_post.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/edit_post.html
deleted file mode 100644 (file)
index d24f5b5..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-{{- if and (or .Params.editPost.URL site.Params.editPost.URL) (not (.Param "editPost.disabled")) -}}
-{{- $fileUrlPath := path.Join .File.Path }}
-
-{{- if or .Params.author site.Params.author (.Param "ShowReadingTime") (not .Date.IsZero) .IsTranslated }}&nbsp;|&nbsp;{{- end -}}
-<span>
-    <a href="{{ .Params.editPost.URL | default site.Params.editPost.URL }}{{ if .Params.editPost.appendFilePath | default ( site.Params.editPost.appendFilePath | default false ) }}/{{ $fileUrlPath }}{{ end }}" rel="noopener noreferrer edit" target="_blank">
-        {{- .Params.editPost.Text | default (site.Params.editPost.Text | default (i18n "edit_post" | default "Edit")) -}}
-    </a>
-</span>
-{{- end }}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/extend_footer.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/extend_footer.html
deleted file mode 100644 (file)
index 0519748..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-{{- /* Footer custom content area start */ -}}
-{{- /*     Insert any custom code web-analytics, resources, etc. here */ -}}
-{{- /* Footer custom content area end */ -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/extend_head.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/extend_head.html
deleted file mode 100644 (file)
index 550f31d..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{{- /* Head custom content area start */ -}}
-{{- /*     Insert any custom code (web-analytics, resources, etc.) - it will appear in the <head></head> section of every page. */ -}}
-{{- /*     Can be overwritten by partial with the same name in the global layouts. */ -}}
-{{- /* Head custom content area end */ -}}
-
-<link rel="preconnect" href="https://fonts.googleapis.com">
-<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
-<link href="https://fonts.googleapis.com/css2?family=Lexend&display=swap" rel="stylesheet">
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/footer.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/footer.html
deleted file mode 100644 (file)
index 6d05117..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-{{- if not (.Param "hideFooter") }}
-<footer class="footer">
-    {{- if not site.Params.footer.hideCopyright }}
-        {{- if site.Copyright }}
-        <span>{{ site.Copyright | markdownify }}</span>
-        {{- else }}
-        <span>&copy; {{ now.Year }} <a href="{{ "" | absLangURL }}">{{ site.Title }}</a></span>
-        {{- end }}
-        {{- print " · "}}
-    {{- end }}
-
-    {{- with site.Params.footer.text }}
-        {{ . | markdownify }}
-        {{- print " · "}}
-    {{- end }}
-
-    <span>
-        Powered by
-        <a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
-        <a href="https://github.com/adityatelange/hugo-PaperMod/" rel="noopener" target="_blank">PaperMod</a>
-    </span>
-</footer>
-{{- end }}
-
-{{- if (not site.Params.disableScrollToTop) }}
-<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
-    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
-        <path d="M12 6H0l6-6z" />
-    </svg>
-</a>
-{{- end }}
-
-{{- partial "extend_footer.html" . }}
-
-<script>
-    let menu = document.getElementById('menu');
-    if (menu) {
-        // Set the scroll position
-        const scrollPosition = localStorage.getItem("menu-scroll-position");
-        if (scrollPosition) {
-            menu.scrollLeft = parseInt(scrollPosition, 10);
-        }
-        
-        menu.onscroll = function () {
-            localStorage.setItem("menu-scroll-position", menu.scrollLeft);
-        }
-    }
-
-    document.querySelectorAll('a[href^="#"]').forEach(anchor => {
-        anchor.addEventListener("click", function (e) {
-            e.preventDefault();
-            var id = this.getAttribute("href").substr(1);
-            if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
-                document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
-                    behavior: "smooth"
-                });
-            } else {
-                document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
-            }
-            if (id === "top") {
-                history.replaceState(null, null, " ");
-            } else {
-                history.pushState(null, null, `#${id}`);
-            }
-        });
-    });
-
-</script>
-
-{{- if (not site.Params.disableScrollToTop) }}
-<script>
-    var mybutton = document.getElementById("top-link");
-    window.onscroll = function () {
-        if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
-            mybutton.style.visibility = "visible";
-            mybutton.style.opacity = "1";
-        } else {
-            mybutton.style.visibility = "hidden";
-            mybutton.style.opacity = "0";
-        }
-    };
-
-</script>
-{{- end }}
-
-{{- if (not site.Params.disableThemeToggle) }}
-<script>
-    document.getElementById("theme-toggle").addEventListener("click", () => {
-        const html = document.querySelector("html");
-        if (html.dataset.theme === "dark") {
-            html.dataset.theme = 'light';
-            localStorage.setItem("pref-theme", 'light');
-        } else {
-            html.dataset.theme = 'dark';
-            localStorage.setItem("pref-theme", 'dark');
-        }
-    })
-
-</script>
-{{- end }}
-
-{{- if (and (eq .Kind "page") (ne .Layout "archives") (ne .Layout "search") (.Param "ShowCodeCopyButtons")) }}
-<script>
-    document.querySelectorAll('pre > code').forEach((codeblock) => {
-        const container = codeblock.parentNode.parentNode;
-
-        const copybutton = document.createElement('button');
-        copybutton.classList.add('copy-code');
-        copybutton.innerHTML = '{{- i18n "code_copy" | default "copy" }}';
-
-        function copyingDone() {
-            copybutton.innerHTML = '{{- i18n "code_copied" | default "copied!" }}';
-            setTimeout(() => {
-                copybutton.innerHTML = '{{- i18n "code_copy" | default "copy" }}';
-            }, 2000);
-        }
-
-        copybutton.addEventListener('click', (cb) => {
-            if ('clipboard' in navigator) {
-                navigator.clipboard.writeText(codeblock.textContent);
-                copyingDone();
-                return;
-            }
-
-            const range = document.createRange();
-            range.selectNodeContents(codeblock);
-            const selection = window.getSelection();
-            selection.removeAllRanges();
-            selection.addRange(range);
-            try {
-                document.execCommand('copy');
-                copyingDone();
-            } catch (e) { };
-            selection.removeRange(range);
-        });
-
-        if (container.classList.contains("highlight")) {
-            container.appendChild(copybutton);
-        } else if (container.parentNode.firstChild == container) {
-            // td containing LineNos
-        } else if (codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName == "TABLE") {
-            // table containing LineNos and code
-            codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(copybutton);
-        } else {
-            // code blocks not having highlight as parent class
-            codeblock.parentNode.appendChild(copybutton);
-        }
-    });
-</script>
-{{- end }}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/head.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/head.html
deleted file mode 100644 (file)
index 565709b..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-<meta charset="utf-8">
-<meta http-equiv="X-UA-Compatible" content="IE=edge">
-<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
-{{- if hugo.IsProduction | or (eq site.Params.env "production") | and (ne .Params.robotsNoIndex true) }}
-<meta name="robots" content="index, follow">
-{{- else }}
-<meta name="robots" content="noindex, nofollow">
-{{- end }}
-
-{{- /* Title */}}
-<title>{{ if .IsHome }}{{ else }}{{ if .Title }}{{ .Title }} | {{ end }}{{ end }}{{ site.Title }}</title>
-
-{{- /* Meta */}}
-{{- if .IsHome }}
-{{ with site.Params.keywords -}}<meta name="keywords" content="{{- range $i, $e := . }}{{ if $i }}, {{ end }}{{ $e }}{{ end }}">{{ end }}
-{{- else }}
-<meta name="keywords" content="{{ if .Params.keywords -}}
-    {{- range $i, $e := .Params.keywords }}{{ if $i }}, {{ end }}{{ $e }}{{ end }} {{- else }}
-    {{- range $i, $e := .Params.tags }}{{ if $i }}, {{ end }}{{ $e }}{{ end }} {{- end -}}">
-{{- end }}
-<meta name="description" content="{{- with .Description }}{{ . }}{{- else }}{{- if or .IsPage .IsSection}}
-    {{- .Summary | default (printf "%s - %s" .Title  site.Title) }}{{- else }}
-    {{- with site.Params.description }}{{ . }}{{- end }}{{- end }}{{- end -}}">
-<meta name="author" content="{{ (partial "author.html" . ) }}">
-<link rel="canonical" href="{{ if .Params.canonicalURL -}} {{ trim .Params.canonicalURL " " }} {{- else -}} {{ .Permalink }} {{- end }}">
-{{- if site.Params.analytics.google.SiteVerificationTag }}
-<meta name="google-site-verification" content="{{ site.Params.analytics.google.SiteVerificationTag }}">
-{{- end }}
-{{- if site.Params.analytics.yandex.SiteVerificationTag }}
-<meta name="yandex-verification" content="{{ site.Params.analytics.yandex.SiteVerificationTag }}">
-{{- end }}
-{{- if site.Params.analytics.bing.SiteVerificationTag }}
-<meta name="msvalidate.01" content="{{ site.Params.analytics.bing.SiteVerificationTag }}">
-{{- end }}
-{{- if site.Params.analytics.naver.SiteVerificationTag }}
-<meta name="naver-site-verification" content="{{ site.Params.analytics.naver.SiteVerificationTag }}">
-{{- end }}
-
-{{- /* Styles */}}
-
-{{- /* includes */}}
-{{- $includes := slice }}
-{{- $includes = $includes | append (" " | resources.FromString "assets/css/includes-blank.css")}}
-
-{{- if not (eq site.Params.assets.disableScrollBarStyle true) }}
-    {{- $ScrollStyle := (resources.Get "css/includes/scroll-bar.css") }}
-    {{- $includes = (append $ScrollStyle $includes) }}
-{{- end }}
-
-{{- $includes_all := $includes | resources.Concat "assets/css/includes.css" }}
-
-{{- $theme_vars := (resources.Get "css/core/theme-vars.css") }}
-{{- $reset := (resources.Get "css/core/reset.css") }}
-{{- $media := (resources.Get "css/core/zmedia.css") }}
-{{- $license_css := (resources.Get "css/core/license.css") }}
-{{- $common := (resources.Match "css/common/*.css") | resources.Concat "assets/css/common.css" }}
-
-{{- /* markup.highlight.noClasses should be set to `false` */}}
-{{- $chroma_styles := (resources.Get "css/includes/chroma-styles.css") }}
-{{- $chroma_mod := (resources.Get "css/includes/chroma-mod.css") }}
-
-{{- /* order is important */}}
-{{- $core := (slice $theme_vars $reset $common $chroma_styles $chroma_mod $includes_all $media) | resources.Concat "assets/css/core.css" | resources.Minify }}
-{{- $extended := (resources.Match "css/extended/*.css") | resources.Concat "assets/css/extended.css" | resources.Minify }}
-
-{{- /* bundle all required css */}}
-{{- /* Add extended css after theme style */ -}}
-{{- $stylesheet := (slice $license_css $core $extended) | resources.Concat "assets/css/stylesheet.css"  }}
-
-{{- if not site.Params.assets.disableFingerprinting }}
-{{- $stylesheet := $stylesheet | fingerprint }}
-<link crossorigin="anonymous" href="{{ $stylesheet.RelPermalink }}" integrity="{{ $stylesheet.Data.Integrity }}" rel="preload stylesheet" as="style">
-{{- else }}
-<link crossorigin="anonymous" href="{{ $stylesheet.RelPermalink }}" rel="preload stylesheet" as="style">
-{{- end }}
-
-{{- /* Search */}}
-{{- if (eq .Layout `search`) -}}
-<link crossorigin="anonymous" rel="preload" as="fetch" href="../index.json">
-{{- $fastsearch := resources.Get "js/fastsearch.js" | js.Build (dict "params" (dict "fuseOpts" site.Params.fuseOpts)) | resources.Minify }}
-{{- $fusejs := resources.Get "js/fuse.basic.min.js" }}
-{{- $license_js := resources.Get "js/license.js" }}
-{{- if not site.Params.assets.disableFingerprinting }}
-{{- $search := (slice $fusejs $license_js $fastsearch ) | resources.Concat "assets/js/search.js" | fingerprint }}
-<script defer crossorigin="anonymous" src="{{ $search.RelPermalink }}" integrity="{{ $search.Data.Integrity }}"></script>
-{{- else }}
-{{- $search := (slice $fusejs $fastsearch ) | resources.Concat "assets/js/search.js" }}
-<script defer crossorigin="anonymous" src="{{ $search.RelPermalink }}"></script>
-{{- end }}
-{{- end -}}
-
-{{- /* Favicons */}}
-<link rel="icon" href="{{ site.Params.assets.favicon | default "favicon.ico" | absURL }}">
-<link rel="icon" type="image/png" sizes="16x16" href="{{ site.Params.assets.favicon16x16 | default "favicon-16x16.png" | absURL }}">
-<link rel="icon" type="image/png" sizes="32x32" href="{{ site.Params.assets.favicon32x32 | default "favicon-32x32.png" | absURL }}">
-<link rel="apple-touch-icon" href="{{ site.Params.assets.apple_touch_icon | default "apple-touch-icon.png" | absURL }}">
-<link rel="mask-icon" href="{{ site.Params.assets.safari_pinned_tab | default "safari-pinned-tab.svg" | absURL }}">
-<meta name="theme-color" content="{{ site.Params.assets.theme_color | default "#2e2e33" }}">
-<meta name="msapplication-TileColor" content="{{ site.Params.assets.msapplication_TileColor | default "#2e2e33" }}">
-
-{{- /* RSS */}}
-{{ range .AlternativeOutputFormats -}}
-<link rel="{{ .Rel }}" type="{{ .MediaType.Type | html }}" href="{{ .Permalink | safeURL }}" title="{{ .Name }}">
-{{ end -}}
-{{- range .AllTranslations -}}
-<link rel="alternate" hreflang="{{ .Lang }}" href="{{ .Permalink }}">
-{{ end -}}
-
-<noscript>
-    <style>
-        #theme-toggle,
-        .top-link {
-            display: none;
-        }
-
-    </style>
-    {{- if (and (ne site.Params.defaultTheme "light") (ne site.Params.defaultTheme "dark")) }}
-    <style>
-        @media (prefers-color-scheme: dark) {
-            :root {
-                --theme: rgb(29, 30, 32);
-                --entry: rgb(46, 46, 51);
-                --primary: rgb(218, 218, 219);
-                --secondary: rgb(155, 156, 157);
-                --tertiary: rgb(65, 66, 68);
-                --content: rgb(196, 196, 197);
-                --code-block-bg: rgb(46, 46, 51);
-                --code-bg: rgb(55, 56, 62);
-                --border: rgb(51, 51, 51);
-                color-scheme: dark;
-            }
-
-            .list {
-                background: var(--theme);
-            }
-
-            .toc {
-                background: var(--entry);
-            }
-        }
-
-        @media (prefers-color-scheme: light) {
-            .list::-webkit-scrollbar-thumb {
-                border-color: var(--code-bg);
-            }
-        }
-
-    </style>
-    {{- end }}
-</noscript>
-
-{{- /* theme-toggle is enabled */}}
-{{- if (not site.Params.disableThemeToggle) }}
-{{- /* theme is light */}}
-{{- if (eq site.Params.defaultTheme "light") }}
-<script>
-    if (localStorage.getItem("pref-theme") === "dark") {
-        document.querySelector("html").dataset.theme = 'dark';
-    }
-
-</script>
-{{- /* theme is dark */}}
-{{- else if (eq site.Params.defaultTheme "dark") }}
-<script>
-    if (localStorage.getItem("pref-theme") === "light") {
-        document.querySelector("html").dataset.theme = 'light';
-    }
-
-</script>
-{{- else }}
-{{- /* theme is auto */}}
-<script>
-    if (localStorage.getItem("pref-theme") === "dark") {
-        document.querySelector("html").dataset.theme = 'dark';
-    } else if (localStorage.getItem("pref-theme") === "light") {
-       document.querySelector("html").dataset.theme = 'light';
-    } else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
-        document.querySelector("html").dataset.theme = 'dark';
-    } else {
-        document.querySelector("html").dataset.theme = 'light';
-    }
-
-</script>
-{{- end }}
-{{- /* theme-toggle is disabled and theme is auto */}}
-{{- else if (and (ne site.Params.defaultTheme "light") (ne site.Params.defaultTheme "dark"))}}
-<script>
-    if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
-        document.querySelector("html").dataset.theme = 'dark';
-    } else {
-        document.querySelector("html").dataset.theme = 'light';
-    }
-
-</script>
-{{- end }}
-
-{{- partial "extend_head.html" . -}}
-
-{{- /* Misc */}}
-{{- if hugo.IsProduction | or (eq site.Params.env "production") }}
-{{- partial "google_analytics.html" . }}
-{{- partial "templates/opengraph.html" . }}
-{{- partial "templates/twitter_cards.html" . }}
-{{- partial "templates/schema_json.html" . }}
-{{- end -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/header.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/header.html
deleted file mode 100644 (file)
index e3eb797..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-<header class="header">
-    <nav class="nav">
-        <div class="logo">
-            {{- $label_text := (site.Params.label.text | default site.Title) }}
-            {{- if site.Title }}
-            <a href="{{ "" | absLangURL }}" accesskey="h" title="{{ $label_text }} (Alt + H)">
-                {{- if site.Params.label.icon }}
-                {{- $img := resources.Get site.Params.label.icon }}
-                {{- if $img }}
-                    {{- $processableFormats := (slice "jpg" "jpeg" "png" "tif" "bmp" "gif") -}}
-                    {{- if hugo.IsExtended -}}
-                        {{- $processableFormats = $processableFormats | append "webp" -}}
-                    {{- end -}}
-                    {{- $prod := (hugo.IsProduction | or (eq site.Params.env "production")) }}
-                    {{- if and (in $processableFormats $img.MediaType.SubType) (eq $prod true)}}
-                        {{- if site.Params.label.iconHeight }}
-                            {{- $img = $img.Resize (printf "x%d" site.Params.label.iconHeight) }}
-                        {{ else }}
-                            {{- $img = $img.Resize "x30" }}
-                        {{- end }}
-                    {{- end }}
-                    <img src="{{ $img.Permalink }}" alt="" aria-label="logo"
-                        height="{{- site.Params.label.iconHeight | default "30" -}}">
-                {{- else }}
-                <img src="{{- site.Params.label.icon | absURL -}}" alt="" aria-label="logo"
-                    height="{{- site.Params.label.iconHeight | default "30" -}}">
-                {{- end -}}
-                {{- else if hasPrefix site.Params.label.iconSVG "<svg" }}
-                    {{ site.Params.label.iconSVG | safeHTML }}
-                {{- end -}}
-                {{- $label_text -}}
-            </a>
-            {{- end }}
-            <div class="logo-switches">
-                {{- if (not site.Params.disableThemeToggle) }}
-                <button id="theme-toggle" accesskey="t" title="(Alt + T)" aria-label="Toggle theme">
-                    <svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
-                        fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
-                        stroke-linejoin="round">
-                        <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
-                    </svg>
-                    <svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
-                        fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
-                        stroke-linejoin="round">
-                        <circle cx="12" cy="12" r="5"></circle>
-                        <line x1="12" y1="1" x2="12" y2="3"></line>
-                        <line x1="12" y1="21" x2="12" y2="23"></line>
-                        <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
-                        <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
-                        <line x1="1" y1="12" x2="3" y2="12"></line>
-                        <line x1="21" y1="12" x2="23" y2="12"></line>
-                        <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
-                        <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
-                    </svg>
-                </button>
-                {{- end }}
-                
-                {{- if (not site.Params.disableLangToggle) }}
-                    {{- $lang := .Lang}}
-                    {{- $separator := or $label_text (not site.Params.disableThemeToggle)}}
-                    {{- with site.Home.Translations }}
-                    <ul class="lang-switch">
-                        {{- if $separator }}<li>|</li>{{ end }}
-                        {{- range . -}}
-                        {{- if ne $lang .Lang }}
-                        <li>
-                            <a href="{{- .Permalink -}}" title="{{ .Language.Params.languageAltTitle | default (.Language.LanguageName | emojify) | default (.Lang | title) }}"
-                                aria-label="{{ .Language.LanguageName | default (.Lang | title) }}">
-                                {{- if (and site.Params.displayFullLangName (.Language.LanguageName)) }}
-                                {{- .Language.LanguageName | emojify -}}
-                                {{- else }}
-                                {{- .Lang | title -}}
-                                {{- end -}}
-                            </a>
-                        </li>
-                        {{- end -}}
-                        {{- end}}
-                    </ul>
-                    {{- end }}
-                {{- end }}
-            </div>
-        </div>
-        {{- $currentPage := . }}
-        <ul id="menu">
-            {{- range site.Menus.main }}
-            {{- $menu_item_url := (cond (strings.HasSuffix .URL "/") .URL (printf "%s/" .URL) ) | absLangURL }}
-            {{- $page_url:= $currentPage.Permalink | absLangURL }}
-            {{- $is_search := eq (site.GetPage .KeyName).Layout `search` }}
-            <li>
-                <a href="{{ .URL | absLangURL }}" title="{{ .Title | default .Name }} {{- cond $is_search (" (Alt + /)" | safeHTMLAttr) ("" | safeHTMLAttr ) }}"
-                {{- cond $is_search (" accesskey=/" | safeHTMLAttr) ("" | safeHTMLAttr ) }}>
-                    <span {{- if eq $menu_item_url $page_url }} class="active" {{- end }}>
-                        {{- .Pre }}
-                        {{- .Name -}}
-                        {{ .Post -}}
-                    </span>
-                    {{- if (findRE "://" .URL) }}&nbsp;
-                    <svg fill="none" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round"
-                        stroke-linejoin="round" stroke-width="2.5" viewBox="0 0 24 24" height="12" width="12">
-                        <path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path>
-                        <path d="M15 3h6v6"></path>
-                        <path d="M10 14L21 3"></path>
-                    </svg>
-                    {{- end }}
-                </a>
-            </li>
-            {{- end }}
-        </ul>
-    </nav>
-</header>
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/home_info.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/home_info.html
deleted file mode 100644 (file)
index 199dfb7..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-{{- with site.Params.homeInfoParams }}
-<article class="first-entry home-info">
-    <header class="entry-header">
-        <h1>{{ .Title | markdownify }}</h1>
-    </header>
-    <div class="entry-content">
-        {{ .Content | markdownify }}
-    </div>
-    <footer class="entry-footer">
-        {{ partial "social_icons.html" (dict "align" site.Params.homeInfoParams.AlignSocialIconsTo) }}
-    </footer>
-</article>
-{{- end -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/index_profile.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/index_profile.html
deleted file mode 100644 (file)
index 6882f39..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<div class="profile">
-    {{- with site.Params.profileMode }}
-    <div class="profile_inner">
-        {{- if .imageUrl -}}
-        {{- $img := "" }}
-        {{- if not (urls.Parse .imageUrl).IsAbs }}
-            {{- $img = resources.Get .imageUrl }}
-        {{- end }}
-        {{- if $img }}
-            {{- $processableFormats := (slice "jpg" "jpeg" "png" "tif" "bmp" "gif") -}}
-            {{- if hugo.IsExtended -}}
-                {{- $processableFormats = $processableFormats | append "webp" -}}
-            {{- end -}}
-            {{- $prod := (hugo.IsProduction | or (eq site.Params.env "production")) }}
-            {{- if and (in $processableFormats $img.MediaType.SubType) (eq $prod true)}}
-                {{- if (not (and (not .imageHeight) (not .imageWidth))) }}
-                    {{- $img = $img.Resize (printf "%dx%d" .imageWidth .imageHeight) }}
-                {{- else if .imageHeight }}
-                    {{- $img = $img.Resize (printf "x%d" .imageHeight) }}
-                {{ else if .imageWidth }}
-                    {{- $img = $img.Resize (printf "%dx" .imageWidth) }}
-                {{ else }}
-                    {{- $img = $img.Resize "150x150" }}
-                {{- end }}
-            {{- end }}
-            <img draggable="false" src="{{ $img.Permalink }}" alt="{{ .imageTitle | default "profile image" }}" title="{{ .imageTitle }}"
-                height="{{ .imageHeight | default 150 }}" width="{{ .imageWidth | default 150 }}" />
-        {{- else }}
-        <img draggable="false" src="{{ .imageUrl | absURL }}" alt="{{ .imageTitle | default "profile image" }}" title="{{ .imageTitle }}"
-            height="{{ .imageHeight | default 150 }}" width="{{ .imageWidth | default 150 }}" />
-        {{- end }}
-        {{- end }}
-        <h1>{{ .title | default site.Title | markdownify }}</h1>
-        <span>{{ .subtitle | markdownify }}</span>
-        {{- partial "social_icons.html" -}}
-
-        {{- with .buttons }}
-        <div class="buttons">
-            {{- range . }}
-            <a class="button" href="{{ trim .url " " }}" rel="noopener" title="{{ .name }}">
-                <span class="button-inner">
-                    {{ .name }}
-                    {{- if (findRE "://" .url) }}&nbsp;
-                    <svg fill="none" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round"
-                        stroke-linejoin="round" stroke-width="2.5" viewBox="0 0 24 24" height="14" width="14">
-                        <path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path>
-                        <path d="M15 3h6v6"></path>
-                        <path d="M10 14L21 3"></path>
-                    </svg>
-                    {{- end }}
-                </span>
-            </a>
-            {{- end }}
-        </div>
-        {{- end }}
-    </div>
-    {{- end}}
-</div>
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/post_canonical.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/post_canonical.html
deleted file mode 100644 (file)
index abfc1e3..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{{ if and (.Params.canonicalURL) (.Params.ShowCanonicalLink ) -}}
-{{ $url := urls.Parse .Params.canonicalURL }}
-
-{{- if or .Params.author site.Params.author (.Param "ShowReadingTime") (not .Date.IsZero) .IsTranslated (or .Params.editPost.URL site.Params.editPost.URL) }}&nbsp;|&nbsp;{{- end -}}
-<span>
-    {{- (site.Params.CanonicalLinkText | default .Params.CanonicalLinkText) | default "Originally published at" -}}
-    &nbsp;<a href="{{ trim .Params.canonicalURL " " }}" title="{{ trim .Params.canonicalURL " " }}" target="_blank" rel="noopener noreferrer">{{ $url.Host }}</a>
-</span>
-{{- end }}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/post_meta.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/post_meta.html
deleted file mode 100644 (file)
index ae996ba..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-{{- $scratch := newScratch }}
-
-{{- if not .Date.IsZero -}}
-{{- $scratch.Add "meta" (slice (printf "<span title='%s'>%s</span>" (.Date) (.Date | time.Format (default ":date_long" site.Params.DateFormat)))) }}
-{{- end }}
-
-{{- if (.Param "ShowReadingTime") -}}
-{{- $scratch.Add "meta" (slice (printf "<span>%s</span>" (i18n "read_time" .ReadingTime | default (printf "%d min" .ReadingTime)))) }}
-{{- end }}
-
-{{- if (.Param "ShowWordCount") -}}
-{{- $scratch.Add "meta" (slice (printf "<span>%s</span>" (i18n "words" .WordCount | default (printf "%d words" .WordCount)))) }}
-{{- end }}
-
-{{- if not (.Param "hideAuthor") -}}
-{{- with (partial "author.html" .) }}
-{{- $scratch.Add "meta" (slice (printf "<span>%s</span>" .)) }}
-{{- end }}
-{{- end }}
-
-{{- with ($scratch.Get "meta") }}
-{{- delimit . "&nbsp;·&nbsp;" | safeHTML -}}
-{{- end -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/post_nav_links.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/post_nav_links.html
deleted file mode 100644 (file)
index b988641..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-{{- $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}
-{{- if and (gt (len $pages) 1) (in $pages . ) }}
-<nav class="paginav">
-  {{- with $pages.Next . }}
-  <a class="prev" href="{{ .Permalink }}">
-    <span class="title">« {{ i18n "prev_page" }}</span>
-    <br>
-    <span>{{- .Name -}}</span>
-  </a>
-  {{- end }}
-  {{- with $pages.Prev . }}
-  <a class="next" href="{{ .Permalink }}">
-    <span class="title">{{ i18n "next_page" }} »</span>
-    <br>
-    <span>{{- .Name -}}</span>
-  </a>
-  {{- end }}
-</nav>
-{{- end }}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/share_icons.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/share_icons.html
deleted file mode 100644 (file)
index 910ba7f..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-{{- $pageurl := .Permalink }}
-{{- $title := .Title }}
-
-{{- $.Scratch.Set "tags" ""}}
-
-{{- with .Params.Tags }}
-{{- $hashtags := newScratch}}
-{{- range . }}{{ $hashtags.Add "tags" (slice (replaceRE "(\\s)" "" . ))}}{{end}}
-{{- $.Scratch.Set "tags" (delimit ($hashtags.Get "tags") ",") }}
-{{- end -}}
-
-{{- $custom := false }}
-{{- $ShareButtons := (.Param "ShareButtons")}}
-{{- with $ShareButtons }}{{ $custom = true }}{{ end }}
-
-<ul class="share-buttons">
-    {{- if (or (cond ($custom) (in $ShareButtons "x") (true)) (cond ($custom) (in $ShareButtons "twitter") (true))) }}
-    <li>
-        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on x"
-            href="https://x.com/intent/tweet/?text={{ $title }}&amp;url={{ $pageurl }}&amp;hashtags={{- $.Scratch.Get "tags" -}}">
-            <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
-                <path
-                    d="M512 62.554 L 512 449.446 C 512 483.97 483.97 512 449.446 512 L 62.554 512 C 28.03 512 0 483.97 0 449.446 L 0 62.554 C 0 28.03 28.029 0 62.554 0 L 449.446 0 C 483.971 0 512 28.03 512 62.554 Z M 269.951 190.75 L 182.567 75.216 L 56 75.216 L 207.216 272.95 L 63.9 436.783 L 125.266 436.783 L 235.9 310.383 L 332.567 436.783 L 456 436.783 L 298.367 228.367 L 432.367 75.216 L 371.033 75.216 Z M 127.633 110 L 164.101 110 L 383.481 400.065 L 349.5 400.065 Z" />
-            </svg>
-        </a>
-    </li>
-    {{- end }}
-    {{- if (cond ($custom) (in $ShareButtons "linkedin") (true)) }}
-    <li>
-        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on linkedin"
-            href="https://www.linkedin.com/shareArticle?mini=true&amp;url={{ $pageurl }}&amp;title={{ $title }}&amp;summary={{ $title }}&amp;source={{ $pageurl }}">
-            <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
-                <path
-                    d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-288.985,423.278l0,-225.717l-75.04,0l0,225.717l75.04,0Zm270.539,0l0,-129.439c0,-69.333 -37.018,-101.586 -86.381,-101.586c-39.804,0 -57.634,21.891 -67.617,37.266l0,-31.958l-75.021,0c0.995,21.181 0,225.717 0,225.717l75.02,0l0,-126.056c0,-6.748 0.486,-13.492 2.474,-18.315c5.414,-13.475 17.767,-27.434 38.494,-27.434c27.135,0 38.007,20.707 38.007,51.037l0,120.768l75.024,0Zm-307.552,-334.556c-25.674,0 -42.448,16.879 -42.448,39.002c0,21.658 16.264,39.002 41.455,39.002l0.484,0c26.165,0 42.452,-17.344 42.452,-39.002c-0.485,-22.092 -16.241,-38.954 -41.943,-39.002Z" />
-            </svg>
-        </a>
-    </li>
-    {{- end }}
-    {{- if (cond ($custom) (in $ShareButtons "reddit") (true)) }}
-    <li>
-        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on reddit"
-            href="https://reddit.com/submit?url={{ $pageurl }}&title={{ $title }}">
-            <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
-                <path
-                    d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-3.446,265.638c0,-22.964 -18.616,-41.58 -41.58,-41.58c-11.211,0 -21.361,4.457 -28.841,11.666c-28.424,-20.508 -67.586,-33.757 -111.204,-35.278l18.941,-89.121l61.884,13.157c0.756,15.734 13.642,28.29 29.56,28.29c16.407,0 29.706,-13.299 29.706,-29.701c0,-16.403 -13.299,-29.702 -29.706,-29.702c-11.666,0 -21.657,6.792 -26.515,16.578l-69.105,-14.69c-1.922,-0.418 -3.939,-0.042 -5.585,1.036c-1.658,1.073 -2.811,2.761 -3.224,4.686l-21.152,99.438c-44.258,1.228 -84.046,14.494 -112.837,35.232c-7.468,-7.164 -17.589,-11.591 -28.757,-11.591c-22.965,0 -41.585,18.616 -41.585,41.58c0,16.896 10.095,31.41 24.568,37.918c-0.639,4.135 -0.99,8.328 -0.99,12.576c0,63.977 74.469,115.836 166.33,115.836c91.861,0 166.334,-51.859 166.334,-115.836c0,-4.218 -0.347,-8.387 -0.977,-12.493c14.564,-6.47 24.735,-21.034 24.735,-38.001Zm-119.474,108.193c-20.27,20.241 -59.115,21.816 -70.534,21.816c-11.428,0 -50.277,-1.575 -70.522,-21.82c-3.007,-3.008 -3.007,-7.882 0,-10.889c3.003,-2.999 7.882,-3.003 10.885,0c12.777,12.781 40.11,17.317 59.637,17.317c19.522,0 46.86,-4.536 59.657,-17.321c3.016,-2.999 7.886,-2.995 10.885,0.008c3.008,3.011 3.003,7.882 -0.008,10.889Zm-5.23,-48.781c-16.373,0 -29.701,-13.324 -29.701,-29.698c0,-16.381 13.328,-29.714 29.701,-29.714c16.378,0 29.706,13.333 29.706,29.714c0,16.374 -13.328,29.698 -29.706,29.698Zm-160.386,-29.702c0,-16.381 13.328,-29.71 29.714,-29.71c16.369,0 29.689,13.329 29.689,29.71c0,16.373 -13.32,29.693 -29.689,29.693c-16.386,0 -29.714,-13.32 -29.714,-29.693Z" />
-            </svg>
-        </a>
-    </li>
-    {{- end }}
-    {{- if (cond ($custom) (in $ShareButtons "facebook") (true)) }}
-    <li>
-        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on facebook"
-            href="https://facebook.com/sharer/sharer.php?u={{ $pageurl }}">
-            <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
-                <path
-                    d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-106.468,0l0,-192.915l66.6,0l12.672,-82.621l-79.272,0l0,-53.617c0,-22.603 11.073,-44.636 46.58,-44.636l36.042,0l0,-70.34c0,0 -32.71,-5.582 -63.982,-5.582c-65.288,0 -107.96,39.569 -107.96,111.204l0,62.971l-72.573,0l0,82.621l72.573,0l0,192.915l-191.104,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Z" />
-            </svg>
-        </a>
-    </li>
-    {{- end }}
-    {{- if (cond ($custom) (in $ShareButtons "whatsapp") (true)) }}
-    <li>
-        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on whatsapp"
-            href="https://api.whatsapp.com/send?text={{ $title }}%20-%20{{ $pageurl }}">
-            <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
-                <path
-                    d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-58.673,127.703c-33.842,-33.881 -78.847,-52.548 -126.798,-52.568c-98.799,0 -179.21,80.405 -179.249,179.234c-0.013,31.593 8.241,62.428 23.927,89.612l-25.429,92.884l95.021,-24.925c26.181,14.28 55.659,21.807 85.658,21.816l0.074,0c98.789,0 179.206,-80.413 179.247,-179.243c0.018,-47.895 -18.61,-92.93 -52.451,-126.81Zm-126.797,275.782l-0.06,0c-26.734,-0.01 -52.954,-7.193 -75.828,-20.767l-5.441,-3.229l-56.386,14.792l15.05,-54.977l-3.542,-5.637c-14.913,-23.72 -22.791,-51.136 -22.779,-79.287c0.033,-82.142 66.867,-148.971 149.046,-148.971c39.793,0.014 77.199,15.531 105.329,43.692c28.128,28.16 43.609,65.592 43.594,105.4c-0.034,82.149 -66.866,148.983 -148.983,148.984Zm81.721,-111.581c-4.479,-2.242 -26.499,-13.075 -30.604,-14.571c-4.105,-1.495 -7.091,-2.241 -10.077,2.241c-2.986,4.483 -11.569,14.572 -14.182,17.562c-2.612,2.988 -5.225,3.364 -9.703,1.12c-4.479,-2.241 -18.91,-6.97 -36.017,-22.23c-13.314,-11.876 -22.304,-26.542 -24.916,-31.026c-2.612,-4.484 -0.279,-6.908 1.963,-9.14c2.016,-2.007 4.48,-5.232 6.719,-7.847c2.24,-2.615 2.986,-4.484 4.479,-7.472c1.493,-2.99 0.747,-5.604 -0.374,-7.846c-1.119,-2.241 -10.077,-24.288 -13.809,-33.256c-3.635,-8.733 -7.327,-7.55 -10.077,-7.688c-2.609,-0.13 -5.598,-0.158 -8.583,-0.158c-2.986,0 -7.839,1.121 -11.944,5.604c-4.105,4.484 -15.675,15.32 -15.675,37.364c0,22.046 16.048,43.342 18.287,46.332c2.24,2.99 31.582,48.227 76.511,67.627c10.685,4.615 19.028,7.371 25.533,9.434c10.728,3.41 20.492,2.929 28.209,1.775c8.605,-1.285 26.499,-10.833 30.231,-21.295c3.732,-10.464 3.732,-19.431 2.612,-21.298c-1.119,-1.869 -4.105,-2.99 -8.583,-5.232Z" />
-            </svg>
-        </a>
-    </li>
-    {{- end }}
-    {{- if (cond ($custom) (in $ShareButtons "telegram") (true)) }}
-    <li>
-        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on telegram"
-            href="https://telegram.me/share/url?text={{ $title }}&amp;url={{ $pageurl }}">
-            <svg version="1.1" xml:space="preserve" viewBox="2 2 28 28" height="30px" width="30px" fill="currentColor">
-                <path
-                    d="M26.49,29.86H5.5a3.37,3.37,0,0,1-2.47-1,3.35,3.35,0,0,1-1-2.47V5.48A3.36,3.36,0,0,1,3,3,3.37,3.37,0,0,1,5.5,2h21A3.38,3.38,0,0,1,29,3a3.36,3.36,0,0,1,1,2.46V26.37a3.35,3.35,0,0,1-1,2.47A3.38,3.38,0,0,1,26.49,29.86Zm-5.38-6.71a.79.79,0,0,0,.85-.66L24.73,9.24a.55.55,0,0,0-.18-.46.62.62,0,0,0-.41-.17q-.08,0-16.53,6.11a.59.59,0,0,0-.41.59.57.57,0,0,0,.43.52l4,1.24,1.61,4.83a.62.62,0,0,0,.63.43.56.56,0,0,0,.4-.17L16.54,20l4.09,3A.9.9,0,0,0,21.11,23.15ZM13.8,20.71l-1.21-4q8.72-5.55,8.78-5.55c.15,0,.23,0,.23.16a.18.18,0,0,1,0,.06s-2.51,2.3-7.52,6.8Z" />
-            </svg>
-        </a>
-    </li>
-    {{- end }}
-    {{- if (cond ($custom) (in $ShareButtons "ycombinator") (true)) }}
-    <li>
-        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on ycombinator"
-            href="https://news.ycombinator.com/submitlink?t={{ $title }}&u={{ $pageurl }}">
-            <svg version="1.1" xml:space="preserve" width="30px" height="30px" viewBox="0 0 512 512" fill="currentColor"
-                xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
-                <path
-                    d="M449.446 0C483.971 0 512 28.03 512 62.554L512 449.446C512 483.97 483.97 512 449.446 512L62.554 512C28.03 512 0 483.97 0 449.446L0 62.554C0 28.03 28.029 0 62.554 0L449.446 0ZM183.8767 87.9921H121.8427L230.6673 292.4508V424.0079H281.3328V292.4508L390.1575 87.9921H328.1233L256 238.2489z" />
-            </svg>
-        </a>
-    </li>
-    {{- end }}
-</ul>
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/social_icons.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/social_icons.html
deleted file mode 100644 (file)
index ce76a30..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<div class="social-icons" {{ with .align}}align="{{.}}" {{- end }}>
-    {{- range site.Params.socialIcons }}
-    <a href="{{ trim .url " " | safeURL }}" target="_blank" rel="noopener noreferrer me"
-        title="{{ (.title | default .name) | title }}">
-        {{ partial "svg.html" . }}
-    </a>
-    {{- end }}
-</div>
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/svg.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/svg.html
deleted file mode 100644 (file)
index ab9b4a3..0000000
+++ /dev/null
@@ -1,1001 +0,0 @@
-{{- $icon_name := ( trim .name " " | lower )}}
-{{- if (eq $icon_name "123rf") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path style="font-variation-settings:normal"
-        d="M7.48 3.826c-.702 0-1.345.388-1.675 1.008l-.711 1.334a4.214 4.214 0 0 1-1.614 1.67l-.388.224a2.207 2.207 0 0 0-1.104 1.913v8.607c0 .878.712 1.592 1.59 1.592h1.186c.468 0 .916-.19 1.244-.524l1.478-1.504c.266-.27.628-.421 1.006-.421h7.04c.378 0 .74.151 1.005.421l1.478 1.504c.329.334.778.524 1.247.524h1.183c.879 0 1.592-.714 1.592-1.592V9.975c0-.79-.422-1.518-1.106-1.912l-.388-.225a4.214 4.214 0 0 1-1.613-1.67l-.711-1.334a1.899 1.899 0 0 0-1.676-1.008z"
-        stroke-linejoin="miter" />
-    <circle cx="12" cy="12.467" r="2.723" />
-</svg>
-{{- else if (eq $icon_name "500px") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M7.451 8.9995A3.0005 3.0005 0 1 0 10.4514 12a3.0275 3.0275 0 0 0-3.0006-3.0005Zm0 5.371A2.3554 2.3554 0 1 1 9.7912 12a2.3704 2.3704 0 0 1-2.3404 2.3704Zm6.448-5.371A3.0005 3.0005 0 1 0 16.8997 12a3.0005 3.0005 0 0 0-3.0005-3.0005Zm0 5.371A2.3554 2.3554 0 1 1 16.2396 12a2.3314 2.3314 0 0 1-2.3404 2.3704zM2.29 10.7997a2.0224 2.0224 0 0 0-1.5903.42V9.6297h2.7005c.09 0 .15-.03.15-.3 0-.2701-.12-.2701-.18-.2701H.3997a.27.27 0 0 0-.27.27V11.97c0 .15.09.18.24.21a.228.228 0 0 0 .27-.06A1.7073 1.7073 0 0 1 2.14 11.4 1.5603 1.5603 0 0 1 3.4902 12.72 1.5183 1.5183 0 0 1 2.17 14.4004h-.18a1.5303 1.5303 0 0 1-1.4103-.9901c-.03-.09-.09-.15-.33-.06-.2401.09-.2701.15-.2401.24a2.1274 2.1274 0 0 0 2.7005 1.2602A2.1274 2.1274 0 0 0 3.9703 12.15 2.1004 2.1004 0 0 0 2.29 10.7998zm16.65-1.7703a1.6263 1.6263 0 0 0-1.4403 1.6203v2.6704c0 .15.12.18.3.18s.3001-.03.3001-.18v-2.6704a1.0082 1.0082 0 0 1 .8702-1.0202.9872.9872 0 0 1 .7501.24.9572.9572 0 0 1 .33.7202 1.2002 1.2002 0 0 1-.21.57A.9452.9452 0 0 1 19 11.55c-.12 0-.21 0-.24.27 0 .1801 0 .2701.15.3001a1.4763 1.4763 0 0 0 .8701-.18 1.6113 1.6113 0 0 0 .8702-1.2602 1.5543 1.5543 0 0 0-1.4463-1.6803.8311.8311 0 0 1-.264.03zm3.9307 1.5602 1.0802-1.0801c.03-.03.12-.12-.06-.3301a.3.3 0 0 0-.2101-.12.156.156 0 0 0-.12.06l-1.0802 1.0802-1.0802-1.1102c-.09-.09-.18-.06-.33.06-.15.12-.15.24-.06.33l1.0801 1.0802-1.0862 1.1102a.228.228 0 0 0-.06.12.252.252 0 0 0 .12.2101.483.483 0 0 0 .21.12.318.318 0 0 0 .1501-.06l1.0802-1.0802 1.0802 1.0802a.156.156 0 0 0 .12.06.3.3 0 0 0 .21-.12c.09-.12.12-.24.03-.3z" />
-</svg>
-{{- else if (eq $icon_name "adobestock") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path style="font-variation-settings:normal" d="M2.235 2.235h19.53v19.53H2.235z" />
-    <path style="font-variation-settings:normal"
-        d="M6.165 16.659s3.16 1.2 4.602-.17c1.37-1.3.787-3.163-.754-4.05-1.68-.969-3.284-1.788-3.036-3.536.446-3.138 4.386-1.851 4.386-1.851M15.792 7.794v7.774c0 1.023.635 1.766 2.043 1.624M17.826 10.04h-3.582" />
-</svg>
-{{- else if (eq $icon_name "anilist") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -2 25 28" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path style="font-variation-settings:normal"
-        d="M6.361 2.943 0 21.056h4.942l1.077-3.133H11.4l1.052 3.133H22.9c.71 0 1.1-.392 1.1-1.101V17.53c0-.71-.39-1.101-1.1-1.101h-6.483V4.045c0-.71-.392-1.102-1.101-1.102h-2.422c-.71 0-1.101.392-1.101 1.102v1.064l-.758-2.166zm2.324 5.948 1.688 5.018H7.144z" />
-</svg>
-{{- else if or (eq $icon_name "ao3") (eq $icon_name "archiveofourown") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="1 1 22 22" stroke-width="1.6" stroke="currentColor" fill="none"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path stroke="none" d="M0 0h24v24H0z" fill="none" />
-    <path d="M2 5c7.109 4.1 10.956 10.131 12 14c1.074 -4.67 4.49 -8.94 8 -11" />
-    <path d="M14 8m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
-    <path d="M7 9c-.278 5.494 -2.337 7.33 -4 10c4.013 -2 6.02 -5 15.05 -5c4.012 0 3.51 2.5 1 3c2 .5 2.508 5 -2.007 2" />
-</svg>
-{{- else if (eq $icon_name "applemusic") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="M23.994 6.124a9.23 9.23 0 00-.24-2.19c-.317-1.31-1.062-2.31-2.18-3.043a5.022 5.022 0 00-1.877-.726 10.496 10.496 0 00-1.564-.15c-.04-.003-.083-.01-.124-.013H5.986c-.152.01-.303.017-.455.026-.747.043-1.49.123-2.193.4-1.336.53-2.3 1.452-2.865 2.78-.192.448-.292.925-.363 1.408-.056.392-.088.785-.1 1.18 0 .032-.007.062-.01.093v12.223c.01.14.017.283.027.424.05.815.154 1.624.497 2.373.65 1.42 1.738 2.353 3.234 2.801.42.127.856.187 1.293.228.555.053 1.11.06 1.667.06h11.03a12.5 12.5 0 001.57-.1c.822-.106 1.596-.35 2.295-.81a5.046 5.046 0 001.88-2.207c.186-.42.293-.87.37-1.324.113-.675.138-1.358.137-2.04-.002-3.8 0-7.595-.003-11.393zm-6.423 3.99v5.712c0 .417-.058.827-.244 1.206-.29.59-.76.962-1.388 1.14-.35.1-.706.157-1.07.173-.95.045-1.773-.6-1.943-1.536a1.88 1.88 0 011.038-2.022c.323-.16.67-.25 1.018-.324.378-.082.758-.153 1.134-.24.274-.063.457-.23.51-.516a.904.904 0 00.02-.193c0-1.815 0-3.63-.002-5.443a.725.725 0 00-.026-.185c-.04-.15-.15-.243-.304-.234-.16.01-.318.035-.475.066-.76.15-1.52.303-2.28.456l-2.325.47-1.374.278c-.016.003-.032.01-.048.013-.277.077-.377.203-.39.49-.002.042 0 .086 0 .13-.002 2.602 0 5.204-.003 7.805 0 .42-.047.836-.215 1.227-.278.64-.77 1.04-1.434 1.233-.35.1-.71.16-1.075.172-.96.036-1.755-.6-1.92-1.544-.14-.812.23-1.685 1.154-2.075.357-.15.73-.232 1.108-.31.287-.06.575-.116.86-.177.383-.083.583-.323.6-.714v-.15c0-2.96 0-5.922.002-8.882 0-.123.013-.25.042-.37.07-.285.273-.448.546-.518.255-.066.515-.112.774-.165.733-.15 1.466-.296 2.2-.444l2.27-.46c.67-.134 1.34-.27 2.01-.403.22-.043.442-.088.663-.106.31-.025.523.17.554.482.008.073.012.148.012.223.002 1.91.002 3.822 0 5.732z" />
-</svg>
-{{- else if (eq $icon_name "applepodcasts") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M5.34 0A5.328 5.328 0 000 5.34v13.32A5.328 5.328 0 005.34 24h13.32A5.328 5.328 0 0024 18.66V5.34A5.328 5.328 0 0018.66 0zm6.525 2.568c2.336 0 4.448.902 6.056 2.587 1.224 1.272 1.912 2.619 2.264 4.392.12.59.12 2.2.007 2.864a8.506 8.506 0 01-3.24 5.296c-.608.46-2.096 1.261-2.336 1.261-.088 0-.096-.091-.056-.46.072-.592.144-.715.48-.856.536-.224 1.448-.874 2.008-1.435a7.644 7.644 0 002.008-3.536c.208-.824.184-2.656-.048-3.504-.728-2.696-2.928-4.792-5.624-5.352-.784-.16-2.208-.16-3 0-2.728.56-4.984 2.76-5.672 5.528-.184.752-.184 2.584 0 3.336.456 1.832 1.64 3.512 3.192 4.512.304.2.672.408.824.472.336.144.408.264.472.856.04.36.03.464-.056.464-.056 0-.464-.176-.896-.384l-.04-.03c-2.472-1.216-4.056-3.274-4.632-6.012-.144-.706-.168-2.392-.03-3.04.36-1.74 1.048-3.1 2.192-4.304 1.648-1.737 3.768-2.656 6.128-2.656zm.134 2.81c.409.004.803.04 1.106.106 2.784.62 4.76 3.408 4.376 6.174-.152 1.114-.536 2.03-1.216 2.88-.336.43-1.152 1.15-1.296 1.15-.023 0-.048-.272-.048-.603v-.605l.416-.496c1.568-1.878 1.456-4.502-.256-6.224-.664-.67-1.432-1.064-2.424-1.246-.64-.118-.776-.118-1.448-.008-1.02.167-1.81.562-2.512 1.256-1.72 1.704-1.832 4.342-.264 6.222l.413.496v.608c0 .336-.027.608-.06.608-.03 0-.264-.16-.512-.36l-.034-.011c-.832-.664-1.568-1.842-1.872-2.997-.184-.698-.184-2.024.008-2.72.504-1.878 1.888-3.335 3.808-4.019.41-.145 1.133-.22 1.814-.211zm-.13 2.99c.31 0 .62.06.844.178.488.253.888.745 1.04 1.259.464 1.578-1.208 2.96-2.72 2.254h-.015c-.712-.331-1.096-.956-1.104-1.77 0-.733.408-1.371 1.112-1.745.224-.117.534-.176.844-.176zm-.011 4.728c.988-.004 1.706.349 1.97.97.198.464.124 1.932-.218 4.302-.232 1.656-.36 2.074-.68 2.356-.44.39-1.064.498-1.656.288h-.003c-.716-.257-.87-.605-1.164-2.644-.341-2.37-.416-3.838-.218-4.302.262-.616.974-.966 1.97-.97z" />
-</svg>
-{{- else if (eq $icon_name "bandcamp") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path d="M0 18.75l7.437-13.5H24l-7.438 13.5H0z" />
-</svg>
-{{- else if (eq $icon_name "behance") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path paint-order="stroke fill markers" stroke-linejoin="miter" stroke-width="2"
-        style="font-variation-settings:normal"
-        d="M1.774 18.063V5.466h5.51c1.978 0 3.116 1.326 3.055 2.806-.043 1.049-.711 2.988-2.643 2.988h-5.93H7.73c1.224 0 3.532 1.13 3.532 3.532 0 2.4-1.873 3.27-3.318 3.27zm12.57-4.459h7.89s.012-4.18-4.167-4.18c-5.237 0-5.277 9.11-.3 9.11 3.06 0 3.935-1.806 3.935-1.806M15.526 5.823h4.987" />
-</svg>
-{{- else if (eq $icon_name "bilibili") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round">
-    <rect x="1.3333" y="6" width="21.333" height="15.333" rx="4" ry="4" />
-    <path d="m8 12.4v1.2" />
-    <path d="m16 12.4v1.2" />
-    <path d="m5.8853 2.6667 2.6667 2.6667" />
-    <path d="m18.115 2.6667-2.6667 2.6667" />
-</svg>
-{{- else if (eq $icon_name "bitcoin") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M23.638 14.904c-1.602 6.43-8.113 10.34-14.542 8.736C2.67 22.05-1.244 15.525.362 9.105 1.962 2.67 8.475-1.243 14.9.358c6.43 1.605 10.342 8.115 8.738 14.548v-.002zm-6.35-4.613c.24-1.59-.974-2.45-2.64-3.03l.54-2.153-1.315-.33-.525 2.107c-.345-.087-.705-.167-1.064-.25l.526-2.127-1.32-.33-.54 2.165c-.285-.067-.565-.132-.84-.2l-1.815-.45-.35 1.407s.975.225.955.236c.535.136.63.486.615.766l-1.477 5.92c-.075.166-.24.406-.614.314.015.02-.96-.24-.96-.24l-.66 1.51 1.71.426.93.242-.54 2.19 1.32.327.54-2.17c.36.1.705.19 1.05.273l-.51 2.154 1.32.33.545-2.19c2.24.427 3.93.257 4.64-1.774.57-1.637-.03-2.58-1.217-3.196.854-.193 1.5-.76 1.68-1.93h.01zm-3.01 4.22c-.404 1.64-3.157.75-4.05.53l.72-2.9c.896.23 3.757.67 3.33 2.37zm.41-4.24c-.37 1.49-2.662.735-3.405.55l.654-2.64c.744.18 3.137.524 2.75 2.084v.006z" />
-</svg>
-{{- else if (eq $icon_name "bluesky") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="-25 0 400 320" fill="none" stroke="currentColor" stroke-width="30">
-    <path
-        d="M180 141.964C163.699 110.262 119.308 51.1817 78.0347 22.044C38.4971 -5.86834 23.414 -1.03207 13.526 3.43594C2.08093 8.60755 0 26.1785 0 36.5164C0 46.8542 5.66748 121.272 9.36416 133.694C21.5786 174.738 65.0603 188.607 105.104 184.156C107.151 183.852 109.227 183.572 111.329 183.312C109.267 183.642 107.19 183.924 105.104 184.156C46.4204 192.847 -5.69621 214.233 62.6582 290.33C137.848 368.18 165.705 273.637 180 225.702C194.295 273.637 210.76 364.771 295.995 290.33C360 225.702 313.58 192.85 254.896 184.158C252.81 183.926 250.733 183.645 248.671 183.315C250.773 183.574 252.849 183.855 254.896 184.158C294.94 188.61 338.421 174.74 350.636 133.697C354.333 121.275 360 46.8568 360 36.519C360 26.1811 357.919 8.61012 346.474 3.43851C336.586 -1.02949 321.503 -5.86576 281.965 22.0466C240.692 51.1843 196.301 110.262 180 141.964Z" />
-</svg>
-{{- else if (eq $icon_name "bookwyrm") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="m8.3359 0.0078125c-2.0069 0.073882-3.9461 1.339-5.1719 3.1055-1.2258 1.7665-1.686 4.04-0.90234 6.2734 0.7201 2.0524 2.301 3.6839 4.377 4.3066l-0.40234 2.5547c-0.61924-0.29743-1.2854-0.52634-1.9707-0.55078-1.0699-0.03816-2.6915 0.27366-3.707 2.0703-0.69877 1.2362-0.81095 2.9826 0.10555 4.4707 0.61159 0.99303 1.7053 1.9179 4.2929 1.4745 1.4845-0.25433 2.2237-1.3456 2.9082-2.9727 0.37179-0.88378 0.65101-2.0921 1.1895-2.8398 0.73644-1.0227 2.285-1.5902 3.2578-1.6113-0.93782-0.45256-3.7855-1.1922-5.584 1.8008-0.48715 0.8107-1.0605 2.4179-1.9609 2.9531-0.2998 0.1782-0.76718 0.0994-1.0781-0.13477-0.20088-0.15128-0.95922-1.0342-0.16016-1.9395 0.21799-0.24696 0.54865-0.3631 0.93555-0.33398 0.26333 0.01982 0.55734 0.12268 0.88477 0.35352 0.21582-0.44651 0.44063-0.88851 0.68359-1.3204 0.19226-0.34173 0.49358-0.75049 0.88086-1.1426l0.87305-5.3652c-0.24381 0.10022-0.52508 0.15616-0.76367 0.18559-0.41295 0.05094-0.81717 0.02605-1.1895-0.08789-0.48449-0.14828-0.99894-0.41785-1.2695-0.93554-0.086172-0.16486-0.024184-0.37016 0.13477-0.4668 0.17373-0.10562 0.37573-0.028092 0.5 0.13281 0.41046 0.53144 1.1723 0.85969 2.0879 0.58794 1.2598-0.3318 2.1585-0.89477 2.7973-0.94823 0.62644-0.052424 0.9395 0.63646 1.1998 1.2859 0.08927-0.40702 0.33679-1.217 1-0.30078 0.020069-0.7907 0.48358-0.94364 0.93945-0.37895-1.2259-2.9496-3.6999-1.7628-5.0589-1.4148-0.63799 0.1634-1.8432 0.2286-2.5441-1.5549-0.19205-1.9238 0.832-3.0815 1.9497-3.6181 1.11-0.5329 2.4759-0.33316 3.4043 0.23242-0.36121 0.71072-0.96917 0.66041-1.7031 0.73633 0.97044 0.57933 1.6654 0.51691 2.4707 0.23438 0.05017 0.64643-0.27301 0.94594-0.66797 1.4023 1.1363 0.014693 1.7281-0.12865 1.9199-0.2207-0.06996-0.12068-0.13737-0.24477-0.20117-0.375-0.15114-0.30851-0.20068-1.0047-0.10742-1.7402 0.2535 0.25256 0.66781 0.50633 1.0586 0.54492-0.13923-0.55326 0.04953-1.4041 0.36523-1.9453 0.17929 0.22031 0.65534 0.48341 1.0664 0.51758-0.03367-0.13937-0.01471-0.38143 0.01758-0.63672-0.9214-0.25345-1.2388-0.43896-1.8164-0.75195-0.73954-0.40078-3.2824-1.7015-5.041-1.6367zm11.457 1.4355-0.50391 1.0195c-0.6186-0.30447-1.3497 0.099697-1.4238 0.78516 0 0-1.575-0.59615-1.7793-1.3223-0.25838 0.42041-0.34228 1.2928-0.10156 1.9375-0.25368 0.056883-1.3427-0.18224-1.5254-0.42578-0.17662 0.4343-0.06096 1.5935 0.38086 1.9824-0.70463-0.029033-1.2107-0.10404-1.6016-0.47266 0.05528 0.65482 1.1567 2.5058 3.0605 2.4473 1.8859-0.057961 5.3416-2.0444 5.1172 0.77734l0.76367-0.91406 0.44922 1.082 0.12891-1.502 0.62891 0.10352-0.01563-0.86719c-1.0878 0.21766-2.216 0.15404-3.2715-0.1875 0 0 0.81541-1.2247 3.2109-0.62695 0 0 1.0704-0.18142 0.54492-1.0547-0.52548-0.87327-1.0156 0.42383-1.0156 0.42383-0.45143-0.28472-0.85656-0.63336-1.291-0.94336-0.79444-0.56687-1.4356-1.3204-1.7559-2.2422zm-0.8418 1.2695c0.75216-0.00879 1.4355 0.46302 1.7031 1.166 0.04186 0.10996 0.15236 0.15844 0.26758 0.13477 0.1635-0.033594 0.32277 0.073435 0.36719 0.23438 0.04852 0.17581-0.05737 0.35656-0.23437 0.40039-0.43572 0.1079-0.84051-0.14952-1.002-0.56836-0.02156-0.055928-0.27308-0.7224-1.1016-0.70117-0.187 0.00479-0.33205-0.14489-0.33203-0.33203 0-0.18715 0.14489-0.3318 0.33203-0.33398zm0.25781 1.0957c0.26687 0.00108 0.48296 0.21751 0.48242 0.48438-5.37e-4 0.26611-0.21632 0.48135-0.48242 0.48242-0.26763 0.00108-0.48579-0.21479-0.48633-0.48242-5.41e-4 -0.2684 0.21793-0.48546 0.48633-0.48438zm-10.809 3.0397c-0.34991 0.22367-0.78824 0.66637-0.87563 1.2212l-0.02322 0.14744c0.11372 0.12466 0.70444-9.118e-4 0.7719-0.043257 0.072919-0.44812 0.27343-0.56586 0.52734-0.7258 0.23894-0.15051 0.51638-0.15096 0.6371-0.12959l8.1113 1.4355-1.5332 9.2793-4.498-0.7793c-0.90219 0.26905-1.5466 0.74872-1.8106 1.1153-0.23032 0.31978-0.45999 0.95271-0.64258 1.457h0.00195l5.6465 0.94531 0.10547-0.60938 0.26172-1.5273c2e-3 -0.0014 0.0039-0.0025 0.0059-0.0039l1.4961 0.27148 0.60547-3.5977c0.53943 0.80503 0.83125 1.8162 0.69727 2.6641-0.14 0.88552-0.69613 1.6056-1.9375 1.9688-0.12433 0.03633-0.24744 0.06753-0.36914 0.0957l-0.19727 1.2051c-0.03115 0.20643-0.23137 0.34436-0.43555 0.30078l-6.1348-1.0312-0.4043 0.97656c1.464 1.0792 3.2449 2.1812 5.5723 2.2578 1.1718 0.03857 2.7611-0.13523 4.207-0.83594 1.4459-0.7007 2.7188-1.9524 3.2031-3.9375 0.35588-1.4586 0.21674-3.049-0.29883-4.4395-0.7975-2.1508-2.4648-3.307-3.1621-3.625l0.45703-2.7188-1.0625-0.19141c-1.0515 0.21674-2.1447 0.13408-3.1035-0.5625l-4.6797-0.84768c-0.15388-0.027874-0.67134-0.034627-1.1391 0.26435zm1.2523 3.6087-0.00195 0.0039-0.8125 4.8438c0.78057-0.26418 1.5395-0.2905 2.2051-0.20898l0.64636-3.8533c-0.23318 0.2305-0.41364 0.22022-0.48214 0.21007-0.51767-0.07669-0.62748-0.99295-0.98846-1.1614-0.11104-0.05182-0.29544-0.02624-0.56639 0.16594z" />
-</svg>
-{{- else if (eq $icon_name "bugcrowd") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M24 12L18 1.387H6L0 12l6 10.613h12zm-5.782 1.658c-.003.825-.122 1.569-.354 2.231a5.05 5.05 0 0 1-.99 1.708 4.316 4.316 0 0 1-1.503 1.093 4.69 4.69 0 0 1-1.896.385 4.158 4.158 0 0 1-1.145-.152 3.754 3.754 0 0 1-.868-.36 3.792 3.792 0 0 1-.601-.435 3.023 3.023 0 0 1-.466-.514h-.04l.02.193c.011.166.018.331.02.497v.528H7.961V7.062c0-.151-.04-.263-.114-.337-.077-.074-.19-.109-.33-.109h-.811V4.425h2.452c.473-.003.824.108 1.048.331.222.223.333.576.33 1.049v3.003c-.003.258-.01.467-.02.626l-.02.247h.04a2.898 2.898 0 0 1 .463-.507c.156-.143.354-.284.6-.426.245-.142.538-.261.876-.36.38-.1.77-.15 1.162-.148.702.003 1.334.135 1.894.395a4.118 4.118 0 0 1 1.446 1.11c.4.48.707 1.052.92 1.715.212.658.317 1.392.32 2.198m-2.803 1.406c.138-.399.206-.852.209-1.366-.003-.659-.112-1.231-.328-1.718-.216-.484-.517-.859-.902-1.125a2.347 2.347 0 0 0-1.344-.404 2.57 2.57 0 0 0-.969.186 2.372 2.372 0 0 0-.83.589 2.839 2.839 0 0 0-.579 1.015c-.141.413-.212.906-.216 1.477 0 .397.053.792.159 1.174.101.366.265.712.483 1.02.211.3.486.548.805.722.32.176.698.267 1.127.27.343.002.683-.07.997-.213a2.43 2.43 0 0 0 .824-.623c.24-.273.428-.607.564-1.004Z" />
-</svg>
-{{- else if (eq $icon_name "buttondown") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 520 520" stroke="none" stroke-width="1" fill="none"
-    fill-rule="evenodd">
-    <g>
-        <g transform="translate(4, 4.075)" fill-rule="nonzero" stroke="currentColor">
-            <g transform="translate(256, 255.9625) scale(-1, 1) rotate(-180) translate(-256, -255.9625)translate(0, 0)">
-                <path
-                    d="M301.6606,14.1373853 C303.688746,15.1698525 310.677734,16.9113405 318.761474,17.4327026 L319.541861,17.4809376 C319.825804,17.4976809 320.110512,17.5135842 320.399561,17.5288479 C343.999067,18.8284973 371.499186,24.4257864 387.885292,31.3591646 C389.181101,31.9620544 390.66612,32.5947748 391.905059,33.118941 C392.457805,33.3527953 392.939556,33.5536822 393.264934,33.7015814 C412.253041,41.8039575 429.258626,53.4407732 443.988462,68.0795656 C458.987342,83.1852739 470.054864,99.5757529 478.566662,119.436613 C479.232992,120.911103 479.797477,122.244579 480.266338,123.348721 C480.69095,124.348659 481.055744,125.201101 481.297832,125.733696 C482.04768,127.342286 483.431159,131.761421 484.827767,136.297068 L485.106229,137.205397 C485.646254,138.974836 486.171716,140.74265 486.644558,142.383076 L486.880758,143.207351 C487.207895,144.356002 487.503394,145.423929 487.751708,146.362309 C490.93928,158.570506 493.630153,177.2304 494.475121,191.67464 C494.489037,191.936321 494.503699,192.197595 494.519062,192.458134 L494.567297,193.238521 C495.088659,201.322261 496.830148,208.311249 497.533797,209.718548 C498.334936,211.178568 497.319844,228.009 497.058098,246.405938 L497.042743,247.557661 C497.037968,247.942166 497.033542,248.327226 497.02949,248.712715 L497.017514,249.984954 C497.005194,251.470665 496.998775,252.960712 496.99958,254.447993 L496.999676,258.181669 C497.000028,258.606948 497.000957,259.032365 497.002432,259.457749 L497.008473,260.73363 C497.011015,261.158776 497.014077,261.583719 497.017629,262.008287 L497.029731,263.280699 L497.036167,263.858626 L497.050699,265.012063 C497.303024,283.630141 498.381851,300.733383 497.862615,301.660591 C496.830148,303.688737 495.088659,310.677724 494.567297,318.761465 L494.519062,319.541851 C494.502319,319.825795 494.486416,320.110503 494.471152,320.399552 C493.171503,343.999057 487.574213,371.499175 480.640835,387.885281 C480.037945,389.18109 479.405225,390.666109 478.881059,391.905047 C478.647204,392.457794 478.446317,392.939544 478.298418,393.264922 C470.196042,412.253029 458.559226,429.258613 443.920433,443.988449 C428.814724,458.987328 412.424245,470.05485 392.563384,478.566648 C391.088894,479.232978 389.755418,479.797462 388.651276,480.266324 C387.651338,480.690936 386.798896,481.055729 386.266301,481.297818 C384.657711,482.047666 380.238576,483.431145 375.702929,484.827753 L374.794599,485.106214 C373.02516,485.64624 371.257346,486.171702 369.61692,486.644544 L368.792645,486.880744 C367.643994,487.207881 366.576067,487.503379 365.637687,487.751694 C353.42949,490.939266 334.769595,493.630139 320.325355,494.475106 C320.063674,494.489023 319.802399,494.503685 319.541861,494.519048 L318.761474,494.567283 C310.677734,495.088645 303.688746,496.830133 302.281447,497.533782 C302.035045,497.661499 301.011128,497.716526 299.363262,497.7223 L298.898489,497.722671 C292.818341,497.712349 279.458647,497.139676 265.150262,496.970881 L263.86424,496.956847 C263.43483,496.952547 263.004741,496.948635 262.574142,496.945135 L261.280986,496.935901 C260.849538,496.933253 260.417748,496.931043 259.985788,496.929298 L258.689562,496.925483 L258.041381,496.924669 L253.657009,496.924794 C253.446174,496.925019 253.235292,496.925408 253.024384,496.925957 L251.758805,496.931136 C250.282339,496.939343 248.806728,496.954997 247.339358,496.976767 L246.083802,496.996893 C231.045475,497.255639 217.102055,498.121167 212.28841,498.144484 L211.908579,498.144446 C211.132148,498.140007 210.660626,498.106798 210.541309,498.036292 C208.804002,497.065047 200.747967,494.947781 191.70142,494.4712 C168.007289,493.171931 140.502731,487.575001 124.114708,480.640821 C122.818899,480.037931 121.33388,479.405211 120.094941,478.881044 C119.542195,478.64719 119.060444,478.446303 118.735066,478.298404 C99.7469589,470.196028 82.741374,458.559212 68.0115377,443.92042 C53.0126581,428.814711 41.9451357,412.424232 33.4333382,392.563372 C32.7670076,391.088883 32.2025234,389.755406 31.7336621,388.651264 C31.3090498,387.651326 30.9442562,386.798884 30.7021677,386.26629 C29.95232,384.6577 28.5688409,380.238565 27.1722326,375.702918 L26.8937715,374.794588 C26.3537459,373.025149 25.828284,371.257335 25.3554418,369.616909 L25.1192419,368.792634 C24.7921049,367.643983 24.4966065,366.576056 24.2482917,365.637676 C21.0607195,353.42948 18.3698466,334.769585 17.5248792,320.325345 C17.5109627,320.063665 17.4963009,319.80239 17.4809377,319.541851 L17.4327026,318.761465 C16.9113405,310.677724 15.1698524,303.688737 14.4662028,302.281438 C13.6650642,300.821417 14.6801556,283.990985 14.9419016,265.594047 L14.9572566,264.442324 C14.9620324,264.057819 14.9664581,263.67276 14.9705103,263.28727 L14.9824855,262.015031 C14.9948063,260.52932 15.0012251,259.039273 15.0004199,257.551993 L15.0003241,253.818317 C14.9999715,253.393037 14.9990434,252.96762 14.9975678,252.542236 L14.991527,251.266356 C14.9889848,250.841209 14.9859234,250.416266 14.982371,249.991698 L14.9702689,248.719286 L14.9638332,248.14136 L14.9493008,246.987923 C14.6969761,228.369845 13.6181487,211.266602 14.1373851,210.339394 C15.1698524,208.311249 16.9113405,201.322261 17.4327026,193.238521 L17.4809376,192.458134 C17.497681,192.174191 17.5135843,191.889482 17.528848,191.600434 C18.8284974,168.000928 24.4257866,140.500811 31.359165,124.114705 C31.9620548,122.818896 32.5947752,121.333877 33.1189414,120.094938 C33.3527958,119.542192 33.5536826,119.060441 33.7015818,118.735063 C41.8039581,99.7469565 53.4407742,82.7413722 68.0795669,68.0115364 C83.1852758,53.0126572 99.5757552,41.945135 119.436616,33.4333378 C120.911106,32.7670072 122.244582,32.202523 123.348724,31.7336617 C124.348662,31.3090494 125.201104,30.9442559 125.733699,30.7021673 C127.342289,29.9523196 131.761424,28.5688406 136.297071,27.1722323 L137.205401,26.8937712 C138.97484,26.3537457 140.742654,25.8282838 142.38308,25.3554416 L143.207355,25.1192417 C144.356006,24.7921047 145.423933,24.4966062 146.362313,24.2482914 C158.57051,21.0607194 177.230405,18.3698465 191.674645,17.5248791 C191.936326,17.5109626 192.197601,17.4963008 192.458139,17.4809376 L193.238526,17.4327026 C201.322266,16.9113405 208.311254,15.1698525 209.718553,14.4662029 C211.178574,13.6650644 228.009006,14.6801556 246.405945,14.9419016 L247.557668,14.9572566 C247.942173,14.9620325 248.327233,14.9664581 248.712722,14.9705103 L249.984961,14.9824855 C251.470672,14.9948063 252.960719,15.0012251 254.448,15.0004199 L258.181676,15.0003241 C258.606956,14.9999715 259.032373,14.9990434 259.457757,14.9975678 L260.733637,14.991527 C261.158784,14.9889848 261.583727,14.9859234 262.008295,14.982371 L263.280707,14.970269 L263.858633,14.9638332 L265.012071,14.9493008 C283.630149,14.6969761 300.733392,13.6181489 301.6606,14.1373853 Z M265.026493,92.0296599 L249.744651,92.029657 C167.461891,92.0425357 153.533809,92.6396122 147.982352,93.9766623 C121.749425,100.534894 104.713136,116.950788 96.7054361,143.900268 C95.2786079,148.894167 94.5374284,160.056741 94.5288557,250.581875 L94.5288556,261.41669 C94.5374284,351.943244 95.2786079,363.105819 96.7477126,368.24491 C104.585874,394.6671 121.509461,411.196166 147.229818,417.884338 C151.997298,419.128018 169.925259,419.767249 256.681942,419.870901 C265.575313,419.880905 273.69874,419.887907 281.123349,419.891007 L283.874959,419.891985 L284.417493,419.892136 L293.747859,419.892182 C352.240621,419.875332 361.867876,419.160649 366.882835,417.906751 C380.083055,414.543234 391.091619,408.294586 399.693108,399.693097 C408.294598,391.091608 414.543245,380.083045 417.923354,366.817091 C419.330777,361.1874 419.957356,349.104459 419.970337,263.831745 L419.970337,248.170524 C419.957356,162.895526 419.330777,150.812585 417.906762,145.11716 C414.543245,131.91694 408.294598,120.908377 399.693108,112.306888 C391.091619,103.705399 380.083055,97.4567518 366.817101,94.0766428 C361.184993,92.6686158 349.194124,92.0426462 265.026493,92.0296599 Z"
-                    id="Shape" stroke-width="30"></path>
-                <path
-                    d="M237.756837,213.880303 C243.697542,212.351025 270.469508,212.355347 276.296906,213.894654 C307.747937,222.419986 319.857121,230.722369 355.205849,265.603984 L364.751388,274.99473 L356.628995,283.164902 L356.006401,283.786883 L355.368551,284.422819 C351.240042,288.534779 347.834019,296.489642 347.482132,296.489642 C347.137754,296.489642 341.927037,286.842876 335.740337,280.770542 C324.562608,269.698323 314.086597,259.727944 312.615545,258.568741 C302.060008,250.029682 293.681914,245.050055 282.218718,240.487036 C280.744798,239.835173 275.247856,238.382783 269.811392,237.366989 L269.035607,237.224979 C268.777443,237.178722 268.519857,237.133588 268.26329,237.089711 C259.560898,235.480011 255.795602,235.511124 248.176661,236.63523 C224.145112,240.365796 209.964715,248.544545 173.648855,285.080499 C172.894405,285.844068 172.174746,286.568578 171.467223,287.277146 L170.547933,288.195658 C168.41448,290.322353 166.776972,296.489642 166.517477,296.489642 C166.141508,296.489642 162.333834,288.123417 157.783584,283.577722 L149.427943,275.22216 L157.641045,267.057087 C193.587122,231.204097 206.428095,222.321851 237.756837,213.880303 Z"
-                    id="Path" stroke-width="25"></path>
-            </g>
-        </g>
-    </g>
-</svg>
-{{- else if (eq $icon_name "buymeacoffee") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 884 1279" fill="none" stroke="currentColor" stroke-width="2">
-    <path d="M791.109 297.518L790.231 297.002L788.201 296.383C789.018 297.072 790.04 297.472 791.109 297.518Z"
-        fill="currentColor"></path>
-    <path d="M803.896 388.891L802.916 389.166L803.896 388.891Z" fill="currentColor"></path>
-    <path
-        d="M791.484 297.377C791.359 297.361 791.237 297.332 791.118 297.29C791.111 297.371 791.111 297.453 791.118 297.534C791.252 297.516 791.379 297.462 791.484 297.377Z"
-        fill="currentColor"></path>
-    <path d="M791.113 297.529H791.244V297.447L791.113 297.529Z" fill="currentColor"></path>
-    <path
-        d="M803.111 388.726L804.591 387.883L805.142 387.573L805.641 387.04C804.702 387.444 803.846 388.016 803.111 388.726Z"
-        fill="currentColor"></path>
-    <path d="M793.669 299.515L792.223 298.138L791.243 297.605C791.77 298.535 792.641 299.221 793.669 299.515Z"
-        fill="currentColor"></path>
-    <path
-        d="M430.019 1186.18C428.864 1186.68 427.852 1187.46 427.076 1188.45L427.988 1187.87C428.608 1187.3 429.485 1186.63 430.019 1186.18Z"
-        fill="currentColor"></path>
-    <path
-        d="M641.187 1144.63C641.187 1143.33 640.551 1143.57 640.705 1148.21C640.705 1147.84 640.86 1147.46 640.929 1147.1C641.015 1146.27 641.084 1145.46 641.187 1144.63Z"
-        fill="currentColor"></path>
-    <path
-        d="M619.284 1186.18C618.129 1186.68 617.118 1187.46 616.342 1188.45L617.254 1187.87C617.873 1187.3 618.751 1186.63 619.284 1186.18Z"
-        fill="currentColor"></path>
-    <path
-        d="M281.304 1196.06C280.427 1195.3 279.354 1194.8 278.207 1194.61C279.136 1195.06 280.065 1195.51 280.684 1195.85L281.304 1196.06Z"
-        fill="currentColor"></path>
-    <path
-        d="M247.841 1164.01C247.704 1162.66 247.288 1161.35 246.619 1160.16C247.093 1161.39 247.489 1162.66 247.806 1163.94L247.841 1164.01Z"
-        fill="currentColor"></path>
-    <path
-        d="M472.623 590.836C426.682 610.503 374.546 632.802 306.976 632.802C278.71 632.746 250.58 628.868 223.353 621.274L270.086 1101.08C271.74 1121.13 280.876 1139.83 295.679 1153.46C310.482 1167.09 329.87 1174.65 349.992 1174.65C349.992 1174.65 416.254 1178.09 438.365 1178.09C462.161 1178.09 533.516 1174.65 533.516 1174.65C553.636 1174.65 573.019 1167.08 587.819 1153.45C602.619 1139.82 611.752 1121.13 613.406 1101.08L663.459 570.876C641.091 563.237 618.516 558.161 593.068 558.161C549.054 558.144 513.591 573.303 472.623 590.836Z"
-        fill="currentColor"></path>
-    <path d="M78.6885 386.132L79.4799 386.872L79.9962 387.182C79.5987 386.787 79.1603 386.435 78.6885 386.132Z"
-        fill="currentColor"></path>
-    <path
-        d="M879.567 341.849L872.53 306.352C866.215 274.503 851.882 244.409 819.19 232.898C808.711 229.215 796.821 227.633 788.786 220.01C780.751 212.388 778.376 200.55 776.518 189.572C773.076 169.423 769.842 149.257 766.314 129.143C763.269 111.85 760.86 92.4243 752.928 76.56C742.604 55.2584 721.182 42.8009 699.88 34.559C688.965 30.4844 677.826 27.0375 666.517 24.2352C613.297 10.1947 557.342 5.03277 502.591 2.09047C436.875 -1.53577 370.983 -0.443234 305.422 5.35968C256.625 9.79894 205.229 15.1674 158.858 32.0469C141.91 38.224 124.445 45.6399 111.558 58.7341C95.7448 74.8221 90.5829 99.7026 102.128 119.765C110.336 134.012 124.239 144.078 138.985 150.737C158.192 159.317 178.251 165.846 198.829 170.215C256.126 182.879 315.471 187.851 374.007 189.968C438.887 192.586 503.87 190.464 568.44 183.618C584.408 181.863 600.347 179.758 616.257 177.304C634.995 174.43 647.022 149.928 641.499 132.859C634.891 112.453 617.134 104.538 597.055 107.618C594.095 108.082 591.153 108.512 588.193 108.942L586.06 109.252C579.257 110.113 572.455 110.915 565.653 111.661C551.601 113.175 537.515 114.414 523.394 115.378C491.768 117.58 460.057 118.595 428.363 118.647C397.219 118.647 366.058 117.769 334.983 115.722C320.805 114.793 306.661 113.611 292.552 112.177C286.134 111.506 279.733 110.801 273.333 110.009L267.241 109.235L265.917 109.046L259.602 108.134C246.697 106.189 233.792 103.953 221.025 101.251C219.737 100.965 218.584 100.249 217.758 99.2193C216.932 98.1901 216.482 96.9099 216.482 95.5903C216.482 94.2706 216.932 92.9904 217.758 91.9612C218.584 90.9319 219.737 90.2152 221.025 89.9293H221.266C232.33 87.5721 243.479 85.5589 254.663 83.8038C258.392 83.2188 262.131 82.6453 265.882 82.0832H265.985C272.988 81.6186 280.026 80.3625 286.994 79.5366C347.624 73.2301 408.614 71.0801 469.538 73.1014C499.115 73.9618 528.676 75.6996 558.116 78.6935C564.448 79.3474 570.746 80.0357 577.043 80.8099C579.452 81.1025 581.878 81.4465 584.305 81.7391L589.191 82.4445C603.438 84.5667 617.61 87.1419 631.708 90.1703C652.597 94.7128 679.422 96.1925 688.713 119.077C691.673 126.338 693.015 134.408 694.649 142.03L696.732 151.752C696.786 151.926 696.826 152.105 696.852 152.285C701.773 175.227 706.7 198.169 711.632 221.111C711.994 222.806 712.002 224.557 711.657 226.255C711.312 227.954 710.621 229.562 709.626 230.982C708.632 232.401 707.355 233.6 705.877 234.504C704.398 235.408 702.75 235.997 701.033 236.236H700.895L697.884 236.649L694.908 237.044C685.478 238.272 676.038 239.419 666.586 240.486C647.968 242.608 629.322 244.443 610.648 245.992C573.539 249.077 536.356 251.102 499.098 252.066C480.114 252.57 461.135 252.806 442.162 252.771C366.643 252.712 291.189 248.322 216.173 239.625C208.051 238.662 199.93 237.629 191.808 236.58C198.106 237.389 187.231 235.96 185.029 235.651C179.867 234.928 174.705 234.177 169.543 233.397C152.216 230.798 134.993 227.598 117.7 224.793C96.7944 221.352 76.8005 223.073 57.8906 233.397C42.3685 241.891 29.8055 254.916 21.8776 270.735C13.7217 287.597 11.2956 305.956 7.64786 324.075C4.00009 342.193 -1.67805 361.688 0.472751 380.288C5.10128 420.431 33.165 453.054 73.5313 460.35C111.506 467.232 149.687 472.807 187.971 477.556C338.361 495.975 490.294 498.178 641.155 484.129C653.44 482.982 665.708 481.732 677.959 480.378C681.786 479.958 685.658 480.398 689.292 481.668C692.926 482.938 696.23 485.005 698.962 487.717C701.694 490.429 703.784 493.718 705.08 497.342C706.377 500.967 706.846 504.836 706.453 508.665L702.633 545.797C694.936 620.828 687.239 695.854 679.542 770.874C671.513 849.657 663.431 928.434 655.298 1007.2C653.004 1029.39 650.71 1051.57 648.416 1073.74C646.213 1095.58 645.904 1118.1 641.757 1139.68C635.218 1173.61 612.248 1194.45 578.73 1202.07C548.022 1209.06 516.652 1212.73 485.161 1213.01C450.249 1213.2 415.355 1211.65 380.443 1211.84C343.173 1212.05 297.525 1208.61 268.756 1180.87C243.479 1156.51 239.986 1118.36 236.545 1085.37C231.957 1041.7 227.409 998.039 222.9 954.381L197.607 711.615L181.244 554.538C180.968 551.94 180.693 549.376 180.435 546.76C178.473 528.023 165.207 509.681 144.301 510.627C126.407 511.418 106.069 526.629 108.168 546.76L120.298 663.214L145.385 904.104C152.532 972.528 159.661 1040.96 166.773 1109.41C168.15 1122.52 169.44 1135.67 170.885 1148.78C178.749 1220.43 233.465 1259.04 301.224 1269.91C340.799 1276.28 381.337 1277.59 421.497 1278.24C472.979 1279.07 524.977 1281.05 575.615 1271.72C650.653 1257.95 706.952 1207.85 714.987 1130.13C717.282 1107.69 719.576 1085.25 721.87 1062.8C729.498 988.559 737.115 914.313 744.72 840.061L769.601 597.451L781.009 486.263C781.577 480.749 783.905 475.565 787.649 471.478C791.392 467.391 796.352 464.617 801.794 463.567C823.25 459.386 843.761 452.245 859.023 435.916C883.318 409.918 888.153 376.021 879.567 341.849ZM72.4301 365.835C72.757 365.68 72.1548 368.484 71.8967 369.792C71.8451 367.813 71.9483 366.058 72.4301 365.835ZM74.5121 381.94C74.6842 381.819 75.2003 382.508 75.7337 383.334C74.925 382.576 74.4089 382.009 74.4949 381.94H74.5121ZM76.5597 384.641C77.2996 385.897 77.6953 386.689 76.5597 384.641V384.641ZM80.672 387.979H80.7752C80.7752 388.1 80.9645 388.22 81.0333 388.341C80.9192 388.208 80.7925 388.087 80.6548 387.979H80.672ZM800.796 382.989C793.088 390.319 781.473 393.726 769.996 395.43C641.292 414.529 510.713 424.199 380.597 419.932C287.476 416.749 195.336 406.407 103.144 393.382C94.1102 392.109 84.3197 390.457 78.1082 383.798C66.4078 371.237 72.1548 345.944 75.2003 330.768C77.9878 316.865 83.3218 298.334 99.8572 296.355C125.667 293.327 155.64 304.218 181.175 308.09C211.917 312.781 242.774 316.538 273.745 319.36C405.925 331.405 540.325 329.529 671.92 311.91C695.906 308.686 719.805 304.941 743.619 300.674C764.835 296.871 788.356 289.731 801.175 311.703C809.967 326.673 811.137 346.701 809.778 363.615C809.359 370.984 806.139 377.915 800.779 382.989H800.796Z"
-        fill="currentColor"></path>
-</svg>
-{{- else if (eq $icon_name "codeberg") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d='M11.955.49A12 12 0 0 0 0 12.49a12 12 0 0 0 1.832 6.373L11.838 5.928a.187.14 0 0 1 .324 0l10.006 12.935A12 12 0 0 0 24 12.49a12 12 0 0 0-12-12 12 12 0 0 0-.045 0zm.375 6.467l4.416 16.553a12 12 0 0 0 5.137-4.213z' />
-</svg>
-{{- else if (eq $icon_name "codeforces") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -2 24 26" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M4.5 7.5C5.328 7.5 6 8.172 6 9v10.5c0 .828-.672 1.5-1.5 1.5h-3C.673 21 0 20.328 0 19.5V9c0-.828.673-1.5 1.5-1.5h3zm9-4.5c.828 0 1.5.672 1.5 1.5v15c0 .828-.672 1.5-1.5 1.5h-3c-.827 0-1.5-.672-1.5-1.5v-15c0-.828.673-1.5 1.5-1.5h3zm9 7.5c.828 0 1.5.672 1.5 1.5v7.5c0 .828-.672 1.5-1.5 1.5h-3c-.828 0-1.5-.672-1.5-1.5V12c0-.828.672-1.5 1.5-1.5h3z" />
-</svg>
-{{- else if (eq $icon_name "codepen") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <polygon points="12 2 22 8.5 22 15.5 12 22 2 15.5 2 8.5 12 2"></polygon>
-    <line x1="12" y1="22" x2="12" y2="15.5"></line>
-    <polyline points="22 8.5 12 15.5 2 8.5"></polyline>
-    <polyline points="2 15.5 12 8.5 22 15.5"></polyline>
-    <line x1="12" y1="2" x2="12" y2="8.5"></line>
-</svg>
-{{- else if (eq $icon_name "credly") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 480" fill="currentColor" stroke="none">
-    <path
-        d="m 366.04603,0.539085 c -9.03598,0 -10.77973,0.42893562 -15.78373,3.8968966 -3.35779,2.3268743 -8.3929,8.1583914 -12.49099,14.4655944 -9.48143,14.593085 -12.15553,15.67658 -23.95415,9.697781 C 288.74714,15.895368 270.59837,11.338625 245.64499,11.484396 205.97913,11.716096 172.05517,25.859207 145.32213,53.309347 104.48601,95.240854 76.020398,154.63994 66.9762,216.79856 c -6.092249,41.86824 -2.974097,92.7649 8.000409,130.64544 19.389663,66.92743 60.256841,104.96526 120.074111,111.75986 11.97899,1.3607 33.24497,0.42096 46.09323,-2.03737 38.22791,-7.31398 76.74467,-29.90075 111.05372,-65.12525 22.65718,-23.26237 39.50239,-47.24087 52.90626,-75.31472 8.23215,-17.2418 9.31001,-23.43292 5.55765,-31.91534 -3.70171,-8.36882 -10.69858,-13.42359 -19.60478,-14.16221 -12.2704,-1.01759 -17.7717,3.62699 -32.96932,27.83274 -26.44919,42.12471 -49.6215,65.49325 -80.30485,80.98223 -29.30931,14.79535 -58.73794,17.48923 -87.25388,7.99255 -25.31711,-8.43163 -44.41812,-28.62159 -53.89487,-56.97053 -6.2792,-18.78312 -7.83604,-33.41725 -7.03795,-66.15048 0.74234,-30.44679 2.42781,-44.77419 8.41626,-71.53553 14.88113,-66.50301 52.31461,-114.886915 94.37029,-121.980722 20.78331,-3.505693 43.1099,0.696677 51.67965,9.726548 11.89366,12.532806 12.23581,25.259094 1.67121,62.227444 -2.89562,10.13204 -5.62965,21.15694 -6.07287,24.49814 -2.85326,21.50809 19.7617,39.5481 39.34034,31.38178 12.3339,-5.14409 18.6741,-15.73544 25.16508,-42.03677 9.05731,-36.69987 21.80795,-68.950595 39.4685,-99.836425 10.05125,-17.57882 12.86723,-25.679207 11.4867,-33.039939 C 393.89772,17.218994 387.8986,8.6159571 381.48718,4.1875215 376.8711,0.99934541 374.91955,0.539085 366.04603,0.539085 Z" />
-</svg>
-{{- else if (eq $icon_name "cryptohack") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 57 57" preserveAspectRatio="xMidYMid meet">
-    <g transform="translate(0.000000,57.000000) scale(0.100000,-0.100000)" fill="currentColor" stroke-width="12"
-        stroke="currentColor">
-        <path
-            d="M180 495 c-7 -8 -22 -15 -35 -15 -23 0 -55 -28 -55 -48 0 -6 -12 -23 -26 -37 -18 -18 -24 -33 -21 -48 3 -12 -1 -31 -9 -41 -18 -26 -18 -70 1 -86 8 -7 15 -21 15 -31 0 -36 23 -68 59 -83 21 -8 43 -21 50 -30 19 -23 74 -20 97 5 17 19 19 41 22 204 3 174 2 185 -17 204 -25 25 -63 27 -81 6z m54 -11 c14 -5 16 -32 16 -193 0 -196 -3 -211 -45 -211 -39 0 -47 20 -20 52 14 16 25 40 25 52 0 34 -37 76 -66 76 -31 0 -31 -18 0 -26 30 -7 50 -48 36 -73 -28 -54 -118 -28 -103 29 3 10 -4 27 -16 39 -26 26 -27 46 -2 68 14 12 18 24 14 48 -7 41 12 53 40 27 12 -11 32 -23 44 -26 12 -4 31 -18 42 -32 33 -41 55 -29 25 14 -15 21 -15 25 1 42 22 25 0 38 -25 15 -26 -24 -68 -12 -81 21 -12 32 3 54 36 54 12 0 28 7 35 15 14 17 21 18 44 9z" />
-        <path
-            d="M309 489 c-19 -19 -20 -30 -17 -204 3 -163 5 -185 22 -204 23 -25 78 -28 97 -5 7 9 29 22 50 30 36 15 59 47 59 83 0 10 7 24 15 31 19 16 19 60 1 86 -8 10 -12 29 -9 41 3 15 -3 30 -19 46 -12 13 -30 37 -38 53 -10 19 -25 30 -42 32 -15 2 -32 10 -38 18 -18 20 -57 17 -81 -7z m71 -14 c7 -8 23 -15 35 -15 34 0 48 -22 34 -54 -10 -20 -19 -26 -46 -26 -34 0 -44 -13 -17 -24 28 -11 47 -7 70 15 30 28 48 16 41 -28 -4 -24 -2 -36 8 -39 20 -8 28 -40 15 -64 -11 -20 -63 -28 -86 -12 -17 11 -36 51 -29 62 3 5 1 11 -5 15 -16 10 -24 -25 -12 -57 9 -24 8 -30 -8 -38 -21 -11 -33 -37 -24 -52 4 -6 16 2 28 17 20 25 26 27 64 20 23 -4 44 -10 47 -14 9 -15 -26 -51 -49 -51 -14 0 -30 -10 -40 -25 -18 -27 -54 -33 -74 -13 -17 17 -17 384 1 391 22 9 34 7 47 -8z" />
-    </g>
-</svg>
-{{- else if (eq $icon_name "ctftime") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220.000000 200.000000" preserveAspectRatio="xMidYMid meet">
-    <g transform="translate(0.000000,200.000000) scale(0.100000,-0.100000)" fill="currentColor" stroke="none">
-        <path d="M365 1499 c201 -275 365 -503 365 -507 0 -4 -84 -120 -188 -259 -103
-            -139 -263 -355 -356 -480 -93 -125 -173 -229 -178 -231 -45 -19 101 -22 992
-            -22 l1000 0 0 1000 0 1000 -1000 0 -999 0 364 -501z m1310 -509 l0 -305 -312
-            -3 -313 -2 0 310 0 310 313 -2 312 -3 0 -305z" />
-        <path d="M1150 1194 c0 -2 -1 -95 -1 -206 l0 -203 216 -3 215 -2 0 210 0 210
-            -157 0 -158 0 98 -98 c53 -53 97 -101 97 -106 0 -4 -42 -48 -92 -97 l-93 -88
-            -28 26 -27 27 65 66 65 66 -100 101 c-55 55 -100 99 -100 97z" />
-    </g>
-</svg>
-{{- else if (eq $icon_name "cv") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M4 4v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8.342a2 2 0 0 0-.602-1.43l-4.44-4.342A2 2 0 0 0 13.56 2H6a2 2 0 0 0-2 2z" />
-    <path d="M9 13h6" />
-    <path d="M9 17h3" />
-    <path d="M14 2v4a2 2 0 0 0 2 2h4" />
-</svg>
-{{- else if (eq $icon_name "deezer") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 20" fill="currentColor" stroke="none">
-    <path
-        d="M18.81 4.16v3.03H24V4.16h-5.19zM6.27 8.38v3.027h5.189V8.38h-5.19zm12.54 0v3.027H24V8.38h-5.19zM6.27 12.594v3.027h5.189v-3.027h-5.19zm6.271 0v3.027h5.19v-3.027h-5.19zm6.27 0v3.027H24v-3.027h-5.19zM0 16.81v3.029h5.19v-3.03H0zm6.27 0v3.029h5.189v-3.03h-5.19zm6.271 0v3.029h5.19v-3.03h-5.19zm6.27 0v3.029H24v-3.03h-5.19Z" />
-</svg>
-{{- else if (eq $icon_name "dev") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="M7.42 10.05c-.18-.16-.46-.23-.84-.23H6l.02 2.44.04 2.45.56-.02c.41 0 .63-.07.83-.26.24-.24.26-.36.26-2.2 0-1.91-.02-1.96-.29-2.18zM0 4.94v14.12h24V4.94H0zM8.56 15.3c-.44.58-1.06.77-2.53.77H4.71V8.53h1.4c1.67 0 2.16.18 2.6.9.27.43.29.6.32 2.57.05 2.23-.02 2.73-.47 3.3zm5.09-5.47h-2.47v1.77h1.52v1.28l-.72.04-.75.03v1.77l1.22.03 1.2.04v1.28h-1.6c-1.53 0-1.6-.01-1.87-.3l-.3-.28v-3.16c0-3.02.01-3.18.25-3.48.23-.31.25-.31 1.88-.31h1.64v1.3zm4.68 5.45c-.17.43-.64.79-1 .79-.18 0-.45-.15-.67-.39-.32-.32-.45-.63-.82-2.08l-.9-3.39-.45-1.67h.76c.4 0 .75.02.75.05 0 .06 1.16 4.54 1.26 4.83.04.15.32-.7.73-2.3l.66-2.52.74-.04c.4-.02.73 0 .73.04 0 .14-1.67 6.38-1.8 6.68z" />
-</svg>
-{{- else if (eq $icon_name "deviantart") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 167" fill="currentColor" stroke="none">
-    <path
-        d=" M100 0 L99.96 0 L99.95 0 L71.32 0 L68.26 3.04 L53.67 30.89 L49.41 33.35 L0 33.35 L0 74.97 L26.40 74.97 L29.15 77.72 L0 133.36 L0 166.5 L0 166.61 L0 166.61 L28.70 166.6 L31.77 163.55 L46.39 135.69 L50.56 133.28 L100 133.28 L100 91.68 L73.52 91.68 L70.84 89 L100 33.33 " />
-</svg>
-{{- else if (eq $icon_name "discogs") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="M1.7422 11.982c0-5.6682 4.61-10.2782 10.2758-10.2782 1.8238 0 3.5372.48 5.0251 1.3175l.8135-1.4879C16.1768.588 14.2474.036 12.1908.0024h-.1944C5.4091.0144.072 5.3107 0 11.886v.1152c.0072 3.4389 1.4567 6.5345 3.7748 8.7207l1.1855-1.2814c-1.9798-1.8743-3.218-4.526-3.218-7.4585zM20.362 3.4053l-1.1543 1.2406c1.903 1.867 3.0885 4.4636 3.0885 7.3361 0 5.6658-4.61 10.2758-10.2758 10.2758-1.783 0-3.4605-.456-4.922-1.2575l-.8542 1.5214c1.7086.9384 3.6692 1.4735 5.7546 1.4759C18.6245 23.9976 24 18.6246 24 11.9988c-.0048-3.3717-1.399-6.4146-3.638-8.5935zM1.963 11.982c0 2.8701 1.2119 5.4619 3.146 7.2953l1.1808-1.2767c-1.591-1.5166-2.587-3.6524-2.587-6.0186 0-4.586 3.7293-8.3152 8.3152-8.3152 1.483 0 2.875.3912 4.082 1.0751l.8351-1.5262C15.481 2.395 13.8034 1.927 12.018 1.927 6.4746 1.9246 1.963 6.4362 1.963 11.982zm18.3702 0c0 4.586-3.7293 8.3152-8.3152 8.3152-1.4327 0-2.7837-.3648-3.962-1.0055l-.852 1.5166c1.4303.7823 3.0718 1.2287 4.814 1.2287 5.5434 0 10.055-4.5116 10.055-10.055 0-2.8077-1.1567-5.3467-3.0165-7.1729l-1.183 1.2743c1.519 1.507 2.4597 3.5924 2.4597 5.8986zm-1.9486 0c0 3.5109-2.8558 6.3642-6.3642 6.3642a6.3286 6.3286 0 01-3.0069-.756l-.8471 1.507c1.147.624 2.4597.9768 3.854.9768 4.4636 0 8.0944-3.6308 8.0944-8.0944 0-2.239-.9143-4.2692-2.3902-5.7378l-1.1783 1.267c1.1351 1.152 1.8383 2.731 1.8383 4.4732zm-14.4586 0c0 2.3014.9671 4.382 2.515 5.8578l1.1734-1.2695c-1.207-1.159-1.9606-2.786-1.9606-4.5883 0-3.5108 2.8557-6.3642 6.3642-6.3642 1.1423 0 2.215.3048 3.1437.8352l.8303-1.5167c-1.1759-.6647-2.5317-1.0487-3.974-1.0487-4.4612 0-8.092 3.6308-8.092 8.0944zm12.5292 0c0 2.4502-1.987 4.4372-4.4372 4.4372a4.4192 4.4192 0 01-2.0614-.5088l-.8351 1.4879a6.1135 6.1135 0 002.8965.727c3.3885 0 6.1434-2.7548 6.1434-6.1433 0-1.6774-.6767-3.1989-1.7686-4.3076l-1.1615 1.2503c.7559.7967 1.2239 1.8718 1.2239 3.0573zm-10.5806 0c0 1.7374.7247 3.3069 1.8886 4.4252L8.92 15.1569l.0144.0144c-.8351-.8063-1.3559-1.9366-1.3559-3.1869 0-2.4502 1.9846-4.4372 4.4372-4.4372.8087 0 1.5646.2184 2.2174.5976l.8207-1.4975a6.097 6.097 0 00-3.0381-.8063c-3.3837-.0048-6.141 2.7525-6.141 6.141zm6.681 0c0 .2952-.2424.5351-.5376.5351-.2952 0-.5375-.24-.5375-.5351 0-.2976.24-.5375.5375-.5375.2952 0 .5375.24.5375.5375zm-3.9405 0c0-1.879 1.5239-3.4029 3.4005-3.4029 1.879 0 3.4005 1.5215 3.4005 3.4029 0 1.879-1.5239 3.4005-3.4005 3.4005S8.6151 13.861 8.6151 11.982zm.1488 0c.0048 1.7974 1.4567 3.2493 3.2517 3.2517 1.795 0 3.254-1.4567 3.254-3.2517-.0023-1.7974-1.4566-3.2517-3.254-3.254-1.795 0-3.2517 1.4566-3.2517 3.254Z" />
-</svg>
-{{- else if (eq $icon_name "discord") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 127.14 96.36" fill="currentColor" stroke="none" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M107.7,8.07A105.15,105.15,0,0,0,81.47,0a72.06,72.06,0,0,0-3.36,6.83A97.68,97.68,0,0,0,49,6.83,72.37,72.37,0,0,0,45.64,0,105.89,105.89,0,0,0,19.39,8.09C2.79,32.65-1.71,56.6.54,80.21h0A105.73,105.73,0,0,0,32.71,96.36,77.7,77.7,0,0,0,39.6,85.25a68.42,68.42,0,0,1-10.85-5.18c.91-.66,1.8-1.34,2.66-2a75.57,75.57,0,0,0,64.32,0c.87.71,1.76,1.39,2.66,2a68.68,68.68,0,0,1-10.87,5.19,77,77,0,0,0,6.89,11.1A105.25,105.25,0,0,0,126.6,80.22h0C129.24,52.84,122.09,29.11,107.7,8.07ZM42.45,65.69C36.18,65.69,31,60,31,53s5-12.74,11.43-12.74S54,46,53.89,53,48.84,65.69,42.45,65.69Zm42.24,0C78.41,65.69,73.25,60,73.25,53s5-12.74,11.44-12.74S96.23,46,96.12,53,91.08,65.69,84.69,65.69Z" />
-</svg>
-{{- else if (eq $icon_name "douban") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path d="m2.42288,2.08086l19.15349,0l0,2.15751l-19.15349,0l0,-2.15751z" />
-    <path
-        d="m19.88879,14.92347l0,-8.43444l-15.82351,0l0,8.43444l15.82351,0zm-13.52889,-6.27842l11.25739,0l0,4.1235l-11.25739,0l0,-4.1235z" />
-    <path
-        d="m16.48864,19.78508c0.6885,-1.05398 1.33827,-2.27636 1.94031,-3.66377l-2.30206,-0.83906c-0.59872,1.64418 -1.29579,3.14745 -2.08899,4.50283l-4.00578,0c-0.66389,-1.75663 -1.41312,-3.25884 -2.25363,-4.50283l-2.11727,0.83906c0.87327,1.30991 1.57742,2.52932 2.11727,3.66377l-5.89733,0l0,2.13406l20.23769,0l0,-2.13406l-5.63021,0z" />
-</svg>
-{{- else if (eq $icon_name "dreamstime") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M19.834 20.994s4.824-4.08 2.044-12.03C19.252 1.456 6.822-1.223 2.508 7.566c-3.936 8.023 2.18 14.46 7.88 14.374 4.889-.075 8.475-3.226 7.813-8.604-.76-6.18-6.73-6.816-9.275-4.184-2.256 2.334-1.816 7.034.873 7.823 2.241.844 4.661-1.265 3.161-3.215"
-        style="font-variation-settings:normal" stroke="currentColor" stroke-linejoin="bevel"
-        paint-order="stroke fill markers" />
-</svg>
-{{- else if (eq $icon_name "dribbble") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <circle style="font-variation-settings:normal" cx="12.004" cy="12" r="9.39" paint-order="stroke fill markers" />
-    <path style="font-variation-settings:normal"
-        d="M5.858 19.136s2.343-5.79 8.161-6.422c5.818-.633 7.442.479 7.442.479M2.68 10.839s4.91.752 10.112-1.11c5.202-1.863 5.887-4.601 5.887-4.601" />
-    <path style="font-variation-settings:normal"
-        d="M8.533 3.208s2.888 2.73 5.339 9.235c2.451 6.505 2.344 8.4 2.344 8.4" />
-</svg>
-{{- else if (eq $icon_name "dzen") -}}
-<svg viewBox="0 0 166 167" fill="none" xmlns="http://www.w3.org/2000/svg">
-    <path fill-rule="evenodd" clip-rule="evenodd" d="M83.3295 166.23H82.6705C49.7081 166.23 30.436 162.915 17.0154 149.754C3.1854 135.664 0 116.522 0 83.6996V82.7709C0 49.9484 3.1854 30.6762 17.0154 16.7164C30.5658 3.56543 49.7081 0.240234 82.6605 0.240234H83.3295C116.152 0.240234 135.424 3.56543 148.985 16.7164C162.815 30.806 166 49.9484 166 82.7709V83.6996C166 116.532 162.805 135.804 148.985 149.754C135.424 162.905 116.292 166.23 83.3295 166.23ZM145.84 80.771C146.48 80.801 147 81.3308 147 81.9706H146.99V84.6498C146.99 85.2996 146.47 85.8294 145.83 85.8494C122.868 86.7191 108.902 89.6382 99.115 99.4252C89.338 109.202 86.4189 123.148 85.5392 146.071C85.5092 146.71 84.9794 147.23 84.3396 147.23H81.6504C81.0006 147.23 80.4708 146.71 80.4508 146.071C79.5711 123.148 76.652 109.202 66.875 99.4252C57.0981 89.6482 43.1225 86.7191 20.1596 85.8494C19.5198 85.8194 19 85.2896 19 84.6498V81.9706C19 81.3208 19.5198 80.791 20.1596 80.771C43.1225 79.9013 57.0881 76.9822 66.875 67.1952C76.672 57.3983 79.5911 43.4027 80.4608 20.3999C80.4908 19.7601 81.0206 19.2402 81.6604 19.2402H84.3396C84.9894 19.2402 85.5192 19.7601 85.5392 20.3999C86.4089 43.4127 89.328 57.3983 99.125 67.1952C108.902 76.9722 122.878 79.9013 145.84 80.771Z" fill="currentColor"/>
-</svg>
-{{- else if (eq $icon_name "email") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 21" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path>
-    <polyline points="22,6 12,13 2,6"></polyline>
-</svg>
-{{- else if (eq $icon_name "ethereum") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M11.944 17.97L4.58 13.62 11.943 24l7.37-10.38-7.372 4.35h.003zM12.056 0L4.69 12.223l7.365 4.354 7.365-4.35L12.056 0z" />
-</svg>
-{{- else if (eq $icon_name "exercism") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2230.4 1817.9" fill="currentColor" stroke-width="2"
-    stroke="currentColor">
-    <path d="M0,905.1v-48.3c119-10.6,189.5-56.6,206.8-157.4c14.8-85.8-9.8-249.3-6.7-387.8c3.5-157,107.1-289.2,222.6-305.8
-       c48-6.9,83-8.3,121.4-0.3c35,6,63.3,26.3,76.4,52v74.2H508.1c-98,11.1-135.6,76.9-157.4,179.9c-26.1,123,101.7,561.8-170.9,593.6
-       c272.6,31.7,144.8,470.5,170.9,593.6c21.8,103,59.3,168.8,157.4,179.9h112.4v74.2c-13.2,25.7-41.4,46-76.4,52
-       c-38.4,8-73.4,6.6-121.4-0.3c-115.5-16.6-219.1-148.8-222.6-305.8c-3.1-138.5,21.5-302.1,6.7-387.8C189.5,1010,119,964,0,953.4
-       V905.1z M2230.4,912.8v-48.3c-119-10.6-189.5-56.6-206.8-157.4c-14.8-85.8,9.8-249.3,6.7-387.8c-3.5-157-107.1-289.2-222.6-305.8
-       c-48-6.9-83-8.3-121.4-0.3c-35,6-63.3,26.3-76.4,52v74.2h112.4c98,11.1,135.6,76.9,157.4,179.9c26.1,123-101.7,561.8,170.9,593.6
-       c-272.6,31.7-144.8,470.5-170.9,593.6c-21.8,103-59.3,168.8-157.4,179.9h-112.4v74.2c13.2,25.7,41.4,46,76.4,52
-       c38.4,8,73.4,6.6,121.4-0.3c115.5-16.6,219.1-148.8,222.6-305.8c3.1-138.5-21.5-302.1-6.7-387.8c17.3-100.8,87.8-146.8,206.8-157.4
-       V912.8z" />
-    <path d="M944.3,935.4c0-139.7-112.7-252.9-251.8-252.9S440.7,795.8,440.7,935.4H539c0-85.2,68.7-154.2,153.5-154.2
-       S846,850.3,846,935.4H944.3z M1796.4,935.4c0-139.7-112.7-252.9-251.8-252.9s-251.8,113.2-251.8,252.9h98.3
-       c0-85.2,68.7-154.2,153.5-154.2c84.8,0,153.5,69,153.5,154.2H1796.4z M1364.7,1269.3c-6.1,118.6-109.4,220.1-233.8,219.2
-       c-124.8-0.9-227.3-102.3-233.8-219.2v-74.2h114.7v74.2c5.7,60,59.6,109.2,119.2,107.4c60.5-1.9,116.7-48.2,119.2-107.4v-74.2h114.7
-       V1269.3z" />
-</svg>
-{{- else if (eq $icon_name "facebook") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"></path>
-</svg>
-{{- else if (eq $icon_name "farcaster") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000" fill="currentColor" stroke="currentColor" stroke-width="2">
-    <path d="M257.778 155.556H742.222V844.445H671.111V528.889H670.414C662.554 441.677 589.258 373.333 500 373.333C410.742 373.333 337.446 441.677 329.586 528.889H328.889V844.445H257.778V155.556Z"/>
-    <path d="M128.889 253.333L157.778 351.111H182.222V746.667C169.949 746.667 160 756.616 160 768.889V795.556H155.556C143.283 795.556 133.333 805.505 133.333 817.778V844.445H382.222V817.778C382.222 805.505 372.273 795.556 360 795.556H355.556V768.889C355.556 756.616 345.606 746.667 333.333 746.667H306.667V253.333H128.889Z"/>
-    <path d="M675.556 746.667C663.283 746.667 653.333 756.616 653.333 768.889V795.556H648.889C636.616 795.556 626.667 805.505 626.667 817.778V844.445H875.556V817.778C875.556 805.505 865.606 795.556 853.333 795.556H848.889V768.889C848.889 756.616 838.94 746.667 826.667 746.667V351.111H851.111L880 253.333H702.222V746.667H675.556Z"/>
-</svg>
-{{- else if (eq $icon_name "fediverse") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M47.923 72.796a18.227 18.227 0 0 1-7.795 7.76l42.798 42.964 10.318-5.229zm56.452 56.67-10.318 5.229 21.686 21.77a18.227 18.227 0 0 1 7.797-7.76zm49.517-39.67-24.23 12.279 1.787 11.427 27.415-13.894a18.227 18.227 0 0 1-4.972-9.812zm-38.295 19.407L58.31 138.237a18.227 18.227 0 0 1 4.973 9.813l54.102-27.42zM97.174 37.686 69.53 91.653l8.162 8.193 29.269-57.138a18.227 18.227 0 0 1-9.787-5.022ZM62.34 105.69l-14.002 27.335a18.227 18.227 0 0 1 9.786 5.021l12.377-24.163ZM39.89 80.675a18.227 18.227 0 0 1-9.106 1.904 18.227 18.227 0 0 1-1.759-.184l8.176 52.297a18.227 18.227 0 0 1 9.106-1.903 18.227 18.227 0 0 1 1.758.184zm23.435 67.634a18.227 18.227 0 0 1 .19 3.672 18.227 18.227 0 0 1-1.922 7.19l52.289 8.391a18.227 18.227 0 0 1-.192-3.672 18.227 18.227 0 0 1 1.924-7.19zM159.048 99.8l-24.135 47.116a18.227 18.227 0 0 1 9.788 5.023l24.134-47.117a18.227 18.227 0 0 1-9.787-5.023zm-32.917-66.64a18.227 18.227 0 0 1-7.797 7.76l37.376 37.52a18.227 18.227 0 0 1 7.797-7.76zm-34.114-5.477L44.77 51.627a18.227 18.227 0 0 1 4.972 9.813L96.99 37.495a18.227 18.227 0 0 1-4.971-9.811zm26.231 13.281a18.227 18.227 0 0 1-9.256 1.98 18.227 18.227 0 0 1-1.595-.168l4.185 26.8 11.42 1.832zm-4.234 44.192 9.896 63.362a18.227 18.227 0 0 1 8.973-1.837 18.227 18.227 0 0 1 1.906.21l-9.354-59.903ZM49.775 61.64a18.227 18.227 0 0 1 .201 3.73 18.227 18.227 0 0 1-1.894 7.139l26.82 4.308 5.271-10.295zm45.968 7.382L90.47 79.318l63.37 10.177a18.227 18.227 0 0 1-.184-3.63 18.227 18.227 0 0 1 1.945-7.229z"
-        style="display:inline" transform="matrix(.13855 0 0 .1385 -2.107 -1.132)" />
-    <g style="display:inline;opacity:1" transform="matrix(.13834 .00753 -.00754 .1383 -1.182 -5.633)">
-        <circle cx="106.266" cy="51.536" r="16.571" />
-        <circle cx="171.428" cy="110.193" r="16.571" />
-        <circle cx="135.764" cy="190.277" r="16.571" />
-        <circle cx="48.559" cy="181.114" r="16.571" />
-        <circle cx="30.329" cy="95.367" r="16.571" />
-    </g>
-</svg>
-{{- else if (eq $icon_name "firefish") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M16.21.088c-.256.114-.607.485-.7.735-.048.128-.075 1.322-.075 3.46 0 3.083.007 3.286.128 3.522.162.317.378.52.694.654.216.088.721.101 3.492.101 3.559 0 3.491.007 3.889-.411.37-.391.458-.897.256-1.396-.148-.344-6.228-6.45-6.605-6.632-.317-.148-.79-.162-1.079-.033ZM6.107.155C5.79.276 5.473.56 5.352.85c-.074.175-.095.857-.095 3.474 0 3.13.007 3.258.135 3.535.081.162.263.364.418.472l.276.196 3.303.02c3.269.02 3.303.013 3.6-.128.62-.297.882-1.12.565-1.734C13.42 6.43 7.354.337 7.111.21 6.86.081 6.383.054 6.107.155Zm-5.09 10.166a1.25 1.25 0 0 0-.889.695c-.121.263-.128.56-.128 6.139 0 5.842 0 5.869.142 6.166.087.175.256.364.417.472l.277.182 5.864.02c3.95.014 5.951 0 6.113-.054.33-.094.573-.297.755-.627l.148-.284v-5.835c0-4.627-.02-5.889-.087-6.085-.128-.364-.533-.701-.95-.789-.425-.088-11.203-.094-11.661 0zm3.095 6.982c.572.243 1.01.924 1.01 1.579a1.69 1.69 0 0 1-1.705 1.686c-.667 0-1.18-.303-1.496-.89a1.72 1.72 0 0 1 .23-1.957c.47-.54 1.26-.708 1.96-.418zm4.36.04c.162.075.398.257.526.412.944 1.106.169 2.813-1.28 2.813-1.247 0-2.083-1.282-1.557-2.395.242-.533.647-.85 1.287-1.005.23-.054.728.027 1.024.176zm8.028-7.029c-.378.068-.762.351-.923.689-.142.29-.142.37-.142 3.568 0 3.029.013 3.285.128 3.535.148.324.364.533.694.675.216.087.715.1 3.471.1 2.986 0 3.243-.013 3.492-.127.667-.31.97-1.12.647-1.748-.128-.25-6.457-6.624-6.578-6.624-.04 0-.176-.027-.304-.054a1.461 1.461 0 0 0-.485-.014z" />
-</svg>
-{{- else if (eq $icon_name "flickr") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M5.334 6.666C2.3884 6.666 0 9.055 0 12c0 2.9456 2.3884 5.334 5.334 5.334 2.9456 0 5.332-2.3884 5.332-5.334 0-2.945-2.3864-5.334-5.332-5.334zm13.332 0c-2.9456 0-5.332 2.389-5.332 5.334 0 2.9456 2.3864 5.334 5.332 5.334C21.6116 17.334 24 14.9456 24 12c0-2.945-2.3884-5.334-5.334-5.334Z" />
-</svg>
-{{- else if (eq $icon_name "forgejo") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M16.7773 0c1.6018 0 2.9004 1.2986 2.9004 2.9005s-1.2986 2.9004-2.9004 2.9004c-1.0854 0-2.0315-.596-2.5288-1.4787H12.91c-2.3322 0-4.2272 1.8718-4.2649 4.195l-.0007 2.1175a7.0759 7.0759 0 0 1 4.148-1.4205l.1176-.001 1.3385.0002c.4973-.8827 1.4434-1.4788 2.5288-1.4788 1.6018 0 2.9004 1.2986 2.9004 2.9005s-1.2986 2.9004-2.9004 2.9004c-1.0854 0-2.0315-.596-2.5288-1.4787H12.91c-2.3322 0-4.2272 1.8718-4.2649 4.195l-.0007 2.319c.8827.4973 1.4788 1.4434 1.4788 2.5287 0 1.602-1.2986 2.9005-2.9005 2.9005-1.6018 0-2.9004-1.2986-2.9004-2.9005 0-1.0853.596-2.0314 1.4788-2.5287l-.0002-9.9831c0-3.887 3.1195-7.0453 6.9915-7.108l.1176-.001h1.3385C14.7458.5962 15.692 0 16.7773 0ZM7.2227 19.9052c-.6596 0-1.1943.5347-1.1943 1.1943s.5347 1.1943 1.1943 1.1943 1.1944-.5347 1.1944-1.1943-.5348-1.1943-1.1944-1.1943Zm9.5546-10.4644c-.6596 0-1.1944.5347-1.1944 1.1943s.5348 1.1943 1.1944 1.1943c.6596 0 1.1943-.5347 1.1943-1.1943s-.5347-1.1943-1.1943-1.1943Zm0-7.7346c-.6596 0-1.1944.5347-1.1944 1.1943s.5348 1.1943 1.1944 1.1943c.6596 0 1.1943-.5347 1.1943-1.1943s-.5347-1.1943-1.1943-1.1943Z" />
-</svg>
-{{- else if (eq $icon_name "freepik") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M5.737 17.28s3.423.84 7.61.162c4.188-.676 6.862-2.57 6.862-2.57s.28 3.943-4.967 5.33c-5.248 1.388-8.543.657-9.506-2.923zm-.62-3.104s4.491 1.361 8.728.344c4.237-1.016 5.94-2.568 5.94-2.568s-1.81-6.448-7.405-5.648c-5.597.8-8.061 4.414-7.263 7.872z"
-        style="font-variation-settings:normal" stroke-linejoin="round" />
-    <path
-        d="M1.265 12.607c.159-1.98.561-3.898 2.08-5.701m5.148-3.29c2.006-.66 3.968-1.157 6.446-.844m5.202 2.98c1.192 1.275 1.963 2.163 2.594 3.815"
-        style="font-variation-settings:normal" stroke="currentColor" stroke-linejoin="round" />
-    <circle r=".989" cy="10.404" cx="14.746" fill="currentColor" stroke="none" />
-    <circle cx="9.637" cy="11.305" r="1.477" fill="currentColor" stroke="none" />
-</svg>
-{{- else if (eq $icon_name "git") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 92 92" fill="currentColor" strock="currentColor"
-    fill-rule="nonzero">
-    <path
-        d="M90.156 41.965 50.036 1.848a5.913 5.913 0 0 0-8.368 0l-8.332 8.332 10.566 10.566a7.03 7.03 0 0 1 7.23 1.684 7.043 7.043 0 0 1 1.673 7.277l10.183 10.184a7.026 7.026 0 0 1 7.278 1.672 7.04 7.04 0 0 1 0 9.957 7.045 7.045 0 0 1-9.961 0 7.038 7.038 0 0 1-1.532-7.66l-9.5-9.497V59.36a7.04 7.04 0 0 1 1.86 11.29 7.04 7.04 0 0 1-9.957 0 7.04 7.04 0 0 1 0-9.958 7.034 7.034 0 0 1 2.308-1.539V33.926a7.001 7.001 0 0 1-2.308-1.535 7.049 7.049 0 0 1-1.516-7.7L29.242 14.273 1.734 41.777a5.918 5.918 0 0 0 0 8.371L41.855 90.27a5.92 5.92 0 0 0 8.368 0l39.933-39.934a5.925 5.925 0 0 0 0-8.371" />
-</svg>
-{{- else if (eq $icon_name "gitea") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 20" fill="currentColor">
-    <path
-        d="M4.209 4.603c-.247 0-.525.02-.84.088-.333.07-1.28.283-2.054 1.027C-.403 7.25.035 9.685.089 10.052c.065.446.263 1.687 1.21 2.768 1.749 2.141 5.513 2.092 5.513 2.092s.462 1.103 1.168 2.119c.955 1.263 1.936 2.248 2.89 2.367 2.406 0 7.212-.004 7.212-.004s.458.004 1.08-.394c.535-.324 1.013-.893 1.013-.893s.492-.527 1.18-1.73c.21-.37.385-.729.538-1.068 0 0 2.107-4.471 2.107-8.823-.042-1.318-.367-1.55-.443-1.627-.156-.156-.366-.153-.366-.153s-4.475.252-6.792.306c-.508.011-1.012.023-1.512.027v4.474l-.634-.301c0-1.39-.004-4.17-.004-4.17-1.107.016-3.405-.084-3.405-.084s-5.399-.27-5.987-.324c-.187-.011-.401-.032-.648-.032zm.354 1.832h.111s.271 2.269.6 3.597C5.549 11.147 6.22 13 6.22 13s-.996-.119-1.641-.348c-.99-.324-1.409-.714-1.409-.714s-.73-.511-1.096-1.52C1.444 8.73 2.021 7.7 2.021 7.7s.32-.859 1.47-1.145c.395-.106.863-.12 1.072-.12zm8.33 2.554c.26.003.509.127.509.127l.868.422-.529 1.075a.686.686 0 0 0-.614.359.685.685 0 0 0 .072.756l-.939 1.924a.69.69 0 0 0-.66.527.687.687 0 0 0 .347.763.686.686 0 0 0 .867-.206.688.688 0 0 0-.069-.882l.916-1.874a.667.667 0 0 0 .237-.02.657.657 0 0 0 .271-.137 8.826 8.826 0 0 1 1.016.512.761.761 0 0 1 .286.282c.073.21-.073.569-.073.569-.087.29-.702 1.55-.702 1.55a.692.692 0 0 0-.676.477.681.681 0 1 0 1.157-.252c.073-.141.141-.282.214-.431.19-.397.515-1.16.515-1.16.035-.066.218-.394.103-.814-.095-.435-.48-.638-.48-.638-.467-.301-1.116-.58-1.116-.58s0-.156-.042-.27a.688.688 0 0 0-.148-.241l.516-1.062 2.89 1.401s.48.218.583.619c.073.282-.019.534-.069.657-.24.587-2.1 4.317-2.1 4.317s-.232.554-.748.588a1.065 1.065 0 0 1-.393-.045l-.202-.08-4.31-2.1s-.417-.218-.49-.596c-.083-.31.104-.691.104-.691l2.073-4.272s.183-.37.466-.497a.855.855 0 0 1 .35-.077z" />
-</svg>
-{{- else if (eq $icon_name "github") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22">
-    </path>
-</svg>
-{{- else if (eq $icon_name "gitlab") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z">
-    </path>
-</svg>
-{{- else if (eq $icon_name "goodreads") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M11.43 23.995c-3.608-.208-6.274-2.077-6.448-5.078.695.007 1.375-.013 2.07-.006.224 1.342 1.065 2.43 2.683 3.026 1.583.496 3.737.46 5.082-.174 1.351-.636 2.145-1.822 2.503-3.577.212-1.042.236-1.734.231-2.92l-.005-1.631h-.059c-1.245 2.564-3.315 3.53-5.59 3.475-5.74-.054-7.68-4.534-7.528-8.606.01-5.241 3.22-8.537 7.557-8.495 2.354-.14 4.605 1.362 5.554 3.37l.059.002.002-2.918 2.099.004-.002 15.717c-.193 7.04-4.376 7.89-8.209 7.811zm6.1-15.633c-.096-3.26-1.601-6.62-5.503-6.645-3.954-.017-5.625 3.592-5.604 6.85-.013 3.439 1.643 6.305 4.703 6.762 4.532.591 6.551-3.411 6.404-6.967z" />
-</svg>
-{{- else if (eq $icon_name "googleplaystore") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round"
-    stroke-linejoin="round" stroke-width="2">
-    <path
-        d="M15.7 15.9 2.1 3.7m2.4-1.5c-.9-.5-2 0-2.4.8v18a2 2 0 0 0 2.4.8l16.8-8.6c.9-1.1.7-1.7 0-2.4zm11.2 6-13.6 12" />
-</svg>
-{{- else if (eq $icon_name "googlepodcasts") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M1.503 9.678c-.83 0-1.5.67-1.5 1.5v1.63a1.5 1.5 0 103 0v-1.63c0-.83-.67-1.5-1.5-1.5zm20.994 0c-.83 0-1.5.67-1.5 1.5v1.63a1.5 1.5 0 103 0v-1.63c0-.83-.67-1.5-1.5-1.5zM6.68 14.587c-.83 0-1.5.67-1.5 1.5v1.63a1.5 1.5 0 103 0v-1.62c0-.83-.67-1.5-1.5-1.5zm0-9.817c-.83 0-1.5.67-1.5 1.5v5.357a1.5 1.5 0 003 0V6.258c0-.83-.67-1.5-1.5-1.5zm10.638 0c-.83 0-1.5.67-1.5 1.5v1.64a1.5 1.5 0 003 0V6.27c0-.83-.67-1.5-1.5-1.5zM12 0c-.83 0-1.5.67-1.5 1.5v1.63a1.5 1.5 0 103 0V1.5c0-.83-.67-1.499-1.5-1.499zm0 19.355c-.83 0-1.5.67-1.5 1.5v1.64a1.5 1.5 0 103 .01v-1.64c0-.82-.67-1.5-1.5-1.5zm5.319-8.457c-.83 0-1.5.68-1.5 1.5v5.328a1.5 1.5 0 003 0v-5.329c0-.83-.67-1.5-1.5-1.5zM12 6.128c-.83 0-1.5.68-1.5 1.5v8.728a1.5 1.5 0 003 0V7.638c0-.83-.67-1.5-1.5-1.5z" />
-</svg>
-{{- else if (eq $icon_name "googlescholar") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 25" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M5.242 13.769L0.5 9.5 12 1l11.5 9-5.242 3.769C17.548 11.249 14.978 9.5 12 9.5c-2.977 0-5.548 1.748-6.758 4.269zM12 10a7 7 0 1 0 0 14 7 7 0 0 0 0-14z" />
-</svg>
-{{- else if (eq $icon_name "gurushots") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 76.000000 76.000000" fill="currentColor" stroke-width="2"
-    preserveAspectRatio="xMidYMid meet">
-    <g>
-        <path d="M25.7,30.5c0,0,0.3-26.9,1.5-26.9c7.9,0,20.2-0.6,22.3,0C53.3,4.8,39.5,10.9,25.7,30.5z" />
-        <path d="M34.6,24.4c0,0,19-19,19.9-18.1c5.7,5.5,14.8,13.8,15.8,15.6C72.3,25.5,58.2,20.1,34.6,24.4z" />
-        <path d="M45,26.1c0,0,26.9-0.3,26.9,0.9c0.2,7.9,1,20.2,0.5,22.2C71.3,53.1,65,39.4,45,26.1z" />
-        <path d="M51.7,34.4c0,0,18.9,19.2,18,20C64.1,60.1,55.8,69.2,54,70.2C50.4,72.1,55.9,58,51.7,34.4z" />
-        <path d="M50.2,45.3c0,0-0.1,26.9-1.3,26.9c-7.9,0.1-20.2,0.7-22.3,0.1C22.7,71.2,36.5,65.1,50.2,45.3z" />
-        <path d="M41.5,51.8c0,0-19.2,18.8-20.1,17.9C15.7,64.1,6.7,55.8,5.7,53.9C3.8,50.3,17.8,55.9,41.5,51.8z" />
-        <path d="M30.7,50.3c0,0-26.9-0.1-26.9-1.3C3.7,41,3,28.7,3.6,26.7C4.8,22.8,10.9,36.6,30.7,50.3z" />
-        <path d="M24.2,41.6c0,0-18.9-19.2-18-20.1C11.8,15.9,20.1,6.8,22,5.8C25.6,3.9,20.1,17.9,24.2,41.6z" />
-    </g>
-</svg>
-{{- else if (eq $icon_name "hackerone") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M7.207 0c-.4836 0-.8774.1018-1.1823.3002-.3044.2003-.4592.4627-.4592.7798v21.809c0 .2766.1581.5277.4752.7609.315.2335.7031.3501 1.1664.3501.4427 0 .8306-.1166 1.1678-.3501.3352-.231.5058-.4843.5058-.761V1.0815c0-.319-.1623-.5769-.4893-.7813C8.0644.1018 7.6702 0 7.207 0zm9.5234 8.662c-.4836 0-.8717.0981-1.1683.3007l-4.439 2.7822c-.1988.1861-.2841.4687-.2473.855.0342.3826.2108.747.5238 1.0907.3145.346.6662.5626 1.0684.6547.3963.0899.6973.041.8962-.143l1.7551-1.0951v9.7817c0 .2767.1522.5278.4607.761.3007.2335.6873.3501 1.1504.3501.463 0 .863-.1166 1.1983-.3501.3371-.2332.5058-.4843.5058-.761V9.7381c0-.3193-.165-.577-.4898-.7754-.3252-.2026-.7288-.3007-1.2143-.3007z" />
-</svg>
-{{- else if (eq $icon_name "hackerrank") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 35" preserveAspectRatio="xMidYMid meet" fill="currentColor"
-    stroke-width="0" stroke="currentColor">
-    <g>
-        <path
-            d="M0 32.95L3.86 32.95L7.73 32.95L7.73 27.23L7.73 21.52L11.59 21.52L15.45 21.52L15.45 27.23L15.45 32.95L19.31 32.95L23.18 32.95L23.18 17.5L23.18 2.05L19.31 2.05L15.45 2.05L15.45 7.77L15.45 13.48L11.59 13.48L7.73 13.48L7.73 7.77L7.73 2.05L3.86 2.05L0 2.05L0 17.5L0 32.95Z"
-            id="i2pS2ila1d"></path>
-        <path
-            d="M27.19 32.95L38.63 32.95L50.06 32.95L50.06 17.5L50.06 2.05L38.63 2.05L27.19 2.05L27.19 17.5L27.19 32.95Z"
-            id="dgDKP06E5"></path>
-    </g>
-</svg>
-{{- else if (eq $icon_name "hackthebox") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" preserveAspectRatio="xMidYMid meet" fill="currentColor"
-    stroke="none">
-    <g>
-        <path
-            d="M11.9959.0008a1.1187 1.1187 0 00-.057.002.8993.8993 0 00-.2358.0498.9067.9067 0 00-.1652.079L1.9357 5.675a.889.889 0 00-.4444.7699c0 .006.0004.0128.0006.0192-.0002.007 0 .014 0 .0212V17.556a.889.889 0 00.469.7837l9.5983 5.5416c.018.0102.036.0197.054.0287v.002a.8568.8568 0 00.083.0348c0 .001.01.003.012.004.028.01.056.0177.085.0245.01.001.011.003.016.004.028.006.057.0112.086.0146 0 .0005.01.0009.014.001.03.003.061.005.091.005s.061-.002.091-.005c0-.0005.01-.0009.014-.001a.6831.6831 0 00.086-.0146c.01-.001.011-.002.016-.004a.9404.9404 0 00.085-.0245c0-.001.01-.003.012-.004a.8818.8818 0 00.083-.0347v-.002a1.086 1.086 0 00.054-.0287l9.5986-5.5416a.889.889 0 00.4689-.7837V6.4786c0-.009-.0006-.0172-.0008-.0258h.0003v-.008a.8886.8886 0 00-.3117-.6755c-.01-.008-.019-.0162-.029-.0241 0-.002-.01-.005-.01-.007a.8988.8988 0 00-.1074-.0705L12.4533.1267a.8872.8872 0 00-.4646-.1266zm.01 2.2523c.072 0 .1443.0187.209.056l6.5366 3.774c.2789.161.2789.5633 0 .7243l-6.5367 3.774a.4182.4182 0 01-.4182 0L5.26 6.8074c-.2788-.1609-.2789-.5633 0-.7243l6.5368-3.774a.4193.4193 0 01.209-.056zm-8.0801 6.458a.4145.4145 0 01.215.0565l6.524 3.7666a.417.417 0 01.2086.3612v7.5326c0 .3212-.3477.522-.626.3613l-6.5237-3.7666a.4172.4172 0 01-.2086-.3613V9.1288c0-.2408.1955-.414.4107-.4177zm16.1599 0c.215.004.4107.1768.4107.4177v7.5325c0 .149-.08.2868-.2087.3614l-6.5239 3.7666c-.278.1606-.6258-.0401-.6258-.3614v-7.5325c0-.149.08-.2867.2086-.3613l6.5238-3.7666a.415.415 0 01.2152-.0565z">
-        </path>
-    </g>
-</svg>
-{{- else if (eq $icon_name "imdb") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="M22.3781 0H1.6218C.7411.0583.0587.7437.0018 1.5953l-.001 20.783c.0585.8761.7125 1.543 1.5559 1.6191A.337.337 0 0 0 1.6016 24h20.7971a.4579.4579 0 0 0 .0437-.002c.8727-.0768 1.5568-.8271 1.5568-1.7085V1.7098c0-.8914-.696-1.6416-1.584-1.7078A.3294.3294 0 0 0 22.3781 0zm0 .496a1.2144 1.2144 0 0 1 1.1252 1.2139v20.5797c0 .6377-.4875 1.1602-1.1045 1.2145H1.6016c-.5967-.0543-1.0645-.5297-1.1053-1.1258V1.6284C.5371 1.0185 1.0184.5364 1.6217.496h20.7564zM4.7954 8.2603v7.3636H2.8899V8.2603h1.9055zm6.5367 0v7.3636H9.6707v-4.9704l-.6711 4.9704H7.813l-.6986-4.8618-.0066 4.8618h-1.668V8.2603h2.468c.0748.4476.1492.9694.2307 1.5734l.2712 1.8713.4407-3.4447h2.4817zm2.9772 1.3289c.0742.0404.122.108.1417.2034.0279.0953.0345.3118.0345.6442v2.8548c0 .4881-.0345.7867-.0955.8954-.0609.1152-.2304.1695-.5018.1695V9.5211c.204 0 .3457.0205.4211.0681zm-.0211 6.0347c.4543 0 .8006-.0265 1.0245-.0742.2304-.0477.4204-.1357.5694-.2648.1556-.1218.2642-.298.3251-.5219.0611-.2238.1021-.6648.1021-1.3224v-2.5832c0-.6986-.0271-1.1668-.0742-1.4039-.041-.237-.1431-.4543-.3126-.6437-.1695-.1973-.4198-.3324-.7456-.421-.3191-.0808-.8542-.1285-1.7694-.1285h-1.4244v7.3636h2.3051zm5.14-1.7827c0 .3523-.0199.5762-.0544.6708-.033.0947-.1894.1424-.3046.1424-.1086 0-.19-.0477-.2238-.1351-.041-.0887-.0609-.2986-.0609-.6238v-1.9469c0-.3324.0199-.5423.0543-.6237.0338-.0808.1086-.122.2171-.122.1153 0 .2709.0412.3114.1425.041.0947.0609.2986.0609.6032v1.8926zm-2.4747-5.5809v7.3636h1.7157l.1152-.4675c.1556.1894.3251.3324.5152.4271.1828.0881.4608.1357.678.1357.3047 0 .5629-.0748.7802-.237.2165-.1562.3589-.3462.4198-.5628.0543-.2173.0887-.543.0887-.9841v-2.0675c0-.4409-.0139-.7324-.0344-.8681-.0199-.1357-.0742-.2781-.1695-.4204-.1021-.1425-.2437-.251-.4272-.3325-.1834-.0742-.3999-.1152-.6576-.1152-.2172 0-.4952.0477-.6846.1285-.1835.0887-.353.2238-.5086.4007V8.2603h-1.8309z" />
-</svg>
-{{- else if (eq $icon_name "instagram") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <rect x="2" y="2" width="20" height="20" rx="5" ry="5"></rect>
-    <path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"></path>
-    <line x1="17.5" y1="6.5" x2="17.5" y2="6.5"></line>
-</svg>
-{{- else if (eq $icon_name "intigriti") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="M19.9133 6.0364c-1.1056.574-3.7632 1.924-5.8999 3.0084-3.7738 1.9134-7.0267 3.593-7.1117 3.6674-.032.0213.0106.404.085.8611.574 3.4123 2.1473 6.4526 4.316 8.3555l.691.6165.6909-.5953c1.839-1.6158 3.3273-4.2202 4.0502-7.0585.1488-.5634.2764-1.3076.287-1.6477l.0213-.6166-2.9553-1.5308-.7335.372c-.3933.202-.7229.3934-.7229.4253 0 .0319.6698.3933 1.4883.7973l1.4882.7335-.0637.3827c-.3934 2.1686-1.6158 4.7517-2.9234 6.1868l-.606.6698-.4464-.4253c-.9248-.893-1.9347-2.615-2.5194-4.3053-.3295-.946-.7229-2.4343-.659-2.4875.0212-.0212 3.0402-1.5414 6.7077-3.391l6.6546-3.3699.2126.3508c.6697 1.0843.7229 2.5407.1382 3.7313-.6484 1.3181-1.754 1.9879-3.3698 2.0623l-.978.0425-.0638.3189c-.0319.1807-.0638.4784-.0638.6803 0 .319.032.3615.3827.4253.574.1063 1.7647-.032 2.4556-.287 1.6796-.6273 2.849-1.9135 3.3699-3.7313.4464-1.5627-.032-3.423-1.265-4.8475-.2127-.2445-.4465-.4464-.5103-.4464-.0744.0106-1.0312.4783-2.1473 1.0524zM1.3739 5.4836C.1833 6.8762-.2632 8.6196.1514 10.2354c.4677 1.8071 1.6583 3.136 3.3698 3.7737.691.2552 1.8816.3934 2.4556.287.4146-.085.4571-.202.319-1.031l-.0638-.3934-.978-.0425c-1.6265-.0744-2.7214-.7442-3.3805-2.0836-.574-1.148-.5315-2.5406.085-3.6143l.2658-.4571 3.8482 1.956 3.8588 1.956.7123-.3508c.3933-.202.7122-.404.7122-.4465 0-.0638-9.3441-4.805-9.4823-4.805-.0425 0-.2658.2233-.4996.4997zm6.3144-3.6144l-.2657.404.2338.0638c.691.1807 1.6903.9567 2.1048 1.637l.2127.3402-.5953.8824c-.5953.893-1.212 2.0304-1.212 2.2323 0 .0957.9568.6379 1.1375.6379.0426 0 .287-.404.5316-.8824.5315-1.0417.9567-1.6583 1.6583-2.4024l.4996-.5315.4465.4783c.7016.7548 1.2119 1.4883 1.6902 2.4237.2445.4678.4678.8824.489.9143.0638.0744 1.2013-.5422 1.2013-.6591 0-.1914-.6485-1.3713-1.2225-2.2111l-.5953-.8717.2232-.3508c.3295-.5316 1.2012-1.2757 1.754-1.499.2658-.1169.4784-.255.4784-.3082 0-.0638-.1063-.2445-.2445-.4146l-.2445-.2976-.5209.2445c-.3083.1488-.8717.5846-1.3394 1.0524l-.808.8079-.659-.606-.6485-.6165-.6484.6165-.6591.6166-.7548-.7654C9.3254 2.1882 8.2943 1.476 8.018 1.476c-.032 0-.1808.1807-.3296.3933z" />
-</svg>
-{{- else if (eq $icon_name "itchio") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 245.371 220.736" fill="currentColor">
-    <path
-        d="M31.99 1.365C21.287 7.72.2 31.945 0 38.298v10.516C0 62.144 12.46 73.86 23.773 73.86c13.584 0 24.902-11.258 24.903-24.62 0 13.362 10.93 24.62 24.515 24.62 13.586 0 24.165-11.258 24.165-24.62 0 13.362 11.622 24.62 25.207 24.62h.246c13.586 0 25.208-11.258 25.208-24.62 0 13.362 10.58 24.62 24.164 24.62 13.585 0 24.515-11.258 24.515-24.62 0 13.362 11.32 24.62 24.903 24.62 11.313 0 23.773-11.714 23.773-25.046V38.298c-.2-6.354-21.287-30.58-31.988-36.933C180.118.197 157.056-.005 122.685 0c-34.37.003-81.228.54-90.697 1.365zm65.194 66.217a28.025 28.025 0 0 1-4.78 6.155c-5.128 5.014-12.157 8.122-19.906 8.122a28.482 28.482 0 0 1-19.948-8.126c-1.858-1.82-3.27-3.766-4.563-6.032l-.006.004c-1.292 2.27-3.092 4.215-4.954 6.037a28.5 28.5 0 0 1-19.948 8.12c-.934 0-1.906-.258-2.692-.528-1.092 11.372-1.553 22.24-1.716 30.164l-.002.045c-.02 4.024-.04 7.333-.06 11.93.21 23.86-2.363 77.334 10.52 90.473 19.964 4.655 56.7 6.775 93.555 6.788h.006c36.854-.013 73.59-2.133 93.554-6.788 12.883-13.14 10.31-66.614 10.52-90.474-.022-4.596-.04-7.905-.06-11.93l-.003-.045c-.162-7.926-.623-18.793-1.715-30.165-.786.27-1.757.528-2.692.528a28.5 28.5 0 0 1-19.948-8.12c-1.862-1.822-3.662-3.766-4.955-6.037l-.006-.004c-1.294 2.266-2.705 4.213-4.563 6.032a28.48 28.48 0 0 1-19.947 8.125c-7.748 0-14.778-3.11-19.906-8.123a28.025 28.025 0 0 1-4.78-6.155 27.99 27.99 0 0 1-4.736 6.155 28.49 28.49 0 0 1-19.95 8.124c-.27 0-.54-.012-.81-.02h-.007c-.27.008-.54.02-.813.02a28.49 28.49 0 0 1-19.95-8.123 27.992 27.992 0 0 1-4.736-6.155zm-20.486 26.49l-.002.01h.015c8.113.017 15.32 0 24.25 9.746 7.028-.737 14.372-1.105 21.722-1.094h.006c7.35-.01 14.694.357 21.723 1.094 8.93-9.747 16.137-9.73 24.25-9.746h.014l-.002-.01c3.833 0 19.166 0 29.85 30.007L210 165.244c8.504 30.624-2.723 31.373-16.727 31.4-20.768-.773-32.267-15.855-32.267-30.935-11.496 1.884-24.907 2.826-38.318 2.827h-.006c-13.412 0-26.823-.943-38.318-2.827 0 15.08-11.5 30.162-32.267 30.935-14.004-.027-25.23-.775-16.726-31.4L46.85 124.08C57.534 94.073 72.867 94.073 76.7 94.073zm45.985 23.582v.006c-.02.02-21.863 20.08-25.79 27.215l14.304-.573v12.474c0 .584 5.74.346 11.486.08h.006c5.744.266 11.485.504 11.485-.08v-12.474l14.304.573c-3.928-7.135-25.79-27.215-25.79-27.215v-.006l-.003.002z" />
-</svg>
-{{- else if (eq $icon_name "juejin") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="m12 14.316 7.454-5.88-2.022-1.625L12 11.1l-.004.003-5.432-4.288-2.02 1.624 7.452 5.88Zm0-7.247 2.89-2.298L12 2.453l-.004-.005-2.884 2.318 2.884 2.3Zm0 11.266-.005.002-9.975-7.87L0 12.088l.194.156 11.803 9.308 7.463-5.885L24 12.085l-2.023-1.624Z" />
-</svg>
-{{- else if (eq $icon_name "kaggle") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="currentColor" stroke="none">
-    <path transform="matrix(.527027 0 0 .527027 -30.632288 -22.45559)" clip-path="url(#A)"
-        d="M105.75 102.968c-.06.238-.298.357-.713.357H97.1c-.477 0-.89-.208-1.248-.625L82.746 86.028l-3.655 3.477v12.93c0 .595-.298.892-.892.892h-6.152c-.595 0-.892-.297-.892-.892V43.5c0-.593.297-.89.892-.89H78.2c.594 0 .892.298.892.89v36.288l15.692-15.87c.416-.415.832-.624 1.248-.624h8.204c.356 0 .593.15.713.445.12.357.09.624-.09.803L88.274 80.588l17.297 21.488c.237.238.297.535.18.892" />
-</svg>
-{{- else if (eq $icon_name "kakaotalk") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="m12 0c-6.667 0-10.686 4.11-11.709 8.183-1.062 4.224.793 8.271 4.855 10.689-.903 3.276-1.45 4.376-.587 4.965.968.662 2.362-.707 4.691-2.494l.957-.733c3.749.486 7.568-.593 10.272-2.913 2.27-1.948 3.52-4.553 3.52-7.334.001-5.715-5.382-10.363-11.999-10.363zm7.504 16.558c-2.454 2.106-5.965 3.049-9.388 2.524-.479-.077-2.592 1.773-4.312 2.971.194-.735.574-1.972.943-3.353.09-.336-.063-.69-.37-.854-4.527-2.431-5.362-6.396-4.633-9.297.884-3.508 4.397-7.049 10.256-7.049 5.79 0 10.5 3.976 10.5 8.862 0 2.338-1.064 4.538-2.996 6.196z" />
-    <path d="m6.5 7.75h-3c-.992 0-.993 1.5 0 1.5h.75v4.25c0 .992 1.5.993 1.5 0v-4.25h.75c.992 0 .993-1.5 0-1.5z" />
-    <path
-        d="m10.196 8.222c-.001-.003-.004-.004-.005-.007-.246-.595-1.126-.623-1.383 0-.001.002-.003.004-.004.007l-2 5c-.154.384.033.821.418.975.958.386 1.129-.971 1.386-1.446h1.785l.411 1.028c.367.92 1.764.367 1.393-.557zm-.988 3.028.292-.731.292.731z" />
-    <path d="m15.5 12.75h-1.25v-4.25c0-.992-1.5-.993-1.5 0v5c0 .414.336.75.75.75h2c.992 0 .993-1.5 0-1.5z" />
-    <path
-        d="m18.25 9.689v-1.189c0-.992-1.5-.993-1.5 0v5c0 .992 1.5.993 1.5 0v-1.469c1.605 1.746 1.657 2.219 2.25 2.219.63 0 .991-.747.569-1.239l-1.857-2.163 1.823-1.823c.002-.003.005-.005.007-.008.001-.001.002-.002.003-.003.681-.706-.373-1.747-1.07-1.05z" />
-</svg>
-{{- else if (eq $icon_name "keybase") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 71 76.3" fill="currentColor" stroke="none">
-    <path
-        d="M6.68 73.99c-.6-1.3-1.4-3.1-1.8-4l-.6-1.7-2 2.2-2 2.2-.2-4.2c-.3-6 .2-12.2 1.2-16.6 2.3-9.8 9.5-18.7 18.8-23.4l2.1-1-.5-1.5c-.3-.8-.6-2.5-.7-3.6l-.2-2.1-2.1-.2c-3.2-.3-4.9-1.2-6-3.5-.6-1.2-.6-1.4-.4-4.6.2-4.2.5-5.1 1.8-6.5 1.6-1.8 2.7-2.1 6.7-1.9 2.9.2 3.5.3 4.8.9.8.4 1.5.8 1.6.8.1 0 1-1.1 2.1-2.6l1.9-2.7 1.2.7c.7.4 1.5.9 1.9 1.1l.7.4-.6 1.5c-.3.8-.7 2.2-.8 2.9l-.2 1.4 1.7.2c6.1.6 10.7 4.3 12.4 9.9.5 1.8.5 5.3 0 7-.5 1.6-.5 1.7-.1 1.7.7 0 5.4 2.3 7.3 3.5 3.7 2.4 8 6.6 10.4 10.2 4.5 6.7 6.4 14 5.6 22-.4 4.8-1.3 8.6-2.9 12.3l-.6 1.4h-5l1.2-2.4c1.3-2.6 2.3-6.2 2.8-9.4.3-2.2.4-8.2.1-9.3l-.2-.7-1.3 1.4c-3.2 3.5-7.9 4.5-14.2 2.8-5.4-1.4-7.6-1.7-12.7-1.7-3.9 0-5.2.1-7.3.6-5.8 1.3-9.9 3.2-15.6 7.3-2.1 1.5-3.8 2.7-3.9 2.7-.1 0 .2-1 .6-2.3.4-1.3 1.1-3.4 1.5-4.8l.8-2.5-.9.9c-.5.5-1.9 1.9-3.1 3.2l-2.1 2.3.5 1.9c.6 2.5 2 5.6 3.5 7.9.6 1 1.1 1.8 1.1 1.9s-1.2.1-2.6.1h-2.6l-1.1-2.1zm8.8-24.2c4.8-5.1 8.7-9.2 8.8-9.2.1.1-.4 1.6-.9 3.3-3.3 10.4-4 12.4-3.9 12.5 0 0 1.2-.4 2.5-.9 8.5-3.7 18.4-4.2 28.9-1.4 4.7 1.2 6.5 1.2 8.8 0 1.3-.7 1.8-1.1 2.4-2.1 1.1-1.7 1.2-4.1.5-6.3-1.7-4.8-8.3-11-14.5-13.7-3.2-1.4-3.4-1.4-4.1-.7l-.6.6 2.6 3.2c1.4 1.7 2.9 3.6 3.1 4.1.6 1.2.7 3.1.1 4.3-.8 1.7-3.2 2.9-5.1 2.5-.8-.2-1.1-.1-1.9.5-2.2 1.6-4.6 1.2-6.6-1.2-1.6-1.8-2-2.7-2.1-4.5 0-.9-.3-2-.5-2.4-.3-.6-.4-1.3-.4-2.2l.1-1.4-1.3-.3c-1.8-.5-3.9-1.5-5.1-2.4-.6-.4-1.1-.8-1.3-.8s-1.5.6-2.9 1.3c-9.7 5-16 14.3-17 24.8-.1 1-.2 2.3-.3 2.8l-.1.9 1.1-1.1c.5-.5 4.9-5.1 9.7-10.2zm25.9-7.4c.9-.7 1.7-1.3 1.9-1.3.1 0 .4.3.7.7.5.8 1.4.8 1.8.1.3-.5.3-.6-5.6-7.8-3.5-4.3-4.2-5-4.7-5-1.2.1-.9 1 1 3.3l1.8 2.2-1 .8c-1.1 1-1.2 1.2-.5 1.8.5.5.6.4 1.6-.3l1.1-.7.7.6c.4.3.6.8.6.9 0 .2-.8.9-1.7 1.7-.9.7-1.6 1.5-1.6 1.7 0 .3.5 1.1 1.4 2.2.3.6.8.4 2.5-.9zm-10.3-14.2c.6-1.8 2.6-3.2 4.6-3.2 1.1 0 2.7.9 3.8 2.1l1 1.2.9-1.1c2.5-2.8 2.8-6.7.8-10.1-1.5-2.5-4.3-4-8.2-4.4-2.1-.2-2.6-.4-3.7-1.5l-.8-.8-.4.6c-.8 1.2-2.5 5.1-3 6.6-.7 2.3-.4 5.9.5 7.7.9 1.7 3.3 4 4 3.7.1.1.3-.3.5-.8zm-8.9-13.6c.2-.5.7-1.8 1.2-2.8.5-1 .9-2 .9-2.3 0-.9-1-1.3-3.7-1.5-2.4-.2-2.6-.1-3.1.4-.4.4-.6.9-.6 1.6 0 .6-.1 1.7-.2 2.6-.2 2.1.1 2.5 2.2 2.8 3.1.2 3 .2 3.3-.8zm-3.1-2.4c0-1.7.2-1.9 1.6-1.9h1.3v2.8h-2.8v-.9zm6.3 58.3c-.6-.6-.8-1-.8-2 0-1.9 1.1-3 2.9-3 1.7 0 2.9 1.2 2.9 2.9 0 1.8-1.1 2.8-3 2.9-1 0-1.4-.2-2-.8zm19.3.3a2.93 2.93 0 011.8-5.3c1.8 0 2.8 1.1 2.9 3 0 1.1-.1 1.4-.8 2s-1 .8-2 .8c-.9 0-1.5-.2-1.9-.5z" />
-</svg>
-{{- else if (eq $icon_name "keyoxide") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26 26" fill="none" stroke="currentColor" stroke-linecap="round"
-    stroke-linejoin="round" stroke-width="1.3">
-    <path
-        d="m10.87 0c-0.4551 0-0.832 0.3769-0.832 0.832 0 0.4551 0.3769 0.832 0.832 0.832 0.4551 0 0.832-0.3769 0.832-0.832 0-0.4551-0.3769-0.832-0.832-0.832zm1.85 0.293c-0.5683 0-1.037 0.4688-1.037 1.037 0 0.2368 0.0807 0.4573 0.2168 0.6328-0.05687-0.007139-0.1151-0.01172-0.1738-0.01172-0.7683 0-1.398 0.6302-1.398 1.398 0 0.7683 0.6302 1.4 1.398 1.4 0.3773 0 0.7222-0.1523 0.9746-0.3984-0.00891 0.07397-0.01562 0.1483-0.01562 0.2246 0 0.5999 0.3126 1.131 0.7734 1.48l-2.586 2.012v-0.1152c0-1.817-1.482-3.299-3.299-3.299-1.817 0-3.299 1.482-3.299 3.299v6.828c-1.699e-4 -0.01435-0.001953-0.009604-0.001953 0.03516v5.883c-3.1e-6 1.819 1.482 3.301 3.301 3.301 1.73 0 3.115-1.354 3.25-3.051l3.744 2.494c1.512 1.008 3.566 0.5976 4.574-0.9141 1.008-1.512 0.5976-3.566-0.9141-4.574l-5.014-3.344 5.209-4.053c1.263-0.9824 1.63-2.72 0.9102-4.115-0.006296-0.01221-0.0141-0.02849-0.02148-0.04297 0.2572-0.2824 0.4141-0.657 0.4141-1.066 0-0.8712-0.7128-1.584-1.584-1.584-0.6345 0-1.187 0.3779-1.439 0.9199-0.08446-0.006921-0.1692-0.01237-0.2539-0.01367 0.0014-0.03013 0.003906-0.04019 0.003906-0.08008 0-1.036-0.8484-1.885-1.885-1.885-0.579 5.6e-6 -1.097 0.2653-1.443 0.6797 1.08e-4 -0.007109 0-0.01435 0-0.02148 0-0.3811-0.1542-0.7293-0.4043-0.9824 0.5684 0 1.037-0.4688 1.037-1.037 0-0.5683-0.4688-1.037-1.037-1.037zm-1.85 0.4219c0.06898 0 0.1172 0.04821 0.1172 0.1172s-0.04821 0.1172-0.1172 0.1172c-0.06898 0-0.1172-0.04821-0.1172-0.1172s0.0482-0.1172 0.1172-0.1172zm1.85 0.293c0.1822 0 0.3223 0.14 0.3223 0.3223 0 0.1822-0.14 0.3223-0.3223 0.3223-0.1822 0-0.3223-0.14-0.3223-0.3223 0-0.1822 0.14-0.3223 0.3223-0.3223zm-0.9941 1.658c0.3822 0 0.6836 0.3014 0.6836 0.6836 0 0.3822-0.3014 0.6855-0.6836 0.6855-0.3822 0-0.6836-0.3034-0.6836-0.6855 0-0.3822 0.3014-0.6836 0.6836-0.6836zm2.842 0.7402c0.6502-1.88e-5 1.17 0.5197 1.17 1.17 0 0.05687-0.005159 0.1097-0.005859 0.1914-6.61e-4 0.08173 0.01051 0.21 0.08008 0.3281 0.06857 0.1163 0.1972 0.2073 0.3047 0.2402 0.1075 0.03295 0.1919 0.03178 0.2617 0.03125 0.0602-4.678e-4 0.1197 0.005507 0.1797 0.009766 0.0172 0.6402 0.4194 1.188 0.9824 1.422 0.08721 0.03618 0.1774 0.06577 0.2715 0.08594 0.003893 8.346e-4 0.007816 0.001148 0.01172 0.001953 0.00711 0.001489 0.01434 0.002515 0.02148 0.003906 0.04462 0.008569 0.08895 0.01678 0.1348 0.02148 0.001285 1.341e-4 0.00262-1.31e-4 0.003906 0 0.05184 0.00519 0.1051 0.007812 0.1582 0.007812 0.09398 0 0.1858-0.009457 0.2754-0.02539 0.002495-4.438e-4 0.005321 4.557e-4 0.007812 0 0.003259-5.976e-4 0.006512-0.001335 0.009766-0.001953 0.08604-0.01629 0.1694-0.04058 0.25-0.07031 0.004443-0.001639 0.009247-0.002228 0.01367-0.003906 0.0038-0.00142 0.002259-6.138e-4 0.005859-0.001953 0.5338 1.086 0.2618 2.415-0.7188 3.178l-5.604 4.357a0.3573 0.3573 0 0 0 0.02148 0.5801l5.428 3.617c1.19 0.7933 1.51 2.394 0.7168 3.584-0.7933 1.19-2.394 1.51-3.584 0.7168l-4.25-2.832a0.3573 0.3573 0 0 0-0.5547 0.2969v0.3848c0 1.433-1.153 2.586-2.586 2.586-1.433 0-2.586-1.153-2.586-2.586v-5.883c0 0.02601 0.001373 0.01561 0.001953-0.03125a0.3573 0.3573 0 0 0 0-0.001953 0.3573 0.3573 0 0 0 0-0.001953v-6.828c0-1.43 1.154-2.584 2.584-2.584 1.43 0 2.584 1.154 2.584 2.584v0.8457a0.3573 0.3573 0 0 0 0.5762 0.2832l3.207-2.496s0.07527-0.04914 0.1484-0.1289c0.07317-0.07976 0.1932-0.2171 0.1641-0.4531-0.01519-0.1239-0.1002-0.2811-0.1855-0.3535-0.08537-0.07239-0.1288-0.08753-0.166-0.1133-0.3095-0.2145-0.502-0.5695-0.502-0.9609 0-0.6502 0.5177-1.17 1.168-1.17zm3.574 1.057c0.4851 0 0.8691 0.386 0.8691 0.8711 0 0.3632-0.2156 0.671-0.5273 0.8027-5.5e-4 2.323e-4 -0.001402-2.313e-4 -0.001953 0-0.008517 0.003475-0.0281 0.009073-0.03516 0.01172-0.04666 0.01751-0.09382 0.03145-0.1426 0.04102-0.002029 3.979e-4 -0.003828 0.00157-0.00586 0.001953-0.003817 6.812e-4 -0.007883-6.32e-4 -0.01172 0-0.04722 0.008255-0.09583 0.01367-0.1445 0.01367-0.06064 0-0.1188-0.006076-0.1758-0.01758s-0.1119-0.0289-0.1641-0.05078c-0.0522-0.02188-0.1021-0.04893-0.1484-0.08008s-0.08962-0.06619-0.1289-0.1055-0.07432-0.0826-0.1055-0.1289-0.0582-0.09624-0.08008-0.1484c-0.02188-0.0522-0.03928-0.1071-0.05078-0.1641-0.0115-0.05698-0.01758-0.1151-0.01758-0.1758 1e-5 -0.01046 0.001317-0.032 0.001954-0.04492 7.45e-4 -0.01496 4.8e-4 -0.03018 0.001953-0.04492 0.04418-0.4421 0.4124-0.7812 0.8672-0.7812z">
-    </path>
-</svg>
-{{- else if (eq $icon_name "kofi") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -3 23 27" preserveAspectRatio="xMidYMid meet" fill="none"
-    stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M23.881 8.948c-.773-4.085-4.859-4.593-4.859-4.593H.723c-.604 0-.679.798-.679.798s-.082 7.324-.022 11.822c.164 2.424 2.586 2.672 2.586 2.672s8.267-.023 11.966-.049c2.438-.426 2.683-2.566 2.658-3.734c4.352.24 7.422-2.831 6.649-6.916zm-11.062 3.511c-1.246 1.453-4.011 3.976-4.011 3.976s-.121.119-.31.023c-.076-.057-.108-.09-.108-.09c-.443-.441-3.368-3.049-4.034-3.954c-.709-.965-1.041-2.7-.091-3.71c.951-1.01 3.005-1.086 4.363.407c0 0 1.565-1.782 3.468-.963c1.904.82 1.832 3.011.723 4.311zm6.173.478c-.928.116-1.682.028-1.682.028V7.284h1.77s1.971.551 1.971 2.638c0 1.913-.985 2.667-2.059 3.015z" />
-</svg>
-{{- else if (eq $icon_name "komoot") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-linecap="round"
-    stroke-linejoin="round" stroke-width="3">
-    <path
-        d="M24 2.5A21.5 21.5 0 0 0 7.17 37.38l10.22-10.22a7.32 7.32 0 0 1 11.79-8.34h0a7.32 7.32 0 0 1 1.43 8.34l10.22 10.22A21.5 21.5 0 0 0 24 2.5Zm0 25L10.64 40.82a21.41 21.41 0 0 0 26.72 0Z" />
-</svg>
-{{- else if (eq $icon_name "lastfm") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="M10.599 17.211l-.881-2.393s-1.433 1.596-3.579 1.596c-1.9 0-3.249-1.652-3.249-4.296 0-3.385 1.708-4.596 3.388-4.596 2.418 0 3.184 1.568 3.845 3.578l.871 2.751c.871 2.672 2.523 4.818 7.285 4.818 3.41 0 5.722-1.045 5.722-3.801 0-2.227-1.276-3.383-3.635-3.935l-1.757-.384c-1.217-.274-1.577-.771-1.577-1.597 0-.936.736-1.487 1.952-1.487 1.323 0 2.028.495 2.147 1.679l2.749-.33c-.225-2.479-1.937-3.494-4.745-3.494-2.479 0-4.897.936-4.897 3.934 0 1.873.902 3.058 3.185 3.605l1.862.443c1.397.33 1.863.916 1.863 1.713 0 1.021-.992 1.441-2.869 1.441-2.779 0-3.936-1.457-4.597-3.469l-.901-2.75c-1.156-3.574-3.004-4.896-6.669-4.896C2.147 5.327 0 7.879 0 12.235c0 4.179 2.147 6.445 6.003 6.445 3.108 0 4.596-1.457 4.596-1.457v-.012z" />
-</svg>
-{{- else if (eq $icon_name "leetcode") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M13.483 0a1.374 1.374 0 0 0-.961.438L7.116 6.226l-3.854 4.126a5.266 5.266 0 0 0-1.209 2.104 5.35 5.35 0 0 0-.125.513 5.527 5.527 0 0 0 .062 2.362 5.83 5.83 0 0 0 .349 1.017 5.938 5.938 0 0 0 1.271 1.818l4.277 4.193.039.038c2.248 2.165 5.852 2.133 8.063-.074l2.396-2.392c.54-.54.54-1.414.003-1.955a1.378 1.378 0 0 0-1.951-.003l-2.396 2.392a3.021 3.021 0 0 1-4.205.038l-.02-.019-4.276-4.193c-.652-.64-.972-1.469-.948-2.263a2.68 2.68 0 0 1 .066-.523 2.545 2.545 0 0 1 .619-1.164L9.13 8.114c1.058-1.134 3.204-1.27 4.43-.278l3.501 2.831c.593.48 1.461.387 1.94-.207a1.384 1.384 0 0 0-.207-1.943l-3.5-2.831c-.8-.647-1.766-1.045-2.774-1.202l2.015-2.158A1.384 1.384 0 0 0 13.483 0zm-2.866 12.815a1.38 1.38 0 0 0-1.38 1.382 1.38 1.38 0 0 0 1.38 1.382H20.79a1.38 1.38 0 0 0 1.38-1.382 1.38 1.38 0 0 0-1.38-1.382z" />
-</svg>
-{{- else if (eq $icon_name "letterboxd") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="currentColor">
-    <path
-        d="M11.052 22.339V9.599H8.729V6.401h8.438v3.198h-2.328v12.766h5.234v-3.49h3.781v6.724H8.729v-3.26zM0 16c0 8.839 7.161 16 16 16s16-7.161 16-16S24.839 0 16 0S0 7.161 0 16z" />
-</svg>
-{{- else if (eq $icon_name "liberapay") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" fill="currentColor">
-    <g transform="translate(-78.37-208.06)">
-        <path
-            d="m104.28 271.1c-3.571 0-6.373-.466-8.41-1.396-2.037-.93-3.495-2.199-4.375-3.809-.88-1.609-1.308-3.457-1.282-5.544.025-2.086.313-4.311.868-6.675l9.579-40.05 11.69-1.81-10.484 43.44c-.202.905-.314 1.735-.339 2.489-.026.754.113 1.421.415 1.999.302.579.817 1.044 1.546 1.395.729.353 1.747.579 3.055.679l-2.263 9.278" />
-        <path
-            d="m146.52 246.14c0 3.671-.604 7.03-1.811 10.07-1.207 3.043-2.879 5.669-5.01 7.881-2.138 2.213-4.702 3.935-7.693 5.167-2.992 1.231-6.248 1.848-9.767 1.848-1.71 0-3.42-.151-5.129-.453l-3.394 13.651h-11.162l12.52-52.19c2.01-.603 4.311-1.143 6.901-1.622 2.589-.477 5.393-.716 8.41-.716 2.815 0 5.242.428 7.278 1.282 2.037.855 3.708 2.024 5.02 3.507 1.307 1.484 2.274 3.219 2.904 5.205.627 1.987.942 4.11.942 6.373m-27.378 15.461c.854.202 1.91.302 3.167.302 1.961 0 3.746-.364 5.355-1.094 1.609-.728 2.979-1.747 4.111-3.055 1.131-1.307 2.01-2.877 2.64-4.714.628-1.835.943-3.858.943-6.071 0-2.161-.479-3.998-1.433-5.506-.956-1.508-2.615-2.263-4.978-2.263-1.61 0-3.118.151-4.525.453l-5.28 21.948" />
-    </g>
-</svg>
-{{- else if (eq $icon_name "lichess" ) -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50">
-    <path fill="currentColor" stroke="currentColor" stroke-linejoin="round"
-        d="M38.956.5c-3.53.418-6.452.902-9.286 2.984C5.534 1.786-.692 18.533.68 29.364 3.493 50.214 31.918 55.785 41.329 41.7c-7.444 7.696-19.276 8.752-28.323 3.084C3.959 39.116-.506 27.392 4.683 17.567 9.873 7.742 18.996 4.535 29.03 6.405c2.43-1.418 5.225-3.22 7.655-3.187l-1.694 4.86 12.752 21.37c-.439 5.654-5.459 6.112-5.459 6.112-.574-1.47-1.634-2.942-4.842-6.036-3.207-3.094-17.465-10.177-15.788-16.207-2.001 6.967 10.311 14.152 14.04 17.663 3.73 3.51 5.426 6.04 5.795 6.756 0 0 9.392-2.504 7.838-8.927L37.4 7.171z" />
-</svg>
-{{- else if (eq $icon_name "linkedin") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"></path>
-    <rect x="2" y="9" width="4" height="12"></rect>
-    <circle cx="4" cy="4" r="2"></circle>
-</svg>
-{{- else if (eq $icon_name "linktree") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-  <path
-    d="m13.73635 5.85251 4.00467-4.11665 2.3248 2.3808-4.20064 4.00466h5.9085v3.30473h-5.9365l4.22865 4.10766-2.3248 2.3338L12.0005 12.099l-5.74052 5.76852-2.3248-2.3248 4.22864-4.10766h-5.9375V8.12132h5.9085L3.93417 4.11666l2.3248-2.3808 4.00468 4.11665V0h3.4727zm-3.4727 10.30614h3.4727V24h-3.4727z" />
-</svg>
-{{- else if (eq $icon_name "mastodon") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M21.58 13.913c-.29 1.469-2.592 3.121-5.238 3.396-1.379.184-2.737.368-4.185.276-2.368-.092-4.237-.551-4.237-.551 0 .184.014.459.043.643.308 2.294 2.317 2.478 4.22 2.57 1.922 0 3.633-.46 3.633-.46l.079 1.653s-1.344.734-3.738.918c-1.32.091-2.96-.092-4.869-.551-4.14-1.102-4.853-5.507-4.961-10.005-.034-1.285-.013-2.57-.013-3.58 0-4.589 3-5.966 3-5.966 1.513-.734 4.11-1.01 6.808-1.01h.067c2.699 0 5.296.276 6.81 1.01 0 0 3 1.377 3 5.967 0 0 .037 3.304-.419 5.69"
-        stroke="currentColor" />
-    <path
-        d="M17.832 8.633v5h-1.978V8.78c0-1.023-.43-1.542-1.29-1.542-.95 0-1.427.616-1.427 1.834v2.655H11.17V9.072c0-1.218-.476-1.834-1.427-1.834-.86 0-1.29.52-1.29 1.542v4.852H6.475V8.633c0-1.022.26-1.834.782-2.434.538-.6 1.243-.909 2.118-.909 1.012 0 1.779.39 2.286 1.169l.492.827.493-.827c.507-.78 1.274-1.169 2.286-1.169.875 0 1.58.308 2.118.909.522.6.782 1.412.782 2.434"
-        fill="currentColor" stroke="none" />
-</svg>
-{{- else if (eq $icon_name "matrix") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M.632.55v22.9H2.28V24H0V0h2.28v.55zm7.043 7.26v1.157h.033c.309-.443.683-.784 1.117-1.024.433-.245.936-.365 1.5-.365.54 0 1.033.107 1.481.314.448.208.785.582 1.02 1.108.254-.374.6-.706 1.034-.992.434-.287.95-.43 1.546-.43.453 0 .872.056 1.26.167.388.11.716.286.993.53.276.245.489.559.646.951.152.392.23.863.23 1.417v5.728h-2.349V11.52c0-.286-.01-.559-.032-.812a1.755 1.755 0 0 0-.18-.66 1.106 1.106 0 0 0-.438-.448c-.194-.11-.457-.166-.785-.166-.332 0-.6.064-.803.189a1.38 1.38 0 0 0-.48.499 1.946 1.946 0 0 0-.231.696 5.56 5.56 0 0 0-.06.785v4.768h-2.35v-4.8c0-.254-.004-.503-.018-.752a2.074 2.074 0 0 0-.143-.688 1.052 1.052 0 0 0-.415-.503c-.194-.125-.476-.19-.854-.19-.111 0-.259.024-.439.074-.18.051-.36.143-.53.282-.171.138-.319.337-.439.595-.12.259-.18.6-.18 1.02v4.966H5.46V7.81zm15.693 15.64V.55H21.72V0H24v24h-2.28v-.55z" />
-</svg>
-{{- else if (eq $icon_name "medium") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 76.000000 76.000000" fill="currentColor" stroke-width="2"
-    preserveAspectRatio="xMidYMid meet">
-    <g transform="translate(0.000000,76.000000) scale(0.100000,-0.100000)">
-        <path
-            d="M0 380 l0 -380 380 0 380 0 0 380 0 380 -380 0 -380 0 0 -380z m334 85 c30 -63 57 -115 59 -115 2 0 16 30 31 68 15 37 37 88 49 115 l20 47 76 0 76 -1 -27 -20 -28 -21 0 -151 c0 -150 0 -151 27 -179 l27 -28 -109 0 -109 0 27 28 c26 27 27 32 26 143 0 131 3 134 -71 -58 -24 -62 -48 -113 -53 -113 -6 0 -17 16 -24 35 -7 19 -36 83 -64 142 l-52 108 -3 -98 c-3 -97 -2 -99 28 -133 16 -19 30 -39 30 -44 0 -6 -31 -10 -70 -10 -45 0 -70 4 -70 11 0 6 14 27 30 46 30 33 30 35 30 151 0 116 0 118 -31 155 l-30 37 75 0 76 0 54 -115z" />
-    </g>
-</svg>
-{{- else if (eq $icon_name "microblog") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="M-30.2 14.1c-1.4-.8-2.7-1.5-4.1-2.3-2.4-1.5-3.6-3.6-3.3-6.5.3-3 2.8-5.2 5.8-5.3h11c2.6 0 4.6 2.2 4.7 4.7 0 2.6-2 4.8-4.6 4.9h-2.8v.2c.2.2.5.3.7.5 1.2.7 2.4 1.3 3.6 2 2.5 1.5 3.7 4.5 2.9 7.2-.8 2.7-3.1 4.3-6.1 4.4H-33c-2.4 0-4.3-1.9-4.6-4.3-.3-2.3 1.2-4.5 3.5-5.1.6-.1 1.2-.1 1.7-.2h2.1c.1 0 .1-.1.1-.2zm4.3-3.8c-.1.3-.2.3-.2.4v3.9c0 1.1-.1 1.2-1.2 1.2h-5.1c-.4 0-.9 0-1.3.1-1.6.4-2.5 1.9-2.4 3.6.2 1.6 1.6 2.9 3.3 2.9h10.5c2.1 0 3.8-1.2 4.5-3.1.7-1.8.2-4.1-1.5-5.3-2.1-1.3-4.4-2.4-6.6-3.7zm-1.7 3.4v-4c0-1.4.1-1.5 1.4-1.5h5.3c1.5 0 2.7-1 3.1-2.4.6-2.2-1-4.2-3.4-4.3h-10.1c-2.4 0-4.3 1.3-4.9 3.4-.6 2.1.4 4.4 2.5 5.5 1.7 1 3.5 1.9 5.2 2.9.3.2.5.2.9.4zM12 2c5.5 0 10 4 10 8.9 0 1.8-.8 3.8-2.1 5.4-.9 1-1.5 2.3-1.6 3.7 0-.1-.1-.1-.2-.2-.4-.4-1.1-.7-1.7-.7-.3 0-.5 0-.8.1-1.2.4-2.4.6-3.6.6-5.5 0-10-4-10-8.9S6.5 2 12 2m0-2C5.4 0 0 4.9 0 11s5.4 10.9 12 10.9c1.4 0 2.8-.2 4.2-.7h.1c.1 0 .2 0 .3.1 1 1.3 2.5 2.3 4.2 2.7l.2-.1v-.3c-.7-.9-1-1.9-1-3s.4-2.1 1.2-2.9c1.5-1.8 2.6-4.2 2.6-6.7C24 4.9 18.5 0 12 0z" />
-    <path
-        d="M53.3 6.9c-.2-1-1-1.7-1.9-2-1.7-.4-8.6-.4-8.6-.4s-6.9 0-8.6.5c-1 .3-1.7 1-1.9 2-.3 1.7-.5 3.5-.5 5.3 0 1.8.1 3.6.5 5.3.3.9 1 1.7 1.9 1.9 1.7.5 8.6.5 8.6.5s6.9 0 8.6-.5c1-.3 1.7-1 1.9-2 .3-1.7.5-3.5.5-5.3 0-1.8-.1-3.6-.5-5.3z" />
-    <path d="m40.6 15.5 5.7-3.3-5.7-3.3z" />
-    <path
-        d="M12 5.4c.1 0 .3.1.3.2L13.5 9l3.7.1c.1 0 .3.1.3.2s0 .3-.1.4l-3 2.2 1.1 3.5c0 .1 0 .3-.1.4H15l-3-2.1-3 2.1h-.5c-.1-.1-.2-.2-.1-.4l1-3.4-3-2.2c-.1-.2-.1-.3-.1-.5 0-.1.2-.2.3-.2l3.7-.1 1.2-3.4c.2-.1.3-.2.5-.2z" />
-</svg>
-{{- else if (eq $icon_name "mixcloud") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke-width="2">
-    <path
-        d="M21.95 19.062c-.154 0-.31-.045-.445-.135-.369-.25-.465-.75-.225-1.11.738-1.094 1.125-2.381 1.125-3.719s-.387-2.625-1.125-3.721c-.249-.368-.145-.866.216-1.106.375-.249.87-.146 1.108.214.917 1.365 1.396 2.97 1.396 4.62 0 1.648-.479 3.254-1.396 4.619-.135.239-.39.359-.645.359l-.009-.021zM19.66 17.768c-.153 0-.308-.045-.445-.139-.369-.239-.463-.734-.215-1.094.489-.721.747-1.545.747-2.43 0-.855-.258-1.695-.747-2.431-.248-.36-.154-.854.215-1.095s.857-.15 1.106.225c.669.99 1.021 2.145 1.021 3.314 0 1.201-.352 2.34-1.021 3.315-.146.24-.406.36-.661.36v-.025zm-3.73-7.153c-.314-3.197-3.016-5.699-6.3-5.699-2.721 0-5.13 1.748-5.995 4.283C1.588 9.501 0 11.269 0 13.4c0 2.344 1.912 4.254 4.26 4.254h10.908c1.964 0 3.566-1.594 3.566-3.557 0-1.706-1.2-3.129-2.805-3.48v-.002zm-.762 5.446H4.263c-1.466 0-2.669-1.191-2.669-2.658 0-1.465 1.193-2.658 2.669-2.658.71 0 1.381.285 1.886.781.3.314.811.314 1.125 0 .3-.301.3-.811 0-1.125-.555-.542-1.231-.931-1.965-1.111.75-1.665 2.43-2.774 4.305-2.774 2.609 0 4.74 2.129 4.74 4.738 0 .512-.075 1.006-.24 1.486-.135.42.09.869.51 1.02.074.03.165.045.24.045.33 0 .645-.211.75-.54.105-.315.18-.63.225-.96.734.285 1.26 1.005 1.26 1.83 0 1.096-.885 1.979-1.965 1.979l.034-.053z" />
-</svg>
-{{- else if (eq $icon_name "monero") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M12 0C5.365 0 0 5.373 0 12.015c0 1.335.228 2.607.618 3.81h3.577V5.729L12 13.545l7.805-7.815v10.095h3.577c.389-1.203.618-2.475.618-3.81C24 5.375 18.635 0 12 0zm-1.788 15.307l-3.417-3.421v6.351H1.758C3.87 21.689 7.678 24 12 24s8.162-2.311 10.245-5.764h-5.04v-6.351l-3.386 3.421-1.788 1.79-1.814-1.79h-.005z" />
-</svg>
-{{- else if (eq $icon_name "neteasecloudmusic") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M10.98,23.65c-2.69,0-5.26-1.05-7.24-2.95C1.59,18.63,.35,15.72,.35,12.73,.35,8.21,3.21,4.11,7.46,2.52c.15-.05,.3-.08,.45-.08,.42,0,.78,.21,.93,.55,.12,.26,.13,.51,.03,.75-.12,.28-.38,.52-.7,.64-3.48,1.3-5.82,4.66-5.82,8.36,0,2.46,1.02,4.84,2.79,6.54,1.6,1.54,3.68,2.39,5.85,2.39,.1,0,.2,0,.29,0,3.49-.12,6.22-1.91,7.47-4.89,.08-.2,2.01-4.93-2.59-7.9-.41-.27-.89-.46-1.42-.58l-.6-.14,.18,.58c.21,.68,.78,2.52,.84,2.93,.07,.46,.07,.51,.1,.92v.18c0,2.3-1.89,4.19-4.22,4.19-2.2,0-3.97-1.73-4.23-4.1-.25-2.35,.74-4.4,2.73-5.61,.53-.32,1.11-.57,1.73-.75l.33-.1-.48-1.74c-.16-.54-.53-2.38,1.5-3.72,.57-.38,1.22-.57,1.91-.57,1.38,0,2.62,.74,3.12,1.23,.22,.22,.36,.56,.36,.9,0,.26-.08,.48-.23,.63-.15,.15-.37,.23-.63,.23-.33,0-.67-.13-.89-.35-.06-.05-.85-.66-1.7-.66-.31,0-.59,.08-.82,.24-.04,.03-.08,.05-.12,.08-.23,.19-.71,.73-.47,1.82l.09,.34,.02,.07h0s.35,1.29,.35,1.29h.25c1.24,.08,2.39,.42,3.32,1.01l.05,.03c4.82,3.12,4.29,8.12,3.34,10.33-1.54,3.67-4.99,5.95-9.23,6.1-.12,0-.25,0-.37,0Zm.82-15.26c-.43,.13-.84,.31-1.2,.53-.94,.57-2.01,1.68-1.79,3.71,.12,1.12,.87,2.33,2.24,2.33,1.23,0,2.24-1,2.24-2.22h0s.03-.21-.05-.71c-.07-.46-.91-3.1-1-3.4l-.1-.33-.33,.1Z" />
-</svg>
-{{- else if (eq $icon_name "nextcloud") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M12.018 6.537c-2.5 0-4.6 1.712-5.241 4.015-.56-1.232-1.793-2.105-3.225-2.105A3.569 3.569 0 0 0 0 12a3.569 3.569 0 0 0 3.552 3.553c1.432 0 2.664-.874 3.224-2.106.641 2.304 2.742 4.016 5.242 4.016 2.487 0 4.576-1.693 5.231-3.977.569 1.21 1.783 2.067 3.198 2.067A3.568 3.568 0 0 0 24 12a3.569 3.569 0 0 0-3.553-3.553c-1.416 0-2.63.858-3.199 2.067-.654-2.284-2.743-3.978-5.23-3.977zm0 2.085c1.878 0 3.378 1.5 3.378 3.378 0 1.878-1.5 3.378-3.378 3.378A3.362 3.362 0 0 1 8.641 12c0-1.878 1.5-3.378 3.377-3.378zm-8.466 1.91c.822 0 1.467.645 1.467 1.468s-.644 1.467-1.467 1.468A1.452 1.452 0 0 1 2.085 12c0-.823.644-1.467 1.467-1.467zm16.895 0c.823 0 1.468.645 1.468 1.468s-.645 1.468-1.468 1.468A1.452 1.452 0 0 1 18.98 12c0-.823.644-1.467 1.467-1.467z" />
-</svg>
-{{- else if (eq $icon_name "nostr") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="m 23.991133,23.041317 c 0,0.468008 -0.376673,0.861815 -0.861814,0.861815 H 12.861481 c -0.468008,0 -0.861814,-0.376673 -0.861814,-0.861815 v -2.340105 c 0.04667,-2.870848 0.348005,-5.616161 0.981683,-6.871848 0.376673,-0.753346 1.010217,-1.164286 1.735095,-1.37549 1.37549,-0.40534 3.761263,-0.137335 4.788613,-0.182669 0,0 3.082052,0.120002 3.082052,-1.615227 0,-1.7350292 -1.375556,-1.3013553 -1.375556,-1.3013553 C 19.699128,9.4012901 18.540442,9.2946217 17.798497,8.9892833 16.542876,8.4926083 16.497208,7.6023935 16.497208,7.2998551 16.437207,3.812597 11.286255,3.3902566 6.7545122,4.2634712 1.8003629,5.1994868 6.8145132,12.311072 6.8145132,21.796897 v 1.267087 c 0,0.468008 -0.3940066,0.844681 -0.8618144,0.844681 H 0.86161395 c -0.4680078,0 -0.86181435741,-0.376673 -0.86181435741,-0.861814 V 1.3013551 c 0,-0.46800778 0.37667293741,-0.86181434 0.86181435741,-0.86181434 H 5.6502271 c 0.4680078,0 0.8618144,0.37667294 0.8618144,0.86181434 0,0.7076785 0.7876131,1.0901515 1.3583559,0.6791447 1.7236954,-1.23848733 3.9267996,-1.88916484 6.4038406,-1.88916484 5.524892,0 9.725562,3.23038714 9.725562,10.37623904 V 23.029717 Z M 14.80778,7.9278656 c 0,-1.0102835 -0.816213,-1.8263638 -1.82643,-1.8263638 -1.010217,0 -1.826364,0.8161469 -1.826364,1.8263638 0,1.0102835 0.816147,1.8264304 1.826364,1.8264304 1.010217,0 1.82643,-0.8161469 1.82643,-1.8264304 z" />
-</svg>
-{{- else if (eq $icon_name "nuget") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" stroke-width="2">
-    <g>
-        <path
-            d="M374.424959,454.856991 C327.675805,454.856991 289.772801,416.950177 289.772801,370.196324 C289.772801,323.463635 327.675805,285.535656 374.424959,285.535656 C421.174113,285.535656 459.077116,323.463635 459.077116,370.196324 C459.077116,416.950177 421.174113,454.856991 374.424959,454.856991 M205.565067,260.814741 C176.33891,260.814741 152.657469,237.109754 152.657469,207.901824 C152.657469,178.672728 176.33891,154.988907 205.565067,154.988907 C234.791225,154.988907 258.472666,178.672728 258.472666,207.901824 C258.472666,237.109754 234.791225,260.814741 205.565067,260.814741 M378.170817,95.6417786 L236.886365,95.6417786 C164.889705,95.6417786 106.479717,154.057639 106.479717,226.082702 L106.479717,367.360191 C106.479717,439.40642 164.889705,497.77995 236.886365,497.77995 L378.170817,497.77995 C450.209803,497.77995 508.577466,439.40642 508.577466,367.360191 L508.577466,226.082702 C508.577466,154.057639 450.209803,95.6417786 378.170817,95.6417786">
-        </path>
-        <path
-            d="M84.6521577,46.0115787 C84.6521577,69.3990881 65.6900744,88.3419125 42.3260788,88.3419125 C18.9409203,88.3419125 0,69.3990881 0,46.0115787 C0,22.6452344 18.9409203,3.68124485 42.3260788,3.68124485 C65.6900744,3.68124485 84.6521577,22.6452344 84.6521577,46.0115787">
-        </path>
-    </g>
-</svg>
-{{- else if (eq $icon_name "orcid") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" fill="none">
-    <path fill-rule="evenodd" clip-rule="evenodd"
-        d="M128 256C198.7 256 256 198.7 256 128C256 57.3 198.7 0 128 0C57.3 0 0 57.3 0 128C0 198.7 57.3 256 128 256ZM70.9 186.2H86.3V127.5V79.0999H70.9V186.2ZM108.9 79.0999H150.5C190.1 79.0999 207.5 107.4 207.5 132.7C207.5 160.2 186 186.3 150.7 186.3H108.9V79.0999ZM124.3 172.4H148.8C183.7 172.4 191.7 145.9 191.7 132.7C191.7 111.2 178 93 148 93H124.3V172.4ZM78.6 66.8999C84.2 66.8999 88.7 62.2999 88.7 56.7999C88.7 51.2999 84.2 46.7 78.6 46.7C73 46.7 68.5 51.2 68.5 56.7999C68.5 62.2999 73 66.8999 78.6 66.8999Z"
-        fill="currentColor" />
-</svg>
-{{- else if (eq $icon_name "osu!") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" fill="currentColor" stroke-width="2">
-    <g>
-        <path
-            d="M 25 3 C 12.85 3 3 12.85 3 25 C 3 37.15 12.85 47 25 47 C 37.15 47 47 37.15 47 25 C 47 12.85 37.15 3 25 3 z M 25 5 C 36.028 5 45 13.972 45 25 C 45 36.028 36.028 45 25 45 C 13.972 45 5 36.028 5 25 C 5 13.972 13.972 5 25 5 z M 38 18 L 38 26 L 40 26 L 40 18 L 38 18 z M 13.798828 21.013672 C 13.611859 21.023047 13.423828 21.042313 13.236328 21.070312 C 12.140328 21.233312 11.272594 21.778766 10.683594 22.759766 C 10.273594 23.440766 10.084437 24.197234 10.023438 24.990234 C 9.9604375 25.800234 10.019438 26.597094 10.273438 27.371094 C 10.664437 28.562094 11.402078 29.409828 12.580078 29.798828 C 13.299078 30.036828 14.041203 30.059359 14.783203 29.943359 C 16.013203 29.750359 16.940859 29.104312 17.505859 27.945312 C 17.875859 27.186312 17.99 26.368266 18 25.572266 C 17.995 24.978266 17.937828 24.434344 17.798828 23.902344 C 17.456828 22.604344 16.703031 21.686234 15.457031 21.240234 C 14.915531 21.046734 14.359734 20.985547 13.798828 21.013672 z M 23.408203 21.017578 C 22.808203 21.006578 22.216391 21.056297 21.650391 21.279297 C 21.003391 21.534297 20.485219 21.944187 20.199219 22.617188 C 19.985219 23.120187 19.957391 23.649547 20.025391 24.185547 C 20.085391 24.659547 20.258047 25.078531 20.623047 25.394531 C 20.884047 25.620531 21.171187 25.804016 21.492188 25.916016 C 21.926188 26.068016 22.370687 26.187891 22.804688 26.337891 C 23.045687 26.420891 23.278813 26.530531 23.507812 26.644531 C 23.647813 26.713531 23.722719 26.849859 23.761719 27.005859 C 23.861719 27.412859 23.717984 27.732219 23.333984 27.949219 C 23.046984 28.111219 22.734063 28.162734 22.414062 28.177734 C 21.718062 28.211734 21.054203 28.053781 20.408203 27.800781 C 20.368203 27.784781 20.327156 27.770859 20.285156 27.755859 C 20.271156 27.784859 20.262859 27.801359 20.255859 27.818359 C 20.030859 28.340359 19.884219 28.883172 19.824219 29.451172 C 19.817219 29.522172 19.839344 29.550219 19.902344 29.574219 C 20.468344 29.787219 21.048391 29.936469 21.650391 29.980469 C 22.347391 30.030469 23.042656 30.025125 23.722656 29.828125 C 24.345656 29.647125 24.908562 29.355563 25.351562 28.851562 C 25.862562 28.268563 26.041234 27.574734 25.990234 26.802734 C 25.930234 25.883734 25.518453 25.210703 24.689453 24.845703 C 24.377453 24.708703 24.049516 24.612047 23.728516 24.498047 C 23.362516 24.367047 22.986859 24.257562 22.630859 24.101562 C 22.304859 23.958563 22.187594 23.610625 22.308594 23.265625 C 22.399594 23.005625 22.612609 22.900844 22.849609 22.839844 C 23.300609 22.723844 23.756125 22.749562 24.203125 22.851562 C 24.559125 22.932563 24.907484 23.053156 25.271484 23.160156 C 25.270484 23.160156 25.27625 23.151578 25.28125 23.142578 C 25.52025 22.638578 25.658656 22.106781 25.722656 21.550781 C 25.731656 21.470781 25.684719 21.462312 25.636719 21.445312 C 24.914719 21.189312 24.174203 21.031578 23.408203 21.017578 z M 29.070312 21.113281 C 28.703937 21.113156 28.339656 21.146391 27.972656 21.212891 C 27.970656 21.252891 27.966797 21.286313 27.966797 21.320312 C 27.966797 22.825312 27.96575 24.332891 27.96875 25.837891 C 27.96975 26.435891 28.004203 27.031328 28.158203 27.611328 C 28.419203 28.596328 28.944094 29.338172 29.871094 29.701172 C 30.361094 29.893172 30.875625 29.943469 31.390625 29.980469 C 32.584625 30.066469 33.749625 29.880813 34.890625 29.507812 C 34.972625 29.480813 34.998047 29.444609 34.998047 29.349609 C 34.995047 26.679609 34.996094 24.009844 34.996094 21.339844 L 34.996094 21.214844 C 34.261094 21.081844 33.540594 21.079844 32.808594 21.214844 C 32.808594 21.268844 32.807641 21.316234 32.806641 21.365234 C 32.806641 23.514234 32.807547 25.6635 32.810547 27.8125 C 32.810547 27.9195 32.780547 27.956563 32.685547 27.976562 C 32.267547 28.063563 31.846828 28.088297 31.423828 28.029297 C 30.835828 27.947297 30.445687 27.602375 30.304688 26.984375 C 30.234688 26.678375 30.186594 26.358922 30.183594 26.044922 C 30.170594 24.485922 30.174828 22.926188 30.173828 21.367188 L 30.173828 21.214844 C 29.804328 21.147844 29.436688 21.113406 29.070312 21.113281 z M 13.798828 22.865234 C 13.993828 22.850234 14.192766 22.859531 14.384766 22.894531 C 14.826766 22.973531 15.144703 23.238344 15.345703 23.652344 C 15.545703 24.063344 15.625109 24.504031 15.662109 24.957031 C 15.678109 25.148031 15.6815 25.339844 15.6875 25.464844 C 15.6795 26.076844 15.643891 26.618719 15.462891 27.136719 C 15.307891 27.583719 15.060516 27.949328 14.603516 28.111328 C 14.208516 28.251328 13.808109 28.254094 13.412109 28.121094 C 13.057109 28.003094 12.814438 27.750156 12.648438 27.410156 C 12.472437 27.049156 12.386609 26.663625 12.349609 26.265625 C 12.287609 25.607625 12.282594 24.947781 12.433594 24.300781 C 12.488594 24.064781 12.571781 23.830281 12.675781 23.613281 C 12.902781 23.140281 13.297828 22.903234 13.798828 22.865234 z M 38 28 L 38 30 L 40 30 L 40 28 L 38 28 z">
-        </path>
-    </g>
-</svg>
-{{- else if (eq $icon_name "overcast") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M12 24C5.389 24.018.017 18.671 0 12.061V12C0 5.35 5.351 0 12 0s12 5.35 12 12c0 6.649-5.351 12-12 12zm0-4.751l.9-.899-.9-3.45-.9 3.45.9.899zm-1.15-.05L10.4 20.9l1.05-1.052-.6-.649zm2.3 0l-.6.601 1.05 1.051-.45-1.652zm.85 3.102L12 20.3l-2 2.001c.65.1 1.3.199 2 .199s1.35-.05 2-.199zM12 1.5C6.201 1.5 1.5 6.201 1.5 12c-.008 4.468 2.825 8.446 7.051 9.899l2.25-8.35c-.511-.372-.809-.968-.801-1.6 0-1.101.9-2.001 2-2.001s2 .9 2 2.001c0 .649-.301 1.2-.801 1.6l2.25 8.35c4.227-1.453 7.06-5.432 7.051-9.899 0-5.799-4.701-10.5-10.5-10.5zm6.85 15.7c-.255.319-.714.385-1.049.15-.313-.207-.4-.628-.194-.941.014-.021.028-.04.044-.06 0 0 1.35-1.799 1.35-4.35s-1.35-4.35-1.35-4.35c-.239-.289-.198-.719.091-.957.02-.016.039-.031.06-.044.335-.235.794-.169 1.049.15.1.101 1.65 2.15 1.65 5.2S18.949 17.1 18.85 17.2zm-3.651-1.95c-.3-.3-.249-.85.051-1.15 0 0 .75-.799.75-2.1s-.75-2.051-.75-2.1c-.3-.301-.3-.801-.051-1.15.232-.303.666-.357.969-.125.029.022.056.047.082.074C16.301 8.75 17.5 10 17.5 12s-1.199 3.25-1.25 3.301c-.301.299-.75.25-1.051-.051zm-6.398 0c-.301.301-.75.35-1.051.051C7.699 15.199 6.5 14 6.5 12s1.199-3.199 1.25-3.301c.301-.299.801-.299 1.051.051.3.3.249.85-.051 1.15 0 .049-.75.799-.75 2.1s.75 2.1.75 2.1c.3.3.351.799.051 1.15zm-2.602 2.101c-.335.234-.794.169-1.05-.15C5.051 17.1 3.5 15.05 3.5 12s1.551-5.1 1.649-5.2c.256-.319.715-.386 1.05-.15.313.206.4.628.194.941-.013.02-.028.04-.043.059C6.35 7.65 5 9.449 5 12s1.35 4.35 1.35 4.35c.25.3.15.75-.151 1.001z" />
-</svg>
-{{- else if (eq $icon_name "patreon") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 569 546" fill="currentColor" stroke="none">
-    <g>
-        <circle cx="362.589996" cy="204.589996" data-fill="1" r="204.589996"></circle>
-        <rect data-fill="1" height="545.799988" width="100" x="0" y="0"></rect>
-    </g>
-</svg>
-{{- else if (eq $icon_name "paypal") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M7.144 19.532l1.049-5.751c.11-.606.691-1.002 1.304-.948 2.155.192 6.877.1 8.818-4.002 2.554-5.397-.59-7.769-6.295-7.769H7.43a1.97 1.97 0 0 0-1.944 1.655L2.77 19.507a.857.857 0 0 0 .846.994h2.368a1.18 1.18 0 0 0 1.161-.969zM7.967 22.522a.74.74 0 0 0 .666.416h2.313c.492 0 .923-.351 1.003-.837l.759-4.601c.095-.523.597-.866 1.127-.819 1.86.166 5.567-.118 6.85-3.821.554-1.6.705-2.954.408-4.018"
-        style="font-variation-settings:normal" stroke="currentColor" stroke-linejoin="miter" />
-</svg>
-{{- else if (eq $icon_name "peertube") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path d="M12 6.545v10.91L20.727 12M3.273 12v12L12 17.455M3.273 0v12L12 6.545" />
-</svg>
-{{- else if or (eq $icon_name "pgpkey") (eq $icon_name "key") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path d="M8 18l2-2h2l1.36-1.36a6.5 6.5 0 1 0-3.997-3.992L2 18v4h4l2-2v-2z" stroke="currentColor" stroke-width="2"
-        stroke-linecap="round" stroke-linejoin="round" />
-    <circle cx="17" cy="7" r="1" stroke="currentColor" stroke-width="2" stroke-linecap="round"
-        stroke-linejoin="round" />
-</svg>
-{{- else if (eq $icon_name "phone") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none">
-    <rect x="9" y="4" width="6" height="1" rx="0.5" fill="currentColor" />
-    <path
-        d="M12 20C12.2652 20 12.5196 19.8946 12.7071 19.7071C12.8946 19.5196 13 19.2652 13 19C13 18.7348 12.8946 18.4804 12.7071 18.2929C12.5196 18.1054 12.2652 18 12 18C11.7348 18 11.4804 18.1054 11.2929 18.2929C11.1054 18.4804 11 18.7348 11 19C11 19.2652 11.1054 19.5196 11.2929 19.7071C11.4804 19.8946 11.7348 20 12 20Z"
-        fill="currentColor" />
-    <rect x="5" y="1" width="14" height="22" rx="2" stroke="currentColor" stroke-width="2" />
-</svg>
-{{- else if (eq $icon_name "pinterest") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.162-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.085.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.401.165-1.495-.69-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.758-1.379l-.749 2.848c-.269 1.045-1.004 2.352-1.498 3.146 1.123.345 2.306.535 3.55.535 6.607 0 11.985-5.365 11.985-11.987C23.97 5.39 18.592.026 11.985.026L12.017 0z" />
-</svg>
-{{- else if (eq $icon_name "pixelfed") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
-    <path id="pixelfed"
-        d="m12 .99649c-6.077 0-11.004 4.9264-11.004 11.004 0 6.077 4.9264 11.004 11.004 11.004 6.077 0 11.004-4.9264 11.004-11.004 0-6.077-4.9264-11.004-11.004-11.004zm-1.7683 6.7017h2.9133c1.9016 1e-6 3.4428 1.5006 3.4428 3.3518 0 1.8512-1.5414 3.3526-3.4428 3.3526h-2.0185l-2.8816 2.756v-7.5262c0-1.068.8896-1.9342 1.9867-1.9342z"
-        fill="none" stroke="currentColor" stroke-width="1.993" />
-</svg>
-{{- else if (eq $icon_name "pleroma") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M6.36 0A1.868 1.868 0 004.49 1.868V24h5.964V0zm7.113 0v12h4.168a1.868 1.868 0 001.868-1.868V0zm0 18.036V24h4.168a1.868 1.868 0 001.868-1.868v-4.096Z" />
-</svg>
-{{- else if (eq $icon_name "pocketcasts") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M12,0C5.372,0,0,5.372,0,12c0,6.628,5.372,12,12,12c6.628,0,12-5.372,12-12 C24,5.372,18.628,0,12,0z M15.564,12c0-1.968-1.596-3.564-3.564-3.564c-1.968,0-3.564,1.595-3.564,3.564 c0,1.968,1.595,3.564,3.564,3.564V17.6c-3.093,0-5.6-2.507-5.6-5.6c0-3.093,2.507-5.6,5.6-5.6c3.093,0,5.6,2.507,5.6,5.6H15.564z M19,12c0-3.866-3.134-7-7-7c-3.866,0-7,3.134-7,7c0,3.866,3.134,7,7,7v2.333c-5.155,0-9.333-4.179-9.333-9.333 c0-5.155,4.179-9.333,9.333-9.333c5.155,0,9.333,4.179,9.333,9.333H19z" />
-</svg>
-{{- else if (eq $icon_name "printables") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path d="M3.678 4.8 12 9.6v9.6l8.322-4.8V4.8L12 0ZM12 19.2l-8.322-4.8V24Z" />
-</svg>
-{{- else if (eq $icon_name "qq") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path transform="scale(0.04) translate(75 40)" stroke-width="50"
-        d="M433.754 420.445c-11.526 1.393-44.86-52.741-44.86-52.741 0 31.345-16.136 72.247-51.051 101.786 16.842 5.192 54.843 19.167 45.803 34.421-7.316 12.343-125.51 7.881-159.632 4.037-34.122 3.844-152.316 8.306-159.632-4.037-9.045-15.25 28.918-29.214 45.783-34.415-34.92-29.539-51.059-70.445-51.059-101.792 0 0-33.334 54.134-44.859 52.741-5.37-.65-12.424-29.644 9.347-99.704 10.261-33.024 21.995-60.478 40.144-105.779C60.683 98.063 108.982.006 224 0c113.737.006 163.156 96.133 160.264 214.963 18.118 45.223 29.912 72.85 40.144 105.778 21.768 70.06 14.716 99.053 9.346 99.704z">
-    </path>
-</svg>
-{{- else if (eq $icon_name "reddit") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="1">
-    <path
-        d="M24 11.779c0-1.459-1.192-2.645-2.657-2.645-.715 0-1.363.286-1.84.746-1.81-1.191-4.259-1.949-6.971-2.046l1.483-4.669 4.016.941-.006.058c0 1.193.975 2.163 2.174 2.163 1.198 0 2.172-.97 2.172-2.163s-.975-2.164-2.172-2.164c-.92 0-1.704.574-2.021 1.379l-4.329-1.015c-.189-.046-.381.063-.44.249l-1.654 5.207c-2.838.034-5.409.798-7.3 2.025-.474-.438-1.103-.712-1.799-.712-1.465 0-2.656 1.187-2.656 2.646 0 .97.533 1.811 1.317 2.271-.052.282-.086.567-.086.857 0 3.911 4.808 7.093 10.719 7.093s10.72-3.182 10.72-7.093c0-.274-.029-.544-.075-.81.832-.447 1.405-1.312 1.405-2.318zm-17.224 1.816c0-.868.71-1.575 1.582-1.575.872 0 1.581.707 1.581 1.575s-.709 1.574-1.581 1.574-1.582-.706-1.582-1.574zm9.061 4.669c-.797.793-2.048 1.179-3.824 1.179l-.013-.003-.013.003c-1.777 0-3.028-.386-3.824-1.179-.145-.144-.145-.379 0-.523.145-.145.381-.145.526 0 .65.647 1.729.961 3.298.961l.013.003.013-.003c1.569 0 2.648-.315 3.298-.962.145-.145.381-.144.526 0 .145.145.145.379 0 .524zm-.189-3.095c-.872 0-1.581-.706-1.581-1.574 0-.868.709-1.575 1.581-1.575s1.581.707 1.581 1.575-.709 1.574-1.581 1.574z" />
-</svg>
-{{- else if (eq $icon_name "raycast") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" fill="currentColor">
-    <path fill-rule="evenodd" clip-rule="evenodd"
-        d="M934.302 511.971L890.259 556.017L723.156 388.902V300.754L934.302 511.971ZM511.897 89.5373L467.854 133.583L634.957 300.698H723.099L511.897 89.5373ZM417.334 184.275L373.235 228.377L445.776 300.923H533.918L417.334 184.275ZM723.099 490.061V578.209L795.641 650.755L839.74 606.652L723.099 490.061ZM697.868 653.965L723.099 628.732H395.313V300.754L370.081 325.987L322.772 278.675L278.56 322.833L325.869 370.146L300.638 395.379V446.071L228.097 373.525L183.997 417.627L300.638 534.275V634.871L133.59 467.925L89.4912 512.027L511.897 934.461L555.996 890.359L388.892 723.244H489.875L606.516 839.892L650.615 795.79L578.074 723.244H628.762L653.994 698.011L701.303 745.323L745.402 701.221L697.868 653.965Z" />
-</svg>
-{{- else if (eq $icon_name "researchgate") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M19.586 0c-.818 0-1.508.19-2.073.565-.563.377-.97.936-1.213 1.68a3.193 3.193 0 0 0-.112.437 8.365 8.365 0 0 0-.078.53 9 9 0 0 0-.05.727c-.01.282-.013.621-.013 1.016a31.121 31.123 0 0 0 .014 1.017 9 9 0 0 0 .05.727 7.946 7.946 0 0 0 .077.53h-.005a3.334 3.334 0 0 0 .113.438c.245.743.65 1.303 1.214 1.68.565.376 1.256.564 2.075.564.8 0 1.536-.213 2.105-.603.57-.39.94-.916 1.175-1.65.076-.235.135-.558.177-.93a10.9 10.9 0 0 0 .043-1.207v-.82c0-.095-.047-.142-.14-.142h-3.064c-.094 0-.14.047-.14.141v.956c0 .094.046.14.14.14h1.666c.056 0 .084.03.084.086 0 .36 0 .62-.036.865-.038.244-.1.447-.147.606-.108.385-.348.664-.638.876-.29.212-.738.35-1.227.35-.545 0-.901-.15-1.21-.353-.306-.203-.517-.454-.67-.915a3.136 3.136 0 0 1-.147-.762 17.366 17.367 0 0 1-.034-.656c-.01-.26-.014-.572-.014-.939a26.401 26.403 0 0 1 .014-.938 15.821 15.822 0 0 1 .035-.656 3.19 3.19 0 0 1 .148-.76 1.89 1.89 0 0 1 .742-1.01c.344-.244.593-.352 1.137-.352.508 0 .815.096 1.144.303.33.207.528.492.764.925.047.094.111.118.198.07l1.044-.43c.075-.048.09-.115.042-.199a3.549 3.549 0 0 0-.466-.742 3 3 0 0 0-.679-.607 3.313 3.313 0 0 0-.903-.41A4.068 4.068 0 0 0 19.586 0zM8.217 5.836c-1.69 0-3.036.086-4.297.086-1.146 0-2.291 0-3.007-.029v.831l1.088.2c.744.144 1.174.488 1.174 2.264v11.288c0 1.777-.43 2.12-1.174 2.263l-1.088.2v.832c.773-.029 2.12-.086 3.465-.086 1.29 0 2.951.057 3.667.086v-.831l-1.49-.2c-.773-.115-1.174-.487-1.174-2.264v-4.784c.688.057 1.29.057 2.206.057 1.748 3.123 3.41 5.472 4.355 6.56.86 1.032 2.177 1.691 3.839 1.691.487 0 1.003-.086 1.318-.23v-.744c-1.031 0-2.063-.716-2.808-1.518-1.26-1.376-2.95-3.582-4.355-6.074 2.32-.545 4.04-2.722 4.04-4.9 0-3.208-2.492-4.698-5.758-4.698zm-.515 1.29c2.406 0 3.839 1.26 3.839 3.552 0 2.263-1.547 3.782-4.097 3.782-.974 0-1.404-.03-2.063-.086v-7.19c.66-.059 1.547-.059 2.32-.059z" />
-</svg>
-{{- else if (eq $icon_name "rootme") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="6.97 3.98 22.02 28.02" fill="currentColor" stroke="currentColor">
-    <path
-        d="m28.9 16.5c0.2-1.9-0.2-3.8-1-5.6-1.4-2.9-4-5.1-7.1-5.9-0.2 0-0.4-0.2-0.5-0.4-0.3-0.4-0.7-0.6-1.2-0.6-0.5 0.1-0.9 0.5-0.9 0.9-0.1 0.5 0.2 1 0.6 1.2 0.2 0.1 0.2 0.3 0.2 0.5v3.6c0 0.4 0.1 0.4 0.4 0.3l1.3-0.5h0.1c0.3-0.1 0.6 0.2 0.7 0.5v1.5c0 0.1-0.1 0.2-0.1 0.3-0.8 0.9-1.7 1.8-2.7 2.5l-0.2 0.2c-0.3-0.9-0.7-1.7-1.1-2.5-0.1-0.2-0.1-0.4 0-0.5 0.2-0.3 0.2-0.7 0-1s-0.6-0.4-1-0.3c-0.3 0.1-0.6 0.4-0.6 0.8s0.2 0.7 0.6 0.8c0.2 0 0.4 0.2 0.4 0.4 0 0.1 0.1 0.2 0.2 0.4l1 2.4-2.2 1.4h-0.3c-0.9-0.3-1.8-0.5-2.7-0.8-0.6-0.3-1.2-0.2-1.8 0.1-0.1 0.1-0.3 0.1-0.5 0-0.3-0.3-0.8-0.3-1.1 0-0.3 0.2-0.4 0.7-0.2 1 0.1 0.4 0.5 0.6 0.9 0.5 0.4 0 0.7-0.4 0.8-0.8v-0.2c0.4-0.1 0.8-0.4 1.1-0.4 1 0.2 2 0.6 3 0.9v0.1c-1.8 1-3.6 1.8-5.5 2.5-0.4 0.1-0.8-0.1-1-0.5-0.6-1.8-0.8-3.6-0.5-5.3 0-0.3 0.1-0.3 0.4-0.3h4.2c0.2 0 0.4 0.1 0.4 0.2 0.2 0.3 0.6 0.5 1 0.4s0.6-0.5 0.6-0.8c0-0.4-0.3-0.7-0.6-0.8-0.4-0.1-0.7 0.1-0.9 0.4-0.1 0.2-0.2 0.2-0.4 0.2h-4.4v-0.1-0.3c1-3.4 3.7-6.1 7.2-7 0.1 0 0.3 0 0.4 0.1 0.3 0.4 0.9 0.5 1.4 0.2 0.4-0.2 0.7-0.7 0.6-1.2-0.1-0.6-0.7-1-1.3-0.9-0.4 0.1-0.7 0.3-0.9 0.7l-0.3 0.3c-4.2 0.9-7.4 4.3-8.2 8.5-0.4 2-0.2 4 0.5 5.9 0.1 0.2 0.1 0.4 0 0.5-0.3 0.5-0.1 1.2 0.4 1.4 0.2 0.1 0.2 0.2 0.2 0.4v3.9c0 0.2 0.1 0.4 0.3 0.6 1 0.7 2.1 1.4 3.1 2.2 0.2 0.1 0.3 0.3 0.3 0.5v2.4c0 0.5 0.1 0.6 0.6 0.6h10.8c0.4 0 0.6-0.2 0.6-0.6v-2.4c0-0.2 0.1-0.4 0.2-0.5 1-0.7 2.1-1.4 3.1-2.2 0.2-0.1 0.3-0.4 0.3-0.6v-3.7c0-0.2 0.1-0.4 0.2-0.5 0.5-0.3 0.6-0.9 0.3-1.4-0.1-0.2-0.1-0.4 0-0.5 0.5-1 0.7-2.1 0.8-3.1zm-12.2-11.9c0.3 0 0.5 0.3 0.5 0.5 0 0.3-0.2 0.5-0.5 0.5s-0.5-0.2-0.5-0.5 0.2-0.5 0.5-0.5zm2.6 1c-0.3 0-0.5-0.2-0.5-0.5s0.2-0.5 0.5-0.5 0.5 0.3 0.4 0.6c0 0.2-0.2 0.4-0.4 0.4zm1.5 3.7c0 0.1-0.1 0.2-0.1 0.2l-1.3 0.5v-3.6c0.3-0.3 0.7-0.5 1.1-0.6 1 0.3 2 0.7 2.9 1.3 0.1 0.1 0.2 0.2 0.2 0.3-0.1 1.5-0.7 3-1.6 4.2v-1.1c0-0.1 0.1-0.2 0.2-0.2 0.4-0.2 0.5-0.6 0.4-1s-0.5-0.6-0.9-0.6c-0.4-0.1-0.8 0.2-0.9 0.6zm-12.1 11.8c-0.3 0-0.5-0.2-0.5-0.5s0.3-0.5 0.5-0.5c0.3 0 0.6 0.2 0.6 0.4 0 0.3-0.2 0.6-0.4 0.6 0 0.1-0.1 0.1-0.2 0zm19-0.5c0 0.3-0.2 0.5-0.5 0.5s-0.5-0.3-0.5-0.5c0-0.3 0.2-0.5 0.5-0.5h0.1c0.2 0 0.4 0.2 0.4 0.5zm-0.3-1.3c0 0.2-0.2 0.3-0.3 0.3-0.4 0-0.8 0.3-0.9 0.8-0.2 0.5 0 1 0.5 1.3 0.2 0.1 0.3 0.3 0.3 0.5v3.4c0 0.2-0.1 0.4-0.3 0.5l-3.1 2.2c-0.2 0.1-0.4 0.4-0.4 0.7v2c0 0.4-0.1 0.4-0.5 0.4h-0.9-0.1c-0.2 0-0.3-0.2-0.3-0.4v-0.7c0-0.2-0.1-0.4-0.4-0.5h-0.1c-0.2 0-0.4 0.2-0.4 0.5v0.7c0 0.2-0.1 0.4-0.4 0.4h-1.4c-0.3 0-0.4-0.1-0.4-0.4v-1.1c0-0.3-0.2-0.5-0.4-0.5-0.3 0-0.4 0.2-0.4 0.5v1.1c0 0.3-0.1 0.4-0.4 0.4h-1.3c-0.3 0-0.4-0.1-0.4-0.4v-1c0-0.2-0.2-0.4-0.4-0.4s-0.4 0.2-0.4 0.5v0.7s-0.1 0.4-0.4 0.4h-1c-0.3 0-0.4-0.1-0.4-0.4v-2c0-0.3-0.1-0.6-0.4-0.8l-3-2.1c-0.2-0.1-0.2-0.3-0.2-0.5v-3.6c0-0.1 0.1-0.3 0.2-0.4 0.3-0.2 0.4-0.5 0.4-0.8 0-0.2 0.1-0.3 0.3-0.4 3-1.1 5.8-2.6 8.4-4.4 1.9-1.3 3.5-2.9 4.7-4.9 0.3-0.5 0.5-1 0.7-1.6 0.2-0.5 0.3-1.1 0.4-1.7 0.1 0.1 0.3 0.2 0.4 0.4 1.7 1.5 2.8 3.6 3.2 5.8 0.1 0.7-0.1 1.5-0.4 2.1-0.7 1.5-1.8 2.7-3.1 3.6-1.9 1.4-4.1 2.6-6.3 3.4-0.2 0.1-0.4 0.1-0.6 0-1.9-0.4-3.8-0.9-5.6-1.6l-0.2-0.1v0.1c0.2 0.2 0.5 0.4 0.7 0.6 0.2 0.1 0.3 0.3 0.2 0.5-0.1 0.4-0.1 0.7 0 1.1 0.3 1.2 1.6 1.9 2.8 1.6 0.6-0.1 1.2-0.6 1.5-1.2 0.1-0.2 0.3-0.3 0.5-0.3 0.4 0 0.8 0.2 1.1 0.5 0.4 0.5 0.9 0.9 1.4 1.4s1.2 0.6 1.8 0.2c0.9-0.5 1.9-1.1 2.8-1.6 0.3-0.2 0.5-0.5 0.5-0.9v-3c0-0.1 0-0.2 0.1-0.3 0.5-0.5 1-0.9 1.4-1.4 0.5-0.5 0.8-1 1.3-1.5 0 0.9-0.2 1.6-0.4 2.3zm-11.2 4.5c-0.3 0.6-0.9 0.8-1.5 0.6-0.7-0.2-1.1-0.8-1.1-1.6l2.6 1z">
-    </path>
-    <path
-        d="m16.8 7.4c-0.4 0-0.7 0.2-0.9 0.6l-0.3 0.3c-0.4 0.2-0.9 0.3-1.3 0.5-0.2 0-0.3 0.2-0.3 0.4v0.9h-1c-0.2 0-0.3-0.1-0.4-0.2-0.2-0.3-0.6-0.5-1-0.4-0.3 0.1-0.6 0.4-0.6 0.8s0.3 0.7 0.6 0.8c0.4 0.1 0.8-0.1 1-0.4 0.1-0.1 0.2-0.2 0.4-0.2h1.2c0.2 0 0.3-0.1 0.3-0.3v-0.8c0-0.2 0.1-0.3 0.2-0.3l1-0.4c0.2-0.1 0.3-0.1 0.4 0.1 0.3 0.3 0.7 0.4 1 0.2s0.5-0.6 0.4-1c0-0.4-0.3-0.6-0.7-0.6z">
-    </path>
-    <path
-        d="m18.3 26.4c-0.2-0.3-0.4-0.3-0.6 0s-0.5 0.7-0.8 1-0.2 0.4 0 0.5 0.4 0.1 0.5-0.1c0.2-0.2 0.5-0.3 0.8-0.2 0.2 0.1 0.3 0.2 0.4 0.3h0.4c0.1 0 0.1-0.2 0.2-0.3-0.1-0.1-0.1-0.2-0.2-0.3l-0.7-0.9z">
-    </path>
-</svg>
-{{- else if (eq $icon_name "rss") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path d="M4 11a9 9 0 0 1 9 9" />
-    <path d="M4 4a16 16 0 0 1 16 16" />
-    <circle cx="5" cy="19" r="1" />
-</svg>
-{{- else if (eq $icon_name "serverfault") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M24 18.185v2.274h-4.89v-2.274H24zm-24-.106h11.505v2.274H0v-2.279.005zm12.89 0h4.89v2.274h-4.89v-2.279.005zm6.221-3.607H24v2.274h-4.89l.001-2.274zM0 14.367h11.505v2.274H0v-2.274zm12.89 0h4.89v2.274h-4.89v-2.274zm6.221-3.346H24v2.273h-4.89l.001-2.273zM0 10.916h11.505v2.271H0v-2.271zm12.89 0h4.89v2.271h-4.89v-2.271zm6.22-3.609H24v2.279h-4.89V7.307zM0 7.206h11.505V9.48H0V7.201v.005zm12.89 0h4.89V9.48h-4.89V7.201v.005zm6.221-3.556H24v2.276h-4.89v-2.28l.001.004zM0 3.541h11.505v2.274H0V3.541zm12.89 0h4.89v2.274h-4.89V3.541z" />
-</svg>
-{{- else if (eq $icon_name "sessionmessenger") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="M8.7 14.1c-1.4-.8-2.7-1.5-4.1-2.3C2.2 10.3 1 8.2 1.3 5.3 1.6 2.3 4.1.1 7.1 0h11c2.6 0 4.6 2.2 4.7 4.7 0 2.6-2 4.8-4.6 4.9h-2.8v.2c.2.2.5.3.7.5 1.2.7 2.4 1.3 3.6 2 2.5 1.5 3.7 4.5 2.9 7.2-.8 2.7-3.1 4.3-6.1 4.4H5.9c-2.4 0-4.3-1.9-4.6-4.3-.3-2.3 1.2-4.5 3.5-5.1.6-.1 1.2-.1 1.7-.2h2.1s.1-.1.1-.2zm4.2-3.8c-.1.3-.2.3-.2.4v3.9c0 1.1-.1 1.2-1.2 1.2H6.4c-.4 0-.9 0-1.3.1-1.6.4-2.5 1.9-2.4 3.6.2 1.6 1.6 2.9 3.3 2.9h10.5c2.1 0 3.8-1.2 4.5-3.1.7-1.8.2-4.1-1.5-5.3-2-1.3-4.3-2.4-6.6-3.7zm-1.6 3.4v-4c0-1.4.1-1.5 1.4-1.5H18c1.5 0 2.7-1 3.1-2.4.6-2.2-1-4.2-3.4-4.3H7.6c-2.4 0-4.3 1.3-4.9 3.4-.6 2.1.4 4.4 2.5 5.5 1.7 1 3.5 1.9 5.2 2.9.3.2.5.2.9.4z">
-    </path>
-</svg>
-{{- else if (eq $icon_name "shutterstock") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <rect ry="5" rx="5" height="20" width="20" y="2" x="2" />
-    <path d="M7.728 11.725V9.032c0-1.025.824-1.85 1.849-1.85h2.815m3.88 5.093v2.693a1.845 1.845 0 0 1-1.849 1.85h-2.815"
-        stroke-linecap="square" stroke-linejoin="miter" />
-</svg>
-{{- else if (eq $icon_name "signal") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M 9.205253,0.64464814 9.4662637,1.7114982 A 10.69287,10.709597 0 0 0 6.5207075,2.9288165 L 5.9607465,1.9848669 A 11.571737,11.589837 0 0 1 9.2037889,0.64464631 Z m 5.624738,0.006259 -0.261912,1.06479996 a 10.69287,10.709597 0 0 1 2.942841,1.2238818 l 0.569383,-0.942681 A 11.718214,11.736545 0 0 0 14.829991,0.65091737 M 1.9779914,5.962053 A 11.718214,11.736545 0 0 0 0.63264603,9.2101106 l 1.06459877,0.26526 A 10.69287,10.709597 0 0 1 2.9192147,6.5279236 L 1.977993,5.9605859 Z M 1.3853391,12.02919 A 10.253437,10.269476 0 0 1 1.5057569,10.436088 L 0.42200799,10.267633 a 11.718214,11.736545 0 0 0 -0.003916,3.518027 L 1.5022097,13.622556 A 10.253437,10.269476 0 0 1 1.3853328,12.02919 m 16.6638462,10.065061 -0.561432,-0.93955 a 10.546392,10.56289 0 0 1 -2.941159,1.215857 l 0.262471,1.068318 a 11.718214,11.736545 0 0 0 3.24012,-1.344625 m 4.576868,-10.041387 q -8.91e-4,0.802487 -0.121883,1.593101 l 1.08375,0.165521 a 11.718214,11.736545 0 0 0 0.004,-3.518028 l -1.084119,0.166038 q 0.119225,0.79235 0.118342,1.593368 m 0.752698,2.814677 -1.066064,-0.26526 a 10.69287,10.709597 0 0 1 -1.221974,2.950381 l 0.94122,0.568806 a 11.718214,11.736545 0 0 0 1.346818,-3.253927 m -9.79326,7.691197 c -1.054817,0.160202 -2.128499,0.159006 -3.182958,-0.0036 l -0.165266,1.088381 a 11.718214,11.736545 0 0 0 3.509604,0.0041 L 13.584073,22.5603 Z m 6.962359,-4.199793 a 10.546392,10.56289 0 0 1 -2.25386,2.247973 l 0.652304,0.888303 A 11.718214,11.736545 0 0 0 21.4319,19.02011 Z M 18.313014,3.4847756 c 0.85912,0.6347312 1.617028,1.3955177 2.248854,2.2573915 L 21.447327,5.0829729 A 11.718214,11.736545 0 0 0 18.974613,2.5994032 Z M 3.4620766,5.7231078 A 10.546392,10.56289 0 0 1 5.7159424,3.470735 L 5.0577779,2.5838917 A 11.718214,11.736545 0 0 0 2.5780872,5.0604744 l 0.883991,0.6611664 z M 22.046886,5.9829545 21.102939,6.5496581 c 0.551205,0.9145983 0.961703,1.9082613 1.215422,2.9457616 L 23.385012,9.232537 A 11.718214,11.736545 0 0 0 22.046886,5.9829545 M 10.424439,1.5218471 a 10.69287,10.709597 0 0 1 3.181491,0.00355 l 0.165262,-1.08545108 a 11.718214,11.736545 0 0 0 -3.509603,-0.003905 z M 4.0067175,21.77345 1.7401226,22.299069 2.2699667,20.027168 1.2024224,19.776577 0.67111487,22.047008 A 1.0985825,1.1003011 0 0 0 1.987943,23.371772 L 4.2559977,22.850556 Z M 1.4305532,18.795363 2.5024951,19.043026 2.8704383,17.469271 A 10.546392,10.56289 0 0 1 1.6901058,14.58223 l -1.06518556,0.262884 a 11.718214,11.736545 0 0 0 1.07497456,2.791564 l -0.2708065,1.158683 z m 5.1240697,2.386763 -1.572112,0.365015 0.2478202,1.072705 1.157473,-0.268651 c 0.8783321,0.480709 1.8139217,0.844118 2.7848026,1.084332 L 9.4374532,22.367798 A 10.546392,10.56289 0 0 1 6.5648844,21.174803 Z M 12.01556,2.5050896 A 9.5210486,9.5359425 0 0 0 2.4868473,12.033352 9.5210486,9.5359425 0 0 0 3.9430616,17.103698 L 3.0232278,21.016812 6.9278739,20.104246 A 9.5239783,9.5388766 0 0 0 17.096701,3.9778221 9.5210486,9.5359425 0 0 0 12.01556,2.5050896" />
-</svg>
-{{- else if (eq $icon_name "sketchfab") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2000 2000" fill="currentColor">
-    <path
-        d="m1000 0c-552.32 0-1000 447.72-1000 1000s447.68 1000 1000 1000 1000-447.72 1000-1000-447.6-1000-1000-1000zm-86.88 1595.07-431.12-248.86v-502l431.12 232.79zm76.8-636.19-510.08-270.38 510.08-294.5 510.16 294.5zm510.48 388.29-429.52 248v-516.17l429.52-232z" />
-</svg>
-{{- else if (eq $icon_name "slack") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path d="M22.08 9C19.81 1.41 16.54-.35 9 1.92S-.35 7.46 1.92 15 7.46 24.35 15 22.08 24.35 16.54 22.08 9z"></path>
-    <line x1="12.57" y1="5.99" x2="16.15" y2="16.39"></line>
-    <line x1="7.85" y1="7.61" x2="11.43" y2="18.01"></line>
-    <line x1="16.39" y1="7.85" x2="5.99" y2="11.43"></line>
-    <line x1="18.01" y1="12.57" x2="7.61" y2="16.15"></line>
-</svg>
-{{- else if (eq $icon_name "snapchat") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M12.206.793c.99 0 4.347.276 5.93 3.821.529 1.193.403 3.219.299 4.847l-.003.06c-.012.18-.022.345-.03.51.075.045.203.09.401.09.3-.016.659-.12 1.033-.301.165-.088.344-.104.464-.104.182 0 .359.029.509.09.45.149.734.479.734.838.015.449-.39.839-1.213 1.168-.089.029-.209.075-.344.119-.45.135-1.139.36-1.333.81-.09.224-.061.524.12.868l.015.015c.06.136 1.526 3.475 4.791 4.014.255.044.435.27.42.509 0 .075-.015.149-.045.225-.24.569-1.273.988-3.146 1.271-.059.091-.12.375-.164.57-.029.179-.074.36-.134.553-.076.271-.27.405-.555.405h-.03c-.135 0-.313-.031-.538-.074-.36-.075-.765-.135-1.273-.135-.3 0-.599.015-.913.074-.6.104-1.123.464-1.723.884-.853.599-1.826 1.288-3.294 1.288-.06 0-.119-.015-.18-.015h-.149c-1.468 0-2.427-.675-3.279-1.288-.599-.42-1.107-.779-1.707-.884-.314-.045-.629-.074-.928-.074-.54 0-.958.089-1.272.149-.211.043-.391.074-.54.074-.374 0-.523-.224-.583-.42-.061-.192-.09-.389-.135-.567-.046-.181-.105-.494-.166-.57-1.918-.222-2.95-.642-3.189-1.226-.031-.063-.052-.15-.055-.225-.015-.243.165-.465.42-.509 3.264-.54 4.73-3.879 4.791-4.02l.016-.029c.18-.345.224-.645.119-.869-.195-.434-.884-.658-1.332-.809-.121-.029-.24-.074-.346-.119-1.107-.435-1.257-.93-1.197-1.273.09-.479.674-.793 1.168-.793.146 0 .27.029.383.074.42.194.789.3 1.104.3.234 0 .384-.06.465-.105l-.046-.569c-.098-1.626-.225-3.651.307-4.837C7.392 1.077 10.739.807 11.727.807l.419-.015h.06z" />
-</svg>
-{{- else if (eq $icon_name "soundcloud") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="M1.175 12.225c-.051 0-.094.046-.101.1l-.233 2.154.233 2.105c.007.058.05.098.101.098.05 0 .09-.04.099-.098l.255-2.105-.27-2.154c0-.057-.045-.1-.09-.1m-.899.828c-.06 0-.091.037-.104.094L0 14.479l.165 1.308c0 .055.045.094.09.094s.089-.045.104-.104l.21-1.319-.21-1.334c0-.061-.044-.09-.09-.09m1.83-1.229c-.061 0-.12.045-.12.104l-.21 2.563.225 2.458c0 .06.045.12.119.12.061 0 .105-.061.121-.12l.254-2.474-.254-2.548c-.016-.06-.061-.12-.121-.12m.945-.089c-.075 0-.135.06-.15.135l-.193 2.64.21 2.544c.016.077.075.138.149.138.075 0 .135-.061.15-.15l.24-2.532-.24-2.623c0-.075-.06-.135-.135-.135l-.031-.017zm1.155.36c-.005-.09-.075-.149-.159-.149-.09 0-.158.06-.164.149l-.217 2.43.2 2.563c0 .09.075.157.159.157.074 0 .148-.068.148-.158l.227-2.563-.227-2.444.033.015zm.809-1.709c-.101 0-.18.09-.18.181l-.21 3.957.187 2.563c0 .09.08.164.18.164.094 0 .174-.09.18-.18l.209-2.563-.209-3.972c-.008-.104-.088-.18-.18-.18m.959-.914c-.105 0-.195.09-.203.194l-.18 4.872.165 2.548c0 .12.09.209.195.209.104 0 .194-.089.21-.209l.193-2.548-.192-4.856c-.016-.12-.105-.21-.21-.21m.989-.449c-.121 0-.211.089-.225.209l-.165 5.275.165 2.52c.014.119.104.225.225.225.119 0 .225-.105.225-.225l.195-2.52-.196-5.275c0-.12-.105-.225-.225-.225m1.245.045c0-.135-.105-.24-.24-.24-.119 0-.24.105-.24.24l-.149 5.441.149 2.503c.016.135.121.24.256.24s.24-.105.24-.24l.164-2.503-.164-5.456-.016.015zm.749-.134c-.135 0-.255.119-.255.254l-.15 5.322.15 2.473c0 .15.12.255.255.255s.255-.12.255-.27l.15-2.474-.165-5.307c0-.148-.12-.27-.271-.27m1.005.166c-.164 0-.284.135-.284.285l-.103 5.143.135 2.474c0 .149.119.277.284.277.149 0 .271-.12.284-.285l.121-2.443-.135-5.112c-.012-.164-.135-.285-.285-.285m1.184-.945c-.045-.029-.105-.044-.165-.044s-.119.015-.165.044c-.09.054-.149.15-.149.255v.061l-.104 6.048.115 2.449v.008c.008.06.03.135.074.18.058.061.142.104.234.104.08 0 .158-.044.209-.09.058-.06.091-.135.091-.225l.015-.24.117-2.203-.135-6.086c0-.104-.061-.193-.135-.239l-.002-.022zm1.006-.547c-.045-.045-.09-.061-.15-.061-.074 0-.149.016-.209.061-.075.061-.119.15-.119.24v.029l-.137 6.609.076 1.215.061 1.185c0 .164.148.314.328.314.181 0 .33-.15.33-.329l.15-2.414-.15-6.637c0-.12-.074-.221-.165-.277m8.934 3.777c-.405 0-.795.086-1.139.232-.24-2.654-2.46-4.736-5.188-4.736-.659 0-1.305.135-1.889.359-.225.09-.27.18-.285.359v9.368c.016.18.15.33.33.345h8.185C22.681 17.218 24 15.914 24 14.28s-1.319-2.952-2.938-2.952" />
-</svg>
-{{- else if (eq $icon_name "sourcehut") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor">
-    <path
-        d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200z">
-    </path>
-</svg>
-{{- else if (eq $icon_name "spacehey") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentcolor" stroke="none" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path d="M17 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
-    <path d="M14 20h6v-6a3 3 0 0 0 -6 0v6z" />
-    <path d="M11 8v2.5a3.5 3.5 0 0 1 -3.5 3.5h-.5a3 3 0 0 1 0 -6h4z" />
-</svg>
-{{- else if (eq $icon_name "spotify") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z" />
-</svg>
-{{- else if (eq $icon_name "stackoverflow") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M2.913 16.041v6.848h17.599v-6.848M7.16 18.696h8.925M7.65 13.937l8.675 1.8M9.214 9.124l8.058 3.758M12.086 4.65l6.849 5.66M15.774 1.111l5.313 7.162" />
-</svg>
-{{- else if (eq $icon_name "steam") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="M-24.6 20.8c-1.4-.8-2.7-1.5-4.1-2.3-2.4-1.5-3.6-3.6-3.3-6.5.3-3 2.8-5.2 5.8-5.3h11c2.6 0 4.6 2.2 4.7 4.7 0 2.6-2 4.8-4.6 4.9h-2.8v.2c.2.2.5.3.7.5 1.2.7 2.4 1.3 3.6 2 2.5 1.5 3.7 4.5 2.9 7.2-.8 2.7-3.1 4.3-6.1 4.4h-10.6c-2.4 0-4.3-1.9-4.6-4.3-.3-2.3 1.2-4.5 3.5-5.1.6-.1 1.2-.1 1.7-.2h2.1c.1 0 .1-.1.1-.2zm4.3-3.8c-.1.3-.2.3-.2.4v3.9c0 1.1-.1 1.2-1.2 1.2h-5.1c-.4 0-.9 0-1.3.1-1.6.4-2.5 1.9-2.4 3.6.2 1.6 1.6 2.9 3.3 2.9h10.5c2.1 0 3.8-1.2 4.5-3.1.7-1.8.2-4.1-1.5-5.3-2.1-1.3-4.3-2.4-6.6-3.7zm-1.7 3.4v-4c0-1.4.1-1.5 1.4-1.5h5.3c1.5 0 2.7-1 3.1-2.4.6-2.2-1-4.2-3.4-4.3h-10.1c-2.4 0-4.3 1.3-4.9 3.4-.6 2.1.4 4.4 2.5 5.5 1.7 1 3.5 1.9 5.2 2.9.4.2.6.3.9.4z" />
-    <path
-        d="M53.3 6.9c-.2-1-1-1.7-1.9-2-1.7-.4-8.6-.4-8.6-.4s-6.9 0-8.6.5c-1 .3-1.7 1-1.9 2-.3 1.7-.5 3.5-.5 5.3 0 1.8.1 3.6.5 5.3.3.9 1 1.7 1.9 1.9 1.7.5 8.6.5 8.6.5s6.9 0 8.6-.5c1-.3 1.7-1 1.9-2 .3-1.7.5-3.5.5-5.3 0-1.8-.1-3.6-.5-5.3z" />
-    <path d="m40.6 15.5 5.7-3.3-5.7-3.3z" />
-    <path
-        d="M72.4-9.9c5.5 0 10 4 10 8.9 0 1.8-.8 3.8-2.1 5.4-.9 1-1.5 2.3-1.6 3.7 0-.1-.1-.1-.2-.2-.4-.4-1.1-.7-1.7-.7-.3 0-.5 0-.8.1-1.2.5-2.5.7-3.6.7-5.5 0-10-4-10-8.9s4.5-9 10-9m0-2c-6.6 0-12 4.9-12 10.9s5.4 11 12 11c1.4 0 2.8-.2 4.2-.7h.1c.1 0 .2 0 .3.1 1 1.3 2.5 2.3 4.2 2.7l.2-.1v-.3c-.7-.9-1-1.9-1-3s.4-2.1 1.2-2.9c1.5-1.8 2.6-4.2 2.6-6.7.1-6.1-5.3-11-11.8-11z" />
-    <path
-        d="M72.3-6.5c.1 0 .3.1.3.2l1.2 3.4 3.7.1c.1 0 .3.1.3.2s0 .3-.1.4l-3 2.2 1.1 3.5c0 .1 0 .3-.1.4h-.4l-3-2.1-3 2.1h-.4c-.1-.1-.2-.2-.1-.4L69.9 0l-3-2.2c-.1-.1-.2-.2-.1-.4 0-.1.2-.2.3-.2l3.7-.1L72-6.3c0-.1.2-.2.3-.2zM46.8-20.8c2 0 4 .6 5.6 1.6-.5-.1-1.1-.2-1.6-.2-3.2 0-5.8 2.5-6 5.6l-2.2 3.2c-.5.1-.9.2-1.4.4l-4.7-1.9c.8-5 5.2-8.7 10.3-8.7m9.9 7.2c.3 1 .5 2.1.5 3.3C57.2-4.5 52.5.2 46.7.2c-1.8 0-3.6-.5-5.1-1.3.5.2 1 .2 1.5.2 2.5 0 4.5-1.9 4.8-4.3L51-7.4c3.1-.2 5.6-2.8 5.6-6 .1-.1.1-.1.1-.2M38.3-4.2l.3.2c.1.2.2.5.3.7l-.6-.9m8.5-18.1c-6.3 0-11.5 4.9-12 11l6.4 2.7c.5-.4 1.2-.6 1.9-.6h.2l2.9-4.1v-.1c0-2.5 2-4.5 4.5-4.5s4.5 2 4.5 4.5-2 4.5-4.5 4.5h-.1L46.5-6v.2c0 1.9-1.5 3.4-3.4 3.4-1.6 0-3-1.2-3.3-2.7L35.2-7c1.4 5 6 8.7 11.5 8.7 6.6 0 12-5.4 12-12s-5.3-12-11.9-12z" />
-    <path
-        d="M42.6-4.6 41.5-5c.2.4.5.7 1 .9 1 .4 2.1-.1 2.5-1 .2-.5.2-1 0-1.4-.2-.5-.6-.8-1-1-.5-.2-1-.2-1.4 0l1.1.5c.7.3 1 1.1.7 1.8-.3.6-1.1.9-1.8.6zm8.1-11.5c-1.5 0-2.7 1.2-2.7 2.7 0 1.5 1.2 2.7 2.7 2.7 1.5 0 2.7-1.2 2.7-2.7 0-1.5-1.2-2.7-2.7-2.7zm0 4.7c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2c.1 1.1-.9 2-2 2zM12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.6 0 12 0zm0 22c-4.3 0-8-2.7-9.4-6.5L6.2 17c.3 1.3 1.5 2.4 2.9 2.4 1.6 0 2.9-1.3 2.9-2.9v-.1l3.5-2.5h.1c2.1 0 3.9-1.8 3.9-3.9 0-2.1-1.8-3.9-3.9-3.9-2.2 0-3.9 1.8-3.9 3.9v.1l-2.5 3.6H9c-.6 0-1.2.2-1.7.5L2 11.7C2.2 6.3 6.6 2 12 2c5.5 0 10 4.5 10 10s-4.5 10-10 10zm-2.4-7.1-1.3-.5c.5-.2 1.1-.2 1.6 0s1 .7 1.2 1.2c.2.5.2 1.1 0 1.7-.5 1.1-1.8 1.7-2.9 1.2-.5-.2-.9-.6-1.1-1.1l1.3.5c.2 0 .4.1.6.1.6 0 1.2-.4 1.5-1 .4-.9 0-1.8-.9-2.1zM13 9.8c0-1.5 1.2-2.6 2.6-2.6 1.5 0 2.6 1.2 2.6 2.6 0 1.5-1.2 2.6-2.6 2.6-1.4 0-2.6-1.2-2.6-2.6z" />
-    <path d="M13.7 9.8c0-1.1.9-2 2-2s2 .9 2 2-.9 2-2 2c-1.1-.1-2-.9-2-2z" />
-</svg>
-{{- else if (eq $icon_name "strava") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke-width="2">
-    <path
-        d="M15.387 17.944l-2.089-4.116h-3.065L15.387 24l5.15-10.172h-3.066m-7.008-5.599l2.836 5.598h4.172L10.463 0l-7 13.828h4.169" />
-</svg>
-{{- else if (eq $icon_name "substack") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke-width="2">
-    <path
-        d="M22.539 8.242H1.46V5.406h21.08v2.836zM1.46 10.812V24L12 18.11 22.54 24V10.812H1.46zM22.54 0H1.46v2.836h21.08V0z" />
-</svg>
-{{- else if (eq $icon_name "tableau") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60.3 59.5" fill="currentcolor">
-    <path d="M28.5 40.2h3.3v-9h8.3V28h-8.3v-9h-3.3v9h-8.2v3.2h8.2z" />
-    <path d="M13.2 53.2H16v-8h7.4v-2.5H16v-8.1h-2.8v8.1H5.8v2.5h7.4z" />
-    <path d="M44.3 24.3h2.8v-8h7.5v-2.4h-7.5V5.8h-2.8v8.1h-7.4v2.4h7.4z" />
-    <path d="M29 59.5h2.4v-5.7h5.1v-2.1h-5.1V46H29v5.7h-5v2.1h5z" />
-    <path d="M13.3 24.3h2.6v-8.1h7.5v-2.3h-7.5V5.8h-2.6v8.1H5.8v2.3h7.5z" />
-    <path d="M52.8 36.3h2.4v-5.6h5.1v-2.2h-5.1v-5.6h-2.4v5.6h-5v2.2h5z" />
-    <path clip-rule="evenodd" d="M44.3 53.2h2.8v-8h7.5v-2.5h-7.5v-8.1h-2.8v8.1h-7.4v2.5h7.4z" fill-rule="evenodd" />
-    <path d="M36.1 7.2V5.5h-5V0h-1.8v5.5h-5v1.7h5v5.5h1.8V7.2zM5 35.9h1.8v-5.5h5v-1.7h-5v-5.4H5v5.4H0v1.8l5-.1z" />
-</svg>
-{{- else if (eq $icon_name "telegram") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M21.198 2.433a2.242 2.242 0 0 0-1.022.215l-8.609 3.33c-2.068.8-4.133 1.598-5.724 2.21a405.15 405.15 0 0 1-2.849 1.09c-.42.147-.99.332-1.473.901-.728.968.193 1.798.919 2.286 1.61.516 3.275 1.009 4.654 1.472.509 1.793.997 3.592 1.48 5.388.16.36.506.494.864.498l-.002.018s.281.028.555-.038a2.1 2.1 0 0 0 .933-.517c.345-.324 1.28-1.244 1.811-1.764l3.999 2.952.032.018s.442.311 1.09.355c.324.022.75-.04 1.116-.308.37-.27.613-.702.728-1.196.342-1.492 2.61-12.285 2.997-14.072l-.01.042c.27-1.006.17-1.928-.455-2.474a1.654 1.654 0 0 0-1.034-.407z" />
-</svg>
-{{- else if (eq $icon_name "thingiverse") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M11.955.005C5.425-.152-.091 5.485.007 11.805c-.235 6.756 5.537 12.25 12.052 12.196C18.621 23.9 23.912 18.595 24 12.03 24.031 5.483 18.505-.18 11.955.005zm-.047 1.701a10.276 10.276 0 0 1 7.36 17.529 10.275 10.275 0 0 1-17.556-7.287C1.71 6.308 6.268 1.728 11.907 1.706zm-5.55 4.781c-.322 0-.358.033-.358.361v2.248c0 .351.04.391.398.391h3.823c.274 0 .274.004.274.265v9.736a.176.176 0 0 0 .051.146c.04.038.093.059.148.053h2.555c.247-.003.283-.035.283-.28v-9.32c0-.124.004-.239 0-.39s.055-.21.218-.21h3.9c.319.004.35-.032.35-.344V6.855c0-.34-.024-.363-.37-.363h-5.626z" />
-</svg>
-{{- else if (eq $icon_name "threads") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192" fill="currentColor" stroke="none">
-    <path
-        d="M141.537 88.9883C140.71 88.5919 139.87 88.2104 139.019 87.8451C137.537 60.5382 122.616 44.905 97.5619 44.745C97.4484 44.7443 97.3355 44.7443 97.222 44.7443C82.2364 44.7443 69.7731 51.1409 62.102 62.7807L75.881 72.2328C81.6116 63.5383 90.6052 61.6848 97.2286 61.6848C97.3051 61.6848 97.3819 61.6848 97.4576 61.6855C105.707 61.7381 111.932 64.1366 115.961 68.814C118.893 72.2193 120.854 76.925 121.825 82.8638C114.511 81.6207 106.601 81.2385 98.145 81.7233C74.3247 83.0954 59.0111 96.9879 60.0396 116.292C60.5615 126.084 65.4397 134.508 73.775 140.011C80.8224 144.663 89.899 146.938 99.3323 146.423C111.79 145.74 121.563 140.987 128.381 132.296C133.559 125.696 136.834 117.143 138.28 106.366C144.217 109.949 148.617 114.664 151.047 120.332C155.179 129.967 155.42 145.8 142.501 158.708C131.182 170.016 117.576 174.908 97.0135 175.059C74.2042 174.89 56.9538 167.575 45.7381 153.317C35.2355 139.966 29.8077 120.682 29.6052 96C29.8077 71.3178 35.2355 52.0336 45.7381 38.6827C56.9538 24.4249 74.2039 17.11 97.0132 16.9405C119.988 17.1113 137.539 24.4614 149.184 38.788C154.894 45.8136 159.199 54.6488 162.037 64.9503L178.184 60.6422C174.744 47.9622 169.331 37.0357 161.965 27.974C147.036 9.60668 125.202 0.195148 97.0695 0H96.9569C68.8816 0.19447 47.2921 9.6418 32.7883 28.0793C19.8819 44.4864 13.2244 67.3157 13.0007 95.9325L13 96L13.0007 96.0675C13.2244 124.684 19.8819 147.514 32.7883 163.921C47.2921 182.358 68.8816 191.806 96.9569 192H97.0695C122.03 191.827 139.624 185.292 154.118 170.811C173.081 151.866 172.51 128.119 166.26 113.541C161.776 103.087 153.227 94.5962 141.537 88.9883ZM98.4405 129.507C88.0005 130.095 77.1544 125.409 76.6196 115.372C76.2232 107.93 81.9158 99.626 99.0812 98.6368C101.047 98.5234 102.976 98.468 104.871 98.468C111.106 98.468 116.939 99.0737 122.242 100.233C120.264 124.935 108.662 128.946 98.4405 129.507Z">
-    </path>
-</svg>
-{{- else if (eq $icon_name "threema") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentcolor">
-    <path
-        d="M11.998 20.486a1.757 1.757 0 1 1 0 3.514 1.757 1.757 0 0 1 0-3.514zm-6.335 0a1.757 1.757 0 1 1 0 3.514 1.757 1.757 0 0 1 0-3.514zm12.671 0a1.757 1.757 0 1 1 0 3.514 1.757 1.757 0 0 1 0-3.514zM12 0c5.7 0 10.322 4.066 10.322 9.082 0 5.016-4.622 9.083-10.322 9.083a11.45 11.45 0 0 1-4.523-.917l-5.171 1.293 1.105-4.42c-1.094-1.442-1.733-3.175-1.733-5.039C1.678 4.066 6.3 0 12 0zm-.001 4.235A2.926 2.926 0 0 0 9.072 7.16v1.17h-.115a.47.47 0 0 0-.47.47v4.126c0 .26.21.471.47.471h6.086c.26 0 .47-.21.47-.47V8.798a.47.47 0 0 0-.47-.47h-.115v-1.17a2.927 2.927 0 0 0-2.93-2.924zm0 1.17c.972 0 1.758.786 1.758 1.754v1.17h-3.514v-1.17c0-.968.786-1.754 1.756-1.754z">
-    </path>
-</svg>
-{{- else if (eq $icon_name "tidal") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentcolor">
-    <path
-        d="M12.012 3.992L8.008 7.996 4.004 3.992 0 7.996 4.004 12l4.004-4.004L12.012 12l-4.004 4.004 4.004 4.004 4.004-4.004L12.012 12l4.004-4.004-4.004-4.004zM16.042 7.996l3.979-3.979L24 7.996l-3.979 3.979z" />
-</svg>
-{{- else if (eq $icon_name "tiktok") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 76.000000 76.000000" fill="currentColor" stroke-width="2"
-    preserveAspectRatio="xMidYMid meet">
-    <path d="M65.9,19.4c1.4,0.2,2.8,0.1,2.8,0.1s0,6.2,0,12.2c-6.3,0-12.1-2-16.8-5.4V51c0.1,20-24.6,29.8-38.3,15.6
-    c-14.7-15.1-2.1-40.5,19-37.7v12.3c-9.5-3-17.2,8-11.2,15.9c5.8,7.7,18.3,3.6,18.3-6.1c0,0,0-48.2,0-48.2c2.4,0,9.9,0,12.2,0v1.6
-    c0.7,7.4,6.1,13.4,13.3,15v0C65.4,19.3,65.6,19.4,65.9,19.4z" />
-</svg>
-{{- else if (eq $icon_name "tryhackme") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke-width="2"
-    xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M10.7048 0c-3.164 0-5.8024 2.2853-6.3563 5.2914C2.0493 5.5007.242 7.4381.242 9.7912c0 2.4918 2.0276 4.5191 4.5195 4.5191h6.7616a.625.625 0 000-1.2497H4.7615c-1.8031 0-3.2698-1.467-3.2698-3.2694 0-1.803 1.4667-3.2696 3.2698-3.2696.6552 0 1.287.1925 1.8274.5576a.6252.6252 0 00.8677-.1676.6251.6251 0 00-.168-.8678c-.5105-.345-1.0806-.5756-1.679-.6895.5105-2.3438 2.6006-4.1046 5.0952-4.1046 2.6578 0 4.8555 1.9984 5.1739 4.571a4.489 4.489 0 00-.488.3043.625.625 0 00-.1412.8724.6256.6256 0 00.8729.1408c.5587-.4036 1.2197-.6166 1.9114-.6166 1.547 0 2.894 1.0973 3.203 2.6102a.6254.6254 0 00.7378.4865c.3378-.0689.556-.3992.4871-.7377-.428-2.091-2.2903-3.6087-4.428-3.6087-.3254 0-.6455.037-.9574.1042C16.5567 2.3282 13.8986 0 10.7048 0zm5.1918 10.6402c-.1805 0-.3345.0358-.462.1078a.913.913 0 00-.3124.2909c-.0803.1215-.139.2635-.1753.4261a2.3894 2.3894 0 00-.0535.5145c0 .1805.0178.3525.0535.5162.0363.1639.095.3075.1753.4312a.909.909 0 00.3124.2964c.1275.0732.2815.11.462.11.1806 0 .3343-.0368.4607-.11a.8974.8974 0 00.3086-.2964c.0792-.1237.1372-.2673.1728-.4312a2.3737 2.3737 0 00.0544-.5162c0-.1807-.018-.3523-.0543-.5145-.0357-.1626-.0937-.3046-.173-.4261a.901.901 0 00-.3085-.2909c-.1264-.072-.28-.1078-.4607-.1078zm6.4864 0c-.1806 0-.3347.0358-.4621.1078a.913.913 0 00-.3125.2909c-.0808.1215-.139.2635-.1753.4261a2.3894 2.3894 0 00-.0535.5145c0 .1805.0178.3525.0535.5162.0364.1639.0945.3075.1753.4312a.909.909 0 00.3125.2964c.1274.0732.2815.11.4621.11.1807 0 .334-.0368.4605-.11a.8974.8974 0 00.3086-.2964c.0793-.1237.1372-.2673.1729-.4312a2.3737 2.3737 0 00.0543-.5162c0-.1807-.018-.3523-.0543-.5145-.0357-.1626-.0936-.3046-.1729-.4261a.9011.9011 0 00-.3086-.2909c-.1265-.072-.2798-.1078-.4605-.1078zm-8.5372.0682l-.8407.6175.3141.4294.4762-.3678v1.8773h.603v-2.5564zm6.4863 0l-.8413.6175.3146.4294.4762-.3678v1.8773h.6031v-2.5564zm-4.4355.4442c.0797 0 .1438.0284.1932.0848.0493.0564.0874.1263.114.2093a1.312 1.312 0 01.0542.2691 2.803 2.803 0 01.014.2637c0 .0818-.0048.1712-.014.2689a1.3044 1.3044 0 01-.0543.2707c-.0265.083-.0646.1529-.1139.2093-.0494.0569-.1135.0852-.1932.0852-.0792 0-.1443-.0283-.1947-.0852-.051-.0564-.09-.1263-.1178-.2093a1.244 1.244 0 01-.0557-.2707 2.7355 2.7355 0 01-.0146-.269c0-.0792.0049-.167.0146-.2636a1.249 1.249 0 01.0557-.269c.0278-.0831.0668-.153.1178-.2094.0504-.0564.1155-.0848.1947-.0848zm6.4864 0c.0793 0 .1436.0284.193.0848.0493.0564.0874.1263.114.2093.0266.083.0444.1732.0543.2691.0092.0966.014.1844.014.2637a2.91 2.91 0 01-.014.2689 1.3176 1.3176 0 01-.0543.2707c-.0266.083-.0647.1529-.114.2093-.0494.0569-.1137.0852-.193.0852-.0791 0-.1444-.0283-.1948-.0852-.051-.0564-.09-.1263-.1176-.2093a1.2445 1.2445 0 01-.056-.2707 2.7355 2.7355 0 01-.0146-.269c0-.0792.0049-.167.0146-.2636a1.2484 1.2484 0 01.056-.269c.0276-.0831.0666-.153.1176-.2094.0504-.0564.1157-.0848.1948-.0848zm-2.1915 3.5112c-.1806 0-.3347.0364-.4621.108a.9076.9076 0 00-.3125.2913c-.0808.1215-.1387.263-.1751.4257a2.3826 2.3826 0 00-.0541.5143c0 .1806.0183.3525.0541.5164.0364.1639.0943.3075.1751.4316a.9092.9092 0 00.3125.2956c.1274.0738.2815.1102.4621.1102.1807 0 .3336-.0364.46-.1102a.8922.8922 0 00.3087-.2956c.0797-.124.1371-.2677.1735-.4316a2.3755 2.3755 0 00.0543-.5164c0-.1801-.018-.352-.0543-.5143-.0364-.1627-.0938-.3042-.1735-.4257a.8904.8904 0 00-.3088-.2913c-.1263-.0716-.2792-.108-.4599-.108zm-6.4016.0684l-.8413.6177.3143.4296.4765-.3684v1.8775h.6033v-2.5564zm2.1252 0l-.8413.6177.314.4296.4768-.3684v1.8775h.6033v-2.5564zm2.116 0l-.8407.6177.3135.4296.4768-.3684v1.8775h.603v-2.5564zm2.1604.4442c.0792 0 .1438.028.1932.085.0493.0565.0874.1265.114.2095.026.083.0444.1725.0537.2691.0097.096.0146.1839.0146.263 0 .082-.0049.1715-.0146.2691a1.3243 1.3243 0 01-.0537.2706c-.0266.083-.0647.153-.114.2095-.0494.0569-.114.085-.1932.085-.0797 0-.1441-.0281-.195-.085-.0506-.0565-.0898-.1265-.1174-.2095a1.2443 1.2443 0 01-.0558-.2706 2.6765 2.6765 0 01-.0146-.269c0-.0792.0048-.1671.0146-.263a1.2413 1.2413 0 01.0558-.2692c.0276-.083.0668-.153.1173-.2095.051-.057.1154-.085.1951-.085zm-6.7291 3.0723c-.1312 0-.243.0264-.3358.0785a.6615.6615 0 00-.2268.2111c-.0586.0885-.1009.1914-.127.3096a1.6979 1.6979 0 00-.0394.3732c0 .1313.013.2562.0394.375.0261.1188.0684.2235.127.313a.6535.6535 0 00.2268.2152c.0927.0532.2046.0797.3358.0797.1307 0 .2424-.0265.334-.0797a.6501.6501 0 00.2241-.2152c.0575-.0895.0996-.1942.1258-.313.026-.1188.039-.2437.039-.375 0-.1306-.013-.2555-.039-.3732-.0262-.1182-.0683-.2211-.1258-.3096a.658.658 0 00-.2241-.2111c-.0916-.0521-.2033-.0785-.334-.0785zm3.0859 0c-.1314 0-.243.0264-.3358.0785a.6612.6612 0 00-.2268.2111c-.0586.0885-.101.1914-.127.3096a1.6895 1.6895 0 00-.0394.3732c0 .1313.0128.2562.0394.375.026.1188.0684.2235.127.313a.6532.6532 0 00.2268.2152c.0927.0532.2044.0797.3358.0797.1307 0 .2423-.0265.334-.0797a.6496.6496 0 00.224-.2152c.0574-.0895.0993-.1942.1258-.313a1.7415 1.7415 0 00.039-.375 1.724 1.724 0 00-.039-.3732c-.0265-.1182-.0684-.2211-.1259-.3096a.6575.6575 0 00-.224-.2111c-.0916-.0521-.2032-.0785-.334-.0785zm5.1077 0c-.1312 0-.2428.0264-.3356.0785a.6612.6612 0 00-.2268.2111c-.0586.0885-.1008.1914-.127.3096a1.6977 1.6977 0 00-.0396.3732c0 .1313.0132.2562.0397.375.0261.1188.0683.2235.127.313a.6532.6532 0 00.2267.2152c.0928.0532.2044.0797.3356.0797.1307 0 .2426-.0265.3342-.0797a.6496.6496 0 00.224-.2152c.0575-.0895.0992-.1942.1259-.313.026-.1188.039-.2437.039-.375 0-.1306-.013-.2555-.039-.3732-.0267-.1182-.0684-.2211-.126-.3096a.6575.6575 0 00-.2239-.2111c-.0916-.0521-.2035-.0785-.3342-.0785zm-6.658.0498l-.611.4487.2279.3112.3462-.2669v1.3627h.4375v-1.8557zm3.0677 0l-.6106.4487.2282.3112.3462-.2669v1.3627h.4377v-1.8557zm5.1082 0l-.6109.4487.2285.3112.346-.2669v1.3627h.4377v-1.8557zm-9.7115.3228c.0575 0 .1041.0205.14.0612.0358.0412.0633.0917.0823.152a.9604.9604 0 01.0397.1952c.007.07.0102.134.0102.1915 0 .0597-.0031.1247-.0102.1952a.954.954 0 01-.0397.197c-.019.0602-.0465.1107-.0824.1519-.0358.0412-.0824.0612-.1399.0612-.058 0-.1053-.02-.1416-.0612-.037-.0412-.065-.0917-.0852-.152a.8863.8863 0 01-.0407-.1969 1.9609 1.9609 0 01-.0108-.1952c0-.0575.0037-.1215.0108-.1915a.893.893 0 01.0407-.1952c.0202-.0603.0483-.1108.0852-.152.0363-.0407.0836-.0612.1416-.0612zm3.0859 0c.0575 0 .1041.0205.14.0612a.421.421 0 01.0821.152.9392.9392 0 01.0397.1952c.007.07.0103.134.0103.1915 0 .0597-.0033.1247-.0103.1952a.9302.9302 0 01-.0397.197.4211.4211 0 01-.0822.1519c-.0358.0412-.0824.0612-.14.0612-.058 0-.1053-.02-.1417-.0612a.4192.4192 0 01-.085-.152.8458.8458 0 01-.0407-.1969 1.9645 1.9645 0 01-.011-.1952c0-.0575.004-.1215.011-.1915a.8487.8487 0 01.0407-.1952.4196.4196 0 01.085-.152c.0364-.0407.0837-.0612.1418-.0612zm5.1077 0c.0575 0 .1044.0205.1402.0612a.421.421 0 01.0822.152.9483.9483 0 01.0398.1952c.007.07.0102.134.0102.1915 0 .0597-.0032.1247-.0102.1952a.9427.9427 0 01-.0398.197.421.421 0 01-.0822.1519c-.0358.0412-.0827.0612-.1402.0612-.058 0-.1051-.02-.1415-.0612-.0368-.0412-.065-.0917-.0857-.152a.9503.9503 0 01-.04-.1969 1.9645 1.9645 0 01-.011-.1952c0-.0575.0039-.1215.011-.1915a.9589.9589 0 01.04-.1952c.0207-.0603.0489-.1108.0857-.152.0363-.0407.0835-.0612.1415-.0612zm-1.6842 1.8138c-.1312 0-.2428.0266-.3356.0787a.659.659 0 00-.2268.211c-.0586.0883-.1008.1914-.127.3097a1.7304 1.7304 0 00-.0396.3733c0 .1312.0137.256.0397.3746.026.119.0683.2237.127.3137a.656.656 0 00.2267.2148c.0928.0532.2044.0797.3356.0797.1307 0 .2426-.0265.3342-.0797a.6475.6475 0 00.224-.2148c.0576-.09.0998-.1948.1259-.3137.026-.1187.039-.2434.039-.3746 0-.1307-.013-.2557-.039-.3733-.0261-.1183-.0683-.2214-.126-.3098a.6504.6504 0 00-.2239-.2109c-.0916-.052-.2035-.0787-.3342-.0787zm3.0627 0c-.1313 0-.243.0266-.3358.0787a.6641.6641 0 00-.2268.211c-.0586.0883-.101.1914-.127.3097a1.7218 1.7218 0 00-.0394.3733c0 .1312.0134.256.0395.3746.026.119.0683.2237.1269.3137a.6609.6609 0 00.2268.2148c.0928.0532.2045.0797.3358.0797s.2424-.0265.334-.0797a.6475.6475 0 00.224-.2148c.0575-.09.1-.1948.1259-.3137a1.7398 1.7398 0 00.0396-.3746c0-.1307-.0135-.2557-.0396-.3733-.026-.1183-.0684-.2214-.126-.3098a.6504.6504 0 00-.2239-.2109c-.0916-.052-.2027-.0787-.334-.0787zm-1.5448.05l-.6109.448.2284.3124.346-.2675v1.3626h.4378v-1.8555zm-1.5179.3228c.0575 0 .1041.0206.14.0613a.4206.4206 0 01.0826.1517.9575.9575 0 01.0396.1953c.007.07.0102.134.0102.1916 0 .0597-.0032.1245-.0102.195a.9512.9512 0 01-.0396.197.4218.4218 0 01-.0826.1519c-.0359.0412-.0825.0612-.14.0612-.058 0-.1052-.02-.1415-.0612-.0368-.0412-.065-.0917-.085-.152a.9149.9149 0 01-.0408-.1969 1.9608 1.9608 0 01-.011-.195c0-.0575.004-.1217.011-.1916a.9232.9232 0 01.0407-.1953c.0202-.0603.0483-.1105.085-.1517.0364-.0407.0836-.0613.1416-.0613zm3.0627 0c.0575 0 .104.0206.1398.0613a.4208.4208 0 01.0826.1517.939.939 0 01.0394.1953c.0071.07.0104.134.0104.1916 0 .0597-.0033.1245-.0104.195a.9296.9296 0 01-.0394.197.4218.4218 0 01-.0826.1519c-.0357.0412-.0823.0612-.1398.0612-.0575 0-.1054-.02-.1417-.0612-.037-.0412-.065-.0917-.085-.152a.9065.9065 0 01-.0408-.1969 1.9495 1.9495 0 01-.0103-.195c0-.0575.0033-.1217.0103-.1916a.9145.9145 0 01.0407-.1953c.02-.0603.0481-.1105.085-.1517.0364-.0407.0843-.0613.1418-.0613zm-9.7123.1855c-.091 0-.1686.0182-.2326.0545a.4563.4563 0 00-.157.146c-.0408.0613-.0702.133-.0881.2149a1.1685 1.1685 0 00-.0271.2587c0 .0907.0086.1773.027.2598.018.082.0474.1546.0881.217a.4589.4589 0 00.157.1487c.064.037.1417.0557.2327.0557.0907 0 .1677-.0188.2311-.0557a.4504.4504 0 00.1558-.1487c.0402-.0624.0688-.135.0873-.217a1.2187 1.2187 0 00.0272-.2598c0-.0911-.0093-.1774-.0272-.2587-.0185-.082-.0471-.1536-.0873-.2148a.4479.4479 0 00-.1558-.146c-.0634-.0364-.1403-.0546-.231-.0546zm1.0519.0346l-.423.3102.1577.2166.2398-.185v.9442h.3037v-1.286zm-1.0519.2236c.0396 0 .0724.0141.0973.0429a.2841.2841 0 01.057.105.689.689 0 01.0276.1352c.0044.0489.007.0927.007.1328 0 .0407-.0027.0862-.007.135a.684.684 0 01-.0277.1362.2845.2845 0 01-.057.1053c-.0248.0288-.0576.043-.0972.043a.1247.1247 0 01-.098-.043.2976.2976 0 01-.0592-.1053.612.612 0 01-.0283-.1361 1.391 1.391 0 01-.0069-.135c0-.0402.0021-.084.007-.1329a.6197.6197 0 01.0282-.1353.2973.2973 0 01.0592-.105.1248.1248 0 01.098-.0428zm3.7749 1.394c-.0907 0-.1681.0178-.2321.0542a.4517.4517 0 00-.1574.1463c-.0407.0608-.07.1326-.088.2144a1.1691 1.1691 0 00-.0276.2587c0 .0905.0092.1774.0277.26.0179.0824.0472.1545.0879.2168a.4562.4562 0 00.1574.1493c.064.0368.1414.0547.232.0547.0912 0 .1683-.0179.2318-.0547a.451.451 0 00.1556-.1493.6636.6636 0 00.0868-.2169 1.1889 1.1889 0 00.0277-.26c0-.0906-.0092-.1773-.0277-.2586-.0179-.0818-.0473-.1536-.0868-.2144a.4461.4461 0 00-.1556-.1463c-.0635-.0364-.1406-.0543-.2317-.0543zm1.0522.034l-.423.3109.1578.2158.2398-.1849v.9444h.3033v-1.2861zm-1.0522.2236c.0401 0 .0726.014.0976.0427a.3008.3008 0 01.057.1054.6431.6431 0 01.027.135 1.31 1.31 0 01.0077.1329c0 .0412-.0027.0863-.0077.135a.655.655 0 01-.027.1367.3066.3066 0 01-.057.1054c-.025.0282-.0575.0421-.0976.0421-.0396 0-.0728-.0139-.0977-.042a.2928.2928 0 01-.0592-.1055.6182.6182 0 01-.028-.1366 1.3641 1.3641 0 01-.0077-.1351c0-.0401.0029-.0841.0077-.1328a.6122.6122 0 01.028-.135.2874.2874 0 01.0592-.1055c.0249-.0287.0581-.0427.0977-.0427z" />
-</svg>
-{{- else if (eq $icon_name "tumblr") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M14.563 24c-5.093 0-7.031-3.756-7.031-6.411V9.747H5.116V6.648c3.63-1.313 4.512-4.596 4.71-6.469C9.84.051 9.941 0 9.999 0h3.517v6.114h4.801v3.633h-4.82v7.47c.016 1.001.375 2.371 2.207 2.371h.09c.631-.02 1.486-.205 1.936-.419l1.156 3.425c-.436.636-2.4 1.374-4.156 1.404h-.178l.011.002z" />
-</svg>
-{{- else if (eq $icon_name "twitch") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path d="M21 2H3v16h5v4l4-4h5l4-4V2zm-10 9V7m5 4V7"></path>
-</svg>
-{{- else if (eq $icon_name "twitter") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z">
-    </path>
-</svg>
-{{- else if (eq $icon_name "unity") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor">
-  <path d="M15 11.2V3.733L8.61 0v2.867l2.503 1.466c.099.067.099.2 0 .234L8.148 6.3c-.099.067-.197.033-.263 0L4.92 4.567c-.099-.034-.099-.2 0-.234l2.504-1.466V0L1 3.733V11.2v-.033.033l2.438-1.433V6.833c0-.1.131-.166.197-.133L6.6 8.433c.099.067.132.134.132.234v3.466c0 .1-.132.167-.198.134L4.031 10.8l-2.438 1.433L7.983 16l6.391-3.733-2.438-1.434L9.434 12.3c-.099.067-.198 0-.198-.133V8.7c0-.1.066-.2.132-.233l2.965-1.734c.099-.066.197 0 .197.134V9.8z"/>
-</svg>
-{{- else if (eq $icon_name "unsplash") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 40">
-    <path fill="none" stroke="currentColor" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"
-        d="M37.892,13.5h-4.486 l-1.143-3.306C31.707,8.581,30.189,7.5,28.483,7.5h-9.045c-1.706,0-3.224,1.081-3.781,2.694L14.515,13.5H9.108 c-2.545,0-4.608,2.063-4.608,4.608v16.785c0,2.545,2.063,4.608,4.608,4.608h28.785c2.545,0,4.608-2.063,4.608-4.608V18.108 C42.5,15.563,40.437,13.5,37.892,13.5z" />
-    <circle cx="24" cy="26" r="7.5" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="4" />
-</svg>
-{{- else if (eq $icon_name "vimeo") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="M23.9765 6.4168c-.105 2.338-1.739 5.5429-4.894 9.6088-3.2679 4.247-6.0258 6.3699-8.2898 6.3699-1.409 0-2.578-1.294-3.553-3.881l-1.9179-7.1138c-.719-2.584-1.488-3.878-2.312-3.878-.179 0-.806.378-1.8809 1.132l-1.129-1.457a315.06 315.06 0 003.501-3.1279c1.579-1.368 2.765-2.085 3.5539-2.159 1.867-.18 3.016 1.1 3.447 3.838.465 2.953.789 4.789.971 5.5069.5389 2.45 1.1309 3.674 1.7759 3.674.502 0 1.256-.796 2.265-2.385 1.004-1.589 1.54-2.797 1.612-3.628.144-1.371-.395-2.061-1.614-2.061-.574 0-1.167.121-1.777.391 1.186-3.8679 3.434-5.7568 6.7619-5.6368 2.4729.06 3.6279 1.664 3.4929 4.7969z" />
-</svg>
-{{- else if or (eq $icon_name "vk") (eq $icon_name "vkontakte") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none">
-    <path fill-rule="evenodd" clip-rule="evenodd"
-        d="M3.37413 3.37413C0 6.74826 0 12.1788 0 23.04V24.96C0 35.8212 0 41.2517 3.37413 44.6259C6.74826 48 12.1788 48 23.04 48H24.96C35.8212 48 41.2517 48 44.6259 44.6259C48 41.2517 48 35.8212 48 24.96V23.04C48 12.1788 48 6.74826 44.6259 3.37413C41.2517 0 35.8212 0 24.96 0H23.04C12.1788 0 6.74826 0 3.37413 3.37413ZM8.10012 14.6001C8.36012 27.0801 14.6001 34.5801 25.5401 34.5801H26.1602V27.4401C30.1802 27.8401 33.22 30.7801 34.44 34.5801H40.1201C38.5601 28.9001 34.4599 25.7601 31.8999 24.5601C34.4599 23.0801 38.0599 19.4801 38.9199 14.6001H33.7598C32.6398 18.5601 29.3202 22.1601 26.1602 22.5001V14.6001H21V28.4401C17.8 27.6401 13.7601 23.7601 13.5801 14.6001H8.10012Z"
-        fill="currentColor" />
-</svg>
-{{- else if (eq $icon_name "wantedly") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M18.453 14.555c-.171-.111-.658-.764-2.006-3.982a9.192 9.192 0 0 0-.237-.526l-.274-.664-2.362-5.702H8.85l2.362 5.702 2.362 5.706 2.181 5.267a.196.196 0 0 0 .362 0l2.373-5.682a.1.1 0 0 0-.037-.119zm-8.85 0c-.171-.111-.658-.764-2.006-3.982a8.971 8.971 0 0 0-.236-.525l-.276-.665-2.36-5.702H0l2.362 5.702 2.362 5.706 2.181 5.267a.196.196 0 0 0 .362 0l2.374-5.682a.098.098 0 0 0-.038-.119ZM24 6.375a2.851 2.851 0 0 1-2.851 2.852 2.851 2.851 0 0 1-2.852-2.852 2.851 2.851 0 0 1 2.852-2.851A2.851 2.851 0 0 1 24 6.375Z" />
-</svg>
-{{- else if (eq $icon_name "wechat") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M17 10C20.3142 10 23 12.2165 23 14.95C23 16.4867 22.1513 17.8595 20.8182 18.767V21L18.6756 19.7042C18.1265 19.835 17.5642 19.9007 17 19.9C13.6858 19.9 11 17.6835 11 14.95C11 12.2165 13.6858 10 17 10Z" />
-    <path
-        d="M10.7657 15.5978C10.033 15.8089 9.24728 15.9231 8.43285 15.9231C7.4893 15.9251 6.55199 15.7679 5.65934 15.4578L3.12367 17V13.9835C1.81018 12.8183 1 11.2223 1 9.46154C1 5.89262 4.3278 3 8.43285 3C12.4487 3 15.7202 5.76769 15.8657 9.23V9.48092M9.49469 7.30769H9.50531M6.30918 7.30769H6.3198M14.8039 13.7692H14.8145M17.9894 13.7692H18" />
-</svg>
-{{- else if (eq $icon_name "whatsapp") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 380" fill="currentColor">
-    <path fill-rule="evenodd" clip-rule="evenodd" d="M307.546 52.5655C273.709 18.685 228.706 0.0171895 180.756 0C81.951 0 1.53846 80.404 1.50408 179.235C1.48689 210.829 9.74646 241.667 25.4319 268.844L0 361.736L95.0236 336.811C121.203 351.096 150.683 358.616 180.679 358.625H180.756C279.544 358.625 359.966 278.212 360 179.381C360.017 131.483 341.392 86.4547 307.546 52.5741V52.5655ZM180.756 328.354H180.696C153.966 328.346 127.744 321.16 104.865 307.589L99.4242 304.358L43.034 319.149L58.0834 264.168L54.5423 258.53C39.6304 234.809 31.749 207.391 31.7662 179.244C31.8006 97.1036 98.6334 30.2707 180.817 30.2707C220.61 30.2879 258.015 45.8015 286.145 73.9665C314.276 102.123 329.755 139.562 329.738 179.364C329.703 261.513 262.871 328.346 180.756 328.346V328.354ZM262.475 216.777C257.997 214.534 235.978 203.704 231.869 202.209C227.761 200.713 224.779 199.966 221.796 204.452C218.814 208.939 210.228 219.029 207.615 222.011C205.002 225.002 202.389 225.372 197.911 223.128C193.434 220.885 179.003 216.158 161.891 200.902C148.578 189.024 139.587 174.362 136.975 169.875C134.362 165.389 136.7 162.965 138.934 160.739C140.945 158.728 143.412 155.505 145.655 152.892C147.899 150.279 148.638 148.406 150.133 145.423C151.629 142.432 150.881 139.82 149.764 137.576C148.646 135.333 139.691 113.287 135.952 104.323C132.316 95.5909 128.621 96.777 125.879 96.6309C123.266 96.5019 120.284 96.4762 117.293 96.4762C114.302 96.4762 109.454 97.5935 105.346 102.08C101.238 106.566 89.6691 117.404 89.6691 139.441C89.6691 161.478 105.716 182.785 107.959 185.776C110.202 188.767 139.544 234.001 184.469 253.408C195.153 258.023 203.498 260.782 210.004 262.845C220.731 266.257 230.494 265.776 238.212 264.624C246.816 263.335 264.71 253.786 268.44 243.326C272.17 232.866 272.17 223.893 271.053 222.028C269.936 220.163 266.945 219.037 262.467 216.794L262.475 216.777Z"></path>
-</svg>
-{{- else if or (eq $icon_name "wikipedia") (eq $icon_name "wiki") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 80" fill="currentColor">
-    <path d="M93.868704,0.909104 L93.868704,3.048056 C91.047359,3.549147 88.911824,4.435559 87.462095,5.707293 C85.385249,7.595808 82.936537,10.486281 81.33006,14.378719 L48.644587,81.09089 L46.469872,81.09089 L13.656938,13.511576 C12.12874,10.043075 10.051174,7.923395 9.424242,7.152531 C8.444628,5.957874 7.2397099,5.023288 5.8095009,4.34877 C4.3792666,3.674401 2.449446,3.24083 0.0200327,3.048056 L0.0200327,0.909104 L31.947914,0.909104 L31.947914,3.048056 C28.26456,3.394989 26.508521,4.011623 25.411397,4.89796 C24.31421,5.784446 23.765632,6.921365 23.765658,8.308721 C23.765632,10.235773 24.666866,13.241865 26.469366,17.327004 L50.70176,63.285559 L74.394451,17.905099 C76.236043,13.434562 77.763937,10.332122 77.764,8.597768 C77.763937,7.48019 77.195762,6.410715 76.059496,5.389341 C74.923078,4.368114 73.637249,3.645496 70.933604,3.221484 C70.737619,3.183021 70.404566,3.125211 69.934406,3.048056 L69.934406,0.909104 L93.868704,0.909104 Z" />
-    <path d="M121.979968,0.909104 L121.979968,3.048056 C119.158628,3.549147 117.023098,4.435559 115.573368,5.707293 C113.496518,7.595808 111.047808,10.486281 109.441328,14.378719 L80.755855,81.09089 L78.581141,81.09089 L48.268207,13.511576 C46.740008,10.043075 44.662443,7.923395 44.035511,7.152531 C43.055896,5.957874 41.850979,5.023288 40.42077,4.34877 C38.990535,3.674401 37.694909,3.24083 35.265495,3.048056 L35.265495,0.909104 L66.559183,0.909104 L66.559183,3.048056 C62.875829,3.394989 61.11979,4.011623 60.022666,4.89796 C58.925479,5.784446 58.376901,6.921365 58.376926,8.308721 C58.376901,10.235773 59.278135,13.241865 61.080635,17.327004 L82.813029,63.285559 L102.505718,17.905099 C104.347308,13.434562 105.875208,10.332122 105.875268,8.597768 C105.875208,7.48019 105.307028,6.410715 104.170768,5.389341 C103.034348,4.368114 101.114328,3.645496 98.410678,3.221484 C98.214698,3.183021 97.881638,3.125211 97.411478,3.048056 L97.411478,0.909104 L121.979968,0.909104 Z" />
-</svg>
-{{- else if (eq $icon_name "wordpress") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M21.469 6.825c.84 1.537 1.318 3.3 1.318 5.175 0 3.979-2.156 7.456-5.363 9.325l3.295-9.527c.615-1.54.82-2.771.82-3.864 0-.405-.026-.78-.07-1.11m-7.981.105c.647-.03 1.232-.105 1.232-.105.582-.075.514-.93-.067-.899 0 0-1.755.135-2.88.135-1.064 0-2.85-.15-2.85-.15-.585-.03-.661.855-.075.885 0 0 .54.061 1.125.09l1.68 4.605-2.37 7.08L5.354 6.9c.649-.03 1.234-.1 1.234-.1.585-.075.516-.93-.065-.896 0 0-1.746.138-2.874.138-.2 0-.438-.008-.69-.015C4.911 3.15 8.235 1.215 12 1.215c2.809 0 5.365 1.072 7.286 2.833-.046-.003-.091-.009-.141-.009-1.06 0-1.812.923-1.812 1.914 0 .89.513 1.643 1.06 2.531.411.72.89 1.643.89 2.977 0 .915-.354 1.994-.821 3.479l-1.075 3.585-3.9-11.61.001.014zM12 22.784c-1.059 0-2.081-.153-3.048-.437l3.237-9.406 3.315 9.087c.024.053.05.101.078.149-1.12.393-2.325.609-3.582.609M1.211 12c0-1.564.336-3.05.935-4.39L7.29 21.709C3.694 19.96 1.212 16.271 1.211 12M12 0C5.385 0 0 5.385 0 12s5.385 12 12 12 12-5.385 12-12S18.615 0 12 0" />
-</svg>
-{{- else if (eq $icon_name "x") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z">
-    </path>
-</svg>
-{{- else if (eq $icon_name "xda") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
-    <path
-        d="M13.84 3.052V0h7.843v17.583H13.84v-3.024h4.591V3.052zM5.569 14.53V3.024h4.592V0H2.318v17.583H6.98L10.16 24v-9.483z" />
-</svg>
-{{- else if (eq $icon_name "xing") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor">
-    <path
-        d="M313.8 303.9L469 32H365L209.4 303.8a1.35 1.35 0 0 0 0 1.7l98.9 173.8c.4.7.8.7 1.6.7H413l-99.3-174.7a1.74 1.74 0 0 1 .1-1.4z"
-        fill="currentColor" />
-    <path
-        d="M221.9 216.2L163 113a2 2 0 0 0-2-1H65l58.9 104.4a1.13 1.13 0 0 1 .1.8L43 352h96.8a1.54 1.54 0 0 0 1.6-.9l80.5-133.7a2.44 2.44 0 0 0 0-1.2z" />
-</svg>
-{{- else if (eq $icon_name "xmpp") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
-    <path
-        d="m24 3.2-3.2 1.2-1 .3-3.1.9v.6c0 3.4-1.7 7.6-4.6 10.5-2.8-3-4.5-7-4.5-10.4v-.6l-3.1-.8-.8-.3L0 3.2c.1 5.7 4.8 11.7 10.5 15-1.3 1-2.8 1.8-4.3 2.2v.3c.4-.1.8-.1 1.3-.2.1 0 .3 0 .4-.1 1.4-.3 2.7-.8 4-1.4.4.2.8.4 1.2.5.1 0 .2.1.3.1.2.1.4.2.6.2 1.2.5 2.6.8 3.9.9v-.3c-1.7-.4-3.2-1.3-4.5-2.3C19.2 14.9 23.8 9 24 3.2z">
-    </path>
-</svg>
-{{- else if (eq $icon_name "ycombinator") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="1">
-    <path
-        d="M0 24V0h24v24H0zM6.951 5.896l4.112 7.708v5.064h1.583v-4.972l4.148-7.799h-1.749l-2.457 4.875c-.372.745-.688 1.434-.688 1.434s-.297-.708-.651-1.434L8.831 5.896h-1.88z" />
-</svg>
-{{- else if (eq $icon_name "yeswehack") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1300" fill="currentColor" stroke="none">
-   <path d="M405 551l-397 -338c-5,-4 -8,-11 -8,-18l0 -171c0,-13 11,-24 24,-24l154 0c14,0 24,11 24,24l0 89 304 258 303 -258 0 -89c0,-13 11,-24 24,-24l155 0c13,0 23,11 23,24l0 171c0,7 -2,14 -8,18l-396 338 0 90c0,13 -11,24 -24,24l-155 0c-13,0 -23,-11 -23,-24l0 -90z"/>
-   <path d="M202 1052l203 -172 0 -90c0,-13 10,-24 23,-24l155 0c13,0 24,11 24,24l0 90 202 172 0 -505c0,-8 3,-14 9,-18l154 -132c7,-6 17,-8 26,-4 8,4 13,13 13,22l0 876c0,13 -10,24 -23,24l-174 0c-6,0 -11,-2 -15,-6l-293 -249 -293 249c-5,4 -10,6 -16,6l-173 0c-13,0 -24,-11 -24,-24l0 -876c0,-9 5,-18 14,-22 9,-4 18,-2 25,4l155 131c5,5 8,11 8,19l0 505z"/>
-</svg>
-{{- else if (eq $icon_name "youtube") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="M22.54 6.42a2.78 2.78 0 0 0-1.94-2C18.88 4 12 4 12 4s-6.88 0-8.6.46a2.78 2.78 0 0 0-1.94 2A29 29 0 0 0 1 11.75a29 29 0 0 0 .46 5.33A2.78 2.78 0 0 0 3.4 19c1.72.46 8.6.46 8.6.46s6.88 0 8.6-.46a2.78 2.78 0 0 0 1.94-2 29 29 0 0 0 .46-5.25 29 29 0 0 0-.46-5.33z">
-    </path>
-    <polygon points="9.75 15.02 15.5 11.75 9.75 8.48 9.75 15.02"></polygon>
-</svg>
-{{- else if (eq $icon_name "zcal") -}}
-<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor" stroke="none" stroke-width="2">
-    <path
-        d="M 6.3361243,0.07808093 C 5.8180004,0.26764401 5.5778938,0.65939444 5.5778938,1.3291631 v 0.657135 L 4.0993445,2.0368425 C 2.8735383,2.0747533 2.5196977,2.137941 2.0773961,2.3654147 1.4328997,2.7066112 0.81367829,3.4395676 0.63675749,4.0587918 0.5609351,4.3620871 0.52302343,7.71094 0.54829756,13.347115 c 0.0379117,7.923511 0.0631858,8.858662 0.25274319,9.199865 0.24010655,0.442301 0.65713395,0.947789 0.79614215,0.947789 0.050549,0 0.22747,0.113734 0.4043899,0.252743 0.3159299,0.252744 0.5181249,0.252744 10.0339192,0.252744 h 9.692714 l 0.556036,-0.417027 C 22.587534,23.35576 22.96665,22.913458 23.14357,22.610167 L 23.4595,22.041494 V 13.069097 4.0967026 L 23.168845,3.565943 C 23.004562,3.275291 22.688632,2.8961743 22.461163,2.7192545 22.031499,2.3906822 21.121622,1.9862981 20.919428,2.0242088 c -0.06319,0.012634 -0.581311,0.012634 -1.149984,0 L 18.720559,2.011575 V 1.506083 c 0,-1.18789452 -0.909878,-1.83238624 -1.88294,-1.3395374 -0.417027,0.22746432 -0.644496,0.68240244 -0.644496,1.3395374 V 2.011575 H 12.149226 8.1053295 V 1.53136 c 0,-1.02360844 -0.8972396,-1.76920805 -1.7692052,-1.45327907 z M 5.5778938,4.7159268 c 0,0.9477869 0.2780183,1.4153683 0.9225148,1.5291004 C 7.4355589,6.4219471 8.1053295,5.7269014 8.1053295,4.5642839 V 3.907149 h 4.0438965 4.043897 v 0.7835008 c 0.01264,0.8340548 0.176921,1.1752608 0.720319,1.478556 0.568673,0.3032858 1.326903,0.063178 1.630196,-0.5054921 0.101097,-0.2021968 0.176921,-0.6697687 0.176921,-1.0615191 V 3.907149 h 0.985699 c 0.89724,0 1.023611,0.025277 1.415364,0.3664734 l 0.442301,0.3664829 0.03791,3.5384066 0.03791,3.5510451 -0.417028,0.126371 c -0.227469,0.06319 -0.644495,0.202195 -0.922514,0.315929 -0.480212,0.176921 -3.829064,1.377453 -4.486197,1.604922 -0.176921,0.05055 -0.796142,0.278019 -1.39009,0.480214 l -1.07416,0.379114 -0.06319,-2.641169 -0.06318,-2.6538124 -0.40439,-0.4043842 C 12.275598,8.3933386 11.808022,8.4059819 10.190464,9.0125629 9.4954189,9.2653042 8.5349935,9.6065101 8.0421437,9.78343 c -0.859328,0.290652 -2.9065504,1.023608 -3.9175251,1.402725 -0.2780173,0.1011 -0.7329564,0.265384 -1.0109737,0.353844 -0.2780183,0.101097 -0.6065848,0.214832 -0.7203198,0.26538 -0.2148315,0.08846 -0.227469,-0.126371 -0.227469,-3.3362094 0,-2.8054559 0.037912,-3.5005015 0.1895583,-3.8037873 C 2.6839809,4.0208811 2.9872724,3.907149 4.3394511,3.907149 h 1.2384427 z m 5.3076142,9.5410662 c 0,2.577983 0.01264,2.666443 0.290655,2.982373 0.429665,0.518124 1.175258,0.556036 2.363153,0.126372 1.630196,-0.581311 4.423012,-1.579648 6.065845,-2.173595 0.871965,-0.303292 1.680745,-0.593947 1.807117,-0.631859 0.214831,-0.06319 0.227469,0.101097 0.189557,3.437313 l -0.03791,3.500498 -0.35384,0.303292 -0.353842,0.303292 H 11.90912 2.9619982 L 2.6207951,21.763475 C 2.4438743,21.586554 2.2543169,21.308537 2.2164053,21.169528 c -0.025274,-0.151646 -0.037912,-1.680744 -0.025274,-3.3994 l 0.037911,-3.146658 0.4423016,-0.151646 c 0.429664,-0.151646 2.3126032,-0.821416 5.3076145,-1.882939 0.7961422,-0.278018 1.7439301,-0.606585 2.0851336,-0.732957 0.353841,-0.126371 0.669772,-0.227469 0.732956,-0.227469 0.05055,-0.01264 0.08846,1.175257 0.08846,2.628534 z" />
-</svg>
-{{- else if (eq $icon_name "zhihu") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path
-        d="m13.3334,3.60098l0,17.1471l1.79582,0l0.75424,2.13703l3.18459,-2.13703l3.93584,0l0,-17.1471l-9.6705,0zm7.41375,14.87538l-1.79283,0l-2.24777,1.50849l-0.53276,-1.50849l-0.53875,0l0,-12.53483l5.10911,0l0,12.53483l0.00299,0zm-8.56906,-7.18927l-3.97475,0c0.06285,-1.34387 0.1287,-3.12174 0.19754,-5.17496l3.91788,0l-0.00299,-0.24244c0,-0.01796 -0.00599,-0.43998 -0.06884,-0.87097c-0.06285,-0.44896 -0.19754,-1.04457 -0.62854,-1.04457l-6.5727,0c0.13169,-0.61657 0.46991,-2.08615 0.87995,-2.80747l0.19155,-0.33522l-0.3861,-0.02095c-0.02394,0 -0.58663,-0.02694 -1.23912,0.31726c-1.06851,0.56868 -1.5474,1.68807 -1.75691,2.52612c-0.55072,2.18791 -1.33489,3.70837 -1.66712,4.35786c-0.09877,0.19155 -0.15863,0.30529 -0.18557,0.38311c-0.05387,0.14666 -0.02394,0.29332 0.0838,0.38909c0.31427,0.28434 1.14334,-0.0868 1.15232,-0.08979c0.01796,-0.00898 0.03891,-0.01796 0.06585,-0.02993c0.41603,-0.18856 1.64916,-0.74826 2.08914,-2.52911l1.69705,0c0.02095,0.96376 0.09278,4.14236 0.0868,5.17496l-4.22018,0l-0.06285,0.0449c-0.69139,0.50582 -0.91288,1.8916 -0.92185,1.95146l-0.0419,0.27536l4.99837,0c-0.36814,2.34355 -0.79315,3.3941 -1.01763,3.81313c-0.11074,0.20951 -0.21849,0.41902 -0.32025,0.62255c-0.63752,1.26306 -1.29898,2.56802 -3.7802,4.5973c-0.10775,0.0838 -0.20951,0.23944 -0.14367,0.41005c0.07183,0.18856 0.27835,0.27237 0.73629,0.27237c0.16162,0 0.35318,-0.00898 0.58065,-0.02993c1.49352,-0.13169 3.01698,-0.53875 4.04359,-2.6219c0.50882,-1.05056 0.94879,-2.14601 1.31394,-3.25941l4.08549,4.78886l0.14965,-0.35916c0.02394,-0.05687 0.56868,-1.38578 0.15264,-2.87032l-0.01497,-0.05387l-3.23547,-3.68143l-0.65847,0.49684c0.19155,-0.78118 0.31726,-1.49352 0.37413,-2.12805l4.74995,0l0,-0.23944c0,-1.20021 -0.55371,-1.91255 -0.57466,-1.94248l-0.07183,-0.08979z" />
-</svg>
-{{- else if (eq $icon_name "jamendo") -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.3">
-    <path style="stroke-width:1.7"
-        d="M 11.953964,1.9577206 C 8.9486891,3.6582881 5.9434143,5.3588555 2.9381394,7.059423 c 0,3.325368 0,6.650735 0,9.976103 2.9643942,1.765865 5.9287884,3.531729 8.8931826,5.297594 3.002478,-1.73905 6.004955,-3.478101 9.007433,-5.217151 0,-3.360254 0,-6.720509 0,-10.0807628 C 17.877158,5.342711 14.915561,3.6502158 11.953964,1.9577206 Z" />
-     <path d="M 6.7394985,14.712082 8.3520207,11.408709" />
-     <path d="M 9.2716212,14.767353 11.902927,9.4304828" />
-     <path d="M 13.170768,11.935987 14.59425,9.3677519" />
-     <path d="M 14.54983,14.574583 17.177574,9.4459113" />
-</svg>
-{{- else if $icon_name -}}
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
-    stroke-linecap="round" stroke-linejoin="round">
-    <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path>
-    <path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path>
-</svg>
-{{- end -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/templates/_funcs/get-page-images.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/templates/_funcs/get-page-images.html
deleted file mode 100644 (file)
index 268ceb4..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-{{- $imgs := slice }}
-{{- $imgParams := .Params.images }}
-{{- $resources := .Resources.ByType "image" -}}
-{{/* Find featured image resources if the images parameter is empty. */}}
-{{- if not $imgParams }}
-  {{- $featured := $resources.GetMatch "*feature*" -}}
-  {{- if not $featured }}{{ $featured = $resources.GetMatch "{*cover*,*thumbnail*}" }}{{ end -}}
-  {{- with $featured }}
-    {{- $imgs = $imgs | append (dict
-      "Image" .
-      "RelPermalink" .RelPermalink
-      "Permalink" .Permalink) }}
-  {{- end }}
-{{- end }}
-{{/* Use the first one of site images as the fallback. */}}
-{{- if and (not $imgParams) (not $imgs) }}
-  {{- with site.Params.images }}
-    {{- $imgParams = first 1 . }}
-  {{- end }}
-{{- end }}
-{{/* Parse page's images parameter. */}}
-{{- range $imgParams }}
-  {{- $img := . }}
-  {{- $url := urls.Parse $img }}
-  {{- if eq $url.Scheme "" }}
-    {{/* Internal image. */}}
-    {{- with $resources.GetMatch $img -}}
-      {{/* Image resource. */}}
-      {{- $imgs = $imgs | append (dict
-        "Image" .
-        "RelPermalink" .RelPermalink
-        "Permalink" .Permalink) }}
-    {{- else }}
-      {{- $imgs = $imgs | append (dict
-        "RelPermalink" (relURL $img)
-        "Permalink" (absURL $img)
-      ) }}
-    {{- end }}
-  {{- else }}
-    {{/* External image */}}
-    {{- $imgs = $imgs | append (dict
-      "RelPermalink" $img
-      "Permalink" $img
-    ) }}
-  {{- end }}
-{{- end }}
-{{- return $imgs }}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/templates/opengraph.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/templates/opengraph.html
deleted file mode 100644 (file)
index fe5bf53..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-<meta property="og:url" content="{{ .Permalink }}">
-
-{{- with or site.Title site.Params.title | plainify }}
-  <meta property="og:site_name" content="{{ . }}">
-{{- end }}
-
-{{- with or .Title site.Title site.Params.title | plainify }}
-  <meta property="og:title" content="{{ . }}">
-{{- end }}
-
-{{- with or .Description .Summary site.Params.description | plainify | htmlUnescape | chomp }}
-  <meta property="og:description" content="{{ . }}">
-{{- end }}
-
-{{- with or .Params.locale site.Language.LanguageCode site.Language.Lang }}
-  <meta property="og:locale" content="{{ . }}">
-{{- end }}
-
-{{- if .IsPage }}
-  <meta property="og:type" content="article">
-  {{- with .Section }}
-    <meta property="article:section" content="{{ . }}">
-  {{- end }}
-  {{- $ISO8601 := "2006-01-02T15:04:05-07:00" }}
-  {{- with .PublishDate }}
-    <meta property="article:published_time" {{ .Format $ISO8601 | printf "content=%q" | safeHTMLAttr }}>
-  {{- end }}
-  {{- with .Lastmod }}
-    <meta property="article:modified_time" {{ .Format $ISO8601 | printf "content=%q" | safeHTMLAttr }}>
-  {{- end }}
-  {{- range .GetTerms "tags" | first 6 }}
-    <meta property="article:tag" content="{{ .Page.Title | plainify }}">
-  {{- end }}
-{{- else }}
-  <meta property="og:type" content="website">
-{{- end }}
-
-{{- if .Params.cover.image -}}
-  {{- if (ne .Params.cover.relative true) }}
-    <meta property="og:image" content="{{ .Params.cover.image | absURL }}">
-  {{- else}}
-    <meta property="og:image" content="{{ (path.Join .RelPermalink .Params.cover.image ) | absURL }}">
-  {{- end}}
-{{- else }}
-  {{- with partial "_funcs/get-page-images" . }}
-    {{- range . | first 6 }}
-      <meta property="og:image" content="{{ .Permalink }}">
-    {{- end }}
-  {{- end }}
-{{- end }}
-
-{{- with .Params.audio }}
-  {{- range . | first 6  }}
-    <meta property="og:audio" content="{{ . | absURL }}">
-  {{- end }}
-{{- end }}
-
-{{- with .Params.videos }}
-  {{- range . | first 6 }}
-    <meta property="og:video" content="{{ . | absURL }}">
-  {{- end }}
-{{- end }}
-
-{{- range .GetTerms "series" }}
-  {{- range .Pages | first 7 }}
-    {{- if ne $ . }}
-      <meta property="og:see_also" content="{{ .Permalink }}">
-    {{- end }}
-  {{- end }}
-{{- end }}
-
-{{- with site.Params.social }}
-  {{- if reflect.IsMap . }}
-    {{- with .facebook_app_id }}
-      <meta property="fb:app_id" content="{{ . }}">
-    {{- else }}
-      {{- with .facebook_admin }}
-        <meta property="fb:admins" content="{{ . }}">
-      {{- end }}
-    {{- end }}
-  {{- end }}
-{{- end }}
-
-{{- with (.Param "social.fediverse_creator") }}
-  <meta name="fediverse:creator" content="{{ . }}">
-{{- end }}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/templates/schema_json.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/templates/schema_json.html
deleted file mode 100644 (file)
index 8a4efb4..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-{{ if .IsHome }}
-<script type="application/ld+json">
-{
-  "@context": "https://schema.org",
-  "@type": "{{- ( site.Params.schema.publisherType | default "Organization") | title -}}",
-  "name": {{ site.Title }},
-  "url": {{ site.Home.Permalink }},
-  "description": {{ site.Params.description | plainify | truncate 180 | safeHTML }},
-  {{- if (eq site.Params.schema.publisherType "Person") }}
-  "image": {{ site.Params.assets.favicon | default "favicon.ico" | absURL }},
-  {{- else }}
-  "logo": {{ site.Params.assets.favicon | default "favicon.ico" | absURL }},
-  {{- end }}
-  "sameAs": [
-    {{- if site.Params.schema.sameAs }}
-      {{ range $i, $e := site.Params.schema.sameAs }}{{ if $i }}, {{ end }}{{ trim $e " " }}{{ end }}
-    {{- else}}
-      {{ range $i, $e := site.Params.SocialIcons }}{{ if $i }}, {{ end }}{{ trim $e.url " " | safeURL }}{{ end }}
-    {{- end}}
-  ]
-}
-</script>
-{{- else if (or .IsPage .IsSection) }}
-{{/* BreadcrumbList */}}
-{{- $url := replace .Parent.Permalink ( printf "%s" site.Home.Permalink) "" }}
-{{- $lang_url := strings.TrimPrefix ( printf "%s/" .Lang) $url }}
-{{- $bc_list := (split $lang_url "/")}}
-
-{{- $scratch := newScratch }}
-<script type="application/ld+json">
-{
-  "@context": "https://schema.org",
-  "@type": "BreadcrumbList",
-  "itemListElement": [
-  {{- range $index, $element := $bc_list }}
-
-    {{- $scratch.Add "path" (printf "%s/" $element ) | safeJS }}
-    {{- $bc_pg := site.GetPage ($scratch.Get "path") -}}
-
-    {{- if (and ($bc_pg) (gt (len . ) 0))}}
-    {{- if (and $index)}}, {{end }}
-    {
-      "@type": "ListItem",
-      "position": {{ add 1 $index  }},
-      "name": {{ $bc_pg.Name }},
-      "item": {{ $bc_pg.Permalink | safeHTML }}
-    }
-    {{- end }}
-
-  {{- end }}
-  {{- /*  self-page addition  */ -}}
-  {{- if (ge (len $bc_list) 2) }}, {{end }}
-    {
-      "@type": "ListItem",
-      "position": {{len $bc_list}},
-      "name": {{ .Name }},
-      "item": {{ .Permalink | safeHTML }}
-    }
-  ]
-}
-</script>
-{{- if .IsPage }}
-<script type="application/ld+json">
-{
-  "@context": "https://schema.org",
-  "@type": "BlogPosting",
-  "headline": {{ .Title | plainify}},
-  "name": "{{ .Title | plainify }}",
-  "description": {{ with .Description | plainify }}{{ . }}{{ else }}{{ .Summary | plainify  }}{{ end -}},
-  "keywords": [
-    {{- if .Params.keywords }}
-    {{ range $i, $e := .Params.keywords }}{{ if $i }}, {{ end }}{{ $e }}{{ end }}
-    {{- else }}
-    {{ range $i, $e := .Params.tags }}{{ if $i }}, {{ end }}{{ $e }}{{ end }}
-    {{- end }}
-  ],
-  "articleBody": {{ .Content | safeJS | htmlUnescape | plainify }},
-  "wordCount" : "{{ .WordCount }}",
-  "inLanguage": {{ .Language.Lang | default "en-us" }},
-  {{ if .Params.cover.image -}}
-  "image":
-    {{- if (ne .Params.cover.relative true) -}}
-    {{ .Params.cover.image | absURL }},
-    {{- else -}}
-    {{ (path.Join .RelPermalink .Params.cover.image ) | absURL }},
-    {{- end}}
-  {{- else }}
-    {{- $images := partial "templates/_funcs/get-page-images" . -}}
-    {{- with index $images 0 -}}
-  "image": {{ .Permalink }},
-    {{- end }}
-  {{- end -}}
-  "datePublished": {{ .PublishDate }},
-  "dateModified": {{ .Lastmod }},
-  {{- with (.Params.author | default site.Params.author) }}
-  "author":
-    {{- if (or (eq (printf "%T" .) "[]string") (eq (printf "%T" .) "[]interface {}")) -}}
-  [{{- range $i, $v := . -}}
-  {{- if $i }}, {{end -}}
-  {
-    "@type": "Person",
-    "name": {{ $v }}
-  }
-  {{- end }}],
-    {{- else -}}
-  {
-    "@type": "Person",
-    "name": {{ . }}
-  },
-    {{- end -}}
-  {{- end }}
-  "mainEntityOfPage": {
-    "@type": "WebPage",
-    "@id": {{ .Permalink | safeHTML }}
-  },
-  "publisher": {
-    "@type": "{{- ( site.Params.schema.publisherType | default "Organization") | title -}}",
-    "name": {{ site.Title }},
-    "logo": {
-      "@type": "ImageObject",
-      "url": {{ site.Params.assets.favicon | default "favicon.ico" | absURL }}
-    }
-  }
-}
-</script>
-{{- end }}{{/* .IsPage end */}}
-
-{{- end -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/templates/twitter_cards.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/templates/twitter_cards.html
deleted file mode 100644 (file)
index a6e1d05..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-{{- if .Params.cover.image -}}
-<meta name="twitter:card" content="summary_large_image">
-{{- if (ne $.Params.cover.relative true) }}
-<meta name="twitter:image" content="{{ .Params.cover.image | absURL }}">
-{{- else }}
-<meta name="twitter:image" content="{{ (path.Join .RelPermalink .Params.cover.image ) | absURL }}">
-{{- end}}
-{{- else }}
-{{- $images := partial "templates/_funcs/get-page-images" . -}}
-{{- with index $images 0 -}}
-<meta name="twitter:card" content="summary_large_image">
-<meta name="twitter:image" content="{{ .Permalink }}">
-{{- else -}}
-<meta name="twitter:card" content="summary">
-{{- end -}}
-{{- end }}
-<meta name="twitter:title" content="{{ .Title }}">
-<meta name="twitter:description" content="{{ with .Description }}{{ . }}{{ else }}{{if .IsPage}}{{ .Summary }}{{ else }}{{ with site.Params.description }}{{ . }}{{ end }}{{ end }}{{ end -}}">
-
-{{- $twitterSite := "" }}
-{{- with site.Params.social }}
-  {{- if reflect.IsMap . }}
-    {{- with .twitter }}
-      {{- $content := . }}
-      {{- if not (strings.HasPrefix . "@") }}
-        {{- $content = printf "@%v" . }}
-      {{- end }}
-      <meta name="twitter:site" content="{{ $content }}">
-    {{- end }}
-  {{- end }}
-{{- end }}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/toc.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/toc.html
deleted file mode 100644 (file)
index 28f8694..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-{{- $headers := findRE "<h[1-6].*?>(.|\n])+?</h[1-6]>" .Content -}}
-{{- $has_headers := ge (len $headers) 1 -}}
-{{- if $has_headers -}}
-<div class="toc">
-    <details {{if (.Param "TocOpen") }} open{{ end }}>
-        <summary accesskey="c" title="(Alt + C)">
-            <span class="details">{{- i18n "toc" | default "Table of Contents" }}</span>
-        </summary>
-
-        <div class="inner">
-            {{- if (.Param "UseHugoToc") }}
-            {{- .TableOfContents -}}
-            {{- else }}
-            {{- $largest := 6 -}}
-            {{- range $headers -}}
-            {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}}
-            {{- $headerLevel := len (seq $headerLevel) -}}
-            {{- if lt $headerLevel $largest -}}
-            {{- $largest = $headerLevel -}}
-            {{- end -}}
-            {{- end -}}
-
-            {{- $firstHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers 0) 1) 0)) -}}
-
-            {{- $.Scratch.Set "bareul" slice -}}
-            <ul>
-                {{- range seq (sub $firstHeaderLevel $largest) -}}
-                <ul>
-                    {{- $.Scratch.Add "bareul" (sub (add $largest .) 1) -}}
-                    {{- end -}}
-                    {{- range $i, $header := $headers -}}
-                    {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}}
-                    {{- $headerLevel := len (seq $headerLevel) -}}
-
-                    {{/* get id="xyz" */}}
-                    {{- $id := index (findRE "(id=\"(.*?)\")" $header 9) 0 }}
-
-                    {{- /* strip id="" to leave xyz, no way to get regex capturing groups in hugo */ -}}
-                    {{- $cleanedID := replace (replace $id "id=\"" "") "\"" "" }}
-                    {{- $header := replaceRE "<h[1-6].*?>((.|\n])+?)</h[1-6]>" "$1" $header -}}
-
-                    {{- if ne $i 0 -}}
-                    {{- $prevHeaderLevel := index (findRE "[1-6]" (index $headers (sub $i 1)) 1) 0 -}}
-                    {{- $prevHeaderLevel := len (seq $prevHeaderLevel) -}}
-                    {{- if gt $headerLevel $prevHeaderLevel -}}
-                    {{- range seq $prevHeaderLevel (sub $headerLevel 1) -}}
-                    <ul>
-                        {{/* the first should not be recorded */}}
-                        {{- if ne $prevHeaderLevel . -}}
-                        {{- $.Scratch.Add "bareul" . -}}
-                        {{- end -}}
-                        {{- end -}}
-                        {{- else -}}
-                        </li>
-                        {{- if lt $headerLevel $prevHeaderLevel -}}
-                        {{- range seq (sub $prevHeaderLevel 1) -1 $headerLevel -}}
-                        {{- if in ($.Scratch.Get "bareul") . -}}
-                    </ul>
-                    {{/* manually do pop item */}}
-                    {{- $tmp := $.Scratch.Get "bareul" -}}
-                    {{- $.Scratch.Delete "bareul" -}}
-                    {{- $.Scratch.Set "bareul" slice}}
-                    {{- range seq (sub (len $tmp) 1) -}}
-                    {{- $.Scratch.Add "bareul" (index $tmp (sub . 1)) -}}
-                    {{- end -}}
-                    {{- else -}}
-                </ul>
-                </li>
-                {{- end -}}
-                {{- end -}}
-                {{- end -}}
-                {{- end }}
-                <li>
-                    <a href="#{{- $cleanedID -}}" aria-label="{{- $header | plainify | safeHTML -}}">{{- $header | plainify | safeHTML -}}</a>
-                    {{- else }}
-                <li>
-                    <a href="#{{- $cleanedID -}}" aria-label="{{- $header | plainify | safeHTML -}}">{{- $header | plainify | safeHTML -}}</a>
-                    {{- end -}}
-                    {{- end -}}
-                    <!-- {{- $firstHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers 0) 1) 0)) -}} -->
-                    {{- $firstHeaderLevel := $largest }}
-                    {{- $lastHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers (sub (len $headers) 1)) 1) 0)) }}
-                </li>
-                {{- range seq (sub $lastHeaderLevel $firstHeaderLevel) -}}
-                {{- if in ($.Scratch.Get "bareul") (add . $firstHeaderLevel) }}
-            </ul>
-            {{- else }}
-            </ul>
-            </li>
-            {{- end -}}
-            {{- end }}
-            </ul>
-            {{- end }}
-        </div>
-    </details>
-</div>
-{{- end }}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/translation_list.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/partials/translation_list.html
deleted file mode 100644 (file)
index 01729cd..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-{{- if .IsTranslated -}}
-{{- if (ne .Layout "search") }}
-{{- if or .Params.author site.Params.author (.Param "ShowReadingTime") (not .Date.IsZero) }}&nbsp;|&nbsp;{{- end -}}
-{{- end -}}
-<span>{{- i18n "translations" | default "Translations" }}:</span>
-<ul class="i18n_list">
-    {{- range .Translations }}
-    <li>
-        <a href="{{ .Permalink }}">
-            {{- if (and site.Params.displayFullLangName (.Language.LanguageName)) }}
-            {{- .Language.LanguageName | emojify -}}
-            {{- else }}
-            {{- .Lang | title -}}
-            {{- end -}}
-        </a>
-    </li>
-    {{- end }}
-</ul>
-{{- end -}}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/robots.txt b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/robots.txt
deleted file mode 100644 (file)
index f26f508..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-User-agent: *
-{{- if hugo.IsProduction | or (eq site.Params.env "production") }}
-Disallow:
-{{- else }}
-Disallow: /
-{{- end }}
-Sitemap: {{ "sitemap.xml" | absURL }}
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/collapse.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/collapse.html
deleted file mode 100644 (file)
index 17d8d3b..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-{{ if .Get "summary" }}
-{{ else }}
-{{ warnf "missing value for param 'summary': %s" .Position }}
-{{ end }}
-<p><details {{ if (eq (.Get "openByDefault") true) }} open=true {{ end }}>
-  <summary markdown="span">{{ .Get "summary" | markdownify }}</summary>
-  {{ .Inner | markdownify }}
-</details></p>
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/figure.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/figure.html
deleted file mode 100644 (file)
index 8c93eff..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<figure{{ if or (.Get "class") (eq (.Get "align") "center") }} class="
-           {{- if eq (.Get "align") "center" }}align-center {{ end }}
-           {{- with .Get "class" }}{{ . }}{{- end }}"
-{{- end -}}>
-    {{- if .Get "link" -}}
-        <a href="{{ .Get "link" }}"{{ with .Get "target" }} target="{{ . }}"{{ end }}{{ with .Get "rel" }} rel="{{ . }}"{{ end }}>
-    {{- end }}
-    <img loading="lazy" src="{{ .Get "src" }}{{- if eq (.Get "align") "center" }}#center{{- end }}"
-         {{- if or (.Get "alt") (.Get "caption") }}
-         alt="{{ with .Get "alt" }}{{ . }}{{ else }}{{ .Get "caption" | markdownify| plainify }}{{ end }}"
-         {{- end -}}
-         {{- with .Get "width" }} width="{{ . }}"{{ end -}}
-         {{- with .Get "height" }} height="{{ . }}"{{ end -}}
-    /> <!-- Closing img tag -->
-    {{- if .Get "link" }}</a>{{ end -}}
-    {{- if or (or (.Get "title") (.Get "caption")) (.Get "attr") -}}
-        <figcaption>
-            {{ with (.Get "title") -}}
-                {{ . }}
-            {{- end -}}
-            {{- if or (.Get "caption") (.Get "attr") -}}<p>
-                {{- .Get "caption" | markdownify -}}
-                {{- with .Get "attrlink" }}
-                    <a href="{{ . }}">
-                {{- end -}}
-                {{- .Get "attr" | markdownify -}}
-                {{- if .Get "attrlink" }}</a>{{ end }}</p>
-            {{- end }}
-        </figcaption>
-    {{- end }}
-</figure>
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/inTextImg.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/inTextImg.html
deleted file mode 100644 (file)
index 0239fd6..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-{{- $Img := (.Get "url") }}
-{{- $height := (.Get "height") }}
-{{- $alt := (.Get "alt") }}
-
-<img class="in-text" height="{{ $height | default `15` }}" src="{{$Img}}" alt="{{$alt}}">
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/ltr.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/ltr.html
deleted file mode 100644 (file)
index 4ad7682..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{{ $.Scratch.Set "md" false }}
-
-{{ if .IsNamedParams }}
-{{ $.Scratch.Set "md" (.Get "md") }}
-{{ else }}
-{{ $.Scratch.Set "md" (.Get 0) }}
-{{ end }}
-
-<div dir="ltr">
-  {{ if eq ($.Scratch.Get "md") false }}
-    {{ .Inner }}
-  {{ else }}
-    {{ .Inner | markdownify }}
-  {{ end }}
-</div>
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/rawhtml.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/rawhtml.html
deleted file mode 100644 (file)
index 9350c13..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-<!-- raw html -->
-{{- .Inner -}}
\ No newline at end of file
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/rtl.html b/generated-2025-11-21-17-29-08/themes/PaperMod/layouts/shortcodes/rtl.html
deleted file mode 100644 (file)
index a69b8ce..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{{ $.Scratch.Set "md" false }}
-
-{{ if .IsNamedParams }}
-{{ $.Scratch.Set "md" (.Get "md") }}
-{{ else }}
-{{ $.Scratch.Set "md" (.Get 0) }}
-{{ end }}
-
-<div dir="rtl">
-  {{ if eq ($.Scratch.Get "md") false }}
-    {{ .Inner }}
-  {{ else }}
-    {{ .Inner | markdownify }}
-  {{ end }}
-</div>
diff --git a/generated-2025-11-21-17-29-08/themes/PaperMod/theme.toml b/generated-2025-11-21-17-29-08/themes/PaperMod/theme.toml
deleted file mode 100644 (file)
index e4352b9..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-# theme.toml template for a Hugo theme
-# See https://github.com/gohugoio/hugoThemes#themetoml for an example
-
-name = "PaperMod"
-license = "MIT"
-licenselink = "https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE"
-description = "A fast, clean, responsive Hugo theme"
-homepage = "https://adityatelange.github.io/hugo-PaperMod/"
-demosite = "https://adityatelange.github.io/hugo-PaperMod/"
-tags = [
-  "responsive",
-  "simple",
-  "clean",
-  "light",
-  "dark",
-  "blog",
-  "minimalist",
-  "highlight.js",
-  "search"
-]
-features = [
-  "responsive",
-  "single-column",
-  "blog",
-  "cover-image",
-  "table-of-contents",
-  "opengraph",
-  "highlight.js",
-  "favicon",
-  "archive",
-  "share-icons",
-  "cover",
-  "multilingual",
-  "social-icons",
-  "minified-assets",
-  "theme-toggle",
-  "menu-location-indicator",
-  "scroll-to-top",
-  "search"
-]
-min_version = "0.146.0"
-
-[author]
-  name = "Aditya Telange"
-  homepage = "https://github.com/adityatelange/"
-
-# If porting an existing theme
-[original]
-  name = "Paper"
-  author = "nanxiaobei"
-  homepage = "https://github.com/nanxiaobei"
-  repo = "https://github.com/nanxiaobei/hugo-paper/"
diff --git a/hugo.yaml b/hugo.yaml
new file mode 100644 (file)
index 0000000..5da12cc
--- /dev/null
+++ b/hugo.yaml
@@ -0,0 +1,40 @@
+baseURL: https://juplo.de
+languageCode: en-US
+title: juplo
+theme: PaperMod
+taxonomies:
+  category: categories
+  tag: tags
+params:
+  description: Java bits from nerds for nerds
+  defaultTheme: auto
+  disableThemeToggle: true
+  showShareButtons: true
+  showReadingTime: true
+  showToc: false
+  showBreadCrumbs: true
+  showCodeCopyButtons: true
+  comments: true
+  hideFooter: true
+  assets:
+    favicon: /favicon.ico
+    disableHLJS: true
+markup:
+  highlight:
+    codeFences: true
+    guessSyntax: true
+    style: monokai
+  goldmark:
+    renderer:
+      unsafe: true
+outputs:
+  home:
+    - HTML
+    - RSS
+    - JSON
+outputFormats:
+  RSS:
+    mediaType: application/rss+xml
+    baseName: feed
+menu:
+  main: []
diff --git a/layouts/partials/comments.html b/layouts/partials/comments.html
new file mode 100644 (file)
index 0000000..cca573f
--- /dev/null
@@ -0,0 +1,66 @@
+
+<!-- fetch /data/comments.yaml -->
+{{ $site_comments := .Site.Data.comments }}
+
+<!-- /data/comments.yaml not found: abort -->
+{{ if not $site_comments }}
+       {{ return "" }}
+{{ end }}
+
+<!-- find all comments whose post_id matches current post/page post_id -->
+{{ with (where .Site.Data.comments "post_id" .Params.post_id ) }}
+  <ul id="comments" style="list-style: none;">
+    <!-- Call the top level of comments (parent_id = 0). Each of them will call their own children (replies) internally -->
+    {{ template "comments" (dict "post_comments" . "site_comments" $site_comments "parent_id" "0" ) }}
+  </ul>
+{{ end }}
+
+{{- define "comments" -}}
+
+  {{ $site_comments := .site_comments }}
+  {{ $query_parent_id := .parent_id }}
+
+  <!-- Note : we iterate over comments using the order in which they appear
+  in /data/comments.yaml. WordPress exports them in increasing order of ID
+  and ID is incremented with time, so this is chronological without having to sort -->
+  {{ range .post_comments }}
+    {{ $author_name := index . "author_name" }}
+    {{ $author_link := index . "author_url" }}
+    {{ $date := index . "published" }}
+    {{ $parent_id := index . "parent_id" }}
+    {{ $id := index . "id" }}
+
+    <!-- Only current-level parent comments. -->
+    {{ if eq $parent_id $query_parent_id }}
+      <li id="comment-{{ $id }}" data-reply-to="comment-{{ $parent_id }}" >
+        <div class="comment-meta">
+          <!-- Optional: get Gravatar profile pic from email -->
+          <img src="https://gravatar.com/avatar/{{ sha256 (index . "author_email") }}" />
+
+          <!-- Optional: keep author URL -->
+          {{ with $author_link }}
+            <a href="{{ . }}" rel="nofollow" target="_blank">{{ $author_name }}</a>
+          {{ else }}
+            {{ $author_name }}
+          {{ end }}
+
+          <time pubdate datetime="{{ $date | time.Format "2006-01-02" }}" title="Publication date" property="created">
+            {{ $date | time.Format ":date_long" }}
+          </time>
+        </div>
+
+        <div class="comment-content">
+          {{ index . "content" | markdownify | safeHTML }}<!-- don't escape HTML if content uses it -->
+        </div>
+
+        <!-- Embed children comments (replies), aka find comments whose parent_id match current id -->
+        {{ with (where $site_comments "parent_id" $id) }}
+          <ul class="children-comments" style="list-style: none;">
+            {{ template "comments" (dict "post_comments" . "site_comments" $site_comments "parent_id" $id ) }}
+          </ul>
+        {{ end }}
+
+      </li>
+    {{ end }}
+  {{ end }}
+{{- end -}}
diff --git a/layouts/rss.xml b/layouts/rss.xml
new file mode 100644 (file)
index 0000000..8d1df27
--- /dev/null
@@ -0,0 +1,83 @@
+{{- /* Deprecate site.Author.email in favor of site.Params.author.email */}}
+{{- $authorEmail := "" }}
+{{- with site.Params.author }}
+  {{- if reflect.IsMap . }}
+    {{- with .email }}
+      {{- $authorEmail = . }}
+    {{- end }}
+  {{- end }}
+{{- else }}
+  {{- with site.Author.email }}
+    {{- $authorEmail = . }}
+    {{- warnf "The author key in site configuration is deprecated. Use params.author.email instead." }}
+  {{- end }}
+{{- end }}
+
+{{- /* Deprecate site.Author.name in favor of site.Params.author.name */}}
+{{- $authorName := "" }}
+{{- with site.Params.author }}
+  {{- if reflect.IsMap . }}
+    {{- with .name }}
+      {{- $authorName = . }}
+    {{- end }}
+  {{- else }}
+    {{- $authorName  = . }}
+  {{- end }}
+{{- else }}
+  {{- with site.Author.name }}
+    {{- $authorName = . }}
+    {{- warnf "The author key in site configuration is deprecated. Use params.author.name instead." }}
+  {{- end }}
+{{- end }}
+
+{{- $pctx := . }}
+{{- if .IsHome }}{{ $pctx = site }}{{ end }}
+{{- $pages := slice }}
+{{- if or $.IsHome $.IsSection }}
+{{- $pages = $pctx.RegularPages }}
+{{- else }}
+{{- $pages = $pctx.Pages }}
+{{- end }}
+{{- $limit := site.Config.Services.RSS.Limit }}
+{{- if ge $limit 1 }}
+{{- $pages = $pages | first $limit }}
+{{- end }}
+{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
+  <channel>
+    <title>{{ if eq .Title site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ site.Title }}{{ end }}</title>
+    <link>{{ .Permalink }}</link>
+    <description>Recent content {{ if ne .Title site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ site.Title }}</description>
+    {{- with site.Params.images }}
+    <image>
+      <title>{{ site.Title }}</title>
+      <url>{{ index . 0 | absURL }}</url>
+      <link>{{ index . 0 | absURL }}</link>
+    </image>
+    {{- end }}
+    <generator>Hugo -- {{ hugo.Version }}</generator>
+    <language>{{ site.Language.LanguageCode }}</language>{{ with $authorEmail }}
+    <managingEditor>{{.}}{{ with $authorName }} ({{ . }}){{ end }}</managingEditor>{{ end }}{{ with $authorEmail }}
+    <webMaster>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</webMaster>{{ end }}{{ with site.Copyright }}
+    <copyright>{{ . | markdownify | plainify | strings.TrimPrefix "© " }}</copyright>{{ end }}{{ if not .Date.IsZero }}
+    <lastBuildDate>{{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
+    {{- with .OutputFormats.Get "RSS" }}
+    {{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
+    {{- end }}
+    {{- range $pages }}
+    {{- if and (ne .Layout `search`) (ne .Layout `archives`) }}
+    <item>
+      <title>{{ .Title }}</title>
+      <link>{{ .Permalink }}</link>
+      <pubDate>{{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
+      {{- with $authorEmail }}<author>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</author>{{ end }}
+      {{ if .Params.GUID }} <guid isPermaLink="false">{{ .Params.guid }}</guid> {{ else }} <guid isPermaLink="false">{{ .Permalink }}</guid> {{ end }}
+      <description>{{ with .Description | html }}{{ . }}{{ else }}{{ .Summary | html }}{{ end -}}</description>
+      {{- if and site.Params.ShowFullTextinRSS .Content }}
+      <content:encoded>{{ (printf "<![CDATA[%s]]>" .Content) | safeHTML }}</content:encoded>
+      {{- end }}
+    </item>
+    {{- end }}
+    {{- end }}
+  </channel>
+</rss>
diff --git a/layouts/shortcodes/audio.html b/layouts/shortcodes/audio.html
new file mode 100644 (file)
index 0000000..90cd060
--- /dev/null
@@ -0,0 +1,5 @@
+
+<audio controls preload="metadata">
+  <source src="{{ .Get "src" }}" type="audio/{{ replace (path.Ext (.Get "src")) "." ""}}">
+  Your browser does not support the audio element.
+</audio>
diff --git a/layouts/shortcodes/catlist.html b/layouts/shortcodes/catlist.html
new file mode 100644 (file)
index 0000000..90c5da8
--- /dev/null
@@ -0,0 +1,24 @@
+{{ $category := .Get "category" }}
+{{ $catLink := .Get "catlink" | default true }}
+{{ $count := .Get "count" | default 5 }}
+
+{{ $p := site.AllPages }}
+{{ $p = where $p "Params.category" "intersect" (slice $category) }}
+
+{{ $categoryTitle := title $category }}
+{{ $categoryTitle = strings.Replace $categoryTitle "-" " " }}
+
+<h3>
+  {{ if $catLink }}
+    <a href="/category/{{ urlquery $category }}"> {{$categoryTitle }} </a>
+  {{ else }}
+    {{ $categoryTitle }}
+  {{ end }}
+
+</h3>
+<ul>
+  {{ range first $count $p}}
+      <li><a href="{{ .RelPermalink }}">{{ .Title }}</a>
+      </li>
+  {{ end }}
+</ul>
diff --git a/layouts/shortcodes/gallery.html b/layouts/shortcodes/gallery.html
new file mode 100644 (file)
index 0000000..69be59a
--- /dev/null
@@ -0,0 +1,5 @@
+
+{{ $p := .Page }}
+<div class="gallery gallery-cols-{{ .Get "cols" | default 1 }}">
+{{- print .Inner | $p.RenderString  -}}
+</div>
diff --git a/layouts/shortcodes/googlemaps.html b/layouts/shortcodes/googlemaps.html
new file mode 100644 (file)
index 0000000..c37c434
--- /dev/null
@@ -0,0 +1,5 @@
+<iframe loading="lazy"
+        src="https://www.google.com/maps/d/embed?mid={{ .Get "src" }}"
+        width="{{ .Get "width" }}"
+        height="{{ .Get "height" }}">
+</iframe>
diff --git a/layouts/shortcodes/parallaxblur.html b/layouts/shortcodes/parallaxblur.html
new file mode 100644 (file)
index 0000000..7f1ef90
--- /dev/null
@@ -0,0 +1,61 @@
+{{ $imgURL := .Get "src" }}
+{{ $id := substr (md5 .Inner) 0 16 }}
+
+<style>
+#div-{{$id}} {
+    position: relative; /* Allows layering elements */
+    height: auto; /* Adjust height as needed */
+}
+
+#div-{{$id}}:after {
+    content: "";
+    position: absolute; /* Overlays content */
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    background-image: url("{{ $imgURL }}");
+    background-attachment: fixed;
+    background-size: cover;
+    background-position: center;
+    filter: blur(0px); /* Initial blur */
+    transition: filter 0.5s ease; /* Smooth transition */
+}
+
+#div-{{$id}} p {
+    text-align: center;
+}
+
+
+#div-{{$id}} a {
+    color: white; /* Adjust text color for contrast */
+    text-align: center;
+    text-shadow: 0 3px 0 gray;
+    position: relative; /* Allows text to stay above blur */
+    z-index: 1; /* Ensures text is on top of blurred background */
+    backdrop-filter: blur(5px); /* Amount of blur on text */
+    padding: 0.5rem;
+}
+
+#div-{{$id}} a:link,a:visited,a:hover,a:active {
+   text-decoration: none !important;
+   text-decoration-style: unset !important;
+   text-decoration-thickness: 0 !important;
+}
+
+/* Increase blur on scroll */
+#div-{{$id}}:after {
+    opacity: 0.8; /* Semi-transparent background */
+}
+
+#div-{{$id}}:hover:after,
+#div-{{$id}}:active:after,
+#div-{{$id}}:focus:after,
+#div-{{$id}}:target:after {
+    filter: blur(10px); /* Amount of blur on interaction */
+}
+</style>
+
+<div class="container" id="div-{{ $id }}">
+    {{ .Inner | markdownify }}
+</div>
index 03579c5ac87c0f56820a20a06e772b11bd24bfdc..1adfae0d9a697e46930e94c840120386409d96f0 100644 (file)
@@ -5,14 +5,94 @@ server {
 
     index index.html index.htm;
 
-    root /usr/share/nginx/html/generated-2025-11-21-17-29-08/public;
+    root /usr/share/nginx/html/public;
 
     location / {
         expires 0;
-    }
-    location /projects/ {
-        alias /usr/share/nginx/html/projects/;
-        expires 0;
+
+        # Add rules like this
+        # if ($query_string = "p=2") {
+        #    return 302 /about/;
+        # }
+        
+        if ($query_string = "p=64") { return 302 /hibernate4-maven-plugin-1-0-1-released/; }
+        if ($query_string = "p=711") { return 302 /release-of-a-maven-plugin-to-maven-central-fails-with-error-unknown-tag-goal/; }
+        if ($query_string = "p=1037") { return 302 /how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/; }
+        if ($query_string = "page_id=271") { return 302 /; }
+        if ($query_string = "p=11") { return 302 /; }
+        if ($query_string = "p=302") { return 302 /aspectj-maven-plugin-can-not-compile-valid-java-7-0-code/; }
+        if ($query_string = "p=306") { return 302 /running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/; }
+        if ($query_string = "p=348") { return 302 /hibernate4-maven-plugin-1-1-0-released/; }
+        if ($query_string = "p=694") { return 302 /develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire/; }
+        if ($query_string = "p=858") { return 302 /; }
+        if ($query_string = "p=1006") { return 302 /; }
+        if ($query_string = "p=140") { return 302 /combining-jetty-maven-plugin-and-wro4j-maven-plugin-for-dynamic-reloading-of-less-resources/; }
+        if ($query_string = "p=209") { return 302 /configure-https-for-jetty-maven-plugin-9-0-x/; }
+        if ($query_string = "p=721") { return 302 /hibernate-maven-plugin-2-0-0-released/; }
+        if ($query_string = "p=1147") { return 302 /deduplicating-partitioned-data-with-kafka-streams/; }
+        if ($query_string = "p=266") { return 302 /; }
+        if ($query_string = "p=530") { return 302 /; }
+        if ($query_string = "p=558") { return 302 /develop-a-facebook-app-with-spring-social-part-00/; }
+        if ($query_string = "p=856") { return 302 /; }
+        if ($query_string = "p=55") { return 302 /hibernate4-maven-plugin-1-0-released/; }
+        if ($query_string = "p=90") { return 302 /bidirectional-association-with-elementcollection/; }
+        if ($query_string = "p=1064") { return 302 /howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker/; }
+        if ($query_string = "p=835") { return 302 /; }
+        if ($query_string = "p=550") { return 302 /; }
+        if ($query_string = "p=1225") { return 302 /; }
+        if ($query_string = "p=288") { return 302 /hibernate4-maven-plugin-1-0-4-released/; }
+        if ($query_string = "p=326") { return 302 /logging-request-and-response-data-from-requets-made-through-resttemplate/; }
+        if ($query_string = "p=500") { return 302 /serve-static-html-with-nodjs-and-grunt/; }
+        if ($query_string = "p=509") { return 302 /integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project/; }
+        if ($query_string = "p=881") { return 302 /encrypt-communication-between-kafka-and-zookeeper-with-tls/; }
+        if ($query_string = "p=1116") { return 302 /; }
+        if ($query_string = "p=114") { return 302 /hibernate4-maven-plugin-1-0-3-released/; }
+        if ($query_string = "p=481") { return 302 /bypassing-the-same-origin-policiy-for-loal-files-during-development/; }
+        if ($query_string = "p=735") { return 302 /problems-deploying-a-spring-boot-app-as-war/; }
+        if ($query_string = "p=1185") { return 302 /how-to-instantiatiate-multiple-beans-dinamically-in-spring-boot-based-on-configuration-properties/; }
+        if ($query_string = "p=203") { return 302 /; }
+        if ($query_string = "p=1011") { return 302 /; }
+        if ($query_string = "p=357") { return 302 /a-perfect-outline/; }
+        if ($query_string = "p=592") { return 302 /develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works/; }
+        if ($query_string = "p=754") { return 302 /show-spring-boot-auto-configuration-report-when-running-via-mvn-spring-boot-run/; }
+        if ($query_string = "p=831") { return 302 /; }
+        if ($query_string = "p=532") { return 302 /; }
+        if ($query_string = "p=1009") { return 302 /; }
+        if ($query_string = "p=1013") { return 302 /; }
+        if ($query_string = "p=1257") { return 302 /; }
+        if ($query_string = "p=644") { return 302 /develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic/; }
+        if ($query_string = "p=671") { return 302 /develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page/; }
+        if ($query_string = "p=543") { return 302 /fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/; }
+        if ($query_string = "p=97") { return 302 /log-out-from-wrong-account-with-maven-appengine-plugin/; }
+        if ($query_string = "p=186") { return 302 /rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/; }
+        if ($query_string = "p=275") { return 302 /der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen/; }
+        if ($query_string = "p=579") { return 302 /develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes/; }
+        if ($query_string = "p=613") { return 302 /develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source/; }
+        if ($query_string = "p=1019") { return 302 /compare-two-files-in-different-branches-with-git/; }
+        if ($query_string = "p=1025") { return 302 /cat-any-file-in-any-commit-with-git/; }
+        if ($query_string = "p=1130") { return 302 /using-jackson-without-annotations-to-quickly-add-logging-of-object-graphs-as-json/; }
+        if ($query_string = "p=283") { return 302 /; }
+        if ($query_string = "p=255") { return 302 /disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/; }
+        if ($query_string = "p=970") { return 302 /actuator-httptrace-does-not-work-with-spring-boot-2-2/; }
+        if ($query_string = "p=291") { return 302 /changes-in-log4j-properties-are-ignored-when-running-sl4fj-under-tomcat/; }
+        if ($query_string = "p=339") { return 302 /replace-text-by-graphic-without-extra-markup/; }
+        if ($query_string = "p=462") { return 302 /configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login/; }
+        if ($query_string = "p=626") { return 302 /develop-a-facebook-app-with-spring-social-part-04-signing-in-users/; }
+        if ($query_string = "p=762") { return 302 /xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace/; }
+        if ($query_string = "p=887") { return 302 /create-self-signed-multi-domain-san-certificates/; }
+        if ($query_string = "p=1133") { return 302 /testing-exception-handling-in-spring-mvc/; }
+        if ($query_string = "p=1201") { return 302 /implementing-the-outbox-pattern-with-kafka-part-0-the-example/; }
+        if ($query_string = "p=554") { return 302 /how-to-keep-the-time-zone-when-deserializing-a-zoneddatetime-with-jackson/; }
+        if ($query_string = "p=535") { return 302 /java-lang-exception-method-xzy-should-have-no-parameters/; }
+        if ($query_string = "p=1209") { return 302 /implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table/; }
+        if ($query_string = "page_id=111") { return 302 /projects/; }
+        if ($query_string = "p=75") { return 302 /hibernate4-maven-plugin-1-0-2-release/; }
+        if ($query_string = "p=971") { return 302 /; }
+        if ($query_string = "p=34") { return 302 /hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/; }
+        if ($query_string = "p=1034") { return 302 /; }
+        if ($query_string = "p=319") { return 302 /hibernate4-maven-plugin-1-0-5-released/; }
+        if ($query_string = "page_id=108") { return 302 /blog/; }
+        if ($query_string = "p=1004") { return 302 /; }
     }
     location /hibernate-maven-plugin/ {
         alias /usr/share/nginx/html/hibernate-maven-plugin/;
diff --git a/static/wp-uploads/2014/02/hama_00054807_stock_recovery.jpg b/static/wp-uploads/2014/02/hama_00054807_stock_recovery.jpg
new file mode 100644 (file)
index 0000000..20db95c
Binary files /dev/null and b/static/wp-uploads/2014/02/hama_00054807_stock_recovery.jpg differ
diff --git a/static/wp-uploads/2014/02/jetty-http.xml b/static/wp-uploads/2014/02/jetty-http.xml
new file mode 100644 (file)
index 0000000..7b742cc
--- /dev/null
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!-- ============================================================= -->
+<!-- Configure the Jetty Server instance with an ID "Server"       -->
+<!-- by adding a HTTP connector.                                   -->
+<!-- This configuration must be used in conjunction with jetty.xml -->
+<!-- ============================================================= -->
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+  <!-- =========================================================== -->
+  <!-- Add a HTTP Connector.                                       -->
+  <!-- Configure an o.e.j.server.ServerConnector with a single     -->
+  <!-- HttpConnectionFactory instance using the common httpConfig  -->
+  <!-- instance defined in jetty.xml                               -->
+  <!--                                                             -->
+  <!-- Consult the javadoc of o.e.j.server.ServerConnector and     -->
+  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
+  <!-- that may be set here.                                       -->
+  <!-- =========================================================== -->
+  <Call name="addConnector">
+    <Arg>
+      <New class="org.eclipse.jetty.server.ServerConnector">
+        <Arg name="server"><Ref refid="Server" /></Arg>
+        <Arg name="factories">
+          <Array type="org.eclipse.jetty.server.ConnectionFactory">
+            <Item>
+              <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+                <Arg name="config"><Ref refid="httpConfig" /></Arg>
+              </New>
+            </Item>
+          </Array>
+        </Arg>
+        <Set name="host"><Property name="jetty.host" /></Set>
+        <Set name="port"><Property name="jetty.port" default="8080" /></Set>
+        <Set name="idleTimeout"><Property name="http.timeout" default="30000"/></Set>
+      </New>
+    </Arg>
+  </Call>
+</Configure>
diff --git a/static/wp-uploads/2014/02/jetty-https.xml b/static/wp-uploads/2014/02/jetty-https.xml
new file mode 100644 (file)
index 0000000..9d11217
--- /dev/null
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!-- ============================================================= -->
+<!-- Configure a HTTPS connector.                                  -->
+<!-- This configuration must be used in conjunction with jetty.xml -->
+<!-- and jetty-ssl.xml.                                            -->
+<!-- ============================================================= -->
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+  <!-- =========================================================== -->
+  <!-- Add a HTTPS Connector.                                      -->
+  <!-- Configure an o.e.j.server.ServerConnector with connection   -->
+  <!-- factories for TLS (aka SSL) and HTTP to provide HTTPS.      -->
+  <!-- All accepted TLS connections are wired to a HTTP connection.-->
+  <!--                                                             -->
+  <!-- Consult the javadoc of o.e.j.server.ServerConnector,        -->
+  <!-- o.e.j.server.SslConnectionFactory and                       -->
+  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
+  <!-- that may be set here.                                       -->
+  <!-- =========================================================== -->
+  <Call id="httpsConnector" name="addConnector">
+    <Arg>
+      <New class="org.eclipse.jetty.server.ServerConnector">
+        <Arg name="server"><Ref refid="Server" /></Arg>
+          <Arg name="factories">
+            <Array type="org.eclipse.jetty.server.ConnectionFactory">
+              <Item>
+                <New class="org.eclipse.jetty.server.SslConnectionFactory">
+                  <Arg name="next">http/1.1</Arg>
+                  <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg>
+                </New>
+              </Item>
+              <Item>
+                <New class="org.eclipse.jetty.server.HttpConnectionFactory">
+                  <Arg name="config"><Ref refid="sslHttpConfig"/></Arg>
+                </New>
+              </Item>
+            </Array>
+          </Arg>
+          <Set name="host"><Property name="jetty.host" /></Set>
+          <Set name="port"><Property name="https.port" default="8443" /></Set>
+          <Set name="idleTimeout"><Property name="https.timeout" default="30000"/></Set>
+        </New>
+    </Arg>
+  </Call>
+</Configure>
diff --git a/static/wp-uploads/2014/02/jetty-ssl.xml b/static/wp-uploads/2014/02/jetty-ssl.xml
new file mode 100644 (file)
index 0000000..760b9ba
--- /dev/null
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!-- ============================================================= -->
+<!-- Configure a TLS (SSL) Context Factory                         -->
+<!-- This configuration must be used in conjunction with jetty.xml -->
+<!-- and either jetty-https.xml or jetty-spdy.xml (but not both)   -->
+<!-- ============================================================= -->
+<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
+  <Set name="KeyStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.keystore" default="src/test/resources/jetty.keystore"/></Set>
+  <Set name="KeyStorePassword"><Property name="jetty.keystore.password" default="secret"/></Set>
+  <Set name="KeyManagerPassword"><Property name="jetty.keymanager.password" default="secret"/></Set>
+  <Set name="TrustStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.truststore" default="src/test/resources/jetty.keystore"/></Set>
+  <Set name="TrustStorePassword"><Property name="jetty.truststore.password" default="secret"/></Set>
+  <Set name="EndpointIdentificationAlgorithm"></Set>
+  <Set name="ExcludeCipherSuites">
+    <Array type="String">
+      <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
+      <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
+      <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
+      <Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
+      <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
+      <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
+      <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
+    </Array>
+  </Set>
+  <!-- =========================================================== -->
+  <!-- Create a TLS specific HttpConfiguration based on the        -->
+  <!-- common HttpConfiguration defined in jetty.xml               -->
+  <!-- Add a SecureRequestCustomizer to extract certificate and    -->
+  <!-- session information                                         -->
+  <!-- =========================================================== -->
+  <New id="sslHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
+    <Arg><Ref refid="httpConfig"/></Arg>
+    <Call name="addCustomizer">
+      <Arg><New class="org.eclipse.jetty.server.SecureRequestCustomizer"/></Arg>
+    </Call>
+  </New>
+</Configure>
diff --git a/static/wp-uploads/2014/02/jetty.keystore b/static/wp-uploads/2014/02/jetty.keystore
new file mode 100644 (file)
index 0000000..75b82ef
Binary files /dev/null and b/static/wp-uploads/2014/02/jetty.keystore differ
diff --git a/static/wp-uploads/2014/02/jetty.xml b/static/wp-uploads/2014/02/jetty.xml
new file mode 100644 (file)
index 0000000..cd8962d
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
+<!-- ============================================================= -->
+<!-- Configure the Http Configuration                              -->
+<!-- ============================================================= -->
+<Configure id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
+  <Set name="secureScheme">https</Set>
+  <Set name="securePort"><Property name="jetty.secure.port" default="8443" /></Set>
+  <Set name="outputBufferSize">32768</Set>
+  <Set name="requestHeaderSize">8192</Set>
+  <Set name="responseHeaderSize">8192</Set>
+  <Set name="sendServerVersion">true</Set>
+  <Set name="sendDateHeader">false</Set>
+  <Set name="headerCacheSize">512</Set>
+  <!-- Uncomment to enable handling of X-Forwarded- style headers
+  <Call name="addCustomizer">
+    <Arg><New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/></Arg>
+  </Call>
+  -->
+</Configure>
diff --git a/static/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png b/static/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png
new file mode 100644 (file)
index 0000000..b466500
Binary files /dev/null and b/static/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png differ
diff --git a/static/wp-uploads/2015/05/replace-1.html b/static/wp-uploads/2015/05/replace-1.html
new file mode 100644 (file)
index 0000000..d55a96c
--- /dev/null
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <title>Example how to replace text by a graphic</title>
+
+  <style type="text/css">
+    h1
+    {
+      text-indent: -99em;
+      line-height: 0;
+    }
+    h1:after
+    {
+      display: block;
+      text-indent: 0;
+      content: "blub";
+    }
+  </style>
+</head>
+
+  <body>
+    <h1>Bla</h1>
+  </body>
+
+</html>
diff --git a/static/wp-uploads/2015/05/replace-2.html b/static/wp-uploads/2015/05/replace-2.html
new file mode 100644 (file)
index 0000000..fafe0fd
--- /dev/null
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+
+  <title>Example how to replace text by a graphic</title>
+
+  <style type="text/css">
+    h1
+    {
+      text-indent: -99em;
+      line-height: 0;
+    }
+    h1:after
+    {
+      display: block;
+      text-indent: 0;
+      content: url("data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMzAuNiIgaGVpZ2h0PSI3MC42IiB2ZXJzaW9uPSIxLjEiPjxzdHlsZT4uczB7ZmlsbDpub25lO308L3N0eWxlPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKC05NS4wNDkyMTUsLTM3OS45MDg3OSkiPjx0ZXh0IHhtbDpzcGFjZT0icHJlc2VydmUiIHg9IjMwNC4xIiB5PSI1OTguOCIgc3R5bGU9ImZpbGw6IzAwMDtmb250LWZhbWlseTpTYW5zO2ZvbnQtc2l6ZTo0MDtsZXR0ZXItc3BhY2luZzowO2xpbmUtaGVpZ2h0OjEyNTt3b3JkLXNwYWNpbmc6MCI+PHRzcGFuIHg9IjMwNC4xIiB5PSI1OTguOCIvPjwvdGV4dD48cGF0aCBkPSJtOTUgMzc5LjljMCAyNS41IDAgNDggMCA3MC42IDQ1LjkgMCA5MC4xIDAgMTMwLjYgMCAwLTIxLjggMC00My41IDAtNjUuM2wwLTUuM2MtNDQuOSAwLTg5IDAtMTMwLjYgMHptMTguMiAxMC42IDM0LjMgMC0xNy4yIDE3LjJ6bTUyLjUgMCA0OS40IDAgMCA0OS40LTQ5LjQgMHptMjQuNyA2Yy0xMC4zIDAtMTguNyA4LjQtMTguNyAxOC43IDAgMTAuMyA4LjQgMTguNyAxOC43IDE4LjcgMTAuMyAwIDE4LjctOC40IDE4LjctMTguNyAwLTEwLjMtOC40LTE4LjctMTguNy0xOC43em0tODQuNyAxLjVjOC4yIDguMiAxNi41IDE2LjUgMjQuNyAyNC43IDguMi04LjIgMTYuNS0xNi41IDI0LjctMjQuN2wwIDQxLjktNDkuNCAwem04NC43IDkuMWM0LjUgMCA4LjEgMy42IDguMSA4LjEgMCA0LjUtMy41IDguMS04LjEgOC4xLTQuNSAwLTguMS0zLjUtOC4xLTguMSAwLTQuNSAzLjUtOC4xIDguMS04LjF6IiBzdHlsZT0iLWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpTYW5zO2Jhc2VsaW5lLXNoaWZ0OmJhc2VsaW5lO2Jsb2NrLXByb2dyZXNzaW9uOnRiO2RpcmVjdGlvbjpsdHI7ZmlsbDojMDAwO2ZvbnQtZmFtaWx5OlNhbnM7Zm9udC1zaXplOm1lZGl1bTtsZXR0ZXItc3BhY2luZzpub3JtYWw7bGluZS1oZWlnaHQ6bm9ybWFsO3RleHQtYWxpZ246c3RhcnQ7dGV4dC1hbmNob3I6c3RhcnQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dGV4dC1pbmRlbnQ6MDt0ZXh0LXRyYW5zZm9ybTpub25lO3dvcmQtc3BhY2luZzpub3JtYWw7d3JpdGluZy1tb2RlOmxyLXRiIi8+PHJlY3Qgd2lkdGg9IjEzMC42IiBoZWlnaHQ9IjcwLjYiIHg9Ijk1IiB5PSIzNzkuOSIgZmlsbD0ibm9uZSIvPjxyZWN0IHdpZHRoPSI1LjciIGhlaWdodD0iNzcuNSIgeD0iMTYwIiB5PSIzNjIuNCIgZmlsbD0ibm9uZSIvPjxyZWN0IHdpZHRoPSI2NS43IiBoZWlnaHQ9IjE3LjUiIHg9IjE2MCIgeT0iMzYyLjQiIGZpbGw9Im5vbmUiLz48L2c+PC9zdmc+");
+    }
+  </style>
+</head>
+
+  <body>
+    <h1>mo</h1>
+  </body>
+
+</html>
diff --git a/static/wp-uploads/2015/06/example-01.html b/static/wp-uploads/2015/06/example-01.html
new file mode 100644 (file)
index 0000000..9a4e40c
--- /dev/null
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<title>Example 01</title>
+<header>
+  <h2>Header</h2>
+  <nav>Navigation</nav>
+</header>
+<main>
+  <h1>Main</h1>
+  <section>
+    <h2>Section I</h2>
+  </section>
+  <section>
+    <h2>Section II</h2>
+    <section>
+      <h3>Subsection a</h3>
+    </section>
+    <section>
+      <h3>Subsection b</h3>
+    </section>
+  </section>
+  <section>
+    <h2>Section III</h2>
+    <section>
+      <h3>Subsection a</h3>
+    </section>
+  </section>
+</main>
+<aside>
+  <h1>Aside</h1>
+</aside>
+<footer>
+  <h2>Footer</h2>
+</footer>
diff --git a/static/wp-uploads/2015/06/example-02.html b/static/wp-uploads/2015/06/example-02.html
new file mode 100644 (file)
index 0000000..b403e3f
--- /dev/null
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<title>Example 02</title>
+<header>
+  <h2>Header</h2>
+  <nav>
+    <header><h3>Navigation</h3></header>
+  </nav>
+</header>
+<main>
+  <header><h1>Main</h1></header>
+  <section>
+    <header><h2>Section I</h2></header>
+  </section>
+  <section>
+    <header><h2>Section II</h2></header>
+    <section>
+      <header><h3>Subsection a</h3></header>
+    </section>
+    <section>
+      <header><h3>Subsection b</h3></header>
+    </section>
+  </section>
+  <section>
+    <header><h2>Section III</h2></header>
+    <section>
+      <header><h3>Subsection a</h3></header>
+    </section>
+  </section>
+</main>
+<aside>
+  <header><h1>Aside</h1></header>
+</aside>
+<footer>
+  <header><h2>Footer</h2></header>
+</footer>
diff --git a/static/wp-uploads/2015/06/example-03.html b/static/wp-uploads/2015/06/example-03.html
new file mode 100644 (file)
index 0000000..c19622b
--- /dev/null
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<title>Example 03</title>
+<header>
+  <h2>Header</h2>
+  <nav>
+    <header><h3>Navigation</h333></header>
+  </nav>
+</header>
+<article>
+  <header><h1>Article (Main)</h1></header>
+  <section>
+    <header><h2>Section I</h2></header>
+  </section>
+  <section>
+    <header><h2>Section II</h2></header>
+    <section>
+      <header><h3>Subsection a</h3></header>
+    </section>
+    <section>
+      <header><h3>Subsection b</h3></header>
+    </section>
+  </section>
+  <section>
+    <header><h2>Section III</h2></header>
+    <section>
+      <header><h3>Subsection a</h3></header>
+    </section>
+  </section>
+</article>
+<aside>
+  <header><h1>Aside</h1></header>
+</aside>
+<footer>
+  <header><h2>Footer</h2></header>
+</footer>
diff --git a/static/wp-uploads/2015/06/example-04.html b/static/wp-uploads/2015/06/example-04.html
new file mode 100644 (file)
index 0000000..2bcc8ca
--- /dev/null
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<title>Example 04</title>
+<article>
+  Main
+  <section>
+    Section I
+  </section>
+  <section>
+    Section II
+    <section>
+      Subsection a
+    </section>
+    <section>
+      Subsection b
+    </section>
+  </section>
+  <section>
+    Section III
+    <section>
+      Subsection a
+    </section>
+  </section>
+</main>
diff --git a/static/wp-uploads/2015/06/example-05.html b/static/wp-uploads/2015/06/example-05.html
new file mode 100644 (file)
index 0000000..03333d8
--- /dev/null
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<title>Example 05</title>
+<h1>Page</h1>
+<article>
+  <h1>Article</h1>
+  <section>
+    <h1>Section I</h1>
+  </section>
+  <section>
+    <h1>Section II</h1>
+    <section>
+      <h1>Subsection a</h1>
+    </section>
+    <section>
+      <h1>Subsection b</h1>
+    </section>
+  </section>
+  <section>
+    <h1>Section III</h1>
+    <section>
+      <h1>Subsection a</h1>
+    </section>
+  </section>
+</article>
diff --git a/static/wp-uploads/2015/06/example-06.html b/static/wp-uploads/2015/06/example-06.html
new file mode 100644 (file)
index 0000000..39d2775
--- /dev/null
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<title>Example 06</title>
+<header>Page</header>
+<main>Main</main>
+<footer>Footer</footer>
diff --git a/static/wp-uploads/2015/06/example-07.html b/static/wp-uploads/2015/06/example-07.html
new file mode 100644 (file)
index 0000000..ca18ec1
--- /dev/null
@@ -0,0 +1,5 @@
+<!DOCTYPE html>
+<title>Example 07</title>
+<header><h2>Page</h2></header>
+<main><h1>Main</h1></main>
+<footer><h3>Footer</h3></footer>
diff --git a/static/wp-uploads/2015/06/example-08.html b/static/wp-uploads/2015/06/example-08.html
new file mode 100644 (file)
index 0000000..39bb0a9
--- /dev/null
@@ -0,0 +1,9 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+  <head><title>Example 08</title></head>
+  <body>
+    <div class="header"><h2>Page</h2></div>
+    <div class="main"><h1>Main</h1></div>
+    <div class="footer"><h3>Footer</h3></div>
+  </body>
+</html>
diff --git a/static/wp-uploads/2015/06/example-09.html b/static/wp-uploads/2015/06/example-09.html
new file mode 100644 (file)
index 0000000..5b90f0d
--- /dev/null
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<title>Example 09</title>
+<h4>h4</h4>
+<h2>h2</h2>
+<h4>h4</h4>
+<h3>h3</h3>
+<h2>h2</h2>
+<h1>h1</h1>
+<h2>h2</h2>
+<h3>h3</h3>
diff --git a/static/wp-uploads/2015/06/example-10.html b/static/wp-uploads/2015/06/example-10.html
new file mode 100644 (file)
index 0000000..097d9d5
--- /dev/null
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<title>Example 10</title>
+<header>
+  <section>
+    <h2>Header</h2>
+  </section>
+</header>
+<main>
+  <article>
+    <h1>Main</h1>
+    <section>
+      <h2>Section I</h2>
+    </section>
+    <section>
+      <h2>Section II</h2>
+      <section>
+        <h3>Subsection a</h3>
+      </section>
+      <section>
+        <h3>Subsection b</h3>
+      </section>
+    </section>
+    <section>
+      <h2>Section III</h2>
+      <section>
+        <h3>Subsection a</h3>
+      </section>
+    </section>
+  </article>
+</main>
+<footer>
+  <section>
+    <h3>Footer</h3>
+  </section>
+</footer>
diff --git a/static/wp-uploads/2015/06/example-11.html b/static/wp-uploads/2015/06/example-11.html
new file mode 100644 (file)
index 0000000..929d5c0
--- /dev/null
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<title>Example 11</title>
+<header>
+  <h2>Page</h2>
+  <section>
+    <h3>Header</h3>
+  </section>
+</header>
+<main>
+  <article>
+    <h1>Main</h1>
+    <section>
+      <h2>Section I</h2>
+    </section>
+    <section>
+      <h2>Section II</h2>
+      <section>
+        <h3>Subsection a</h3>
+      </section>
+      <section>
+        <h3>Subsection b</h3>
+      </section>
+    </section>
+    <section>
+      <h2>Section III</h2>
+      <section>
+        <h3>Subsection a</h3>
+      </section>
+    </section>
+  </article>
+</main>
+<footer>
+  <section>
+    <h3>Footer</h3>
+  </section>
+</footer>
diff --git a/static/wp-uploads/2015/06/example-12.html b/static/wp-uploads/2015/06/example-12.html
new file mode 100644 (file)
index 0000000..4b1ccd4
--- /dev/null
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Example 12</title>
+<header>
+  <h1>Page</h1>
+  <nav><h1>Navigation</h1></nav>
+</header>
+<main><h1>Main</h1></main>
+<aside><h1>Aside</h1></aside>
+<footer><h1>Footer</h1></footer>
diff --git a/static/wp-uploads/2015/06/example-13.html b/static/wp-uploads/2015/06/example-13.html
new file mode 100644 (file)
index 0000000..ac8209e
--- /dev/null
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<title>Example 13</title>
+<header>
+  Page
+  <nav>Navigation</nav>
+</header>
+<main>Main</main>
+<aside>Aside</aside>
+<footer>Footer</footer>
diff --git a/static/wp-uploads/2015/06/example-14.html b/static/wp-uploads/2015/06/example-14.html
new file mode 100644 (file)
index 0000000..d3c1a28
--- /dev/null
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<title>Example 14</title>
+<header>
+  <h2>Page</h2>
+  <section>
+    <h3>Header</h3>
+    <nav><h4>Navigation</h4></nav>
+  </section>
+</header>
+<main>
+  <article>
+    <h1>Main</h1>
+    <section>
+      <h2>Section I</h2>
+    </section>
+    <section>
+      <h2>Section II</h2>
+      <section>
+        <h3>Subsection a</h3>
+      </section>
+      <section>
+        <h3>Subsection b</h3>
+      </section>
+    </section>
+    <section>
+      <h2>Section III</h2>
+      <section>
+        <h3>Subsection a</h3>
+      </section>
+    </section>
+  </article>
+</main>
+<aside><h3>Aside</h3></aside>
+<footer>
+  <section>
+    <h3>Footer</h3>
+  </section>
+</footer>
diff --git a/static/wp-uploads/2020/03/github-example.jpg b/static/wp-uploads/2020/03/github-example.jpg
new file mode 100644 (file)
index 0000000..36ed859
Binary files /dev/null and b/static/wp-uploads/2020/03/github-example.jpg differ
diff --git a/static/wp-uploads/2020/03/real-life-meme.png b/static/wp-uploads/2020/03/real-life-meme.png
new file mode 100644 (file)
index 0000000..7bb414d
Binary files /dev/null and b/static/wp-uploads/2020/03/real-life-meme.png differ
diff --git a/static/wp-uploads/2021/02/outbox-pattern-sending-order.png b/static/wp-uploads/2021/02/outbox-pattern-sending-order.png
new file mode 100644 (file)
index 0000000..5e55c73
Binary files /dev/null and b/static/wp-uploads/2021/02/outbox-pattern-sending-order.png differ
diff --git a/static/wp-uploads/selfsigned+san/create-ca.sh b/static/wp-uploads/selfsigned+san/create-ca.sh
new file mode 100755 (executable)
index 0000000..8f2eaaf
--- /dev/null
@@ -0,0 +1,39 @@
+#!/bin/bash
+#
+# Example-script to show, how to set up a self-signed CA
+#
+# Usage:
+# ./create-ca.sh PASSWORD VALIDITY
+
+. settings.conf
+
+if [ -z "$1" ]
+then
+  PASSWORD=$DEFAULT_PASSWORD
+else
+  PASSWORD="$1"
+fi
+
+if [ -z "$2" ]
+then
+  VALIDITY=$DEFAULT_VALIDITY
+else
+  VALIDITY="$2"
+fi
+
+if [ -a ca-cert ]
+then
+  echo "The root-certificate for the CA already exists..."
+else
+  echo "Creating a x509-certificate for the CA..."
+  openssl req -new -x509 -subj "/C=$C/ST=$ST/L=$L/O=$O/OU=$OU/CN=Root-CA" -keyout ca-key -out ca-cert -days $VALIDITY -passout pass:$PASSWORD
+fi
+#
+
+if [ -a truststore.p12 ]
+then
+  echo "The keystore truststore.jks already exists!"
+else
+  echo "Importing the root-certificate of the CA into truststore.jks..."
+  keytool -keystore truststore.p12 -storetype pkcs12 -storepass $PASSWORD -alias CARoot -import -file ca-cert -noprompt
+fi
diff --git a/static/wp-uploads/selfsigned+san/gencert.sh b/static/wp-uploads/selfsigned+san/gencert.sh
new file mode 100755 (executable)
index 0000000..a62a6d9
--- /dev/null
@@ -0,0 +1,64 @@
+#!/bin/bash
+#
+# Example-script to show, how to create and sign a selfsigned certificate, that
+# contains multiple DNS-entries (SAN-extension)
+#
+# Usage:
+# ./gencert.sh CN [CA_PASSWORD [KEYSTORE_PASSWORD [VALIDITY]]]
+
+
+. settings.conf
+
+if [ -z "$1" ];
+then
+  echo "CN must not be empty!"
+  echo "$0 CN [CA_PASSWORD [KEYSTORE_PASSWORD [VALIDITY]]]"
+  exit;
+fi
+
+if [ -a $1.p12 ];
+then
+  echo "The keystore $1.jks already exists";
+  exit;
+fi
+
+
+if [ -z "$2" ]
+then
+  CA_PASSWORD=$DEFAULT_PASSWORD
+else
+  CA_PASSWORD="$2"
+fi
+
+if [ -z "$3" ]
+then
+  KEYSTORE_PASSWORD=$DEFAULT_PASSWORD
+else
+  KEYSTORE_PASSWORD="$3"
+fi
+
+if [ -z "$4" ]
+then
+  VALIDITY=365
+else
+  VALIDITY="$4"
+fi
+
+
+echo "Creating keystore $1.jks with a certificate and a key-pair for CN $1"
+keytool -keystore $1.p12 -storetype pkcs12 -alias $1 -validity $VALIDITY -genkey -storepass $KEYSTORE_PASSWORD -dname "CN=$1,OU=$OU,O=$O,L=$L,ST=$ST,C=$C"
+
+echo "Creating a Certificate-Signing-Request for the generated certificate"
+keytool -keystore $1.p12 -storetype pkcs12 -alias $1 -certreq -file cert-file -storepass $KEYSTORE_PASSWORD
+
+echo "Signing the Certificate-Signing-Request and adding an additional DNS-entry for localhost"
+openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out $1.pem -days $VALIDITY -CAcreateserial -passin pass:$CA_PASSWORD -extensions SAN -extfile <(printf "\n[SAN]\nsubjectAltName=DNS:$1,DNS:localhost")
+
+echo "Importing the root-certificate for the CA into the keystore $1.jks"
+keytool -keystore $1.p12 -storetype pkcs12 -alias ca-root -import -file ca-cert -storepass $KEYSTORE_PASSWORD -noprompt
+
+echo "Importing the signed certificate for CN $1 into the keystore $1.jks"
+keytool -keystore $1.p12 -storetype pkcs12 -alias $1 -import -file $1.pem -storepass $KEYSTORE_PASSWORD
+
+echo "Removing obsolet files..."
+rm -v cert-file
diff --git a/static/wp-uploads/selfsigned+san/jks.txt b/static/wp-uploads/selfsigned+san/jks.txt
new file mode 100644 (file)
index 0000000..e6aa425
--- /dev/null
@@ -0,0 +1,120 @@
+Keystore-Typ: jks
+Keystore-Provider: SUN
+
+Keystore enthält 2 Einträge
+
+Aliasname: ca-root
+Erstellungsdatum: 26.06.2019
+Eintragstyp: trustedCertEntry
+
+Eigentümer: CN=Root-CA, OU=security, O=juplo, L=Juist, ST=Niedersachsen, C=DE
+Aussteller: CN=Root-CA, OU=security, O=juplo, L=Juist, ST=Niedersachsen, C=DE
+Seriennummer: 8c62092a6d59c829
+Gültig von: Wed Jun 26 10:26:50 CEST 2019 bis: Thu Jun 25 10:26:50 CEST 2020
+Zertifikatfingerprints:
+        MD5: EE:55:36:1F:19:7A:01:58:3F:54:C3:8B:BF:D9:3C:36
+        SHA1: 3B:D6:01:F1:A1:9D:B1:6E:CA:4D:E7:FA:A6:C1:A1:3A:D8:CA:FD:0C
+        SHA256: 38:5F:6E:2A:E4:25:8A:54:31:57:91:5C:34:FA:E6:9A:E0:1A:2A:27:8C:D7:E5:B0:FB:8B:D7:1A:F6:79:CC:5E
+Signaturalgorithmusname: SHA256withRSA
+Algorithmus des Public Key von Betreff: 2048-Bit-RSA-Schlüssel
+Version: 3
+
+Erweiterungen: 
+
+#1: ObjectId: 2.5.29.35 Criticality=false
+AuthorityKeyIdentifier [
+KeyIdentifier [
+0000: 9D 29 BD 63 D1 D7 C1 98   26 E4 47 3E 27 6A DE AC  .).c....&.G>'j..
+0010: ED 8A 75 2F                                        ..u/
+]
+]
+
+#2: ObjectId: 2.5.29.19 Criticality=false
+BasicConstraints:[
+  CA:true
+  PathLen:2147483647
+]
+
+#3: ObjectId: 2.5.29.14 Criticality=false
+SubjectKeyIdentifier [
+KeyIdentifier [
+0000: 9D 29 BD 63 D1 D7 C1 98   26 E4 47 3E 27 6A DE AC  .).c....&.G>'j..
+0010: ED 8A 75 2F                                        ..u/
+]
+]
+
+
+
+*******************************************
+*******************************************
+
+
+Aliasname: test
+Erstellungsdatum: 26.06.2019
+Eintragstyp: PrivateKeyEntry
+Zertifikatskettenlänge: 2
+Zertifikat[1]:
+Eigentümer: CN=test, OU=security, O=juplo, L=Juist, ST=Niedersachsen, C=DE
+Aussteller: CN=Root-CA, OU=security, O=juplo, L=Juist, ST=Niedersachsen, C=DE
+Seriennummer: b75834de7e0b9b26
+Gültig von: Wed Jun 26 10:27:23 CEST 2019 bis: Thu Jun 25 10:27:23 CEST 2020
+Zertifikatfingerprints:
+        MD5: 3F:3E:46:A4:45:28:18:3C:E4:C3:11:6B:6A:AC:88:94
+        SHA1: 24:27:02:2F:6A:68:32:EA:5F:9D:53:C5:28:65:F7:FC:6D:5D:BC:B7
+        SHA256: 7C:2B:D4:36:06:0C:69:4E:93:75:0F:F9:9C:D8:9D:DD:02:50:14:72:49:95:E3:AC:4C:B4:7A:E6:CE:9D:05:D5
+Signaturalgorithmusname: SHA256withRSA
+Algorithmus des Public Key von Betreff: 2048-Bit-DSA-Schlüssel
+Version: 3
+
+Erweiterungen: 
+
+#1: ObjectId: 2.5.29.17 Criticality=false
+SubjectAlternativeName [
+  DNSName: test
+  DNSName: localhost
+  IPAddress: 127.0.0.1
+]
+
+Zertifikat[2]:
+Eigentümer: CN=Root-CA, OU=security, O=juplo, L=Juist, ST=Niedersachsen, C=DE
+Aussteller: CN=Root-CA, OU=security, O=juplo, L=Juist, ST=Niedersachsen, C=DE
+Seriennummer: 8c62092a6d59c829
+Gültig von: Wed Jun 26 10:26:50 CEST 2019 bis: Thu Jun 25 10:26:50 CEST 2020
+Zertifikatfingerprints:
+        MD5: EE:55:36:1F:19:7A:01:58:3F:54:C3:8B:BF:D9:3C:36
+        SHA1: 3B:D6:01:F1:A1:9D:B1:6E:CA:4D:E7:FA:A6:C1:A1:3A:D8:CA:FD:0C
+        SHA256: 38:5F:6E:2A:E4:25:8A:54:31:57:91:5C:34:FA:E6:9A:E0:1A:2A:27:8C:D7:E5:B0:FB:8B:D7:1A:F6:79:CC:5E
+Signaturalgorithmusname: SHA256withRSA
+Algorithmus des Public Key von Betreff: 2048-Bit-RSA-Schlüssel
+Version: 3
+
+Erweiterungen: 
+
+#1: ObjectId: 2.5.29.35 Criticality=false
+AuthorityKeyIdentifier [
+KeyIdentifier [
+0000: 9D 29 BD 63 D1 D7 C1 98   26 E4 47 3E 27 6A DE AC  .).c....&.G>'j..
+0010: ED 8A 75 2F                                        ..u/
+]
+]
+
+#2: ObjectId: 2.5.29.19 Criticality=false
+BasicConstraints:[
+  CA:true
+  PathLen:2147483647
+]
+
+#3: ObjectId: 2.5.29.14 Criticality=false
+SubjectKeyIdentifier [
+KeyIdentifier [
+0000: 9D 29 BD 63 D1 D7 C1 98   26 E4 47 3E 27 6A DE AC  .).c....&.G>'j..
+0010: ED 8A 75 2F                                        ..u/
+]
+]
+
+
+
+*******************************************
+*******************************************
+
+
diff --git a/static/wp-uploads/selfsigned+san/pem.txt b/static/wp-uploads/selfsigned+san/pem.txt
new file mode 100644 (file)
index 0000000..b5ac413
--- /dev/null
@@ -0,0 +1,123 @@
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 13211367637093423910 (0xb75834de7e0b9b26)
+    Signature Algorithm: sha256WithRSAEncryption
+        Issuer: C=DE, ST=Niedersachsen, L=Juist, O=juplo, OU=security, CN=Root-CA
+        Validity
+            Not Before: Jun 26 08:27:23 2019 GMT
+            Not After : Jun 25 08:27:23 2020 GMT
+        Subject: C=DE, ST=Niedersachsen, L=Juist, O=juplo, OU=security, CN=test
+        Subject Public Key Info:
+            Public Key Algorithm: dsaEncryption
+                pub: 
+                    00:8d:f8:cc:68:da:ab:56:e0:30:b1:cf:68:49:6f:
+                    ff:30:ba:fe:b6:63:c7:7f:70:e4:db:f4:c1:b5:7d:
+                    90:34:58:a1:93:2a:90:cc:19:2f:eb:e8:f9:81:1d:
+                    19:a4:ad:18:23:b1:5e:94:27:a3:1d:87:60:6a:d6:
+                    44:b1:40:d2:86:e7:53:3e:95:86:ec:c6:3f:2a:f5:
+                    6a:2a:79:40:08:d9:a9:c9:04:83:3f:65:6b:81:75:
+                    5d:ec:78:3d:df:a5:0f:49:98:9a:ef:98:b3:c9:8e:
+                    61:ee:b2:c1:e5:08:4a:13:20:d6:5b:33:0e:bd:38:
+                    e5:cb:f7:dc:7c:43:bb:fc:33:a4:b0:81:8b:3c:24:
+                    10:0f:8f:d6:fe:8c:52:05:1d:07:8f:f7:06:86:e8:
+                    77:20:32:b6:ec:26:cf:19:e1:aa:48:66:ba:d4:be:
+                    8b:7d:e3:a9:3b:45:ca:fc:18:04:19:ec:53:f1:86:
+                    9b:b3:0b:c0:86:8a:ca:47:01:02:8e:ba:91:54:89:
+                    9e:43:d5:0a:73:47:31:36:39:2e:26:07:92:a7:5d:
+                    26:cd:2c:2a:b3:aa:97:d1:65:34:8f:2a:fc:1a:19:
+                    7f:03:b7:ca:88:0f:73:31:bf:0c:d1:8d:9a:3c:d7:
+                    a1:56:76:ee:f0:ad:f3:77:2f:0b:2a:d6:c9:8b:70:
+                    27:cd
+                P:   
+                    00:8f:79:35:d9:b9:aa:e9:bf:ab:ed:88:7a:cf:49:
+                    51:b6:f3:2e:c5:9e:3b:af:37:18:e8:ea:c4:96:1f:
+                    3e:fd:36:06:e7:43:51:a9:c4:18:33:39:b8:09:e7:
+                    c2:ae:1c:53:9b:a7:47:5b:85:d0:11:ad:b8:b4:79:
+                    87:75:49:84:69:5c:ac:0e:8f:14:b3:36:08:28:a2:
+                    2f:fa:27:11:0a:3d:62:a9:93:45:34:09:a0:fe:69:
+                    6c:46:58:f8:4b:dd:20:81:9c:37:09:a0:10:57:b1:
+                    95:ad:cd:00:23:3d:ba:54:84:b6:29:1f:9d:64:8e:
+                    f8:83:44:86:77:97:9c:ec:04:b4:34:a6:ac:2e:75:
+                    e9:98:5d:e2:3d:b0:29:2f:c1:11:8c:9f:fa:9d:81:
+                    81:e7:33:8d:b7:92:b7:30:d7:b9:e3:49:59:2f:68:
+                    09:98:72:15:39:15:ea:3d:6b:8b:46:53:c6:33:45:
+                    8f:80:3b:32:a4:c2:e0:f2:72:90:25:6e:4e:3f:8a:
+                    3b:08:38:a1:c4:50:e4:e1:8c:1a:29:a3:7d:df:5e:
+                    a1:43:de:4b:66:ff:04:90:3e:d5:cf:16:23:e1:58:
+                    d4:87:c6:08:e9:7f:21:1c:d8:1d:ca:23:cb:6e:38:
+                    07:65:f8:22:e3:42:be:48:4c:05:76:39:39:60:1c:
+                    d6:67
+                Q:   
+                    00:ba:f6:96:a6:85:78:f7:df:de:e7:fa:67:c9:77:
+                    c7:85:ef:32:b2:33:ba:e5:80:c0:bc:d5:69:5d
+                G:   
+                    16:a6:5c:58:20:48:50:70:4e:75:02:a3:97:57:04:
+                    0d:34:da:3a:34:78:c1:54:d4:e4:a5:c0:2d:24:2e:
+                    e0:4f:96:e6:1e:4b:d0:90:4a:bd:ac:8f:37:ee:b1:
+                    e0:9f:31:82:d2:3c:90:43:cb:64:2f:88:00:41:60:
+                    ed:f9:ca:09:b3:20:76:a7:9c:32:a6:27:f2:47:3e:
+                    91:87:9b:a2:c4:e7:44:bd:20:81:54:4c:b5:5b:80:
+                    2c:36:8d:1f:a8:3e:d4:89:e9:4e:0f:a0:68:8e:32:
+                    42:8a:5c:78:c4:78:c6:8d:05:27:b7:1c:9a:3a:bb:
+                    0b:0b:e1:2c:44:68:96:39:e7:d3:ce:74:db:10:1a:
+                    65:aa:2b:87:f6:4c:68:26:db:3e:c7:2f:4b:55:99:
+                    83:4b:b4:ed:b0:2f:7c:90:e9:a4:96:d3:a5:5d:53:
+                    5b:eb:fc:45:d4:f6:19:f6:3f:3d:ed:bb:87:39:25:
+                    c2:f2:24:e0:77:31:29:6d:a8:87:ec:1e:47:48:f8:
+                    7e:fb:5f:de:b7:54:84:31:6b:22:32:de:e5:53:dd:
+                    af:02:11:2b:0d:1f:02:da:30:97:32:24:fe:27:ae:
+                    da:8b:9d:4b:29:22:d9:ba:8b:e3:9e:d9:e1:03:a6:
+                    3c:52:81:0b:c6:88:b7:e2:ed:43:16:e1:ef:17:db:
+                    de
+        X509v3 extensions:
+            X509v3 Subject Alternative Name: 
+                DNS:test, DNS:localhost, IP Address:127.0.0.1
+    Signature Algorithm: sha256WithRSAEncryption
+         60:80:c4:5e:7d:c6:cf:88:94:14:69:8d:c2:d7:ce:af:b4:97:
+         1c:08:9b:ff:65:db:77:24:c5:8a:87:1e:6f:30:70:71:a1:c5:
+         ac:af:67:49:ce:b0:91:b9:5a:55:27:12:49:72:be:7d:f5:45:
+         12:ff:32:1a:ee:b1:f9:44:cd:62:1f:20:48:ac:0f:5a:f4:c7:
+         b0:1b:05:b0:84:20:fe:da:6d:73:92:da:32:f6:77:3c:df:07:
+         5b:da:fd:c3:f3:6f:08:e8:4d:3e:ba:35:b2:a8:cc:a5:b3:9c:
+         5c:61:c0:cb:35:ea:fe:c8:d2:e7:d3:ea:e0:0e:3b:7d:fb:22:
+         60:e6:96:34:af:a4:bc:cb:70:e0:60:75:f9:93:0d:31:f1:60:
+         aa:50:34:8a:87:50:13:d1:8a:db:ee:d9:59:17:25:d9:b2:ad:
+         55:14:09:92:9a:80:54:70:01:9f:65:ed:bf:e5:10:65:f5:8b:
+         b8:7c:72:48:65:72:60:56:d8:de:b3:9f:90:9a:58:a4:ed:eb:
+         27:b2:a1:ae:90:52:0f:a4:d6:52:bd:36:b1:bb:d1:49:54:d1:
+         df:d9:1a:92:55:4a:56:e1:47:e7:f2:7e:52:c6:64:68:db:70:
+         87:cc:a5:ed:e7:fe:93:5b:bc:21:57:c9:02:06:0c:2b:c5:5d:
+         29:57:95:76
+-----BEGIN CERTIFICATE-----
+MIIFmTCCBIGgAwIBAgIJALdYNN5+C5smMA0GCSqGSIb3DQEBCwUAMGoxCzAJBgNV
+BAYTAkRFMRYwFAYDVQQIDA1OaWVkZXJzYWNoc2VuMQ4wDAYDVQQHDAVKdWlzdDEO
+MAwGA1UECgwFanVwbG8xETAPBgNVBAsMCHNlY3VyaXR5MRAwDgYDVQQDDAdSb290
+LUNBMB4XDTE5MDYyNjA4MjcyM1oXDTIwMDYyNTA4MjcyM1owZzELMAkGA1UEBhMC
+REUxFjAUBgNVBAgTDU5pZWRlcnNhY2hzZW4xDjAMBgNVBAcTBUp1aXN0MQ4wDAYD
+VQQKEwVqdXBsbzERMA8GA1UECxMIc2VjdXJpdHkxDTALBgNVBAMTBHRlc3QwggND
+MIICNQYHKoZIzjgEATCCAigCggEBAI95Ndm5qum/q+2Ies9JUbbzLsWeO683GOjq
+xJYfPv02BudDUanEGDM5uAnnwq4cU5unR1uF0BGtuLR5h3VJhGlcrA6PFLM2CCii
+L/onEQo9YqmTRTQJoP5pbEZY+EvdIIGcNwmgEFexla3NACM9ulSEtikfnWSO+INE
+hneXnOwEtDSmrC516Zhd4j2wKS/BEYyf+p2BgeczjbeStzDXueNJWS9oCZhyFTkV
+6j1ri0ZTxjNFj4A7MqTC4PJykCVuTj+KOwg4ocRQ5OGMGimjfd9eoUPeS2b/BJA+
+1c8WI+FY1IfGCOl/IRzYHcojy244B2X4IuNCvkhMBXY5OWAc1mcCHQC69pamhXj3
+397n+mfJd8eF7zKyM7rlgMC81WldAoIBABamXFggSFBwTnUCo5dXBA002jo0eMFU
+1OSlwC0kLuBPluYeS9CQSr2sjzfuseCfMYLSPJBDy2QviABBYO35ygmzIHannDKm
+J/JHPpGHm6LE50S9IIFUTLVbgCw2jR+oPtSJ6U4PoGiOMkKKXHjEeMaNBSe3HJo6
+uwsL4SxEaJY559POdNsQGmWqK4f2TGgm2z7HL0tVmYNLtO2wL3yQ6aSW06VdU1vr
+/EXU9hn2Pz3tu4c5JcLyJOB3MSltqIfsHkdI+H77X963VIQxayIy3uVT3a8CESsN
+HwLaMJcyJP4nrtqLnUspItm6i+Oe2eEDpjxSgQvGiLfi7UMW4e8X294DggEGAAKC
+AQEAjfjMaNqrVuAwsc9oSW//MLr+tmPHf3Dk2/TBtX2QNFihkyqQzBkv6+j5gR0Z
+pK0YI7FelCejHYdgatZEsUDShudTPpWG7MY/KvVqKnlACNmpyQSDP2VrgXVd7Hg9
+36UPSZia75izyY5h7rLB5QhKEyDWWzMOvTjly/fcfEO7/DOksIGLPCQQD4/W/oxS
+BR0Hj/cGhuh3IDK27CbPGeGqSGa61L6LfeOpO0XK/BgEGexT8YabswvAhorKRwEC
+jrqRVImeQ9UKc0cxNjkuJgeSp10mzSwqs6qX0WU0jyr8Ghl/A7fKiA9zMb8M0Y2a
+PNehVnbu8K3zdy8LKtbJi3AnzaMkMCIwIAYDVR0RBBkwF4IEdGVzdIIJbG9jYWxo
+b3N0hwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQBggMRefcbPiJQUaY3C186vtJcc
+CJv/Zdt3JMWKhx5vMHBxocWsr2dJzrCRuVpVJxJJcr599UUS/zIa7rH5RM1iHyBI
+rA9a9MewGwWwhCD+2m1zktoy9nc83wdb2v3D828I6E0+ujWyqMyls5xcYcDLNer+
+yNLn0+rgDjt9+yJg5pY0r6S8y3DgYHX5kw0x8WCqUDSKh1AT0Yrb7tlZFyXZsq1V
+FAmSmoBUcAGfZe2/5RBl9Yu4fHJIZXJgVtjes5+Qmlik7esnsqGukFIPpNZSvTax
+u9FJVNHf2RqSVUpW4Ufn8n5SxmRo23CHzKXt5/6TW7whV8kCBgwrxV0pV5V2
+-----END CERTIFICATE-----
diff --git a/static/wp-uploads/selfsigned+san/settings.conf b/static/wp-uploads/selfsigned+san/settings.conf
new file mode 100644 (file)
index 0000000..5715d82
--- /dev/null
@@ -0,0 +1,8 @@
+DEFAULT_PASSWORD=confidential
+DEFAULT_VALIDITY=365
+
+OU=security
+O=juplo
+L=Juist
+ST=Niedersachsen
+C=DE
diff --git a/static/wp-uploads/zookeeper+tls/README.sh b/static/wp-uploads/zookeeper+tls/README.sh
new file mode 100755 (executable)
index 0000000..efe60ab
--- /dev/null
@@ -0,0 +1,217 @@
+#!/bin/bash
+#
+# Example-script to show, how to encrypt the communication between two
+# Kafka-brokers and a standalone ZooKeeper
+#
+# Usage:
+# ./README.sh         -- Download Kafka/ZooKeeper, create the needed
+#                        certificates and start a ZooKeeper and two brokers
+#                        --------
+#                        Will not shut down the services, so that one can
+#                        experiment with single commands from this example.
+#                        Can be run multiple times: certificates are only
+#                        recreated and services are only restart, if they were
+#                        removed / stopped
+# ./README.sh stop    -- Stop the standalone ZooKeeper and the two brokers
+# ./README.sh cleanup -- Stop the standalone ZooKeeper and the two brokers,
+#                        then remove all data, the created certificates and
+#                        the written logs (does not remove dowloaded data)
+
+
+ZOOKEEPER_DOWNLOAD=http://ftp.fau.de/apache/zookeeper/zookeeper-3.5.5/apache-zookeeper-3.5.5-bin.tar.gz
+ZOOKEEPER_DIR=apache-zookeeper-3.5.5-bin
+KAFKA_DOWNLOAD=http://ftp.fau.de/apache/kafka/2.3.0/kafka_2.12-2.3.0.tgz
+KAFKA_DIR=kafka_2.12-2.3.0
+
+PASSWORD=confidential
+
+
+# Stops all services (Kafka and ZooKeeper)
+#
+function stop
+{
+  if [ -a ZOOKEEPER ]
+  then
+    ZOOPIDFILE=ZOOKEEPER $ZOOKEEPER_DIR/bin/zkServer.sh --config . stop
+  fi
+  if [ -a KAFKA-1 ]
+  then
+    kill $(cat KAFKA-1)
+    rm -f KAFKA-1
+  fi
+  if [ -a KAFKA-2 ]
+  then
+    kill $(cat KAFKA-2)
+    rm -f KAFKA-2
+  fi
+
+  if [ -a CONSUMER ]
+  then
+    kill $(cat CONSUMER)
+    rm -f CONSUMER
+  fi
+  if [ -a PRODUCER ]
+  then
+    kill $(cat PRODUCER)
+    rm -f PRODUCER
+  fi
+}
+
+
+# Stops all services (Kafka/ZooKeeper)
+#
+if [ "$1" = "stop" ]
+then
+  stop
+  exit
+fi
+
+# Removes data, certificates and logs (does not remove the downloads)
+#
+if [ "$1" = "cleanup" ]
+then
+
+  stop
+
+  rm -rvf /tmp/zookeeper
+  rm -rvf /tmp/kafka-1-logs
+  rm -rvf /tmp/kafka-2-logs
+
+  rm -rfv *.log *.out ca-cert* ca-key *.jks
+
+  exit
+
+fi
+
+
+if [ -x "$ZOOKEEPER_DIR" ];
+then
+  echo "Version 3.5.5 of Apache ZooKeeper already downloaded";
+else
+  echo "Downloading version 3.5.5 of Apache ZooKeeper...";
+  curl -sc - $ZOOKEEPER_DOWNLOAD | tar -xzv
+  cp -av $ZOOKEEPER_DIR/conf/log4j.properties ./
+fi
+
+if [ -x "$KAFKA_DIR" ];
+then
+  echo "Version 2.3.0 of Apache Kafka already downloaded";
+else
+  echo "Downloading version 2.3.0 of Apache Kafka...";
+  curl -sc - $KAFKA_DOWNLOAD | tar -xzv
+  echo "Replacing ZooKeeper-libs in Kafka with versions from 3.5.5..."
+  rm -v $KAFKA_DIR/libs/zookeeper-3.4.14.jar
+  cp -av $ZOOKEEPER_DIR/lib/zookeeper-3.5.5.jar $KAFKA_DIR/libs/
+  cp -av $ZOOKEEPER_DIR/lib/zookeeper-jute-3.5.5.jar $KAFKA_DIR/libs/
+  cp -av $ZOOKEEPER_DIR/lib/netty-all-4.1.29.Final.jar $KAFKA_DIR/libs/
+  echo "Only needed for ZooKeeper-CLI-clients (for example zookeeper-shell.sh):"
+  cp -av $ZOOKEEPER_DIR/lib/commons-cli-1.2.jar $KAFKA_DIR/libs/
+fi
+
+
+./create-certs.sh
+
+
+if [ -a ZOOKEEPER ]
+then
+  echo "zookeeper is already running!"
+else
+  echo "Starting zookeeper on port 2128..."
+  (
+    ZOOPIDFILE=ZOOKEEPER $ZOOKEEPER_DIR/bin/zkServer.sh --config . start
+  )
+fi
+
+if [ -a KAFKA-1 ]
+then
+  echo "kafka-1 is already running!"
+else
+  echo "Starting kafka-1 on port 9193/9194..."
+  (
+    export KAFKA_OPTS="
+      -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
+      -Dzookeeper.client.secure=true
+      -Dzookeeper.ssl.keyStore.location=kafka-1.jks
+      -Dzookeeper.ssl.keyStore.password=$PASSWORD
+      -Dzookeeper.ssl.trustStore.location=truststore.jks
+      -Dzookeeper.ssl.trustStore.password=$PASSWORD
+    "
+    $KAFKA_DIR/bin/kafka-server-start.sh kafka-1.properties & echo $! > KAFKA-1
+  ) > kafka-1.log &
+fi
+if [ -a KAFKA-2 ]
+then
+  echo "kafka-2 is already running!"
+else
+  echo "Starting kafka-2 on port 9293/9294..."
+  (
+    export KAFKA_OPTS="
+      -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
+      -Dzookeeper.client.secure=true
+      -Dzookeeper.ssl.keyStore.location=kafka-2.jks
+      -Dzookeeper.ssl.keyStore.password=$PASSWORD
+      -Dzookeeper.ssl.trustStore.location=truststore.jks
+      -Dzookeeper.ssl.trustStore.password=$PASSWORD
+    "
+    $KAFKA_DIR/bin/kafka-server-start.sh kafka-2.properties & echo $! > KAFKA-2
+  ) > kafka-2.log &
+fi
+
+
+while ! nc -w1 kafka-1 9193; do echo "Waiting for kafka-1..."; sleep 1; done
+while ! nc -w1 kafka-1 9293; do echo "Waiting for kafka-2..."; sleep 1; done
+
+# Creates topic "test", if it does not exist already
+# Note the usage of KAFKA_OPTS, to configure the SSL-encryption
+(
+  export KAFKA_OPTS="
+    -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
+    -Dzookeeper.client.secure=true
+    -Dzookeeper.ssl.keyStore.location=client.jks
+    -Dzookeeper.ssl.keyStore.password=$PASSWORD
+    -Dzookeeper.ssl.trustStore.location=truststore.jks
+    -Dzookeeper.ssl.trustStore.password=$PASSWORD
+  "
+  $KAFKA_DIR/bin/kafka-topics.sh --zookeeper zookeeper:2182 --if-not-exists --create --topic test --partitions 1 --replication-factor 2
+)
+# Prints information about topic "test"
+# Note the usage of KAFKA_OPTS, to configure the SSL-encryption
+(
+  export KAFKA_OPTS="
+    -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
+    -Dzookeeper.client.secure=true
+    -Dzookeeper.ssl.keyStore.location=client.jks
+    -Dzookeeper.ssl.keyStore.password=$PASSWORD
+    -Dzookeeper.ssl.trustStore.location=truststore.jks
+    -Dzookeeper.ssl.trustStore.password=$PASSWORD
+  "
+  $KAFKA_DIR/bin/kafka-topics.sh --zookeeper zookeeper:2182 --describe --topic test
+)
+
+# Starts a console-consumer, that reads 3 messages from the topic "test"
+# See consumer.config for the configuration of the SSL-encryption
+{ $KAFKA_DIR/bin/kafka-console-consumer.sh --bootstrap-server kafka-1:9194 --consumer.config consumer.config --topic test --from-beginning --max-messages 3 & echo $! > CONSUMER ; } |& tee consumer.log &
+echo "Started consumer with PID $(cat CONSUMER)"
+
+# Starts a console-consumer, that writes some messages to the topic "test"
+# See producer.config for the configuration of the SSL-encryption
+{ echo -e "Foo\nBar\nFooBar\n" | $KAFKA_DIR/bin/kafka-console-producer.sh --broker-list kafka-1:9194 --producer.config producer.config --topic test & echo $! > PRODUCER ; } |& tee producer.log &
+echo "Started producer with PID $(cat PRODUCER)"
+
+echo "Waiting for consumer/producer..."
+wait
+rm -f PRODUCER CONSUMER
+
+# Connect to ZooKeeper and get some informations about the broker 1
+# Note the usage of KAFKA_OPTS, to configure the SSL-encryption
+(
+  export KAFKA_OPTS="
+    -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty
+    -Dzookeeper.client.secure=true
+    -Dzookeeper.ssl.keyStore.location=client.jks
+    -Dzookeeper.ssl.keyStore.password=$PASSWORD
+    -Dzookeeper.ssl.trustStore.location=truststore.jks
+    -Dzookeeper.ssl.trustStore.password=$PASSWORD
+  "
+  $KAFKA_DIR/bin/zookeeper-shell.sh  zookeeper:2182 get /brokers/ids/1
+)
diff --git a/static/wp-uploads/zookeeper+tls/consumer.config b/static/wp-uploads/zookeeper+tls/consumer.config
new file mode 100644 (file)
index 0000000..960ae66
--- /dev/null
@@ -0,0 +1,5 @@
+security.protocol=SASL_SSL
+sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="consumer" password="pw4consumer";
+sasl.mechanism=PLAIN
+ssl.truststore.location=truststore.jks
+ssl.truststore.password=confidential
diff --git a/static/wp-uploads/zookeeper+tls/create-certs.sh b/static/wp-uploads/zookeeper+tls/create-certs.sh
new file mode 100755 (executable)
index 0000000..a989bf7
--- /dev/null
@@ -0,0 +1,33 @@
+#!/bin/bash
+#
+# Example-script to show, how to set up a self-signed CA
+#
+# Usage:
+# ./create-certs.sh
+
+VALIDITY=365
+PASSWORD=confidential
+if [ -a ca-cert ];
+then
+  echo "The root-certificate for the CA already exists...";
+else
+  echo "Creating a x509-certificate for the CA...";
+  openssl req -new -x509 -subj "/C=DE/ST=NRW/L=MS/O=trion/OU=kafka/CN=Root-CA" -keyout ca-key -out ca-cert -days $VALIDITY -passout pass:$PASSWORD
+fi
+#
+
+if [ -a truststore.jks ];
+then
+  echo "The keystore truststore.jks already exists!";
+else
+  echo "Importing the root-certificate of the CA into truststore.jks..."
+  keytool -keystore truststore.jks -storepass $PASSWORD -alias CARoot -import -file ca-cert -noprompt
+fi
+
+
+# Generating certificates for the standalone ZooKeeper, an example CLI-client
+# and the two Kafka-Brokers
+./gencert.sh zookeeper
+./gencert.sh client
+./gencert.sh kafka-1
+./gencert.sh kafka-2
diff --git a/static/wp-uploads/zookeeper+tls/gencert.sh b/static/wp-uploads/zookeeper+tls/gencert.sh
new file mode 100755 (executable)
index 0000000..dbdd032
--- /dev/null
@@ -0,0 +1,31 @@
+#!/bin/bash
+#
+# Example-script to show, how to create and sign a selfsigned certificate, that
+# contains multiple DNS-entries (SAN-extension)
+#
+# Usage:
+# ./gencert.sh NAME
+
+VALIDITY=365
+PASSWORD=confidential
+
+if [ -a $1.jks ];
+then
+  echo "The keystore $1.jks already exists";
+  exit;
+fi
+
+echo "Creating keystore $1.jks with a certificate and a key-pair for CN $1"
+keytool -keystore $1.jks -alias $1 -validity $VALIDITY -genkey -storepass $PASSWORD -keypass $PASSWORD -dname "CN=$1,OU=kafka,O=trion,L=MS,ST=NRW,C=DE"
+echo "Creating a Certificate-Signing-Request for the generated certificate"
+keytool -keystore $1.jks -alias $1 -certreq -file cert-file -storepass $PASSWORD
+echo "Signing the Certificate-Signing-Request and adding an additional DNS-entry for localhost"
+openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out cert-signed -days $VALIDITY -CAcreateserial -passin pass:$PASSWORD -extensions SAN -extfile <(printf "\n[SAN]\nsubjectAltName=DNS:$1,DNS:localhost")
+echo "Importing the root-certificate for the CA into the keystore $1.jks"
+keytool -keystore $1.jks -alias CARoot -import -file ca-cert -storepass $PASSWORD -noprompt
+echo "Importing the signed certificate for CN $1 into the keystore $1.jks"
+keytool -keystore $1.jks -alias $1 -import -file cert-signed -storepass $PASSWORD
+echo "Removing obsolet files..."
+rm -v cert-file cert-signed
+
+
diff --git a/static/wp-uploads/zookeeper+tls/java.env b/static/wp-uploads/zookeeper+tls/java.env
new file mode 100644 (file)
index 0000000..e3ebca6
--- /dev/null
@@ -0,0 +1,2 @@
+SERVER_JVMFLAGS="-Xms512m -Xmx512m -Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory"
+ZOO_LOG_DIR=.
diff --git a/static/wp-uploads/zookeeper+tls/kafka-1.properties b/static/wp-uploads/zookeeper+tls/kafka-1.properties
new file mode 100644 (file)
index 0000000..1e7c305
--- /dev/null
@@ -0,0 +1,17 @@
+broker.id=1
+zookeeper.connect=zookeeper:2182
+listeners=SSL://kafka-1:9193,SASL_SSL://kafka-1:9194
+security.inter.broker.protocol=SSL
+ssl.client.auth=required
+ssl.keystore.location=kafka-1.jks
+ssl.keystore.password=confidential
+ssl.key.password=confidential
+ssl.truststore.location=truststore.jks
+ssl.truststore.password=confidential
+listener.name.sasl_ssl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required user_consumer="pw4consumer" user_producer="pw4producer";
+sasl.enabled.mechanisms=PLAIN
+
+log.dirs=/tmp/kafka-1-logs
+offsets.topic.replication.factor=2
+transaction.state.log.replication.factor=2
+transaction.state.log.min.isr=2
diff --git a/static/wp-uploads/zookeeper+tls/kafka-2.properties b/static/wp-uploads/zookeeper+tls/kafka-2.properties
new file mode 100644 (file)
index 0000000..ec53f9b
--- /dev/null
@@ -0,0 +1,17 @@
+broker.id=2
+zookeeper.connect=zookeeper:2182
+listeners=SSL://kafka-2:9293,SASL_SSL://kafka-2:9294
+security.inter.broker.protocol=SSL
+ssl.client.auth=required
+ssl.keystore.location=kafka-2.jks
+ssl.keystore.password=confidential
+ssl.key.password=confidential
+ssl.truststore.location=truststore.jks
+ssl.truststore.password=confidential
+listener.name.sasl_ssl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required user_consumer="pw4consumer" user_producer="pw4producer";
+sasl.enabled.mechanisms=PLAIN
+
+log.dirs=/tmp/kafka-2-logs
+offsets.topic.replication.factor=2
+transaction.state.log.replication.factor=2
+transaction.state.log.min.isr=2
diff --git a/static/wp-uploads/zookeeper+tls/producer.config b/static/wp-uploads/zookeeper+tls/producer.config
new file mode 100644 (file)
index 0000000..5809edf
--- /dev/null
@@ -0,0 +1,5 @@
+security.protocol=SASL_SSL
+sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="producer" password="pw4producer";
+sasl.mechanism=PLAIN
+ssl.truststore.location=truststore.jks
+ssl.truststore.password=confidential
diff --git a/static/wp-uploads/zookeeper+tls/zoo.cfg b/static/wp-uploads/zookeeper+tls/zoo.cfg
new file mode 100644 (file)
index 0000000..ad80add
--- /dev/null
@@ -0,0 +1,8 @@
+dataDir=/tmp/zookeeper
+secureClientPort=2182
+maxClientCnxns=0
+authProvider.1=org.apache.zookeeper.server.auth.X509AuthenticationProvider
+ssl.keyStore.location=zookeeper.jks
+ssl.keyStore.password=confidential
+ssl.trustStore.location=truststore.jks
+ssl.trustStore.password=confidential
diff --git a/themes/PaperMod/.github/ISSUE_TEMPLATE/bug.yaml b/themes/PaperMod/.github/ISSUE_TEMPLATE/bug.yaml
new file mode 100644 (file)
index 0000000..d7d7656
--- /dev/null
@@ -0,0 +1,112 @@
+name: Bug Report 🐞
+description: Create a report to help us improve
+title: "[Bug]: "
+labels: ["bug", "triage"]
+body:
+  - type: markdown
+    attributes:
+      value: |
+        Thanks for taking the time to fill out this bug report :)
+        - Kindly **DO NOT** ask for instructions.
+        - Use [Discussions](https://github.com/adityatelange/hugo-PaperMod/discussions) section if you have a query or doubts or any other relevant question.
+        - You may join [Discord community](https://discord.gg/ahpmTvhVmp) to interact with fellow contributors and users
+        - Read project's [Wiki](https://github.com/adityatelange/hugo-PaperMod/wiki) for detailed documentation.
+        - Read project's [FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs) section for Frequently asked questions.
+        - Search for previous [Issues](https://github.com/adityatelange/hugo-PaperMod/issues)/[Pull Requests](https://github.com/adityatelange/hugo-PaperMod/pulls) if this issue is already reported or fix has been created.
+  - type: textarea
+    id: what_happened
+    attributes:
+      label: What happened?
+      description: Also tell us, what did you expect to happen?
+      placeholder: A bug happened! Here are the screenshots.. Tell us what you see!
+    validations:
+      required: true
+  - type: textarea
+    id: steps_to_reproduce
+    attributes:
+      label: Steps to reproduce
+      description: How to reproduce this issue. Here are the steps...
+      placeholder:  |
+        1. Go to '...'
+        2. Click on '....'
+        3. Scroll down to '....'
+        4. See error
+    validations:
+      required: true
+  - type: dropdown
+    id: hugo_version
+    attributes:
+      label: Hugo Version
+      description: What version of Hugo are you running?
+      options:
+        - Hugo >= 0.146.0 (Recommended - Minimum version required for PaperMod)
+        - Hugo < 0.146.0  (Incompatible - Not recommended to build PaperMod on lower versions)
+    validations:
+      required: true
+  - type: input
+    id: papermod_version
+    attributes:
+      label: PaperMod Version
+      description: What version of PaperMod are you running?
+      placeholder:  |
+        PaperMod v7.0 or
+        Branch master or
+        Commit-id: 3f50861a0ced88f9b614a43662edeb4c0bc45da8
+    validations:
+      required: true
+  - type: dropdown
+    id: browser_type
+    attributes:
+      label: What kind of devices are you seeing the problem on?
+      multiple: true
+      options:
+        - Mobile
+        - Desktop
+    validations:
+      required: false
+  - type: dropdown
+    id: browsers
+    attributes:
+      label: What browsers are you seeing the problem on?
+      multiple: true
+      options:
+        - Firefox
+        - Chrome
+        - Safari
+        - Microsoft Edge
+    validations:
+      required: false
+  - type: input
+    id: browser_version
+    attributes:
+      label: Browser Version
+      description: Please add browser version or enter user agent string (navigator.userAgent)
+      placeholder: ex. Google Chrome 86.0
+    validations:
+      required: false
+  - type: textarea
+    id: logs
+    attributes:
+      label: Relevant log output
+      description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
+      render: shell
+    validations:
+      required: true
+  - type: input
+    id: repo_url
+    attributes:
+      label: Repository/Source Code link where this issue can be reproduced
+      description: Please add url of the repository where this issue can be reproduced
+      placeholder: https://github.com/<username>/<repo name>
+    validations:
+      required: false
+  - type: checkboxes
+    id: terms
+    attributes:
+      label: Code of Conduct
+      description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/adityatelange/hugo-PaperMod?tab=coc-ov-file#readme).
+      options:
+        - label: I agree to follow this project's Code of Conduct
+          required: true
+    validations:
+      required: true
diff --git a/themes/PaperMod/.github/ISSUE_TEMPLATE/config.yml b/themes/PaperMod/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644 (file)
index 0000000..eeb6e55
--- /dev/null
@@ -0,0 +1,5 @@
+blank_issues_enabled: false
+contact_links:
+  - name: PaperMod Discussions
+    url: https://github.com/adityatelange/hugo-PaperMod/discussions
+    about: Please ask and answer questions/doubts here, DO NOT open an issue for questions.
diff --git a/themes/PaperMod/.github/ISSUE_TEMPLATE/enhancement.yaml b/themes/PaperMod/.github/ISSUE_TEMPLATE/enhancement.yaml
new file mode 100644 (file)
index 0000000..3976a80
--- /dev/null
@@ -0,0 +1,32 @@
+name: Enhancement 🚀
+description: Propose a new feature or change for enhancing the experience.
+title: "[Enhancement]: "
+labels: ["enhancement", "triage"]
+body:
+  - type: markdown
+    attributes:
+      value: |
+        Thanks for taking the time to fill out this enhancement form :)
+        - Use [Discussions](https://github.com/adityatelange/hugo-PaperMod/discussions) section if you have a query or doubts or any other relevant question.
+        - You may join [Discord community](https://discord.gg/ahpmTvhVmp) to interact with fellow contributors and users
+        - Read project's [Wiki](https://github.com/adityatelange/hugo-PaperMod/wiki) for detailed documentation.
+        - Read project's [FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs) section for Frequently asked questions.
+        - Search for previous [Issues](https://github.com/adityatelange/hugo-PaperMod/issues)/[Pull Requests](https://github.com/adityatelange/hugo-PaperMod/pulls) if this issue is already reported or fix has been created.
+  - type: textarea
+    id: what_happened
+    attributes:
+      label: What you'd like to propose?
+      description:
+      placeholder:
+    validations:
+      required: true
+  - type: checkboxes
+    id: terms
+    attributes:
+      label: Code of Conduct
+      description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/adityatelange/hugo-PaperMod?tab=coc-ov-file#readme).
+      options:
+        - label: I agree to follow this project's Code of Conduct
+          required: true
+    validations:
+      required: true
\ No newline at end of file
diff --git a/themes/PaperMod/.github/PULL_REQUEST_TEMPLATE.md b/themes/PaperMod/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644 (file)
index 0000000..673d1c4
--- /dev/null
@@ -0,0 +1,44 @@
+<!--
+
+## READ BEFORE OPENING A PR
+
+Thank you for contributing to hugo-PaperMod!
+Please fill out the following questions to make it easier for us to review your
+changes. You do not need to check all the boxes below.
+
+**NOTE**: PaperMod does not have any external dependencies fetched from 3rd party
+CDN servers. However we do have custom Head/Footer extender templates which you can use
+to add those to your website.
+https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#custom-head--footer
+
+-->
+
+
+**What does this PR change? What problem does it solve?**
+
+<!--
+Describe the changes and their purpose here, as detailed as and if needed.
+
+Please do not add 2 unrelated changes in a single PR as it is difficult to track/revert those in future.
+-->
+
+
+**Was the change discussed in an issue or in the Discussions before?**
+
+<!--
+Link issues and relevant Discussions posts here.
+
+If this PR resolves an issue on GitHub, use "Closes #1234" so that the issue
+is closed automatically when this PR is merged.
+-->
+
+
+## PR Checklist
+
+- [ ] This change adds/updates translations and I have used the [template present here](https://github.com/adityatelange/hugo-PaperMod/wiki/Translations#want-to-add-your-language-).
+- [ ] I have enabled [maintainer edits for this PR](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/allowing-changes-to-a-pull-request-branch-created-from-a-fork).
+- [ ] I have verified that the code works as described/as intended.
+- [ ] This change adds a Social Icon which has a permissive license to use it.
+- [ ] This change **does not** include any CDN resources/links.
+- [ ] This change **does not** include any unrelated scripts such as bash and python scripts.
+- [ ] This change updates the overridden internal templates from HUGO's repository.
diff --git a/themes/PaperMod/.github/workflows/gh-pages.yml b/themes/PaperMod/.github/workflows/gh-pages.yml
new file mode 100644 (file)
index 0000000..7dc6f1c
--- /dev/null
@@ -0,0 +1,77 @@
+name: Deploy Hugo PaperMod Demo to Pages
+
+on:
+  push:
+    paths-ignore:
+      - "images/**"
+      - "LICENSE"
+      - "README.md"
+    branches:
+      - master
+      - exampleSite
+  workflow_dispatch:
+    # manual run
+    inputs:
+      hugoVersion:
+        description: "Hugo Version"
+        required: false
+        default: "0.146.0"
+
+# Allow one concurrent deployment
+concurrency:
+  group: "pages"
+  cancel-in-progress: true
+
+# Default to bash
+defaults:
+  run:
+    shell: bash
+
+# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
+permissions:
+  contents: read
+  pages: write
+  id-token: write
+
+jobs:
+  # Build job
+  build:
+    runs-on: ubuntu-latest
+    env:
+      HUGO_VERSION: ${{ github.event.inputs.hugoVersion || '0.146.0' }}
+    steps:
+      - name: Install Hugo CLI
+        run: |
+          wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-amd64.deb \
+          && sudo dpkg -i ${{ runner.temp }}/hugo.deb
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          ref: exampleSite
+      - name: Setup Pages
+        id: pages
+        uses: actions/configure-pages@v5
+      - name: Get Theme
+        run: git submodule update --init --recursive
+      - name: Update theme to Latest commit
+        run: git submodule update --remote --merge
+      - name: Build with Hugo
+        run: |
+          hugo \
+            --buildDrafts --gc \
+            --baseURL ${{ steps.pages.outputs.base_url }}
+      - name: Upload artifact
+        uses: actions/upload-pages-artifact@v3
+        with:
+          path: ./public
+  # Deployment job
+  deploy:
+    environment:
+      name: github-pages
+      url: ${{ steps.deployment.outputs.page_url }}
+    runs-on: ubuntu-latest
+    needs: build
+    steps:
+      - name: Deploy to GitHub Pages
+        id: deployment
+        uses: actions/deploy-pages@v4
diff --git a/themes/PaperMod/LICENSE b/themes/PaperMod/LICENSE
new file mode 100644 (file)
index 0000000..533adaf
--- /dev/null
@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2020 nanxiaobei and adityatelange
+Copyright (c) 2021-2025 adityatelange
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/themes/PaperMod/README.md b/themes/PaperMod/README.md
new file mode 100644 (file)
index 0000000..7b2956e
--- /dev/null
@@ -0,0 +1,106 @@
+<h1 align=center>Hugo PaperMod | <a href="https://adityatelange.github.io/hugo-PaperMod/" rel="nofollow">Demo</a></h1>
+
+<h4 align=center>☄️ Fast | ☁️ Fluent | 🌙 Smooth | 📱 Responsive</h4>
+<br>
+
+> Hugo PaperMod is a theme based on [hugo-paper](https://github.com/nanxiaobei/hugo-paper/tree/4330c8b12aa48bfdecbcad6ad66145f679a430b3).<br>
+> The goal of this project is to add more features and customization to the og theme.
+
+**Documentation** can be found here: [**📚 Wiki**](https://github.com/adityatelange/hugo-PaperMod/wiki)
+
+**ExampleSite** can be found here: [**exampleSite**](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite). Demo is built up with [exampleSite](https://github.com/adityatelange/hugo-PaperMod/tree/exampleSite) as source.
+
+[![hugo-papermod](https://img.shields.io/badge/Hugo--Themes-@PaperMod-blue)](https://themes.gohugo.io/themes/hugo-papermod/)
+[![Minimum Hugo Version](https://img.shields.io/static/v1?label=min-HUGO-version&message=>=v0.146.0&color=blue&logo=hugo)](https://github.com/gohugoio/hugo/releases/tag/v0.146.0)
+[![Discord](https://img.shields.io/discord/971046860317921340?label=Discord&logo=discord)](https://discord.gg/ahpmTvhVmp)
+[![GitHub](https://img.shields.io/github/license/adityatelange/hugo-PaperMod)](https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE)
+![code-size](https://img.shields.io/github/languages/code-size/adityatelange/hugo-PaperMod)
+[![X (formerly Twitter) URL](https://img.shields.io/badge/-Share%20on%20X-gray?style=flat&logo=x)](https://x.com/intent/tweet/?text=Checkout%20Hugo%20PaperMod%20%E2%9C%A8%0AA%20fast,%20clean,%20responsive%20Hugo%20theme.&url=https://github.com/adityatelange/hugo-PaperMod&hashtags=Hugo,PaperMod)
+
+
+---
+
+<p align="center">
+  <kbd><img src="https://user-images.githubusercontent.com/21258296/114303440-bfc0ae80-9aeb-11eb-8cfa-48a4bb385a6d.png" alt="Mockup image" title="Mockup"/></kbd>
+</p>
+
+---
+
+## Features/Mods 💥
+
+-   Uses Hugo's asset generator with pipelining, fingerprinting, bundling and minification by default.
+-   3 Modes:
+    -   [Regular Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#regular-mode-default-mode)
+    -   [Home-Info Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#home-info-mode)
+    -   [Profile Mode.](https://github.com/adityatelange/hugo-PaperMod/wiki/Features#profile-mode)
+-   Table of Content Generation (newer implementation).
+-   Archive of posts.
+-   Social Icons (home-info and profile-mode).
+-   Social-Media Share buttons on posts.
+-   Menu location indicator.
+-   Multilingual support. (with language selector).
+-   Taxonomies.
+-   Cover image for each post (with Responsive image support).
+-   Light/Dark theme (automatic theme switch a/c to browser theme and theme-switch button).
+-   SEO Friendly.
+-   Multiple Author support.
+-   Search Page with Fuse.js
+-   Other Posts suggestion below a post
+-   Breadcrumb Navigation.
+-   Code Block Copy buttons.
+-   Hugo's Chroma syntax highlighter.
+-   No webpack, nodejs and other dependencies are required to edit the theme.
+
+Read Wiki For More Details => **[PaperMod - Features](https://github.com/adityatelange/hugo-PaperMod/wiki/Features)**
+
+---
+
+## Install/Update 📥
+
+Read Wiki For More Details => **[PaperMod - Installation](https://github.com/adityatelange/hugo-PaperMod/wiki/Installation)**
+
+---
+
+## FAQs / How To's Guide 🙋
+
+Read Wiki For More Details => **[PaperMod-FAQs](https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs)**
+
+---
+
+## Social-Icons/Share-Icons 🖼️
+
+Read Wiki For More Details => **[PaperMod-Icons](https://github.com/adityatelange/hugo-PaperMod/wiki/Icons)**
+
+---
+
+## Release Changelog 📃
+
+Release ChangeLog has info about stuff added: **[Releases](https://github.com/adityatelange/hugo-PaperMod/releases)**
+
+---
+
+## [Pagespeed Insights (100% ?)](https://pagespeed.web.dev/report?url=https://adityatelange.github.io/hugo-PaperMod/) 👀
+
+---
+
+## Support 🫶
+
+-   Star 🌟 this repository.
+-   Help spread the word about PaperMod by sharing it on social media and recommending it to your friends. 🗣️
+-   You can also sponsor 🏅 on [Github Sponsors](https://github.com/sponsors/adityatelange) / [Ko-Fi](https://ko-fi.com/adityatelange).
+
+---
+
+## Special Thanks 🌟
+
+-   [**Highlight.js**](https://github.com/highlightjs/highlight.js)
+-   [**Fuse.js**](https://github.com/krisk/fuse)
+-   [**Feather Icons**](https://github.com/feathericons/feather)
+-   [**Simple Icons**](https://github.com/simple-icons/simple-icons)
+-   **All Contributors and Supporters**
+
+---
+
+## Stargazers over time 📈
+
+[![Stargazers over time](https://starchart.cc/adityatelange/hugo-PaperMod.svg?background=%23ffffff00&axis=%23858585&line=%236b63ff)](https://starchart.cc/adityatelange/hugo-PaperMod)
diff --git a/themes/PaperMod/assets/css/common/404.css b/themes/PaperMod/assets/css/common/404.css
new file mode 100644 (file)
index 0000000..8a23430
--- /dev/null
@@ -0,0 +1,11 @@
+.not-found {
+    position: absolute;
+    left: 0;
+    right: 0;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    height: 80%;
+    font-size: 160px;
+    font-weight: 700;
+}
diff --git a/themes/PaperMod/assets/css/common/archive.css b/themes/PaperMod/assets/css/common/archive.css
new file mode 100644 (file)
index 0000000..7e7e245
--- /dev/null
@@ -0,0 +1,44 @@
+.archive-posts {
+    width: 100%;
+    font-size: 16px;
+}
+
+.archive-year {
+    margin-top: 40px;
+}
+
+.archive-year:not(:last-of-type) {
+    border-bottom: 2px solid var(--border);
+}
+
+.archive-month {
+    display: flex;
+    align-items: flex-start;
+    padding: 10px 0;
+}
+
+.archive-month-header {
+    margin: 25px 0;
+    width: 200px;
+}
+
+.archive-month:not(:last-of-type) {
+    border-bottom: 1px solid var(--border);
+}
+
+.archive-entry {
+    position: relative;
+    padding: 5px;
+    margin: 10px 0;
+}
+
+.archive-entry-title {
+    margin: 5px 0;
+    font-weight: 400;
+}
+
+.archive-count,
+.archive-meta {
+    color: var(--secondary);
+    font-size: 14px;
+}
diff --git a/themes/PaperMod/assets/css/common/footer.css b/themes/PaperMod/assets/css/common/footer.css
new file mode 100644 (file)
index 0000000..5addb1e
--- /dev/null
@@ -0,0 +1,60 @@
+.footer,
+.top-link {
+    font-size: 12px;
+    color: var(--secondary);
+}
+
+.footer {
+    max-width: calc(var(--main-width) + var(--gap) * 2);
+    margin: auto;
+    padding: calc((var(--footer-height) - var(--gap)) / 2) var(--gap);
+    text-align: center;
+    line-height: 24px;
+}
+
+.footer span {
+    margin-inline-start: 1px;
+    margin-inline-end: 1px;
+}
+
+.footer span:last-child {
+    white-space: nowrap;
+}
+
+.footer a {
+    color: inherit;
+    border-bottom: 1px solid var(--secondary);
+}
+
+.footer a:hover {
+    border-bottom: 1px solid var(--primary);
+}
+
+.top-link {
+    visibility: hidden;
+    position: fixed;
+    bottom: 60px;
+    right: 30px;
+    z-index: 99;
+    background: var(--tertiary);
+    width: 42px;
+    height: 42px;
+    padding: 12px;
+    border-radius: 64px;
+    transition: visibility 0.5s, opacity 0.8s linear;
+}
+
+.top-link,
+.top-link svg {
+    filter: drop-shadow(0px 0px 0px var(--theme));
+}
+
+.footer a:hover,
+.top-link:hover {
+    color: var(--primary);
+}
+
+.top-link:focus,
+#theme-toggle:focus {
+    outline: 0;
+}
diff --git a/themes/PaperMod/assets/css/common/header.css b/themes/PaperMod/assets/css/common/header.css
new file mode 100644 (file)
index 0000000..6896433
--- /dev/null
@@ -0,0 +1,92 @@
+.nav {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-between;
+    max-width: calc(var(--nav-width) + var(--gap) * 2);
+    margin-inline-start: auto;
+    margin-inline-end: auto;
+    line-height: var(--header-height);
+}
+
+.nav a {
+    display: block;
+}
+
+.logo,
+#menu {
+    display: flex;
+    margin: auto var(--gap);
+}
+
+.logo {
+    flex-wrap: inherit;
+}
+
+.logo a {
+    font-size: 24px;
+    font-weight: 700;
+}
+
+.logo a img, .logo a svg {
+    display: inline;
+    vertical-align: middle;
+    pointer-events: none;
+    transform: translate(0, -10%);
+    border-radius: 6px;
+    margin-inline-end: 8px;
+}
+
+button#theme-toggle {
+    font-size: 26px;
+    margin: auto 4px;
+}
+
+[data-theme="dark"] #moon {
+    display: none;
+}
+
+[data-theme="light"] #sun {
+    display: none;
+}
+
+#menu {
+    list-style: none;
+    word-break: keep-all;
+    overflow-x: auto;
+    white-space: nowrap;
+}
+
+#menu li + li {
+    margin-inline-start: var(--gap);
+}
+
+#menu a {
+    font-size: 16px;
+}
+
+#menu .active {
+    font-weight: 500;
+    border-bottom: 2px solid currentColor;
+}
+
+.lang-switch li,
+.lang-switch ul,
+.logo-switches {
+    display: inline-flex;
+    margin: auto 4px;
+}
+
+.lang-switch {
+    display: flex;
+    flex-wrap: inherit;
+}
+
+.lang-switch a {
+    margin: auto 3px;
+    font-size: 16px;
+    font-weight: 500;
+}
+
+.logo-switches {
+    flex-wrap: inherit;
+}
diff --git a/themes/PaperMod/assets/css/common/main.css b/themes/PaperMod/assets/css/common/main.css
new file mode 100644 (file)
index 0000000..25ae4da
--- /dev/null
@@ -0,0 +1,66 @@
+.main {
+    position: relative;
+    min-height: calc(100vh - var(--header-height) - var(--footer-height));
+    max-width: calc(var(--main-width) + var(--gap) * 2);
+    margin: auto;
+    padding: var(--gap);
+}
+
+.page-header h1 {
+    font-size: 40px;
+}
+
+.pagination {
+    display: flex;
+}
+
+.pagination a {
+    color: var(--theme);
+    font-size: 13px;
+    line-height: 36px;
+    background: var(--primary);
+    border-radius: calc(36px / 2);
+    padding: 0 16px;
+}
+
+.pagination .next {
+    margin-inline-start: auto;
+}
+
+
+.social-icons a {
+    display: inline-flex;
+    padding: 10px;
+}
+
+.social-icons a svg {
+    height: 26px;
+    width: 26px;
+}
+
+code {
+    direction: ltr;
+}
+
+div.highlight,
+pre {
+    position: relative;
+}
+
+.copy-code {
+    display: none;
+    position: absolute;
+    top: 4px;
+    right: 4px;
+    color: rgba(255, 255, 255, 0.8);
+    background: rgba(78, 78, 78, 0.8);
+    border-radius: var(--radius);
+    padding: 0 5px;
+    font-size: 14px;
+    user-select: none;
+}
+
+div.highlight:hover .copy-code,
+pre:hover .copy-code {
+    display: block;
+}
diff --git a/themes/PaperMod/assets/css/common/post-entry.css b/themes/PaperMod/assets/css/common/post-entry.css
new file mode 100644 (file)
index 0000000..db9cd3f
--- /dev/null
@@ -0,0 +1,106 @@
+.first-entry {
+    position: relative;
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    min-height: 320px;
+    margin: var(--gap) 0 calc(var(--gap) * 2) 0;
+}
+
+.first-entry .entry-header {
+    overflow: hidden;
+    display: -webkit-box;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp: 3;
+}
+
+.first-entry .entry-header h1 {
+    font-size: 34px;
+    line-height: 1.3;
+}
+
+.first-entry .entry-content {
+    margin: 14px 0;
+    font-size: 16px;
+    -webkit-line-clamp: 3;
+}
+
+.first-entry .entry-footer {
+    font-size: 14px;
+}
+
+.home-info .entry-content {
+    -webkit-line-clamp: unset;
+}
+
+.post-entry {
+    position: relative;
+    margin-bottom: var(--gap);
+    padding: var(--gap);
+    background: var(--entry);
+    border-radius: var(--radius);
+    transition: transform 0.1s;
+    border: 1px solid var(--border);
+}
+
+.post-entry:active {
+    transform: scale(0.96);
+}
+
+.tag-entry .entry-cover {
+    display: none;
+}
+
+.entry-header h2 {
+    font-size: 24px;
+    line-height: 1.3;
+}
+
+.entry-content {
+    margin: 8px 0;
+    color: var(--secondary);
+    font-size: 14px;
+    line-height: 1.6;
+    overflow: hidden;
+    display: -webkit-box;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp: 2;
+}
+
+.entry-footer {
+    color: var(--secondary);
+    font-size: 13px;
+}
+
+.entry-link {
+    position: absolute;
+    left: 0;
+    right: 0;
+    top: 0;
+    bottom: 0;
+}
+
+.entry-hint {
+    color: var(--secondary);
+}
+
+.entry-hint-parent {
+    display: flex;
+    justify-content: space-between;
+}
+
+.entry-cover {
+    font-size: 14px;
+    margin-bottom: var(--gap);
+    text-align: center;
+}
+
+.entry-cover img {
+    border-radius: var(--radius);
+    width: 100%;
+    height: auto;
+}
+
+.entry-cover a {
+    box-shadow: 0 1px 0 var(--primary);
+}
diff --git a/themes/PaperMod/assets/css/common/post-single.css b/themes/PaperMod/assets/css/common/post-single.css
new file mode 100644 (file)
index 0000000..8906c1f
--- /dev/null
@@ -0,0 +1,417 @@
+.page-header,
+.post-header {
+    margin: 24px auto var(--content-gap) auto;
+}
+
+.post-title {
+    margin-bottom: 2px;
+    font-size: 40px;
+}
+
+.post-description {
+    margin-top: 10px;
+    margin-bottom: 5px;
+}
+
+.post-meta,
+.breadcrumbs {
+    color: var(--secondary);
+    font-size: 14px;
+}
+
+.breadcrumbs {
+    display: flex;
+    flex-wrap: wrap;
+    align-items: center;
+}
+
+.i18n_list {
+    display: inline-flex;
+}
+
+.post-meta .i18n_list li {
+    list-style: none;
+    margin: auto 3px;
+}
+
+.breadcrumbs a {
+    font-size: 16px;
+}
+
+.post-content {
+    color: var(--content);
+    margin: 30px 0;
+}
+
+.post-content h3,
+.post-content h4,
+.post-content h5,
+.post-content h6 {
+    margin: 24px 0 16px;
+}
+
+.post-content h1 {
+    margin: 40px auto 32px;
+    font-size: 40px;
+}
+
+.post-content h2 {
+    margin: 32px auto 24px;
+    font-size: 32px;
+}
+
+.post-content h3 {
+    font-size: 24px;
+}
+
+.post-content h4 {
+    font-size: 16px;
+}
+
+.post-content h5 {
+    font-size: 14px;
+}
+
+.post-content h6 {
+    font-size: 12px;
+}
+
+.post-content a,
+.post-meta .i18n_list li a,
+.toc a:hover {
+    box-shadow: 0 1px 0;
+    box-decoration-break: clone;
+    -webkit-box-decoration-break: clone;
+}
+
+.post-content a code {
+    margin: auto 0;
+    border-radius: 0;
+    box-shadow: 0 -1px 0 var(--primary) inset;
+}
+
+.post-content del {
+    text-decoration: line-through;
+}
+
+.post-content dl,
+.post-content ol,
+.post-content p,
+.post-content figure,
+.post-content ul {
+    margin-bottom: var(--content-gap);
+}
+
+.post-content ol,
+.post-content ul {
+    padding-inline-start: 20px;
+}
+
+.post-content li {
+    margin-top: 5px;
+}
+
+.post-content li p {
+    margin-bottom: 0;
+}
+
+.post-content dl {
+    display: flex;
+    flex-wrap: wrap;
+    margin: 0;
+}
+
+.post-content dt {
+    width: 25%;
+    font-weight: 700;
+}
+
+.post-content dd {
+    width: 75%;
+    margin-inline-start: 0;
+    padding-inline-start: 10px;
+}
+
+.post-content dd~dd,
+.post-content dt~dt {
+    margin-top: 10px;
+}
+
+.post-content table {
+    margin-bottom: var(--content-gap);
+}
+
+.post-content table th,
+.post-content table:not(.highlighttable, .highlight table, .gist .highlight) td {
+    min-width: 80px;
+    padding: 8px 5px;
+    line-height: 1.5;
+    border-bottom: 1px solid var(--border);
+}
+
+.post-content table th {
+    text-align: start;
+}
+
+.post-content table:not(.highlighttable) td code:only-child {
+    margin: auto 0;
+}
+
+.post-content .highlight table {
+    border-radius: var(--radius);
+}
+
+.post-content .highlight:not(table) {
+    margin: 10px auto;
+    background: var(--code-block-bg) !important;
+    border-radius: var(--radius);
+    direction: ltr;
+}
+
+.post-content li>.highlight {
+    margin-inline-end: 0;
+}
+
+.post-content ul pre {
+    margin-inline-start: calc(var(--gap) * -2);
+}
+
+.post-content .highlight pre {
+    margin: 0;
+}
+
+.post-content .highlighttable {
+    table-layout: fixed;
+}
+
+.post-content .highlighttable td:first-child {
+    width: 40px;
+}
+
+.post-content .highlighttable td .linenodiv {
+    padding-inline-end: 0 !important;
+}
+
+.post-content .highlighttable td .highlight,
+.post-content .highlighttable td .linenodiv pre {
+    margin-bottom: 0;
+}
+
+.post-content code {
+    margin: auto 4px;
+    padding: 4px 6px;
+    font-size: 0.78em;
+    line-height: 1.5;
+    background: var(--code-bg);
+    border-radius: 2px;
+}
+
+.post-content pre code {
+    display: grid;
+    margin: auto 0;
+    padding: 10px;
+    color: rgb(213, 213, 214);
+    background: var(--code-block-bg) !important;
+    border-radius: var(--radius);
+    overflow-x: auto;
+    word-break: break-all;
+}
+
+.post-content blockquote {
+    margin: 20px 0;
+    padding: 0 14px;
+    border-inline-start: 3px solid var(--primary);
+}
+
+.post-content hr {
+    margin: 30px 0;
+    height: 2px;
+    background: var(--tertiary);
+    border: 0;
+}
+
+.post-content iframe {
+    max-width: 100%;
+}
+
+.post-content img {
+    border-radius: 4px;
+    margin: 1rem 0;
+}
+
+.post-content img[src*="#center"] {
+    margin: 1rem auto;
+}
+
+.post-content figure.align-center {
+    text-align: center;
+}
+
+.post-content figure>figcaption {
+    color: var(--primary);
+    font-size: 16px;
+    font-weight: bold;
+    margin: 8px 0 16px;
+}
+
+.post-content figure>figcaption>p {
+    color: var(--secondary);
+    font-size: 14px;
+    font-weight: normal;
+}
+
+.toc {
+    margin-bottom: var(--content-gap);
+    border: 1px solid var(--border);
+    background: var(--code-bg);
+    border-radius: var(--radius);
+    padding: 0.4em;
+}
+
+[data-theme="dark"] .toc {
+    background: var(--entry);
+}
+
+.toc details summary {
+    cursor: zoom-in;
+    margin-inline-start: 10px;
+    user-select: none;
+}
+
+.toc details[open] summary {
+    cursor: zoom-out;
+}
+
+.toc .details {
+    display: inline;
+    font-weight: 500;
+}
+
+.toc .inner {
+    margin: 5px 20px;
+    padding: 0 10px;
+    opacity: 0.9;
+}
+
+.toc li ul {
+    margin-inline-start: var(--gap);
+}
+
+.toc summary:focus {
+    outline: 0;
+}
+
+.post-footer {
+    margin-top: var(--content-gap);
+}
+
+.post-footer>* {
+    margin-bottom: 10px;
+}
+
+.post-tags {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 10px;
+}
+
+.post-tags li {
+    display: inline-block;
+}
+
+.post-tags a,
+.share-buttons,
+.paginav {
+    border-radius: var(--radius);
+    background: var(--code-bg);
+    border: 1px solid var(--border);
+}
+
+.post-tags a {
+    display: block;
+    padding: 0 14px;
+    color: var(--secondary);
+    font-size: 14px;
+    line-height: 34px;
+    background: var(--code-bg);
+}
+
+.post-tags a:hover,
+.paginav a:hover {
+    background: var(--border);
+}
+
+.share-buttons {
+    padding: 10px;
+    display: flex;
+    justify-content: center;
+    overflow-x: auto;
+    gap: 10px;
+}
+
+.share-buttons li,
+.share-buttons a {
+    display: inline-flex;
+}
+
+.share-buttons a:not(:last-of-type) {
+    margin-inline-end: 12px;
+}
+
+h1:hover .anchor,
+h2:hover .anchor,
+h3:hover .anchor,
+h4:hover .anchor,
+h5:hover .anchor,
+h6:hover .anchor {
+    display: inline-flex;
+    color: var(--secondary);
+    margin-inline-start: 8px;
+    font-weight: 500;
+    user-select: none;
+}
+
+.paginav {
+    display: flex;
+    line-height: 30px;
+}
+
+.paginav a {
+    padding-inline-start: 14px;
+    padding-inline-end: 14px;
+    border-radius: var(--radius);
+}
+
+.paginav .title {
+    letter-spacing: 1px;
+    text-transform: uppercase;
+    font-size: small;
+    color: var(--secondary);
+}
+
+.paginav .prev,
+.paginav .next {
+    width: 50%;
+}
+
+.paginav span:hover:not(.title) {
+    box-shadow: 0 1px 0;
+}
+
+.paginav .next {
+    margin-inline-start: auto;
+    text-align: right;
+}
+
+[dir="rtl"] .paginav .next {
+    text-align: left;
+}
+
+h1>a>svg {
+    display: inline;
+}
+
+img.in-text {
+    display: inline;
+    margin: auto;
+}
diff --git a/themes/PaperMod/assets/css/common/profile-mode.css b/themes/PaperMod/assets/css/common/profile-mode.css
new file mode 100644 (file)
index 0000000..9e98df5
--- /dev/null
@@ -0,0 +1,43 @@
+.buttons,
+.main .profile {
+    display: flex;
+    justify-content: center;
+}
+
+.main .profile {
+    align-items: center;
+    min-height: calc(100vh - var(--header-height) - var(--footer-height) - (var(--gap) * 2));
+    text-align: center;
+}
+
+.profile .profile_inner {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    gap: 10px;
+}
+
+.profile img {
+    border-radius: 50%;
+}
+
+.buttons {
+    flex-wrap: wrap;
+    max-width: 400px;
+}
+
+.button {
+    background: var(--tertiary);
+    border-radius: var(--radius);
+    margin: 8px;
+    padding: 6px;
+    transition: transform 0.1s;
+}
+
+.button-inner {
+    padding: 0 8px;
+}
+
+.button:active {
+    transform: scale(0.96);
+}
diff --git a/themes/PaperMod/assets/css/common/search.css b/themes/PaperMod/assets/css/common/search.css
new file mode 100644 (file)
index 0000000..38d5b6b
--- /dev/null
@@ -0,0 +1,45 @@
+#searchbox input {
+    padding: 4px 10px;
+    width: 100%;
+    color: var(--primary);
+    font-weight: bold;
+    border: 2px solid var(--tertiary);
+    border-radius: var(--radius);
+}
+
+#searchbox input:focus {
+    border-color: var(--secondary);
+}
+
+#searchResults li {
+    list-style: none;
+    border-radius: var(--radius);
+    padding: 10px;
+    margin: 10px 0;
+    position: relative;
+    font-weight: 500;
+}
+
+#searchResults {
+    margin: 10px 0;
+    width: 100%;
+}
+
+#searchResults li:active {
+    transition: transform 0.1s;
+    transform: scale(0.98);
+}
+
+#searchResults a {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    top: 0px;
+    left: 0px;
+    outline: none;
+}
+
+#searchResults .focus {
+    transform: scale(0.98);
+    border: 2px solid var(--tertiary);
+}
diff --git a/themes/PaperMod/assets/css/common/terms.css b/themes/PaperMod/assets/css/common/terms.css
new file mode 100644 (file)
index 0000000..244614b
--- /dev/null
@@ -0,0 +1,18 @@
+.terms-tags li {
+    display: inline-block;
+    margin: 10px;
+    font-weight: 500;
+}
+
+.terms-tags a {
+    display: block;
+    padding: 3px 10px;
+    background: var(--tertiary);
+    border-radius: 6px;
+    transition: transform 0.1s;
+}
+
+.terms-tags a:active {
+    background: var(--tertiary);
+    transform: scale(0.96);
+}
diff --git a/themes/PaperMod/assets/css/core/license.css b/themes/PaperMod/assets/css/core/license.css
new file mode 100644 (file)
index 0000000..47b9c6f
--- /dev/null
@@ -0,0 +1,6 @@
+/*
+  PaperMod v8+
+  License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE
+  Copyright (c) 2020 nanxiaobei and adityatelange
+  Copyright (c) 2021-2025 adityatelange
+*/
diff --git a/themes/PaperMod/assets/css/core/reset.css b/themes/PaperMod/assets/css/core/reset.css
new file mode 100644 (file)
index 0000000..7393d57
--- /dev/null
@@ -0,0 +1,118 @@
+*,
+::after,
+::before {
+    box-sizing: border-box;
+}
+
+html {
+    -webkit-tap-highlight-color: transparent;
+    overflow-y: scroll;
+    -webkit-text-size-adjust: 100%;
+    text-size-adjust: 100%;
+}
+
+a,
+button,
+body,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+    color: var(--primary);
+}
+
+body {
+    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+    font-size: 18px;
+    line-height: 1.6;
+    word-break: break-word;
+    background: var(--theme);
+}
+
+article,
+aside,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+nav,
+section,
+table {
+    display: block;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+    line-height: 1.2;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p {
+    margin-top: 0;
+    margin-bottom: 0;
+}
+
+ul {
+    padding: 0;
+}
+
+a {
+    text-decoration: none;
+}
+
+body,
+figure,
+ul {
+    margin: 0;
+}
+
+table {
+    width: 100%;
+    border-collapse: collapse;
+    border-spacing: 0;
+    overflow-x: auto;
+    word-break: keep-all;
+}
+
+button,
+input,
+textarea {
+    padding: 0;
+    font: inherit;
+    background: 0 0;
+    border: 0;
+}
+
+input,
+textarea {
+    outline: 0;
+}
+
+button,
+input[type=button],
+input[type=submit] {
+    cursor: pointer;
+}
+
+input:-webkit-autofill,
+textarea:-webkit-autofill {
+    box-shadow: 0 0 0 50px var(--theme) inset;
+}
+
+img {
+    display: block;
+    max-width: 100%;
+}
diff --git a/themes/PaperMod/assets/css/core/theme-vars.css b/themes/PaperMod/assets/css/core/theme-vars.css
new file mode 100644 (file)
index 0000000..1ce34ef
--- /dev/null
@@ -0,0 +1,40 @@
+:root {
+    --gap: 24px;
+    --content-gap: 20px;
+    --nav-width: 1024px;
+    --main-width: 720px;
+    --header-height: 60px;
+    --footer-height: 60px;
+    --radius: 8px;
+    --theme: rgb(255, 255, 255);
+    --entry: rgb(255, 255, 255);
+    --primary: rgb(30, 30, 30);
+    --secondary: rgb(108, 108, 108);
+    --tertiary: rgb(214, 214, 214);
+    --content: rgb(31, 31, 31);
+    --code-block-bg: rgb(28, 29, 33);
+    --code-bg: rgb(245, 245, 245);
+    --border: rgb(238, 238, 238);
+    color-scheme: light;
+}
+
+:root[data-theme="dark"] {
+    --theme: rgb(29, 30, 32);
+    --entry: rgb(46, 46, 51);
+    --primary: rgb(218, 218, 219);
+    --secondary: rgb(155, 156, 157);
+    --tertiary: rgb(65, 66, 68);
+    --content: rgb(196, 196, 197);
+    --code-block-bg: rgb(46, 46, 51);
+    --code-bg: rgb(55, 56, 62);
+    --border: rgb(51, 51, 51);
+    color-scheme: dark;
+}
+
+.list {
+    background: var(--code-bg);
+}
+
+[data-theme="dark"] .list {
+    background: var(--theme);
+}
diff --git a/themes/PaperMod/assets/css/core/zmedia.css b/themes/PaperMod/assets/css/core/zmedia.css
new file mode 100644 (file)
index 0000000..a68fd71
--- /dev/null
@@ -0,0 +1,55 @@
+@media screen and (max-width: 768px) {
+    /* theme-vars */
+    :root {
+        --gap: 14px;
+    }
+
+    /* profile-mode */
+    .profile img {
+        transform: scale(0.85);
+    }
+
+    /* post-entry */
+    .first-entry {
+        min-height: 260px;
+    }
+
+    /* archive */
+    .archive-month {
+        flex-direction: column;
+    }
+
+    .archive-year {
+        margin-top: 20px;
+    }
+
+    /* footer */
+    .footer {
+        padding: calc((var(--footer-height) - var(--gap) - 10px) / 2) var(--gap);
+    }
+}
+
+/* footer */
+@media screen and (max-width: 900px) {
+    .list .top-link {
+        transform: translateY(-5rem);
+    }
+}
+
+@media screen and (max-width: 340px) {
+    .share-buttons {
+        justify-content: unset;
+    }
+}
+
+@media (prefers-reduced-motion) {
+    /* terms; profile-mode; post-single; post-entry; post-entry; search; search */
+    .terms-tags a:active,
+    .button:active,
+    .post-entry:active,
+    .top-link,
+    #searchResults .focus,
+    #searchResults li:active {
+        transform: none;
+    }
+}
diff --git a/themes/PaperMod/assets/css/extended/blank.css b/themes/PaperMod/assets/css/extended/blank.css
new file mode 100644 (file)
index 0000000..9e2469d
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+This is just a placeholder blank stylesheet so as to support adding custom styles budled with theme's default styles
+
+Read https://github.com/adityatelange/hugo-PaperMod/wiki/FAQs#bundling-custom-css-with-themes-assets for more info
+*/
+
+body {
+       font-family: 'Lexend', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+       font-size: 18px;
+       line-height: 1.6;
+       word-break: break-word;
+       background: var(--theme);
+}
+
+.gallery {
+       display: flex;
+       flex-wrap: wrap;
+}
+.gallery figure,
+.gallery figure img {
+       text-align: center;
+}
+.gallery figure img {
+       margin: 1rem auto;
+}
+.gallery-cols-1 figure {
+       width: 100%;
+}
+.gallery-cols-2 figure {
+       width: 50%;
+}
+.gallery-cols-3 figure {
+       width: 33.3333333333%;
+}
+.gallery-cols-4 figure {
+       width: 25%;
+}
+.gallery-cols-5 figure {
+       width: 25%;
+}
+.gallery-cols-6 figure {
+       width: 16.666666666%;
+}
diff --git a/themes/PaperMod/assets/css/includes/chroma-mod.css b/themes/PaperMod/assets/css/includes/chroma-mod.css
new file mode 100644 (file)
index 0000000..ad89b96
--- /dev/null
@@ -0,0 +1,24 @@
+.chroma {
+    background-color: unset !important;
+}
+
+.chroma .hl {
+    display: flex;
+}
+
+.chroma .lnt {
+    padding: 0 0 0 12px;
+}
+
+.highlight pre.chroma code {
+    padding: 8px 0;
+}
+
+.highlight pre.chroma .line .cl,
+.chroma .ln {
+    padding: 0 10px;
+}
+
+.chroma .lntd:last-of-type {
+    width: 100%;
+}
diff --git a/themes/PaperMod/assets/css/includes/chroma-styles.css b/themes/PaperMod/assets/css/includes/chroma-styles.css
new file mode 100644 (file)
index 0000000..63a73ab
--- /dev/null
@@ -0,0 +1,86 @@
+/* Background */ .bg { color: #cad3f5; background-color: #24273a; }
+/* PreWrapper */ .chroma { color: #cad3f5; background-color: #24273a; }
+/* Other */ .chroma .x {  }
+/* Error */ .chroma .err { color: #ed8796 }
+/* CodeLine */ .chroma .cl {  }
+/* LineLink */ .chroma .lnlinks { outline: none; text-decoration: none; color: inherit }
+/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
+/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
+/* LineHighlight */ .chroma .hl { background-color: #474733 }
+/* LineNumbersTable */ .chroma .lnt { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #8087a2 }
+/* LineNumbers */ .chroma .ln { white-space: pre; -webkit-user-select: none; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #8087a2 }
+/* Line */ .chroma .line { display: flex; }
+/* Keyword */ .chroma .k { color: #c6a0f6 }
+/* KeywordConstant */ .chroma .kc { color: #f5a97f }
+/* KeywordDeclaration */ .chroma .kd { color: #ed8796 }
+/* KeywordNamespace */ .chroma .kn { color: #8bd5ca }
+/* KeywordPseudo */ .chroma .kp { color: #c6a0f6 }
+/* KeywordReserved */ .chroma .kr { color: #c6a0f6 }
+/* KeywordType */ .chroma .kt { color: #ed8796 }
+/* Name */ .chroma .n {  }
+/* NameAttribute */ .chroma .na { color: #8aadf4 }
+/* NameBuiltin */ .chroma .nb { color: #91d7e3 }
+/* NameBuiltinPseudo */ .chroma .bp { color: #91d7e3 }
+/* NameClass */ .chroma .nc { color: #eed49f }
+/* NameConstant */ .chroma .no { color: #eed49f }
+/* NameDecorator */ .chroma .nd { color: #8aadf4; font-weight: bold }
+/* NameEntity */ .chroma .ni { color: #8bd5ca }
+/* NameException */ .chroma .ne { color: #f5a97f }
+/* NameFunction */ .chroma .nf { color: #8aadf4 }
+/* NameFunctionMagic */ .chroma .fm { color: #8aadf4 }
+/* NameLabel */ .chroma .nl { color: #91d7e3 }
+/* NameNamespace */ .chroma .nn { color: #f5a97f }
+/* NameOther */ .chroma .nx {  }
+/* NameProperty */ .chroma .py { color: #f5a97f }
+/* NameTag */ .chroma .nt { color: #c6a0f6 }
+/* NameVariable */ .chroma .nv { color: #f4dbd6 }
+/* NameVariableClass */ .chroma .vc { color: #f4dbd6 }
+/* NameVariableGlobal */ .chroma .vg { color: #f4dbd6 }
+/* NameVariableInstance */ .chroma .vi { color: #f4dbd6 }
+/* NameVariableMagic */ .chroma .vm { color: #f4dbd6 }
+/* Literal */ .chroma .l {  }
+/* LiteralDate */ .chroma .ld {  }
+/* LiteralString */ .chroma .s { color: #a6da95 }
+/* LiteralStringAffix */ .chroma .sa { color: #ed8796 }
+/* LiteralStringBacktick */ .chroma .sb { color: #a6da95 }
+/* LiteralStringChar */ .chroma .sc { color: #a6da95 }
+/* LiteralStringDelimiter */ .chroma .dl { color: #8aadf4 }
+/* LiteralStringDoc */ .chroma .sd { color: #6e738d }
+/* LiteralStringDouble */ .chroma .s2 { color: #a6da95 }
+/* LiteralStringEscape */ .chroma .se { color: #8aadf4 }
+/* LiteralStringHeredoc */ .chroma .sh { color: #6e738d }
+/* LiteralStringInterpol */ .chroma .si { color: #a6da95 }
+/* LiteralStringOther */ .chroma .sx { color: #a6da95 }
+/* LiteralStringRegex */ .chroma .sr { color: #8bd5ca }
+/* LiteralStringSingle */ .chroma .s1 { color: #a6da95 }
+/* LiteralStringSymbol */ .chroma .ss { color: #a6da95 }
+/* LiteralNumber */ .chroma .m { color: #f5a97f }
+/* LiteralNumberBin */ .chroma .mb { color: #f5a97f }
+/* LiteralNumberFloat */ .chroma .mf { color: #f5a97f }
+/* LiteralNumberHex */ .chroma .mh { color: #f5a97f }
+/* LiteralNumberInteger */ .chroma .mi { color: #f5a97f }
+/* LiteralNumberIntegerLong */ .chroma .il { color: #f5a97f }
+/* LiteralNumberOct */ .chroma .mo { color: #f5a97f }
+/* Operator */ .chroma .o { color: #91d7e3; font-weight: bold }
+/* OperatorWord */ .chroma .ow { color: #91d7e3; font-weight: bold }
+/* Punctuation */ .chroma .p {  }
+/* Comment */ .chroma .c { color: #6e738d; font-style: italic }
+/* CommentHashbang */ .chroma .ch { color: #6e738d; font-style: italic }
+/* CommentMultiline */ .chroma .cm { color: #6e738d; font-style: italic }
+/* CommentSingle */ .chroma .c1 { color: #6e738d; font-style: italic }
+/* CommentSpecial */ .chroma .cs { color: #6e738d; font-style: italic }
+/* CommentPreproc */ .chroma .cp { color: #6e738d; font-style: italic }
+/* CommentPreprocFile */ .chroma .cpf { color: #6e738d; font-weight: bold; font-style: italic }
+/* Generic */ .chroma .g {  }
+/* GenericDeleted */ .chroma .gd { color: #ed8796; background-color: #363a4f }
+/* GenericEmph */ .chroma .ge { font-style: italic }
+/* GenericError */ .chroma .gr { color: #ed8796 }
+/* GenericHeading */ .chroma .gh { color: #f5a97f; font-weight: bold }
+/* GenericInserted */ .chroma .gi { color: #a6da95; background-color: #363a4f }
+/* GenericOutput */ .chroma .go {  }
+/* GenericPrompt */ .chroma .gp {  }
+/* GenericStrong */ .chroma .gs { font-weight: bold }
+/* GenericSubheading */ .chroma .gu { color: #f5a97f; font-weight: bold }
+/* GenericTraceback */ .chroma .gt { color: #ed8796 }
+/* GenericUnderline */ .chroma .gl { text-decoration: underline }
+/* TextWhitespace */ .chroma .w {  }
diff --git a/themes/PaperMod/assets/css/includes/scroll-bar.css b/themes/PaperMod/assets/css/includes/scroll-bar.css
new file mode 100644 (file)
index 0000000..e88430b
--- /dev/null
@@ -0,0 +1,59 @@
+/* from reset */
+::-webkit-scrollbar-track {
+    background: 0 0;
+}
+
+::-webkit-scrollbar-thumb {
+    background: var(--tertiary);
+    border: 5px solid var(--theme);
+    border-radius: var(--radius);
+}
+
+[data-theme="light"] .list::-webkit-scrollbar-thumb {
+    border: 5px solid var(--code-bg);
+}
+
+::-webkit-scrollbar-thumb:hover {
+    background: var(--secondary);
+}
+
+::-webkit-scrollbar:not(.highlighttable, .highlight table, .gist .highlight) {
+    background: var(--theme);
+}
+
+/* from post-single */
+.post-content .highlighttable td .highlight pre code::-webkit-scrollbar {
+    display: none;
+}
+
+.post-content :not(table) ::-webkit-scrollbar-thumb {
+    border: 2px solid var(--code-block-bg);
+    background: rgb(113, 113, 117);
+}
+
+.post-content :not(table) ::-webkit-scrollbar-thumb:hover {
+    background: rgb(163, 163, 165);
+}
+
+.gist table::-webkit-scrollbar-thumb {
+    border: 2px solid rgb(255, 255, 255);
+    background: rgb(173, 173, 173);
+}
+
+.gist table::-webkit-scrollbar-thumb:hover {
+    background: rgb(112, 112, 112);
+}
+
+.post-content table::-webkit-scrollbar-thumb {
+    border-width: 2px;
+}
+
+/* from zmedia */
+@media screen and (min-width: 768px) {
+
+    /* reset */
+    ::-webkit-scrollbar {
+        width: 19px;
+        height: 11px;
+    }
+}
diff --git a/themes/PaperMod/assets/js/fastsearch.js b/themes/PaperMod/assets/js/fastsearch.js
new file mode 100644 (file)
index 0000000..9484e75
--- /dev/null
@@ -0,0 +1,152 @@
+import * as params from '@params';
+
+let fuse; // holds our search engine
+let resList = document.getElementById('searchResults');
+let sInput = document.getElementById('searchInput');
+let first, last, current_elem = null
+let resultsAvailable = false;
+
+// load our search index
+window.onload = function () {
+    let xhr = new XMLHttpRequest();
+    xhr.onreadystatechange = function () {
+        if (xhr.readyState === 4) {
+            if (xhr.status === 200) {
+                let data = JSON.parse(xhr.responseText);
+                if (data) {
+                    // fuse.js options; check fuse.js website for details
+                    let options = {
+                        distance: 100,
+                        threshold: 0.4,
+                        ignoreLocation: true,
+                        keys: [
+                            'title',
+                            'permalink',
+                            'summary',
+                            'content'
+                        ]
+                    };
+                    if (params.fuseOpts) {
+                        options = {
+                            isCaseSensitive: params.fuseOpts.iscasesensitive ?? false,
+                            includeScore: params.fuseOpts.includescore ?? false,
+                            includeMatches: params.fuseOpts.includematches ?? false,
+                            minMatchCharLength: params.fuseOpts.minmatchcharlength ?? 1,
+                            shouldSort: params.fuseOpts.shouldsort ?? true,
+                            findAllMatches: params.fuseOpts.findallmatches ?? false,
+                            keys: params.fuseOpts.keys ?? ['title', 'permalink', 'summary', 'content'],
+                            location: params.fuseOpts.location ?? 0,
+                            threshold: params.fuseOpts.threshold ?? 0.4,
+                            distance: params.fuseOpts.distance ?? 100,
+                            ignoreLocation: params.fuseOpts.ignorelocation ?? true
+                        }
+                    }
+                    fuse = new Fuse(data, options); // build the index from the json file
+                }
+            } else {
+                console.log(xhr.responseText);
+            }
+        }
+    };
+    xhr.open('GET', "../index.json");
+    xhr.send();
+}
+
+function activeToggle(ae) {
+    document.querySelectorAll('.focus').forEach(function (element) {
+        // rm focus class
+        element.classList.remove("focus")
+    });
+    if (ae) {
+        ae.focus()
+        document.activeElement = current_elem = ae;
+        ae.parentElement.classList.add("focus")
+    } else {
+        document.activeElement.parentElement.classList.add("focus")
+    }
+}
+
+function reset() {
+    resultsAvailable = false;
+    resList.innerHTML = sInput.value = ''; // clear inputbox and searchResults
+    sInput.focus(); // shift focus to input box
+}
+
+// execute search as each character is typed
+sInput.onkeyup = function (e) {
+    // run a search query (for "term") every time a letter is typed
+    // in the search box
+    if (fuse) {
+        let results;
+        if (params.fuseOpts) {
+            results = fuse.search(this.value.trim(), {limit: params.fuseOpts.limit}); // the actual query being run using fuse.js along with options
+        } else {
+            results = fuse.search(this.value.trim()); // the actual query being run using fuse.js
+        }
+        if (results.length !== 0) {
+            // build our html if result exists
+            let resultSet = ''; // our results bucket
+
+            for (let item in results) {
+                resultSet += `<li class="post-entry"><header class="entry-header">${results[item].item.title}&nbsp;»</header>` +
+                    `<a href="${results[item].item.permalink}" aria-label="${results[item].item.title}"></a></li>`
+            }
+
+            resList.innerHTML = resultSet;
+            resultsAvailable = true;
+            first = resList.firstChild;
+            last = resList.lastChild;
+        } else {
+            resultsAvailable = false;
+            resList.innerHTML = '';
+        }
+    }
+}
+
+sInput.addEventListener('search', function (e) {
+    // clicked on x
+    if (!this.value) reset()
+})
+
+// kb bindings
+document.onkeydown = function (e) {
+    let key = e.key;
+    let ae = document.activeElement;
+
+    let inbox = document.getElementById("searchbox").contains(ae)
+
+    if (ae === sInput) {
+        let elements = document.getElementsByClassName('focus');
+        while (elements.length > 0) {
+            elements[0].classList.remove('focus');
+        }
+    } else if (current_elem) ae = current_elem;
+
+    if (key === "Escape") {
+        reset()
+    } else if (!resultsAvailable || !inbox) {
+        return
+    } else if (key === "ArrowDown") {
+        e.preventDefault();
+        if (ae == sInput) {
+            // if the currently focused element is the search input, focus the <a> of first <li>
+            activeToggle(resList.firstChild.lastChild);
+        } else if (ae.parentElement != last) {
+            // if the currently focused element's parent is last, do nothing
+            // otherwise select the next search result
+            activeToggle(ae.parentElement.nextSibling.lastChild);
+        }
+    } else if (key === "ArrowUp") {
+        e.preventDefault();
+        if (ae.parentElement == first) {
+            // if the currently focused element is first item, go to input box
+            activeToggle(sInput);
+        } else if (ae != sInput) {
+            // if the currently focused element is input box, do nothing
+            // otherwise select the previous search result
+            activeToggle(ae.parentElement.previousSibling.lastChild);
+        }
+    } else if (key === "ArrowRight") {
+        ae.click(); // click on active link
+    }
+}
diff --git a/themes/PaperMod/assets/js/fuse.basic.min.js b/themes/PaperMod/assets/js/fuse.basic.min.js
new file mode 100644 (file)
index 0000000..7457721
--- /dev/null
@@ -0,0 +1,9 @@
+/**
+ * Fuse.js v7.0.0 - Lightweight fuzzy-search (http://fusejs.io)
+ *
+ * Copyright (c) 2023 Kiro Risk (http://kiro.me)
+ * All Rights Reserved. Apache Software License 2.0
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ */
+var e,t;e=this,t=function(){"use strict";function e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function t(t){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?e(Object(r),!0).forEach((function(e){a(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):e(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,h(r.key),r)}}function o(e,t,n){return t&&i(e.prototype,t),n&&i(e,n),Object.defineProperty(e,"prototype",{writable:!1}),e}function a(e,t,n){return(t=h(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function c(e){return function(e){if(Array.isArray(e))return s(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?s(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function h(e){var t=function(e,t){if("object"!=typeof e||null===e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}function u(e){return Array.isArray?Array.isArray(e):"[object Array]"===m(e)}var l=1/0;function d(e){return null==e?"":function(e){if("string"==typeof e)return e;var t=e+"";return"0"==t&&1/e==-l?"-0":t}(e)}function f(e){return"string"==typeof e}function v(e){return"number"==typeof e}function g(e){return!0===e||!1===e||function(e){return function(e){return"object"===n(e)}(e)&&null!==e}(e)&&"[object Boolean]"==m(e)}function y(e){return null!=e}function p(e){return!e.trim().length}function m(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":Object.prototype.toString.call(e)}var b=function(e){return"Missing ".concat(e," property in key")},k=function(e){return"Property 'weight' in key '".concat(e,"' must be a positive integer")},M=Object.prototype.hasOwnProperty,w=function(){function e(t){var n=this;r(this,e),this._keys=[],this._keyMap={};var i=0;t.forEach((function(e){var t=x(e);n._keys.push(t),n._keyMap[t.id]=t,i+=t.weight})),this._keys.forEach((function(e){e.weight/=i}))}return o(e,[{key:"get",value:function(e){return this._keyMap[e]}},{key:"keys",value:function(){return this._keys}},{key:"toJSON",value:function(){return JSON.stringify(this._keys)}}]),e}();function x(e){var t=null,n=null,r=null,i=1,o=null;if(f(e)||u(e))r=e,t=L(e),n=S(e);else{if(!M.call(e,"name"))throw new Error(b("name"));var a=e.name;if(r=a,M.call(e,"weight")&&(i=e.weight)<=0)throw new Error(k(a));t=L(a),n=S(a),o=e.getFn}return{path:t,id:n,weight:i,src:r,getFn:o}}function L(e){return u(e)?e:e.split(".")}function S(e){return u(e)?e.join("."):e}var _={useExtendedSearch:!1,getFn:function(e,t){var n=[],r=!1;return function e(t,i,o){if(y(t))if(i[o]){var a=t[i[o]];if(!y(a))return;if(o===i.length-1&&(f(a)||v(a)||g(a)))n.push(d(a));else if(u(a)){r=!0;for(var c=0,s=a.length;c<s;c+=1)e(a[c],i,o+1)}else i.length&&e(a,i,o+1)}else n.push(t)}(e,f(t)?t.split("."):t,0),r?n:n[0]},ignoreLocation:!1,ignoreFieldNorm:!1,fieldNormWeight:1},O=t(t(t(t({},{isCaseSensitive:!1,includeScore:!1,keys:[],shouldSort:!0,sortFn:function(e,t){return e.score===t.score?e.idx<t.idx?-1:1:e.score<t.score?-1:1}}),{includeMatches:!1,findAllMatches:!1,minMatchCharLength:1}),{location:0,threshold:.6,distance:100}),_),j=/[^ ]+/g,A=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t.getFn,i=void 0===n?O.getFn:n,o=t.fieldNormWeight,a=void 0===o?O.fieldNormWeight:o;r(this,e),this.norm=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,n=new Map,r=Math.pow(10,t);return{get:function(t){var i=t.match(j).length;if(n.has(i))return n.get(i);var o=1/Math.pow(i,.5*e),a=parseFloat(Math.round(o*r)/r);return n.set(i,a),a},clear:function(){n.clear()}}}(a,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return o(e,[{key:"setSources",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];this.keys=t,this._keysMap={},t.forEach((function(t,n){e._keysMap[t.id]=n}))}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,f(this.docs[0])?this.docs.forEach((function(t,n){e._addString(t,n)})):this.docs.forEach((function(t,n){e._addObject(t,n)})),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();f(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t<n;t+=1)this.records[t].i-=1}},{key:"getValueForItemAtKeyId",value:function(e,t){return e[this._keysMap[t]]}},{key:"size",value:function(){return this.records.length}},{key:"_addString",value:function(e,t){if(y(e)&&!p(e)){var n={v:e,i:t,n:this.norm.get(e)};this.records.push(n)}}},{key:"_addObject",value:function(e,t){var n=this,r={i:t,$:{}};this.keys.forEach((function(t,i){var o=t.getFn?t.getFn(e):n.getFn(e,t.path);if(y(o))if(u(o)){for(var a=[],c=[{nestedArrIndex:-1,value:o}];c.length;){var s=c.pop(),h=s.nestedArrIndex,l=s.value;if(y(l))if(f(l)&&!p(l)){var d={v:l,i:h,n:n.norm.get(l)};a.push(d)}else u(l)&&l.forEach((function(e,t){c.push({nestedArrIndex:t,value:e})}))}r.$[i]=a}else if(f(o)&&!p(o)){var v={v:o,n:n.norm.get(o)};r.$[i]=v}})),this.records.push(r)}},{key:"toJSON",value:function(){return{keys:this.keys,records:this.records}}}]),e}();function E(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.getFn,i=void 0===r?O.getFn:r,o=n.fieldNormWeight,a=void 0===o?O.fieldNormWeight:o,c=new A({getFn:i,fieldNormWeight:a});return c.setKeys(e.map(x)),c.setSources(t),c.create(),c}function I(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.errors,r=void 0===n?0:n,i=t.currentLocation,o=void 0===i?0:i,a=t.expectedLocation,c=void 0===a?0:a,s=t.distance,h=void 0===s?O.distance:s,u=t.ignoreLocation,l=void 0===u?O.ignoreLocation:u,d=r/e.length;if(l)return d;var f=Math.abs(c-o);return h?d+f/h:f?1:d}var F=32;function C(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},i=r.location,o=void 0===i?O.location:i,a=r.distance,c=void 0===a?O.distance:a,s=r.threshold,h=void 0===s?O.threshold:s,u=r.findAllMatches,l=void 0===u?O.findAllMatches:u,d=r.minMatchCharLength,f=void 0===d?O.minMatchCharLength:d,v=r.includeMatches,g=void 0===v?O.includeMatches:v,y=r.ignoreLocation,p=void 0===y?O.ignoreLocation:y;if(t.length>F)throw new Error("Pattern length exceeds max of ".concat(F,"."));for(var m,b=t.length,k=e.length,M=Math.max(0,Math.min(o,k)),w=h,x=M,L=f>1||g,S=L?Array(k):[];(m=e.indexOf(t,x))>-1;){var _=I(t,{currentLocation:m,expectedLocation:M,distance:c,ignoreLocation:p});if(w=Math.min(_,w),x=m+b,L)for(var j=0;j<b;)S[m+j]=1,j+=1}x=-1;for(var A=[],E=1,C=b+k,N=1<<b-1,P=0;P<b;P+=1){for(var W=0,T=C;W<T;)I(t,{errors:P,currentLocation:M+T,expectedLocation:M,distance:c,ignoreLocation:p})<=w?W=T:C=T,T=Math.floor((C-W)/2+W);C=T;var $=Math.max(1,M-T+1),D=l?k:Math.min(M+T,k)+b,K=Array(D+2);K[D+1]=(1<<P)-1;for(var z=D;z>=$;z-=1){var J=z-1,R=n[e.charAt(J)];if(L&&(S[J]=+!!R),K[z]=(K[z+1]<<1|1)&R,P&&(K[z]|=(A[z+1]|A[z])<<1|1|A[z+1]),K[z]&N&&(E=I(t,{errors:P,currentLocation:J,expectedLocation:M,distance:c,ignoreLocation:p}))<=w){if(w=E,(x=J)<=M)break;$=Math.max(1,2*M-x)}}if(I(t,{errors:P+1,currentLocation:M,expectedLocation:M,distance:c,ignoreLocation:p})>w)break;A=K}var U={isMatch:x>=0,score:Math.max(.001,E)};if(L){var B=function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:O.minMatchCharLength,n=[],r=-1,i=-1,o=0,a=e.length;o<a;o+=1){var c=e[o];c&&-1===r?r=o:c||-1===r||((i=o-1)-r+1>=t&&n.push([r,i]),r=-1)}return e[o-1]&&o-r>=t&&n.push([r,o-1]),n}(S,f);B.length?g&&(U.indices=B):U.isMatch=!1}return U}function N(e){for(var t={},n=0,r=e.length;n<r;n+=1){var i=e.charAt(n);t[i]=(t[i]||0)|1<<r-n-1}return t}var P=function(){function e(t){var n=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=i.location,a=void 0===o?O.location:o,c=i.threshold,s=void 0===c?O.threshold:c,h=i.distance,u=void 0===h?O.distance:h,l=i.includeMatches,d=void 0===l?O.includeMatches:l,f=i.findAllMatches,v=void 0===f?O.findAllMatches:f,g=i.minMatchCharLength,y=void 0===g?O.minMatchCharLength:g,p=i.isCaseSensitive,m=void 0===p?O.isCaseSensitive:p,b=i.ignoreLocation,k=void 0===b?O.ignoreLocation:b;if(r(this,e),this.options={location:a,threshold:s,distance:u,includeMatches:d,findAllMatches:v,minMatchCharLength:y,isCaseSensitive:m,ignoreLocation:k},this.pattern=m?t:t.toLowerCase(),this.chunks=[],this.pattern.length){var M=function(e,t){n.chunks.push({pattern:e,alphabet:N(e),startIndex:t})},w=this.pattern.length;if(w>F){for(var x=0,L=w%F,S=w-L;x<S;)M(this.pattern.substr(x,F),x),x+=F;if(L){var _=w-F;M(this.pattern.substr(_),_)}}else M(this.pattern,0)}}return o(e,[{key:"searchIn",value:function(e){var t=this.options,n=t.isCaseSensitive,r=t.includeMatches;if(n||(e=e.toLowerCase()),this.pattern===e){var i={isMatch:!0,score:0};return r&&(i.indices=[[0,e.length-1]]),i}var o=this.options,a=o.location,s=o.distance,h=o.threshold,u=o.findAllMatches,l=o.minMatchCharLength,d=o.ignoreLocation,f=[],v=0,g=!1;this.chunks.forEach((function(t){var n=t.pattern,i=t.alphabet,o=t.startIndex,y=C(e,n,i,{location:a+o,distance:s,threshold:h,findAllMatches:u,minMatchCharLength:l,includeMatches:r,ignoreLocation:d}),p=y.isMatch,m=y.score,b=y.indices;p&&(g=!0),v+=m,p&&b&&(f=[].concat(c(f),c(b)))}));var y={isMatch:g,score:g?v/this.chunks.length:1};return g&&r&&(y.indices=f),y}}]),e}(),W=[];function T(e,t){for(var n=0,r=W.length;n<r;n+=1){var i=W[n];if(i.condition(e,t))return new i(e,t)}return new P(e,t)}function $(e,t){var n=e.matches;t.matches=[],y(n)&&n.forEach((function(e){if(y(e.indices)&&e.indices.length){var n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.src),e.idx>-1&&(n.refIndex=e.idx),t.matches.push(n)}}))}function D(e,t){t.score=e.score}var K=function(){function e(n){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:void 0;if(r(this,e),this.options=t(t({},O),i),this.options.useExtendedSearch)throw new Error("Extended search is not available");this._keyStore=new w(this.options.keys),this.setCollection(n,o)}return o(e,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof A))throw new Error("Incorrect 'index' type");this._myIndex=t||E(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){y(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){return!1},t=[],n=0,r=this._docs.length;n<r;n+=1){var i=this._docs[n];e(i,n)&&(this.removeAt(n),n-=1,r-=1,t.push(i))}return t}},{key:"removeAt",value:function(e){this._docs.splice(e,1),this._myIndex.removeAt(e)}},{key:"getIndex",value:function(){return this._myIndex}},{key:"search",value:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).limit,n=void 0===t?-1:t,r=this.options,i=r.includeMatches,o=r.includeScore,a=r.shouldSort,c=r.sortFn,s=r.ignoreFieldNorm,h=f(e)?f(this._docs[0])?this._searchStringList(e):this._searchObjectList(e):this._searchLogical(e);return function(e,t){var n=t.ignoreFieldNorm,r=void 0===n?O.ignoreFieldNorm:n;e.forEach((function(e){var t=1;e.matches.forEach((function(e){var n=e.key,i=e.norm,o=e.score,a=n?n.weight:null;t*=Math.pow(0===o&&a?Number.EPSILON:o,(a||1)*(r?1:i))})),e.score=t}))}(h,{ignoreFieldNorm:s}),a&&h.sort(c),v(n)&&n>-1&&(h=h.slice(0,n)),function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.includeMatches,i=void 0===r?O.includeMatches:r,o=n.includeScore,a=void 0===o?O.includeScore:o,c=[];return i&&c.push($),a&&c.push(D),e.map((function(e){var n=e.idx,r={item:t[n],refIndex:n};return c.length&&c.forEach((function(t){t(e,r)})),r}))}(h,this._docs,{includeMatches:i,includeScore:o})}},{key:"_searchStringList",value:function(e){var t=T(e,this.options),n=this._myIndex.records,r=[];return n.forEach((function(e){var n=e.v,i=e.i,o=e.n;if(y(n)){var a=t.searchIn(n),c=a.isMatch,s=a.score,h=a.indices;c&&r.push({item:n,idx:i,matches:[{score:s,value:n,norm:o,indices:h}]})}})),r}},{key:"_searchLogical",value:function(e){throw new Error("Logical search is not available")}},{key:"_searchObjectList",value:function(e){var t=this,n=T(e,this.options),r=this._myIndex,i=r.keys,o=r.records,a=[];return o.forEach((function(e){var r=e.$,o=e.i;if(y(r)){var s=[];i.forEach((function(e,i){s.push.apply(s,c(t._findMatches({key:e,value:r[i],searcher:n})))})),s.length&&a.push({idx:o,item:r,matches:s})}})),a}},{key:"_findMatches",value:function(e){var t=e.key,n=e.value,r=e.searcher;if(!y(n))return[];var i=[];if(u(n))n.forEach((function(e){var n=e.v,o=e.i,a=e.n;if(y(n)){var c=r.searchIn(n),s=c.isMatch,h=c.score,u=c.indices;s&&i.push({score:h,key:t,value:n,idx:o,norm:a,indices:u})}}));else{var o=n.v,a=n.n,c=r.searchIn(o),s=c.isMatch,h=c.score,l=c.indices;s&&i.push({score:h,key:t,value:o,norm:a,indices:l})}return i}}]),e}();return K.version="7.0.0",K.createIndex=E,K.parseIndex=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.getFn,r=void 0===n?O.getFn:n,i=t.fieldNormWeight,o=void 0===i?O.fieldNormWeight:i,a=e.keys,c=e.records,s=new A({getFn:r,fieldNormWeight:o});return s.setKeys(a),s.setIndexRecords(c),s},K.config=O,K},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t();
\ No newline at end of file
diff --git a/themes/PaperMod/assets/js/license.js b/themes/PaperMod/assets/js/license.js
new file mode 100644 (file)
index 0000000..47b9c6f
--- /dev/null
@@ -0,0 +1,6 @@
+/*
+  PaperMod v8+
+  License: MIT https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE
+  Copyright (c) 2020 nanxiaobei and adityatelange
+  Copyright (c) 2021-2025 adityatelange
+*/
diff --git a/themes/PaperMod/go.mod b/themes/PaperMod/go.mod
new file mode 100644 (file)
index 0000000..af95855
--- /dev/null
@@ -0,0 +1,3 @@
+module github.com/adityatelange/hugo-PaperMod
+
+go 1.12
diff --git a/themes/PaperMod/i18n/ar.yaml b/themes/PaperMod/i18n/ar.yaml
new file mode 100644 (file)
index 0000000..52990c2
--- /dev/null
@@ -0,0 +1,28 @@
+- id: prev_page
+  translation: "السابق"
+
+- id: next_page
+  translation: "التالي"
+
+- id: read_time
+  translation:
+    one: "دقيقة واحدة"
+    two: "دقيقتان"
+    few: "بضع ثوان"
+    zero: "الآن"
+    other: "دقائق {{ .Count }}"
+
+- id: toc
+  translation: "فهرس المحتوى"
+
+- id: translations
+  translation: "ترجمات أخرى"
+  
+- id: home
+  translation: "الصفحة الرئيسية"
+
+- id: code_copied
+  translation: "تم النسخ!"
+
+- id: code_copy
+  translation: "نسخ الكود"
diff --git a/themes/PaperMod/i18n/be.yaml b/themes/PaperMod/i18n/be.yaml
new file mode 100644 (file)
index 0000000..22902ab
--- /dev/null
@@ -0,0 +1,39 @@
+- id: prev_page
+  translation: "Папярэдняя"
+
+- id: next_page
+  translation: "Наступная"
+
+- id: read_time
+  translation:
+    zero: "0 хвілін"
+    one: "1 хвіліна"
+    few: "{{ .Count }} хвіліны"
+    many: "{{ .Count }} хвілін"
+    other: "{{ .Count }} хвілін"
+
+- id: words
+  translation:
+    zero: "няма слоў"
+    one: "1 слова"
+    few: "{{ .Count }} слова"
+    many: "{{ .Count }} слоў"
+    other: "{{ .Count }} слова"
+
+- id: toc
+  translation: "Змест"
+
+- id: translations
+  translation: "Пераклады"
+
+- id: home
+  translation: "Галоўная"
+
+- id: edit_post
+  translation: "Рэдагаваць"
+
+- id: code_copy
+  translation: "капіяваць"
+
+- id: code_copied
+  translation: "скапіявана!"
diff --git a/themes/PaperMod/i18n/bg.yaml b/themes/PaperMod/i18n/bg.yaml
new file mode 100644 (file)
index 0000000..1e314af
--- /dev/null
@@ -0,0 +1,16 @@
+- id: prev_page
+  translation: "Предишна страница"
+
+- id: next_page
+  translation: "Следваща страница"
+
+- id: read_time
+  translation:
+    one : "1 мин"
+    other: "{{ .Count }} мин"
+
+- id: toc
+  translation: "Съдържание"
+
+- id: translations
+  translation: "Преводи"
diff --git a/themes/PaperMod/i18n/bn.yaml b/themes/PaperMod/i18n/bn.yaml
new file mode 100644 (file)
index 0000000..f42780f
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "পূর্ববর্তী"
+
+- id: next_page
+  translation: "পরবর্তী"
+
+- id: read_time
+  translation:
+    one : "১ মিনিট"
+    other: "{{ .Count }} মিনিট"
+    
+- id: words
+  translation:
+    one : "১ টি শব্দ"
+    other: "{{ .Count }} টি শব্দ"
+
+- id: toc
+  translation: "সূচিপত্র"
+
+- id: translations
+  translation: "অনুবাদসমূহ"
+
+- id: home
+  translation: "হোম"
+
+- id: edit_post
+  translation: "সম্পাদনা করুন"
+
+- id: code_copy
+  translation: "কপি করুন"
+
+- id: code_copied
+  translation: "কপি হয়েছে!"
diff --git a/themes/PaperMod/i18n/ca.yaml b/themes/PaperMod/i18n/ca.yaml
new file mode 100644 (file)
index 0000000..15713e1
--- /dev/null
@@ -0,0 +1,19 @@
+- id: prev_page
+  translation: "Pàgina anterior"
+
+- id: next_page
+  translation: "Pàgina següent"
+
+- id: read_time
+  translation:
+    one : "1 min"
+    other: "{{ .Count }} min"
+
+- id: toc
+  translation: "Taula de Continguts"
+
+- id: translations
+  translation: "Traduccions"
+
+- id: home
+  translation: "Inici"
diff --git a/themes/PaperMod/i18n/ckb.yaml b/themes/PaperMod/i18n/ckb.yaml
new file mode 100644 (file)
index 0000000..25789d1
--- /dev/null
@@ -0,0 +1,25 @@
+- id: prev_page
+  translation: "پەڕەی پێشتر"
+
+- id: next_page
+  translation: "پەڕەی دواتر"
+
+- id: read_time
+  translation:
+    one : "1 خولەک"
+    other: "{{ .Count }} خولەک"
+
+- id: toc
+  translation: "پێڕست"
+
+- id: translations
+  translation: "وەرگێڕانەکان"
+
+- id: home
+  translation: "ماڵەوە"
+
+- id: code_copy
+  translation: "لەبەری بگرەوە"
+
+- id: code_copied
+  translation: "لەبەر گیرایەوە!"
diff --git a/themes/PaperMod/i18n/cs.yaml b/themes/PaperMod/i18n/cs.yaml
new file mode 100644 (file)
index 0000000..058c3a1
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Předchozí"
+
+- id: next_page
+  translation: "Další"
+
+- id: read_time
+  translation:
+    one : "1 min"
+    other: "{{ .Count }} min"
+
+- id: words
+  translation:
+    one : "slovo"
+    other: "{{ .Count }} slov"
+
+- id: toc
+  translation: "Obsah"
+
+- id: translations
+  translation: "Překlady"
+
+- id: home
+  translation: "Domů"
+
+- id: edit_post
+  translation: "Upravit"
+
+- id: code_copy
+  translation: "kopírovat"
+
+- id: code_copied
+  translation: "zkopírováno!"
diff --git a/themes/PaperMod/i18n/da.yaml b/themes/PaperMod/i18n/da.yaml
new file mode 100644 (file)
index 0000000..03b0abe
--- /dev/null
@@ -0,0 +1,28 @@
+- id: prev_page
+  translation: "Forrige Side"
+
+- id: next_page
+  translation: "Næste Side"
+
+- id: read_time
+  translation:
+    one: "1 min"
+    other: "{{ .Count }} min"
+
+- id: toc
+  translation: "Indholdsfortegnelse"
+
+- id: translations
+  translation: "Oversættelser"
+
+- id: home
+  translation: "Start"
+
+- id: edit_post
+  translation: "Rediger"
+
+- id: code_copy
+  translation: "kopier"
+
+- id: code_copied
+  translation: "kopieret!"
diff --git a/themes/PaperMod/i18n/de.yaml b/themes/PaperMod/i18n/de.yaml
new file mode 100644 (file)
index 0000000..f64aad9
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Vorherige"
+
+- id: next_page
+  translation: "Nächste"
+
+- id: read_time
+  translation:
+    one: "1 Minute"
+    other: "{{ .Count }} Minuten"
+
+- id: words
+  translation:
+    one : "Wort"
+    other: "{{ .Count }} Wörter"
+
+- id: toc
+  translation: "Inhaltsverzeichnis"
+
+- id: translations
+  translation: "Übersetzungen"
+
+- id: home
+  translation: "Home"
+
+- id: edit_post
+  translation: "Bearbeiten"
+
+- id: code_copy
+  translation: "Kopieren"
+
+- id: code_copied
+  translation: "Kopiert!"
diff --git a/themes/PaperMod/i18n/el.yaml b/themes/PaperMod/i18n/el.yaml
new file mode 100644 (file)
index 0000000..4257bac
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Προηγούμενο"
+
+- id: next_page
+  translation: "Επόμενο"
+
+- id: read_time
+  translation:
+    one: "1 λεπτό"
+    other: "{{ .Count }} λεπτά"
+
+- id: words
+  translation:
+    one: "λέξη"
+    other: "{{ .Count }} λέξεις"
+
+- id: toc
+  translation: "Πίνακας Περιεχομένων"
+
+- id: translations
+  translation: "Μεταφράσεις"
+
+- id: home
+  translation: "Αρχική"
+
+- id: edit_post
+  translation: "Επεξεργασία"
+
+- id: code_copy
+  translation: "αντιγραφή"
+
+- id: code_copied
+  translation: "αντιγράφηκε!"
\ No newline at end of file
diff --git a/themes/PaperMod/i18n/en.yaml b/themes/PaperMod/i18n/en.yaml
new file mode 100644 (file)
index 0000000..3a1e215
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Prev"
+
+- id: next_page
+  translation: "Next"
+
+- id: read_time
+  translation:
+    one : "1 min"
+    other: "{{ .Count }} min"
+
+- id: words
+  translation:
+    one : "word"
+    other: "{{ .Count }} words"
+
+- id: toc
+  translation: "Table of Contents"
+
+- id: translations
+  translation: "Translations"
+
+- id: home
+  translation: "Home"
+
+- id: edit_post
+  translation: "Edit"
+
+- id: code_copy
+  translation: "copy"
+
+- id: code_copied
+  translation: "copied!"
diff --git a/themes/PaperMod/i18n/eo.yaml b/themes/PaperMod/i18n/eo.yaml
new file mode 100644 (file)
index 0000000..de5d744
--- /dev/null
@@ -0,0 +1,25 @@
+- id: prev_page
+  translation: "antaŭa paĝo"
+
+- id: next_page
+  translation: "sekva paĝo"
+
+- id: read_time
+  translation:
+    one : "1 min"
+    other: "{{ .Count }} min"
+
+- id: toc
+  translation: "Enhavo"
+
+- id: translations
+  translation: "tradukoj"
+
+- id: home
+  translation: "ĉefpaĝo"
+
+- id: code_copy
+  translation: "kopii"
+
+- id: code_copied
+  translation: "kopiite!"
diff --git a/themes/PaperMod/i18n/es.yaml b/themes/PaperMod/i18n/es.yaml
new file mode 100644 (file)
index 0000000..52a559c
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Anterior"
+
+- id: next_page
+  translation: "Siguiente"
+
+- id: read_time
+  translation:
+    one : "1 min"
+    other: "{{ .Count }} min"
+
+- id: words
+  translation:
+    one : "palabra"
+    other: "{{ .Count }} palabras"
+
+- id: toc
+  translation: "Tabla de Contenidos"
+
+- id: translations
+  translation: "Traducciones"
+
+- id: home
+  translation: "Inicio"
+
+- id: edit_post
+  translation: "Editar"
+
+- id: code_copy
+  translation: "copiar"
+
+- id: code_copied
+  translation: "¡copiado!"
diff --git a/themes/PaperMod/i18n/fa.yaml b/themes/PaperMod/i18n/fa.yaml
new file mode 100644 (file)
index 0000000..3fd5927
--- /dev/null
@@ -0,0 +1,28 @@
+- id: prev_page
+  translation: "صفحه قبلی"
+
+- id: next_page
+  translation: "صفحه بعدی"
+
+- id: read_time
+  translation:
+    one: "۱ دقیقه"
+    other: "{{ .Count }} دقیقه"
+
+- id: toc
+  translation: "فهرست مطالب"
+
+- id: translations
+  translation: "ترجمه ها"
+
+- id: home
+  translation: "خانه"
+
+- id: edit_post
+  translation: "ویرایش"
+
+- id: code_copy
+  translation: "کپی"
+
+- id: code_copied
+  translation: "کپی شد!"
\ No newline at end of file
diff --git a/themes/PaperMod/i18n/fi.yaml b/themes/PaperMod/i18n/fi.yaml
new file mode 100644 (file)
index 0000000..cbbf3c4
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Edellinen"
+
+- id: next_page
+  translation: "Seuraava"
+
+- id: read_time
+  translation:
+    one : "1 min"
+    other: "{{ .Count }} minuuttia"
+
+- id: words
+  translation:
+    one : "sana"
+    other: "{{ .Count }} sanaa"
+
+- id: toc
+  translation: "Sisällysluettelo"
+
+- id: translations
+  translation: "Käännökset"
+
+- id: home
+  translation: "Etusivu"
+
+- id: edit_post
+  translation: "Muokkaa"
+
+- id: code_copy
+  translation: "Kopioi"
+
+- id: code_copied
+  translation: "Kopioitu!"
diff --git a/themes/PaperMod/i18n/fr.yaml b/themes/PaperMod/i18n/fr.yaml
new file mode 100644 (file)
index 0000000..e48d8e9
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Précédent"
+
+- id: next_page
+  translation: "Suivant"
+
+- id: read_time
+  translation:
+    one : "1 min"
+    other: "{{ .Count }} min"
+
+- id: words
+  translation:
+    one : "mot"
+    other: "{{ .Count }} mots"
+
+- id: toc
+  translation: "Table des matières"
+
+- id: translations
+  translation: "Traductions"
+
+- id: home
+  translation: "Accueil"
+
+- id: edit_post
+  translation: "Modifier"
+
+- id: code_copy
+  translation: "Copier"
+
+- id: code_copied
+  translation: "Copié !"
diff --git a/themes/PaperMod/i18n/he.yaml b/themes/PaperMod/i18n/he.yaml
new file mode 100644 (file)
index 0000000..30c3e74
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "הקודם"
+
+- id: next_page
+  translation: "הבא"
+
+- id: read_time
+  translation:
+    one: "דקה אחת"
+    other: "{{ .Count }} דקות"
+
+- id: words
+  translation:
+    one: "מילה אחת"
+    other: "{{ .Count }} מילים"
+
+- id: toc
+  translation: "תוכן עניינים"
+
+- id: translations
+  translation: "תרגומים"
+
+- id: home
+  translation: "בית"
+
+- id: edit_post
+  translation: "ערוך"
+
+- id: code_copy
+  translation: "העתק"
+
+- id: code_copied
+  translation: "הועתק!"
diff --git a/themes/PaperMod/i18n/hi.yaml b/themes/PaperMod/i18n/hi.yaml
new file mode 100644 (file)
index 0000000..681efdc
--- /dev/null
@@ -0,0 +1,19 @@
+- id: prev_page
+  translation: "पिछला"
+
+- id: next_page
+  translation: "अगला"
+
+- id: read_time
+  translation:
+    one : "एक मिनट"
+    other: "{{ .Count }} मिनट"
+
+- id: edit_post
+  translation: "सुधारें"
+
+- id: toc
+  translation: "विषय - सूची"
+
+- id: translations
+  translation: "अनुवाद"
diff --git a/themes/PaperMod/i18n/hr.yaml b/themes/PaperMod/i18n/hr.yaml
new file mode 100644 (file)
index 0000000..2f2d228
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Prethodna stranica"
+
+- id: next_page
+  translation: "Sljedeća stranica"
+
+- id: read_time
+  translation:
+    one : "1 minuta"
+    other: "{{ .Count }} minute"
+
+- id: words
+  translation:
+    one : "riječ"
+    other: "{{ .Count }} riječi"
+
+- id: toc
+  translation: "Tablica Sadržaja"
+
+- id: translations
+  translation: "Prijevodi"
+
+- id: home
+  translation: "Početna stranica"
+
+- id: edit_post
+  translation: "Promjeni"
+
+- id: code_copy
+  translation: "kopiraj"
+
+- id: code_copied
+  translation: "kopirano!"
diff --git a/themes/PaperMod/i18n/hu.yaml b/themes/PaperMod/i18n/hu.yaml
new file mode 100644 (file)
index 0000000..a039dda
--- /dev/null
@@ -0,0 +1,16 @@
+- id: prev_page
+  translation: "Előző oldal"
+
+- id: next_page
+  translation: "Következő oldal"
+
+- id: read_time
+  translation:
+    one: "1 perc"
+    other: "{{ .Count }} perc"
+
+- id: toc
+  translation: "Tartalomjegyzék"
+
+- id: translations
+  translation: "Fordítások"
diff --git a/themes/PaperMod/i18n/id.yaml b/themes/PaperMod/i18n/id.yaml
new file mode 100644 (file)
index 0000000..93d34f5
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Sebelumnya"
+
+- id: next_page
+  translation: "Selanjutnya"
+
+- id: read_time
+  translation:
+    one : "1 menit"
+    other: "{{ .Count }} menit"
+
+- id: words
+  translation:
+    one : "kata"
+    other: "{{ .Count }} kata"
+
+- id: toc
+  translation: "Daftar isi"
+
+- id: translations
+  translation: "Terjemahan"
+
+- id: home
+  translation: "Beranda"
+
+- id: edit_post
+  translation: "Sunting"
+
+- id: code_copy
+  translation: "salin"
+
+- id: code_copied
+  translation: "disalin!"
\ No newline at end of file
diff --git a/themes/PaperMod/i18n/it.yaml b/themes/PaperMod/i18n/it.yaml
new file mode 100644 (file)
index 0000000..c87c95d
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Precedente"
+
+- id: next_page
+  translation: "Successivo"
+
+- id: read_time
+  translation:
+    one: "1 minuto"
+    other: "{{ .Count }} minuti"
+
+- id: words
+  translation:
+    one : "parola"
+    other: "{{ .Count }} parole"
+
+- id: toc
+  translation: "Indice contenuti"
+
+- id: translations
+  translation: "Traduzioni"
+
+- id: home
+  translation: "Home"
+
+- id: edit_post
+  translation: "Modifica"
+
+- id: code_copy
+  translation: "copia"
+
+- id: code_copied
+  translation: "copiato!"
diff --git a/themes/PaperMod/i18n/ja.yaml b/themes/PaperMod/i18n/ja.yaml
new file mode 100644 (file)
index 0000000..93948d3
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "前へ"
+
+- id: next_page
+  translation: "次へ"
+
+- id: read_time
+  translation:
+    one : "1 分"
+    other: "{{ .Count }} 分"
+
+- id: words
+  translation:
+    one: "文字"
+    other: "{{ .Count }} 文字"
+
+- id: toc
+  translation: "目次"
+
+- id: translations
+  translation: "言語"
+
+- id: home
+  translation: "ホーム"
+
+- id: edit_post
+  translation: "編集"
+
+- id: code_copy
+  translation: "コピー"
+
+- id: code_copied
+  translation: "コピーされました!"
diff --git a/themes/PaperMod/i18n/ko.yaml b/themes/PaperMod/i18n/ko.yaml
new file mode 100644 (file)
index 0000000..777dd93
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "이전 페이지"
+
+- id: next_page
+  translation: "다음 페이지"
+
+- id: read_time
+  translation:
+    one : "1 분"
+    other: "{{ .Count }} 분"
+
+- id: words
+  translation:
+    one : "단어"
+    other: "{{ .Count }} 단어"
+
+- id: toc
+  translation: "목차"
+
+- id: translations
+  translation: "번역"
+
+- id: home
+  translation: "홈"
+
+- id: edit_post
+  translation: "편집"
+
+- id: code_copy
+  translation: "복사"
+
+- id: code_copied
+  translation: "복사 완료!"
diff --git a/themes/PaperMod/i18n/ku.yaml b/themes/PaperMod/i18n/ku.yaml
new file mode 100644 (file)
index 0000000..d1d30a5
--- /dev/null
@@ -0,0 +1,25 @@
+- id: prev_page
+  translation: "Rûpela Paş"
+
+- id: next_page
+  translation: "Rûpela Pêş"
+
+- id: read_time
+  translation:
+    one : "1 xulek"
+    other: "{{ .Count }} xulek"
+
+- id: toc
+  translation: "Pêrist"
+
+- id: translations
+  translation: "Wergeran"
+
+- id: home
+  translation: "Xanî"
+
+- id: code_copy
+  translation: "Jê bigire"
+
+- id: code_copied
+  translation: "Hat jêgirtin!"
diff --git a/themes/PaperMod/i18n/mn.yaml b/themes/PaperMod/i18n/mn.yaml
new file mode 100644 (file)
index 0000000..dbce2ce
--- /dev/null
@@ -0,0 +1,25 @@
+- id: prev_page
+  translation: "Ѳмнѳх"
+
+- id: next_page
+  translation: "Дараах"
+
+- id: read_time
+  translation:
+    one : "1 МИН"
+    other: "{{ .Count }} МИН"
+
+- id: toc
+  translation: "Агуулга"
+
+- id: translations
+  translation: "Орчуулга"
+
+- id: home
+  translation: "Нүүр"
+
+- id: code_copy
+  translation: "хуулах"
+
+- id: code_copied
+  translation: "хуулсан!"
diff --git a/themes/PaperMod/i18n/ms.yaml b/themes/PaperMod/i18n/ms.yaml
new file mode 100644 (file)
index 0000000..d8a9eff
--- /dev/null
@@ -0,0 +1,28 @@
+- id: prev_page
+  translation: "Halaman Sebelumnya"
+
+- id: next_page
+  translation: "Halaman Seterusnya"
+
+- id: read_time
+  translation:
+    one: "1 minit"
+    other: "{{ .Count }} minit"
+
+- id: toc
+  translation: "Isi Kandungan"
+
+- id: translations
+  translation: "Terjemahan"
+
+- id: home
+  translation: "Home"
+
+- id: edit_post
+  translation: "Sunting"
+
+- id: code_copy
+  translation: "Salin"
+
+- id: code_copied
+  translation: "Disalin!"
diff --git a/themes/PaperMod/i18n/nl.yaml b/themes/PaperMod/i18n/nl.yaml
new file mode 100644 (file)
index 0000000..e9d06fa
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Vorige"
+
+- id: next_page
+  translation: "Volgende"
+
+- id: read_time
+  translation:
+      one: "1 min"
+      other: "{{ .Count }} min"
+
+- id: words
+  translation:
+    one : "woord"
+    other: "{{ .Count }} woorden"
+
+- id: toc
+  translation: "Inhoudsopgave"
+
+- id: translations
+  translation: "Vertalingen"
+
+- id: home
+  translation: "Startpagina"
+
+- id: edit_post
+  translation: "Bewerk"
+
+- id: code_copy
+  translation: "kopieer"
+
+- id: code_copied
+  translation: "gekopieerd!"
diff --git a/themes/PaperMod/i18n/no.yaml b/themes/PaperMod/i18n/no.yaml
new file mode 100644 (file)
index 0000000..2400348
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Forrige Side"
+
+- id: next_page
+  translation: "Neste Side"
+
+- id: read_time
+  translation:
+    one: "1 min"
+    other: "{{ .Count }} min"
+
+- id: words
+  translation:
+    one: "ord"
+    other: "{{ .Count }} ord"
+
+- id: toc
+  translation: "Innholdsfortegnelse"
+
+- id: translations
+  translation: "Oversettelser"
+
+- id: home
+  translation: "Hjem"
+
+- id: edit_post
+  translation: "Rediger"
+
+- id: code_copy
+  translation: "Kopier"
+
+- id: code_copied
+  translation: "Kopiert!"
diff --git a/themes/PaperMod/i18n/oc.yaml b/themes/PaperMod/i18n/oc.yaml
new file mode 100644 (file)
index 0000000..9292fd8
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Prec."
+
+- id: next_page
+  translation: "Seg."
+
+- id: read_time
+  translation:
+    one : "1 min"
+    other: "{{ .Count }} min"
+
+- id: words
+  translation:
+    one : "mot"
+    other: "{{ .Count }} motss"
+
+- id: toc
+  translation: "Taula de contengut"
+
+- id: translations
+  translation: "Traduccions"
+
+- id: home
+  translation: "Acuèlh"
+
+- id: edit_post
+  translation: "Modificar"
+
+- id: code_copy
+  translation: "copiar"
+
+- id: code_copied
+  translation: "copiat !"
diff --git a/themes/PaperMod/i18n/pa.yaml b/themes/PaperMod/i18n/pa.yaml
new file mode 100644 (file)
index 0000000..32192c5
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "ਪਿਛਲਾ"
+
+- id: next_page
+  translation: "ਅਗਲਾ"
+
+- id: read_time
+  translation:
+    one: "1 ਮਿੰਟ"
+    other: "{{ .Count }} ਮਿੰਟ"
+
+- id: words
+  translation:
+    one: "ਸ਼ਬਦ"
+    other: "{{ .Count }} ਸ਼ਬਦ"
+
+- id: toc
+  translation: "ਤਤਕਰਾ"
+
+- id: translations
+  translation: "ਅਨੁਵਾਦ"
+
+- id: home
+  translation: "ਘਰ"
+
+- id: edit_post
+  translation: "ਸੋਧ"
+
+- id: code_copy
+  translation: "ਕਾਪੀ"
+
+- id: code_copied
+  translation: "ਕਾਪੀ ਕੀਤੀ ਗਈ!!"
diff --git a/themes/PaperMod/i18n/pl.yaml b/themes/PaperMod/i18n/pl.yaml
new file mode 100644 (file)
index 0000000..81b0e77
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Poprzednia"
+
+- id: next_page
+  translation: "Następna"
+
+- id: read_time
+  translation:
+      one: "1 min"
+      other: "{{ .Count }} min"
+
+- id: words
+  translation:
+    one : "słowo"
+    other: "{{ .Count }} słów"
+
+- id: toc
+  translation: "Spis treści"
+
+- id: translations
+  translation: "Tłumaczenia"
+
+- id: home
+  translation: "Strona Główna"
+
+- id: edit_post
+  translation: "Edytuj"
+
+- id: code_copy
+  translation: "Kopiuj"
+
+- id: code_copied
+  translation: "Skopiowano!"
diff --git a/themes/PaperMod/i18n/pnb.yaml b/themes/PaperMod/i18n/pnb.yaml
new file mode 100644 (file)
index 0000000..fa2f8a8
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "پِچھلا"
+
+- id: next_page
+  translation: "اگلا"
+
+- id: read_time
+  translation:
+    one: "ایک منٹ"
+    other: "مِنٹ {{ .Count }}"
+
+- id: words
+  translation:
+    one: "لفظ"
+    other: "لفظ {{ .Count }}"
+
+- id: toc
+  translation: "تتکرا"
+
+- id: translations
+  translation: "انوواد"
+
+- id: home
+  translation: "گھر"
+
+- id: edit_post
+  translation: "سودھ"
+
+- id: code_copy
+  translation: "کاپی"
+
+- id: code_copied
+  translation: "کاپی کیتی گئی!"
diff --git a/themes/PaperMod/i18n/pt.yaml b/themes/PaperMod/i18n/pt.yaml
new file mode 100644 (file)
index 0000000..ab06429
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Página Anterior"
+
+- id: next_page
+  translation: "Próxima Página"
+
+- id: read_time
+  translation:
+    one: "1 minuto"
+    other: "{{ .Count }} minutos"
+
+- id: words
+  translation:
+    one : "palavra"
+    other: "{{ .Count }} palavras"
+
+- id: toc
+  translation: "Conteúdo"
+
+- id: translations
+  translation: "Traduções"
+  
+- id: home
+  translation: "Início"
+
+- id: edit_post
+  translation: "Editar"
+
+- id: code_copy
+  translation: "copiar"
+
+- id: code_copied
+  translation: "copiado!"
diff --git a/themes/PaperMod/i18n/ro.yaml b/themes/PaperMod/i18n/ro.yaml
new file mode 100644 (file)
index 0000000..694f20b
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Înapoi"
+
+- id: next_page
+  translation: "Înainte"
+
+- id: read_time
+  translation:
+    one : "1 minut"
+    other: "{{ .Count }} minute"
+
+- id: words
+  translation:
+    one : "cuvânt"
+    other: "{{ .Count }} cuvinte"
+
+- id: toc
+  translation: "Sumar"
+
+- id: translations
+  translation: "Traduceri"
+
+- id: home
+  translation: "Acasă"
+
+- id: edit_post
+  translation: "Editează"
+
+- id: code_copy
+  translation: "copiază"
+
+- id: code_copied
+  translation: "copiat!"
diff --git a/themes/PaperMod/i18n/ru.yaml b/themes/PaperMod/i18n/ru.yaml
new file mode 100644 (file)
index 0000000..a5dbb5c
--- /dev/null
@@ -0,0 +1,39 @@
+- id: prev_page
+  translation: "Предыдущая"
+
+- id: next_page
+  translation: "Следующая"
+
+- id: read_time
+  translation:
+    zero: "0 минут"
+    one: "1 минута"
+    few: "{{ .Count }} минуты"
+    many: "{{ .Count }} минут"
+    other: "{{ .Count }} минута"
+
+- id: words
+  translation:
+    zero: "0 слов"
+    one: "1 слово"
+    few: "{{ .Count }} слова"
+    many: "{{ .Count }} слов"
+    other: "{{ .Count }} слово"
+
+- id: toc
+  translation: "Оглавление"
+
+- id: translations
+  translation: "Переводы"
+
+- id: home
+  translation: "Главная"
+
+- id: edit_post
+  translation: "Редактировать"
+
+- id: code_copy
+  translation: "копировать"
+
+- id: code_copied
+  translation: "скопировано!"
\ No newline at end of file
diff --git a/themes/PaperMod/i18n/sk.yaml b/themes/PaperMod/i18n/sk.yaml
new file mode 100644 (file)
index 0000000..f129d37
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Predch"
+
+- id: next_page
+  translation: "Ďaľší"
+
+- id: read_time
+  translation:
+    one : "1 min"
+    other: "{{ .Count }} min"
+
+- id: words
+  translation:
+    one : "slovo"
+    other: "{{ .Count }} slov"
+
+- id: toc
+  translation: "Obsah"
+
+- id: translations
+  translation: "Preklady"
+
+- id: home
+  translation: "Domov"
+
+- id: edit_post
+  translation: "Upraviť"
+
+- id: code_copy
+  translation: "kopírovať"
+
+- id: code_copied
+  translation: "skopírované!"
diff --git a/themes/PaperMod/i18n/sv.yaml b/themes/PaperMod/i18n/sv.yaml
new file mode 100644 (file)
index 0000000..65ce422
--- /dev/null
@@ -0,0 +1,28 @@
+- id: prev_page
+  translation: "Förra Sidan"
+
+- id: next_page
+  translation: "Nästa Sida"
+
+- id: read_time
+  translation:
+    one: "1 min"
+    other: "{{ .Count }} min"
+
+- id: toc
+  translation: "Innehållsförteckning"
+
+- id: translations
+  translation: "Översättningar"
+
+- id: home
+  translation: "Hem"
+
+- id: edit_post
+  translation: "Redigera"
+
+- id: code_copy
+  translation: "kopiera"
+
+- id: code_copied
+  translation: "kopierad!"
diff --git a/themes/PaperMod/i18n/sw.yaml b/themes/PaperMod/i18n/sw.yaml
new file mode 100644 (file)
index 0000000..5fceb1a
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Uliopita"
+
+- id: next_page
+  translation: "Ujao"
+
+- id: read_time
+  translation:
+    one : "dakika 1"
+    other: "dakika {{ .Count }}"
+
+- id: words
+  translation:
+    one : "neno"
+    other: "maneno {{ .Count }}"
+
+- id: toc
+  translation: "Jedwali la Yaliyomo"
+
+- id: translations
+  translation: "Tafsiri"
+
+- id: home
+  translation: "Mwanzo"
+
+- id: edit_post
+  translation: "Hariri"
+
+- id: code_copy
+  translation: "nakili"
+
+- id: code_copied
+  translation: "nakiliwa!"
diff --git a/themes/PaperMod/i18n/th.yaml b/themes/PaperMod/i18n/th.yaml
new file mode 100644 (file)
index 0000000..d8036ae
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "ก่อนหน้า"
+
+- id: next_page
+  translation: "ถัดไป"
+
+- id: read_time
+  translation:
+    one : "1 นาที"
+    other: "{{ .Count }} นาที"
+
+- id: words
+  translation:
+    one : "คำ"
+    other: "{{ .Count }} คำ"
+
+- id: toc
+  translation: "สารบัญ"
+
+- id: translations
+  translation: "การแปล"
+
+- id: home
+  translation: "หน้าหลัก"
+
+- id: edit_post
+  translation: "แก้ไข"
+
+- id: code_copy
+  translation: "คัดลอก"
+
+- id: code_copied
+  translation: "คัดลอกแล้ว!"
diff --git a/themes/PaperMod/i18n/tr.yaml b/themes/PaperMod/i18n/tr.yaml
new file mode 100644 (file)
index 0000000..b014a15
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Önceki"
+
+- id: next_page
+  translation: "Sonraki"
+
+- id: read_time
+  translation:
+    one : "1 dk"
+    other: "{{ .Count }} dk"
+
+- id: words
+  translation:
+    one : "sözcük"
+    other: "{{ .Count }} sözcük"
+
+- id: toc
+  translation: "İçindekiler"
+
+- id: translations
+  translation: "Çeviriler"
+
+- id: home
+  translation: "Ana Sayfa"
+
+- id: edit_post
+  translation: "Düzenle"
+
+- id: code_copy
+  translation: "Kopyala"
+
+- id: code_copied
+  translation: "Kopyalandı!"
diff --git a/themes/PaperMod/i18n/uk.yaml b/themes/PaperMod/i18n/uk.yaml
new file mode 100644 (file)
index 0000000..41be964
--- /dev/null
@@ -0,0 +1,25 @@
+- id: prev_page
+  translation: "Попередня"
+
+- id: next_page
+  translation: "Наступна"
+
+- id: read_time
+  translation:
+    one : "1 хвилина"
+    other: "{{ .Count }} хвилин"
+
+- id: toc
+  translation: "Зміст"
+
+- id: translations
+  translation: "Переклади"
+
+- id: home
+  translation: "Головна"
+
+- id: code_copy
+  translation: "копіювати"
+
+- id: code_copied
+  translation: "скопійовано!"
\ No newline at end of file
diff --git a/themes/PaperMod/i18n/uz.yaml b/themes/PaperMod/i18n/uz.yaml
new file mode 100644 (file)
index 0000000..c9f2375
--- /dev/null
@@ -0,0 +1,20 @@
+- id: prev_page\r
+  translation: "Oldingi sahifa"\r
+\r
+- id: next_page\r
+  translation: "Keyingi sahifa"\r
+\r
+- id: read_time\r
+  translation:\r
+    one : "Bir daqiqa"\r
+    other: "{{ .Count }} daqiqa"\r
+\r
+- id: toc\r
+  translation: "Mundarija"\r
+\r
+- id: translations\r
+  translation: "Tarjimalar"\r
+\r
+- id: home\r
+  translation: "Bosh sahifa"\r
+  \r
diff --git a/themes/PaperMod/i18n/vi.yaml b/themes/PaperMod/i18n/vi.yaml
new file mode 100644 (file)
index 0000000..2eb05d0
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "Trang trước"
+
+- id: next_page
+  translation: "Trang tiếp theo"
+
+- id: read_time
+  translation:
+    one: "1 phút"
+    other: "{{ .Count }} phút"
+
+- id: words
+  translation:
+    one: "từ"
+    other: "{{ .Count }} từ"
+
+- id: toc
+  translation: "Mục lục"
+
+- id: translations
+  translation: "Bản dịch"
+
+- id: home
+  translation: "Trang chủ"
+
+- id: edit_post
+  translation: "Chỉnh sửa"
+
+- id: code_copy
+  translation: "Sao chép"
+
+- id: code_copied
+  translation: "Đã sao chép!"
diff --git a/themes/PaperMod/i18n/zh-tw.yaml b/themes/PaperMod/i18n/zh-tw.yaml
new file mode 100644 (file)
index 0000000..48b84d2
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page\r
+  translation: "上一頁"\r
+\r
+- id: next_page\r
+  translation: "下一頁"\r
+\r
+- id: read_time\r
+  translation:\r
+    one : "1 分鐘"\r
+    other: "{{ .Count }} 分鐘"\r
+\r
+- id: words\r
+  translation:\r
+    one: "字"\r
+    other: "{{ .Count }} 字"\r
+\r
+- id: toc\r
+  translation: "目錄"\r
+\r
+- id: translations\r
+  translation: "語言"\r
+\r
+- id: home\r
+  translation: "首頁"\r
+\r
+- id: edit_post\r
+  translation: "編輯"\r
+\r
+- id: code_copy\r
+  translation: "複製"\r
+\r
+- id: code_copied\r
+  translation: "已複製!"\r
diff --git a/themes/PaperMod/i18n/zh.yaml b/themes/PaperMod/i18n/zh.yaml
new file mode 100644 (file)
index 0000000..0280425
--- /dev/null
@@ -0,0 +1,33 @@
+- id: prev_page
+  translation: "上一页"
+
+- id: next_page
+  translation: "下一页"
+
+- id: read_time
+  translation:
+    one : "1 分钟"
+    other: "{{ .Count }} 分钟"
+
+- id: words
+  translation: 
+    one: "字"
+    other: "{{ .Count }} 字"
+
+- id: toc
+  translation: "目录"
+
+- id: translations
+  translation: "语言"
+
+- id: home
+  translation: "主页"
+
+- id: edit_post
+  translation: "编辑"
+
+- id: code_copy
+  translation: "复制"
+
+- id: code_copied
+  translation: "已复制!"
diff --git a/themes/PaperMod/images/screenshot.png b/themes/PaperMod/images/screenshot.png
new file mode 100644 (file)
index 0000000..a37c485
Binary files /dev/null and b/themes/PaperMod/images/screenshot.png differ
diff --git a/themes/PaperMod/images/tn.png b/themes/PaperMod/images/tn.png
new file mode 100644 (file)
index 0000000..cf83179
Binary files /dev/null and b/themes/PaperMod/images/tn.png differ
diff --git a/themes/PaperMod/layouts/404.html b/themes/PaperMod/layouts/404.html
new file mode 100644 (file)
index 0000000..a405573
--- /dev/null
@@ -0,0 +1,3 @@
+{{- define "main" }}
+<div class="not-found">404</div>
+{{- end }}{{/* end main */ -}}
diff --git a/themes/PaperMod/layouts/_default/_markup/render-image.html b/themes/PaperMod/layouts/_default/_markup/render-image.html
new file mode 100644 (file)
index 0000000..f368ff8
--- /dev/null
@@ -0,0 +1,22 @@
+{{- $u := urls.Parse .Destination -}}
+{{- $src := $u.String -}}
+{{- if not $u.IsAbs -}}
+  {{- $path := strings.TrimPrefix "./" $u.Path }}
+  {{- with or (.PageInner.Resources.Get $path) (resources.Get $path) -}}
+    {{- $src = .RelPermalink -}}
+    {{- with $u.RawQuery -}}
+      {{- $src = printf "%s?%s" $src . -}}
+    {{- end -}}
+    {{- with $u.Fragment -}}
+      {{- $src = printf "%s#%s" $src . -}}
+    {{- end -}}
+  {{- end -}}
+{{- end -}}
+{{- $attributes := merge .Attributes (dict "alt" .Text "src" $src "title" (.Title | transform.HTMLEscape) "loading" "lazy") -}}
+<img
+  {{- range $k, $v := $attributes -}}
+    {{- if $v -}}
+      {{- printf " %s=%q" $k $v | safeHTMLAttr -}}
+    {{- end -}}
+  {{- end -}}>
+{{- /**/ -}}
diff --git a/themes/PaperMod/layouts/_default/archives.html b/themes/PaperMod/layouts/_default/archives.html
new file mode 100644 (file)
index 0000000..eea3fc8
--- /dev/null
@@ -0,0 +1,83 @@
+{{- define "main" }}
+
+<header class="page-header">
+  <h1>
+    {{ .Title }}
+    {{- if (.Param "ShowRssButtonInSectionTermList") }}
+    {{- $rss := (.OutputFormats.Get "rss") }}
+    {{- if (eq .Kind `page`) }}
+    {{- $rss = (.Parent.OutputFormats.Get "rss") }}
+    {{- end }}
+    {{- with $rss }}
+    <a href="{{ .RelPermalink }}" title="RSS" aria-label="RSS">
+      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+        stroke-linecap="round" stroke-linejoin="round" height="23">
+        <path d="M4 11a9 9 0 0 1 9 9" />
+        <path d="M4 4a16 16 0 0 1 16 16" />
+        <circle cx="5" cy="19" r="1" />
+      </svg>
+    </a>
+    {{- end }}
+    {{- end }}
+  </h1>
+  {{- if .Description }}
+  <div class="post-description">
+    {{ .Description }}
+  </div>
+  {{- end }}
+</header>
+
+{{- $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}
+
+{{- if site.Params.ShowAllPagesInArchive }}
+{{- $pages = site.RegularPages }}
+{{- end }}
+
+{{- range $pages.GroupByPublishDate "2006" }}
+{{- if ne .Key "0001" }}
+<div class="archive-year">
+  {{- $year := replace .Key "0001" "" }}
+  <h2 class="archive-year-header" id="{{ $year }}">
+    <a class="archive-header-link" href="#{{ $year }}">
+      {{- $year -}}
+    </a>
+    <sup class="archive-count">&nbsp;{{ len .Pages }}</sup>
+  </h2>
+  {{- range .Pages.GroupByDate "January" }}
+  <div class="archive-month">
+    <h3 class="archive-month-header" id="{{ $year }}-{{ .Key }}">
+      <a class="archive-header-link" href="#{{ $year }}-{{ .Key }}">
+        {{- .Key -}}
+      </a>
+      <sup class="archive-count">&nbsp;{{ len .Pages }}</sup>
+    </h3>
+    <div class="archive-posts">
+      {{- range .Pages }}
+      {{- if eq .Kind "page" }}
+      <div class="archive-entry">
+        <h3 class="archive-entry-title entry-hint-parent">
+          {{- .Title | markdownify }}
+          {{- if .Draft }}
+          <span class="entry-hint" title="Draft">
+            <svg xmlns="http://www.w3.org/2000/svg" height="15" viewBox="0 -960 960 960" fill="currentColor">
+              <path
+                d="M160-410v-60h300v60H160Zm0-165v-60h470v60H160Zm0-165v-60h470v60H160Zm360 580v-123l221-220q9-9 20-13t22-4q12 0 23 4.5t20 13.5l37 37q9 9 13 20t4 22q0 11-4.5 22.5T862.09-380L643-160H520Zm300-263-37-37 37 37ZM580-220h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19Z" />
+            </svg>
+          </span>
+          {{- end }}
+        </h3>
+        <div class="archive-meta">
+          {{- partial "post_meta.html" . -}}
+        </div>
+        <a class="entry-link" aria-label="post link to {{ .Title | plainify }}" href="{{ .Permalink }}"></a>
+      </div>
+      {{- end }}
+      {{- end }}
+    </div>
+  </div>
+  {{- end }}
+</div>
+{{- end }}
+{{- end }}
+
+{{- end }}{{/* end main */}}
diff --git a/themes/PaperMod/layouts/_default/baseof.html b/themes/PaperMod/layouts/_default/baseof.html
new file mode 100644 (file)
index 0000000..c577599
--- /dev/null
@@ -0,0 +1,31 @@
+{{- if lt hugo.Version "0.146.0" }}
+{{- errorf "=> hugo v0.146.0 or greater is required for hugo-PaperMod to build " }}
+{{- end -}}
+
+<!DOCTYPE html>
+{{- $theme := site.Params.defaultTheme | default "auto" }}
+{{- if eq $theme "dark" }}
+<html lang="{{ site.Language }}" dir="{{ .Language.LanguageDirection | default "auto" }}" data-theme="dark">
+{{- else if eq $theme "light" }}
+<html lang="{{ site.Language }}" dir="{{ .Language.LanguageDirection | default "auto" }}" data-theme="light">
+{{- else }}
+<html lang="{{ site.Language }}" dir="{{ .Language.LanguageDirection | default "auto" }}" data-theme="auto">
+{{- end }}
+
+<head>
+    {{- partial "head.html" . }}
+</head>
+
+{{- if (or (ne .Kind `page` ) (eq .Layout `archives`) (eq .Layout `search`)) }}
+<body class="list" id="top">
+{{- else }}
+<body id="top">
+{{- end }}
+    {{ partialCached "header.html" . .Page -}}
+    <main class="main">
+        {{- block "main" . }}{{ end }}
+    </main>
+    {{ partialCached "footer.html" . .Layout .Kind (.Param "hideFooter") (.Param "ShowCodeCopyButtons") -}}
+</body>
+
+</html>
diff --git a/themes/PaperMod/layouts/_default/index.json b/themes/PaperMod/layouts/_default/index.json
new file mode 100644 (file)
index 0000000..feeb437
--- /dev/null
@@ -0,0 +1,7 @@
+{{- $.Scratch.Add "index" slice -}}
+{{- range site.RegularPages -}}
+    {{- if and (not .Params.searchHidden) (ne .Layout `archives`) (ne .Layout `search`) }}
+    {{- $.Scratch.Add "index" (dict "title" .Title "content" .Plain "permalink" .Permalink "summary" .Summary) -}}
+    {{- end }}
+{{- end -}}
+{{- $.Scratch.Get "index" | jsonify -}}
diff --git a/themes/PaperMod/layouts/_default/list.html b/themes/PaperMod/layouts/_default/list.html
new file mode 100644 (file)
index 0000000..81aea6e
--- /dev/null
@@ -0,0 +1,121 @@
+{{- define "main" }}
+
+{{- if (and site.Params.profileMode.enabled .IsHome) }}
+{{- partial "index_profile.html" . }}
+{{- else }} {{/* if not profileMode */}}
+
+{{- if not .IsHome | and .Title }}
+<header class="page-header">
+  {{- partial "breadcrumbs.html" . }}
+  <h1>
+    {{ .Title }}
+    {{- if and (or (eq .Kind `term`) (eq .Kind `section`)) (.Param "ShowRssButtonInSectionTermList") }}
+    {{- with .OutputFormats.Get "rss" }}
+    <a href="{{ .RelPermalink }}" title="RSS" aria-label="RSS">
+      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+        stroke-linecap="round" stroke-linejoin="round" height="23">
+        <path d="M4 11a9 9 0 0 1 9 9" />
+        <path d="M4 4a16 16 0 0 1 16 16" />
+        <circle cx="5" cy="19" r="1" />
+      </svg>
+    </a>
+    {{- end }}
+    {{- end }}
+  </h1>
+  {{- if .Description }}
+  <div class="post-description">
+    {{ .Description | markdownify }}
+  </div>
+  {{- end }}
+</header>
+{{- end }}
+
+{{- if .Content }}
+<div class="post-content">
+  {{- if not (.Param "disableAnchoredHeadings") }}
+  {{- partial "anchored_headings.html" .Content -}}
+  {{- else }}{{ .Content }}{{ end }}
+</div>
+{{- end }}
+
+{{- $pages := union .RegularPages .Sections }}
+
+{{- if .IsHome }}
+{{- $pages = where site.RegularPages "Type" "in" site.Params.mainSections }}
+{{- $pages = where $pages "Params.hiddenInHomeList" "!=" "true"  }}
+{{- end }}
+
+{{- $paginator := .Paginate $pages }}
+
+{{- if and .IsHome site.Params.homeInfoParams (eq $paginator.PageNumber 1) }}
+{{- partial "home_info.html" . }}
+{{- end }}
+
+{{- $term := .Data.Term }}
+{{- range $index, $page := $paginator.Pages }}
+
+{{- $class := "post-entry" }}
+
+{{- $user_preferred := or site.Params.disableSpecial1stPost site.Params.homeInfoParams }}
+{{- if (and $.IsHome (eq $paginator.PageNumber 1) (eq $index 0) (not $user_preferred)) }}
+{{- $class = "first-entry" }}
+{{- else if $term }}
+{{- $class = "post-entry tag-entry" }}
+{{- end }}
+
+<article class="{{ $class }}">
+  {{- $isHidden := (.Param "cover.hiddenInList") | default (.Param "cover.hidden") | default false }}
+  {{- partial "cover.html" (dict "cxt" . "IsSingle" false "isHidden" $isHidden) }}
+  <header class="entry-header">
+    <h2 class="entry-hint-parent">
+      {{- .Title }}
+      {{- if .Draft }}
+      <span class="entry-hint" title="Draft">
+        <svg xmlns="http://www.w3.org/2000/svg" height="20" viewBox="0 -960 960 960" fill="currentColor">
+          <path
+            d="M160-410v-60h300v60H160Zm0-165v-60h470v60H160Zm0-165v-60h470v60H160Zm360 580v-123l221-220q9-9 20-13t22-4q12 0 23 4.5t20 13.5l37 37q9 9 13 20t4 22q0 11-4.5 22.5T862.09-380L643-160H520Zm300-263-37-37 37 37ZM580-220h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19Z" />
+        </svg>
+      </span>
+      {{- end }}
+    </h2>
+  </header>
+  {{- if (ne (.Param "hideSummary") true) }}
+  <div class="entry-content">
+    <p>{{ .Summary | plainify | htmlUnescape }}{{ if .Truncated }}...{{ end }}</p>
+  </div>
+  {{- end }}
+  {{- if not (.Param "hideMeta") }}
+  <footer class="entry-footer">
+    {{- partial "post_meta.html" . -}}
+  </footer>
+  {{- end }}
+  <a class="entry-link" aria-label="post link to {{ .Title | plainify }}" href="{{ .Permalink }}"></a>
+</article>
+{{- end }}
+
+{{- if gt $paginator.TotalPages 1 }}
+<footer class="page-footer">
+  <nav class="pagination">
+    {{- if $paginator.HasPrev }}
+    <a class="prev" href="{{ $paginator.Prev.URL | absURL }}">
+      «&nbsp;{{ i18n "prev_page" }}&nbsp;
+      {{- if (.Param "ShowPageNums") }}
+      {{- sub $paginator.PageNumber 1 }}/{{ $paginator.TotalPages }}
+      {{- end }}
+    </a>
+    {{- end }}
+    {{- if $paginator.HasNext }}
+    <a class="next" href="{{ $paginator.Next.URL | absURL }}">
+      {{- i18n "next_page" }}&nbsp;
+      {{- if (.Param "ShowPageNums") }}
+      {{- add 1 $paginator.PageNumber }}/{{ $paginator.TotalPages }}
+      {{- end }}&nbsp;»
+    </a>
+    {{- end }}
+  </nav>
+</footer>
+{{- end }}
+
+{{- end }}{{/* end profileMode */}}
+
+{{- end }}{{- /* end main */ -}}
diff --git a/themes/PaperMod/layouts/_default/rss.xml b/themes/PaperMod/layouts/_default/rss.xml
new file mode 100644 (file)
index 0000000..fed8ae9
--- /dev/null
@@ -0,0 +1,83 @@
+{{- /* Deprecate site.Author.email in favor of site.Params.author.email */}}
+{{- $authorEmail := "" }}
+{{- with site.Params.author }}
+  {{- if reflect.IsMap . }}
+    {{- with .email }}
+      {{- $authorEmail = . }}
+    {{- end }}
+  {{- end }}
+{{- else }}
+  {{- with site.Author.email }}
+    {{- $authorEmail = . }}
+    {{- warnf "The author key in site configuration is deprecated. Use params.author.email instead." }}
+  {{- end }}
+{{- end }}
+
+{{- /* Deprecate site.Author.name in favor of site.Params.author.name */}}
+{{- $authorName := "" }}
+{{- with site.Params.author }}
+  {{- if reflect.IsMap . }}
+    {{- with .name }}
+      {{- $authorName = . }}
+    {{- end }}
+  {{- else }}
+    {{- $authorName  = . }}
+  {{- end }}
+{{- else }}
+  {{- with site.Author.name }}
+    {{- $authorName = . }}
+    {{- warnf "The author key in site configuration is deprecated. Use params.author.name instead." }}
+  {{- end }}
+{{- end }}
+
+{{- $pctx := . }}
+{{- if .IsHome }}{{ $pctx = site }}{{ end }}
+{{- $pages := slice }}
+{{- if or $.IsHome $.IsSection }}
+{{- $pages = $pctx.RegularPages }}
+{{- else }}
+{{- $pages = $pctx.Pages }}
+{{- end }}
+{{- $limit := site.Config.Services.RSS.Limit }}
+{{- if ge $limit 1 }}
+{{- $pages = $pages | first $limit }}
+{{- end }}
+{{- printf "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>" | safeHTML }}
+<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
+  <channel>
+    <title>{{ if eq .Title site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{ . }} on {{ end }}{{ site.Title }}{{ end }}</title>
+    <link>{{ .Permalink }}</link>
+    <description>Recent content {{ if ne .Title site.Title }}{{ with .Title }}in {{ . }} {{ end }}{{ end }}on {{ site.Title }}</description>
+    {{- with site.Params.images }}
+    <image>
+      <title>{{ site.Title }}</title>
+      <url>{{ index . 0 | absURL }}</url>
+      <link>{{ index . 0 | absURL }}</link>
+    </image>
+    {{- end }}
+    <generator>Hugo -- {{ hugo.Version }}</generator>
+    <language>{{ site.Language.LanguageCode }}</language>{{ with $authorEmail }}
+    <managingEditor>{{.}}{{ with $authorName }} ({{ . }}){{ end }}</managingEditor>{{ end }}{{ with $authorEmail }}
+    <webMaster>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</webMaster>{{ end }}{{ with site.Copyright }}
+    <copyright>{{ . | markdownify | plainify | strings.TrimPrefix "© " }}</copyright>{{ end }}{{ if not .Date.IsZero }}
+    <lastBuildDate>{{ (index $pages.ByLastmod.Reverse 0).Lastmod.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</lastBuildDate>{{ end }}
+    {{- with .OutputFormats.Get "RSS" }}
+    {{ printf "<atom:link href=%q rel=\"self\" type=%q />" .Permalink .MediaType | safeHTML }}
+    {{- end }}
+    {{- range $pages }}
+    {{- if and (ne .Layout `search`) (ne .Layout `archives`) }}
+    <item>
+      <title>{{ .Title }}</title>
+      <link>{{ .Permalink }}</link>
+      <pubDate>{{ .PublishDate.Format "Mon, 02 Jan 2006 15:04:05 -0700" | safeHTML }}</pubDate>
+      {{- with $authorEmail }}<author>{{ . }}{{ with $authorName }} ({{ . }}){{ end }}</author>{{ end }}
+      <guid>{{ .Permalink }}</guid>
+      <description>{{ with .Description | html }}{{ . }}{{ else }}{{ .Summary | html }}{{ end -}}</description>
+      {{- if and site.Params.ShowFullTextinRSS .Content }}
+      <content:encoded>{{ (printf "<![CDATA[%s]]>" .Content) | safeHTML }}</content:encoded>
+      {{- end }}
+    </item>
+    {{- end }}
+    {{- end }}
+  </channel>
+</rss>
diff --git a/themes/PaperMod/layouts/_default/search.html b/themes/PaperMod/layouts/_default/search.html
new file mode 100644 (file)
index 0000000..bb7d436
--- /dev/null
@@ -0,0 +1,29 @@
+{{- define "main" }}
+
+<header class="page-header">
+    <h1>{{- (printf "%s&nbsp;" .Title ) | htmlUnescape -}}
+        <svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none"
+            stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
+            <circle cx="11" cy="11" r="8"></circle>
+            <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
+        </svg>
+    </h1>
+    {{- if .Description }}
+    <div class="post-description">
+        {{ .Description }}
+    </div>
+    {{- end }}
+    {{- if not (.Param "hideMeta") }}
+    <div class="post-meta">
+        {{- partial "translation_list.html" . -}}
+    </div>
+    {{- end }}
+</header>
+
+<div id="searchbox">
+    <input id="searchInput" autofocus placeholder="{{ .Params.placeholder | default (printf "%s ↵" .Title) }}"
+        aria-label="search" type="search" autocomplete="off" maxlength="64">
+    <ul id="searchResults" aria-label="search results"></ul>
+</div>
+
+{{- end }}{{/* end main */}}
diff --git a/themes/PaperMod/layouts/_default/single.html b/themes/PaperMod/layouts/_default/single.html
new file mode 100644 (file)
index 0000000..19a624f
--- /dev/null
@@ -0,0 +1,65 @@
+{{- define "main" }}
+
+<article class="post-single">
+  <header class="post-header">
+    {{ partial "breadcrumbs.html" . }}
+    <h1 class="post-title entry-hint-parent">
+      {{ .Title }}
+      {{- if .Draft }}
+      <span class="entry-hint" title="Draft">
+        <svg xmlns="http://www.w3.org/2000/svg" height="35" viewBox="0 -960 960 960" fill="currentColor">
+          <path
+            d="M160-410v-60h300v60H160Zm0-165v-60h470v60H160Zm0-165v-60h470v60H160Zm360 580v-123l221-220q9-9 20-13t22-4q12 0 23 4.5t20 13.5l37 37q9 9 13 20t4 22q0 11-4.5 22.5T862.09-380L643-160H520Zm300-263-37-37 37 37ZM580-220h38l121-122-18-19-19-18-122 121v38Zm141-141-19-18 37 37-18-19Z" />
+        </svg>
+      </span>
+      {{- end }}
+    </h1>
+    {{- if .Description }}
+    <div class="post-description">
+      {{ .Description }}
+    </div>
+    {{- end }}
+    {{- if not (.Param "hideMeta") }}
+    <div class="post-meta">
+      {{- partial "post_meta.html" . -}}
+      {{- partial "translation_list.html" . -}}
+      {{- partial "edit_post.html" . -}}
+      {{- partial "post_canonical.html" . -}}
+    </div>
+    {{- end }}
+  </header>
+  {{- $isHidden := (.Param "cover.hiddenInSingle") | default (.Param "cover.hidden") | default false }}
+  {{- partial "cover.html" (dict "cxt" . "IsSingle" true "isHidden" $isHidden) }}
+  {{- if (.Param "ShowToc") }}
+  {{- partial "toc.html" . }}
+  {{- end }}
+
+  {{- if .Content }}
+  <div class="post-content">
+    {{- if not (.Param "disableAnchoredHeadings") }}
+    {{- partial "anchored_headings.html" .Content -}}
+    {{- else }}{{ .Content }}{{ end }}
+  </div>
+  {{- end }}
+
+  <footer class="post-footer">
+    {{- $tags := .Language.Params.Taxonomies.tag | default "tags" }}
+    <ul class="post-tags">
+      {{- range ($.GetTerms $tags) }}
+      <li><a href="{{ .Permalink }}">{{ .LinkTitle }}</a></li>
+      {{- end }}
+    </ul>
+    {{- if (.Param "ShowPostNavLinks") }}
+    {{- partial "post_nav_links.html" . }}
+    {{- end }}
+    {{- if (and site.Params.ShowShareButtons (ne .Params.disableShare true)) }}
+    {{- partial "share_icons.html" . -}}
+    {{- end }}
+  </footer>
+
+  {{- if (.Param "comments") }}
+  {{- partial "comments.html" . }}
+  {{- end }}
+</article>
+
+{{- end }}{{/* end main */}}
diff --git a/themes/PaperMod/layouts/_default/terms.html b/themes/PaperMod/layouts/_default/terms.html
new file mode 100644 (file)
index 0000000..6fd2654
--- /dev/null
@@ -0,0 +1,27 @@
+{{- define "main" }}
+
+{{- if .Title }}
+<header class="page-header">
+    <h1>{{ .Title }}</h1>
+    {{- if .Description }}
+    <div class="post-description">
+        {{ .Description }}
+    </div>
+    {{- end }}
+</header>
+{{- end }}
+
+<ul class="terms-tags">
+    {{- $type := .Type }}
+    {{- range $key, $value := .Data.Terms.Alphabetical }}
+    {{- $name := .Name }}
+    {{- $count := .Count }}
+    {{- with site.GetPage (printf "/%s/%s" $type $name) }}
+    <li>
+        <a href="{{ .Permalink }}">{{ .Name }} <sup><strong><sup>{{ $count }}</sup></strong></sup> </a>
+    </li>
+    {{- end }}
+    {{- end }}
+</ul>
+
+{{- end }}{{/* end main */ -}}
diff --git a/themes/PaperMod/layouts/partials/anchored_headings.html b/themes/PaperMod/layouts/partials/anchored_headings.html
new file mode 100644 (file)
index 0000000..377af89
--- /dev/null
@@ -0,0 +1,2 @@
+{{- /* formats .Content headings by adding an anchor */ -}}
+{{ . | replaceRE "(<h[1-6] id=\"([^\"]+)\".+)(</h[1-6]+>)" "${1}<a hidden class=\"anchor\" aria-hidden=\"true\" href=\"#${2}\">#</a>${3}" | safeHTML }}
diff --git a/themes/PaperMod/layouts/partials/author.html b/themes/PaperMod/layouts/partials/author.html
new file mode 100644 (file)
index 0000000..8f2758f
--- /dev/null
@@ -0,0 +1,9 @@
+{{- if or .Params.author site.Params.author }}
+{{- $author := (.Params.author | default site.Params.author) }}
+{{- $author_type := (printf "%T" $author) }}
+{{- if (or (eq $author_type "[]string") (eq $author_type "[]interface {}")) }}
+{{- (delimit $author ", " ) }}
+{{- else }}
+{{- $author }}
+{{- end }}
+{{- end -}}
diff --git a/themes/PaperMod/layouts/partials/breadcrumbs.html b/themes/PaperMod/layouts/partials/breadcrumbs.html
new file mode 100644 (file)
index 0000000..2686ca0
--- /dev/null
@@ -0,0 +1,19 @@
+{{- if (.Param "ShowBreadCrumbs") -}}
+<div class="breadcrumbs">
+    {{- $url := replace .Parent.Permalink (printf "%s" site.Home.Permalink) "" }}
+    {{- $lang_url := strings.TrimPrefix (printf "%s/" .Lang) $url -}}
+
+    <a href="{{ "" | absLangURL }}">{{ i18n "home" | default "Home" }}</a>
+    {{- $scratch := newScratch }}
+    {{- range $index, $element := split $lang_url "/" }}
+
+    {{- $scratch.Add "path" (printf "%s/" $element )}}
+    {{- $bc_pg := site.GetPage ($scratch.Get "path") -}}
+
+    {{- if (and ($bc_pg) (gt (len . ) 0))}}
+    {{- print "&nbsp;»&nbsp;" | safeHTML -}}<a href="{{ $bc_pg.Permalink }}">{{ $bc_pg.Name }}</a>
+    {{- end }}
+
+    {{- end -}}
+</div>
+{{- end -}}
diff --git a/themes/PaperMod/layouts/partials/comments.html b/themes/PaperMod/layouts/partials/comments.html
new file mode 100644 (file)
index 0000000..918451a
--- /dev/null
@@ -0,0 +1,3 @@
+{{- /* Comments area start */ -}}
+{{- /* to add comments read => https://gohugo.io/content-management/comments/ */ -}}
+{{- /* Comments area end */ -}}
diff --git a/themes/PaperMod/layouts/partials/cover.html b/themes/PaperMod/layouts/partials/cover.html
new file mode 100644 (file)
index 0000000..9c1f9ea
--- /dev/null
@@ -0,0 +1,65 @@
+{{- with .cxt}} {{/* Apply proper context from dict */}}
+{{- if (and .Params.cover.image (not $.isHidden)) }}
+<figure class="entry-cover">
+    {{- $loading := cond $.IsSingle "eager" "lazy" }}
+    {{- $addLink := (and site.Params.cover.linkFullImages $.IsSingle) }}
+    {{- $prod := (hugo.IsProduction | or (eq site.Params.env "production")) }}
+    {{- $alt := (.Params.cover.alt | default .Params.cover.caption | plainify) }}
+    {{- $responsiveImages := (.Params.cover.responsiveImages | default site.Params.cover.responsiveImages) | default true }}
+
+    {{- $pageBundleCover := (.Resources.ByType "image").GetMatch (printf "*%s*" (.Params.cover.image)) }}
+    {{- $globalResourcesCover := (resources.ByType "image").GetMatch (printf "*%s*" (.Params.cover.image)) }}
+    {{- $cover := (or $pageBundleCover $globalResourcesCover)}}
+    {{- /* We are not using the .Param.cover.relative to decide the location of image */}}
+    {{- /* If we have the image in pageBundle or globalResources we can process the image */}}
+
+    {{- $sizes := (slice "360" "480" "720" "1080" "1500") }}
+    {{- $processableFormats := (slice "jpg" "jpeg" "png" "tif" "bmp" "gif") -}}
+    {{- if hugo.IsExtended -}}
+        {{- $processableFormats = $processableFormats | append "webp" -}}
+    {{- end -}}
+
+    {{- $imgdl := (.Params.cover.image) | absURL }}
+    {{- if $cover -}}
+        {{- $imgdl = $cover.Permalink }}
+    {{- end -}}
+
+    {{- if $addLink }}
+        <a href="{{ $imgdl }}" target="_blank" rel="noopener noreferrer">
+    {{- end }}
+
+    {{- if $cover -}}
+        {{/* i.e it is present in page bundle */}}
+        {{- if (and (in $processableFormats $cover.MediaType.SubType) ($responsiveImages) (eq $prod true)) }}
+            <img loading="{{$loading}}"
+                srcset='{{- range $size := $sizes -}}
+                            {{- if (ge $cover.Width $size) }}
+                                {{- printf "%s %s" (($cover.Resize (printf "%sx" $size)).Permalink) (printf "%sw," $size) }}
+                            {{- end }}
+                        {{- end }}
+                        {{- printf "%s %dw" ($cover.Permalink) ($cover.Width) }}'
+                src="{{ $cover.Permalink }}"
+                sizes="(min-width: 768px) 720px, 100vw"
+                width="{{ $cover.Width }}" height="{{ $cover.Height }}"
+                alt="{{ $alt }}">
+        {{- else }}{{/* Unprocessable image or responsive images disabled */}}
+            <img loading="{{ $loading }}" src="{{ $imgdl }}" alt="{{ $alt }}">
+        {{- end }}
+    {{- else }}
+        {{- /* For absolute urls and external links, no img processing here */}}
+        <img loading="{{ $loading }}" src="{{ $imgdl }}" alt="{{ $alt }}">
+    {{- end }}
+
+    {{- if $addLink }}
+        </a>
+    {{- end -}}
+
+    {{- /*  Display Caption  */}}
+    {{- if $.IsSingle }}
+        {{ with .Params.cover.caption -}}
+            <figcaption>{{ . | markdownify }}</figcaption>
+        {{- end }}
+    {{- end }}
+</figure>
+{{- end }}{{/* End image */}}
+{{- end -}}{{/* End context */ -}}
diff --git a/themes/PaperMod/layouts/partials/edit_post.html b/themes/PaperMod/layouts/partials/edit_post.html
new file mode 100644 (file)
index 0000000..d24f5b5
--- /dev/null
@@ -0,0 +1,10 @@
+{{- if and (or .Params.editPost.URL site.Params.editPost.URL) (not (.Param "editPost.disabled")) -}}
+{{- $fileUrlPath := path.Join .File.Path }}
+
+{{- if or .Params.author site.Params.author (.Param "ShowReadingTime") (not .Date.IsZero) .IsTranslated }}&nbsp;|&nbsp;{{- end -}}
+<span>
+    <a href="{{ .Params.editPost.URL | default site.Params.editPost.URL }}{{ if .Params.editPost.appendFilePath | default ( site.Params.editPost.appendFilePath | default false ) }}/{{ $fileUrlPath }}{{ end }}" rel="noopener noreferrer edit" target="_blank">
+        {{- .Params.editPost.Text | default (site.Params.editPost.Text | default (i18n "edit_post" | default "Edit")) -}}
+    </a>
+</span>
+{{- end }}
diff --git a/themes/PaperMod/layouts/partials/extend_footer.html b/themes/PaperMod/layouts/partials/extend_footer.html
new file mode 100644 (file)
index 0000000..0519748
--- /dev/null
@@ -0,0 +1,3 @@
+{{- /* Footer custom content area start */ -}}
+{{- /*     Insert any custom code web-analytics, resources, etc. here */ -}}
+{{- /* Footer custom content area end */ -}}
diff --git a/themes/PaperMod/layouts/partials/extend_head.html b/themes/PaperMod/layouts/partials/extend_head.html
new file mode 100644 (file)
index 0000000..550f31d
--- /dev/null
@@ -0,0 +1,8 @@
+{{- /* Head custom content area start */ -}}
+{{- /*     Insert any custom code (web-analytics, resources, etc.) - it will appear in the <head></head> section of every page. */ -}}
+{{- /*     Can be overwritten by partial with the same name in the global layouts. */ -}}
+{{- /* Head custom content area end */ -}}
+
+<link rel="preconnect" href="https://fonts.googleapis.com">
+<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Lexend&display=swap" rel="stylesheet">
diff --git a/themes/PaperMod/layouts/partials/footer.html b/themes/PaperMod/layouts/partials/footer.html
new file mode 100644 (file)
index 0000000..6d05117
--- /dev/null
@@ -0,0 +1,150 @@
+{{- if not (.Param "hideFooter") }}
+<footer class="footer">
+    {{- if not site.Params.footer.hideCopyright }}
+        {{- if site.Copyright }}
+        <span>{{ site.Copyright | markdownify }}</span>
+        {{- else }}
+        <span>&copy; {{ now.Year }} <a href="{{ "" | absLangURL }}">{{ site.Title }}</a></span>
+        {{- end }}
+        {{- print " · "}}
+    {{- end }}
+
+    {{- with site.Params.footer.text }}
+        {{ . | markdownify }}
+        {{- print " · "}}
+    {{- end }}
+
+    <span>
+        Powered by
+        <a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
+        <a href="https://github.com/adityatelange/hugo-PaperMod/" rel="noopener" target="_blank">PaperMod</a>
+    </span>
+</footer>
+{{- end }}
+
+{{- if (not site.Params.disableScrollToTop) }}
+<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
+    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
+        <path d="M12 6H0l6-6z" />
+    </svg>
+</a>
+{{- end }}
+
+{{- partial "extend_footer.html" . }}
+
+<script>
+    let menu = document.getElementById('menu');
+    if (menu) {
+        // Set the scroll position
+        const scrollPosition = localStorage.getItem("menu-scroll-position");
+        if (scrollPosition) {
+            menu.scrollLeft = parseInt(scrollPosition, 10);
+        }
+        
+        menu.onscroll = function () {
+            localStorage.setItem("menu-scroll-position", menu.scrollLeft);
+        }
+    }
+
+    document.querySelectorAll('a[href^="#"]').forEach(anchor => {
+        anchor.addEventListener("click", function (e) {
+            e.preventDefault();
+            var id = this.getAttribute("href").substr(1);
+            if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
+                document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
+                    behavior: "smooth"
+                });
+            } else {
+                document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
+            }
+            if (id === "top") {
+                history.replaceState(null, null, " ");
+            } else {
+                history.pushState(null, null, `#${id}`);
+            }
+        });
+    });
+
+</script>
+
+{{- if (not site.Params.disableScrollToTop) }}
+<script>
+    var mybutton = document.getElementById("top-link");
+    window.onscroll = function () {
+        if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
+            mybutton.style.visibility = "visible";
+            mybutton.style.opacity = "1";
+        } else {
+            mybutton.style.visibility = "hidden";
+            mybutton.style.opacity = "0";
+        }
+    };
+
+</script>
+{{- end }}
+
+{{- if (not site.Params.disableThemeToggle) }}
+<script>
+    document.getElementById("theme-toggle").addEventListener("click", () => {
+        const html = document.querySelector("html");
+        if (html.dataset.theme === "dark") {
+            html.dataset.theme = 'light';
+            localStorage.setItem("pref-theme", 'light');
+        } else {
+            html.dataset.theme = 'dark';
+            localStorage.setItem("pref-theme", 'dark');
+        }
+    })
+
+</script>
+{{- end }}
+
+{{- if (and (eq .Kind "page") (ne .Layout "archives") (ne .Layout "search") (.Param "ShowCodeCopyButtons")) }}
+<script>
+    document.querySelectorAll('pre > code').forEach((codeblock) => {
+        const container = codeblock.parentNode.parentNode;
+
+        const copybutton = document.createElement('button');
+        copybutton.classList.add('copy-code');
+        copybutton.innerHTML = '{{- i18n "code_copy" | default "copy" }}';
+
+        function copyingDone() {
+            copybutton.innerHTML = '{{- i18n "code_copied" | default "copied!" }}';
+            setTimeout(() => {
+                copybutton.innerHTML = '{{- i18n "code_copy" | default "copy" }}';
+            }, 2000);
+        }
+
+        copybutton.addEventListener('click', (cb) => {
+            if ('clipboard' in navigator) {
+                navigator.clipboard.writeText(codeblock.textContent);
+                copyingDone();
+                return;
+            }
+
+            const range = document.createRange();
+            range.selectNodeContents(codeblock);
+            const selection = window.getSelection();
+            selection.removeAllRanges();
+            selection.addRange(range);
+            try {
+                document.execCommand('copy');
+                copyingDone();
+            } catch (e) { };
+            selection.removeRange(range);
+        });
+
+        if (container.classList.contains("highlight")) {
+            container.appendChild(copybutton);
+        } else if (container.parentNode.firstChild == container) {
+            // td containing LineNos
+        } else if (codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName == "TABLE") {
+            // table containing LineNos and code
+            codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(copybutton);
+        } else {
+            // code blocks not having highlight as parent class
+            codeblock.parentNode.appendChild(copybutton);
+        }
+    });
+</script>
+{{- end }}
diff --git a/themes/PaperMod/layouts/partials/head.html b/themes/PaperMod/layouts/partials/head.html
new file mode 100644 (file)
index 0000000..565709b
--- /dev/null
@@ -0,0 +1,205 @@
+<meta charset="utf-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+{{- if hugo.IsProduction | or (eq site.Params.env "production") | and (ne .Params.robotsNoIndex true) }}
+<meta name="robots" content="index, follow">
+{{- else }}
+<meta name="robots" content="noindex, nofollow">
+{{- end }}
+
+{{- /* Title */}}
+<title>{{ if .IsHome }}{{ else }}{{ if .Title }}{{ .Title }} | {{ end }}{{ end }}{{ site.Title }}</title>
+
+{{- /* Meta */}}
+{{- if .IsHome }}
+{{ with site.Params.keywords -}}<meta name="keywords" content="{{- range $i, $e := . }}{{ if $i }}, {{ end }}{{ $e }}{{ end }}">{{ end }}
+{{- else }}
+<meta name="keywords" content="{{ if .Params.keywords -}}
+    {{- range $i, $e := .Params.keywords }}{{ if $i }}, {{ end }}{{ $e }}{{ end }} {{- else }}
+    {{- range $i, $e := .Params.tags }}{{ if $i }}, {{ end }}{{ $e }}{{ end }} {{- end -}}">
+{{- end }}
+<meta name="description" content="{{- with .Description }}{{ . }}{{- else }}{{- if or .IsPage .IsSection}}
+    {{- .Summary | default (printf "%s - %s" .Title  site.Title) }}{{- else }}
+    {{- with site.Params.description }}{{ . }}{{- end }}{{- end }}{{- end -}}">
+<meta name="author" content="{{ (partial "author.html" . ) }}">
+<link rel="canonical" href="{{ if .Params.canonicalURL -}} {{ trim .Params.canonicalURL " " }} {{- else -}} {{ .Permalink }} {{- end }}">
+{{- if site.Params.analytics.google.SiteVerificationTag }}
+<meta name="google-site-verification" content="{{ site.Params.analytics.google.SiteVerificationTag }}">
+{{- end }}
+{{- if site.Params.analytics.yandex.SiteVerificationTag }}
+<meta name="yandex-verification" content="{{ site.Params.analytics.yandex.SiteVerificationTag }}">
+{{- end }}
+{{- if site.Params.analytics.bing.SiteVerificationTag }}
+<meta name="msvalidate.01" content="{{ site.Params.analytics.bing.SiteVerificationTag }}">
+{{- end }}
+{{- if site.Params.analytics.naver.SiteVerificationTag }}
+<meta name="naver-site-verification" content="{{ site.Params.analytics.naver.SiteVerificationTag }}">
+{{- end }}
+
+{{- /* Styles */}}
+
+{{- /* includes */}}
+{{- $includes := slice }}
+{{- $includes = $includes | append (" " | resources.FromString "assets/css/includes-blank.css")}}
+
+{{- if not (eq site.Params.assets.disableScrollBarStyle true) }}
+    {{- $ScrollStyle := (resources.Get "css/includes/scroll-bar.css") }}
+    {{- $includes = (append $ScrollStyle $includes) }}
+{{- end }}
+
+{{- $includes_all := $includes | resources.Concat "assets/css/includes.css" }}
+
+{{- $theme_vars := (resources.Get "css/core/theme-vars.css") }}
+{{- $reset := (resources.Get "css/core/reset.css") }}
+{{- $media := (resources.Get "css/core/zmedia.css") }}
+{{- $license_css := (resources.Get "css/core/license.css") }}
+{{- $common := (resources.Match "css/common/*.css") | resources.Concat "assets/css/common.css" }}
+
+{{- /* markup.highlight.noClasses should be set to `false` */}}
+{{- $chroma_styles := (resources.Get "css/includes/chroma-styles.css") }}
+{{- $chroma_mod := (resources.Get "css/includes/chroma-mod.css") }}
+
+{{- /* order is important */}}
+{{- $core := (slice $theme_vars $reset $common $chroma_styles $chroma_mod $includes_all $media) | resources.Concat "assets/css/core.css" | resources.Minify }}
+{{- $extended := (resources.Match "css/extended/*.css") | resources.Concat "assets/css/extended.css" | resources.Minify }}
+
+{{- /* bundle all required css */}}
+{{- /* Add extended css after theme style */ -}}
+{{- $stylesheet := (slice $license_css $core $extended) | resources.Concat "assets/css/stylesheet.css"  }}
+
+{{- if not site.Params.assets.disableFingerprinting }}
+{{- $stylesheet := $stylesheet | fingerprint }}
+<link crossorigin="anonymous" href="{{ $stylesheet.RelPermalink }}" integrity="{{ $stylesheet.Data.Integrity }}" rel="preload stylesheet" as="style">
+{{- else }}
+<link crossorigin="anonymous" href="{{ $stylesheet.RelPermalink }}" rel="preload stylesheet" as="style">
+{{- end }}
+
+{{- /* Search */}}
+{{- if (eq .Layout `search`) -}}
+<link crossorigin="anonymous" rel="preload" as="fetch" href="../index.json">
+{{- $fastsearch := resources.Get "js/fastsearch.js" | js.Build (dict "params" (dict "fuseOpts" site.Params.fuseOpts)) | resources.Minify }}
+{{- $fusejs := resources.Get "js/fuse.basic.min.js" }}
+{{- $license_js := resources.Get "js/license.js" }}
+{{- if not site.Params.assets.disableFingerprinting }}
+{{- $search := (slice $fusejs $license_js $fastsearch ) | resources.Concat "assets/js/search.js" | fingerprint }}
+<script defer crossorigin="anonymous" src="{{ $search.RelPermalink }}" integrity="{{ $search.Data.Integrity }}"></script>
+{{- else }}
+{{- $search := (slice $fusejs $fastsearch ) | resources.Concat "assets/js/search.js" }}
+<script defer crossorigin="anonymous" src="{{ $search.RelPermalink }}"></script>
+{{- end }}
+{{- end -}}
+
+{{- /* Favicons */}}
+<link rel="icon" href="{{ site.Params.assets.favicon | default "favicon.ico" | absURL }}">
+<link rel="icon" type="image/png" sizes="16x16" href="{{ site.Params.assets.favicon16x16 | default "favicon-16x16.png" | absURL }}">
+<link rel="icon" type="image/png" sizes="32x32" href="{{ site.Params.assets.favicon32x32 | default "favicon-32x32.png" | absURL }}">
+<link rel="apple-touch-icon" href="{{ site.Params.assets.apple_touch_icon | default "apple-touch-icon.png" | absURL }}">
+<link rel="mask-icon" href="{{ site.Params.assets.safari_pinned_tab | default "safari-pinned-tab.svg" | absURL }}">
+<meta name="theme-color" content="{{ site.Params.assets.theme_color | default "#2e2e33" }}">
+<meta name="msapplication-TileColor" content="{{ site.Params.assets.msapplication_TileColor | default "#2e2e33" }}">
+
+{{- /* RSS */}}
+{{ range .AlternativeOutputFormats -}}
+<link rel="{{ .Rel }}" type="{{ .MediaType.Type | html }}" href="{{ .Permalink | safeURL }}" title="{{ .Name }}">
+{{ end -}}
+{{- range .AllTranslations -}}
+<link rel="alternate" hreflang="{{ .Lang }}" href="{{ .Permalink }}">
+{{ end -}}
+
+<noscript>
+    <style>
+        #theme-toggle,
+        .top-link {
+            display: none;
+        }
+
+    </style>
+    {{- if (and (ne site.Params.defaultTheme "light") (ne site.Params.defaultTheme "dark")) }}
+    <style>
+        @media (prefers-color-scheme: dark) {
+            :root {
+                --theme: rgb(29, 30, 32);
+                --entry: rgb(46, 46, 51);
+                --primary: rgb(218, 218, 219);
+                --secondary: rgb(155, 156, 157);
+                --tertiary: rgb(65, 66, 68);
+                --content: rgb(196, 196, 197);
+                --code-block-bg: rgb(46, 46, 51);
+                --code-bg: rgb(55, 56, 62);
+                --border: rgb(51, 51, 51);
+                color-scheme: dark;
+            }
+
+            .list {
+                background: var(--theme);
+            }
+
+            .toc {
+                background: var(--entry);
+            }
+        }
+
+        @media (prefers-color-scheme: light) {
+            .list::-webkit-scrollbar-thumb {
+                border-color: var(--code-bg);
+            }
+        }
+
+    </style>
+    {{- end }}
+</noscript>
+
+{{- /* theme-toggle is enabled */}}
+{{- if (not site.Params.disableThemeToggle) }}
+{{- /* theme is light */}}
+{{- if (eq site.Params.defaultTheme "light") }}
+<script>
+    if (localStorage.getItem("pref-theme") === "dark") {
+        document.querySelector("html").dataset.theme = 'dark';
+    }
+
+</script>
+{{- /* theme is dark */}}
+{{- else if (eq site.Params.defaultTheme "dark") }}
+<script>
+    if (localStorage.getItem("pref-theme") === "light") {
+        document.querySelector("html").dataset.theme = 'light';
+    }
+
+</script>
+{{- else }}
+{{- /* theme is auto */}}
+<script>
+    if (localStorage.getItem("pref-theme") === "dark") {
+        document.querySelector("html").dataset.theme = 'dark';
+    } else if (localStorage.getItem("pref-theme") === "light") {
+       document.querySelector("html").dataset.theme = 'light';
+    } else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
+        document.querySelector("html").dataset.theme = 'dark';
+    } else {
+        document.querySelector("html").dataset.theme = 'light';
+    }
+
+</script>
+{{- end }}
+{{- /* theme-toggle is disabled and theme is auto */}}
+{{- else if (and (ne site.Params.defaultTheme "light") (ne site.Params.defaultTheme "dark"))}}
+<script>
+    if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
+        document.querySelector("html").dataset.theme = 'dark';
+    } else {
+        document.querySelector("html").dataset.theme = 'light';
+    }
+
+</script>
+{{- end }}
+
+{{- partial "extend_head.html" . -}}
+
+{{- /* Misc */}}
+{{- if hugo.IsProduction | or (eq site.Params.env "production") }}
+{{- partial "google_analytics.html" . }}
+{{- partial "templates/opengraph.html" . }}
+{{- partial "templates/twitter_cards.html" . }}
+{{- partial "templates/schema_json.html" . }}
+{{- end -}}
diff --git a/themes/PaperMod/layouts/partials/header.html b/themes/PaperMod/layouts/partials/header.html
new file mode 100644 (file)
index 0000000..e3eb797
--- /dev/null
@@ -0,0 +1,110 @@
+<header class="header">
+    <nav class="nav">
+        <div class="logo">
+            {{- $label_text := (site.Params.label.text | default site.Title) }}
+            {{- if site.Title }}
+            <a href="{{ "" | absLangURL }}" accesskey="h" title="{{ $label_text }} (Alt + H)">
+                {{- if site.Params.label.icon }}
+                {{- $img := resources.Get site.Params.label.icon }}
+                {{- if $img }}
+                    {{- $processableFormats := (slice "jpg" "jpeg" "png" "tif" "bmp" "gif") -}}
+                    {{- if hugo.IsExtended -}}
+                        {{- $processableFormats = $processableFormats | append "webp" -}}
+                    {{- end -}}
+                    {{- $prod := (hugo.IsProduction | or (eq site.Params.env "production")) }}
+                    {{- if and (in $processableFormats $img.MediaType.SubType) (eq $prod true)}}
+                        {{- if site.Params.label.iconHeight }}
+                            {{- $img = $img.Resize (printf "x%d" site.Params.label.iconHeight) }}
+                        {{ else }}
+                            {{- $img = $img.Resize "x30" }}
+                        {{- end }}
+                    {{- end }}
+                    <img src="{{ $img.Permalink }}" alt="" aria-label="logo"
+                        height="{{- site.Params.label.iconHeight | default "30" -}}">
+                {{- else }}
+                <img src="{{- site.Params.label.icon | absURL -}}" alt="" aria-label="logo"
+                    height="{{- site.Params.label.iconHeight | default "30" -}}">
+                {{- end -}}
+                {{- else if hasPrefix site.Params.label.iconSVG "<svg" }}
+                    {{ site.Params.label.iconSVG | safeHTML }}
+                {{- end -}}
+                {{- $label_text -}}
+            </a>
+            {{- end }}
+            <div class="logo-switches">
+                {{- if (not site.Params.disableThemeToggle) }}
+                <button id="theme-toggle" accesskey="t" title="(Alt + T)" aria-label="Toggle theme">
+                    <svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
+                        fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
+                        stroke-linejoin="round">
+                        <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
+                    </svg>
+                    <svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
+                        fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
+                        stroke-linejoin="round">
+                        <circle cx="12" cy="12" r="5"></circle>
+                        <line x1="12" y1="1" x2="12" y2="3"></line>
+                        <line x1="12" y1="21" x2="12" y2="23"></line>
+                        <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
+                        <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
+                        <line x1="1" y1="12" x2="3" y2="12"></line>
+                        <line x1="21" y1="12" x2="23" y2="12"></line>
+                        <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
+                        <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
+                    </svg>
+                </button>
+                {{- end }}
+                
+                {{- if (not site.Params.disableLangToggle) }}
+                    {{- $lang := .Lang}}
+                    {{- $separator := or $label_text (not site.Params.disableThemeToggle)}}
+                    {{- with site.Home.Translations }}
+                    <ul class="lang-switch">
+                        {{- if $separator }}<li>|</li>{{ end }}
+                        {{- range . -}}
+                        {{- if ne $lang .Lang }}
+                        <li>
+                            <a href="{{- .Permalink -}}" title="{{ .Language.Params.languageAltTitle | default (.Language.LanguageName | emojify) | default (.Lang | title) }}"
+                                aria-label="{{ .Language.LanguageName | default (.Lang | title) }}">
+                                {{- if (and site.Params.displayFullLangName (.Language.LanguageName)) }}
+                                {{- .Language.LanguageName | emojify -}}
+                                {{- else }}
+                                {{- .Lang | title -}}
+                                {{- end -}}
+                            </a>
+                        </li>
+                        {{- end -}}
+                        {{- end}}
+                    </ul>
+                    {{- end }}
+                {{- end }}
+            </div>
+        </div>
+        {{- $currentPage := . }}
+        <ul id="menu">
+            {{- range site.Menus.main }}
+            {{- $menu_item_url := (cond (strings.HasSuffix .URL "/") .URL (printf "%s/" .URL) ) | absLangURL }}
+            {{- $page_url:= $currentPage.Permalink | absLangURL }}
+            {{- $is_search := eq (site.GetPage .KeyName).Layout `search` }}
+            <li>
+                <a href="{{ .URL | absLangURL }}" title="{{ .Title | default .Name }} {{- cond $is_search (" (Alt + /)" | safeHTMLAttr) ("" | safeHTMLAttr ) }}"
+                {{- cond $is_search (" accesskey=/" | safeHTMLAttr) ("" | safeHTMLAttr ) }}>
+                    <span {{- if eq $menu_item_url $page_url }} class="active" {{- end }}>
+                        {{- .Pre }}
+                        {{- .Name -}}
+                        {{ .Post -}}
+                    </span>
+                    {{- if (findRE "://" .URL) }}&nbsp;
+                    <svg fill="none" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round"
+                        stroke-linejoin="round" stroke-width="2.5" viewBox="0 0 24 24" height="12" width="12">
+                        <path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path>
+                        <path d="M15 3h6v6"></path>
+                        <path d="M10 14L21 3"></path>
+                    </svg>
+                    {{- end }}
+                </a>
+            </li>
+            {{- end }}
+        </ul>
+    </nav>
+</header>
diff --git a/themes/PaperMod/layouts/partials/home_info.html b/themes/PaperMod/layouts/partials/home_info.html
new file mode 100644 (file)
index 0000000..199dfb7
--- /dev/null
@@ -0,0 +1,13 @@
+{{- with site.Params.homeInfoParams }}
+<article class="first-entry home-info">
+    <header class="entry-header">
+        <h1>{{ .Title | markdownify }}</h1>
+    </header>
+    <div class="entry-content">
+        {{ .Content | markdownify }}
+    </div>
+    <footer class="entry-footer">
+        {{ partial "social_icons.html" (dict "align" site.Params.homeInfoParams.AlignSocialIconsTo) }}
+    </footer>
+</article>
+{{- end -}}
diff --git a/themes/PaperMod/layouts/partials/index_profile.html b/themes/PaperMod/layouts/partials/index_profile.html
new file mode 100644 (file)
index 0000000..6882f39
--- /dev/null
@@ -0,0 +1,58 @@
+<div class="profile">
+    {{- with site.Params.profileMode }}
+    <div class="profile_inner">
+        {{- if .imageUrl -}}
+        {{- $img := "" }}
+        {{- if not (urls.Parse .imageUrl).IsAbs }}
+            {{- $img = resources.Get .imageUrl }}
+        {{- end }}
+        {{- if $img }}
+            {{- $processableFormats := (slice "jpg" "jpeg" "png" "tif" "bmp" "gif") -}}
+            {{- if hugo.IsExtended -}}
+                {{- $processableFormats = $processableFormats | append "webp" -}}
+            {{- end -}}
+            {{- $prod := (hugo.IsProduction | or (eq site.Params.env "production")) }}
+            {{- if and (in $processableFormats $img.MediaType.SubType) (eq $prod true)}}
+                {{- if (not (and (not .imageHeight) (not .imageWidth))) }}
+                    {{- $img = $img.Resize (printf "%dx%d" .imageWidth .imageHeight) }}
+                {{- else if .imageHeight }}
+                    {{- $img = $img.Resize (printf "x%d" .imageHeight) }}
+                {{ else if .imageWidth }}
+                    {{- $img = $img.Resize (printf "%dx" .imageWidth) }}
+                {{ else }}
+                    {{- $img = $img.Resize "150x150" }}
+                {{- end }}
+            {{- end }}
+            <img draggable="false" src="{{ $img.Permalink }}" alt="{{ .imageTitle | default "profile image" }}" title="{{ .imageTitle }}"
+                height="{{ .imageHeight | default 150 }}" width="{{ .imageWidth | default 150 }}" />
+        {{- else }}
+        <img draggable="false" src="{{ .imageUrl | absURL }}" alt="{{ .imageTitle | default "profile image" }}" title="{{ .imageTitle }}"
+            height="{{ .imageHeight | default 150 }}" width="{{ .imageWidth | default 150 }}" />
+        {{- end }}
+        {{- end }}
+        <h1>{{ .title | default site.Title | markdownify }}</h1>
+        <span>{{ .subtitle | markdownify }}</span>
+        {{- partial "social_icons.html" -}}
+
+        {{- with .buttons }}
+        <div class="buttons">
+            {{- range . }}
+            <a class="button" href="{{ trim .url " " }}" rel="noopener" title="{{ .name }}">
+                <span class="button-inner">
+                    {{ .name }}
+                    {{- if (findRE "://" .url) }}&nbsp;
+                    <svg fill="none" shape-rendering="geometricPrecision" stroke="currentColor" stroke-linecap="round"
+                        stroke-linejoin="round" stroke-width="2.5" viewBox="0 0 24 24" height="14" width="14">
+                        <path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"></path>
+                        <path d="M15 3h6v6"></path>
+                        <path d="M10 14L21 3"></path>
+                    </svg>
+                    {{- end }}
+                </span>
+            </a>
+            {{- end }}
+        </div>
+        {{- end }}
+    </div>
+    {{- end}}
+</div>
diff --git a/themes/PaperMod/layouts/partials/post_canonical.html b/themes/PaperMod/layouts/partials/post_canonical.html
new file mode 100644 (file)
index 0000000..abfc1e3
--- /dev/null
@@ -0,0 +1,9 @@
+{{ if and (.Params.canonicalURL) (.Params.ShowCanonicalLink ) -}}
+{{ $url := urls.Parse .Params.canonicalURL }}
+
+{{- if or .Params.author site.Params.author (.Param "ShowReadingTime") (not .Date.IsZero) .IsTranslated (or .Params.editPost.URL site.Params.editPost.URL) }}&nbsp;|&nbsp;{{- end -}}
+<span>
+    {{- (site.Params.CanonicalLinkText | default .Params.CanonicalLinkText) | default "Originally published at" -}}
+    &nbsp;<a href="{{ trim .Params.canonicalURL " " }}" title="{{ trim .Params.canonicalURL " " }}" target="_blank" rel="noopener noreferrer">{{ $url.Host }}</a>
+</span>
+{{- end }}
diff --git a/themes/PaperMod/layouts/partials/post_meta.html b/themes/PaperMod/layouts/partials/post_meta.html
new file mode 100644 (file)
index 0000000..ae996ba
--- /dev/null
@@ -0,0 +1,23 @@
+{{- $scratch := newScratch }}
+
+{{- if not .Date.IsZero -}}
+{{- $scratch.Add "meta" (slice (printf "<span title='%s'>%s</span>" (.Date) (.Date | time.Format (default ":date_long" site.Params.DateFormat)))) }}
+{{- end }}
+
+{{- if (.Param "ShowReadingTime") -}}
+{{- $scratch.Add "meta" (slice (printf "<span>%s</span>" (i18n "read_time" .ReadingTime | default (printf "%d min" .ReadingTime)))) }}
+{{- end }}
+
+{{- if (.Param "ShowWordCount") -}}
+{{- $scratch.Add "meta" (slice (printf "<span>%s</span>" (i18n "words" .WordCount | default (printf "%d words" .WordCount)))) }}
+{{- end }}
+
+{{- if not (.Param "hideAuthor") -}}
+{{- with (partial "author.html" .) }}
+{{- $scratch.Add "meta" (slice (printf "<span>%s</span>" .)) }}
+{{- end }}
+{{- end }}
+
+{{- with ($scratch.Get "meta") }}
+{{- delimit . "&nbsp;·&nbsp;" | safeHTML -}}
+{{- end -}}
diff --git a/themes/PaperMod/layouts/partials/post_nav_links.html b/themes/PaperMod/layouts/partials/post_nav_links.html
new file mode 100644 (file)
index 0000000..b988641
--- /dev/null
@@ -0,0 +1,19 @@
+{{- $pages := where site.RegularPages "Type" "in" site.Params.mainSections }}
+{{- if and (gt (len $pages) 1) (in $pages . ) }}
+<nav class="paginav">
+  {{- with $pages.Next . }}
+  <a class="prev" href="{{ .Permalink }}">
+    <span class="title">« {{ i18n "prev_page" }}</span>
+    <br>
+    <span>{{- .Name -}}</span>
+  </a>
+  {{- end }}
+  {{- with $pages.Prev . }}
+  <a class="next" href="{{ .Permalink }}">
+    <span class="title">{{ i18n "next_page" }} »</span>
+    <br>
+    <span>{{- .Name -}}</span>
+  </a>
+  {{- end }}
+</nav>
+{{- end }}
diff --git a/themes/PaperMod/layouts/partials/share_icons.html b/themes/PaperMod/layouts/partials/share_icons.html
new file mode 100644 (file)
index 0000000..910ba7f
--- /dev/null
@@ -0,0 +1,95 @@
+{{- $pageurl := .Permalink }}
+{{- $title := .Title }}
+
+{{- $.Scratch.Set "tags" ""}}
+
+{{- with .Params.Tags }}
+{{- $hashtags := newScratch}}
+{{- range . }}{{ $hashtags.Add "tags" (slice (replaceRE "(\\s)" "" . ))}}{{end}}
+{{- $.Scratch.Set "tags" (delimit ($hashtags.Get "tags") ",") }}
+{{- end -}}
+
+{{- $custom := false }}
+{{- $ShareButtons := (.Param "ShareButtons")}}
+{{- with $ShareButtons }}{{ $custom = true }}{{ end }}
+
+<ul class="share-buttons">
+    {{- if (or (cond ($custom) (in $ShareButtons "x") (true)) (cond ($custom) (in $ShareButtons "twitter") (true))) }}
+    <li>
+        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on x"
+            href="https://x.com/intent/tweet/?text={{ $title }}&amp;url={{ $pageurl }}&amp;hashtags={{- $.Scratch.Get "tags" -}}">
+            <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
+                <path
+                    d="M512 62.554 L 512 449.446 C 512 483.97 483.97 512 449.446 512 L 62.554 512 C 28.03 512 0 483.97 0 449.446 L 0 62.554 C 0 28.03 28.029 0 62.554 0 L 449.446 0 C 483.971 0 512 28.03 512 62.554 Z M 269.951 190.75 L 182.567 75.216 L 56 75.216 L 207.216 272.95 L 63.9 436.783 L 125.266 436.783 L 235.9 310.383 L 332.567 436.783 L 456 436.783 L 298.367 228.367 L 432.367 75.216 L 371.033 75.216 Z M 127.633 110 L 164.101 110 L 383.481 400.065 L 349.5 400.065 Z" />
+            </svg>
+        </a>
+    </li>
+    {{- end }}
+    {{- if (cond ($custom) (in $ShareButtons "linkedin") (true)) }}
+    <li>
+        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on linkedin"
+            href="https://www.linkedin.com/shareArticle?mini=true&amp;url={{ $pageurl }}&amp;title={{ $title }}&amp;summary={{ $title }}&amp;source={{ $pageurl }}">
+            <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
+                <path
+                    d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-288.985,423.278l0,-225.717l-75.04,0l0,225.717l75.04,0Zm270.539,0l0,-129.439c0,-69.333 -37.018,-101.586 -86.381,-101.586c-39.804,0 -57.634,21.891 -67.617,37.266l0,-31.958l-75.021,0c0.995,21.181 0,225.717 0,225.717l75.02,0l0,-126.056c0,-6.748 0.486,-13.492 2.474,-18.315c5.414,-13.475 17.767,-27.434 38.494,-27.434c27.135,0 38.007,20.707 38.007,51.037l0,120.768l75.024,0Zm-307.552,-334.556c-25.674,0 -42.448,16.879 -42.448,39.002c0,21.658 16.264,39.002 41.455,39.002l0.484,0c26.165,0 42.452,-17.344 42.452,-39.002c-0.485,-22.092 -16.241,-38.954 -41.943,-39.002Z" />
+            </svg>
+        </a>
+    </li>
+    {{- end }}
+    {{- if (cond ($custom) (in $ShareButtons "reddit") (true)) }}
+    <li>
+        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on reddit"
+            href="https://reddit.com/submit?url={{ $pageurl }}&title={{ $title }}">
+            <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
+                <path
+                    d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-3.446,265.638c0,-22.964 -18.616,-41.58 -41.58,-41.58c-11.211,0 -21.361,4.457 -28.841,11.666c-28.424,-20.508 -67.586,-33.757 -111.204,-35.278l18.941,-89.121l61.884,13.157c0.756,15.734 13.642,28.29 29.56,28.29c16.407,0 29.706,-13.299 29.706,-29.701c0,-16.403 -13.299,-29.702 -29.706,-29.702c-11.666,0 -21.657,6.792 -26.515,16.578l-69.105,-14.69c-1.922,-0.418 -3.939,-0.042 -5.585,1.036c-1.658,1.073 -2.811,2.761 -3.224,4.686l-21.152,99.438c-44.258,1.228 -84.046,14.494 -112.837,35.232c-7.468,-7.164 -17.589,-11.591 -28.757,-11.591c-22.965,0 -41.585,18.616 -41.585,41.58c0,16.896 10.095,31.41 24.568,37.918c-0.639,4.135 -0.99,8.328 -0.99,12.576c0,63.977 74.469,115.836 166.33,115.836c91.861,0 166.334,-51.859 166.334,-115.836c0,-4.218 -0.347,-8.387 -0.977,-12.493c14.564,-6.47 24.735,-21.034 24.735,-38.001Zm-119.474,108.193c-20.27,20.241 -59.115,21.816 -70.534,21.816c-11.428,0 -50.277,-1.575 -70.522,-21.82c-3.007,-3.008 -3.007,-7.882 0,-10.889c3.003,-2.999 7.882,-3.003 10.885,0c12.777,12.781 40.11,17.317 59.637,17.317c19.522,0 46.86,-4.536 59.657,-17.321c3.016,-2.999 7.886,-2.995 10.885,0.008c3.008,3.011 3.003,7.882 -0.008,10.889Zm-5.23,-48.781c-16.373,0 -29.701,-13.324 -29.701,-29.698c0,-16.381 13.328,-29.714 29.701,-29.714c16.378,0 29.706,13.333 29.706,29.714c0,16.374 -13.328,29.698 -29.706,29.698Zm-160.386,-29.702c0,-16.381 13.328,-29.71 29.714,-29.71c16.369,0 29.689,13.329 29.689,29.71c0,16.373 -13.32,29.693 -29.689,29.693c-16.386,0 -29.714,-13.32 -29.714,-29.693Z" />
+            </svg>
+        </a>
+    </li>
+    {{- end }}
+    {{- if (cond ($custom) (in $ShareButtons "facebook") (true)) }}
+    <li>
+        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on facebook"
+            href="https://facebook.com/sharer/sharer.php?u={{ $pageurl }}">
+            <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
+                <path
+                    d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-106.468,0l0,-192.915l66.6,0l12.672,-82.621l-79.272,0l0,-53.617c0,-22.603 11.073,-44.636 46.58,-44.636l36.042,0l0,-70.34c0,0 -32.71,-5.582 -63.982,-5.582c-65.288,0 -107.96,39.569 -107.96,111.204l0,62.971l-72.573,0l0,82.621l72.573,0l0,192.915l-191.104,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Z" />
+            </svg>
+        </a>
+    </li>
+    {{- end }}
+    {{- if (cond ($custom) (in $ShareButtons "whatsapp") (true)) }}
+    <li>
+        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on whatsapp"
+            href="https://api.whatsapp.com/send?text={{ $title }}%20-%20{{ $pageurl }}">
+            <svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
+                <path
+                    d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-58.673,127.703c-33.842,-33.881 -78.847,-52.548 -126.798,-52.568c-98.799,0 -179.21,80.405 -179.249,179.234c-0.013,31.593 8.241,62.428 23.927,89.612l-25.429,92.884l95.021,-24.925c26.181,14.28 55.659,21.807 85.658,21.816l0.074,0c98.789,0 179.206,-80.413 179.247,-179.243c0.018,-47.895 -18.61,-92.93 -52.451,-126.81Zm-126.797,275.782l-0.06,0c-26.734,-0.01 -52.954,-7.193 -75.828,-20.767l-5.441,-3.229l-56.386,14.792l15.05,-54.977l-3.542,-5.637c-14.913,-23.72 -22.791,-51.136 -22.779,-79.287c0.033,-82.142 66.867,-148.971 149.046,-148.971c39.793,0.014 77.199,15.531 105.329,43.692c28.128,28.16 43.609,65.592 43.594,105.4c-0.034,82.149 -66.866,148.983 -148.983,148.984Zm81.721,-111.581c-4.479,-2.242 -26.499,-13.075 -30.604,-14.571c-4.105,-1.495 -7.091,-2.241 -10.077,2.241c-2.986,4.483 -11.569,14.572 -14.182,17.562c-2.612,2.988 -5.225,3.364 -9.703,1.12c-4.479,-2.241 -18.91,-6.97 -36.017,-22.23c-13.314,-11.876 -22.304,-26.542 -24.916,-31.026c-2.612,-4.484 -0.279,-6.908 1.963,-9.14c2.016,-2.007 4.48,-5.232 6.719,-7.847c2.24,-2.615 2.986,-4.484 4.479,-7.472c1.493,-2.99 0.747,-5.604 -0.374,-7.846c-1.119,-2.241 -10.077,-24.288 -13.809,-33.256c-3.635,-8.733 -7.327,-7.55 -10.077,-7.688c-2.609,-0.13 -5.598,-0.158 -8.583,-0.158c-2.986,0 -7.839,1.121 -11.944,5.604c-4.105,4.484 -15.675,15.32 -15.675,37.364c0,22.046 16.048,43.342 18.287,46.332c2.24,2.99 31.582,48.227 76.511,67.627c10.685,4.615 19.028,7.371 25.533,9.434c10.728,3.41 20.492,2.929 28.209,1.775c8.605,-1.285 26.499,-10.833 30.231,-21.295c3.732,-10.464 3.732,-19.431 2.612,-21.298c-1.119,-1.869 -4.105,-2.99 -8.583,-5.232Z" />
+            </svg>
+        </a>
+    </li>
+    {{- end }}
+    {{- if (cond ($custom) (in $ShareButtons "telegram") (true)) }}
+    <li>
+        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on telegram"
+            href="https://telegram.me/share/url?text={{ $title }}&amp;url={{ $pageurl }}">
+            <svg version="1.1" xml:space="preserve" viewBox="2 2 28 28" height="30px" width="30px" fill="currentColor">
+                <path
+                    d="M26.49,29.86H5.5a3.37,3.37,0,0,1-2.47-1,3.35,3.35,0,0,1-1-2.47V5.48A3.36,3.36,0,0,1,3,3,3.37,3.37,0,0,1,5.5,2h21A3.38,3.38,0,0,1,29,3a3.36,3.36,0,0,1,1,2.46V26.37a3.35,3.35,0,0,1-1,2.47A3.38,3.38,0,0,1,26.49,29.86Zm-5.38-6.71a.79.79,0,0,0,.85-.66L24.73,9.24a.55.55,0,0,0-.18-.46.62.62,0,0,0-.41-.17q-.08,0-16.53,6.11a.59.59,0,0,0-.41.59.57.57,0,0,0,.43.52l4,1.24,1.61,4.83a.62.62,0,0,0,.63.43.56.56,0,0,0,.4-.17L16.54,20l4.09,3A.9.9,0,0,0,21.11,23.15ZM13.8,20.71l-1.21-4q8.72-5.55,8.78-5.55c.15,0,.23,0,.23.16a.18.18,0,0,1,0,.06s-2.51,2.3-7.52,6.8Z" />
+            </svg>
+        </a>
+    </li>
+    {{- end }}
+    {{- if (cond ($custom) (in $ShareButtons "ycombinator") (true)) }}
+    <li>
+        <a target="_blank" rel="noopener noreferrer" aria-label="share {{ $title | plainify }} on ycombinator"
+            href="https://news.ycombinator.com/submitlink?t={{ $title }}&u={{ $pageurl }}">
+            <svg version="1.1" xml:space="preserve" width="30px" height="30px" viewBox="0 0 512 512" fill="currentColor"
+                xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
+                <path
+                    d="M449.446 0C483.971 0 512 28.03 512 62.554L512 449.446C512 483.97 483.97 512 449.446 512L62.554 512C28.03 512 0 483.97 0 449.446L0 62.554C0 28.03 28.029 0 62.554 0L449.446 0ZM183.8767 87.9921H121.8427L230.6673 292.4508V424.0079H281.3328V292.4508L390.1575 87.9921H328.1233L256 238.2489z" />
+            </svg>
+        </a>
+    </li>
+    {{- end }}
+</ul>
diff --git a/themes/PaperMod/layouts/partials/social_icons.html b/themes/PaperMod/layouts/partials/social_icons.html
new file mode 100644 (file)
index 0000000..ce76a30
--- /dev/null
@@ -0,0 +1,8 @@
+<div class="social-icons" {{ with .align}}align="{{.}}" {{- end }}>
+    {{- range site.Params.socialIcons }}
+    <a href="{{ trim .url " " | safeURL }}" target="_blank" rel="noopener noreferrer me"
+        title="{{ (.title | default .name) | title }}">
+        {{ partial "svg.html" . }}
+    </a>
+    {{- end }}
+</div>
diff --git a/themes/PaperMod/layouts/partials/svg.html b/themes/PaperMod/layouts/partials/svg.html
new file mode 100644 (file)
index 0000000..ab9b4a3
--- /dev/null
@@ -0,0 +1,1001 @@
+{{- $icon_name := ( trim .name " " | lower )}}
+{{- if (eq $icon_name "123rf") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path style="font-variation-settings:normal"
+        d="M7.48 3.826c-.702 0-1.345.388-1.675 1.008l-.711 1.334a4.214 4.214 0 0 1-1.614 1.67l-.388.224a2.207 2.207 0 0 0-1.104 1.913v8.607c0 .878.712 1.592 1.59 1.592h1.186c.468 0 .916-.19 1.244-.524l1.478-1.504c.266-.27.628-.421 1.006-.421h7.04c.378 0 .74.151 1.005.421l1.478 1.504c.329.334.778.524 1.247.524h1.183c.879 0 1.592-.714 1.592-1.592V9.975c0-.79-.422-1.518-1.106-1.912l-.388-.225a4.214 4.214 0 0 1-1.613-1.67l-.711-1.334a1.899 1.899 0 0 0-1.676-1.008z"
+        stroke-linejoin="miter" />
+    <circle cx="12" cy="12.467" r="2.723" />
+</svg>
+{{- else if (eq $icon_name "500px") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M7.451 8.9995A3.0005 3.0005 0 1 0 10.4514 12a3.0275 3.0275 0 0 0-3.0006-3.0005Zm0 5.371A2.3554 2.3554 0 1 1 9.7912 12a2.3704 2.3704 0 0 1-2.3404 2.3704Zm6.448-5.371A3.0005 3.0005 0 1 0 16.8997 12a3.0005 3.0005 0 0 0-3.0005-3.0005Zm0 5.371A2.3554 2.3554 0 1 1 16.2396 12a2.3314 2.3314 0 0 1-2.3404 2.3704zM2.29 10.7997a2.0224 2.0224 0 0 0-1.5903.42V9.6297h2.7005c.09 0 .15-.03.15-.3 0-.2701-.12-.2701-.18-.2701H.3997a.27.27 0 0 0-.27.27V11.97c0 .15.09.18.24.21a.228.228 0 0 0 .27-.06A1.7073 1.7073 0 0 1 2.14 11.4 1.5603 1.5603 0 0 1 3.4902 12.72 1.5183 1.5183 0 0 1 2.17 14.4004h-.18a1.5303 1.5303 0 0 1-1.4103-.9901c-.03-.09-.09-.15-.33-.06-.2401.09-.2701.15-.2401.24a2.1274 2.1274 0 0 0 2.7005 1.2602A2.1274 2.1274 0 0 0 3.9703 12.15 2.1004 2.1004 0 0 0 2.29 10.7998zm16.65-1.7703a1.6263 1.6263 0 0 0-1.4403 1.6203v2.6704c0 .15.12.18.3.18s.3001-.03.3001-.18v-2.6704a1.0082 1.0082 0 0 1 .8702-1.0202.9872.9872 0 0 1 .7501.24.9572.9572 0 0 1 .33.7202 1.2002 1.2002 0 0 1-.21.57A.9452.9452 0 0 1 19 11.55c-.12 0-.21 0-.24.27 0 .1801 0 .2701.15.3001a1.4763 1.4763 0 0 0 .8701-.18 1.6113 1.6113 0 0 0 .8702-1.2602 1.5543 1.5543 0 0 0-1.4463-1.6803.8311.8311 0 0 1-.264.03zm3.9307 1.5602 1.0802-1.0801c.03-.03.12-.12-.06-.3301a.3.3 0 0 0-.2101-.12.156.156 0 0 0-.12.06l-1.0802 1.0802-1.0802-1.1102c-.09-.09-.18-.06-.33.06-.15.12-.15.24-.06.33l1.0801 1.0802-1.0862 1.1102a.228.228 0 0 0-.06.12.252.252 0 0 0 .12.2101.483.483 0 0 0 .21.12.318.318 0 0 0 .1501-.06l1.0802-1.0802 1.0802 1.0802a.156.156 0 0 0 .12.06.3.3 0 0 0 .21-.12c.09-.12.12-.24.03-.3z" />
+</svg>
+{{- else if (eq $icon_name "adobestock") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path style="font-variation-settings:normal" d="M2.235 2.235h19.53v19.53H2.235z" />
+    <path style="font-variation-settings:normal"
+        d="M6.165 16.659s3.16 1.2 4.602-.17c1.37-1.3.787-3.163-.754-4.05-1.68-.969-3.284-1.788-3.036-3.536.446-3.138 4.386-1.851 4.386-1.851M15.792 7.794v7.774c0 1.023.635 1.766 2.043 1.624M17.826 10.04h-3.582" />
+</svg>
+{{- else if (eq $icon_name "anilist") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -2 25 28" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path style="font-variation-settings:normal"
+        d="M6.361 2.943 0 21.056h4.942l1.077-3.133H11.4l1.052 3.133H22.9c.71 0 1.1-.392 1.1-1.101V17.53c0-.71-.39-1.101-1.1-1.101h-6.483V4.045c0-.71-.392-1.102-1.101-1.102h-2.422c-.71 0-1.101.392-1.101 1.102v1.064l-.758-2.166zm2.324 5.948 1.688 5.018H7.144z" />
+</svg>
+{{- else if or (eq $icon_name "ao3") (eq $icon_name "archiveofourown") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="1 1 22 22" stroke-width="1.6" stroke="currentColor" fill="none"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path stroke="none" d="M0 0h24v24H0z" fill="none" />
+    <path d="M2 5c7.109 4.1 10.956 10.131 12 14c1.074 -4.67 4.49 -8.94 8 -11" />
+    <path d="M14 8m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
+    <path d="M7 9c-.278 5.494 -2.337 7.33 -4 10c4.013 -2 6.02 -5 15.05 -5c4.012 0 3.51 2.5 1 3c2 .5 2.508 5 -2.007 2" />
+</svg>
+{{- else if (eq $icon_name "applemusic") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="M23.994 6.124a9.23 9.23 0 00-.24-2.19c-.317-1.31-1.062-2.31-2.18-3.043a5.022 5.022 0 00-1.877-.726 10.496 10.496 0 00-1.564-.15c-.04-.003-.083-.01-.124-.013H5.986c-.152.01-.303.017-.455.026-.747.043-1.49.123-2.193.4-1.336.53-2.3 1.452-2.865 2.78-.192.448-.292.925-.363 1.408-.056.392-.088.785-.1 1.18 0 .032-.007.062-.01.093v12.223c.01.14.017.283.027.424.05.815.154 1.624.497 2.373.65 1.42 1.738 2.353 3.234 2.801.42.127.856.187 1.293.228.555.053 1.11.06 1.667.06h11.03a12.5 12.5 0 001.57-.1c.822-.106 1.596-.35 2.295-.81a5.046 5.046 0 001.88-2.207c.186-.42.293-.87.37-1.324.113-.675.138-1.358.137-2.04-.002-3.8 0-7.595-.003-11.393zm-6.423 3.99v5.712c0 .417-.058.827-.244 1.206-.29.59-.76.962-1.388 1.14-.35.1-.706.157-1.07.173-.95.045-1.773-.6-1.943-1.536a1.88 1.88 0 011.038-2.022c.323-.16.67-.25 1.018-.324.378-.082.758-.153 1.134-.24.274-.063.457-.23.51-.516a.904.904 0 00.02-.193c0-1.815 0-3.63-.002-5.443a.725.725 0 00-.026-.185c-.04-.15-.15-.243-.304-.234-.16.01-.318.035-.475.066-.76.15-1.52.303-2.28.456l-2.325.47-1.374.278c-.016.003-.032.01-.048.013-.277.077-.377.203-.39.49-.002.042 0 .086 0 .13-.002 2.602 0 5.204-.003 7.805 0 .42-.047.836-.215 1.227-.278.64-.77 1.04-1.434 1.233-.35.1-.71.16-1.075.172-.96.036-1.755-.6-1.92-1.544-.14-.812.23-1.685 1.154-2.075.357-.15.73-.232 1.108-.31.287-.06.575-.116.86-.177.383-.083.583-.323.6-.714v-.15c0-2.96 0-5.922.002-8.882 0-.123.013-.25.042-.37.07-.285.273-.448.546-.518.255-.066.515-.112.774-.165.733-.15 1.466-.296 2.2-.444l2.27-.46c.67-.134 1.34-.27 2.01-.403.22-.043.442-.088.663-.106.31-.025.523.17.554.482.008.073.012.148.012.223.002 1.91.002 3.822 0 5.732z" />
+</svg>
+{{- else if (eq $icon_name "applepodcasts") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M5.34 0A5.328 5.328 0 000 5.34v13.32A5.328 5.328 0 005.34 24h13.32A5.328 5.328 0 0024 18.66V5.34A5.328 5.328 0 0018.66 0zm6.525 2.568c2.336 0 4.448.902 6.056 2.587 1.224 1.272 1.912 2.619 2.264 4.392.12.59.12 2.2.007 2.864a8.506 8.506 0 01-3.24 5.296c-.608.46-2.096 1.261-2.336 1.261-.088 0-.096-.091-.056-.46.072-.592.144-.715.48-.856.536-.224 1.448-.874 2.008-1.435a7.644 7.644 0 002.008-3.536c.208-.824.184-2.656-.048-3.504-.728-2.696-2.928-4.792-5.624-5.352-.784-.16-2.208-.16-3 0-2.728.56-4.984 2.76-5.672 5.528-.184.752-.184 2.584 0 3.336.456 1.832 1.64 3.512 3.192 4.512.304.2.672.408.824.472.336.144.408.264.472.856.04.36.03.464-.056.464-.056 0-.464-.176-.896-.384l-.04-.03c-2.472-1.216-4.056-3.274-4.632-6.012-.144-.706-.168-2.392-.03-3.04.36-1.74 1.048-3.1 2.192-4.304 1.648-1.737 3.768-2.656 6.128-2.656zm.134 2.81c.409.004.803.04 1.106.106 2.784.62 4.76 3.408 4.376 6.174-.152 1.114-.536 2.03-1.216 2.88-.336.43-1.152 1.15-1.296 1.15-.023 0-.048-.272-.048-.603v-.605l.416-.496c1.568-1.878 1.456-4.502-.256-6.224-.664-.67-1.432-1.064-2.424-1.246-.64-.118-.776-.118-1.448-.008-1.02.167-1.81.562-2.512 1.256-1.72 1.704-1.832 4.342-.264 6.222l.413.496v.608c0 .336-.027.608-.06.608-.03 0-.264-.16-.512-.36l-.034-.011c-.832-.664-1.568-1.842-1.872-2.997-.184-.698-.184-2.024.008-2.72.504-1.878 1.888-3.335 3.808-4.019.41-.145 1.133-.22 1.814-.211zm-.13 2.99c.31 0 .62.06.844.178.488.253.888.745 1.04 1.259.464 1.578-1.208 2.96-2.72 2.254h-.015c-.712-.331-1.096-.956-1.104-1.77 0-.733.408-1.371 1.112-1.745.224-.117.534-.176.844-.176zm-.011 4.728c.988-.004 1.706.349 1.97.97.198.464.124 1.932-.218 4.302-.232 1.656-.36 2.074-.68 2.356-.44.39-1.064.498-1.656.288h-.003c-.716-.257-.87-.605-1.164-2.644-.341-2.37-.416-3.838-.218-4.302.262-.616.974-.966 1.97-.97z" />
+</svg>
+{{- else if (eq $icon_name "bandcamp") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path d="M0 18.75l7.437-13.5H24l-7.438 13.5H0z" />
+</svg>
+{{- else if (eq $icon_name "behance") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path paint-order="stroke fill markers" stroke-linejoin="miter" stroke-width="2"
+        style="font-variation-settings:normal"
+        d="M1.774 18.063V5.466h5.51c1.978 0 3.116 1.326 3.055 2.806-.043 1.049-.711 2.988-2.643 2.988h-5.93H7.73c1.224 0 3.532 1.13 3.532 3.532 0 2.4-1.873 3.27-3.318 3.27zm12.57-4.459h7.89s.012-4.18-4.167-4.18c-5.237 0-5.277 9.11-.3 9.11 3.06 0 3.935-1.806 3.935-1.806M15.526 5.823h4.987" />
+</svg>
+{{- else if (eq $icon_name "bilibili") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round">
+    <rect x="1.3333" y="6" width="21.333" height="15.333" rx="4" ry="4" />
+    <path d="m8 12.4v1.2" />
+    <path d="m16 12.4v1.2" />
+    <path d="m5.8853 2.6667 2.6667 2.6667" />
+    <path d="m18.115 2.6667-2.6667 2.6667" />
+</svg>
+{{- else if (eq $icon_name "bitcoin") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M23.638 14.904c-1.602 6.43-8.113 10.34-14.542 8.736C2.67 22.05-1.244 15.525.362 9.105 1.962 2.67 8.475-1.243 14.9.358c6.43 1.605 10.342 8.115 8.738 14.548v-.002zm-6.35-4.613c.24-1.59-.974-2.45-2.64-3.03l.54-2.153-1.315-.33-.525 2.107c-.345-.087-.705-.167-1.064-.25l.526-2.127-1.32-.33-.54 2.165c-.285-.067-.565-.132-.84-.2l-1.815-.45-.35 1.407s.975.225.955.236c.535.136.63.486.615.766l-1.477 5.92c-.075.166-.24.406-.614.314.015.02-.96-.24-.96-.24l-.66 1.51 1.71.426.93.242-.54 2.19 1.32.327.54-2.17c.36.1.705.19 1.05.273l-.51 2.154 1.32.33.545-2.19c2.24.427 3.93.257 4.64-1.774.57-1.637-.03-2.58-1.217-3.196.854-.193 1.5-.76 1.68-1.93h.01zm-3.01 4.22c-.404 1.64-3.157.75-4.05.53l.72-2.9c.896.23 3.757.67 3.33 2.37zm.41-4.24c-.37 1.49-2.662.735-3.405.55l.654-2.64c.744.18 3.137.524 2.75 2.084v.006z" />
+</svg>
+{{- else if (eq $icon_name "bluesky") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-25 0 400 320" fill="none" stroke="currentColor" stroke-width="30">
+    <path
+        d="M180 141.964C163.699 110.262 119.308 51.1817 78.0347 22.044C38.4971 -5.86834 23.414 -1.03207 13.526 3.43594C2.08093 8.60755 0 26.1785 0 36.5164C0 46.8542 5.66748 121.272 9.36416 133.694C21.5786 174.738 65.0603 188.607 105.104 184.156C107.151 183.852 109.227 183.572 111.329 183.312C109.267 183.642 107.19 183.924 105.104 184.156C46.4204 192.847 -5.69621 214.233 62.6582 290.33C137.848 368.18 165.705 273.637 180 225.702C194.295 273.637 210.76 364.771 295.995 290.33C360 225.702 313.58 192.85 254.896 184.158C252.81 183.926 250.733 183.645 248.671 183.315C250.773 183.574 252.849 183.855 254.896 184.158C294.94 188.61 338.421 174.74 350.636 133.697C354.333 121.275 360 46.8568 360 36.519C360 26.1811 357.919 8.61012 346.474 3.43851C336.586 -1.02949 321.503 -5.86576 281.965 22.0466C240.692 51.1843 196.301 110.262 180 141.964Z" />
+</svg>
+{{- else if (eq $icon_name "bookwyrm") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="m8.3359 0.0078125c-2.0069 0.073882-3.9461 1.339-5.1719 3.1055-1.2258 1.7665-1.686 4.04-0.90234 6.2734 0.7201 2.0524 2.301 3.6839 4.377 4.3066l-0.40234 2.5547c-0.61924-0.29743-1.2854-0.52634-1.9707-0.55078-1.0699-0.03816-2.6915 0.27366-3.707 2.0703-0.69877 1.2362-0.81095 2.9826 0.10555 4.4707 0.61159 0.99303 1.7053 1.9179 4.2929 1.4745 1.4845-0.25433 2.2237-1.3456 2.9082-2.9727 0.37179-0.88378 0.65101-2.0921 1.1895-2.8398 0.73644-1.0227 2.285-1.5902 3.2578-1.6113-0.93782-0.45256-3.7855-1.1922-5.584 1.8008-0.48715 0.8107-1.0605 2.4179-1.9609 2.9531-0.2998 0.1782-0.76718 0.0994-1.0781-0.13477-0.20088-0.15128-0.95922-1.0342-0.16016-1.9395 0.21799-0.24696 0.54865-0.3631 0.93555-0.33398 0.26333 0.01982 0.55734 0.12268 0.88477 0.35352 0.21582-0.44651 0.44063-0.88851 0.68359-1.3204 0.19226-0.34173 0.49358-0.75049 0.88086-1.1426l0.87305-5.3652c-0.24381 0.10022-0.52508 0.15616-0.76367 0.18559-0.41295 0.05094-0.81717 0.02605-1.1895-0.08789-0.48449-0.14828-0.99894-0.41785-1.2695-0.93554-0.086172-0.16486-0.024184-0.37016 0.13477-0.4668 0.17373-0.10562 0.37573-0.028092 0.5 0.13281 0.41046 0.53144 1.1723 0.85969 2.0879 0.58794 1.2598-0.3318 2.1585-0.89477 2.7973-0.94823 0.62644-0.052424 0.9395 0.63646 1.1998 1.2859 0.08927-0.40702 0.33679-1.217 1-0.30078 0.020069-0.7907 0.48358-0.94364 0.93945-0.37895-1.2259-2.9496-3.6999-1.7628-5.0589-1.4148-0.63799 0.1634-1.8432 0.2286-2.5441-1.5549-0.19205-1.9238 0.832-3.0815 1.9497-3.6181 1.11-0.5329 2.4759-0.33316 3.4043 0.23242-0.36121 0.71072-0.96917 0.66041-1.7031 0.73633 0.97044 0.57933 1.6654 0.51691 2.4707 0.23438 0.05017 0.64643-0.27301 0.94594-0.66797 1.4023 1.1363 0.014693 1.7281-0.12865 1.9199-0.2207-0.06996-0.12068-0.13737-0.24477-0.20117-0.375-0.15114-0.30851-0.20068-1.0047-0.10742-1.7402 0.2535 0.25256 0.66781 0.50633 1.0586 0.54492-0.13923-0.55326 0.04953-1.4041 0.36523-1.9453 0.17929 0.22031 0.65534 0.48341 1.0664 0.51758-0.03367-0.13937-0.01471-0.38143 0.01758-0.63672-0.9214-0.25345-1.2388-0.43896-1.8164-0.75195-0.73954-0.40078-3.2824-1.7015-5.041-1.6367zm11.457 1.4355-0.50391 1.0195c-0.6186-0.30447-1.3497 0.099697-1.4238 0.78516 0 0-1.575-0.59615-1.7793-1.3223-0.25838 0.42041-0.34228 1.2928-0.10156 1.9375-0.25368 0.056883-1.3427-0.18224-1.5254-0.42578-0.17662 0.4343-0.06096 1.5935 0.38086 1.9824-0.70463-0.029033-1.2107-0.10404-1.6016-0.47266 0.05528 0.65482 1.1567 2.5058 3.0605 2.4473 1.8859-0.057961 5.3416-2.0444 5.1172 0.77734l0.76367-0.91406 0.44922 1.082 0.12891-1.502 0.62891 0.10352-0.01563-0.86719c-1.0878 0.21766-2.216 0.15404-3.2715-0.1875 0 0 0.81541-1.2247 3.2109-0.62695 0 0 1.0704-0.18142 0.54492-1.0547-0.52548-0.87327-1.0156 0.42383-1.0156 0.42383-0.45143-0.28472-0.85656-0.63336-1.291-0.94336-0.79444-0.56687-1.4356-1.3204-1.7559-2.2422zm-0.8418 1.2695c0.75216-0.00879 1.4355 0.46302 1.7031 1.166 0.04186 0.10996 0.15236 0.15844 0.26758 0.13477 0.1635-0.033594 0.32277 0.073435 0.36719 0.23438 0.04852 0.17581-0.05737 0.35656-0.23437 0.40039-0.43572 0.1079-0.84051-0.14952-1.002-0.56836-0.02156-0.055928-0.27308-0.7224-1.1016-0.70117-0.187 0.00479-0.33205-0.14489-0.33203-0.33203 0-0.18715 0.14489-0.3318 0.33203-0.33398zm0.25781 1.0957c0.26687 0.00108 0.48296 0.21751 0.48242 0.48438-5.37e-4 0.26611-0.21632 0.48135-0.48242 0.48242-0.26763 0.00108-0.48579-0.21479-0.48633-0.48242-5.41e-4 -0.2684 0.21793-0.48546 0.48633-0.48438zm-10.809 3.0397c-0.34991 0.22367-0.78824 0.66637-0.87563 1.2212l-0.02322 0.14744c0.11372 0.12466 0.70444-9.118e-4 0.7719-0.043257 0.072919-0.44812 0.27343-0.56586 0.52734-0.7258 0.23894-0.15051 0.51638-0.15096 0.6371-0.12959l8.1113 1.4355-1.5332 9.2793-4.498-0.7793c-0.90219 0.26905-1.5466 0.74872-1.8106 1.1153-0.23032 0.31978-0.45999 0.95271-0.64258 1.457h0.00195l5.6465 0.94531 0.10547-0.60938 0.26172-1.5273c2e-3 -0.0014 0.0039-0.0025 0.0059-0.0039l1.4961 0.27148 0.60547-3.5977c0.53943 0.80503 0.83125 1.8162 0.69727 2.6641-0.14 0.88552-0.69613 1.6056-1.9375 1.9688-0.12433 0.03633-0.24744 0.06753-0.36914 0.0957l-0.19727 1.2051c-0.03115 0.20643-0.23137 0.34436-0.43555 0.30078l-6.1348-1.0312-0.4043 0.97656c1.464 1.0792 3.2449 2.1812 5.5723 2.2578 1.1718 0.03857 2.7611-0.13523 4.207-0.83594 1.4459-0.7007 2.7188-1.9524 3.2031-3.9375 0.35588-1.4586 0.21674-3.049-0.29883-4.4395-0.7975-2.1508-2.4648-3.307-3.1621-3.625l0.45703-2.7188-1.0625-0.19141c-1.0515 0.21674-2.1447 0.13408-3.1035-0.5625l-4.6797-0.84768c-0.15388-0.027874-0.67134-0.034627-1.1391 0.26435zm1.2523 3.6087-0.00195 0.0039-0.8125 4.8438c0.78057-0.26418 1.5395-0.2905 2.2051-0.20898l0.64636-3.8533c-0.23318 0.2305-0.41364 0.22022-0.48214 0.21007-0.51767-0.07669-0.62748-0.99295-0.98846-1.1614-0.11104-0.05182-0.29544-0.02624-0.56639 0.16594z" />
+</svg>
+{{- else if (eq $icon_name "bugcrowd") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M24 12L18 1.387H6L0 12l6 10.613h12zm-5.782 1.658c-.003.825-.122 1.569-.354 2.231a5.05 5.05 0 0 1-.99 1.708 4.316 4.316 0 0 1-1.503 1.093 4.69 4.69 0 0 1-1.896.385 4.158 4.158 0 0 1-1.145-.152 3.754 3.754 0 0 1-.868-.36 3.792 3.792 0 0 1-.601-.435 3.023 3.023 0 0 1-.466-.514h-.04l.02.193c.011.166.018.331.02.497v.528H7.961V7.062c0-.151-.04-.263-.114-.337-.077-.074-.19-.109-.33-.109h-.811V4.425h2.452c.473-.003.824.108 1.048.331.222.223.333.576.33 1.049v3.003c-.003.258-.01.467-.02.626l-.02.247h.04a2.898 2.898 0 0 1 .463-.507c.156-.143.354-.284.6-.426.245-.142.538-.261.876-.36.38-.1.77-.15 1.162-.148.702.003 1.334.135 1.894.395a4.118 4.118 0 0 1 1.446 1.11c.4.48.707 1.052.92 1.715.212.658.317 1.392.32 2.198m-2.803 1.406c.138-.399.206-.852.209-1.366-.003-.659-.112-1.231-.328-1.718-.216-.484-.517-.859-.902-1.125a2.347 2.347 0 0 0-1.344-.404 2.57 2.57 0 0 0-.969.186 2.372 2.372 0 0 0-.83.589 2.839 2.839 0 0 0-.579 1.015c-.141.413-.212.906-.216 1.477 0 .397.053.792.159 1.174.101.366.265.712.483 1.02.211.3.486.548.805.722.32.176.698.267 1.127.27.343.002.683-.07.997-.213a2.43 2.43 0 0 0 .824-.623c.24-.273.428-.607.564-1.004Z" />
+</svg>
+{{- else if (eq $icon_name "buttondown") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 520 520" stroke="none" stroke-width="1" fill="none"
+    fill-rule="evenodd">
+    <g>
+        <g transform="translate(4, 4.075)" fill-rule="nonzero" stroke="currentColor">
+            <g transform="translate(256, 255.9625) scale(-1, 1) rotate(-180) translate(-256, -255.9625)translate(0, 0)">
+                <path
+                    d="M301.6606,14.1373853 C303.688746,15.1698525 310.677734,16.9113405 318.761474,17.4327026 L319.541861,17.4809376 C319.825804,17.4976809 320.110512,17.5135842 320.399561,17.5288479 C343.999067,18.8284973 371.499186,24.4257864 387.885292,31.3591646 C389.181101,31.9620544 390.66612,32.5947748 391.905059,33.118941 C392.457805,33.3527953 392.939556,33.5536822 393.264934,33.7015814 C412.253041,41.8039575 429.258626,53.4407732 443.988462,68.0795656 C458.987342,83.1852739 470.054864,99.5757529 478.566662,119.436613 C479.232992,120.911103 479.797477,122.244579 480.266338,123.348721 C480.69095,124.348659 481.055744,125.201101 481.297832,125.733696 C482.04768,127.342286 483.431159,131.761421 484.827767,136.297068 L485.106229,137.205397 C485.646254,138.974836 486.171716,140.74265 486.644558,142.383076 L486.880758,143.207351 C487.207895,144.356002 487.503394,145.423929 487.751708,146.362309 C490.93928,158.570506 493.630153,177.2304 494.475121,191.67464 C494.489037,191.936321 494.503699,192.197595 494.519062,192.458134 L494.567297,193.238521 C495.088659,201.322261 496.830148,208.311249 497.533797,209.718548 C498.334936,211.178568 497.319844,228.009 497.058098,246.405938 L497.042743,247.557661 C497.037968,247.942166 497.033542,248.327226 497.02949,248.712715 L497.017514,249.984954 C497.005194,251.470665 496.998775,252.960712 496.99958,254.447993 L496.999676,258.181669 C497.000028,258.606948 497.000957,259.032365 497.002432,259.457749 L497.008473,260.73363 C497.011015,261.158776 497.014077,261.583719 497.017629,262.008287 L497.029731,263.280699 L497.036167,263.858626 L497.050699,265.012063 C497.303024,283.630141 498.381851,300.733383 497.862615,301.660591 C496.830148,303.688737 495.088659,310.677724 494.567297,318.761465 L494.519062,319.541851 C494.502319,319.825795 494.486416,320.110503 494.471152,320.399552 C493.171503,343.999057 487.574213,371.499175 480.640835,387.885281 C480.037945,389.18109 479.405225,390.666109 478.881059,391.905047 C478.647204,392.457794 478.446317,392.939544 478.298418,393.264922 C470.196042,412.253029 458.559226,429.258613 443.920433,443.988449 C428.814724,458.987328 412.424245,470.05485 392.563384,478.566648 C391.088894,479.232978 389.755418,479.797462 388.651276,480.266324 C387.651338,480.690936 386.798896,481.055729 386.266301,481.297818 C384.657711,482.047666 380.238576,483.431145 375.702929,484.827753 L374.794599,485.106214 C373.02516,485.64624 371.257346,486.171702 369.61692,486.644544 L368.792645,486.880744 C367.643994,487.207881 366.576067,487.503379 365.637687,487.751694 C353.42949,490.939266 334.769595,493.630139 320.325355,494.475106 C320.063674,494.489023 319.802399,494.503685 319.541861,494.519048 L318.761474,494.567283 C310.677734,495.088645 303.688746,496.830133 302.281447,497.533782 C302.035045,497.661499 301.011128,497.716526 299.363262,497.7223 L298.898489,497.722671 C292.818341,497.712349 279.458647,497.139676 265.150262,496.970881 L263.86424,496.956847 C263.43483,496.952547 263.004741,496.948635 262.574142,496.945135 L261.280986,496.935901 C260.849538,496.933253 260.417748,496.931043 259.985788,496.929298 L258.689562,496.925483 L258.041381,496.924669 L253.657009,496.924794 C253.446174,496.925019 253.235292,496.925408 253.024384,496.925957 L251.758805,496.931136 C250.282339,496.939343 248.806728,496.954997 247.339358,496.976767 L246.083802,496.996893 C231.045475,497.255639 217.102055,498.121167 212.28841,498.144484 L211.908579,498.144446 C211.132148,498.140007 210.660626,498.106798 210.541309,498.036292 C208.804002,497.065047 200.747967,494.947781 191.70142,494.4712 C168.007289,493.171931 140.502731,487.575001 124.114708,480.640821 C122.818899,480.037931 121.33388,479.405211 120.094941,478.881044 C119.542195,478.64719 119.060444,478.446303 118.735066,478.298404 C99.7469589,470.196028 82.741374,458.559212 68.0115377,443.92042 C53.0126581,428.814711 41.9451357,412.424232 33.4333382,392.563372 C32.7670076,391.088883 32.2025234,389.755406 31.7336621,388.651264 C31.3090498,387.651326 30.9442562,386.798884 30.7021677,386.26629 C29.95232,384.6577 28.5688409,380.238565 27.1722326,375.702918 L26.8937715,374.794588 C26.3537459,373.025149 25.828284,371.257335 25.3554418,369.616909 L25.1192419,368.792634 C24.7921049,367.643983 24.4966065,366.576056 24.2482917,365.637676 C21.0607195,353.42948 18.3698466,334.769585 17.5248792,320.325345 C17.5109627,320.063665 17.4963009,319.80239 17.4809377,319.541851 L17.4327026,318.761465 C16.9113405,310.677724 15.1698524,303.688737 14.4662028,302.281438 C13.6650642,300.821417 14.6801556,283.990985 14.9419016,265.594047 L14.9572566,264.442324 C14.9620324,264.057819 14.9664581,263.67276 14.9705103,263.28727 L14.9824855,262.015031 C14.9948063,260.52932 15.0012251,259.039273 15.0004199,257.551993 L15.0003241,253.818317 C14.9999715,253.393037 14.9990434,252.96762 14.9975678,252.542236 L14.991527,251.266356 C14.9889848,250.841209 14.9859234,250.416266 14.982371,249.991698 L14.9702689,248.719286 L14.9638332,248.14136 L14.9493008,246.987923 C14.6969761,228.369845 13.6181487,211.266602 14.1373851,210.339394 C15.1698524,208.311249 16.9113405,201.322261 17.4327026,193.238521 L17.4809376,192.458134 C17.497681,192.174191 17.5135843,191.889482 17.528848,191.600434 C18.8284974,168.000928 24.4257866,140.500811 31.359165,124.114705 C31.9620548,122.818896 32.5947752,121.333877 33.1189414,120.094938 C33.3527958,119.542192 33.5536826,119.060441 33.7015818,118.735063 C41.8039581,99.7469565 53.4407742,82.7413722 68.0795669,68.0115364 C83.1852758,53.0126572 99.5757552,41.945135 119.436616,33.4333378 C120.911106,32.7670072 122.244582,32.202523 123.348724,31.7336617 C124.348662,31.3090494 125.201104,30.9442559 125.733699,30.7021673 C127.342289,29.9523196 131.761424,28.5688406 136.297071,27.1722323 L137.205401,26.8937712 C138.97484,26.3537457 140.742654,25.8282838 142.38308,25.3554416 L143.207355,25.1192417 C144.356006,24.7921047 145.423933,24.4966062 146.362313,24.2482914 C158.57051,21.0607194 177.230405,18.3698465 191.674645,17.5248791 C191.936326,17.5109626 192.197601,17.4963008 192.458139,17.4809376 L193.238526,17.4327026 C201.322266,16.9113405 208.311254,15.1698525 209.718553,14.4662029 C211.178574,13.6650644 228.009006,14.6801556 246.405945,14.9419016 L247.557668,14.9572566 C247.942173,14.9620325 248.327233,14.9664581 248.712722,14.9705103 L249.984961,14.9824855 C251.470672,14.9948063 252.960719,15.0012251 254.448,15.0004199 L258.181676,15.0003241 C258.606956,14.9999715 259.032373,14.9990434 259.457757,14.9975678 L260.733637,14.991527 C261.158784,14.9889848 261.583727,14.9859234 262.008295,14.982371 L263.280707,14.970269 L263.858633,14.9638332 L265.012071,14.9493008 C283.630149,14.6969761 300.733392,13.6181489 301.6606,14.1373853 Z M265.026493,92.0296599 L249.744651,92.029657 C167.461891,92.0425357 153.533809,92.6396122 147.982352,93.9766623 C121.749425,100.534894 104.713136,116.950788 96.7054361,143.900268 C95.2786079,148.894167 94.5374284,160.056741 94.5288557,250.581875 L94.5288556,261.41669 C94.5374284,351.943244 95.2786079,363.105819 96.7477126,368.24491 C104.585874,394.6671 121.509461,411.196166 147.229818,417.884338 C151.997298,419.128018 169.925259,419.767249 256.681942,419.870901 C265.575313,419.880905 273.69874,419.887907 281.123349,419.891007 L283.874959,419.891985 L284.417493,419.892136 L293.747859,419.892182 C352.240621,419.875332 361.867876,419.160649 366.882835,417.906751 C380.083055,414.543234 391.091619,408.294586 399.693108,399.693097 C408.294598,391.091608 414.543245,380.083045 417.923354,366.817091 C419.330777,361.1874 419.957356,349.104459 419.970337,263.831745 L419.970337,248.170524 C419.957356,162.895526 419.330777,150.812585 417.906762,145.11716 C414.543245,131.91694 408.294598,120.908377 399.693108,112.306888 C391.091619,103.705399 380.083055,97.4567518 366.817101,94.0766428 C361.184993,92.6686158 349.194124,92.0426462 265.026493,92.0296599 Z"
+                    id="Shape" stroke-width="30"></path>
+                <path
+                    d="M237.756837,213.880303 C243.697542,212.351025 270.469508,212.355347 276.296906,213.894654 C307.747937,222.419986 319.857121,230.722369 355.205849,265.603984 L364.751388,274.99473 L356.628995,283.164902 L356.006401,283.786883 L355.368551,284.422819 C351.240042,288.534779 347.834019,296.489642 347.482132,296.489642 C347.137754,296.489642 341.927037,286.842876 335.740337,280.770542 C324.562608,269.698323 314.086597,259.727944 312.615545,258.568741 C302.060008,250.029682 293.681914,245.050055 282.218718,240.487036 C280.744798,239.835173 275.247856,238.382783 269.811392,237.366989 L269.035607,237.224979 C268.777443,237.178722 268.519857,237.133588 268.26329,237.089711 C259.560898,235.480011 255.795602,235.511124 248.176661,236.63523 C224.145112,240.365796 209.964715,248.544545 173.648855,285.080499 C172.894405,285.844068 172.174746,286.568578 171.467223,287.277146 L170.547933,288.195658 C168.41448,290.322353 166.776972,296.489642 166.517477,296.489642 C166.141508,296.489642 162.333834,288.123417 157.783584,283.577722 L149.427943,275.22216 L157.641045,267.057087 C193.587122,231.204097 206.428095,222.321851 237.756837,213.880303 Z"
+                    id="Path" stroke-width="25"></path>
+            </g>
+        </g>
+    </g>
+</svg>
+{{- else if (eq $icon_name "buymeacoffee") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 884 1279" fill="none" stroke="currentColor" stroke-width="2">
+    <path d="M791.109 297.518L790.231 297.002L788.201 296.383C789.018 297.072 790.04 297.472 791.109 297.518Z"
+        fill="currentColor"></path>
+    <path d="M803.896 388.891L802.916 389.166L803.896 388.891Z" fill="currentColor"></path>
+    <path
+        d="M791.484 297.377C791.359 297.361 791.237 297.332 791.118 297.29C791.111 297.371 791.111 297.453 791.118 297.534C791.252 297.516 791.379 297.462 791.484 297.377Z"
+        fill="currentColor"></path>
+    <path d="M791.113 297.529H791.244V297.447L791.113 297.529Z" fill="currentColor"></path>
+    <path
+        d="M803.111 388.726L804.591 387.883L805.142 387.573L805.641 387.04C804.702 387.444 803.846 388.016 803.111 388.726Z"
+        fill="currentColor"></path>
+    <path d="M793.669 299.515L792.223 298.138L791.243 297.605C791.77 298.535 792.641 299.221 793.669 299.515Z"
+        fill="currentColor"></path>
+    <path
+        d="M430.019 1186.18C428.864 1186.68 427.852 1187.46 427.076 1188.45L427.988 1187.87C428.608 1187.3 429.485 1186.63 430.019 1186.18Z"
+        fill="currentColor"></path>
+    <path
+        d="M641.187 1144.63C641.187 1143.33 640.551 1143.57 640.705 1148.21C640.705 1147.84 640.86 1147.46 640.929 1147.1C641.015 1146.27 641.084 1145.46 641.187 1144.63Z"
+        fill="currentColor"></path>
+    <path
+        d="M619.284 1186.18C618.129 1186.68 617.118 1187.46 616.342 1188.45L617.254 1187.87C617.873 1187.3 618.751 1186.63 619.284 1186.18Z"
+        fill="currentColor"></path>
+    <path
+        d="M281.304 1196.06C280.427 1195.3 279.354 1194.8 278.207 1194.61C279.136 1195.06 280.065 1195.51 280.684 1195.85L281.304 1196.06Z"
+        fill="currentColor"></path>
+    <path
+        d="M247.841 1164.01C247.704 1162.66 247.288 1161.35 246.619 1160.16C247.093 1161.39 247.489 1162.66 247.806 1163.94L247.841 1164.01Z"
+        fill="currentColor"></path>
+    <path
+        d="M472.623 590.836C426.682 610.503 374.546 632.802 306.976 632.802C278.71 632.746 250.58 628.868 223.353 621.274L270.086 1101.08C271.74 1121.13 280.876 1139.83 295.679 1153.46C310.482 1167.09 329.87 1174.65 349.992 1174.65C349.992 1174.65 416.254 1178.09 438.365 1178.09C462.161 1178.09 533.516 1174.65 533.516 1174.65C553.636 1174.65 573.019 1167.08 587.819 1153.45C602.619 1139.82 611.752 1121.13 613.406 1101.08L663.459 570.876C641.091 563.237 618.516 558.161 593.068 558.161C549.054 558.144 513.591 573.303 472.623 590.836Z"
+        fill="currentColor"></path>
+    <path d="M78.6885 386.132L79.4799 386.872L79.9962 387.182C79.5987 386.787 79.1603 386.435 78.6885 386.132Z"
+        fill="currentColor"></path>
+    <path
+        d="M879.567 341.849L872.53 306.352C866.215 274.503 851.882 244.409 819.19 232.898C808.711 229.215 796.821 227.633 788.786 220.01C780.751 212.388 778.376 200.55 776.518 189.572C773.076 169.423 769.842 149.257 766.314 129.143C763.269 111.85 760.86 92.4243 752.928 76.56C742.604 55.2584 721.182 42.8009 699.88 34.559C688.965 30.4844 677.826 27.0375 666.517 24.2352C613.297 10.1947 557.342 5.03277 502.591 2.09047C436.875 -1.53577 370.983 -0.443234 305.422 5.35968C256.625 9.79894 205.229 15.1674 158.858 32.0469C141.91 38.224 124.445 45.6399 111.558 58.7341C95.7448 74.8221 90.5829 99.7026 102.128 119.765C110.336 134.012 124.239 144.078 138.985 150.737C158.192 159.317 178.251 165.846 198.829 170.215C256.126 182.879 315.471 187.851 374.007 189.968C438.887 192.586 503.87 190.464 568.44 183.618C584.408 181.863 600.347 179.758 616.257 177.304C634.995 174.43 647.022 149.928 641.499 132.859C634.891 112.453 617.134 104.538 597.055 107.618C594.095 108.082 591.153 108.512 588.193 108.942L586.06 109.252C579.257 110.113 572.455 110.915 565.653 111.661C551.601 113.175 537.515 114.414 523.394 115.378C491.768 117.58 460.057 118.595 428.363 118.647C397.219 118.647 366.058 117.769 334.983 115.722C320.805 114.793 306.661 113.611 292.552 112.177C286.134 111.506 279.733 110.801 273.333 110.009L267.241 109.235L265.917 109.046L259.602 108.134C246.697 106.189 233.792 103.953 221.025 101.251C219.737 100.965 218.584 100.249 217.758 99.2193C216.932 98.1901 216.482 96.9099 216.482 95.5903C216.482 94.2706 216.932 92.9904 217.758 91.9612C218.584 90.9319 219.737 90.2152 221.025 89.9293H221.266C232.33 87.5721 243.479 85.5589 254.663 83.8038C258.392 83.2188 262.131 82.6453 265.882 82.0832H265.985C272.988 81.6186 280.026 80.3625 286.994 79.5366C347.624 73.2301 408.614 71.0801 469.538 73.1014C499.115 73.9618 528.676 75.6996 558.116 78.6935C564.448 79.3474 570.746 80.0357 577.043 80.8099C579.452 81.1025 581.878 81.4465 584.305 81.7391L589.191 82.4445C603.438 84.5667 617.61 87.1419 631.708 90.1703C652.597 94.7128 679.422 96.1925 688.713 119.077C691.673 126.338 693.015 134.408 694.649 142.03L696.732 151.752C696.786 151.926 696.826 152.105 696.852 152.285C701.773 175.227 706.7 198.169 711.632 221.111C711.994 222.806 712.002 224.557 711.657 226.255C711.312 227.954 710.621 229.562 709.626 230.982C708.632 232.401 707.355 233.6 705.877 234.504C704.398 235.408 702.75 235.997 701.033 236.236H700.895L697.884 236.649L694.908 237.044C685.478 238.272 676.038 239.419 666.586 240.486C647.968 242.608 629.322 244.443 610.648 245.992C573.539 249.077 536.356 251.102 499.098 252.066C480.114 252.57 461.135 252.806 442.162 252.771C366.643 252.712 291.189 248.322 216.173 239.625C208.051 238.662 199.93 237.629 191.808 236.58C198.106 237.389 187.231 235.96 185.029 235.651C179.867 234.928 174.705 234.177 169.543 233.397C152.216 230.798 134.993 227.598 117.7 224.793C96.7944 221.352 76.8005 223.073 57.8906 233.397C42.3685 241.891 29.8055 254.916 21.8776 270.735C13.7217 287.597 11.2956 305.956 7.64786 324.075C4.00009 342.193 -1.67805 361.688 0.472751 380.288C5.10128 420.431 33.165 453.054 73.5313 460.35C111.506 467.232 149.687 472.807 187.971 477.556C338.361 495.975 490.294 498.178 641.155 484.129C653.44 482.982 665.708 481.732 677.959 480.378C681.786 479.958 685.658 480.398 689.292 481.668C692.926 482.938 696.23 485.005 698.962 487.717C701.694 490.429 703.784 493.718 705.08 497.342C706.377 500.967 706.846 504.836 706.453 508.665L702.633 545.797C694.936 620.828 687.239 695.854 679.542 770.874C671.513 849.657 663.431 928.434 655.298 1007.2C653.004 1029.39 650.71 1051.57 648.416 1073.74C646.213 1095.58 645.904 1118.1 641.757 1139.68C635.218 1173.61 612.248 1194.45 578.73 1202.07C548.022 1209.06 516.652 1212.73 485.161 1213.01C450.249 1213.2 415.355 1211.65 380.443 1211.84C343.173 1212.05 297.525 1208.61 268.756 1180.87C243.479 1156.51 239.986 1118.36 236.545 1085.37C231.957 1041.7 227.409 998.039 222.9 954.381L197.607 711.615L181.244 554.538C180.968 551.94 180.693 549.376 180.435 546.76C178.473 528.023 165.207 509.681 144.301 510.627C126.407 511.418 106.069 526.629 108.168 546.76L120.298 663.214L145.385 904.104C152.532 972.528 159.661 1040.96 166.773 1109.41C168.15 1122.52 169.44 1135.67 170.885 1148.78C178.749 1220.43 233.465 1259.04 301.224 1269.91C340.799 1276.28 381.337 1277.59 421.497 1278.24C472.979 1279.07 524.977 1281.05 575.615 1271.72C650.653 1257.95 706.952 1207.85 714.987 1130.13C717.282 1107.69 719.576 1085.25 721.87 1062.8C729.498 988.559 737.115 914.313 744.72 840.061L769.601 597.451L781.009 486.263C781.577 480.749 783.905 475.565 787.649 471.478C791.392 467.391 796.352 464.617 801.794 463.567C823.25 459.386 843.761 452.245 859.023 435.916C883.318 409.918 888.153 376.021 879.567 341.849ZM72.4301 365.835C72.757 365.68 72.1548 368.484 71.8967 369.792C71.8451 367.813 71.9483 366.058 72.4301 365.835ZM74.5121 381.94C74.6842 381.819 75.2003 382.508 75.7337 383.334C74.925 382.576 74.4089 382.009 74.4949 381.94H74.5121ZM76.5597 384.641C77.2996 385.897 77.6953 386.689 76.5597 384.641V384.641ZM80.672 387.979H80.7752C80.7752 388.1 80.9645 388.22 81.0333 388.341C80.9192 388.208 80.7925 388.087 80.6548 387.979H80.672ZM800.796 382.989C793.088 390.319 781.473 393.726 769.996 395.43C641.292 414.529 510.713 424.199 380.597 419.932C287.476 416.749 195.336 406.407 103.144 393.382C94.1102 392.109 84.3197 390.457 78.1082 383.798C66.4078 371.237 72.1548 345.944 75.2003 330.768C77.9878 316.865 83.3218 298.334 99.8572 296.355C125.667 293.327 155.64 304.218 181.175 308.09C211.917 312.781 242.774 316.538 273.745 319.36C405.925 331.405 540.325 329.529 671.92 311.91C695.906 308.686 719.805 304.941 743.619 300.674C764.835 296.871 788.356 289.731 801.175 311.703C809.967 326.673 811.137 346.701 809.778 363.615C809.359 370.984 806.139 377.915 800.779 382.989H800.796Z"
+        fill="currentColor"></path>
+</svg>
+{{- else if (eq $icon_name "codeberg") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d='M11.955.49A12 12 0 0 0 0 12.49a12 12 0 0 0 1.832 6.373L11.838 5.928a.187.14 0 0 1 .324 0l10.006 12.935A12 12 0 0 0 24 12.49a12 12 0 0 0-12-12 12 12 0 0 0-.045 0zm.375 6.467l4.416 16.553a12 12 0 0 0 5.137-4.213z' />
+</svg>
+{{- else if (eq $icon_name "codeforces") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -2 24 26" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M4.5 7.5C5.328 7.5 6 8.172 6 9v10.5c0 .828-.672 1.5-1.5 1.5h-3C.673 21 0 20.328 0 19.5V9c0-.828.673-1.5 1.5-1.5h3zm9-4.5c.828 0 1.5.672 1.5 1.5v15c0 .828-.672 1.5-1.5 1.5h-3c-.827 0-1.5-.672-1.5-1.5v-15c0-.828.673-1.5 1.5-1.5h3zm9 7.5c.828 0 1.5.672 1.5 1.5v7.5c0 .828-.672 1.5-1.5 1.5h-3c-.828 0-1.5-.672-1.5-1.5V12c0-.828.672-1.5 1.5-1.5h3z" />
+</svg>
+{{- else if (eq $icon_name "codepen") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <polygon points="12 2 22 8.5 22 15.5 12 22 2 15.5 2 8.5 12 2"></polygon>
+    <line x1="12" y1="22" x2="12" y2="15.5"></line>
+    <polyline points="22 8.5 12 15.5 2 8.5"></polyline>
+    <polyline points="2 15.5 12 8.5 22 15.5"></polyline>
+    <line x1="12" y1="2" x2="12" y2="8.5"></line>
+</svg>
+{{- else if (eq $icon_name "credly") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 480" fill="currentColor" stroke="none">
+    <path
+        d="m 366.04603,0.539085 c -9.03598,0 -10.77973,0.42893562 -15.78373,3.8968966 -3.35779,2.3268743 -8.3929,8.1583914 -12.49099,14.4655944 -9.48143,14.593085 -12.15553,15.67658 -23.95415,9.697781 C 288.74714,15.895368 270.59837,11.338625 245.64499,11.484396 205.97913,11.716096 172.05517,25.859207 145.32213,53.309347 104.48601,95.240854 76.020398,154.63994 66.9762,216.79856 c -6.092249,41.86824 -2.974097,92.7649 8.000409,130.64544 19.389663,66.92743 60.256841,104.96526 120.074111,111.75986 11.97899,1.3607 33.24497,0.42096 46.09323,-2.03737 38.22791,-7.31398 76.74467,-29.90075 111.05372,-65.12525 22.65718,-23.26237 39.50239,-47.24087 52.90626,-75.31472 8.23215,-17.2418 9.31001,-23.43292 5.55765,-31.91534 -3.70171,-8.36882 -10.69858,-13.42359 -19.60478,-14.16221 -12.2704,-1.01759 -17.7717,3.62699 -32.96932,27.83274 -26.44919,42.12471 -49.6215,65.49325 -80.30485,80.98223 -29.30931,14.79535 -58.73794,17.48923 -87.25388,7.99255 -25.31711,-8.43163 -44.41812,-28.62159 -53.89487,-56.97053 -6.2792,-18.78312 -7.83604,-33.41725 -7.03795,-66.15048 0.74234,-30.44679 2.42781,-44.77419 8.41626,-71.53553 14.88113,-66.50301 52.31461,-114.886915 94.37029,-121.980722 20.78331,-3.505693 43.1099,0.696677 51.67965,9.726548 11.89366,12.532806 12.23581,25.259094 1.67121,62.227444 -2.89562,10.13204 -5.62965,21.15694 -6.07287,24.49814 -2.85326,21.50809 19.7617,39.5481 39.34034,31.38178 12.3339,-5.14409 18.6741,-15.73544 25.16508,-42.03677 9.05731,-36.69987 21.80795,-68.950595 39.4685,-99.836425 10.05125,-17.57882 12.86723,-25.679207 11.4867,-33.039939 C 393.89772,17.218994 387.8986,8.6159571 381.48718,4.1875215 376.8711,0.99934541 374.91955,0.539085 366.04603,0.539085 Z" />
+</svg>
+{{- else if (eq $icon_name "cryptohack") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 57 57" preserveAspectRatio="xMidYMid meet">
+    <g transform="translate(0.000000,57.000000) scale(0.100000,-0.100000)" fill="currentColor" stroke-width="12"
+        stroke="currentColor">
+        <path
+            d="M180 495 c-7 -8 -22 -15 -35 -15 -23 0 -55 -28 -55 -48 0 -6 -12 -23 -26 -37 -18 -18 -24 -33 -21 -48 3 -12 -1 -31 -9 -41 -18 -26 -18 -70 1 -86 8 -7 15 -21 15 -31 0 -36 23 -68 59 -83 21 -8 43 -21 50 -30 19 -23 74 -20 97 5 17 19 19 41 22 204 3 174 2 185 -17 204 -25 25 -63 27 -81 6z m54 -11 c14 -5 16 -32 16 -193 0 -196 -3 -211 -45 -211 -39 0 -47 20 -20 52 14 16 25 40 25 52 0 34 -37 76 -66 76 -31 0 -31 -18 0 -26 30 -7 50 -48 36 -73 -28 -54 -118 -28 -103 29 3 10 -4 27 -16 39 -26 26 -27 46 -2 68 14 12 18 24 14 48 -7 41 12 53 40 27 12 -11 32 -23 44 -26 12 -4 31 -18 42 -32 33 -41 55 -29 25 14 -15 21 -15 25 1 42 22 25 0 38 -25 15 -26 -24 -68 -12 -81 21 -12 32 3 54 36 54 12 0 28 7 35 15 14 17 21 18 44 9z" />
+        <path
+            d="M309 489 c-19 -19 -20 -30 -17 -204 3 -163 5 -185 22 -204 23 -25 78 -28 97 -5 7 9 29 22 50 30 36 15 59 47 59 83 0 10 7 24 15 31 19 16 19 60 1 86 -8 10 -12 29 -9 41 3 15 -3 30 -19 46 -12 13 -30 37 -38 53 -10 19 -25 30 -42 32 -15 2 -32 10 -38 18 -18 20 -57 17 -81 -7z m71 -14 c7 -8 23 -15 35 -15 34 0 48 -22 34 -54 -10 -20 -19 -26 -46 -26 -34 0 -44 -13 -17 -24 28 -11 47 -7 70 15 30 28 48 16 41 -28 -4 -24 -2 -36 8 -39 20 -8 28 -40 15 -64 -11 -20 -63 -28 -86 -12 -17 11 -36 51 -29 62 3 5 1 11 -5 15 -16 10 -24 -25 -12 -57 9 -24 8 -30 -8 -38 -21 -11 -33 -37 -24 -52 4 -6 16 2 28 17 20 25 26 27 64 20 23 -4 44 -10 47 -14 9 -15 -26 -51 -49 -51 -14 0 -30 -10 -40 -25 -18 -27 -54 -33 -74 -13 -17 17 -17 384 1 391 22 9 34 7 47 -8z" />
+    </g>
+</svg>
+{{- else if (eq $icon_name "ctftime") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220.000000 200.000000" preserveAspectRatio="xMidYMid meet">
+    <g transform="translate(0.000000,200.000000) scale(0.100000,-0.100000)" fill="currentColor" stroke="none">
+        <path d="M365 1499 c201 -275 365 -503 365 -507 0 -4 -84 -120 -188 -259 -103
+            -139 -263 -355 -356 -480 -93 -125 -173 -229 -178 -231 -45 -19 101 -22 992
+            -22 l1000 0 0 1000 0 1000 -1000 0 -999 0 364 -501z m1310 -509 l0 -305 -312
+            -3 -313 -2 0 310 0 310 313 -2 312 -3 0 -305z" />
+        <path d="M1150 1194 c0 -2 -1 -95 -1 -206 l0 -203 216 -3 215 -2 0 210 0 210
+            -157 0 -158 0 98 -98 c53 -53 97 -101 97 -106 0 -4 -42 -48 -92 -97 l-93 -88
+            -28 26 -27 27 65 66 65 66 -100 101 c-55 55 -100 99 -100 97z" />
+    </g>
+</svg>
+{{- else if (eq $icon_name "cv") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M4 4v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8.342a2 2 0 0 0-.602-1.43l-4.44-4.342A2 2 0 0 0 13.56 2H6a2 2 0 0 0-2 2z" />
+    <path d="M9 13h6" />
+    <path d="M9 17h3" />
+    <path d="M14 2v4a2 2 0 0 0 2 2h4" />
+</svg>
+{{- else if (eq $icon_name "deezer") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 20" fill="currentColor" stroke="none">
+    <path
+        d="M18.81 4.16v3.03H24V4.16h-5.19zM6.27 8.38v3.027h5.189V8.38h-5.19zm12.54 0v3.027H24V8.38h-5.19zM6.27 12.594v3.027h5.189v-3.027h-5.19zm6.271 0v3.027h5.19v-3.027h-5.19zm6.27 0v3.027H24v-3.027h-5.19zM0 16.81v3.029h5.19v-3.03H0zm6.27 0v3.029h5.189v-3.03h-5.19zm6.271 0v3.029h5.19v-3.03h-5.19zm6.27 0v3.029H24v-3.03h-5.19Z" />
+</svg>
+{{- else if (eq $icon_name "dev") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="M7.42 10.05c-.18-.16-.46-.23-.84-.23H6l.02 2.44.04 2.45.56-.02c.41 0 .63-.07.83-.26.24-.24.26-.36.26-2.2 0-1.91-.02-1.96-.29-2.18zM0 4.94v14.12h24V4.94H0zM8.56 15.3c-.44.58-1.06.77-2.53.77H4.71V8.53h1.4c1.67 0 2.16.18 2.6.9.27.43.29.6.32 2.57.05 2.23-.02 2.73-.47 3.3zm5.09-5.47h-2.47v1.77h1.52v1.28l-.72.04-.75.03v1.77l1.22.03 1.2.04v1.28h-1.6c-1.53 0-1.6-.01-1.87-.3l-.3-.28v-3.16c0-3.02.01-3.18.25-3.48.23-.31.25-.31 1.88-.31h1.64v1.3zm4.68 5.45c-.17.43-.64.79-1 .79-.18 0-.45-.15-.67-.39-.32-.32-.45-.63-.82-2.08l-.9-3.39-.45-1.67h.76c.4 0 .75.02.75.05 0 .06 1.16 4.54 1.26 4.83.04.15.32-.7.73-2.3l.66-2.52.74-.04c.4-.02.73 0 .73.04 0 .14-1.67 6.38-1.8 6.68z" />
+</svg>
+{{- else if (eq $icon_name "deviantart") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 167" fill="currentColor" stroke="none">
+    <path
+        d=" M100 0 L99.96 0 L99.95 0 L71.32 0 L68.26 3.04 L53.67 30.89 L49.41 33.35 L0 33.35 L0 74.97 L26.40 74.97 L29.15 77.72 L0 133.36 L0 166.5 L0 166.61 L0 166.61 L28.70 166.6 L31.77 163.55 L46.39 135.69 L50.56 133.28 L100 133.28 L100 91.68 L73.52 91.68 L70.84 89 L100 33.33 " />
+</svg>
+{{- else if (eq $icon_name "discogs") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="M1.7422 11.982c0-5.6682 4.61-10.2782 10.2758-10.2782 1.8238 0 3.5372.48 5.0251 1.3175l.8135-1.4879C16.1768.588 14.2474.036 12.1908.0024h-.1944C5.4091.0144.072 5.3107 0 11.886v.1152c.0072 3.4389 1.4567 6.5345 3.7748 8.7207l1.1855-1.2814c-1.9798-1.8743-3.218-4.526-3.218-7.4585zM20.362 3.4053l-1.1543 1.2406c1.903 1.867 3.0885 4.4636 3.0885 7.3361 0 5.6658-4.61 10.2758-10.2758 10.2758-1.783 0-3.4605-.456-4.922-1.2575l-.8542 1.5214c1.7086.9384 3.6692 1.4735 5.7546 1.4759C18.6245 23.9976 24 18.6246 24 11.9988c-.0048-3.3717-1.399-6.4146-3.638-8.5935zM1.963 11.982c0 2.8701 1.2119 5.4619 3.146 7.2953l1.1808-1.2767c-1.591-1.5166-2.587-3.6524-2.587-6.0186 0-4.586 3.7293-8.3152 8.3152-8.3152 1.483 0 2.875.3912 4.082 1.0751l.8351-1.5262C15.481 2.395 13.8034 1.927 12.018 1.927 6.4746 1.9246 1.963 6.4362 1.963 11.982zm18.3702 0c0 4.586-3.7293 8.3152-8.3152 8.3152-1.4327 0-2.7837-.3648-3.962-1.0055l-.852 1.5166c1.4303.7823 3.0718 1.2287 4.814 1.2287 5.5434 0 10.055-4.5116 10.055-10.055 0-2.8077-1.1567-5.3467-3.0165-7.1729l-1.183 1.2743c1.519 1.507 2.4597 3.5924 2.4597 5.8986zm-1.9486 0c0 3.5109-2.8558 6.3642-6.3642 6.3642a6.3286 6.3286 0 01-3.0069-.756l-.8471 1.507c1.147.624 2.4597.9768 3.854.9768 4.4636 0 8.0944-3.6308 8.0944-8.0944 0-2.239-.9143-4.2692-2.3902-5.7378l-1.1783 1.267c1.1351 1.152 1.8383 2.731 1.8383 4.4732zm-14.4586 0c0 2.3014.9671 4.382 2.515 5.8578l1.1734-1.2695c-1.207-1.159-1.9606-2.786-1.9606-4.5883 0-3.5108 2.8557-6.3642 6.3642-6.3642 1.1423 0 2.215.3048 3.1437.8352l.8303-1.5167c-1.1759-.6647-2.5317-1.0487-3.974-1.0487-4.4612 0-8.092 3.6308-8.092 8.0944zm12.5292 0c0 2.4502-1.987 4.4372-4.4372 4.4372a4.4192 4.4192 0 01-2.0614-.5088l-.8351 1.4879a6.1135 6.1135 0 002.8965.727c3.3885 0 6.1434-2.7548 6.1434-6.1433 0-1.6774-.6767-3.1989-1.7686-4.3076l-1.1615 1.2503c.7559.7967 1.2239 1.8718 1.2239 3.0573zm-10.5806 0c0 1.7374.7247 3.3069 1.8886 4.4252L8.92 15.1569l.0144.0144c-.8351-.8063-1.3559-1.9366-1.3559-3.1869 0-2.4502 1.9846-4.4372 4.4372-4.4372.8087 0 1.5646.2184 2.2174.5976l.8207-1.4975a6.097 6.097 0 00-3.0381-.8063c-3.3837-.0048-6.141 2.7525-6.141 6.141zm6.681 0c0 .2952-.2424.5351-.5376.5351-.2952 0-.5375-.24-.5375-.5351 0-.2976.24-.5375.5375-.5375.2952 0 .5375.24.5375.5375zm-3.9405 0c0-1.879 1.5239-3.4029 3.4005-3.4029 1.879 0 3.4005 1.5215 3.4005 3.4029 0 1.879-1.5239 3.4005-3.4005 3.4005S8.6151 13.861 8.6151 11.982zm.1488 0c.0048 1.7974 1.4567 3.2493 3.2517 3.2517 1.795 0 3.254-1.4567 3.254-3.2517-.0023-1.7974-1.4566-3.2517-3.254-3.254-1.795 0-3.2517 1.4566-3.2517 3.254Z" />
+</svg>
+{{- else if (eq $icon_name "discord") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 127.14 96.36" fill="currentColor" stroke="none" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M107.7,8.07A105.15,105.15,0,0,0,81.47,0a72.06,72.06,0,0,0-3.36,6.83A97.68,97.68,0,0,0,49,6.83,72.37,72.37,0,0,0,45.64,0,105.89,105.89,0,0,0,19.39,8.09C2.79,32.65-1.71,56.6.54,80.21h0A105.73,105.73,0,0,0,32.71,96.36,77.7,77.7,0,0,0,39.6,85.25a68.42,68.42,0,0,1-10.85-5.18c.91-.66,1.8-1.34,2.66-2a75.57,75.57,0,0,0,64.32,0c.87.71,1.76,1.39,2.66,2a68.68,68.68,0,0,1-10.87,5.19,77,77,0,0,0,6.89,11.1A105.25,105.25,0,0,0,126.6,80.22h0C129.24,52.84,122.09,29.11,107.7,8.07ZM42.45,65.69C36.18,65.69,31,60,31,53s5-12.74,11.43-12.74S54,46,53.89,53,48.84,65.69,42.45,65.69Zm42.24,0C78.41,65.69,73.25,60,73.25,53s5-12.74,11.44-12.74S96.23,46,96.12,53,91.08,65.69,84.69,65.69Z" />
+</svg>
+{{- else if (eq $icon_name "douban") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path d="m2.42288,2.08086l19.15349,0l0,2.15751l-19.15349,0l0,-2.15751z" />
+    <path
+        d="m19.88879,14.92347l0,-8.43444l-15.82351,0l0,8.43444l15.82351,0zm-13.52889,-6.27842l11.25739,0l0,4.1235l-11.25739,0l0,-4.1235z" />
+    <path
+        d="m16.48864,19.78508c0.6885,-1.05398 1.33827,-2.27636 1.94031,-3.66377l-2.30206,-0.83906c-0.59872,1.64418 -1.29579,3.14745 -2.08899,4.50283l-4.00578,0c-0.66389,-1.75663 -1.41312,-3.25884 -2.25363,-4.50283l-2.11727,0.83906c0.87327,1.30991 1.57742,2.52932 2.11727,3.66377l-5.89733,0l0,2.13406l20.23769,0l0,-2.13406l-5.63021,0z" />
+</svg>
+{{- else if (eq $icon_name "dreamstime") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M19.834 20.994s4.824-4.08 2.044-12.03C19.252 1.456 6.822-1.223 2.508 7.566c-3.936 8.023 2.18 14.46 7.88 14.374 4.889-.075 8.475-3.226 7.813-8.604-.76-6.18-6.73-6.816-9.275-4.184-2.256 2.334-1.816 7.034.873 7.823 2.241.844 4.661-1.265 3.161-3.215"
+        style="font-variation-settings:normal" stroke="currentColor" stroke-linejoin="bevel"
+        paint-order="stroke fill markers" />
+</svg>
+{{- else if (eq $icon_name "dribbble") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <circle style="font-variation-settings:normal" cx="12.004" cy="12" r="9.39" paint-order="stroke fill markers" />
+    <path style="font-variation-settings:normal"
+        d="M5.858 19.136s2.343-5.79 8.161-6.422c5.818-.633 7.442.479 7.442.479M2.68 10.839s4.91.752 10.112-1.11c5.202-1.863 5.887-4.601 5.887-4.601" />
+    <path style="font-variation-settings:normal"
+        d="M8.533 3.208s2.888 2.73 5.339 9.235c2.451 6.505 2.344 8.4 2.344 8.4" />
+</svg>
+{{- else if (eq $icon_name "dzen") -}}
+<svg viewBox="0 0 166 167" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M83.3295 166.23H82.6705C49.7081 166.23 30.436 162.915 17.0154 149.754C3.1854 135.664 0 116.522 0 83.6996V82.7709C0 49.9484 3.1854 30.6762 17.0154 16.7164C30.5658 3.56543 49.7081 0.240234 82.6605 0.240234H83.3295C116.152 0.240234 135.424 3.56543 148.985 16.7164C162.815 30.806 166 49.9484 166 82.7709V83.6996C166 116.532 162.805 135.804 148.985 149.754C135.424 162.905 116.292 166.23 83.3295 166.23ZM145.84 80.771C146.48 80.801 147 81.3308 147 81.9706H146.99V84.6498C146.99 85.2996 146.47 85.8294 145.83 85.8494C122.868 86.7191 108.902 89.6382 99.115 99.4252C89.338 109.202 86.4189 123.148 85.5392 146.071C85.5092 146.71 84.9794 147.23 84.3396 147.23H81.6504C81.0006 147.23 80.4708 146.71 80.4508 146.071C79.5711 123.148 76.652 109.202 66.875 99.4252C57.0981 89.6482 43.1225 86.7191 20.1596 85.8494C19.5198 85.8194 19 85.2896 19 84.6498V81.9706C19 81.3208 19.5198 80.791 20.1596 80.771C43.1225 79.9013 57.0881 76.9822 66.875 67.1952C76.672 57.3983 79.5911 43.4027 80.4608 20.3999C80.4908 19.7601 81.0206 19.2402 81.6604 19.2402H84.3396C84.9894 19.2402 85.5192 19.7601 85.5392 20.3999C86.4089 43.4127 89.328 57.3983 99.125 67.1952C108.902 76.9722 122.878 79.9013 145.84 80.771Z" fill="currentColor"/>
+</svg>
+{{- else if (eq $icon_name "email") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 21" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path>
+    <polyline points="22,6 12,13 2,6"></polyline>
+</svg>
+{{- else if (eq $icon_name "ethereum") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M11.944 17.97L4.58 13.62 11.943 24l7.37-10.38-7.372 4.35h.003zM12.056 0L4.69 12.223l7.365 4.354 7.365-4.35L12.056 0z" />
+</svg>
+{{- else if (eq $icon_name "exercism") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2230.4 1817.9" fill="currentColor" stroke-width="2"
+    stroke="currentColor">
+    <path d="M0,905.1v-48.3c119-10.6,189.5-56.6,206.8-157.4c14.8-85.8-9.8-249.3-6.7-387.8c3.5-157,107.1-289.2,222.6-305.8
+       c48-6.9,83-8.3,121.4-0.3c35,6,63.3,26.3,76.4,52v74.2H508.1c-98,11.1-135.6,76.9-157.4,179.9c-26.1,123,101.7,561.8-170.9,593.6
+       c272.6,31.7,144.8,470.5,170.9,593.6c21.8,103,59.3,168.8,157.4,179.9h112.4v74.2c-13.2,25.7-41.4,46-76.4,52
+       c-38.4,8-73.4,6.6-121.4-0.3c-115.5-16.6-219.1-148.8-222.6-305.8c-3.1-138.5,21.5-302.1,6.7-387.8C189.5,1010,119,964,0,953.4
+       V905.1z M2230.4,912.8v-48.3c-119-10.6-189.5-56.6-206.8-157.4c-14.8-85.8,9.8-249.3,6.7-387.8c-3.5-157-107.1-289.2-222.6-305.8
+       c-48-6.9-83-8.3-121.4-0.3c-35,6-63.3,26.3-76.4,52v74.2h112.4c98,11.1,135.6,76.9,157.4,179.9c26.1,123-101.7,561.8,170.9,593.6
+       c-272.6,31.7-144.8,470.5-170.9,593.6c-21.8,103-59.3,168.8-157.4,179.9h-112.4v74.2c13.2,25.7,41.4,46,76.4,52
+       c38.4,8,73.4,6.6,121.4-0.3c115.5-16.6,219.1-148.8,222.6-305.8c3.1-138.5-21.5-302.1-6.7-387.8c17.3-100.8,87.8-146.8,206.8-157.4
+       V912.8z" />
+    <path d="M944.3,935.4c0-139.7-112.7-252.9-251.8-252.9S440.7,795.8,440.7,935.4H539c0-85.2,68.7-154.2,153.5-154.2
+       S846,850.3,846,935.4H944.3z M1796.4,935.4c0-139.7-112.7-252.9-251.8-252.9s-251.8,113.2-251.8,252.9h98.3
+       c0-85.2,68.7-154.2,153.5-154.2c84.8,0,153.5,69,153.5,154.2H1796.4z M1364.7,1269.3c-6.1,118.6-109.4,220.1-233.8,219.2
+       c-124.8-0.9-227.3-102.3-233.8-219.2v-74.2h114.7v74.2c5.7,60,59.6,109.2,119.2,107.4c60.5-1.9,116.7-48.2,119.2-107.4v-74.2h114.7
+       V1269.3z" />
+</svg>
+{{- else if (eq $icon_name "facebook") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"></path>
+</svg>
+{{- else if (eq $icon_name "farcaster") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000" fill="currentColor" stroke="currentColor" stroke-width="2">
+    <path d="M257.778 155.556H742.222V844.445H671.111V528.889H670.414C662.554 441.677 589.258 373.333 500 373.333C410.742 373.333 337.446 441.677 329.586 528.889H328.889V844.445H257.778V155.556Z"/>
+    <path d="M128.889 253.333L157.778 351.111H182.222V746.667C169.949 746.667 160 756.616 160 768.889V795.556H155.556C143.283 795.556 133.333 805.505 133.333 817.778V844.445H382.222V817.778C382.222 805.505 372.273 795.556 360 795.556H355.556V768.889C355.556 756.616 345.606 746.667 333.333 746.667H306.667V253.333H128.889Z"/>
+    <path d="M675.556 746.667C663.283 746.667 653.333 756.616 653.333 768.889V795.556H648.889C636.616 795.556 626.667 805.505 626.667 817.778V844.445H875.556V817.778C875.556 805.505 865.606 795.556 853.333 795.556H848.889V768.889C848.889 756.616 838.94 746.667 826.667 746.667V351.111H851.111L880 253.333H702.222V746.667H675.556Z"/>
+</svg>
+{{- else if (eq $icon_name "fediverse") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M47.923 72.796a18.227 18.227 0 0 1-7.795 7.76l42.798 42.964 10.318-5.229zm56.452 56.67-10.318 5.229 21.686 21.77a18.227 18.227 0 0 1 7.797-7.76zm49.517-39.67-24.23 12.279 1.787 11.427 27.415-13.894a18.227 18.227 0 0 1-4.972-9.812zm-38.295 19.407L58.31 138.237a18.227 18.227 0 0 1 4.973 9.813l54.102-27.42zM97.174 37.686 69.53 91.653l8.162 8.193 29.269-57.138a18.227 18.227 0 0 1-9.787-5.022ZM62.34 105.69l-14.002 27.335a18.227 18.227 0 0 1 9.786 5.021l12.377-24.163ZM39.89 80.675a18.227 18.227 0 0 1-9.106 1.904 18.227 18.227 0 0 1-1.759-.184l8.176 52.297a18.227 18.227 0 0 1 9.106-1.903 18.227 18.227 0 0 1 1.758.184zm23.435 67.634a18.227 18.227 0 0 1 .19 3.672 18.227 18.227 0 0 1-1.922 7.19l52.289 8.391a18.227 18.227 0 0 1-.192-3.672 18.227 18.227 0 0 1 1.924-7.19zM159.048 99.8l-24.135 47.116a18.227 18.227 0 0 1 9.788 5.023l24.134-47.117a18.227 18.227 0 0 1-9.787-5.023zm-32.917-66.64a18.227 18.227 0 0 1-7.797 7.76l37.376 37.52a18.227 18.227 0 0 1 7.797-7.76zm-34.114-5.477L44.77 51.627a18.227 18.227 0 0 1 4.972 9.813L96.99 37.495a18.227 18.227 0 0 1-4.971-9.811zm26.231 13.281a18.227 18.227 0 0 1-9.256 1.98 18.227 18.227 0 0 1-1.595-.168l4.185 26.8 11.42 1.832zm-4.234 44.192 9.896 63.362a18.227 18.227 0 0 1 8.973-1.837 18.227 18.227 0 0 1 1.906.21l-9.354-59.903ZM49.775 61.64a18.227 18.227 0 0 1 .201 3.73 18.227 18.227 0 0 1-1.894 7.139l26.82 4.308 5.271-10.295zm45.968 7.382L90.47 79.318l63.37 10.177a18.227 18.227 0 0 1-.184-3.63 18.227 18.227 0 0 1 1.945-7.229z"
+        style="display:inline" transform="matrix(.13855 0 0 .1385 -2.107 -1.132)" />
+    <g style="display:inline;opacity:1" transform="matrix(.13834 .00753 -.00754 .1383 -1.182 -5.633)">
+        <circle cx="106.266" cy="51.536" r="16.571" />
+        <circle cx="171.428" cy="110.193" r="16.571" />
+        <circle cx="135.764" cy="190.277" r="16.571" />
+        <circle cx="48.559" cy="181.114" r="16.571" />
+        <circle cx="30.329" cy="95.367" r="16.571" />
+    </g>
+</svg>
+{{- else if (eq $icon_name "firefish") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M16.21.088c-.256.114-.607.485-.7.735-.048.128-.075 1.322-.075 3.46 0 3.083.007 3.286.128 3.522.162.317.378.52.694.654.216.088.721.101 3.492.101 3.559 0 3.491.007 3.889-.411.37-.391.458-.897.256-1.396-.148-.344-6.228-6.45-6.605-6.632-.317-.148-.79-.162-1.079-.033ZM6.107.155C5.79.276 5.473.56 5.352.85c-.074.175-.095.857-.095 3.474 0 3.13.007 3.258.135 3.535.081.162.263.364.418.472l.276.196 3.303.02c3.269.02 3.303.013 3.6-.128.62-.297.882-1.12.565-1.734C13.42 6.43 7.354.337 7.111.21 6.86.081 6.383.054 6.107.155Zm-5.09 10.166a1.25 1.25 0 0 0-.889.695c-.121.263-.128.56-.128 6.139 0 5.842 0 5.869.142 6.166.087.175.256.364.417.472l.277.182 5.864.02c3.95.014 5.951 0 6.113-.054.33-.094.573-.297.755-.627l.148-.284v-5.835c0-4.627-.02-5.889-.087-6.085-.128-.364-.533-.701-.95-.789-.425-.088-11.203-.094-11.661 0zm3.095 6.982c.572.243 1.01.924 1.01 1.579a1.69 1.69 0 0 1-1.705 1.686c-.667 0-1.18-.303-1.496-.89a1.72 1.72 0 0 1 .23-1.957c.47-.54 1.26-.708 1.96-.418zm4.36.04c.162.075.398.257.526.412.944 1.106.169 2.813-1.28 2.813-1.247 0-2.083-1.282-1.557-2.395.242-.533.647-.85 1.287-1.005.23-.054.728.027 1.024.176zm8.028-7.029c-.378.068-.762.351-.923.689-.142.29-.142.37-.142 3.568 0 3.029.013 3.285.128 3.535.148.324.364.533.694.675.216.087.715.1 3.471.1 2.986 0 3.243-.013 3.492-.127.667-.31.97-1.12.647-1.748-.128-.25-6.457-6.624-6.578-6.624-.04 0-.176-.027-.304-.054a1.461 1.461 0 0 0-.485-.014z" />
+</svg>
+{{- else if (eq $icon_name "flickr") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M5.334 6.666C2.3884 6.666 0 9.055 0 12c0 2.9456 2.3884 5.334 5.334 5.334 2.9456 0 5.332-2.3884 5.332-5.334 0-2.945-2.3864-5.334-5.332-5.334zm13.332 0c-2.9456 0-5.332 2.389-5.332 5.334 0 2.9456 2.3864 5.334 5.332 5.334C21.6116 17.334 24 14.9456 24 12c0-2.945-2.3884-5.334-5.334-5.334Z" />
+</svg>
+{{- else if (eq $icon_name "forgejo") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M16.7773 0c1.6018 0 2.9004 1.2986 2.9004 2.9005s-1.2986 2.9004-2.9004 2.9004c-1.0854 0-2.0315-.596-2.5288-1.4787H12.91c-2.3322 0-4.2272 1.8718-4.2649 4.195l-.0007 2.1175a7.0759 7.0759 0 0 1 4.148-1.4205l.1176-.001 1.3385.0002c.4973-.8827 1.4434-1.4788 2.5288-1.4788 1.6018 0 2.9004 1.2986 2.9004 2.9005s-1.2986 2.9004-2.9004 2.9004c-1.0854 0-2.0315-.596-2.5288-1.4787H12.91c-2.3322 0-4.2272 1.8718-4.2649 4.195l-.0007 2.319c.8827.4973 1.4788 1.4434 1.4788 2.5287 0 1.602-1.2986 2.9005-2.9005 2.9005-1.6018 0-2.9004-1.2986-2.9004-2.9005 0-1.0853.596-2.0314 1.4788-2.5287l-.0002-9.9831c0-3.887 3.1195-7.0453 6.9915-7.108l.1176-.001h1.3385C14.7458.5962 15.692 0 16.7773 0ZM7.2227 19.9052c-.6596 0-1.1943.5347-1.1943 1.1943s.5347 1.1943 1.1943 1.1943 1.1944-.5347 1.1944-1.1943-.5348-1.1943-1.1944-1.1943Zm9.5546-10.4644c-.6596 0-1.1944.5347-1.1944 1.1943s.5348 1.1943 1.1944 1.1943c.6596 0 1.1943-.5347 1.1943-1.1943s-.5347-1.1943-1.1943-1.1943Zm0-7.7346c-.6596 0-1.1944.5347-1.1944 1.1943s.5348 1.1943 1.1944 1.1943c.6596 0 1.1943-.5347 1.1943-1.1943s-.5347-1.1943-1.1943-1.1943Z" />
+</svg>
+{{- else if (eq $icon_name "freepik") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M5.737 17.28s3.423.84 7.61.162c4.188-.676 6.862-2.57 6.862-2.57s.28 3.943-4.967 5.33c-5.248 1.388-8.543.657-9.506-2.923zm-.62-3.104s4.491 1.361 8.728.344c4.237-1.016 5.94-2.568 5.94-2.568s-1.81-6.448-7.405-5.648c-5.597.8-8.061 4.414-7.263 7.872z"
+        style="font-variation-settings:normal" stroke-linejoin="round" />
+    <path
+        d="M1.265 12.607c.159-1.98.561-3.898 2.08-5.701m5.148-3.29c2.006-.66 3.968-1.157 6.446-.844m5.202 2.98c1.192 1.275 1.963 2.163 2.594 3.815"
+        style="font-variation-settings:normal" stroke="currentColor" stroke-linejoin="round" />
+    <circle r=".989" cy="10.404" cx="14.746" fill="currentColor" stroke="none" />
+    <circle cx="9.637" cy="11.305" r="1.477" fill="currentColor" stroke="none" />
+</svg>
+{{- else if (eq $icon_name "git") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 92 92" fill="currentColor" strock="currentColor"
+    fill-rule="nonzero">
+    <path
+        d="M90.156 41.965 50.036 1.848a5.913 5.913 0 0 0-8.368 0l-8.332 8.332 10.566 10.566a7.03 7.03 0 0 1 7.23 1.684 7.043 7.043 0 0 1 1.673 7.277l10.183 10.184a7.026 7.026 0 0 1 7.278 1.672 7.04 7.04 0 0 1 0 9.957 7.045 7.045 0 0 1-9.961 0 7.038 7.038 0 0 1-1.532-7.66l-9.5-9.497V59.36a7.04 7.04 0 0 1 1.86 11.29 7.04 7.04 0 0 1-9.957 0 7.04 7.04 0 0 1 0-9.958 7.034 7.034 0 0 1 2.308-1.539V33.926a7.001 7.001 0 0 1-2.308-1.535 7.049 7.049 0 0 1-1.516-7.7L29.242 14.273 1.734 41.777a5.918 5.918 0 0 0 0 8.371L41.855 90.27a5.92 5.92 0 0 0 8.368 0l39.933-39.934a5.925 5.925 0 0 0 0-8.371" />
+</svg>
+{{- else if (eq $icon_name "gitea") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 20" fill="currentColor">
+    <path
+        d="M4.209 4.603c-.247 0-.525.02-.84.088-.333.07-1.28.283-2.054 1.027C-.403 7.25.035 9.685.089 10.052c.065.446.263 1.687 1.21 2.768 1.749 2.141 5.513 2.092 5.513 2.092s.462 1.103 1.168 2.119c.955 1.263 1.936 2.248 2.89 2.367 2.406 0 7.212-.004 7.212-.004s.458.004 1.08-.394c.535-.324 1.013-.893 1.013-.893s.492-.527 1.18-1.73c.21-.37.385-.729.538-1.068 0 0 2.107-4.471 2.107-8.823-.042-1.318-.367-1.55-.443-1.627-.156-.156-.366-.153-.366-.153s-4.475.252-6.792.306c-.508.011-1.012.023-1.512.027v4.474l-.634-.301c0-1.39-.004-4.17-.004-4.17-1.107.016-3.405-.084-3.405-.084s-5.399-.27-5.987-.324c-.187-.011-.401-.032-.648-.032zm.354 1.832h.111s.271 2.269.6 3.597C5.549 11.147 6.22 13 6.22 13s-.996-.119-1.641-.348c-.99-.324-1.409-.714-1.409-.714s-.73-.511-1.096-1.52C1.444 8.73 2.021 7.7 2.021 7.7s.32-.859 1.47-1.145c.395-.106.863-.12 1.072-.12zm8.33 2.554c.26.003.509.127.509.127l.868.422-.529 1.075a.686.686 0 0 0-.614.359.685.685 0 0 0 .072.756l-.939 1.924a.69.69 0 0 0-.66.527.687.687 0 0 0 .347.763.686.686 0 0 0 .867-.206.688.688 0 0 0-.069-.882l.916-1.874a.667.667 0 0 0 .237-.02.657.657 0 0 0 .271-.137 8.826 8.826 0 0 1 1.016.512.761.761 0 0 1 .286.282c.073.21-.073.569-.073.569-.087.29-.702 1.55-.702 1.55a.692.692 0 0 0-.676.477.681.681 0 1 0 1.157-.252c.073-.141.141-.282.214-.431.19-.397.515-1.16.515-1.16.035-.066.218-.394.103-.814-.095-.435-.48-.638-.48-.638-.467-.301-1.116-.58-1.116-.58s0-.156-.042-.27a.688.688 0 0 0-.148-.241l.516-1.062 2.89 1.401s.48.218.583.619c.073.282-.019.534-.069.657-.24.587-2.1 4.317-2.1 4.317s-.232.554-.748.588a1.065 1.065 0 0 1-.393-.045l-.202-.08-4.31-2.1s-.417-.218-.49-.596c-.083-.31.104-.691.104-.691l2.073-4.272s.183-.37.466-.497a.855.855 0 0 1 .35-.077z" />
+</svg>
+{{- else if (eq $icon_name "github") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22">
+    </path>
+</svg>
+{{- else if (eq $icon_name "gitlab") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M22.65 14.39L12 22.13 1.35 14.39a.84.84 0 0 1-.3-.94l1.22-3.78 2.44-7.51A.42.42 0 0 1 4.82 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.49h8.1l2.44-7.51A.42.42 0 0 1 18.6 2a.43.43 0 0 1 .58 0 .42.42 0 0 1 .11.18l2.44 7.51L23 13.45a.84.84 0 0 1-.35.94z">
+    </path>
+</svg>
+{{- else if (eq $icon_name "goodreads") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M11.43 23.995c-3.608-.208-6.274-2.077-6.448-5.078.695.007 1.375-.013 2.07-.006.224 1.342 1.065 2.43 2.683 3.026 1.583.496 3.737.46 5.082-.174 1.351-.636 2.145-1.822 2.503-3.577.212-1.042.236-1.734.231-2.92l-.005-1.631h-.059c-1.245 2.564-3.315 3.53-5.59 3.475-5.74-.054-7.68-4.534-7.528-8.606.01-5.241 3.22-8.537 7.557-8.495 2.354-.14 4.605 1.362 5.554 3.37l.059.002.002-2.918 2.099.004-.002 15.717c-.193 7.04-4.376 7.89-8.209 7.811zm6.1-15.633c-.096-3.26-1.601-6.62-5.503-6.645-3.954-.017-5.625 3.592-5.604 6.85-.013 3.439 1.643 6.305 4.703 6.762 4.532.591 6.551-3.411 6.404-6.967z" />
+</svg>
+{{- else if (eq $icon_name "googleplaystore") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round"
+    stroke-linejoin="round" stroke-width="2">
+    <path
+        d="M15.7 15.9 2.1 3.7m2.4-1.5c-.9-.5-2 0-2.4.8v18a2 2 0 0 0 2.4.8l16.8-8.6c.9-1.1.7-1.7 0-2.4zm11.2 6-13.6 12" />
+</svg>
+{{- else if (eq $icon_name "googlepodcasts") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M1.503 9.678c-.83 0-1.5.67-1.5 1.5v1.63a1.5 1.5 0 103 0v-1.63c0-.83-.67-1.5-1.5-1.5zm20.994 0c-.83 0-1.5.67-1.5 1.5v1.63a1.5 1.5 0 103 0v-1.63c0-.83-.67-1.5-1.5-1.5zM6.68 14.587c-.83 0-1.5.67-1.5 1.5v1.63a1.5 1.5 0 103 0v-1.62c0-.83-.67-1.5-1.5-1.5zm0-9.817c-.83 0-1.5.67-1.5 1.5v5.357a1.5 1.5 0 003 0V6.258c0-.83-.67-1.5-1.5-1.5zm10.638 0c-.83 0-1.5.67-1.5 1.5v1.64a1.5 1.5 0 003 0V6.27c0-.83-.67-1.5-1.5-1.5zM12 0c-.83 0-1.5.67-1.5 1.5v1.63a1.5 1.5 0 103 0V1.5c0-.83-.67-1.499-1.5-1.499zm0 19.355c-.83 0-1.5.67-1.5 1.5v1.64a1.5 1.5 0 103 .01v-1.64c0-.82-.67-1.5-1.5-1.5zm5.319-8.457c-.83 0-1.5.68-1.5 1.5v5.328a1.5 1.5 0 003 0v-5.329c0-.83-.67-1.5-1.5-1.5zM12 6.128c-.83 0-1.5.68-1.5 1.5v8.728a1.5 1.5 0 003 0V7.638c0-.83-.67-1.5-1.5-1.5z" />
+</svg>
+{{- else if (eq $icon_name "googlescholar") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 25" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M5.242 13.769L0.5 9.5 12 1l11.5 9-5.242 3.769C17.548 11.249 14.978 9.5 12 9.5c-2.977 0-5.548 1.748-6.758 4.269zM12 10a7 7 0 1 0 0 14 7 7 0 0 0 0-14z" />
+</svg>
+{{- else if (eq $icon_name "gurushots") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 76.000000 76.000000" fill="currentColor" stroke-width="2"
+    preserveAspectRatio="xMidYMid meet">
+    <g>
+        <path d="M25.7,30.5c0,0,0.3-26.9,1.5-26.9c7.9,0,20.2-0.6,22.3,0C53.3,4.8,39.5,10.9,25.7,30.5z" />
+        <path d="M34.6,24.4c0,0,19-19,19.9-18.1c5.7,5.5,14.8,13.8,15.8,15.6C72.3,25.5,58.2,20.1,34.6,24.4z" />
+        <path d="M45,26.1c0,0,26.9-0.3,26.9,0.9c0.2,7.9,1,20.2,0.5,22.2C71.3,53.1,65,39.4,45,26.1z" />
+        <path d="M51.7,34.4c0,0,18.9,19.2,18,20C64.1,60.1,55.8,69.2,54,70.2C50.4,72.1,55.9,58,51.7,34.4z" />
+        <path d="M50.2,45.3c0,0-0.1,26.9-1.3,26.9c-7.9,0.1-20.2,0.7-22.3,0.1C22.7,71.2,36.5,65.1,50.2,45.3z" />
+        <path d="M41.5,51.8c0,0-19.2,18.8-20.1,17.9C15.7,64.1,6.7,55.8,5.7,53.9C3.8,50.3,17.8,55.9,41.5,51.8z" />
+        <path d="M30.7,50.3c0,0-26.9-0.1-26.9-1.3C3.7,41,3,28.7,3.6,26.7C4.8,22.8,10.9,36.6,30.7,50.3z" />
+        <path d="M24.2,41.6c0,0-18.9-19.2-18-20.1C11.8,15.9,20.1,6.8,22,5.8C25.6,3.9,20.1,17.9,24.2,41.6z" />
+    </g>
+</svg>
+{{- else if (eq $icon_name "hackerone") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M7.207 0c-.4836 0-.8774.1018-1.1823.3002-.3044.2003-.4592.4627-.4592.7798v21.809c0 .2766.1581.5277.4752.7609.315.2335.7031.3501 1.1664.3501.4427 0 .8306-.1166 1.1678-.3501.3352-.231.5058-.4843.5058-.761V1.0815c0-.319-.1623-.5769-.4893-.7813C8.0644.1018 7.6702 0 7.207 0zm9.5234 8.662c-.4836 0-.8717.0981-1.1683.3007l-4.439 2.7822c-.1988.1861-.2841.4687-.2473.855.0342.3826.2108.747.5238 1.0907.3145.346.6662.5626 1.0684.6547.3963.0899.6973.041.8962-.143l1.7551-1.0951v9.7817c0 .2767.1522.5278.4607.761.3007.2335.6873.3501 1.1504.3501.463 0 .863-.1166 1.1983-.3501.3371-.2332.5058-.4843.5058-.761V9.7381c0-.3193-.165-.577-.4898-.7754-.3252-.2026-.7288-.3007-1.2143-.3007z" />
+</svg>
+{{- else if (eq $icon_name "hackerrank") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 35" preserveAspectRatio="xMidYMid meet" fill="currentColor"
+    stroke-width="0" stroke="currentColor">
+    <g>
+        <path
+            d="M0 32.95L3.86 32.95L7.73 32.95L7.73 27.23L7.73 21.52L11.59 21.52L15.45 21.52L15.45 27.23L15.45 32.95L19.31 32.95L23.18 32.95L23.18 17.5L23.18 2.05L19.31 2.05L15.45 2.05L15.45 7.77L15.45 13.48L11.59 13.48L7.73 13.48L7.73 7.77L7.73 2.05L3.86 2.05L0 2.05L0 17.5L0 32.95Z"
+            id="i2pS2ila1d"></path>
+        <path
+            d="M27.19 32.95L38.63 32.95L50.06 32.95L50.06 17.5L50.06 2.05L38.63 2.05L27.19 2.05L27.19 17.5L27.19 32.95Z"
+            id="dgDKP06E5"></path>
+    </g>
+</svg>
+{{- else if (eq $icon_name "hackthebox") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" preserveAspectRatio="xMidYMid meet" fill="currentColor"
+    stroke="none">
+    <g>
+        <path
+            d="M11.9959.0008a1.1187 1.1187 0 00-.057.002.8993.8993 0 00-.2358.0498.9067.9067 0 00-.1652.079L1.9357 5.675a.889.889 0 00-.4444.7699c0 .006.0004.0128.0006.0192-.0002.007 0 .014 0 .0212V17.556a.889.889 0 00.469.7837l9.5983 5.5416c.018.0102.036.0197.054.0287v.002a.8568.8568 0 00.083.0348c0 .001.01.003.012.004.028.01.056.0177.085.0245.01.001.011.003.016.004.028.006.057.0112.086.0146 0 .0005.01.0009.014.001.03.003.061.005.091.005s.061-.002.091-.005c0-.0005.01-.0009.014-.001a.6831.6831 0 00.086-.0146c.01-.001.011-.002.016-.004a.9404.9404 0 00.085-.0245c0-.001.01-.003.012-.004a.8818.8818 0 00.083-.0347v-.002a1.086 1.086 0 00.054-.0287l9.5986-5.5416a.889.889 0 00.4689-.7837V6.4786c0-.009-.0006-.0172-.0008-.0258h.0003v-.008a.8886.8886 0 00-.3117-.6755c-.01-.008-.019-.0162-.029-.0241 0-.002-.01-.005-.01-.007a.8988.8988 0 00-.1074-.0705L12.4533.1267a.8872.8872 0 00-.4646-.1266zm.01 2.2523c.072 0 .1443.0187.209.056l6.5366 3.774c.2789.161.2789.5633 0 .7243l-6.5367 3.774a.4182.4182 0 01-.4182 0L5.26 6.8074c-.2788-.1609-.2789-.5633 0-.7243l6.5368-3.774a.4193.4193 0 01.209-.056zm-8.0801 6.458a.4145.4145 0 01.215.0565l6.524 3.7666a.417.417 0 01.2086.3612v7.5326c0 .3212-.3477.522-.626.3613l-6.5237-3.7666a.4172.4172 0 01-.2086-.3613V9.1288c0-.2408.1955-.414.4107-.4177zm16.1599 0c.215.004.4107.1768.4107.4177v7.5325c0 .149-.08.2868-.2087.3614l-6.5239 3.7666c-.278.1606-.6258-.0401-.6258-.3614v-7.5325c0-.149.08-.2867.2086-.3613l6.5238-3.7666a.415.415 0 01.2152-.0565z">
+        </path>
+    </g>
+</svg>
+{{- else if (eq $icon_name "imdb") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="M22.3781 0H1.6218C.7411.0583.0587.7437.0018 1.5953l-.001 20.783c.0585.8761.7125 1.543 1.5559 1.6191A.337.337 0 0 0 1.6016 24h20.7971a.4579.4579 0 0 0 .0437-.002c.8727-.0768 1.5568-.8271 1.5568-1.7085V1.7098c0-.8914-.696-1.6416-1.584-1.7078A.3294.3294 0 0 0 22.3781 0zm0 .496a1.2144 1.2144 0 0 1 1.1252 1.2139v20.5797c0 .6377-.4875 1.1602-1.1045 1.2145H1.6016c-.5967-.0543-1.0645-.5297-1.1053-1.1258V1.6284C.5371 1.0185 1.0184.5364 1.6217.496h20.7564zM4.7954 8.2603v7.3636H2.8899V8.2603h1.9055zm6.5367 0v7.3636H9.6707v-4.9704l-.6711 4.9704H7.813l-.6986-4.8618-.0066 4.8618h-1.668V8.2603h2.468c.0748.4476.1492.9694.2307 1.5734l.2712 1.8713.4407-3.4447h2.4817zm2.9772 1.3289c.0742.0404.122.108.1417.2034.0279.0953.0345.3118.0345.6442v2.8548c0 .4881-.0345.7867-.0955.8954-.0609.1152-.2304.1695-.5018.1695V9.5211c.204 0 .3457.0205.4211.0681zm-.0211 6.0347c.4543 0 .8006-.0265 1.0245-.0742.2304-.0477.4204-.1357.5694-.2648.1556-.1218.2642-.298.3251-.5219.0611-.2238.1021-.6648.1021-1.3224v-2.5832c0-.6986-.0271-1.1668-.0742-1.4039-.041-.237-.1431-.4543-.3126-.6437-.1695-.1973-.4198-.3324-.7456-.421-.3191-.0808-.8542-.1285-1.7694-.1285h-1.4244v7.3636h2.3051zm5.14-1.7827c0 .3523-.0199.5762-.0544.6708-.033.0947-.1894.1424-.3046.1424-.1086 0-.19-.0477-.2238-.1351-.041-.0887-.0609-.2986-.0609-.6238v-1.9469c0-.3324.0199-.5423.0543-.6237.0338-.0808.1086-.122.2171-.122.1153 0 .2709.0412.3114.1425.041.0947.0609.2986.0609.6032v1.8926zm-2.4747-5.5809v7.3636h1.7157l.1152-.4675c.1556.1894.3251.3324.5152.4271.1828.0881.4608.1357.678.1357.3047 0 .5629-.0748.7802-.237.2165-.1562.3589-.3462.4198-.5628.0543-.2173.0887-.543.0887-.9841v-2.0675c0-.4409-.0139-.7324-.0344-.8681-.0199-.1357-.0742-.2781-.1695-.4204-.1021-.1425-.2437-.251-.4272-.3325-.1834-.0742-.3999-.1152-.6576-.1152-.2172 0-.4952.0477-.6846.1285-.1835.0887-.353.2238-.5086.4007V8.2603h-1.8309z" />
+</svg>
+{{- else if (eq $icon_name "instagram") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <rect x="2" y="2" width="20" height="20" rx="5" ry="5"></rect>
+    <path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"></path>
+    <line x1="17.5" y1="6.5" x2="17.5" y2="6.5"></line>
+</svg>
+{{- else if (eq $icon_name "intigriti") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="M19.9133 6.0364c-1.1056.574-3.7632 1.924-5.8999 3.0084-3.7738 1.9134-7.0267 3.593-7.1117 3.6674-.032.0213.0106.404.085.8611.574 3.4123 2.1473 6.4526 4.316 8.3555l.691.6165.6909-.5953c1.839-1.6158 3.3273-4.2202 4.0502-7.0585.1488-.5634.2764-1.3076.287-1.6477l.0213-.6166-2.9553-1.5308-.7335.372c-.3933.202-.7229.3934-.7229.4253 0 .0319.6698.3933 1.4883.7973l1.4882.7335-.0637.3827c-.3934 2.1686-1.6158 4.7517-2.9234 6.1868l-.606.6698-.4464-.4253c-.9248-.893-1.9347-2.615-2.5194-4.3053-.3295-.946-.7229-2.4343-.659-2.4875.0212-.0212 3.0402-1.5414 6.7077-3.391l6.6546-3.3699.2126.3508c.6697 1.0843.7229 2.5407.1382 3.7313-.6484 1.3181-1.754 1.9879-3.3698 2.0623l-.978.0425-.0638.3189c-.0319.1807-.0638.4784-.0638.6803 0 .319.032.3615.3827.4253.574.1063 1.7647-.032 2.4556-.287 1.6796-.6273 2.849-1.9135 3.3699-3.7313.4464-1.5627-.032-3.423-1.265-4.8475-.2127-.2445-.4465-.4464-.5103-.4464-.0744.0106-1.0312.4783-2.1473 1.0524zM1.3739 5.4836C.1833 6.8762-.2632 8.6196.1514 10.2354c.4677 1.8071 1.6583 3.136 3.3698 3.7737.691.2552 1.8816.3934 2.4556.287.4146-.085.4571-.202.319-1.031l-.0638-.3934-.978-.0425c-1.6265-.0744-2.7214-.7442-3.3805-2.0836-.574-1.148-.5315-2.5406.085-3.6143l.2658-.4571 3.8482 1.956 3.8588 1.956.7123-.3508c.3933-.202.7122-.404.7122-.4465 0-.0638-9.3441-4.805-9.4823-4.805-.0425 0-.2658.2233-.4996.4997zm6.3144-3.6144l-.2657.404.2338.0638c.691.1807 1.6903.9567 2.1048 1.637l.2127.3402-.5953.8824c-.5953.893-1.212 2.0304-1.212 2.2323 0 .0957.9568.6379 1.1375.6379.0426 0 .287-.404.5316-.8824.5315-1.0417.9567-1.6583 1.6583-2.4024l.4996-.5315.4465.4783c.7016.7548 1.2119 1.4883 1.6902 2.4237.2445.4678.4678.8824.489.9143.0638.0744 1.2013-.5422 1.2013-.6591 0-.1914-.6485-1.3713-1.2225-2.2111l-.5953-.8717.2232-.3508c.3295-.5316 1.2012-1.2757 1.754-1.499.2658-.1169.4784-.255.4784-.3082 0-.0638-.1063-.2445-.2445-.4146l-.2445-.2976-.5209.2445c-.3083.1488-.8717.5846-1.3394 1.0524l-.808.8079-.659-.606-.6485-.6165-.6484.6165-.6591.6166-.7548-.7654C9.3254 2.1882 8.2943 1.476 8.018 1.476c-.032 0-.1808.1807-.3296.3933z" />
+</svg>
+{{- else if (eq $icon_name "itchio") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 245.371 220.736" fill="currentColor">
+    <path
+        d="M31.99 1.365C21.287 7.72.2 31.945 0 38.298v10.516C0 62.144 12.46 73.86 23.773 73.86c13.584 0 24.902-11.258 24.903-24.62 0 13.362 10.93 24.62 24.515 24.62 13.586 0 24.165-11.258 24.165-24.62 0 13.362 11.622 24.62 25.207 24.62h.246c13.586 0 25.208-11.258 25.208-24.62 0 13.362 10.58 24.62 24.164 24.62 13.585 0 24.515-11.258 24.515-24.62 0 13.362 11.32 24.62 24.903 24.62 11.313 0 23.773-11.714 23.773-25.046V38.298c-.2-6.354-21.287-30.58-31.988-36.933C180.118.197 157.056-.005 122.685 0c-34.37.003-81.228.54-90.697 1.365zm65.194 66.217a28.025 28.025 0 0 1-4.78 6.155c-5.128 5.014-12.157 8.122-19.906 8.122a28.482 28.482 0 0 1-19.948-8.126c-1.858-1.82-3.27-3.766-4.563-6.032l-.006.004c-1.292 2.27-3.092 4.215-4.954 6.037a28.5 28.5 0 0 1-19.948 8.12c-.934 0-1.906-.258-2.692-.528-1.092 11.372-1.553 22.24-1.716 30.164l-.002.045c-.02 4.024-.04 7.333-.06 11.93.21 23.86-2.363 77.334 10.52 90.473 19.964 4.655 56.7 6.775 93.555 6.788h.006c36.854-.013 73.59-2.133 93.554-6.788 12.883-13.14 10.31-66.614 10.52-90.474-.022-4.596-.04-7.905-.06-11.93l-.003-.045c-.162-7.926-.623-18.793-1.715-30.165-.786.27-1.757.528-2.692.528a28.5 28.5 0 0 1-19.948-8.12c-1.862-1.822-3.662-3.766-4.955-6.037l-.006-.004c-1.294 2.266-2.705 4.213-4.563 6.032a28.48 28.48 0 0 1-19.947 8.125c-7.748 0-14.778-3.11-19.906-8.123a28.025 28.025 0 0 1-4.78-6.155 27.99 27.99 0 0 1-4.736 6.155 28.49 28.49 0 0 1-19.95 8.124c-.27 0-.54-.012-.81-.02h-.007c-.27.008-.54.02-.813.02a28.49 28.49 0 0 1-19.95-8.123 27.992 27.992 0 0 1-4.736-6.155zm-20.486 26.49l-.002.01h.015c8.113.017 15.32 0 24.25 9.746 7.028-.737 14.372-1.105 21.722-1.094h.006c7.35-.01 14.694.357 21.723 1.094 8.93-9.747 16.137-9.73 24.25-9.746h.014l-.002-.01c3.833 0 19.166 0 29.85 30.007L210 165.244c8.504 30.624-2.723 31.373-16.727 31.4-20.768-.773-32.267-15.855-32.267-30.935-11.496 1.884-24.907 2.826-38.318 2.827h-.006c-13.412 0-26.823-.943-38.318-2.827 0 15.08-11.5 30.162-32.267 30.935-14.004-.027-25.23-.775-16.726-31.4L46.85 124.08C57.534 94.073 72.867 94.073 76.7 94.073zm45.985 23.582v.006c-.02.02-21.863 20.08-25.79 27.215l14.304-.573v12.474c0 .584 5.74.346 11.486.08h.006c5.744.266 11.485.504 11.485-.08v-12.474l14.304.573c-3.928-7.135-25.79-27.215-25.79-27.215v-.006l-.003.002z" />
+</svg>
+{{- else if (eq $icon_name "juejin") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="m12 14.316 7.454-5.88-2.022-1.625L12 11.1l-.004.003-5.432-4.288-2.02 1.624 7.452 5.88Zm0-7.247 2.89-2.298L12 2.453l-.004-.005-2.884 2.318 2.884 2.3Zm0 11.266-.005.002-9.975-7.87L0 12.088l.194.156 11.803 9.308 7.463-5.885L24 12.085l-2.023-1.624Z" />
+</svg>
+{{- else if (eq $icon_name "kaggle") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="currentColor" stroke="none">
+    <path transform="matrix(.527027 0 0 .527027 -30.632288 -22.45559)" clip-path="url(#A)"
+        d="M105.75 102.968c-.06.238-.298.357-.713.357H97.1c-.477 0-.89-.208-1.248-.625L82.746 86.028l-3.655 3.477v12.93c0 .595-.298.892-.892.892h-6.152c-.595 0-.892-.297-.892-.892V43.5c0-.593.297-.89.892-.89H78.2c.594 0 .892.298.892.89v36.288l15.692-15.87c.416-.415.832-.624 1.248-.624h8.204c.356 0 .593.15.713.445.12.357.09.624-.09.803L88.274 80.588l17.297 21.488c.237.238.297.535.18.892" />
+</svg>
+{{- else if (eq $icon_name "kakaotalk") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="m12 0c-6.667 0-10.686 4.11-11.709 8.183-1.062 4.224.793 8.271 4.855 10.689-.903 3.276-1.45 4.376-.587 4.965.968.662 2.362-.707 4.691-2.494l.957-.733c3.749.486 7.568-.593 10.272-2.913 2.27-1.948 3.52-4.553 3.52-7.334.001-5.715-5.382-10.363-11.999-10.363zm7.504 16.558c-2.454 2.106-5.965 3.049-9.388 2.524-.479-.077-2.592 1.773-4.312 2.971.194-.735.574-1.972.943-3.353.09-.336-.063-.69-.37-.854-4.527-2.431-5.362-6.396-4.633-9.297.884-3.508 4.397-7.049 10.256-7.049 5.79 0 10.5 3.976 10.5 8.862 0 2.338-1.064 4.538-2.996 6.196z" />
+    <path d="m6.5 7.75h-3c-.992 0-.993 1.5 0 1.5h.75v4.25c0 .992 1.5.993 1.5 0v-4.25h.75c.992 0 .993-1.5 0-1.5z" />
+    <path
+        d="m10.196 8.222c-.001-.003-.004-.004-.005-.007-.246-.595-1.126-.623-1.383 0-.001.002-.003.004-.004.007l-2 5c-.154.384.033.821.418.975.958.386 1.129-.971 1.386-1.446h1.785l.411 1.028c.367.92 1.764.367 1.393-.557zm-.988 3.028.292-.731.292.731z" />
+    <path d="m15.5 12.75h-1.25v-4.25c0-.992-1.5-.993-1.5 0v5c0 .414.336.75.75.75h2c.992 0 .993-1.5 0-1.5z" />
+    <path
+        d="m18.25 9.689v-1.189c0-.992-1.5-.993-1.5 0v5c0 .992 1.5.993 1.5 0v-1.469c1.605 1.746 1.657 2.219 2.25 2.219.63 0 .991-.747.569-1.239l-1.857-2.163 1.823-1.823c.002-.003.005-.005.007-.008.001-.001.002-.002.003-.003.681-.706-.373-1.747-1.07-1.05z" />
+</svg>
+{{- else if (eq $icon_name "keybase") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 71 76.3" fill="currentColor" stroke="none">
+    <path
+        d="M6.68 73.99c-.6-1.3-1.4-3.1-1.8-4l-.6-1.7-2 2.2-2 2.2-.2-4.2c-.3-6 .2-12.2 1.2-16.6 2.3-9.8 9.5-18.7 18.8-23.4l2.1-1-.5-1.5c-.3-.8-.6-2.5-.7-3.6l-.2-2.1-2.1-.2c-3.2-.3-4.9-1.2-6-3.5-.6-1.2-.6-1.4-.4-4.6.2-4.2.5-5.1 1.8-6.5 1.6-1.8 2.7-2.1 6.7-1.9 2.9.2 3.5.3 4.8.9.8.4 1.5.8 1.6.8.1 0 1-1.1 2.1-2.6l1.9-2.7 1.2.7c.7.4 1.5.9 1.9 1.1l.7.4-.6 1.5c-.3.8-.7 2.2-.8 2.9l-.2 1.4 1.7.2c6.1.6 10.7 4.3 12.4 9.9.5 1.8.5 5.3 0 7-.5 1.6-.5 1.7-.1 1.7.7 0 5.4 2.3 7.3 3.5 3.7 2.4 8 6.6 10.4 10.2 4.5 6.7 6.4 14 5.6 22-.4 4.8-1.3 8.6-2.9 12.3l-.6 1.4h-5l1.2-2.4c1.3-2.6 2.3-6.2 2.8-9.4.3-2.2.4-8.2.1-9.3l-.2-.7-1.3 1.4c-3.2 3.5-7.9 4.5-14.2 2.8-5.4-1.4-7.6-1.7-12.7-1.7-3.9 0-5.2.1-7.3.6-5.8 1.3-9.9 3.2-15.6 7.3-2.1 1.5-3.8 2.7-3.9 2.7-.1 0 .2-1 .6-2.3.4-1.3 1.1-3.4 1.5-4.8l.8-2.5-.9.9c-.5.5-1.9 1.9-3.1 3.2l-2.1 2.3.5 1.9c.6 2.5 2 5.6 3.5 7.9.6 1 1.1 1.8 1.1 1.9s-1.2.1-2.6.1h-2.6l-1.1-2.1zm8.8-24.2c4.8-5.1 8.7-9.2 8.8-9.2.1.1-.4 1.6-.9 3.3-3.3 10.4-4 12.4-3.9 12.5 0 0 1.2-.4 2.5-.9 8.5-3.7 18.4-4.2 28.9-1.4 4.7 1.2 6.5 1.2 8.8 0 1.3-.7 1.8-1.1 2.4-2.1 1.1-1.7 1.2-4.1.5-6.3-1.7-4.8-8.3-11-14.5-13.7-3.2-1.4-3.4-1.4-4.1-.7l-.6.6 2.6 3.2c1.4 1.7 2.9 3.6 3.1 4.1.6 1.2.7 3.1.1 4.3-.8 1.7-3.2 2.9-5.1 2.5-.8-.2-1.1-.1-1.9.5-2.2 1.6-4.6 1.2-6.6-1.2-1.6-1.8-2-2.7-2.1-4.5 0-.9-.3-2-.5-2.4-.3-.6-.4-1.3-.4-2.2l.1-1.4-1.3-.3c-1.8-.5-3.9-1.5-5.1-2.4-.6-.4-1.1-.8-1.3-.8s-1.5.6-2.9 1.3c-9.7 5-16 14.3-17 24.8-.1 1-.2 2.3-.3 2.8l-.1.9 1.1-1.1c.5-.5 4.9-5.1 9.7-10.2zm25.9-7.4c.9-.7 1.7-1.3 1.9-1.3.1 0 .4.3.7.7.5.8 1.4.8 1.8.1.3-.5.3-.6-5.6-7.8-3.5-4.3-4.2-5-4.7-5-1.2.1-.9 1 1 3.3l1.8 2.2-1 .8c-1.1 1-1.2 1.2-.5 1.8.5.5.6.4 1.6-.3l1.1-.7.7.6c.4.3.6.8.6.9 0 .2-.8.9-1.7 1.7-.9.7-1.6 1.5-1.6 1.7 0 .3.5 1.1 1.4 2.2.3.6.8.4 2.5-.9zm-10.3-14.2c.6-1.8 2.6-3.2 4.6-3.2 1.1 0 2.7.9 3.8 2.1l1 1.2.9-1.1c2.5-2.8 2.8-6.7.8-10.1-1.5-2.5-4.3-4-8.2-4.4-2.1-.2-2.6-.4-3.7-1.5l-.8-.8-.4.6c-.8 1.2-2.5 5.1-3 6.6-.7 2.3-.4 5.9.5 7.7.9 1.7 3.3 4 4 3.7.1.1.3-.3.5-.8zm-8.9-13.6c.2-.5.7-1.8 1.2-2.8.5-1 .9-2 .9-2.3 0-.9-1-1.3-3.7-1.5-2.4-.2-2.6-.1-3.1.4-.4.4-.6.9-.6 1.6 0 .6-.1 1.7-.2 2.6-.2 2.1.1 2.5 2.2 2.8 3.1.2 3 .2 3.3-.8zm-3.1-2.4c0-1.7.2-1.9 1.6-1.9h1.3v2.8h-2.8v-.9zm6.3 58.3c-.6-.6-.8-1-.8-2 0-1.9 1.1-3 2.9-3 1.7 0 2.9 1.2 2.9 2.9 0 1.8-1.1 2.8-3 2.9-1 0-1.4-.2-2-.8zm19.3.3a2.93 2.93 0 011.8-5.3c1.8 0 2.8 1.1 2.9 3 0 1.1-.1 1.4-.8 2s-1 .8-2 .8c-.9 0-1.5-.2-1.9-.5z" />
+</svg>
+{{- else if (eq $icon_name "keyoxide") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 26 26" fill="none" stroke="currentColor" stroke-linecap="round"
+    stroke-linejoin="round" stroke-width="1.3">
+    <path
+        d="m10.87 0c-0.4551 0-0.832 0.3769-0.832 0.832 0 0.4551 0.3769 0.832 0.832 0.832 0.4551 0 0.832-0.3769 0.832-0.832 0-0.4551-0.3769-0.832-0.832-0.832zm1.85 0.293c-0.5683 0-1.037 0.4688-1.037 1.037 0 0.2368 0.0807 0.4573 0.2168 0.6328-0.05687-0.007139-0.1151-0.01172-0.1738-0.01172-0.7683 0-1.398 0.6302-1.398 1.398 0 0.7683 0.6302 1.4 1.398 1.4 0.3773 0 0.7222-0.1523 0.9746-0.3984-0.00891 0.07397-0.01562 0.1483-0.01562 0.2246 0 0.5999 0.3126 1.131 0.7734 1.48l-2.586 2.012v-0.1152c0-1.817-1.482-3.299-3.299-3.299-1.817 0-3.299 1.482-3.299 3.299v6.828c-1.699e-4 -0.01435-0.001953-0.009604-0.001953 0.03516v5.883c-3.1e-6 1.819 1.482 3.301 3.301 3.301 1.73 0 3.115-1.354 3.25-3.051l3.744 2.494c1.512 1.008 3.566 0.5976 4.574-0.9141 1.008-1.512 0.5976-3.566-0.9141-4.574l-5.014-3.344 5.209-4.053c1.263-0.9824 1.63-2.72 0.9102-4.115-0.006296-0.01221-0.0141-0.02849-0.02148-0.04297 0.2572-0.2824 0.4141-0.657 0.4141-1.066 0-0.8712-0.7128-1.584-1.584-1.584-0.6345 0-1.187 0.3779-1.439 0.9199-0.08446-0.006921-0.1692-0.01237-0.2539-0.01367 0.0014-0.03013 0.003906-0.04019 0.003906-0.08008 0-1.036-0.8484-1.885-1.885-1.885-0.579 5.6e-6 -1.097 0.2653-1.443 0.6797 1.08e-4 -0.007109 0-0.01435 0-0.02148 0-0.3811-0.1542-0.7293-0.4043-0.9824 0.5684 0 1.037-0.4688 1.037-1.037 0-0.5683-0.4688-1.037-1.037-1.037zm-1.85 0.4219c0.06898 0 0.1172 0.04821 0.1172 0.1172s-0.04821 0.1172-0.1172 0.1172c-0.06898 0-0.1172-0.04821-0.1172-0.1172s0.0482-0.1172 0.1172-0.1172zm1.85 0.293c0.1822 0 0.3223 0.14 0.3223 0.3223 0 0.1822-0.14 0.3223-0.3223 0.3223-0.1822 0-0.3223-0.14-0.3223-0.3223 0-0.1822 0.14-0.3223 0.3223-0.3223zm-0.9941 1.658c0.3822 0 0.6836 0.3014 0.6836 0.6836 0 0.3822-0.3014 0.6855-0.6836 0.6855-0.3822 0-0.6836-0.3034-0.6836-0.6855 0-0.3822 0.3014-0.6836 0.6836-0.6836zm2.842 0.7402c0.6502-1.88e-5 1.17 0.5197 1.17 1.17 0 0.05687-0.005159 0.1097-0.005859 0.1914-6.61e-4 0.08173 0.01051 0.21 0.08008 0.3281 0.06857 0.1163 0.1972 0.2073 0.3047 0.2402 0.1075 0.03295 0.1919 0.03178 0.2617 0.03125 0.0602-4.678e-4 0.1197 0.005507 0.1797 0.009766 0.0172 0.6402 0.4194 1.188 0.9824 1.422 0.08721 0.03618 0.1774 0.06577 0.2715 0.08594 0.003893 8.346e-4 0.007816 0.001148 0.01172 0.001953 0.00711 0.001489 0.01434 0.002515 0.02148 0.003906 0.04462 0.008569 0.08895 0.01678 0.1348 0.02148 0.001285 1.341e-4 0.00262-1.31e-4 0.003906 0 0.05184 0.00519 0.1051 0.007812 0.1582 0.007812 0.09398 0 0.1858-0.009457 0.2754-0.02539 0.002495-4.438e-4 0.005321 4.557e-4 0.007812 0 0.003259-5.976e-4 0.006512-0.001335 0.009766-0.001953 0.08604-0.01629 0.1694-0.04058 0.25-0.07031 0.004443-0.001639 0.009247-0.002228 0.01367-0.003906 0.0038-0.00142 0.002259-6.138e-4 0.005859-0.001953 0.5338 1.086 0.2618 2.415-0.7188 3.178l-5.604 4.357a0.3573 0.3573 0 0 0 0.02148 0.5801l5.428 3.617c1.19 0.7933 1.51 2.394 0.7168 3.584-0.7933 1.19-2.394 1.51-3.584 0.7168l-4.25-2.832a0.3573 0.3573 0 0 0-0.5547 0.2969v0.3848c0 1.433-1.153 2.586-2.586 2.586-1.433 0-2.586-1.153-2.586-2.586v-5.883c0 0.02601 0.001373 0.01561 0.001953-0.03125a0.3573 0.3573 0 0 0 0-0.001953 0.3573 0.3573 0 0 0 0-0.001953v-6.828c0-1.43 1.154-2.584 2.584-2.584 1.43 0 2.584 1.154 2.584 2.584v0.8457a0.3573 0.3573 0 0 0 0.5762 0.2832l3.207-2.496s0.07527-0.04914 0.1484-0.1289c0.07317-0.07976 0.1932-0.2171 0.1641-0.4531-0.01519-0.1239-0.1002-0.2811-0.1855-0.3535-0.08537-0.07239-0.1288-0.08753-0.166-0.1133-0.3095-0.2145-0.502-0.5695-0.502-0.9609 0-0.6502 0.5177-1.17 1.168-1.17zm3.574 1.057c0.4851 0 0.8691 0.386 0.8691 0.8711 0 0.3632-0.2156 0.671-0.5273 0.8027-5.5e-4 2.323e-4 -0.001402-2.313e-4 -0.001953 0-0.008517 0.003475-0.0281 0.009073-0.03516 0.01172-0.04666 0.01751-0.09382 0.03145-0.1426 0.04102-0.002029 3.979e-4 -0.003828 0.00157-0.00586 0.001953-0.003817 6.812e-4 -0.007883-6.32e-4 -0.01172 0-0.04722 0.008255-0.09583 0.01367-0.1445 0.01367-0.06064 0-0.1188-0.006076-0.1758-0.01758s-0.1119-0.0289-0.1641-0.05078c-0.0522-0.02188-0.1021-0.04893-0.1484-0.08008s-0.08962-0.06619-0.1289-0.1055-0.07432-0.0826-0.1055-0.1289-0.0582-0.09624-0.08008-0.1484c-0.02188-0.0522-0.03928-0.1071-0.05078-0.1641-0.0115-0.05698-0.01758-0.1151-0.01758-0.1758 1e-5 -0.01046 0.001317-0.032 0.001954-0.04492 7.45e-4 -0.01496 4.8e-4 -0.03018 0.001953-0.04492 0.04418-0.4421 0.4124-0.7812 0.8672-0.7812z">
+    </path>
+</svg>
+{{- else if (eq $icon_name "kofi") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 -3 23 27" preserveAspectRatio="xMidYMid meet" fill="none"
+    stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M23.881 8.948c-.773-4.085-4.859-4.593-4.859-4.593H.723c-.604 0-.679.798-.679.798s-.082 7.324-.022 11.822c.164 2.424 2.586 2.672 2.586 2.672s8.267-.023 11.966-.049c2.438-.426 2.683-2.566 2.658-3.734c4.352.24 7.422-2.831 6.649-6.916zm-11.062 3.511c-1.246 1.453-4.011 3.976-4.011 3.976s-.121.119-.31.023c-.076-.057-.108-.09-.108-.09c-.443-.441-3.368-3.049-4.034-3.954c-.709-.965-1.041-2.7-.091-3.71c.951-1.01 3.005-1.086 4.363.407c0 0 1.565-1.782 3.468-.963c1.904.82 1.832 3.011.723 4.311zm6.173.478c-.928.116-1.682.028-1.682.028V7.284h1.77s1.971.551 1.971 2.638c0 1.913-.985 2.667-2.059 3.015z" />
+</svg>
+{{- else if (eq $icon_name "komoot") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none" stroke="currentColor" stroke-linecap="round"
+    stroke-linejoin="round" stroke-width="3">
+    <path
+        d="M24 2.5A21.5 21.5 0 0 0 7.17 37.38l10.22-10.22a7.32 7.32 0 0 1 11.79-8.34h0a7.32 7.32 0 0 1 1.43 8.34l10.22 10.22A21.5 21.5 0 0 0 24 2.5Zm0 25L10.64 40.82a21.41 21.41 0 0 0 26.72 0Z" />
+</svg>
+{{- else if (eq $icon_name "lastfm") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="M10.599 17.211l-.881-2.393s-1.433 1.596-3.579 1.596c-1.9 0-3.249-1.652-3.249-4.296 0-3.385 1.708-4.596 3.388-4.596 2.418 0 3.184 1.568 3.845 3.578l.871 2.751c.871 2.672 2.523 4.818 7.285 4.818 3.41 0 5.722-1.045 5.722-3.801 0-2.227-1.276-3.383-3.635-3.935l-1.757-.384c-1.217-.274-1.577-.771-1.577-1.597 0-.936.736-1.487 1.952-1.487 1.323 0 2.028.495 2.147 1.679l2.749-.33c-.225-2.479-1.937-3.494-4.745-3.494-2.479 0-4.897.936-4.897 3.934 0 1.873.902 3.058 3.185 3.605l1.862.443c1.397.33 1.863.916 1.863 1.713 0 1.021-.992 1.441-2.869 1.441-2.779 0-3.936-1.457-4.597-3.469l-.901-2.75c-1.156-3.574-3.004-4.896-6.669-4.896C2.147 5.327 0 7.879 0 12.235c0 4.179 2.147 6.445 6.003 6.445 3.108 0 4.596-1.457 4.596-1.457v-.012z" />
+</svg>
+{{- else if (eq $icon_name "leetcode") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M13.483 0a1.374 1.374 0 0 0-.961.438L7.116 6.226l-3.854 4.126a5.266 5.266 0 0 0-1.209 2.104 5.35 5.35 0 0 0-.125.513 5.527 5.527 0 0 0 .062 2.362 5.83 5.83 0 0 0 .349 1.017 5.938 5.938 0 0 0 1.271 1.818l4.277 4.193.039.038c2.248 2.165 5.852 2.133 8.063-.074l2.396-2.392c.54-.54.54-1.414.003-1.955a1.378 1.378 0 0 0-1.951-.003l-2.396 2.392a3.021 3.021 0 0 1-4.205.038l-.02-.019-4.276-4.193c-.652-.64-.972-1.469-.948-2.263a2.68 2.68 0 0 1 .066-.523 2.545 2.545 0 0 1 .619-1.164L9.13 8.114c1.058-1.134 3.204-1.27 4.43-.278l3.501 2.831c.593.48 1.461.387 1.94-.207a1.384 1.384 0 0 0-.207-1.943l-3.5-2.831c-.8-.647-1.766-1.045-2.774-1.202l2.015-2.158A1.384 1.384 0 0 0 13.483 0zm-2.866 12.815a1.38 1.38 0 0 0-1.38 1.382 1.38 1.38 0 0 0 1.38 1.382H20.79a1.38 1.38 0 0 0 1.38-1.382 1.38 1.38 0 0 0-1.38-1.382z" />
+</svg>
+{{- else if (eq $icon_name "letterboxd") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="currentColor">
+    <path
+        d="M11.052 22.339V9.599H8.729V6.401h8.438v3.198h-2.328v12.766h5.234v-3.49h3.781v6.724H8.729v-3.26zM0 16c0 8.839 7.161 16 16 16s16-7.161 16-16S24.839 0 16 0S0 7.161 0 16z" />
+</svg>
+{{- else if (eq $icon_name "liberapay") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" fill="currentColor">
+    <g transform="translate(-78.37-208.06)">
+        <path
+            d="m104.28 271.1c-3.571 0-6.373-.466-8.41-1.396-2.037-.93-3.495-2.199-4.375-3.809-.88-1.609-1.308-3.457-1.282-5.544.025-2.086.313-4.311.868-6.675l9.579-40.05 11.69-1.81-10.484 43.44c-.202.905-.314 1.735-.339 2.489-.026.754.113 1.421.415 1.999.302.579.817 1.044 1.546 1.395.729.353 1.747.579 3.055.679l-2.263 9.278" />
+        <path
+            d="m146.52 246.14c0 3.671-.604 7.03-1.811 10.07-1.207 3.043-2.879 5.669-5.01 7.881-2.138 2.213-4.702 3.935-7.693 5.167-2.992 1.231-6.248 1.848-9.767 1.848-1.71 0-3.42-.151-5.129-.453l-3.394 13.651h-11.162l12.52-52.19c2.01-.603 4.311-1.143 6.901-1.622 2.589-.477 5.393-.716 8.41-.716 2.815 0 5.242.428 7.278 1.282 2.037.855 3.708 2.024 5.02 3.507 1.307 1.484 2.274 3.219 2.904 5.205.627 1.987.942 4.11.942 6.373m-27.378 15.461c.854.202 1.91.302 3.167.302 1.961 0 3.746-.364 5.355-1.094 1.609-.728 2.979-1.747 4.111-3.055 1.131-1.307 2.01-2.877 2.64-4.714.628-1.835.943-3.858.943-6.071 0-2.161-.479-3.998-1.433-5.506-.956-1.508-2.615-2.263-4.978-2.263-1.61 0-3.118.151-4.525.453l-5.28 21.948" />
+    </g>
+</svg>
+{{- else if (eq $icon_name "lichess" ) -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50">
+    <path fill="currentColor" stroke="currentColor" stroke-linejoin="round"
+        d="M38.956.5c-3.53.418-6.452.902-9.286 2.984C5.534 1.786-.692 18.533.68 29.364 3.493 50.214 31.918 55.785 41.329 41.7c-7.444 7.696-19.276 8.752-28.323 3.084C3.959 39.116-.506 27.392 4.683 17.567 9.873 7.742 18.996 4.535 29.03 6.405c2.43-1.418 5.225-3.22 7.655-3.187l-1.694 4.86 12.752 21.37c-.439 5.654-5.459 6.112-5.459 6.112-.574-1.47-1.634-2.942-4.842-6.036-3.207-3.094-17.465-10.177-15.788-16.207-2.001 6.967 10.311 14.152 14.04 17.663 3.73 3.51 5.426 6.04 5.795 6.756 0 0 9.392-2.504 7.838-8.927L37.4 7.171z" />
+</svg>
+{{- else if (eq $icon_name "linkedin") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path d="M16 8a6 6 0 0 1 6 6v7h-4v-7a2 2 0 0 0-2-2 2 2 0 0 0-2 2v7h-4v-7a6 6 0 0 1 6-6z"></path>
+    <rect x="2" y="9" width="4" height="12"></rect>
+    <circle cx="4" cy="4" r="2"></circle>
+</svg>
+{{- else if (eq $icon_name "linktree") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+  <path
+    d="m13.73635 5.85251 4.00467-4.11665 2.3248 2.3808-4.20064 4.00466h5.9085v3.30473h-5.9365l4.22865 4.10766-2.3248 2.3338L12.0005 12.099l-5.74052 5.76852-2.3248-2.3248 4.22864-4.10766h-5.9375V8.12132h5.9085L3.93417 4.11666l2.3248-2.3808 4.00468 4.11665V0h3.4727zm-3.4727 10.30614h3.4727V24h-3.4727z" />
+</svg>
+{{- else if (eq $icon_name "mastodon") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M21.58 13.913c-.29 1.469-2.592 3.121-5.238 3.396-1.379.184-2.737.368-4.185.276-2.368-.092-4.237-.551-4.237-.551 0 .184.014.459.043.643.308 2.294 2.317 2.478 4.22 2.57 1.922 0 3.633-.46 3.633-.46l.079 1.653s-1.344.734-3.738.918c-1.32.091-2.96-.092-4.869-.551-4.14-1.102-4.853-5.507-4.961-10.005-.034-1.285-.013-2.57-.013-3.58 0-4.589 3-5.966 3-5.966 1.513-.734 4.11-1.01 6.808-1.01h.067c2.699 0 5.296.276 6.81 1.01 0 0 3 1.377 3 5.967 0 0 .037 3.304-.419 5.69"
+        stroke="currentColor" />
+    <path
+        d="M17.832 8.633v5h-1.978V8.78c0-1.023-.43-1.542-1.29-1.542-.95 0-1.427.616-1.427 1.834v2.655H11.17V9.072c0-1.218-.476-1.834-1.427-1.834-.86 0-1.29.52-1.29 1.542v4.852H6.475V8.633c0-1.022.26-1.834.782-2.434.538-.6 1.243-.909 2.118-.909 1.012 0 1.779.39 2.286 1.169l.492.827.493-.827c.507-.78 1.274-1.169 2.286-1.169.875 0 1.58.308 2.118.909.522.6.782 1.412.782 2.434"
+        fill="currentColor" stroke="none" />
+</svg>
+{{- else if (eq $icon_name "matrix") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M.632.55v22.9H2.28V24H0V0h2.28v.55zm7.043 7.26v1.157h.033c.309-.443.683-.784 1.117-1.024.433-.245.936-.365 1.5-.365.54 0 1.033.107 1.481.314.448.208.785.582 1.02 1.108.254-.374.6-.706 1.034-.992.434-.287.95-.43 1.546-.43.453 0 .872.056 1.26.167.388.11.716.286.993.53.276.245.489.559.646.951.152.392.23.863.23 1.417v5.728h-2.349V11.52c0-.286-.01-.559-.032-.812a1.755 1.755 0 0 0-.18-.66 1.106 1.106 0 0 0-.438-.448c-.194-.11-.457-.166-.785-.166-.332 0-.6.064-.803.189a1.38 1.38 0 0 0-.48.499 1.946 1.946 0 0 0-.231.696 5.56 5.56 0 0 0-.06.785v4.768h-2.35v-4.8c0-.254-.004-.503-.018-.752a2.074 2.074 0 0 0-.143-.688 1.052 1.052 0 0 0-.415-.503c-.194-.125-.476-.19-.854-.19-.111 0-.259.024-.439.074-.18.051-.36.143-.53.282-.171.138-.319.337-.439.595-.12.259-.18.6-.18 1.02v4.966H5.46V7.81zm15.693 15.64V.55H21.72V0H24v24h-2.28v-.55z" />
+</svg>
+{{- else if (eq $icon_name "medium") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 76.000000 76.000000" fill="currentColor" stroke-width="2"
+    preserveAspectRatio="xMidYMid meet">
+    <g transform="translate(0.000000,76.000000) scale(0.100000,-0.100000)">
+        <path
+            d="M0 380 l0 -380 380 0 380 0 0 380 0 380 -380 0 -380 0 0 -380z m334 85 c30 -63 57 -115 59 -115 2 0 16 30 31 68 15 37 37 88 49 115 l20 47 76 0 76 -1 -27 -20 -28 -21 0 -151 c0 -150 0 -151 27 -179 l27 -28 -109 0 -109 0 27 28 c26 27 27 32 26 143 0 131 3 134 -71 -58 -24 -62 -48 -113 -53 -113 -6 0 -17 16 -24 35 -7 19 -36 83 -64 142 l-52 108 -3 -98 c-3 -97 -2 -99 28 -133 16 -19 30 -39 30 -44 0 -6 -31 -10 -70 -10 -45 0 -70 4 -70 11 0 6 14 27 30 46 30 33 30 35 30 151 0 116 0 118 -31 155 l-30 37 75 0 76 0 54 -115z" />
+    </g>
+</svg>
+{{- else if (eq $icon_name "microblog") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="M-30.2 14.1c-1.4-.8-2.7-1.5-4.1-2.3-2.4-1.5-3.6-3.6-3.3-6.5.3-3 2.8-5.2 5.8-5.3h11c2.6 0 4.6 2.2 4.7 4.7 0 2.6-2 4.8-4.6 4.9h-2.8v.2c.2.2.5.3.7.5 1.2.7 2.4 1.3 3.6 2 2.5 1.5 3.7 4.5 2.9 7.2-.8 2.7-3.1 4.3-6.1 4.4H-33c-2.4 0-4.3-1.9-4.6-4.3-.3-2.3 1.2-4.5 3.5-5.1.6-.1 1.2-.1 1.7-.2h2.1c.1 0 .1-.1.1-.2zm4.3-3.8c-.1.3-.2.3-.2.4v3.9c0 1.1-.1 1.2-1.2 1.2h-5.1c-.4 0-.9 0-1.3.1-1.6.4-2.5 1.9-2.4 3.6.2 1.6 1.6 2.9 3.3 2.9h10.5c2.1 0 3.8-1.2 4.5-3.1.7-1.8.2-4.1-1.5-5.3-2.1-1.3-4.4-2.4-6.6-3.7zm-1.7 3.4v-4c0-1.4.1-1.5 1.4-1.5h5.3c1.5 0 2.7-1 3.1-2.4.6-2.2-1-4.2-3.4-4.3h-10.1c-2.4 0-4.3 1.3-4.9 3.4-.6 2.1.4 4.4 2.5 5.5 1.7 1 3.5 1.9 5.2 2.9.3.2.5.2.9.4zM12 2c5.5 0 10 4 10 8.9 0 1.8-.8 3.8-2.1 5.4-.9 1-1.5 2.3-1.6 3.7 0-.1-.1-.1-.2-.2-.4-.4-1.1-.7-1.7-.7-.3 0-.5 0-.8.1-1.2.4-2.4.6-3.6.6-5.5 0-10-4-10-8.9S6.5 2 12 2m0-2C5.4 0 0 4.9 0 11s5.4 10.9 12 10.9c1.4 0 2.8-.2 4.2-.7h.1c.1 0 .2 0 .3.1 1 1.3 2.5 2.3 4.2 2.7l.2-.1v-.3c-.7-.9-1-1.9-1-3s.4-2.1 1.2-2.9c1.5-1.8 2.6-4.2 2.6-6.7C24 4.9 18.5 0 12 0z" />
+    <path
+        d="M53.3 6.9c-.2-1-1-1.7-1.9-2-1.7-.4-8.6-.4-8.6-.4s-6.9 0-8.6.5c-1 .3-1.7 1-1.9 2-.3 1.7-.5 3.5-.5 5.3 0 1.8.1 3.6.5 5.3.3.9 1 1.7 1.9 1.9 1.7.5 8.6.5 8.6.5s6.9 0 8.6-.5c1-.3 1.7-1 1.9-2 .3-1.7.5-3.5.5-5.3 0-1.8-.1-3.6-.5-5.3z" />
+    <path d="m40.6 15.5 5.7-3.3-5.7-3.3z" />
+    <path
+        d="M12 5.4c.1 0 .3.1.3.2L13.5 9l3.7.1c.1 0 .3.1.3.2s0 .3-.1.4l-3 2.2 1.1 3.5c0 .1 0 .3-.1.4H15l-3-2.1-3 2.1h-.5c-.1-.1-.2-.2-.1-.4l1-3.4-3-2.2c-.1-.2-.1-.3-.1-.5 0-.1.2-.2.3-.2l3.7-.1 1.2-3.4c.2-.1.3-.2.5-.2z" />
+</svg>
+{{- else if (eq $icon_name "mixcloud") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke-width="2">
+    <path
+        d="M21.95 19.062c-.154 0-.31-.045-.445-.135-.369-.25-.465-.75-.225-1.11.738-1.094 1.125-2.381 1.125-3.719s-.387-2.625-1.125-3.721c-.249-.368-.145-.866.216-1.106.375-.249.87-.146 1.108.214.917 1.365 1.396 2.97 1.396 4.62 0 1.648-.479 3.254-1.396 4.619-.135.239-.39.359-.645.359l-.009-.021zM19.66 17.768c-.153 0-.308-.045-.445-.139-.369-.239-.463-.734-.215-1.094.489-.721.747-1.545.747-2.43 0-.855-.258-1.695-.747-2.431-.248-.36-.154-.854.215-1.095s.857-.15 1.106.225c.669.99 1.021 2.145 1.021 3.314 0 1.201-.352 2.34-1.021 3.315-.146.24-.406.36-.661.36v-.025zm-3.73-7.153c-.314-3.197-3.016-5.699-6.3-5.699-2.721 0-5.13 1.748-5.995 4.283C1.588 9.501 0 11.269 0 13.4c0 2.344 1.912 4.254 4.26 4.254h10.908c1.964 0 3.566-1.594 3.566-3.557 0-1.706-1.2-3.129-2.805-3.48v-.002zm-.762 5.446H4.263c-1.466 0-2.669-1.191-2.669-2.658 0-1.465 1.193-2.658 2.669-2.658.71 0 1.381.285 1.886.781.3.314.811.314 1.125 0 .3-.301.3-.811 0-1.125-.555-.542-1.231-.931-1.965-1.111.75-1.665 2.43-2.774 4.305-2.774 2.609 0 4.74 2.129 4.74 4.738 0 .512-.075 1.006-.24 1.486-.135.42.09.869.51 1.02.074.03.165.045.24.045.33 0 .645-.211.75-.54.105-.315.18-.63.225-.96.734.285 1.26 1.005 1.26 1.83 0 1.096-.885 1.979-1.965 1.979l.034-.053z" />
+</svg>
+{{- else if (eq $icon_name "monero") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M12 0C5.365 0 0 5.373 0 12.015c0 1.335.228 2.607.618 3.81h3.577V5.729L12 13.545l7.805-7.815v10.095h3.577c.389-1.203.618-2.475.618-3.81C24 5.375 18.635 0 12 0zm-1.788 15.307l-3.417-3.421v6.351H1.758C3.87 21.689 7.678 24 12 24s8.162-2.311 10.245-5.764h-5.04v-6.351l-3.386 3.421-1.788 1.79-1.814-1.79h-.005z" />
+</svg>
+{{- else if (eq $icon_name "neteasecloudmusic") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M10.98,23.65c-2.69,0-5.26-1.05-7.24-2.95C1.59,18.63,.35,15.72,.35,12.73,.35,8.21,3.21,4.11,7.46,2.52c.15-.05,.3-.08,.45-.08,.42,0,.78,.21,.93,.55,.12,.26,.13,.51,.03,.75-.12,.28-.38,.52-.7,.64-3.48,1.3-5.82,4.66-5.82,8.36,0,2.46,1.02,4.84,2.79,6.54,1.6,1.54,3.68,2.39,5.85,2.39,.1,0,.2,0,.29,0,3.49-.12,6.22-1.91,7.47-4.89,.08-.2,2.01-4.93-2.59-7.9-.41-.27-.89-.46-1.42-.58l-.6-.14,.18,.58c.21,.68,.78,2.52,.84,2.93,.07,.46,.07,.51,.1,.92v.18c0,2.3-1.89,4.19-4.22,4.19-2.2,0-3.97-1.73-4.23-4.1-.25-2.35,.74-4.4,2.73-5.61,.53-.32,1.11-.57,1.73-.75l.33-.1-.48-1.74c-.16-.54-.53-2.38,1.5-3.72,.57-.38,1.22-.57,1.91-.57,1.38,0,2.62,.74,3.12,1.23,.22,.22,.36,.56,.36,.9,0,.26-.08,.48-.23,.63-.15,.15-.37,.23-.63,.23-.33,0-.67-.13-.89-.35-.06-.05-.85-.66-1.7-.66-.31,0-.59,.08-.82,.24-.04,.03-.08,.05-.12,.08-.23,.19-.71,.73-.47,1.82l.09,.34,.02,.07h0s.35,1.29,.35,1.29h.25c1.24,.08,2.39,.42,3.32,1.01l.05,.03c4.82,3.12,4.29,8.12,3.34,10.33-1.54,3.67-4.99,5.95-9.23,6.1-.12,0-.25,0-.37,0Zm.82-15.26c-.43,.13-.84,.31-1.2,.53-.94,.57-2.01,1.68-1.79,3.71,.12,1.12,.87,2.33,2.24,2.33,1.23,0,2.24-1,2.24-2.22h0s.03-.21-.05-.71c-.07-.46-.91-3.1-1-3.4l-.1-.33-.33,.1Z" />
+</svg>
+{{- else if (eq $icon_name "nextcloud") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M12.018 6.537c-2.5 0-4.6 1.712-5.241 4.015-.56-1.232-1.793-2.105-3.225-2.105A3.569 3.569 0 0 0 0 12a3.569 3.569 0 0 0 3.552 3.553c1.432 0 2.664-.874 3.224-2.106.641 2.304 2.742 4.016 5.242 4.016 2.487 0 4.576-1.693 5.231-3.977.569 1.21 1.783 2.067 3.198 2.067A3.568 3.568 0 0 0 24 12a3.569 3.569 0 0 0-3.553-3.553c-1.416 0-2.63.858-3.199 2.067-.654-2.284-2.743-3.978-5.23-3.977zm0 2.085c1.878 0 3.378 1.5 3.378 3.378 0 1.878-1.5 3.378-3.378 3.378A3.362 3.362 0 0 1 8.641 12c0-1.878 1.5-3.378 3.377-3.378zm-8.466 1.91c.822 0 1.467.645 1.467 1.468s-.644 1.467-1.467 1.468A1.452 1.452 0 0 1 2.085 12c0-.823.644-1.467 1.467-1.467zm16.895 0c.823 0 1.468.645 1.468 1.468s-.645 1.468-1.468 1.468A1.452 1.452 0 0 1 18.98 12c0-.823.644-1.467 1.467-1.467z" />
+</svg>
+{{- else if (eq $icon_name "nostr") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="m 23.991133,23.041317 c 0,0.468008 -0.376673,0.861815 -0.861814,0.861815 H 12.861481 c -0.468008,0 -0.861814,-0.376673 -0.861814,-0.861815 v -2.340105 c 0.04667,-2.870848 0.348005,-5.616161 0.981683,-6.871848 0.376673,-0.753346 1.010217,-1.164286 1.735095,-1.37549 1.37549,-0.40534 3.761263,-0.137335 4.788613,-0.182669 0,0 3.082052,0.120002 3.082052,-1.615227 0,-1.7350292 -1.375556,-1.3013553 -1.375556,-1.3013553 C 19.699128,9.4012901 18.540442,9.2946217 17.798497,8.9892833 16.542876,8.4926083 16.497208,7.6023935 16.497208,7.2998551 16.437207,3.812597 11.286255,3.3902566 6.7545122,4.2634712 1.8003629,5.1994868 6.8145132,12.311072 6.8145132,21.796897 v 1.267087 c 0,0.468008 -0.3940066,0.844681 -0.8618144,0.844681 H 0.86161395 c -0.4680078,0 -0.86181435741,-0.376673 -0.86181435741,-0.861814 V 1.3013551 c 0,-0.46800778 0.37667293741,-0.86181434 0.86181435741,-0.86181434 H 5.6502271 c 0.4680078,0 0.8618144,0.37667294 0.8618144,0.86181434 0,0.7076785 0.7876131,1.0901515 1.3583559,0.6791447 1.7236954,-1.23848733 3.9267996,-1.88916484 6.4038406,-1.88916484 5.524892,0 9.725562,3.23038714 9.725562,10.37623904 V 23.029717 Z M 14.80778,7.9278656 c 0,-1.0102835 -0.816213,-1.8263638 -1.82643,-1.8263638 -1.010217,0 -1.826364,0.8161469 -1.826364,1.8263638 0,1.0102835 0.816147,1.8264304 1.826364,1.8264304 1.010217,0 1.82643,-0.8161469 1.82643,-1.8264304 z" />
+</svg>
+{{- else if (eq $icon_name "nuget") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" stroke-width="2">
+    <g>
+        <path
+            d="M374.424959,454.856991 C327.675805,454.856991 289.772801,416.950177 289.772801,370.196324 C289.772801,323.463635 327.675805,285.535656 374.424959,285.535656 C421.174113,285.535656 459.077116,323.463635 459.077116,370.196324 C459.077116,416.950177 421.174113,454.856991 374.424959,454.856991 M205.565067,260.814741 C176.33891,260.814741 152.657469,237.109754 152.657469,207.901824 C152.657469,178.672728 176.33891,154.988907 205.565067,154.988907 C234.791225,154.988907 258.472666,178.672728 258.472666,207.901824 C258.472666,237.109754 234.791225,260.814741 205.565067,260.814741 M378.170817,95.6417786 L236.886365,95.6417786 C164.889705,95.6417786 106.479717,154.057639 106.479717,226.082702 L106.479717,367.360191 C106.479717,439.40642 164.889705,497.77995 236.886365,497.77995 L378.170817,497.77995 C450.209803,497.77995 508.577466,439.40642 508.577466,367.360191 L508.577466,226.082702 C508.577466,154.057639 450.209803,95.6417786 378.170817,95.6417786">
+        </path>
+        <path
+            d="M84.6521577,46.0115787 C84.6521577,69.3990881 65.6900744,88.3419125 42.3260788,88.3419125 C18.9409203,88.3419125 0,69.3990881 0,46.0115787 C0,22.6452344 18.9409203,3.68124485 42.3260788,3.68124485 C65.6900744,3.68124485 84.6521577,22.6452344 84.6521577,46.0115787">
+        </path>
+    </g>
+</svg>
+{{- else if (eq $icon_name "orcid") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" fill="none">
+    <path fill-rule="evenodd" clip-rule="evenodd"
+        d="M128 256C198.7 256 256 198.7 256 128C256 57.3 198.7 0 128 0C57.3 0 0 57.3 0 128C0 198.7 57.3 256 128 256ZM70.9 186.2H86.3V127.5V79.0999H70.9V186.2ZM108.9 79.0999H150.5C190.1 79.0999 207.5 107.4 207.5 132.7C207.5 160.2 186 186.3 150.7 186.3H108.9V79.0999ZM124.3 172.4H148.8C183.7 172.4 191.7 145.9 191.7 132.7C191.7 111.2 178 93 148 93H124.3V172.4ZM78.6 66.8999C84.2 66.8999 88.7 62.2999 88.7 56.7999C88.7 51.2999 84.2 46.7 78.6 46.7C73 46.7 68.5 51.2 68.5 56.7999C68.5 62.2999 73 66.8999 78.6 66.8999Z"
+        fill="currentColor" />
+</svg>
+{{- else if (eq $icon_name "osu!") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" fill="currentColor" stroke-width="2">
+    <g>
+        <path
+            d="M 25 3 C 12.85 3 3 12.85 3 25 C 3 37.15 12.85 47 25 47 C 37.15 47 47 37.15 47 25 C 47 12.85 37.15 3 25 3 z M 25 5 C 36.028 5 45 13.972 45 25 C 45 36.028 36.028 45 25 45 C 13.972 45 5 36.028 5 25 C 5 13.972 13.972 5 25 5 z M 38 18 L 38 26 L 40 26 L 40 18 L 38 18 z M 13.798828 21.013672 C 13.611859 21.023047 13.423828 21.042313 13.236328 21.070312 C 12.140328 21.233312 11.272594 21.778766 10.683594 22.759766 C 10.273594 23.440766 10.084437 24.197234 10.023438 24.990234 C 9.9604375 25.800234 10.019438 26.597094 10.273438 27.371094 C 10.664437 28.562094 11.402078 29.409828 12.580078 29.798828 C 13.299078 30.036828 14.041203 30.059359 14.783203 29.943359 C 16.013203 29.750359 16.940859 29.104312 17.505859 27.945312 C 17.875859 27.186312 17.99 26.368266 18 25.572266 C 17.995 24.978266 17.937828 24.434344 17.798828 23.902344 C 17.456828 22.604344 16.703031 21.686234 15.457031 21.240234 C 14.915531 21.046734 14.359734 20.985547 13.798828 21.013672 z M 23.408203 21.017578 C 22.808203 21.006578 22.216391 21.056297 21.650391 21.279297 C 21.003391 21.534297 20.485219 21.944187 20.199219 22.617188 C 19.985219 23.120187 19.957391 23.649547 20.025391 24.185547 C 20.085391 24.659547 20.258047 25.078531 20.623047 25.394531 C 20.884047 25.620531 21.171187 25.804016 21.492188 25.916016 C 21.926188 26.068016 22.370687 26.187891 22.804688 26.337891 C 23.045687 26.420891 23.278813 26.530531 23.507812 26.644531 C 23.647813 26.713531 23.722719 26.849859 23.761719 27.005859 C 23.861719 27.412859 23.717984 27.732219 23.333984 27.949219 C 23.046984 28.111219 22.734063 28.162734 22.414062 28.177734 C 21.718062 28.211734 21.054203 28.053781 20.408203 27.800781 C 20.368203 27.784781 20.327156 27.770859 20.285156 27.755859 C 20.271156 27.784859 20.262859 27.801359 20.255859 27.818359 C 20.030859 28.340359 19.884219 28.883172 19.824219 29.451172 C 19.817219 29.522172 19.839344 29.550219 19.902344 29.574219 C 20.468344 29.787219 21.048391 29.936469 21.650391 29.980469 C 22.347391 30.030469 23.042656 30.025125 23.722656 29.828125 C 24.345656 29.647125 24.908562 29.355563 25.351562 28.851562 C 25.862562 28.268563 26.041234 27.574734 25.990234 26.802734 C 25.930234 25.883734 25.518453 25.210703 24.689453 24.845703 C 24.377453 24.708703 24.049516 24.612047 23.728516 24.498047 C 23.362516 24.367047 22.986859 24.257562 22.630859 24.101562 C 22.304859 23.958563 22.187594 23.610625 22.308594 23.265625 C 22.399594 23.005625 22.612609 22.900844 22.849609 22.839844 C 23.300609 22.723844 23.756125 22.749562 24.203125 22.851562 C 24.559125 22.932563 24.907484 23.053156 25.271484 23.160156 C 25.270484 23.160156 25.27625 23.151578 25.28125 23.142578 C 25.52025 22.638578 25.658656 22.106781 25.722656 21.550781 C 25.731656 21.470781 25.684719 21.462312 25.636719 21.445312 C 24.914719 21.189312 24.174203 21.031578 23.408203 21.017578 z M 29.070312 21.113281 C 28.703937 21.113156 28.339656 21.146391 27.972656 21.212891 C 27.970656 21.252891 27.966797 21.286313 27.966797 21.320312 C 27.966797 22.825312 27.96575 24.332891 27.96875 25.837891 C 27.96975 26.435891 28.004203 27.031328 28.158203 27.611328 C 28.419203 28.596328 28.944094 29.338172 29.871094 29.701172 C 30.361094 29.893172 30.875625 29.943469 31.390625 29.980469 C 32.584625 30.066469 33.749625 29.880813 34.890625 29.507812 C 34.972625 29.480813 34.998047 29.444609 34.998047 29.349609 C 34.995047 26.679609 34.996094 24.009844 34.996094 21.339844 L 34.996094 21.214844 C 34.261094 21.081844 33.540594 21.079844 32.808594 21.214844 C 32.808594 21.268844 32.807641 21.316234 32.806641 21.365234 C 32.806641 23.514234 32.807547 25.6635 32.810547 27.8125 C 32.810547 27.9195 32.780547 27.956563 32.685547 27.976562 C 32.267547 28.063563 31.846828 28.088297 31.423828 28.029297 C 30.835828 27.947297 30.445687 27.602375 30.304688 26.984375 C 30.234688 26.678375 30.186594 26.358922 30.183594 26.044922 C 30.170594 24.485922 30.174828 22.926188 30.173828 21.367188 L 30.173828 21.214844 C 29.804328 21.147844 29.436688 21.113406 29.070312 21.113281 z M 13.798828 22.865234 C 13.993828 22.850234 14.192766 22.859531 14.384766 22.894531 C 14.826766 22.973531 15.144703 23.238344 15.345703 23.652344 C 15.545703 24.063344 15.625109 24.504031 15.662109 24.957031 C 15.678109 25.148031 15.6815 25.339844 15.6875 25.464844 C 15.6795 26.076844 15.643891 26.618719 15.462891 27.136719 C 15.307891 27.583719 15.060516 27.949328 14.603516 28.111328 C 14.208516 28.251328 13.808109 28.254094 13.412109 28.121094 C 13.057109 28.003094 12.814438 27.750156 12.648438 27.410156 C 12.472437 27.049156 12.386609 26.663625 12.349609 26.265625 C 12.287609 25.607625 12.282594 24.947781 12.433594 24.300781 C 12.488594 24.064781 12.571781 23.830281 12.675781 23.613281 C 12.902781 23.140281 13.297828 22.903234 13.798828 22.865234 z M 38 28 L 38 30 L 40 30 L 40 28 L 38 28 z">
+        </path>
+    </g>
+</svg>
+{{- else if (eq $icon_name "overcast") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M12 24C5.389 24.018.017 18.671 0 12.061V12C0 5.35 5.351 0 12 0s12 5.35 12 12c0 6.649-5.351 12-12 12zm0-4.751l.9-.899-.9-3.45-.9 3.45.9.899zm-1.15-.05L10.4 20.9l1.05-1.052-.6-.649zm2.3 0l-.6.601 1.05 1.051-.45-1.652zm.85 3.102L12 20.3l-2 2.001c.65.1 1.3.199 2 .199s1.35-.05 2-.199zM12 1.5C6.201 1.5 1.5 6.201 1.5 12c-.008 4.468 2.825 8.446 7.051 9.899l2.25-8.35c-.511-.372-.809-.968-.801-1.6 0-1.101.9-2.001 2-2.001s2 .9 2 2.001c0 .649-.301 1.2-.801 1.6l2.25 8.35c4.227-1.453 7.06-5.432 7.051-9.899 0-5.799-4.701-10.5-10.5-10.5zm6.85 15.7c-.255.319-.714.385-1.049.15-.313-.207-.4-.628-.194-.941.014-.021.028-.04.044-.06 0 0 1.35-1.799 1.35-4.35s-1.35-4.35-1.35-4.35c-.239-.289-.198-.719.091-.957.02-.016.039-.031.06-.044.335-.235.794-.169 1.049.15.1.101 1.65 2.15 1.65 5.2S18.949 17.1 18.85 17.2zm-3.651-1.95c-.3-.3-.249-.85.051-1.15 0 0 .75-.799.75-2.1s-.75-2.051-.75-2.1c-.3-.301-.3-.801-.051-1.15.232-.303.666-.357.969-.125.029.022.056.047.082.074C16.301 8.75 17.5 10 17.5 12s-1.199 3.25-1.25 3.301c-.301.299-.75.25-1.051-.051zm-6.398 0c-.301.301-.75.35-1.051.051C7.699 15.199 6.5 14 6.5 12s1.199-3.199 1.25-3.301c.301-.299.801-.299 1.051.051.3.3.249.85-.051 1.15 0 .049-.75.799-.75 2.1s.75 2.1.75 2.1c.3.3.351.799.051 1.15zm-2.602 2.101c-.335.234-.794.169-1.05-.15C5.051 17.1 3.5 15.05 3.5 12s1.551-5.1 1.649-5.2c.256-.319.715-.386 1.05-.15.313.206.4.628.194.941-.013.02-.028.04-.043.059C6.35 7.65 5 9.449 5 12s1.35 4.35 1.35 4.35c.25.3.15.75-.151 1.001z" />
+</svg>
+{{- else if (eq $icon_name "patreon") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 569 546" fill="currentColor" stroke="none">
+    <g>
+        <circle cx="362.589996" cy="204.589996" data-fill="1" r="204.589996"></circle>
+        <rect data-fill="1" height="545.799988" width="100" x="0" y="0"></rect>
+    </g>
+</svg>
+{{- else if (eq $icon_name "paypal") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M7.144 19.532l1.049-5.751c.11-.606.691-1.002 1.304-.948 2.155.192 6.877.1 8.818-4.002 2.554-5.397-.59-7.769-6.295-7.769H7.43a1.97 1.97 0 0 0-1.944 1.655L2.77 19.507a.857.857 0 0 0 .846.994h2.368a1.18 1.18 0 0 0 1.161-.969zM7.967 22.522a.74.74 0 0 0 .666.416h2.313c.492 0 .923-.351 1.003-.837l.759-4.601c.095-.523.597-.866 1.127-.819 1.86.166 5.567-.118 6.85-3.821.554-1.6.705-2.954.408-4.018"
+        style="font-variation-settings:normal" stroke="currentColor" stroke-linejoin="miter" />
+</svg>
+{{- else if (eq $icon_name "peertube") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path d="M12 6.545v10.91L20.727 12M3.273 12v12L12 17.455M3.273 0v12L12 6.545" />
+</svg>
+{{- else if or (eq $icon_name "pgpkey") (eq $icon_name "key") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path d="M8 18l2-2h2l1.36-1.36a6.5 6.5 0 1 0-3.997-3.992L2 18v4h4l2-2v-2z" stroke="currentColor" stroke-width="2"
+        stroke-linecap="round" stroke-linejoin="round" />
+    <circle cx="17" cy="7" r="1" stroke="currentColor" stroke-width="2" stroke-linecap="round"
+        stroke-linejoin="round" />
+</svg>
+{{- else if (eq $icon_name "phone") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none">
+    <rect x="9" y="4" width="6" height="1" rx="0.5" fill="currentColor" />
+    <path
+        d="M12 20C12.2652 20 12.5196 19.8946 12.7071 19.7071C12.8946 19.5196 13 19.2652 13 19C13 18.7348 12.8946 18.4804 12.7071 18.2929C12.5196 18.1054 12.2652 18 12 18C11.7348 18 11.4804 18.1054 11.2929 18.2929C11.1054 18.4804 11 18.7348 11 19C11 19.2652 11.1054 19.5196 11.2929 19.7071C11.4804 19.8946 11.7348 20 12 20Z"
+        fill="currentColor" />
+    <rect x="5" y="1" width="14" height="22" rx="2" stroke="currentColor" stroke-width="2" />
+</svg>
+{{- else if (eq $icon_name "pinterest") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="M12.017 0C5.396 0 .029 5.367.029 11.987c0 5.079 3.158 9.417 7.618 11.162-.105-.949-.199-2.403.041-3.439.219-.937 1.406-5.957 1.406-5.957s-.359-.72-.359-1.781c0-1.663.967-2.911 2.168-2.911 1.024 0 1.518.769 1.518 1.688 0 1.029-.653 2.567-.992 3.992-.285 1.193.6 2.165 1.775 2.165 2.128 0 3.768-2.245 3.768-5.487 0-2.861-2.063-4.869-5.008-4.869-3.41 0-5.409 2.562-5.409 5.199 0 1.033.394 2.143.889 2.741.099.12.112.225.085.345-.09.375-.293 1.199-.334 1.363-.053.225-.172.271-.401.165-1.495-.69-2.433-2.878-2.433-4.646 0-3.776 2.748-7.252 7.92-7.252 4.158 0 7.392 2.967 7.392 6.923 0 4.135-2.607 7.462-6.233 7.462-1.214 0-2.354-.629-2.758-1.379l-.749 2.848c-.269 1.045-1.004 2.352-1.498 3.146 1.123.345 2.306.535 3.55.535 6.607 0 11.985-5.365 11.985-11.987C23.97 5.39 18.592.026 11.985.026L12.017 0z" />
+</svg>
+{{- else if (eq $icon_name "pixelfed") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <path id="pixelfed"
+        d="m12 .99649c-6.077 0-11.004 4.9264-11.004 11.004 0 6.077 4.9264 11.004 11.004 11.004 6.077 0 11.004-4.9264 11.004-11.004 0-6.077-4.9264-11.004-11.004-11.004zm-1.7683 6.7017h2.9133c1.9016 1e-6 3.4428 1.5006 3.4428 3.3518 0 1.8512-1.5414 3.3526-3.4428 3.3526h-2.0185l-2.8816 2.756v-7.5262c0-1.068.8896-1.9342 1.9867-1.9342z"
+        fill="none" stroke="currentColor" stroke-width="1.993" />
+</svg>
+{{- else if (eq $icon_name "pleroma") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M6.36 0A1.868 1.868 0 004.49 1.868V24h5.964V0zm7.113 0v12h4.168a1.868 1.868 0 001.868-1.868V0zm0 18.036V24h4.168a1.868 1.868 0 001.868-1.868v-4.096Z" />
+</svg>
+{{- else if (eq $icon_name "pocketcasts") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M12,0C5.372,0,0,5.372,0,12c0,6.628,5.372,12,12,12c6.628,0,12-5.372,12-12 C24,5.372,18.628,0,12,0z M15.564,12c0-1.968-1.596-3.564-3.564-3.564c-1.968,0-3.564,1.595-3.564,3.564 c0,1.968,1.595,3.564,3.564,3.564V17.6c-3.093,0-5.6-2.507-5.6-5.6c0-3.093,2.507-5.6,5.6-5.6c3.093,0,5.6,2.507,5.6,5.6H15.564z M19,12c0-3.866-3.134-7-7-7c-3.866,0-7,3.134-7,7c0,3.866,3.134,7,7,7v2.333c-5.155,0-9.333-4.179-9.333-9.333 c0-5.155,4.179-9.333,9.333-9.333c5.155,0,9.333,4.179,9.333,9.333H19z" />
+</svg>
+{{- else if (eq $icon_name "printables") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path d="M3.678 4.8 12 9.6v9.6l8.322-4.8V4.8L12 0ZM12 19.2l-8.322-4.8V24Z" />
+</svg>
+{{- else if (eq $icon_name "qq") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path transform="scale(0.04) translate(75 40)" stroke-width="50"
+        d="M433.754 420.445c-11.526 1.393-44.86-52.741-44.86-52.741 0 31.345-16.136 72.247-51.051 101.786 16.842 5.192 54.843 19.167 45.803 34.421-7.316 12.343-125.51 7.881-159.632 4.037-34.122 3.844-152.316 8.306-159.632-4.037-9.045-15.25 28.918-29.214 45.783-34.415-34.92-29.539-51.059-70.445-51.059-101.792 0 0-33.334 54.134-44.859 52.741-5.37-.65-12.424-29.644 9.347-99.704 10.261-33.024 21.995-60.478 40.144-105.779C60.683 98.063 108.982.006 224 0c113.737.006 163.156 96.133 160.264 214.963 18.118 45.223 29.912 72.85 40.144 105.778 21.768 70.06 14.716 99.053 9.346 99.704z">
+    </path>
+</svg>
+{{- else if (eq $icon_name "reddit") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="1">
+    <path
+        d="M24 11.779c0-1.459-1.192-2.645-2.657-2.645-.715 0-1.363.286-1.84.746-1.81-1.191-4.259-1.949-6.971-2.046l1.483-4.669 4.016.941-.006.058c0 1.193.975 2.163 2.174 2.163 1.198 0 2.172-.97 2.172-2.163s-.975-2.164-2.172-2.164c-.92 0-1.704.574-2.021 1.379l-4.329-1.015c-.189-.046-.381.063-.44.249l-1.654 5.207c-2.838.034-5.409.798-7.3 2.025-.474-.438-1.103-.712-1.799-.712-1.465 0-2.656 1.187-2.656 2.646 0 .97.533 1.811 1.317 2.271-.052.282-.086.567-.086.857 0 3.911 4.808 7.093 10.719 7.093s10.72-3.182 10.72-7.093c0-.274-.029-.544-.075-.81.832-.447 1.405-1.312 1.405-2.318zm-17.224 1.816c0-.868.71-1.575 1.582-1.575.872 0 1.581.707 1.581 1.575s-.709 1.574-1.581 1.574-1.582-.706-1.582-1.574zm9.061 4.669c-.797.793-2.048 1.179-3.824 1.179l-.013-.003-.013.003c-1.777 0-3.028-.386-3.824-1.179-.145-.144-.145-.379 0-.523.145-.145.381-.145.526 0 .65.647 1.729.961 3.298.961l.013.003.013-.003c1.569 0 2.648-.315 3.298-.962.145-.145.381-.144.526 0 .145.145.145.379 0 .524zm-.189-3.095c-.872 0-1.581-.706-1.581-1.574 0-.868.709-1.575 1.581-1.575s1.581.707 1.581 1.575-.709 1.574-1.581 1.574z" />
+</svg>
+{{- else if (eq $icon_name "raycast") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" fill="currentColor">
+    <path fill-rule="evenodd" clip-rule="evenodd"
+        d="M934.302 511.971L890.259 556.017L723.156 388.902V300.754L934.302 511.971ZM511.897 89.5373L467.854 133.583L634.957 300.698H723.099L511.897 89.5373ZM417.334 184.275L373.235 228.377L445.776 300.923H533.918L417.334 184.275ZM723.099 490.061V578.209L795.641 650.755L839.74 606.652L723.099 490.061ZM697.868 653.965L723.099 628.732H395.313V300.754L370.081 325.987L322.772 278.675L278.56 322.833L325.869 370.146L300.638 395.379V446.071L228.097 373.525L183.997 417.627L300.638 534.275V634.871L133.59 467.925L89.4912 512.027L511.897 934.461L555.996 890.359L388.892 723.244H489.875L606.516 839.892L650.615 795.79L578.074 723.244H628.762L653.994 698.011L701.303 745.323L745.402 701.221L697.868 653.965Z" />
+</svg>
+{{- else if (eq $icon_name "researchgate") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M19.586 0c-.818 0-1.508.19-2.073.565-.563.377-.97.936-1.213 1.68a3.193 3.193 0 0 0-.112.437 8.365 8.365 0 0 0-.078.53 9 9 0 0 0-.05.727c-.01.282-.013.621-.013 1.016a31.121 31.123 0 0 0 .014 1.017 9 9 0 0 0 .05.727 7.946 7.946 0 0 0 .077.53h-.005a3.334 3.334 0 0 0 .113.438c.245.743.65 1.303 1.214 1.68.565.376 1.256.564 2.075.564.8 0 1.536-.213 2.105-.603.57-.39.94-.916 1.175-1.65.076-.235.135-.558.177-.93a10.9 10.9 0 0 0 .043-1.207v-.82c0-.095-.047-.142-.14-.142h-3.064c-.094 0-.14.047-.14.141v.956c0 .094.046.14.14.14h1.666c.056 0 .084.03.084.086 0 .36 0 .62-.036.865-.038.244-.1.447-.147.606-.108.385-.348.664-.638.876-.29.212-.738.35-1.227.35-.545 0-.901-.15-1.21-.353-.306-.203-.517-.454-.67-.915a3.136 3.136 0 0 1-.147-.762 17.366 17.367 0 0 1-.034-.656c-.01-.26-.014-.572-.014-.939a26.401 26.403 0 0 1 .014-.938 15.821 15.822 0 0 1 .035-.656 3.19 3.19 0 0 1 .148-.76 1.89 1.89 0 0 1 .742-1.01c.344-.244.593-.352 1.137-.352.508 0 .815.096 1.144.303.33.207.528.492.764.925.047.094.111.118.198.07l1.044-.43c.075-.048.09-.115.042-.199a3.549 3.549 0 0 0-.466-.742 3 3 0 0 0-.679-.607 3.313 3.313 0 0 0-.903-.41A4.068 4.068 0 0 0 19.586 0zM8.217 5.836c-1.69 0-3.036.086-4.297.086-1.146 0-2.291 0-3.007-.029v.831l1.088.2c.744.144 1.174.488 1.174 2.264v11.288c0 1.777-.43 2.12-1.174 2.263l-1.088.2v.832c.773-.029 2.12-.086 3.465-.086 1.29 0 2.951.057 3.667.086v-.831l-1.49-.2c-.773-.115-1.174-.487-1.174-2.264v-4.784c.688.057 1.29.057 2.206.057 1.748 3.123 3.41 5.472 4.355 6.56.86 1.032 2.177 1.691 3.839 1.691.487 0 1.003-.086 1.318-.23v-.744c-1.031 0-2.063-.716-2.808-1.518-1.26-1.376-2.95-3.582-4.355-6.074 2.32-.545 4.04-2.722 4.04-4.9 0-3.208-2.492-4.698-5.758-4.698zm-.515 1.29c2.406 0 3.839 1.26 3.839 3.552 0 2.263-1.547 3.782-4.097 3.782-.974 0-1.404-.03-2.063-.086v-7.19c.66-.059 1.547-.059 2.32-.059z" />
+</svg>
+{{- else if (eq $icon_name "rootme") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="6.97 3.98 22.02 28.02" fill="currentColor" stroke="currentColor">
+    <path
+        d="m28.9 16.5c0.2-1.9-0.2-3.8-1-5.6-1.4-2.9-4-5.1-7.1-5.9-0.2 0-0.4-0.2-0.5-0.4-0.3-0.4-0.7-0.6-1.2-0.6-0.5 0.1-0.9 0.5-0.9 0.9-0.1 0.5 0.2 1 0.6 1.2 0.2 0.1 0.2 0.3 0.2 0.5v3.6c0 0.4 0.1 0.4 0.4 0.3l1.3-0.5h0.1c0.3-0.1 0.6 0.2 0.7 0.5v1.5c0 0.1-0.1 0.2-0.1 0.3-0.8 0.9-1.7 1.8-2.7 2.5l-0.2 0.2c-0.3-0.9-0.7-1.7-1.1-2.5-0.1-0.2-0.1-0.4 0-0.5 0.2-0.3 0.2-0.7 0-1s-0.6-0.4-1-0.3c-0.3 0.1-0.6 0.4-0.6 0.8s0.2 0.7 0.6 0.8c0.2 0 0.4 0.2 0.4 0.4 0 0.1 0.1 0.2 0.2 0.4l1 2.4-2.2 1.4h-0.3c-0.9-0.3-1.8-0.5-2.7-0.8-0.6-0.3-1.2-0.2-1.8 0.1-0.1 0.1-0.3 0.1-0.5 0-0.3-0.3-0.8-0.3-1.1 0-0.3 0.2-0.4 0.7-0.2 1 0.1 0.4 0.5 0.6 0.9 0.5 0.4 0 0.7-0.4 0.8-0.8v-0.2c0.4-0.1 0.8-0.4 1.1-0.4 1 0.2 2 0.6 3 0.9v0.1c-1.8 1-3.6 1.8-5.5 2.5-0.4 0.1-0.8-0.1-1-0.5-0.6-1.8-0.8-3.6-0.5-5.3 0-0.3 0.1-0.3 0.4-0.3h4.2c0.2 0 0.4 0.1 0.4 0.2 0.2 0.3 0.6 0.5 1 0.4s0.6-0.5 0.6-0.8c0-0.4-0.3-0.7-0.6-0.8-0.4-0.1-0.7 0.1-0.9 0.4-0.1 0.2-0.2 0.2-0.4 0.2h-4.4v-0.1-0.3c1-3.4 3.7-6.1 7.2-7 0.1 0 0.3 0 0.4 0.1 0.3 0.4 0.9 0.5 1.4 0.2 0.4-0.2 0.7-0.7 0.6-1.2-0.1-0.6-0.7-1-1.3-0.9-0.4 0.1-0.7 0.3-0.9 0.7l-0.3 0.3c-4.2 0.9-7.4 4.3-8.2 8.5-0.4 2-0.2 4 0.5 5.9 0.1 0.2 0.1 0.4 0 0.5-0.3 0.5-0.1 1.2 0.4 1.4 0.2 0.1 0.2 0.2 0.2 0.4v3.9c0 0.2 0.1 0.4 0.3 0.6 1 0.7 2.1 1.4 3.1 2.2 0.2 0.1 0.3 0.3 0.3 0.5v2.4c0 0.5 0.1 0.6 0.6 0.6h10.8c0.4 0 0.6-0.2 0.6-0.6v-2.4c0-0.2 0.1-0.4 0.2-0.5 1-0.7 2.1-1.4 3.1-2.2 0.2-0.1 0.3-0.4 0.3-0.6v-3.7c0-0.2 0.1-0.4 0.2-0.5 0.5-0.3 0.6-0.9 0.3-1.4-0.1-0.2-0.1-0.4 0-0.5 0.5-1 0.7-2.1 0.8-3.1zm-12.2-11.9c0.3 0 0.5 0.3 0.5 0.5 0 0.3-0.2 0.5-0.5 0.5s-0.5-0.2-0.5-0.5 0.2-0.5 0.5-0.5zm2.6 1c-0.3 0-0.5-0.2-0.5-0.5s0.2-0.5 0.5-0.5 0.5 0.3 0.4 0.6c0 0.2-0.2 0.4-0.4 0.4zm1.5 3.7c0 0.1-0.1 0.2-0.1 0.2l-1.3 0.5v-3.6c0.3-0.3 0.7-0.5 1.1-0.6 1 0.3 2 0.7 2.9 1.3 0.1 0.1 0.2 0.2 0.2 0.3-0.1 1.5-0.7 3-1.6 4.2v-1.1c0-0.1 0.1-0.2 0.2-0.2 0.4-0.2 0.5-0.6 0.4-1s-0.5-0.6-0.9-0.6c-0.4-0.1-0.8 0.2-0.9 0.6zm-12.1 11.8c-0.3 0-0.5-0.2-0.5-0.5s0.3-0.5 0.5-0.5c0.3 0 0.6 0.2 0.6 0.4 0 0.3-0.2 0.6-0.4 0.6 0 0.1-0.1 0.1-0.2 0zm19-0.5c0 0.3-0.2 0.5-0.5 0.5s-0.5-0.3-0.5-0.5c0-0.3 0.2-0.5 0.5-0.5h0.1c0.2 0 0.4 0.2 0.4 0.5zm-0.3-1.3c0 0.2-0.2 0.3-0.3 0.3-0.4 0-0.8 0.3-0.9 0.8-0.2 0.5 0 1 0.5 1.3 0.2 0.1 0.3 0.3 0.3 0.5v3.4c0 0.2-0.1 0.4-0.3 0.5l-3.1 2.2c-0.2 0.1-0.4 0.4-0.4 0.7v2c0 0.4-0.1 0.4-0.5 0.4h-0.9-0.1c-0.2 0-0.3-0.2-0.3-0.4v-0.7c0-0.2-0.1-0.4-0.4-0.5h-0.1c-0.2 0-0.4 0.2-0.4 0.5v0.7c0 0.2-0.1 0.4-0.4 0.4h-1.4c-0.3 0-0.4-0.1-0.4-0.4v-1.1c0-0.3-0.2-0.5-0.4-0.5-0.3 0-0.4 0.2-0.4 0.5v1.1c0 0.3-0.1 0.4-0.4 0.4h-1.3c-0.3 0-0.4-0.1-0.4-0.4v-1c0-0.2-0.2-0.4-0.4-0.4s-0.4 0.2-0.4 0.5v0.7s-0.1 0.4-0.4 0.4h-1c-0.3 0-0.4-0.1-0.4-0.4v-2c0-0.3-0.1-0.6-0.4-0.8l-3-2.1c-0.2-0.1-0.2-0.3-0.2-0.5v-3.6c0-0.1 0.1-0.3 0.2-0.4 0.3-0.2 0.4-0.5 0.4-0.8 0-0.2 0.1-0.3 0.3-0.4 3-1.1 5.8-2.6 8.4-4.4 1.9-1.3 3.5-2.9 4.7-4.9 0.3-0.5 0.5-1 0.7-1.6 0.2-0.5 0.3-1.1 0.4-1.7 0.1 0.1 0.3 0.2 0.4 0.4 1.7 1.5 2.8 3.6 3.2 5.8 0.1 0.7-0.1 1.5-0.4 2.1-0.7 1.5-1.8 2.7-3.1 3.6-1.9 1.4-4.1 2.6-6.3 3.4-0.2 0.1-0.4 0.1-0.6 0-1.9-0.4-3.8-0.9-5.6-1.6l-0.2-0.1v0.1c0.2 0.2 0.5 0.4 0.7 0.6 0.2 0.1 0.3 0.3 0.2 0.5-0.1 0.4-0.1 0.7 0 1.1 0.3 1.2 1.6 1.9 2.8 1.6 0.6-0.1 1.2-0.6 1.5-1.2 0.1-0.2 0.3-0.3 0.5-0.3 0.4 0 0.8 0.2 1.1 0.5 0.4 0.5 0.9 0.9 1.4 1.4s1.2 0.6 1.8 0.2c0.9-0.5 1.9-1.1 2.8-1.6 0.3-0.2 0.5-0.5 0.5-0.9v-3c0-0.1 0-0.2 0.1-0.3 0.5-0.5 1-0.9 1.4-1.4 0.5-0.5 0.8-1 1.3-1.5 0 0.9-0.2 1.6-0.4 2.3zm-11.2 4.5c-0.3 0.6-0.9 0.8-1.5 0.6-0.7-0.2-1.1-0.8-1.1-1.6l2.6 1z">
+    </path>
+    <path
+        d="m16.8 7.4c-0.4 0-0.7 0.2-0.9 0.6l-0.3 0.3c-0.4 0.2-0.9 0.3-1.3 0.5-0.2 0-0.3 0.2-0.3 0.4v0.9h-1c-0.2 0-0.3-0.1-0.4-0.2-0.2-0.3-0.6-0.5-1-0.4-0.3 0.1-0.6 0.4-0.6 0.8s0.3 0.7 0.6 0.8c0.4 0.1 0.8-0.1 1-0.4 0.1-0.1 0.2-0.2 0.4-0.2h1.2c0.2 0 0.3-0.1 0.3-0.3v-0.8c0-0.2 0.1-0.3 0.2-0.3l1-0.4c0.2-0.1 0.3-0.1 0.4 0.1 0.3 0.3 0.7 0.4 1 0.2s0.5-0.6 0.4-1c0-0.4-0.3-0.6-0.7-0.6z">
+    </path>
+    <path
+        d="m18.3 26.4c-0.2-0.3-0.4-0.3-0.6 0s-0.5 0.7-0.8 1-0.2 0.4 0 0.5 0.4 0.1 0.5-0.1c0.2-0.2 0.5-0.3 0.8-0.2 0.2 0.1 0.3 0.2 0.4 0.3h0.4c0.1 0 0.1-0.2 0.2-0.3-0.1-0.1-0.1-0.2-0.2-0.3l-0.7-0.9z">
+    </path>
+</svg>
+{{- else if (eq $icon_name "rss") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path d="M4 11a9 9 0 0 1 9 9" />
+    <path d="M4 4a16 16 0 0 1 16 16" />
+    <circle cx="5" cy="19" r="1" />
+</svg>
+{{- else if (eq $icon_name "serverfault") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M24 18.185v2.274h-4.89v-2.274H24zm-24-.106h11.505v2.274H0v-2.279.005zm12.89 0h4.89v2.274h-4.89v-2.279.005zm6.221-3.607H24v2.274h-4.89l.001-2.274zM0 14.367h11.505v2.274H0v-2.274zm12.89 0h4.89v2.274h-4.89v-2.274zm6.221-3.346H24v2.273h-4.89l.001-2.273zM0 10.916h11.505v2.271H0v-2.271zm12.89 0h4.89v2.271h-4.89v-2.271zm6.22-3.609H24v2.279h-4.89V7.307zM0 7.206h11.505V9.48H0V7.201v.005zm12.89 0h4.89V9.48h-4.89V7.201v.005zm6.221-3.556H24v2.276h-4.89v-2.28l.001.004zM0 3.541h11.505v2.274H0V3.541zm12.89 0h4.89v2.274h-4.89V3.541z" />
+</svg>
+{{- else if (eq $icon_name "sessionmessenger") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="M8.7 14.1c-1.4-.8-2.7-1.5-4.1-2.3C2.2 10.3 1 8.2 1.3 5.3 1.6 2.3 4.1.1 7.1 0h11c2.6 0 4.6 2.2 4.7 4.7 0 2.6-2 4.8-4.6 4.9h-2.8v.2c.2.2.5.3.7.5 1.2.7 2.4 1.3 3.6 2 2.5 1.5 3.7 4.5 2.9 7.2-.8 2.7-3.1 4.3-6.1 4.4H5.9c-2.4 0-4.3-1.9-4.6-4.3-.3-2.3 1.2-4.5 3.5-5.1.6-.1 1.2-.1 1.7-.2h2.1s.1-.1.1-.2zm4.2-3.8c-.1.3-.2.3-.2.4v3.9c0 1.1-.1 1.2-1.2 1.2H6.4c-.4 0-.9 0-1.3.1-1.6.4-2.5 1.9-2.4 3.6.2 1.6 1.6 2.9 3.3 2.9h10.5c2.1 0 3.8-1.2 4.5-3.1.7-1.8.2-4.1-1.5-5.3-2-1.3-4.3-2.4-6.6-3.7zm-1.6 3.4v-4c0-1.4.1-1.5 1.4-1.5H18c1.5 0 2.7-1 3.1-2.4.6-2.2-1-4.2-3.4-4.3H7.6c-2.4 0-4.3 1.3-4.9 3.4-.6 2.1.4 4.4 2.5 5.5 1.7 1 3.5 1.9 5.2 2.9.3.2.5.2.9.4z">
+    </path>
+</svg>
+{{- else if (eq $icon_name "shutterstock") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <rect ry="5" rx="5" height="20" width="20" y="2" x="2" />
+    <path d="M7.728 11.725V9.032c0-1.025.824-1.85 1.849-1.85h2.815m3.88 5.093v2.693a1.845 1.845 0 0 1-1.849 1.85h-2.815"
+        stroke-linecap="square" stroke-linejoin="miter" />
+</svg>
+{{- else if (eq $icon_name "signal") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M 9.205253,0.64464814 9.4662637,1.7114982 A 10.69287,10.709597 0 0 0 6.5207075,2.9288165 L 5.9607465,1.9848669 A 11.571737,11.589837 0 0 1 9.2037889,0.64464631 Z m 5.624738,0.006259 -0.261912,1.06479996 a 10.69287,10.709597 0 0 1 2.942841,1.2238818 l 0.569383,-0.942681 A 11.718214,11.736545 0 0 0 14.829991,0.65091737 M 1.9779914,5.962053 A 11.718214,11.736545 0 0 0 0.63264603,9.2101106 l 1.06459877,0.26526 A 10.69287,10.709597 0 0 1 2.9192147,6.5279236 L 1.977993,5.9605859 Z M 1.3853391,12.02919 A 10.253437,10.269476 0 0 1 1.5057569,10.436088 L 0.42200799,10.267633 a 11.718214,11.736545 0 0 0 -0.003916,3.518027 L 1.5022097,13.622556 A 10.253437,10.269476 0 0 1 1.3853328,12.02919 m 16.6638462,10.065061 -0.561432,-0.93955 a 10.546392,10.56289 0 0 1 -2.941159,1.215857 l 0.262471,1.068318 a 11.718214,11.736545 0 0 0 3.24012,-1.344625 m 4.576868,-10.041387 q -8.91e-4,0.802487 -0.121883,1.593101 l 1.08375,0.165521 a 11.718214,11.736545 0 0 0 0.004,-3.518028 l -1.084119,0.166038 q 0.119225,0.79235 0.118342,1.593368 m 0.752698,2.814677 -1.066064,-0.26526 a 10.69287,10.709597 0 0 1 -1.221974,2.950381 l 0.94122,0.568806 a 11.718214,11.736545 0 0 0 1.346818,-3.253927 m -9.79326,7.691197 c -1.054817,0.160202 -2.128499,0.159006 -3.182958,-0.0036 l -0.165266,1.088381 a 11.718214,11.736545 0 0 0 3.509604,0.0041 L 13.584073,22.5603 Z m 6.962359,-4.199793 a 10.546392,10.56289 0 0 1 -2.25386,2.247973 l 0.652304,0.888303 A 11.718214,11.736545 0 0 0 21.4319,19.02011 Z M 18.313014,3.4847756 c 0.85912,0.6347312 1.617028,1.3955177 2.248854,2.2573915 L 21.447327,5.0829729 A 11.718214,11.736545 0 0 0 18.974613,2.5994032 Z M 3.4620766,5.7231078 A 10.546392,10.56289 0 0 1 5.7159424,3.470735 L 5.0577779,2.5838917 A 11.718214,11.736545 0 0 0 2.5780872,5.0604744 l 0.883991,0.6611664 z M 22.046886,5.9829545 21.102939,6.5496581 c 0.551205,0.9145983 0.961703,1.9082613 1.215422,2.9457616 L 23.385012,9.232537 A 11.718214,11.736545 0 0 0 22.046886,5.9829545 M 10.424439,1.5218471 a 10.69287,10.709597 0 0 1 3.181491,0.00355 l 0.165262,-1.08545108 a 11.718214,11.736545 0 0 0 -3.509603,-0.003905 z M 4.0067175,21.77345 1.7401226,22.299069 2.2699667,20.027168 1.2024224,19.776577 0.67111487,22.047008 A 1.0985825,1.1003011 0 0 0 1.987943,23.371772 L 4.2559977,22.850556 Z M 1.4305532,18.795363 2.5024951,19.043026 2.8704383,17.469271 A 10.546392,10.56289 0 0 1 1.6901058,14.58223 l -1.06518556,0.262884 a 11.718214,11.736545 0 0 0 1.07497456,2.791564 l -0.2708065,1.158683 z m 5.1240697,2.386763 -1.572112,0.365015 0.2478202,1.072705 1.157473,-0.268651 c 0.8783321,0.480709 1.8139217,0.844118 2.7848026,1.084332 L 9.4374532,22.367798 A 10.546392,10.56289 0 0 1 6.5648844,21.174803 Z M 12.01556,2.5050896 A 9.5210486,9.5359425 0 0 0 2.4868473,12.033352 9.5210486,9.5359425 0 0 0 3.9430616,17.103698 L 3.0232278,21.016812 6.9278739,20.104246 A 9.5239783,9.5388766 0 0 0 17.096701,3.9778221 9.5210486,9.5359425 0 0 0 12.01556,2.5050896" />
+</svg>
+{{- else if (eq $icon_name "sketchfab") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2000 2000" fill="currentColor">
+    <path
+        d="m1000 0c-552.32 0-1000 447.72-1000 1000s447.68 1000 1000 1000 1000-447.72 1000-1000-447.6-1000-1000-1000zm-86.88 1595.07-431.12-248.86v-502l431.12 232.79zm76.8-636.19-510.08-270.38 510.08-294.5 510.16 294.5zm510.48 388.29-429.52 248v-516.17l429.52-232z" />
+</svg>
+{{- else if (eq $icon_name "slack") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path d="M22.08 9C19.81 1.41 16.54-.35 9 1.92S-.35 7.46 1.92 15 7.46 24.35 15 22.08 24.35 16.54 22.08 9z"></path>
+    <line x1="12.57" y1="5.99" x2="16.15" y2="16.39"></line>
+    <line x1="7.85" y1="7.61" x2="11.43" y2="18.01"></line>
+    <line x1="16.39" y1="7.85" x2="5.99" y2="11.43"></line>
+    <line x1="18.01" y1="12.57" x2="7.61" y2="16.15"></line>
+</svg>
+{{- else if (eq $icon_name "snapchat") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M12.206.793c.99 0 4.347.276 5.93 3.821.529 1.193.403 3.219.299 4.847l-.003.06c-.012.18-.022.345-.03.51.075.045.203.09.401.09.3-.016.659-.12 1.033-.301.165-.088.344-.104.464-.104.182 0 .359.029.509.09.45.149.734.479.734.838.015.449-.39.839-1.213 1.168-.089.029-.209.075-.344.119-.45.135-1.139.36-1.333.81-.09.224-.061.524.12.868l.015.015c.06.136 1.526 3.475 4.791 4.014.255.044.435.27.42.509 0 .075-.015.149-.045.225-.24.569-1.273.988-3.146 1.271-.059.091-.12.375-.164.57-.029.179-.074.36-.134.553-.076.271-.27.405-.555.405h-.03c-.135 0-.313-.031-.538-.074-.36-.075-.765-.135-1.273-.135-.3 0-.599.015-.913.074-.6.104-1.123.464-1.723.884-.853.599-1.826 1.288-3.294 1.288-.06 0-.119-.015-.18-.015h-.149c-1.468 0-2.427-.675-3.279-1.288-.599-.42-1.107-.779-1.707-.884-.314-.045-.629-.074-.928-.074-.54 0-.958.089-1.272.149-.211.043-.391.074-.54.074-.374 0-.523-.224-.583-.42-.061-.192-.09-.389-.135-.567-.046-.181-.105-.494-.166-.57-1.918-.222-2.95-.642-3.189-1.226-.031-.063-.052-.15-.055-.225-.015-.243.165-.465.42-.509 3.264-.54 4.73-3.879 4.791-4.02l.016-.029c.18-.345.224-.645.119-.869-.195-.434-.884-.658-1.332-.809-.121-.029-.24-.074-.346-.119-1.107-.435-1.257-.93-1.197-1.273.09-.479.674-.793 1.168-.793.146 0 .27.029.383.074.42.194.789.3 1.104.3.234 0 .384-.06.465-.105l-.046-.569c-.098-1.626-.225-3.651.307-4.837C7.392 1.077 10.739.807 11.727.807l.419-.015h.06z" />
+</svg>
+{{- else if (eq $icon_name "soundcloud") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="M1.175 12.225c-.051 0-.094.046-.101.1l-.233 2.154.233 2.105c.007.058.05.098.101.098.05 0 .09-.04.099-.098l.255-2.105-.27-2.154c0-.057-.045-.1-.09-.1m-.899.828c-.06 0-.091.037-.104.094L0 14.479l.165 1.308c0 .055.045.094.09.094s.089-.045.104-.104l.21-1.319-.21-1.334c0-.061-.044-.09-.09-.09m1.83-1.229c-.061 0-.12.045-.12.104l-.21 2.563.225 2.458c0 .06.045.12.119.12.061 0 .105-.061.121-.12l.254-2.474-.254-2.548c-.016-.06-.061-.12-.121-.12m.945-.089c-.075 0-.135.06-.15.135l-.193 2.64.21 2.544c.016.077.075.138.149.138.075 0 .135-.061.15-.15l.24-2.532-.24-2.623c0-.075-.06-.135-.135-.135l-.031-.017zm1.155.36c-.005-.09-.075-.149-.159-.149-.09 0-.158.06-.164.149l-.217 2.43.2 2.563c0 .09.075.157.159.157.074 0 .148-.068.148-.158l.227-2.563-.227-2.444.033.015zm.809-1.709c-.101 0-.18.09-.18.181l-.21 3.957.187 2.563c0 .09.08.164.18.164.094 0 .174-.09.18-.18l.209-2.563-.209-3.972c-.008-.104-.088-.18-.18-.18m.959-.914c-.105 0-.195.09-.203.194l-.18 4.872.165 2.548c0 .12.09.209.195.209.104 0 .194-.089.21-.209l.193-2.548-.192-4.856c-.016-.12-.105-.21-.21-.21m.989-.449c-.121 0-.211.089-.225.209l-.165 5.275.165 2.52c.014.119.104.225.225.225.119 0 .225-.105.225-.225l.195-2.52-.196-5.275c0-.12-.105-.225-.225-.225m1.245.045c0-.135-.105-.24-.24-.24-.119 0-.24.105-.24.24l-.149 5.441.149 2.503c.016.135.121.24.256.24s.24-.105.24-.24l.164-2.503-.164-5.456-.016.015zm.749-.134c-.135 0-.255.119-.255.254l-.15 5.322.15 2.473c0 .15.12.255.255.255s.255-.12.255-.27l.15-2.474-.165-5.307c0-.148-.12-.27-.271-.27m1.005.166c-.164 0-.284.135-.284.285l-.103 5.143.135 2.474c0 .149.119.277.284.277.149 0 .271-.12.284-.285l.121-2.443-.135-5.112c-.012-.164-.135-.285-.285-.285m1.184-.945c-.045-.029-.105-.044-.165-.044s-.119.015-.165.044c-.09.054-.149.15-.149.255v.061l-.104 6.048.115 2.449v.008c.008.06.03.135.074.18.058.061.142.104.234.104.08 0 .158-.044.209-.09.058-.06.091-.135.091-.225l.015-.24.117-2.203-.135-6.086c0-.104-.061-.193-.135-.239l-.002-.022zm1.006-.547c-.045-.045-.09-.061-.15-.061-.074 0-.149.016-.209.061-.075.061-.119.15-.119.24v.029l-.137 6.609.076 1.215.061 1.185c0 .164.148.314.328.314.181 0 .33-.15.33-.329l.15-2.414-.15-6.637c0-.12-.074-.221-.165-.277m8.934 3.777c-.405 0-.795.086-1.139.232-.24-2.654-2.46-4.736-5.188-4.736-.659 0-1.305.135-1.889.359-.225.09-.27.18-.285.359v9.368c.016.18.15.33.33.345h8.185C22.681 17.218 24 15.914 24 14.28s-1.319-2.952-2.938-2.952" />
+</svg>
+{{- else if (eq $icon_name "sourcehut") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor">
+    <path
+        d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200z">
+    </path>
+</svg>
+{{- else if (eq $icon_name "spacehey") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentcolor" stroke="none" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path d="M17 6m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0" />
+    <path d="M14 20h6v-6a3 3 0 0 0 -6 0v6z" />
+    <path d="M11 8v2.5a3.5 3.5 0 0 1 -3.5 3.5h-.5a3 3 0 0 1 0 -6h4z" />
+</svg>
+{{- else if (eq $icon_name "spotify") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z" />
+</svg>
+{{- else if (eq $icon_name "stackoverflow") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M2.913 16.041v6.848h17.599v-6.848M7.16 18.696h8.925M7.65 13.937l8.675 1.8M9.214 9.124l8.058 3.758M12.086 4.65l6.849 5.66M15.774 1.111l5.313 7.162" />
+</svg>
+{{- else if (eq $icon_name "steam") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="M-24.6 20.8c-1.4-.8-2.7-1.5-4.1-2.3-2.4-1.5-3.6-3.6-3.3-6.5.3-3 2.8-5.2 5.8-5.3h11c2.6 0 4.6 2.2 4.7 4.7 0 2.6-2 4.8-4.6 4.9h-2.8v.2c.2.2.5.3.7.5 1.2.7 2.4 1.3 3.6 2 2.5 1.5 3.7 4.5 2.9 7.2-.8 2.7-3.1 4.3-6.1 4.4h-10.6c-2.4 0-4.3-1.9-4.6-4.3-.3-2.3 1.2-4.5 3.5-5.1.6-.1 1.2-.1 1.7-.2h2.1c.1 0 .1-.1.1-.2zm4.3-3.8c-.1.3-.2.3-.2.4v3.9c0 1.1-.1 1.2-1.2 1.2h-5.1c-.4 0-.9 0-1.3.1-1.6.4-2.5 1.9-2.4 3.6.2 1.6 1.6 2.9 3.3 2.9h10.5c2.1 0 3.8-1.2 4.5-3.1.7-1.8.2-4.1-1.5-5.3-2.1-1.3-4.3-2.4-6.6-3.7zm-1.7 3.4v-4c0-1.4.1-1.5 1.4-1.5h5.3c1.5 0 2.7-1 3.1-2.4.6-2.2-1-4.2-3.4-4.3h-10.1c-2.4 0-4.3 1.3-4.9 3.4-.6 2.1.4 4.4 2.5 5.5 1.7 1 3.5 1.9 5.2 2.9.4.2.6.3.9.4z" />
+    <path
+        d="M53.3 6.9c-.2-1-1-1.7-1.9-2-1.7-.4-8.6-.4-8.6-.4s-6.9 0-8.6.5c-1 .3-1.7 1-1.9 2-.3 1.7-.5 3.5-.5 5.3 0 1.8.1 3.6.5 5.3.3.9 1 1.7 1.9 1.9 1.7.5 8.6.5 8.6.5s6.9 0 8.6-.5c1-.3 1.7-1 1.9-2 .3-1.7.5-3.5.5-5.3 0-1.8-.1-3.6-.5-5.3z" />
+    <path d="m40.6 15.5 5.7-3.3-5.7-3.3z" />
+    <path
+        d="M72.4-9.9c5.5 0 10 4 10 8.9 0 1.8-.8 3.8-2.1 5.4-.9 1-1.5 2.3-1.6 3.7 0-.1-.1-.1-.2-.2-.4-.4-1.1-.7-1.7-.7-.3 0-.5 0-.8.1-1.2.5-2.5.7-3.6.7-5.5 0-10-4-10-8.9s4.5-9 10-9m0-2c-6.6 0-12 4.9-12 10.9s5.4 11 12 11c1.4 0 2.8-.2 4.2-.7h.1c.1 0 .2 0 .3.1 1 1.3 2.5 2.3 4.2 2.7l.2-.1v-.3c-.7-.9-1-1.9-1-3s.4-2.1 1.2-2.9c1.5-1.8 2.6-4.2 2.6-6.7.1-6.1-5.3-11-11.8-11z" />
+    <path
+        d="M72.3-6.5c.1 0 .3.1.3.2l1.2 3.4 3.7.1c.1 0 .3.1.3.2s0 .3-.1.4l-3 2.2 1.1 3.5c0 .1 0 .3-.1.4h-.4l-3-2.1-3 2.1h-.4c-.1-.1-.2-.2-.1-.4L69.9 0l-3-2.2c-.1-.1-.2-.2-.1-.4 0-.1.2-.2.3-.2l3.7-.1L72-6.3c0-.1.2-.2.3-.2zM46.8-20.8c2 0 4 .6 5.6 1.6-.5-.1-1.1-.2-1.6-.2-3.2 0-5.8 2.5-6 5.6l-2.2 3.2c-.5.1-.9.2-1.4.4l-4.7-1.9c.8-5 5.2-8.7 10.3-8.7m9.9 7.2c.3 1 .5 2.1.5 3.3C57.2-4.5 52.5.2 46.7.2c-1.8 0-3.6-.5-5.1-1.3.5.2 1 .2 1.5.2 2.5 0 4.5-1.9 4.8-4.3L51-7.4c3.1-.2 5.6-2.8 5.6-6 .1-.1.1-.1.1-.2M38.3-4.2l.3.2c.1.2.2.5.3.7l-.6-.9m8.5-18.1c-6.3 0-11.5 4.9-12 11l6.4 2.7c.5-.4 1.2-.6 1.9-.6h.2l2.9-4.1v-.1c0-2.5 2-4.5 4.5-4.5s4.5 2 4.5 4.5-2 4.5-4.5 4.5h-.1L46.5-6v.2c0 1.9-1.5 3.4-3.4 3.4-1.6 0-3-1.2-3.3-2.7L35.2-7c1.4 5 6 8.7 11.5 8.7 6.6 0 12-5.4 12-12s-5.3-12-11.9-12z" />
+    <path
+        d="M42.6-4.6 41.5-5c.2.4.5.7 1 .9 1 .4 2.1-.1 2.5-1 .2-.5.2-1 0-1.4-.2-.5-.6-.8-1-1-.5-.2-1-.2-1.4 0l1.1.5c.7.3 1 1.1.7 1.8-.3.6-1.1.9-1.8.6zm8.1-11.5c-1.5 0-2.7 1.2-2.7 2.7 0 1.5 1.2 2.7 2.7 2.7 1.5 0 2.7-1.2 2.7-2.7 0-1.5-1.2-2.7-2.7-2.7zm0 4.7c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2c.1 1.1-.9 2-2 2zM12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.6 0 12 0zm0 22c-4.3 0-8-2.7-9.4-6.5L6.2 17c.3 1.3 1.5 2.4 2.9 2.4 1.6 0 2.9-1.3 2.9-2.9v-.1l3.5-2.5h.1c2.1 0 3.9-1.8 3.9-3.9 0-2.1-1.8-3.9-3.9-3.9-2.2 0-3.9 1.8-3.9 3.9v.1l-2.5 3.6H9c-.6 0-1.2.2-1.7.5L2 11.7C2.2 6.3 6.6 2 12 2c5.5 0 10 4.5 10 10s-4.5 10-10 10zm-2.4-7.1-1.3-.5c.5-.2 1.1-.2 1.6 0s1 .7 1.2 1.2c.2.5.2 1.1 0 1.7-.5 1.1-1.8 1.7-2.9 1.2-.5-.2-.9-.6-1.1-1.1l1.3.5c.2 0 .4.1.6.1.6 0 1.2-.4 1.5-1 .4-.9 0-1.8-.9-2.1zM13 9.8c0-1.5 1.2-2.6 2.6-2.6 1.5 0 2.6 1.2 2.6 2.6 0 1.5-1.2 2.6-2.6 2.6-1.4 0-2.6-1.2-2.6-2.6z" />
+    <path d="M13.7 9.8c0-1.1.9-2 2-2s2 .9 2 2-.9 2-2 2c-1.1-.1-2-.9-2-2z" />
+</svg>
+{{- else if (eq $icon_name "strava") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke-width="2">
+    <path
+        d="M15.387 17.944l-2.089-4.116h-3.065L15.387 24l5.15-10.172h-3.066m-7.008-5.599l2.836 5.598h4.172L10.463 0l-7 13.828h4.169" />
+</svg>
+{{- else if (eq $icon_name "substack") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke-width="2">
+    <path
+        d="M22.539 8.242H1.46V5.406h21.08v2.836zM1.46 10.812V24L12 18.11 22.54 24V10.812H1.46zM22.54 0H1.46v2.836h21.08V0z" />
+</svg>
+{{- else if (eq $icon_name "tableau") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60.3 59.5" fill="currentcolor">
+    <path d="M28.5 40.2h3.3v-9h8.3V28h-8.3v-9h-3.3v9h-8.2v3.2h8.2z" />
+    <path d="M13.2 53.2H16v-8h7.4v-2.5H16v-8.1h-2.8v8.1H5.8v2.5h7.4z" />
+    <path d="M44.3 24.3h2.8v-8h7.5v-2.4h-7.5V5.8h-2.8v8.1h-7.4v2.4h7.4z" />
+    <path d="M29 59.5h2.4v-5.7h5.1v-2.1h-5.1V46H29v5.7h-5v2.1h5z" />
+    <path d="M13.3 24.3h2.6v-8.1h7.5v-2.3h-7.5V5.8h-2.6v8.1H5.8v2.3h7.5z" />
+    <path d="M52.8 36.3h2.4v-5.6h5.1v-2.2h-5.1v-5.6h-2.4v5.6h-5v2.2h5z" />
+    <path clip-rule="evenodd" d="M44.3 53.2h2.8v-8h7.5v-2.5h-7.5v-8.1h-2.8v8.1h-7.4v2.5h7.4z" fill-rule="evenodd" />
+    <path d="M36.1 7.2V5.5h-5V0h-1.8v5.5h-5v1.7h5v5.5h1.8V7.2zM5 35.9h1.8v-5.5h5v-1.7h-5v-5.4H5v5.4H0v1.8l5-.1z" />
+</svg>
+{{- else if (eq $icon_name "telegram") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M21.198 2.433a2.242 2.242 0 0 0-1.022.215l-8.609 3.33c-2.068.8-4.133 1.598-5.724 2.21a405.15 405.15 0 0 1-2.849 1.09c-.42.147-.99.332-1.473.901-.728.968.193 1.798.919 2.286 1.61.516 3.275 1.009 4.654 1.472.509 1.793.997 3.592 1.48 5.388.16.36.506.494.864.498l-.002.018s.281.028.555-.038a2.1 2.1 0 0 0 .933-.517c.345-.324 1.28-1.244 1.811-1.764l3.999 2.952.032.018s.442.311 1.09.355c.324.022.75-.04 1.116-.308.37-.27.613-.702.728-1.196.342-1.492 2.61-12.285 2.997-14.072l-.01.042c.27-1.006.17-1.928-.455-2.474a1.654 1.654 0 0 0-1.034-.407z" />
+</svg>
+{{- else if (eq $icon_name "thingiverse") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M11.955.005C5.425-.152-.091 5.485.007 11.805c-.235 6.756 5.537 12.25 12.052 12.196C18.621 23.9 23.912 18.595 24 12.03 24.031 5.483 18.505-.18 11.955.005zm-.047 1.701a10.276 10.276 0 0 1 7.36 17.529 10.275 10.275 0 0 1-17.556-7.287C1.71 6.308 6.268 1.728 11.907 1.706zm-5.55 4.781c-.322 0-.358.033-.358.361v2.248c0 .351.04.391.398.391h3.823c.274 0 .274.004.274.265v9.736a.176.176 0 0 0 .051.146c.04.038.093.059.148.053h2.555c.247-.003.283-.035.283-.28v-9.32c0-.124.004-.239 0-.39s.055-.21.218-.21h3.9c.319.004.35-.032.35-.344V6.855c0-.34-.024-.363-.37-.363h-5.626z" />
+</svg>
+{{- else if (eq $icon_name "threads") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192" fill="currentColor" stroke="none">
+    <path
+        d="M141.537 88.9883C140.71 88.5919 139.87 88.2104 139.019 87.8451C137.537 60.5382 122.616 44.905 97.5619 44.745C97.4484 44.7443 97.3355 44.7443 97.222 44.7443C82.2364 44.7443 69.7731 51.1409 62.102 62.7807L75.881 72.2328C81.6116 63.5383 90.6052 61.6848 97.2286 61.6848C97.3051 61.6848 97.3819 61.6848 97.4576 61.6855C105.707 61.7381 111.932 64.1366 115.961 68.814C118.893 72.2193 120.854 76.925 121.825 82.8638C114.511 81.6207 106.601 81.2385 98.145 81.7233C74.3247 83.0954 59.0111 96.9879 60.0396 116.292C60.5615 126.084 65.4397 134.508 73.775 140.011C80.8224 144.663 89.899 146.938 99.3323 146.423C111.79 145.74 121.563 140.987 128.381 132.296C133.559 125.696 136.834 117.143 138.28 106.366C144.217 109.949 148.617 114.664 151.047 120.332C155.179 129.967 155.42 145.8 142.501 158.708C131.182 170.016 117.576 174.908 97.0135 175.059C74.2042 174.89 56.9538 167.575 45.7381 153.317C35.2355 139.966 29.8077 120.682 29.6052 96C29.8077 71.3178 35.2355 52.0336 45.7381 38.6827C56.9538 24.4249 74.2039 17.11 97.0132 16.9405C119.988 17.1113 137.539 24.4614 149.184 38.788C154.894 45.8136 159.199 54.6488 162.037 64.9503L178.184 60.6422C174.744 47.9622 169.331 37.0357 161.965 27.974C147.036 9.60668 125.202 0.195148 97.0695 0H96.9569C68.8816 0.19447 47.2921 9.6418 32.7883 28.0793C19.8819 44.4864 13.2244 67.3157 13.0007 95.9325L13 96L13.0007 96.0675C13.2244 124.684 19.8819 147.514 32.7883 163.921C47.2921 182.358 68.8816 191.806 96.9569 192H97.0695C122.03 191.827 139.624 185.292 154.118 170.811C173.081 151.866 172.51 128.119 166.26 113.541C161.776 103.087 153.227 94.5962 141.537 88.9883ZM98.4405 129.507C88.0005 130.095 77.1544 125.409 76.6196 115.372C76.2232 107.93 81.9158 99.626 99.0812 98.6368C101.047 98.5234 102.976 98.468 104.871 98.468C111.106 98.468 116.939 99.0737 122.242 100.233C120.264 124.935 108.662 128.946 98.4405 129.507Z">
+    </path>
+</svg>
+{{- else if (eq $icon_name "threema") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentcolor">
+    <path
+        d="M11.998 20.486a1.757 1.757 0 1 1 0 3.514 1.757 1.757 0 0 1 0-3.514zm-6.335 0a1.757 1.757 0 1 1 0 3.514 1.757 1.757 0 0 1 0-3.514zm12.671 0a1.757 1.757 0 1 1 0 3.514 1.757 1.757 0 0 1 0-3.514zM12 0c5.7 0 10.322 4.066 10.322 9.082 0 5.016-4.622 9.083-10.322 9.083a11.45 11.45 0 0 1-4.523-.917l-5.171 1.293 1.105-4.42c-1.094-1.442-1.733-3.175-1.733-5.039C1.678 4.066 6.3 0 12 0zm-.001 4.235A2.926 2.926 0 0 0 9.072 7.16v1.17h-.115a.47.47 0 0 0-.47.47v4.126c0 .26.21.471.47.471h6.086c.26 0 .47-.21.47-.47V8.798a.47.47 0 0 0-.47-.47h-.115v-1.17a2.927 2.927 0 0 0-2.93-2.924zm0 1.17c.972 0 1.758.786 1.758 1.754v1.17h-3.514v-1.17c0-.968.786-1.754 1.756-1.754z">
+    </path>
+</svg>
+{{- else if (eq $icon_name "tidal") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentcolor">
+    <path
+        d="M12.012 3.992L8.008 7.996 4.004 3.992 0 7.996 4.004 12l4.004-4.004L12.012 12l-4.004 4.004 4.004 4.004 4.004-4.004L12.012 12l4.004-4.004-4.004-4.004zM16.042 7.996l3.979-3.979L24 7.996l-3.979 3.979z" />
+</svg>
+{{- else if (eq $icon_name "tiktok") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 76.000000 76.000000" fill="currentColor" stroke-width="2"
+    preserveAspectRatio="xMidYMid meet">
+    <path d="M65.9,19.4c1.4,0.2,2.8,0.1,2.8,0.1s0,6.2,0,12.2c-6.3,0-12.1-2-16.8-5.4V51c0.1,20-24.6,29.8-38.3,15.6
+    c-14.7-15.1-2.1-40.5,19-37.7v12.3c-9.5-3-17.2,8-11.2,15.9c5.8,7.7,18.3,3.6,18.3-6.1c0,0,0-48.2,0-48.2c2.4,0,9.9,0,12.2,0v1.6
+    c0.7,7.4,6.1,13.4,13.3,15v0C65.4,19.3,65.6,19.4,65.9,19.4z" />
+</svg>
+{{- else if (eq $icon_name "tryhackme") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke-width="2"
+    xmlns="http://www.w3.org/2000/svg" stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M10.7048 0c-3.164 0-5.8024 2.2853-6.3563 5.2914C2.0493 5.5007.242 7.4381.242 9.7912c0 2.4918 2.0276 4.5191 4.5195 4.5191h6.7616a.625.625 0 000-1.2497H4.7615c-1.8031 0-3.2698-1.467-3.2698-3.2694 0-1.803 1.4667-3.2696 3.2698-3.2696.6552 0 1.287.1925 1.8274.5576a.6252.6252 0 00.8677-.1676.6251.6251 0 00-.168-.8678c-.5105-.345-1.0806-.5756-1.679-.6895.5105-2.3438 2.6006-4.1046 5.0952-4.1046 2.6578 0 4.8555 1.9984 5.1739 4.571a4.489 4.489 0 00-.488.3043.625.625 0 00-.1412.8724.6256.6256 0 00.8729.1408c.5587-.4036 1.2197-.6166 1.9114-.6166 1.547 0 2.894 1.0973 3.203 2.6102a.6254.6254 0 00.7378.4865c.3378-.0689.556-.3992.4871-.7377-.428-2.091-2.2903-3.6087-4.428-3.6087-.3254 0-.6455.037-.9574.1042C16.5567 2.3282 13.8986 0 10.7048 0zm5.1918 10.6402c-.1805 0-.3345.0358-.462.1078a.913.913 0 00-.3124.2909c-.0803.1215-.139.2635-.1753.4261a2.3894 2.3894 0 00-.0535.5145c0 .1805.0178.3525.0535.5162.0363.1639.095.3075.1753.4312a.909.909 0 00.3124.2964c.1275.0732.2815.11.462.11.1806 0 .3343-.0368.4607-.11a.8974.8974 0 00.3086-.2964c.0792-.1237.1372-.2673.1728-.4312a2.3737 2.3737 0 00.0544-.5162c0-.1807-.018-.3523-.0543-.5145-.0357-.1626-.0937-.3046-.173-.4261a.901.901 0 00-.3085-.2909c-.1264-.072-.28-.1078-.4607-.1078zm6.4864 0c-.1806 0-.3347.0358-.4621.1078a.913.913 0 00-.3125.2909c-.0808.1215-.139.2635-.1753.4261a2.3894 2.3894 0 00-.0535.5145c0 .1805.0178.3525.0535.5162.0364.1639.0945.3075.1753.4312a.909.909 0 00.3125.2964c.1274.0732.2815.11.4621.11.1807 0 .334-.0368.4605-.11a.8974.8974 0 00.3086-.2964c.0793-.1237.1372-.2673.1729-.4312a2.3737 2.3737 0 00.0543-.5162c0-.1807-.018-.3523-.0543-.5145-.0357-.1626-.0936-.3046-.1729-.4261a.9011.9011 0 00-.3086-.2909c-.1265-.072-.2798-.1078-.4605-.1078zm-8.5372.0682l-.8407.6175.3141.4294.4762-.3678v1.8773h.603v-2.5564zm6.4863 0l-.8413.6175.3146.4294.4762-.3678v1.8773h.6031v-2.5564zm-4.4355.4442c.0797 0 .1438.0284.1932.0848.0493.0564.0874.1263.114.2093a1.312 1.312 0 01.0542.2691 2.803 2.803 0 01.014.2637c0 .0818-.0048.1712-.014.2689a1.3044 1.3044 0 01-.0543.2707c-.0265.083-.0646.1529-.1139.2093-.0494.0569-.1135.0852-.1932.0852-.0792 0-.1443-.0283-.1947-.0852-.051-.0564-.09-.1263-.1178-.2093a1.244 1.244 0 01-.0557-.2707 2.7355 2.7355 0 01-.0146-.269c0-.0792.0049-.167.0146-.2636a1.249 1.249 0 01.0557-.269c.0278-.0831.0668-.153.1178-.2094.0504-.0564.1155-.0848.1947-.0848zm6.4864 0c.0793 0 .1436.0284.193.0848.0493.0564.0874.1263.114.2093.0266.083.0444.1732.0543.2691.0092.0966.014.1844.014.2637a2.91 2.91 0 01-.014.2689 1.3176 1.3176 0 01-.0543.2707c-.0266.083-.0647.1529-.114.2093-.0494.0569-.1137.0852-.193.0852-.0791 0-.1444-.0283-.1948-.0852-.051-.0564-.09-.1263-.1176-.2093a1.2445 1.2445 0 01-.056-.2707 2.7355 2.7355 0 01-.0146-.269c0-.0792.0049-.167.0146-.2636a1.2484 1.2484 0 01.056-.269c.0276-.0831.0666-.153.1176-.2094.0504-.0564.1157-.0848.1948-.0848zm-2.1915 3.5112c-.1806 0-.3347.0364-.4621.108a.9076.9076 0 00-.3125.2913c-.0808.1215-.1387.263-.1751.4257a2.3826 2.3826 0 00-.0541.5143c0 .1806.0183.3525.0541.5164.0364.1639.0943.3075.1751.4316a.9092.9092 0 00.3125.2956c.1274.0738.2815.1102.4621.1102.1807 0 .3336-.0364.46-.1102a.8922.8922 0 00.3087-.2956c.0797-.124.1371-.2677.1735-.4316a2.3755 2.3755 0 00.0543-.5164c0-.1801-.018-.352-.0543-.5143-.0364-.1627-.0938-.3042-.1735-.4257a.8904.8904 0 00-.3088-.2913c-.1263-.0716-.2792-.108-.4599-.108zm-6.4016.0684l-.8413.6177.3143.4296.4765-.3684v1.8775h.6033v-2.5564zm2.1252 0l-.8413.6177.314.4296.4768-.3684v1.8775h.6033v-2.5564zm2.116 0l-.8407.6177.3135.4296.4768-.3684v1.8775h.603v-2.5564zm2.1604.4442c.0792 0 .1438.028.1932.085.0493.0565.0874.1265.114.2095.026.083.0444.1725.0537.2691.0097.096.0146.1839.0146.263 0 .082-.0049.1715-.0146.2691a1.3243 1.3243 0 01-.0537.2706c-.0266.083-.0647.153-.114.2095-.0494.0569-.114.085-.1932.085-.0797 0-.1441-.0281-.195-.085-.0506-.0565-.0898-.1265-.1174-.2095a1.2443 1.2443 0 01-.0558-.2706 2.6765 2.6765 0 01-.0146-.269c0-.0792.0048-.1671.0146-.263a1.2413 1.2413 0 01.0558-.2692c.0276-.083.0668-.153.1173-.2095.051-.057.1154-.085.1951-.085zm-6.7291 3.0723c-.1312 0-.243.0264-.3358.0785a.6615.6615 0 00-.2268.2111c-.0586.0885-.1009.1914-.127.3096a1.6979 1.6979 0 00-.0394.3732c0 .1313.013.2562.0394.375.0261.1188.0684.2235.127.313a.6535.6535 0 00.2268.2152c.0927.0532.2046.0797.3358.0797.1307 0 .2424-.0265.334-.0797a.6501.6501 0 00.2241-.2152c.0575-.0895.0996-.1942.1258-.313.026-.1188.039-.2437.039-.375 0-.1306-.013-.2555-.039-.3732-.0262-.1182-.0683-.2211-.1258-.3096a.658.658 0 00-.2241-.2111c-.0916-.0521-.2033-.0785-.334-.0785zm3.0859 0c-.1314 0-.243.0264-.3358.0785a.6612.6612 0 00-.2268.2111c-.0586.0885-.101.1914-.127.3096a1.6895 1.6895 0 00-.0394.3732c0 .1313.0128.2562.0394.375.026.1188.0684.2235.127.313a.6532.6532 0 00.2268.2152c.0927.0532.2044.0797.3358.0797.1307 0 .2423-.0265.334-.0797a.6496.6496 0 00.224-.2152c.0574-.0895.0993-.1942.1258-.313a1.7415 1.7415 0 00.039-.375 1.724 1.724 0 00-.039-.3732c-.0265-.1182-.0684-.2211-.1259-.3096a.6575.6575 0 00-.224-.2111c-.0916-.0521-.2032-.0785-.334-.0785zm5.1077 0c-.1312 0-.2428.0264-.3356.0785a.6612.6612 0 00-.2268.2111c-.0586.0885-.1008.1914-.127.3096a1.6977 1.6977 0 00-.0396.3732c0 .1313.0132.2562.0397.375.0261.1188.0683.2235.127.313a.6532.6532 0 00.2267.2152c.0928.0532.2044.0797.3356.0797.1307 0 .2426-.0265.3342-.0797a.6496.6496 0 00.224-.2152c.0575-.0895.0992-.1942.1259-.313.026-.1188.039-.2437.039-.375 0-.1306-.013-.2555-.039-.3732-.0267-.1182-.0684-.2211-.126-.3096a.6575.6575 0 00-.2239-.2111c-.0916-.0521-.2035-.0785-.3342-.0785zm-6.658.0498l-.611.4487.2279.3112.3462-.2669v1.3627h.4375v-1.8557zm3.0677 0l-.6106.4487.2282.3112.3462-.2669v1.3627h.4377v-1.8557zm5.1082 0l-.6109.4487.2285.3112.346-.2669v1.3627h.4377v-1.8557zm-9.7115.3228c.0575 0 .1041.0205.14.0612.0358.0412.0633.0917.0823.152a.9604.9604 0 01.0397.1952c.007.07.0102.134.0102.1915 0 .0597-.0031.1247-.0102.1952a.954.954 0 01-.0397.197c-.019.0602-.0465.1107-.0824.1519-.0358.0412-.0824.0612-.1399.0612-.058 0-.1053-.02-.1416-.0612-.037-.0412-.065-.0917-.0852-.152a.8863.8863 0 01-.0407-.1969 1.9609 1.9609 0 01-.0108-.1952c0-.0575.0037-.1215.0108-.1915a.893.893 0 01.0407-.1952c.0202-.0603.0483-.1108.0852-.152.0363-.0407.0836-.0612.1416-.0612zm3.0859 0c.0575 0 .1041.0205.14.0612a.421.421 0 01.0821.152.9392.9392 0 01.0397.1952c.007.07.0103.134.0103.1915 0 .0597-.0033.1247-.0103.1952a.9302.9302 0 01-.0397.197.4211.4211 0 01-.0822.1519c-.0358.0412-.0824.0612-.14.0612-.058 0-.1053-.02-.1417-.0612a.4192.4192 0 01-.085-.152.8458.8458 0 01-.0407-.1969 1.9645 1.9645 0 01-.011-.1952c0-.0575.004-.1215.011-.1915a.8487.8487 0 01.0407-.1952.4196.4196 0 01.085-.152c.0364-.0407.0837-.0612.1418-.0612zm5.1077 0c.0575 0 .1044.0205.1402.0612a.421.421 0 01.0822.152.9483.9483 0 01.0398.1952c.007.07.0102.134.0102.1915 0 .0597-.0032.1247-.0102.1952a.9427.9427 0 01-.0398.197.421.421 0 01-.0822.1519c-.0358.0412-.0827.0612-.1402.0612-.058 0-.1051-.02-.1415-.0612-.0368-.0412-.065-.0917-.0857-.152a.9503.9503 0 01-.04-.1969 1.9645 1.9645 0 01-.011-.1952c0-.0575.0039-.1215.011-.1915a.9589.9589 0 01.04-.1952c.0207-.0603.0489-.1108.0857-.152.0363-.0407.0835-.0612.1415-.0612zm-1.6842 1.8138c-.1312 0-.2428.0266-.3356.0787a.659.659 0 00-.2268.211c-.0586.0883-.1008.1914-.127.3097a1.7304 1.7304 0 00-.0396.3733c0 .1312.0137.256.0397.3746.026.119.0683.2237.127.3137a.656.656 0 00.2267.2148c.0928.0532.2044.0797.3356.0797.1307 0 .2426-.0265.3342-.0797a.6475.6475 0 00.224-.2148c.0576-.09.0998-.1948.1259-.3137.026-.1187.039-.2434.039-.3746 0-.1307-.013-.2557-.039-.3733-.0261-.1183-.0683-.2214-.126-.3098a.6504.6504 0 00-.2239-.2109c-.0916-.052-.2035-.0787-.3342-.0787zm3.0627 0c-.1313 0-.243.0266-.3358.0787a.6641.6641 0 00-.2268.211c-.0586.0883-.101.1914-.127.3097a1.7218 1.7218 0 00-.0394.3733c0 .1312.0134.256.0395.3746.026.119.0683.2237.1269.3137a.6609.6609 0 00.2268.2148c.0928.0532.2045.0797.3358.0797s.2424-.0265.334-.0797a.6475.6475 0 00.224-.2148c.0575-.09.1-.1948.1259-.3137a1.7398 1.7398 0 00.0396-.3746c0-.1307-.0135-.2557-.0396-.3733-.026-.1183-.0684-.2214-.126-.3098a.6504.6504 0 00-.2239-.2109c-.0916-.052-.2027-.0787-.334-.0787zm-1.5448.05l-.6109.448.2284.3124.346-.2675v1.3626h.4378v-1.8555zm-1.5179.3228c.0575 0 .1041.0206.14.0613a.4206.4206 0 01.0826.1517.9575.9575 0 01.0396.1953c.007.07.0102.134.0102.1916 0 .0597-.0032.1245-.0102.195a.9512.9512 0 01-.0396.197.4218.4218 0 01-.0826.1519c-.0359.0412-.0825.0612-.14.0612-.058 0-.1052-.02-.1415-.0612-.0368-.0412-.065-.0917-.085-.152a.9149.9149 0 01-.0408-.1969 1.9608 1.9608 0 01-.011-.195c0-.0575.004-.1217.011-.1916a.9232.9232 0 01.0407-.1953c.0202-.0603.0483-.1105.085-.1517.0364-.0407.0836-.0613.1416-.0613zm3.0627 0c.0575 0 .104.0206.1398.0613a.4208.4208 0 01.0826.1517.939.939 0 01.0394.1953c.0071.07.0104.134.0104.1916 0 .0597-.0033.1245-.0104.195a.9296.9296 0 01-.0394.197.4218.4218 0 01-.0826.1519c-.0357.0412-.0823.0612-.1398.0612-.0575 0-.1054-.02-.1417-.0612-.037-.0412-.065-.0917-.085-.152a.9065.9065 0 01-.0408-.1969 1.9495 1.9495 0 01-.0103-.195c0-.0575.0033-.1217.0103-.1916a.9145.9145 0 01.0407-.1953c.02-.0603.0481-.1105.085-.1517.0364-.0407.0843-.0613.1418-.0613zm-9.7123.1855c-.091 0-.1686.0182-.2326.0545a.4563.4563 0 00-.157.146c-.0408.0613-.0702.133-.0881.2149a1.1685 1.1685 0 00-.0271.2587c0 .0907.0086.1773.027.2598.018.082.0474.1546.0881.217a.4589.4589 0 00.157.1487c.064.037.1417.0557.2327.0557.0907 0 .1677-.0188.2311-.0557a.4504.4504 0 00.1558-.1487c.0402-.0624.0688-.135.0873-.217a1.2187 1.2187 0 00.0272-.2598c0-.0911-.0093-.1774-.0272-.2587-.0185-.082-.0471-.1536-.0873-.2148a.4479.4479 0 00-.1558-.146c-.0634-.0364-.1403-.0546-.231-.0546zm1.0519.0346l-.423.3102.1577.2166.2398-.185v.9442h.3037v-1.286zm-1.0519.2236c.0396 0 .0724.0141.0973.0429a.2841.2841 0 01.057.105.689.689 0 01.0276.1352c.0044.0489.007.0927.007.1328 0 .0407-.0027.0862-.007.135a.684.684 0 01-.0277.1362.2845.2845 0 01-.057.1053c-.0248.0288-.0576.043-.0972.043a.1247.1247 0 01-.098-.043.2976.2976 0 01-.0592-.1053.612.612 0 01-.0283-.1361 1.391 1.391 0 01-.0069-.135c0-.0402.0021-.084.007-.1329a.6197.6197 0 01.0282-.1353.2973.2973 0 01.0592-.105.1248.1248 0 01.098-.0428zm3.7749 1.394c-.0907 0-.1681.0178-.2321.0542a.4517.4517 0 00-.1574.1463c-.0407.0608-.07.1326-.088.2144a1.1691 1.1691 0 00-.0276.2587c0 .0905.0092.1774.0277.26.0179.0824.0472.1545.0879.2168a.4562.4562 0 00.1574.1493c.064.0368.1414.0547.232.0547.0912 0 .1683-.0179.2318-.0547a.451.451 0 00.1556-.1493.6636.6636 0 00.0868-.2169 1.1889 1.1889 0 00.0277-.26c0-.0906-.0092-.1773-.0277-.2586-.0179-.0818-.0473-.1536-.0868-.2144a.4461.4461 0 00-.1556-.1463c-.0635-.0364-.1406-.0543-.2317-.0543zm1.0522.034l-.423.3109.1578.2158.2398-.1849v.9444h.3033v-1.2861zm-1.0522.2236c.0401 0 .0726.014.0976.0427a.3008.3008 0 01.057.1054.6431.6431 0 01.027.135 1.31 1.31 0 01.0077.1329c0 .0412-.0027.0863-.0077.135a.655.655 0 01-.027.1367.3066.3066 0 01-.057.1054c-.025.0282-.0575.0421-.0976.0421-.0396 0-.0728-.0139-.0977-.042a.2928.2928 0 01-.0592-.1055.6182.6182 0 01-.028-.1366 1.3641 1.3641 0 01-.0077-.1351c0-.0401.0029-.0841.0077-.1328a.6122.6122 0 01.028-.135.2874.2874 0 01.0592-.1055c.0249-.0287.0581-.0427.0977-.0427z" />
+</svg>
+{{- else if (eq $icon_name "tumblr") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M14.563 24c-5.093 0-7.031-3.756-7.031-6.411V9.747H5.116V6.648c3.63-1.313 4.512-4.596 4.71-6.469C9.84.051 9.941 0 9.999 0h3.517v6.114h4.801v3.633h-4.82v7.47c.016 1.001.375 2.371 2.207 2.371h.09c.631-.02 1.486-.205 1.936-.419l1.156 3.425c-.436.636-2.4 1.374-4.156 1.404h-.178l.011.002z" />
+</svg>
+{{- else if (eq $icon_name "twitch") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path d="M21 2H3v16h5v4l4-4h5l4-4V2zm-10 9V7m5 4V7"></path>
+</svg>
+{{- else if (eq $icon_name "twitter") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M23 3a10.9 10.9 0 0 1-3.14 1.53 4.48 4.48 0 0 0-7.86 3v1A10.66 10.66 0 0 1 3 4s-4 9 5 13a11.64 11.64 0 0 1-7 2c9 5 20 0 20-11.5a4.5 4.5 0 0 0-.08-.83A7.72 7.72 0 0 0 23 3z">
+    </path>
+</svg>
+{{- else if (eq $icon_name "unity") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="currentColor">
+  <path d="M15 11.2V3.733L8.61 0v2.867l2.503 1.466c.099.067.099.2 0 .234L8.148 6.3c-.099.067-.197.033-.263 0L4.92 4.567c-.099-.034-.099-.2 0-.234l2.504-1.466V0L1 3.733V11.2v-.033.033l2.438-1.433V6.833c0-.1.131-.166.197-.133L6.6 8.433c.099.067.132.134.132.234v3.466c0 .1-.132.167-.198.134L4.031 10.8l-2.438 1.433L7.983 16l6.391-3.733-2.438-1.434L9.434 12.3c-.099.067-.198 0-.198-.133V8.7c0-.1.066-.2.132-.233l2.965-1.734c.099-.066.197 0 .197.134V9.8z"/>
+</svg>
+{{- else if (eq $icon_name "unsplash") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 40">
+    <path fill="none" stroke="currentColor" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="4"
+        d="M37.892,13.5h-4.486 l-1.143-3.306C31.707,8.581,30.189,7.5,28.483,7.5h-9.045c-1.706,0-3.224,1.081-3.781,2.694L14.515,13.5H9.108 c-2.545,0-4.608,2.063-4.608,4.608v16.785c0,2.545,2.063,4.608,4.608,4.608h28.785c2.545,0,4.608-2.063,4.608-4.608V18.108 C42.5,15.563,40.437,13.5,37.892,13.5z" />
+    <circle cx="24" cy="26" r="7.5" fill="none" stroke="currentColor" stroke-miterlimit="10" stroke-width="4" />
+</svg>
+{{- else if (eq $icon_name "vimeo") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="M23.9765 6.4168c-.105 2.338-1.739 5.5429-4.894 9.6088-3.2679 4.247-6.0258 6.3699-8.2898 6.3699-1.409 0-2.578-1.294-3.553-3.881l-1.9179-7.1138c-.719-2.584-1.488-3.878-2.312-3.878-.179 0-.806.378-1.8809 1.132l-1.129-1.457a315.06 315.06 0 003.501-3.1279c1.579-1.368 2.765-2.085 3.5539-2.159 1.867-.18 3.016 1.1 3.447 3.838.465 2.953.789 4.789.971 5.5069.5389 2.45 1.1309 3.674 1.7759 3.674.502 0 1.256-.796 2.265-2.385 1.004-1.589 1.54-2.797 1.612-3.628.144-1.371-.395-2.061-1.614-2.061-.574 0-1.167.121-1.777.391 1.186-3.8679 3.434-5.7568 6.7619-5.6368 2.4729.06 3.6279 1.664 3.4929 4.7969z" />
+</svg>
+{{- else if or (eq $icon_name "vk") (eq $icon_name "vkontakte") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none">
+    <path fill-rule="evenodd" clip-rule="evenodd"
+        d="M3.37413 3.37413C0 6.74826 0 12.1788 0 23.04V24.96C0 35.8212 0 41.2517 3.37413 44.6259C6.74826 48 12.1788 48 23.04 48H24.96C35.8212 48 41.2517 48 44.6259 44.6259C48 41.2517 48 35.8212 48 24.96V23.04C48 12.1788 48 6.74826 44.6259 3.37413C41.2517 0 35.8212 0 24.96 0H23.04C12.1788 0 6.74826 0 3.37413 3.37413ZM8.10012 14.6001C8.36012 27.0801 14.6001 34.5801 25.5401 34.5801H26.1602V27.4401C30.1802 27.8401 33.22 30.7801 34.44 34.5801H40.1201C38.5601 28.9001 34.4599 25.7601 31.8999 24.5601C34.4599 23.0801 38.0599 19.4801 38.9199 14.6001H33.7598C32.6398 18.5601 29.3202 22.1601 26.1602 22.5001V14.6001H21V28.4401C17.8 27.6401 13.7601 23.7601 13.5801 14.6001H8.10012Z"
+        fill="currentColor" />
+</svg>
+{{- else if (eq $icon_name "wantedly") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M18.453 14.555c-.171-.111-.658-.764-2.006-3.982a9.192 9.192 0 0 0-.237-.526l-.274-.664-2.362-5.702H8.85l2.362 5.702 2.362 5.706 2.181 5.267a.196.196 0 0 0 .362 0l2.373-5.682a.1.1 0 0 0-.037-.119zm-8.85 0c-.171-.111-.658-.764-2.006-3.982a8.971 8.971 0 0 0-.236-.525l-.276-.665-2.36-5.702H0l2.362 5.702 2.362 5.706 2.181 5.267a.196.196 0 0 0 .362 0l2.374-5.682a.098.098 0 0 0-.038-.119ZM24 6.375a2.851 2.851 0 0 1-2.851 2.852 2.851 2.851 0 0 1-2.852-2.852 2.851 2.851 0 0 1 2.852-2.851A2.851 2.851 0 0 1 24 6.375Z" />
+</svg>
+{{- else if (eq $icon_name "wechat") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M17 10C20.3142 10 23 12.2165 23 14.95C23 16.4867 22.1513 17.8595 20.8182 18.767V21L18.6756 19.7042C18.1265 19.835 17.5642 19.9007 17 19.9C13.6858 19.9 11 17.6835 11 14.95C11 12.2165 13.6858 10 17 10Z" />
+    <path
+        d="M10.7657 15.5978C10.033 15.8089 9.24728 15.9231 8.43285 15.9231C7.4893 15.9251 6.55199 15.7679 5.65934 15.4578L3.12367 17V13.9835C1.81018 12.8183 1 11.2223 1 9.46154C1 5.89262 4.3278 3 8.43285 3C12.4487 3 15.7202 5.76769 15.8657 9.23V9.48092M9.49469 7.30769H9.50531M6.30918 7.30769H6.3198M14.8039 13.7692H14.8145M17.9894 13.7692H18" />
+</svg>
+{{- else if (eq $icon_name "whatsapp") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 380" fill="currentColor">
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M307.546 52.5655C273.709 18.685 228.706 0.0171895 180.756 0C81.951 0 1.53846 80.404 1.50408 179.235C1.48689 210.829 9.74646 241.667 25.4319 268.844L0 361.736L95.0236 336.811C121.203 351.096 150.683 358.616 180.679 358.625H180.756C279.544 358.625 359.966 278.212 360 179.381C360.017 131.483 341.392 86.4547 307.546 52.5741V52.5655ZM180.756 328.354H180.696C153.966 328.346 127.744 321.16 104.865 307.589L99.4242 304.358L43.034 319.149L58.0834 264.168L54.5423 258.53C39.6304 234.809 31.749 207.391 31.7662 179.244C31.8006 97.1036 98.6334 30.2707 180.817 30.2707C220.61 30.2879 258.015 45.8015 286.145 73.9665C314.276 102.123 329.755 139.562 329.738 179.364C329.703 261.513 262.871 328.346 180.756 328.346V328.354ZM262.475 216.777C257.997 214.534 235.978 203.704 231.869 202.209C227.761 200.713 224.779 199.966 221.796 204.452C218.814 208.939 210.228 219.029 207.615 222.011C205.002 225.002 202.389 225.372 197.911 223.128C193.434 220.885 179.003 216.158 161.891 200.902C148.578 189.024 139.587 174.362 136.975 169.875C134.362 165.389 136.7 162.965 138.934 160.739C140.945 158.728 143.412 155.505 145.655 152.892C147.899 150.279 148.638 148.406 150.133 145.423C151.629 142.432 150.881 139.82 149.764 137.576C148.646 135.333 139.691 113.287 135.952 104.323C132.316 95.5909 128.621 96.777 125.879 96.6309C123.266 96.5019 120.284 96.4762 117.293 96.4762C114.302 96.4762 109.454 97.5935 105.346 102.08C101.238 106.566 89.6691 117.404 89.6691 139.441C89.6691 161.478 105.716 182.785 107.959 185.776C110.202 188.767 139.544 234.001 184.469 253.408C195.153 258.023 203.498 260.782 210.004 262.845C220.731 266.257 230.494 265.776 238.212 264.624C246.816 263.335 264.71 253.786 268.44 243.326C272.17 232.866 272.17 223.893 271.053 222.028C269.936 220.163 266.945 219.037 262.467 216.794L262.475 216.777Z"></path>
+</svg>
+{{- else if or (eq $icon_name "wikipedia") (eq $icon_name "wiki") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 80" fill="currentColor">
+    <path d="M93.868704,0.909104 L93.868704,3.048056 C91.047359,3.549147 88.911824,4.435559 87.462095,5.707293 C85.385249,7.595808 82.936537,10.486281 81.33006,14.378719 L48.644587,81.09089 L46.469872,81.09089 L13.656938,13.511576 C12.12874,10.043075 10.051174,7.923395 9.424242,7.152531 C8.444628,5.957874 7.2397099,5.023288 5.8095009,4.34877 C4.3792666,3.674401 2.449446,3.24083 0.0200327,3.048056 L0.0200327,0.909104 L31.947914,0.909104 L31.947914,3.048056 C28.26456,3.394989 26.508521,4.011623 25.411397,4.89796 C24.31421,5.784446 23.765632,6.921365 23.765658,8.308721 C23.765632,10.235773 24.666866,13.241865 26.469366,17.327004 L50.70176,63.285559 L74.394451,17.905099 C76.236043,13.434562 77.763937,10.332122 77.764,8.597768 C77.763937,7.48019 77.195762,6.410715 76.059496,5.389341 C74.923078,4.368114 73.637249,3.645496 70.933604,3.221484 C70.737619,3.183021 70.404566,3.125211 69.934406,3.048056 L69.934406,0.909104 L93.868704,0.909104 Z" />
+    <path d="M121.979968,0.909104 L121.979968,3.048056 C119.158628,3.549147 117.023098,4.435559 115.573368,5.707293 C113.496518,7.595808 111.047808,10.486281 109.441328,14.378719 L80.755855,81.09089 L78.581141,81.09089 L48.268207,13.511576 C46.740008,10.043075 44.662443,7.923395 44.035511,7.152531 C43.055896,5.957874 41.850979,5.023288 40.42077,4.34877 C38.990535,3.674401 37.694909,3.24083 35.265495,3.048056 L35.265495,0.909104 L66.559183,0.909104 L66.559183,3.048056 C62.875829,3.394989 61.11979,4.011623 60.022666,4.89796 C58.925479,5.784446 58.376901,6.921365 58.376926,8.308721 C58.376901,10.235773 59.278135,13.241865 61.080635,17.327004 L82.813029,63.285559 L102.505718,17.905099 C104.347308,13.434562 105.875208,10.332122 105.875268,8.597768 C105.875208,7.48019 105.307028,6.410715 104.170768,5.389341 C103.034348,4.368114 101.114328,3.645496 98.410678,3.221484 C98.214698,3.183021 97.881638,3.125211 97.411478,3.048056 L97.411478,0.909104 L121.979968,0.909104 Z" />
+</svg>
+{{- else if (eq $icon_name "wordpress") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M21.469 6.825c.84 1.537 1.318 3.3 1.318 5.175 0 3.979-2.156 7.456-5.363 9.325l3.295-9.527c.615-1.54.82-2.771.82-3.864 0-.405-.026-.78-.07-1.11m-7.981.105c.647-.03 1.232-.105 1.232-.105.582-.075.514-.93-.067-.899 0 0-1.755.135-2.88.135-1.064 0-2.85-.15-2.85-.15-.585-.03-.661.855-.075.885 0 0 .54.061 1.125.09l1.68 4.605-2.37 7.08L5.354 6.9c.649-.03 1.234-.1 1.234-.1.585-.075.516-.93-.065-.896 0 0-1.746.138-2.874.138-.2 0-.438-.008-.69-.015C4.911 3.15 8.235 1.215 12 1.215c2.809 0 5.365 1.072 7.286 2.833-.046-.003-.091-.009-.141-.009-1.06 0-1.812.923-1.812 1.914 0 .89.513 1.643 1.06 2.531.411.72.89 1.643.89 2.977 0 .915-.354 1.994-.821 3.479l-1.075 3.585-3.9-11.61.001.014zM12 22.784c-1.059 0-2.081-.153-3.048-.437l3.237-9.406 3.315 9.087c.024.053.05.101.078.149-1.12.393-2.325.609-3.582.609M1.211 12c0-1.564.336-3.05.935-4.39L7.29 21.709C3.694 19.96 1.212 16.271 1.211 12M12 0C5.385 0 0 5.385 0 12s5.385 12 12 12 12-5.385 12-12S18.615 0 12 0" />
+</svg>
+{{- else if (eq $icon_name "x") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z">
+    </path>
+</svg>
+{{- else if (eq $icon_name "xda") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
+    <path
+        d="M13.84 3.052V0h7.843v17.583H13.84v-3.024h4.591V3.052zM5.569 14.53V3.024h4.592V0H2.318v17.583H6.98L10.16 24v-9.483z" />
+</svg>
+{{- else if (eq $icon_name "xing") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor">
+    <path
+        d="M313.8 303.9L469 32H365L209.4 303.8a1.35 1.35 0 0 0 0 1.7l98.9 173.8c.4.7.8.7 1.6.7H413l-99.3-174.7a1.74 1.74 0 0 1 .1-1.4z"
+        fill="currentColor" />
+    <path
+        d="M221.9 216.2L163 113a2 2 0 0 0-2-1H65l58.9 104.4a1.13 1.13 0 0 1 .1.8L43 352h96.8a1.54 1.54 0 0 0 1.6-.9l80.5-133.7a2.44 2.44 0 0 0 0-1.2z" />
+</svg>
+{{- else if (eq $icon_name "xmpp") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none">
+    <path
+        d="m24 3.2-3.2 1.2-1 .3-3.1.9v.6c0 3.4-1.7 7.6-4.6 10.5-2.8-3-4.5-7-4.5-10.4v-.6l-3.1-.8-.8-.3L0 3.2c.1 5.7 4.8 11.7 10.5 15-1.3 1-2.8 1.8-4.3 2.2v.3c.4-.1.8-.1 1.3-.2.1 0 .3 0 .4-.1 1.4-.3 2.7-.8 4-1.4.4.2.8.4 1.2.5.1 0 .2.1.3.1.2.1.4.2.6.2 1.2.5 2.6.8 3.9.9v-.3c-1.7-.4-3.2-1.3-4.5-2.3C19.2 14.9 23.8 9 24 3.2z">
+    </path>
+</svg>
+{{- else if (eq $icon_name "ycombinator") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="1">
+    <path
+        d="M0 24V0h24v24H0zM6.951 5.896l4.112 7.708v5.064h1.583v-4.972l4.148-7.799h-1.749l-2.457 4.875c-.372.745-.688 1.434-.688 1.434s-.297-.708-.651-1.434L8.831 5.896h-1.88z" />
+</svg>
+{{- else if (eq $icon_name "yeswehack") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1300" fill="currentColor" stroke="none">
+   <path d="M405 551l-397 -338c-5,-4 -8,-11 -8,-18l0 -171c0,-13 11,-24 24,-24l154 0c14,0 24,11 24,24l0 89 304 258 303 -258 0 -89c0,-13 11,-24 24,-24l155 0c13,0 23,11 23,24l0 171c0,7 -2,14 -8,18l-396 338 0 90c0,13 -11,24 -24,24l-155 0c-13,0 -23,-11 -23,-24l0 -90z"/>
+   <path d="M202 1052l203 -172 0 -90c0,-13 10,-24 23,-24l155 0c13,0 24,11 24,24l0 90 202 172 0 -505c0,-8 3,-14 9,-18l154 -132c7,-6 17,-8 26,-4 8,4 13,13 13,22l0 876c0,13 -10,24 -23,24l-174 0c-6,0 -11,-2 -15,-6l-293 -249 -293 249c-5,4 -10,6 -16,6l-173 0c-13,0 -24,-11 -24,-24l0 -876c0,-9 5,-18 14,-22 9,-4 18,-2 25,4l155 131c5,5 8,11 8,19l0 505z"/>
+</svg>
+{{- else if (eq $icon_name "youtube") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="M22.54 6.42a2.78 2.78 0 0 0-1.94-2C18.88 4 12 4 12 4s-6.88 0-8.6.46a2.78 2.78 0 0 0-1.94 2A29 29 0 0 0 1 11.75a29 29 0 0 0 .46 5.33A2.78 2.78 0 0 0 3.4 19c1.72.46 8.6.46 8.6.46s6.88 0 8.6-.46a2.78 2.78 0 0 0 1.94-2 29 29 0 0 0 .46-5.25 29 29 0 0 0-.46-5.33z">
+    </path>
+    <polygon points="9.75 15.02 15.5 11.75 9.75 8.48 9.75 15.02"></polygon>
+</svg>
+{{- else if (eq $icon_name "zcal") -}}
+<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor" stroke="none" stroke-width="2">
+    <path
+        d="M 6.3361243,0.07808093 C 5.8180004,0.26764401 5.5778938,0.65939444 5.5778938,1.3291631 v 0.657135 L 4.0993445,2.0368425 C 2.8735383,2.0747533 2.5196977,2.137941 2.0773961,2.3654147 1.4328997,2.7066112 0.81367829,3.4395676 0.63675749,4.0587918 0.5609351,4.3620871 0.52302343,7.71094 0.54829756,13.347115 c 0.0379117,7.923511 0.0631858,8.858662 0.25274319,9.199865 0.24010655,0.442301 0.65713395,0.947789 0.79614215,0.947789 0.050549,0 0.22747,0.113734 0.4043899,0.252743 0.3159299,0.252744 0.5181249,0.252744 10.0339192,0.252744 h 9.692714 l 0.556036,-0.417027 C 22.587534,23.35576 22.96665,22.913458 23.14357,22.610167 L 23.4595,22.041494 V 13.069097 4.0967026 L 23.168845,3.565943 C 23.004562,3.275291 22.688632,2.8961743 22.461163,2.7192545 22.031499,2.3906822 21.121622,1.9862981 20.919428,2.0242088 c -0.06319,0.012634 -0.581311,0.012634 -1.149984,0 L 18.720559,2.011575 V 1.506083 c 0,-1.18789452 -0.909878,-1.83238624 -1.88294,-1.3395374 -0.417027,0.22746432 -0.644496,0.68240244 -0.644496,1.3395374 V 2.011575 H 12.149226 8.1053295 V 1.53136 c 0,-1.02360844 -0.8972396,-1.76920805 -1.7692052,-1.45327907 z M 5.5778938,4.7159268 c 0,0.9477869 0.2780183,1.4153683 0.9225148,1.5291004 C 7.4355589,6.4219471 8.1053295,5.7269014 8.1053295,4.5642839 V 3.907149 h 4.0438965 4.043897 v 0.7835008 c 0.01264,0.8340548 0.176921,1.1752608 0.720319,1.478556 0.568673,0.3032858 1.326903,0.063178 1.630196,-0.5054921 0.101097,-0.2021968 0.176921,-0.6697687 0.176921,-1.0615191 V 3.907149 h 0.985699 c 0.89724,0 1.023611,0.025277 1.415364,0.3664734 l 0.442301,0.3664829 0.03791,3.5384066 0.03791,3.5510451 -0.417028,0.126371 c -0.227469,0.06319 -0.644495,0.202195 -0.922514,0.315929 -0.480212,0.176921 -3.829064,1.377453 -4.486197,1.604922 -0.176921,0.05055 -0.796142,0.278019 -1.39009,0.480214 l -1.07416,0.379114 -0.06319,-2.641169 -0.06318,-2.6538124 -0.40439,-0.4043842 C 12.275598,8.3933386 11.808022,8.4059819 10.190464,9.0125629 9.4954189,9.2653042 8.5349935,9.6065101 8.0421437,9.78343 c -0.859328,0.290652 -2.9065504,1.023608 -3.9175251,1.402725 -0.2780173,0.1011 -0.7329564,0.265384 -1.0109737,0.353844 -0.2780183,0.101097 -0.6065848,0.214832 -0.7203198,0.26538 -0.2148315,0.08846 -0.227469,-0.126371 -0.227469,-3.3362094 0,-2.8054559 0.037912,-3.5005015 0.1895583,-3.8037873 C 2.6839809,4.0208811 2.9872724,3.907149 4.3394511,3.907149 h 1.2384427 z m 5.3076142,9.5410662 c 0,2.577983 0.01264,2.666443 0.290655,2.982373 0.429665,0.518124 1.175258,0.556036 2.363153,0.126372 1.630196,-0.581311 4.423012,-1.579648 6.065845,-2.173595 0.871965,-0.303292 1.680745,-0.593947 1.807117,-0.631859 0.214831,-0.06319 0.227469,0.101097 0.189557,3.437313 l -0.03791,3.500498 -0.35384,0.303292 -0.353842,0.303292 H 11.90912 2.9619982 L 2.6207951,21.763475 C 2.4438743,21.586554 2.2543169,21.308537 2.2164053,21.169528 c -0.025274,-0.151646 -0.037912,-1.680744 -0.025274,-3.3994 l 0.037911,-3.146658 0.4423016,-0.151646 c 0.429664,-0.151646 2.3126032,-0.821416 5.3076145,-1.882939 0.7961422,-0.278018 1.7439301,-0.606585 2.0851336,-0.732957 0.353841,-0.126371 0.669772,-0.227469 0.732956,-0.227469 0.05055,-0.01264 0.08846,1.175257 0.08846,2.628534 z" />
+</svg>
+{{- else if (eq $icon_name "zhihu") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" stroke="none" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path
+        d="m13.3334,3.60098l0,17.1471l1.79582,0l0.75424,2.13703l3.18459,-2.13703l3.93584,0l0,-17.1471l-9.6705,0zm7.41375,14.87538l-1.79283,0l-2.24777,1.50849l-0.53276,-1.50849l-0.53875,0l0,-12.53483l5.10911,0l0,12.53483l0.00299,0zm-8.56906,-7.18927l-3.97475,0c0.06285,-1.34387 0.1287,-3.12174 0.19754,-5.17496l3.91788,0l-0.00299,-0.24244c0,-0.01796 -0.00599,-0.43998 -0.06884,-0.87097c-0.06285,-0.44896 -0.19754,-1.04457 -0.62854,-1.04457l-6.5727,0c0.13169,-0.61657 0.46991,-2.08615 0.87995,-2.80747l0.19155,-0.33522l-0.3861,-0.02095c-0.02394,0 -0.58663,-0.02694 -1.23912,0.31726c-1.06851,0.56868 -1.5474,1.68807 -1.75691,2.52612c-0.55072,2.18791 -1.33489,3.70837 -1.66712,4.35786c-0.09877,0.19155 -0.15863,0.30529 -0.18557,0.38311c-0.05387,0.14666 -0.02394,0.29332 0.0838,0.38909c0.31427,0.28434 1.14334,-0.0868 1.15232,-0.08979c0.01796,-0.00898 0.03891,-0.01796 0.06585,-0.02993c0.41603,-0.18856 1.64916,-0.74826 2.08914,-2.52911l1.69705,0c0.02095,0.96376 0.09278,4.14236 0.0868,5.17496l-4.22018,0l-0.06285,0.0449c-0.69139,0.50582 -0.91288,1.8916 -0.92185,1.95146l-0.0419,0.27536l4.99837,0c-0.36814,2.34355 -0.79315,3.3941 -1.01763,3.81313c-0.11074,0.20951 -0.21849,0.41902 -0.32025,0.62255c-0.63752,1.26306 -1.29898,2.56802 -3.7802,4.5973c-0.10775,0.0838 -0.20951,0.23944 -0.14367,0.41005c0.07183,0.18856 0.27835,0.27237 0.73629,0.27237c0.16162,0 0.35318,-0.00898 0.58065,-0.02993c1.49352,-0.13169 3.01698,-0.53875 4.04359,-2.6219c0.50882,-1.05056 0.94879,-2.14601 1.31394,-3.25941l4.08549,4.78886l0.14965,-0.35916c0.02394,-0.05687 0.56868,-1.38578 0.15264,-2.87032l-0.01497,-0.05387l-3.23547,-3.68143l-0.65847,0.49684c0.19155,-0.78118 0.31726,-1.49352 0.37413,-2.12805l4.74995,0l0,-0.23944c0,-1.20021 -0.55371,-1.91255 -0.57466,-1.94248l-0.07183,-0.08979z" />
+</svg>
+{{- else if (eq $icon_name "jamendo") -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.3">
+    <path style="stroke-width:1.7"
+        d="M 11.953964,1.9577206 C 8.9486891,3.6582881 5.9434143,5.3588555 2.9381394,7.059423 c 0,3.325368 0,6.650735 0,9.976103 2.9643942,1.765865 5.9287884,3.531729 8.8931826,5.297594 3.002478,-1.73905 6.004955,-3.478101 9.007433,-5.217151 0,-3.360254 0,-6.720509 0,-10.0807628 C 17.877158,5.342711 14.915561,3.6502158 11.953964,1.9577206 Z" />
+     <path d="M 6.7394985,14.712082 8.3520207,11.408709" />
+     <path d="M 9.2716212,14.767353 11.902927,9.4304828" />
+     <path d="M 13.170768,11.935987 14.59425,9.3677519" />
+     <path d="M 14.54983,14.574583 17.177574,9.4459113" />
+</svg>
+{{- else if $icon_name -}}
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"
+    stroke-linecap="round" stroke-linejoin="round">
+    <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path>
+    <path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path>
+</svg>
+{{- end -}}
diff --git a/themes/PaperMod/layouts/partials/templates/_funcs/get-page-images.html b/themes/PaperMod/layouts/partials/templates/_funcs/get-page-images.html
new file mode 100644 (file)
index 0000000..268ceb4
--- /dev/null
@@ -0,0 +1,47 @@
+{{- $imgs := slice }}
+{{- $imgParams := .Params.images }}
+{{- $resources := .Resources.ByType "image" -}}
+{{/* Find featured image resources if the images parameter is empty. */}}
+{{- if not $imgParams }}
+  {{- $featured := $resources.GetMatch "*feature*" -}}
+  {{- if not $featured }}{{ $featured = $resources.GetMatch "{*cover*,*thumbnail*}" }}{{ end -}}
+  {{- with $featured }}
+    {{- $imgs = $imgs | append (dict
+      "Image" .
+      "RelPermalink" .RelPermalink
+      "Permalink" .Permalink) }}
+  {{- end }}
+{{- end }}
+{{/* Use the first one of site images as the fallback. */}}
+{{- if and (not $imgParams) (not $imgs) }}
+  {{- with site.Params.images }}
+    {{- $imgParams = first 1 . }}
+  {{- end }}
+{{- end }}
+{{/* Parse page's images parameter. */}}
+{{- range $imgParams }}
+  {{- $img := . }}
+  {{- $url := urls.Parse $img }}
+  {{- if eq $url.Scheme "" }}
+    {{/* Internal image. */}}
+    {{- with $resources.GetMatch $img -}}
+      {{/* Image resource. */}}
+      {{- $imgs = $imgs | append (dict
+        "Image" .
+        "RelPermalink" .RelPermalink
+        "Permalink" .Permalink) }}
+    {{- else }}
+      {{- $imgs = $imgs | append (dict
+        "RelPermalink" (relURL $img)
+        "Permalink" (absURL $img)
+      ) }}
+    {{- end }}
+  {{- else }}
+    {{/* External image */}}
+    {{- $imgs = $imgs | append (dict
+      "RelPermalink" $img
+      "Permalink" $img
+    ) }}
+  {{- end }}
+{{- end }}
+{{- return $imgs }}
diff --git a/themes/PaperMod/layouts/partials/templates/opengraph.html b/themes/PaperMod/layouts/partials/templates/opengraph.html
new file mode 100644 (file)
index 0000000..fe5bf53
--- /dev/null
@@ -0,0 +1,86 @@
+<meta property="og:url" content="{{ .Permalink }}">
+
+{{- with or site.Title site.Params.title | plainify }}
+  <meta property="og:site_name" content="{{ . }}">
+{{- end }}
+
+{{- with or .Title site.Title site.Params.title | plainify }}
+  <meta property="og:title" content="{{ . }}">
+{{- end }}
+
+{{- with or .Description .Summary site.Params.description | plainify | htmlUnescape | chomp }}
+  <meta property="og:description" content="{{ . }}">
+{{- end }}
+
+{{- with or .Params.locale site.Language.LanguageCode site.Language.Lang }}
+  <meta property="og:locale" content="{{ . }}">
+{{- end }}
+
+{{- if .IsPage }}
+  <meta property="og:type" content="article">
+  {{- with .Section }}
+    <meta property="article:section" content="{{ . }}">
+  {{- end }}
+  {{- $ISO8601 := "2006-01-02T15:04:05-07:00" }}
+  {{- with .PublishDate }}
+    <meta property="article:published_time" {{ .Format $ISO8601 | printf "content=%q" | safeHTMLAttr }}>
+  {{- end }}
+  {{- with .Lastmod }}
+    <meta property="article:modified_time" {{ .Format $ISO8601 | printf "content=%q" | safeHTMLAttr }}>
+  {{- end }}
+  {{- range .GetTerms "tags" | first 6 }}
+    <meta property="article:tag" content="{{ .Page.Title | plainify }}">
+  {{- end }}
+{{- else }}
+  <meta property="og:type" content="website">
+{{- end }}
+
+{{- if .Params.cover.image -}}
+  {{- if (ne .Params.cover.relative true) }}
+    <meta property="og:image" content="{{ .Params.cover.image | absURL }}">
+  {{- else}}
+    <meta property="og:image" content="{{ (path.Join .RelPermalink .Params.cover.image ) | absURL }}">
+  {{- end}}
+{{- else }}
+  {{- with partial "_funcs/get-page-images" . }}
+    {{- range . | first 6 }}
+      <meta property="og:image" content="{{ .Permalink }}">
+    {{- end }}
+  {{- end }}
+{{- end }}
+
+{{- with .Params.audio }}
+  {{- range . | first 6  }}
+    <meta property="og:audio" content="{{ . | absURL }}">
+  {{- end }}
+{{- end }}
+
+{{- with .Params.videos }}
+  {{- range . | first 6 }}
+    <meta property="og:video" content="{{ . | absURL }}">
+  {{- end }}
+{{- end }}
+
+{{- range .GetTerms "series" }}
+  {{- range .Pages | first 7 }}
+    {{- if ne $ . }}
+      <meta property="og:see_also" content="{{ .Permalink }}">
+    {{- end }}
+  {{- end }}
+{{- end }}
+
+{{- with site.Params.social }}
+  {{- if reflect.IsMap . }}
+    {{- with .facebook_app_id }}
+      <meta property="fb:app_id" content="{{ . }}">
+    {{- else }}
+      {{- with .facebook_admin }}
+        <meta property="fb:admins" content="{{ . }}">
+      {{- end }}
+    {{- end }}
+  {{- end }}
+{{- end }}
+
+{{- with (.Param "social.fediverse_creator") }}
+  <meta name="fediverse:creator" content="{{ . }}">
+{{- end }}
diff --git a/themes/PaperMod/layouts/partials/templates/schema_json.html b/themes/PaperMod/layouts/partials/templates/schema_json.html
new file mode 100644 (file)
index 0000000..8a4efb4
--- /dev/null
@@ -0,0 +1,128 @@
+{{ if .IsHome }}
+<script type="application/ld+json">
+{
+  "@context": "https://schema.org",
+  "@type": "{{- ( site.Params.schema.publisherType | default "Organization") | title -}}",
+  "name": {{ site.Title }},
+  "url": {{ site.Home.Permalink }},
+  "description": {{ site.Params.description | plainify | truncate 180 | safeHTML }},
+  {{- if (eq site.Params.schema.publisherType "Person") }}
+  "image": {{ site.Params.assets.favicon | default "favicon.ico" | absURL }},
+  {{- else }}
+  "logo": {{ site.Params.assets.favicon | default "favicon.ico" | absURL }},
+  {{- end }}
+  "sameAs": [
+    {{- if site.Params.schema.sameAs }}
+      {{ range $i, $e := site.Params.schema.sameAs }}{{ if $i }}, {{ end }}{{ trim $e " " }}{{ end }}
+    {{- else}}
+      {{ range $i, $e := site.Params.SocialIcons }}{{ if $i }}, {{ end }}{{ trim $e.url " " | safeURL }}{{ end }}
+    {{- end}}
+  ]
+}
+</script>
+{{- else if (or .IsPage .IsSection) }}
+{{/* BreadcrumbList */}}
+{{- $url := replace .Parent.Permalink ( printf "%s" site.Home.Permalink) "" }}
+{{- $lang_url := strings.TrimPrefix ( printf "%s/" .Lang) $url }}
+{{- $bc_list := (split $lang_url "/")}}
+
+{{- $scratch := newScratch }}
+<script type="application/ld+json">
+{
+  "@context": "https://schema.org",
+  "@type": "BreadcrumbList",
+  "itemListElement": [
+  {{- range $index, $element := $bc_list }}
+
+    {{- $scratch.Add "path" (printf "%s/" $element ) | safeJS }}
+    {{- $bc_pg := site.GetPage ($scratch.Get "path") -}}
+
+    {{- if (and ($bc_pg) (gt (len . ) 0))}}
+    {{- if (and $index)}}, {{end }}
+    {
+      "@type": "ListItem",
+      "position": {{ add 1 $index  }},
+      "name": {{ $bc_pg.Name }},
+      "item": {{ $bc_pg.Permalink | safeHTML }}
+    }
+    {{- end }}
+
+  {{- end }}
+  {{- /*  self-page addition  */ -}}
+  {{- if (ge (len $bc_list) 2) }}, {{end }}
+    {
+      "@type": "ListItem",
+      "position": {{len $bc_list}},
+      "name": {{ .Name }},
+      "item": {{ .Permalink | safeHTML }}
+    }
+  ]
+}
+</script>
+{{- if .IsPage }}
+<script type="application/ld+json">
+{
+  "@context": "https://schema.org",
+  "@type": "BlogPosting",
+  "headline": {{ .Title | plainify}},
+  "name": "{{ .Title | plainify }}",
+  "description": {{ with .Description | plainify }}{{ . }}{{ else }}{{ .Summary | plainify  }}{{ end -}},
+  "keywords": [
+    {{- if .Params.keywords }}
+    {{ range $i, $e := .Params.keywords }}{{ if $i }}, {{ end }}{{ $e }}{{ end }}
+    {{- else }}
+    {{ range $i, $e := .Params.tags }}{{ if $i }}, {{ end }}{{ $e }}{{ end }}
+    {{- end }}
+  ],
+  "articleBody": {{ .Content | safeJS | htmlUnescape | plainify }},
+  "wordCount" : "{{ .WordCount }}",
+  "inLanguage": {{ .Language.Lang | default "en-us" }},
+  {{ if .Params.cover.image -}}
+  "image":
+    {{- if (ne .Params.cover.relative true) -}}
+    {{ .Params.cover.image | absURL }},
+    {{- else -}}
+    {{ (path.Join .RelPermalink .Params.cover.image ) | absURL }},
+    {{- end}}
+  {{- else }}
+    {{- $images := partial "templates/_funcs/get-page-images" . -}}
+    {{- with index $images 0 -}}
+  "image": {{ .Permalink }},
+    {{- end }}
+  {{- end -}}
+  "datePublished": {{ .PublishDate }},
+  "dateModified": {{ .Lastmod }},
+  {{- with (.Params.author | default site.Params.author) }}
+  "author":
+    {{- if (or (eq (printf "%T" .) "[]string") (eq (printf "%T" .) "[]interface {}")) -}}
+  [{{- range $i, $v := . -}}
+  {{- if $i }}, {{end -}}
+  {
+    "@type": "Person",
+    "name": {{ $v }}
+  }
+  {{- end }}],
+    {{- else -}}
+  {
+    "@type": "Person",
+    "name": {{ . }}
+  },
+    {{- end -}}
+  {{- end }}
+  "mainEntityOfPage": {
+    "@type": "WebPage",
+    "@id": {{ .Permalink | safeHTML }}
+  },
+  "publisher": {
+    "@type": "{{- ( site.Params.schema.publisherType | default "Organization") | title -}}",
+    "name": {{ site.Title }},
+    "logo": {
+      "@type": "ImageObject",
+      "url": {{ site.Params.assets.favicon | default "favicon.ico" | absURL }}
+    }
+  }
+}
+</script>
+{{- end }}{{/* .IsPage end */}}
+
+{{- end -}}
diff --git a/themes/PaperMod/layouts/partials/templates/twitter_cards.html b/themes/PaperMod/layouts/partials/templates/twitter_cards.html
new file mode 100644 (file)
index 0000000..a6e1d05
--- /dev/null
@@ -0,0 +1,31 @@
+{{- if .Params.cover.image -}}
+<meta name="twitter:card" content="summary_large_image">
+{{- if (ne $.Params.cover.relative true) }}
+<meta name="twitter:image" content="{{ .Params.cover.image | absURL }}">
+{{- else }}
+<meta name="twitter:image" content="{{ (path.Join .RelPermalink .Params.cover.image ) | absURL }}">
+{{- end}}
+{{- else }}
+{{- $images := partial "templates/_funcs/get-page-images" . -}}
+{{- with index $images 0 -}}
+<meta name="twitter:card" content="summary_large_image">
+<meta name="twitter:image" content="{{ .Permalink }}">
+{{- else -}}
+<meta name="twitter:card" content="summary">
+{{- end -}}
+{{- end }}
+<meta name="twitter:title" content="{{ .Title }}">
+<meta name="twitter:description" content="{{ with .Description }}{{ . }}{{ else }}{{if .IsPage}}{{ .Summary }}{{ else }}{{ with site.Params.description }}{{ . }}{{ end }}{{ end }}{{ end -}}">
+
+{{- $twitterSite := "" }}
+{{- with site.Params.social }}
+  {{- if reflect.IsMap . }}
+    {{- with .twitter }}
+      {{- $content := . }}
+      {{- if not (strings.HasPrefix . "@") }}
+        {{- $content = printf "@%v" . }}
+      {{- end }}
+      <meta name="twitter:site" content="{{ $content }}">
+    {{- end }}
+  {{- end }}
+{{- end }}
diff --git a/themes/PaperMod/layouts/partials/toc.html b/themes/PaperMod/layouts/partials/toc.html
new file mode 100644 (file)
index 0000000..28f8694
--- /dev/null
@@ -0,0 +1,97 @@
+{{- $headers := findRE "<h[1-6].*?>(.|\n])+?</h[1-6]>" .Content -}}
+{{- $has_headers := ge (len $headers) 1 -}}
+{{- if $has_headers -}}
+<div class="toc">
+    <details {{if (.Param "TocOpen") }} open{{ end }}>
+        <summary accesskey="c" title="(Alt + C)">
+            <span class="details">{{- i18n "toc" | default "Table of Contents" }}</span>
+        </summary>
+
+        <div class="inner">
+            {{- if (.Param "UseHugoToc") }}
+            {{- .TableOfContents -}}
+            {{- else }}
+            {{- $largest := 6 -}}
+            {{- range $headers -}}
+            {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}}
+            {{- $headerLevel := len (seq $headerLevel) -}}
+            {{- if lt $headerLevel $largest -}}
+            {{- $largest = $headerLevel -}}
+            {{- end -}}
+            {{- end -}}
+
+            {{- $firstHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers 0) 1) 0)) -}}
+
+            {{- $.Scratch.Set "bareul" slice -}}
+            <ul>
+                {{- range seq (sub $firstHeaderLevel $largest) -}}
+                <ul>
+                    {{- $.Scratch.Add "bareul" (sub (add $largest .) 1) -}}
+                    {{- end -}}
+                    {{- range $i, $header := $headers -}}
+                    {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}}
+                    {{- $headerLevel := len (seq $headerLevel) -}}
+
+                    {{/* get id="xyz" */}}
+                    {{- $id := index (findRE "(id=\"(.*?)\")" $header 9) 0 }}
+
+                    {{- /* strip id="" to leave xyz, no way to get regex capturing groups in hugo */ -}}
+                    {{- $cleanedID := replace (replace $id "id=\"" "") "\"" "" }}
+                    {{- $header := replaceRE "<h[1-6].*?>((.|\n])+?)</h[1-6]>" "$1" $header -}}
+
+                    {{- if ne $i 0 -}}
+                    {{- $prevHeaderLevel := index (findRE "[1-6]" (index $headers (sub $i 1)) 1) 0 -}}
+                    {{- $prevHeaderLevel := len (seq $prevHeaderLevel) -}}
+                    {{- if gt $headerLevel $prevHeaderLevel -}}
+                    {{- range seq $prevHeaderLevel (sub $headerLevel 1) -}}
+                    <ul>
+                        {{/* the first should not be recorded */}}
+                        {{- if ne $prevHeaderLevel . -}}
+                        {{- $.Scratch.Add "bareul" . -}}
+                        {{- end -}}
+                        {{- end -}}
+                        {{- else -}}
+                        </li>
+                        {{- if lt $headerLevel $prevHeaderLevel -}}
+                        {{- range seq (sub $prevHeaderLevel 1) -1 $headerLevel -}}
+                        {{- if in ($.Scratch.Get "bareul") . -}}
+                    </ul>
+                    {{/* manually do pop item */}}
+                    {{- $tmp := $.Scratch.Get "bareul" -}}
+                    {{- $.Scratch.Delete "bareul" -}}
+                    {{- $.Scratch.Set "bareul" slice}}
+                    {{- range seq (sub (len $tmp) 1) -}}
+                    {{- $.Scratch.Add "bareul" (index $tmp (sub . 1)) -}}
+                    {{- end -}}
+                    {{- else -}}
+                </ul>
+                </li>
+                {{- end -}}
+                {{- end -}}
+                {{- end -}}
+                {{- end }}
+                <li>
+                    <a href="#{{- $cleanedID -}}" aria-label="{{- $header | plainify | safeHTML -}}">{{- $header | plainify | safeHTML -}}</a>
+                    {{- else }}
+                <li>
+                    <a href="#{{- $cleanedID -}}" aria-label="{{- $header | plainify | safeHTML -}}">{{- $header | plainify | safeHTML -}}</a>
+                    {{- end -}}
+                    {{- end -}}
+                    <!-- {{- $firstHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers 0) 1) 0)) -}} -->
+                    {{- $firstHeaderLevel := $largest }}
+                    {{- $lastHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers (sub (len $headers) 1)) 1) 0)) }}
+                </li>
+                {{- range seq (sub $lastHeaderLevel $firstHeaderLevel) -}}
+                {{- if in ($.Scratch.Get "bareul") (add . $firstHeaderLevel) }}
+            </ul>
+            {{- else }}
+            </ul>
+            </li>
+            {{- end -}}
+            {{- end }}
+            </ul>
+            {{- end }}
+        </div>
+    </details>
+</div>
+{{- end }}
diff --git a/themes/PaperMod/layouts/partials/translation_list.html b/themes/PaperMod/layouts/partials/translation_list.html
new file mode 100644 (file)
index 0000000..01729cd
--- /dev/null
@@ -0,0 +1,19 @@
+{{- if .IsTranslated -}}
+{{- if (ne .Layout "search") }}
+{{- if or .Params.author site.Params.author (.Param "ShowReadingTime") (not .Date.IsZero) }}&nbsp;|&nbsp;{{- end -}}
+{{- end -}}
+<span>{{- i18n "translations" | default "Translations" }}:</span>
+<ul class="i18n_list">
+    {{- range .Translations }}
+    <li>
+        <a href="{{ .Permalink }}">
+            {{- if (and site.Params.displayFullLangName (.Language.LanguageName)) }}
+            {{- .Language.LanguageName | emojify -}}
+            {{- else }}
+            {{- .Lang | title -}}
+            {{- end -}}
+        </a>
+    </li>
+    {{- end }}
+</ul>
+{{- end -}}
diff --git a/themes/PaperMod/layouts/robots.txt b/themes/PaperMod/layouts/robots.txt
new file mode 100644 (file)
index 0000000..f26f508
--- /dev/null
@@ -0,0 +1,7 @@
+User-agent: *
+{{- if hugo.IsProduction | or (eq site.Params.env "production") }}
+Disallow:
+{{- else }}
+Disallow: /
+{{- end }}
+Sitemap: {{ "sitemap.xml" | absURL }}
diff --git a/themes/PaperMod/layouts/shortcodes/collapse.html b/themes/PaperMod/layouts/shortcodes/collapse.html
new file mode 100644 (file)
index 0000000..17d8d3b
--- /dev/null
@@ -0,0 +1,8 @@
+{{ if .Get "summary" }}
+{{ else }}
+{{ warnf "missing value for param 'summary': %s" .Position }}
+{{ end }}
+<p><details {{ if (eq (.Get "openByDefault") true) }} open=true {{ end }}>
+  <summary markdown="span">{{ .Get "summary" | markdownify }}</summary>
+  {{ .Inner | markdownify }}
+</details></p>
diff --git a/themes/PaperMod/layouts/shortcodes/figure.html b/themes/PaperMod/layouts/shortcodes/figure.html
new file mode 100644 (file)
index 0000000..8c93eff
--- /dev/null
@@ -0,0 +1,31 @@
+<figure{{ if or (.Get "class") (eq (.Get "align") "center") }} class="
+           {{- if eq (.Get "align") "center" }}align-center {{ end }}
+           {{- with .Get "class" }}{{ . }}{{- end }}"
+{{- end -}}>
+    {{- if .Get "link" -}}
+        <a href="{{ .Get "link" }}"{{ with .Get "target" }} target="{{ . }}"{{ end }}{{ with .Get "rel" }} rel="{{ . }}"{{ end }}>
+    {{- end }}
+    <img loading="lazy" src="{{ .Get "src" }}{{- if eq (.Get "align") "center" }}#center{{- end }}"
+         {{- if or (.Get "alt") (.Get "caption") }}
+         alt="{{ with .Get "alt" }}{{ . }}{{ else }}{{ .Get "caption" | markdownify| plainify }}{{ end }}"
+         {{- end -}}
+         {{- with .Get "width" }} width="{{ . }}"{{ end -}}
+         {{- with .Get "height" }} height="{{ . }}"{{ end -}}
+    /> <!-- Closing img tag -->
+    {{- if .Get "link" }}</a>{{ end -}}
+    {{- if or (or (.Get "title") (.Get "caption")) (.Get "attr") -}}
+        <figcaption>
+            {{ with (.Get "title") -}}
+                {{ . }}
+            {{- end -}}
+            {{- if or (.Get "caption") (.Get "attr") -}}<p>
+                {{- .Get "caption" | markdownify -}}
+                {{- with .Get "attrlink" }}
+                    <a href="{{ . }}">
+                {{- end -}}
+                {{- .Get "attr" | markdownify -}}
+                {{- if .Get "attrlink" }}</a>{{ end }}</p>
+            {{- end }}
+        </figcaption>
+    {{- end }}
+</figure>
diff --git a/themes/PaperMod/layouts/shortcodes/inTextImg.html b/themes/PaperMod/layouts/shortcodes/inTextImg.html
new file mode 100644 (file)
index 0000000..0239fd6
--- /dev/null
@@ -0,0 +1,5 @@
+{{- $Img := (.Get "url") }}
+{{- $height := (.Get "height") }}
+{{- $alt := (.Get "alt") }}
+
+<img class="in-text" height="{{ $height | default `15` }}" src="{{$Img}}" alt="{{$alt}}">
diff --git a/themes/PaperMod/layouts/shortcodes/ltr.html b/themes/PaperMod/layouts/shortcodes/ltr.html
new file mode 100644 (file)
index 0000000..4ad7682
--- /dev/null
@@ -0,0 +1,15 @@
+{{ $.Scratch.Set "md" false }}
+
+{{ if .IsNamedParams }}
+{{ $.Scratch.Set "md" (.Get "md") }}
+{{ else }}
+{{ $.Scratch.Set "md" (.Get 0) }}
+{{ end }}
+
+<div dir="ltr">
+  {{ if eq ($.Scratch.Get "md") false }}
+    {{ .Inner }}
+  {{ else }}
+    {{ .Inner | markdownify }}
+  {{ end }}
+</div>
diff --git a/themes/PaperMod/layouts/shortcodes/rawhtml.html b/themes/PaperMod/layouts/shortcodes/rawhtml.html
new file mode 100644 (file)
index 0000000..9350c13
--- /dev/null
@@ -0,0 +1,2 @@
+<!-- raw html -->
+{{- .Inner -}}
\ No newline at end of file
diff --git a/themes/PaperMod/layouts/shortcodes/rtl.html b/themes/PaperMod/layouts/shortcodes/rtl.html
new file mode 100644 (file)
index 0000000..a69b8ce
--- /dev/null
@@ -0,0 +1,15 @@
+{{ $.Scratch.Set "md" false }}
+
+{{ if .IsNamedParams }}
+{{ $.Scratch.Set "md" (.Get "md") }}
+{{ else }}
+{{ $.Scratch.Set "md" (.Get 0) }}
+{{ end }}
+
+<div dir="rtl">
+  {{ if eq ($.Scratch.Get "md") false }}
+    {{ .Inner }}
+  {{ else }}
+    {{ .Inner | markdownify }}
+  {{ end }}
+</div>
diff --git a/themes/PaperMod/theme.toml b/themes/PaperMod/theme.toml
new file mode 100644 (file)
index 0000000..e4352b9
--- /dev/null
@@ -0,0 +1,52 @@
+# theme.toml template for a Hugo theme
+# See https://github.com/gohugoio/hugoThemes#themetoml for an example
+
+name = "PaperMod"
+license = "MIT"
+licenselink = "https://github.com/adityatelange/hugo-PaperMod/blob/master/LICENSE"
+description = "A fast, clean, responsive Hugo theme"
+homepage = "https://adityatelange.github.io/hugo-PaperMod/"
+demosite = "https://adityatelange.github.io/hugo-PaperMod/"
+tags = [
+  "responsive",
+  "simple",
+  "clean",
+  "light",
+  "dark",
+  "blog",
+  "minimalist",
+  "highlight.js",
+  "search"
+]
+features = [
+  "responsive",
+  "single-column",
+  "blog",
+  "cover-image",
+  "table-of-contents",
+  "opengraph",
+  "highlight.js",
+  "favicon",
+  "archive",
+  "share-icons",
+  "cover",
+  "multilingual",
+  "social-icons",
+  "minified-assets",
+  "theme-toggle",
+  "menu-location-indicator",
+  "scroll-to-top",
+  "search"
+]
+min_version = "0.146.0"
+
+[author]
+  name = "Aditya Telange"
+  homepage = "https://github.com/adityatelange/"
+
+# If porting an existing theme
+[original]
+  name = "Paper"
+  author = "nanxiaobei"
+  homepage = "https://github.com/nanxiaobei"
+  repo = "https://github.com/nanxiaobei/hugo-paper/"
diff --git a/wp/juplo.wordpress.2022-03-09.xml b/wp/juplo.wordpress.2022-03-09.xml
deleted file mode 100644 (file)
index 1a4da2b..0000000
+++ /dev/null
@@ -1,14899 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!-- This is a WordPress eXtended RSS file generated by WordPress as an export of your site. -->
-<!-- It contains information about your site's posts, pages, comments, categories, and other content. -->
-<!-- You may use this file to transfer that content from one site to another. -->
-<!-- This file is not intended to serve as a complete backup of your site. -->
-
-<!-- To import this information into a WordPress site follow these steps: -->
-<!-- 1. Log in to that site as an administrator. -->
-<!-- 2. Go to Tools: Import in the WordPress admin panel. -->
-<!-- 3. Install the "WordPress" importer from the list. -->
-<!-- 4. Activate & Run Importer. -->
-<!-- 5. Upload this file using the form provided on that page. -->
-<!-- 6. You will first be asked to map the authors in this export file to users -->
-<!--    on the site. For each author, you may choose to map to an -->
-<!--    existing user on the site or to create a new user. -->
-<!-- 7. WordPress will then import each of the posts, pages, comments, categories, etc. -->
-<!--    contained in this file into your site. -->
-
-<!-- generator="WordPress/5.0.15" created="2022-03-09 08:56" -->
-<rss version="2.0"
-       xmlns:excerpt="http://wordpress.org/export/1.2/excerpt/"
-       xmlns:content="http://purl.org/rss/1.0/modules/content/"
-       xmlns:wfw="http://wellformedweb.org/CommentAPI/"
-       xmlns:dc="http://purl.org/dc/elements/1.1/"
-       xmlns:wp="http://wordpress.org/export/1.2/"
->
-
-<channel>
-       <title>juplo</title>
-       <link>https://juplo.de</link>
-       <description>Java bits from nerds for nerds</description>
-       <pubDate>Wed, 09 Mar 2022 08:56:51 +0000</pubDate>
-       <language>en-US</language>
-       <wp:wxr_version>1.2</wp:wxr_version>
-       <wp:base_site_url>https://juplo.de</wp:base_site_url>
-       <wp:base_blog_url>https://juplo.de</wp:base_blog_url>
-
-       <wp:author><wp:author_id>2</wp:author_id><wp:author_login><![CDATA[kai]]></wp:author_login><wp:author_email><![CDATA[kai@juplo.de]]></wp:author_email><wp:author_display_name><![CDATA[Kai Moritz]]></wp:author_display_name><wp:author_first_name><![CDATA[Kai]]></wp:author_first_name><wp:author_last_name><![CDATA[Moritz]]></wp:author_last_name></wp:author>
-       <wp:author><wp:author_id>3</wp:author_id><wp:author_login><![CDATA[tortenheber]]></wp:author_login><wp:author_email><![CDATA[kai@ich-geh-kaputt.de]]></wp:author_email><wp:author_display_name><![CDATA[tortenheber]]></wp:author_display_name><wp:author_first_name><![CDATA[]]></wp:author_first_name><wp:author_last_name><![CDATA[]]></wp:author_last_name></wp:author>
-
-       <wp:category>
-               <wp:term_id>15</wp:term_id>
-               <wp:category_nicename><![CDATA[android]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Android]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>21</wp:term_id>
-               <wp:category_nicename><![CDATA[css]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[CSS]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>78</wp:term_id>
-               <wp:category_nicename><![CDATA[demos]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Demos]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>51</wp:term_id>
-               <wp:category_nicename><![CDATA[explained]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Explained]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>19</wp:term_id>
-               <wp:category_nicename><![CDATA[facebook]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Facebook]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>23</wp:term_id>
-               <wp:category_nicename><![CDATA[grunt]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[grunt]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>16</wp:term_id>
-               <wp:category_nicename><![CDATA[hacking]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Hacking]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>49</wp:term_id>
-               <wp:category_nicename><![CDATA[howto]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[HOWTO]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>17</wp:term_id>
-               <wp:category_nicename><![CDATA[html5]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[HTML(5)]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>4</wp:term_id>
-               <wp:category_nicename><![CDATA[java]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Java]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>12</wp:term_id>
-               <wp:category_nicename><![CDATA[jetty]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[java]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Jetty]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>32</wp:term_id>
-               <wp:category_nicename><![CDATA[jmockit]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[java]]></wp:category_parent>
-               <wp:cat_name><![CDATA[JMockIt]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>9</wp:term_id>
-               <wp:category_nicename><![CDATA[jpa]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[java]]></wp:category_parent>
-               <wp:cat_name><![CDATA[JPA]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>31</wp:term_id>
-               <wp:category_nicename><![CDATA[junit]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[java]]></wp:category_parent>
-               <wp:cat_name><![CDATA[JUnit]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>79</wp:term_id>
-               <wp:category_nicename><![CDATA[kafka]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Kafka]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>80</wp:term_id>
-               <wp:category_nicename><![CDATA[kafka-streams]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Kafka Streams]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>39</wp:term_id>
-               <wp:category_nicename><![CDATA[leitmarkt-wettbewerb-createmedia-nrw]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Leitmarkt-Wettbewerb CreateMedia.NRW]]></wp:cat_name>
-<wp:category_description><![CDATA[Die Firma yourSHOUTER UG (haftungsbeschränkt) entwickeln mit Unterstützung der EFRE.NRW und des MWEIMH.NRW eine deutschlandweiten, themenübergreifenden, crowdgestützte, vertikalen Event-Location-Suchmaschine.\r
-\r
-Auf dieser Seite berichten wir über die Erkenntnisse, die im Laufe des Projektes gesammelt wurden.]]></wp:category_description>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>14</wp:term_id>
-               <wp:category_nicename><![CDATA[less]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[less]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>8</wp:term_id>
-               <wp:category_nicename><![CDATA[maven]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Maven]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>22</wp:term_id>
-               <wp:category_nicename><![CDATA[nodejs]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[nodejs]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>11</wp:term_id>
-               <wp:category_nicename><![CDATA[oauth2]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[oauth2]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>50</wp:term_id>
-               <wp:category_nicename><![CDATA[projects]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Projects]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>5</wp:term_id>
-               <wp:category_nicename><![CDATA[spring]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Spring]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>33</wp:term_id>
-               <wp:category_nicename><![CDATA[spring-boot]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Spring-Boot]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>25</wp:term_id>
-               <wp:category_nicename><![CDATA[thymeleaf]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Thymeleaf]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>72</wp:term_id>
-               <wp:category_nicename><![CDATA[tips]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Tips]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>1</wp:term_id>
-               <wp:category_nicename><![CDATA[uncategorized]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Uncategorized]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>18</wp:term_id>
-               <wp:category_nicename><![CDATA[wordpress]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Wordpress]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>13</wp:term_id>
-               <wp:category_nicename><![CDATA[wro4j]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[]]></wp:category_parent>
-               <wp:cat_name><![CDATA[wro4j]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>10</wp:term_id>
-               <wp:category_nicename><![CDATA[appengine]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[java]]></wp:category_parent>
-               <wp:cat_name><![CDATA[appengine]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>24</wp:term_id>
-               <wp:category_nicename><![CDATA[bootstrap]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[css]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Bootstrap]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>6</wp:term_id>
-               <wp:category_nicename><![CDATA[hibernate]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[java]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Hibernate]]></wp:cat_name>
-       </wp:category>
-       <wp:category>
-               <wp:term_id>34</wp:term_id>
-               <wp:category_nicename><![CDATA[jackson]]></wp:category_nicename>
-               <wp:category_parent><![CDATA[java]]></wp:category_parent>
-               <wp:cat_name><![CDATA[Jackson]]></wp:cat_name>
-       </wp:category>
-       <wp:tag>
-               <wp:term_id>75</wp:term_id>
-               <wp:tag_slug><![CDATA[bash]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[bash]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>60</wp:term_id>
-               <wp:tag_slug><![CDATA[createmedia-nrw]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[CreateMedia.NRW]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>61</wp:term_id>
-               <wp:tag_slug><![CDATA[debian]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[debian]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>69</wp:term_id>
-               <wp:tag_slug><![CDATA[encryption]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[encryption]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>56</wp:term_id>
-               <wp:tag_slug><![CDATA[facebook]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[facebook]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>76</wp:term_id>
-               <wp:tag_slug><![CDATA[git]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[git]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>57</wp:term_id>
-               <wp:tag_slug><![CDATA[graph-api]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[graph-api]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>62</wp:term_id>
-               <wp:tag_slug><![CDATA[hibernate]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[hibernate]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>58</wp:term_id>
-               <wp:tag_slug><![CDATA[jackson]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[jackson]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>52</wp:term_id>
-               <wp:tag_slug><![CDATA[java]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[java]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>63</wp:term_id>
-               <wp:tag_slug><![CDATA[jpa]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[jpa]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>66</wp:term_id>
-               <wp:tag_slug><![CDATA[kafka]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[kafka]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>71</wp:term_id>
-               <wp:tag_slug><![CDATA[less]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[less]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>53</wp:term_id>
-               <wp:tag_slug><![CDATA[maven]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[maven]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>64</wp:term_id>
-               <wp:tag_slug><![CDATA[oauth2]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[oauth2]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>70</wp:term_id>
-               <wp:tag_slug><![CDATA[security]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[security]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>54</wp:term_id>
-               <wp:tag_slug><![CDATA[spring]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[spring]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>55</wp:term_id>
-               <wp:tag_slug><![CDATA[spring-boot]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[spring-boot]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>65</wp:term_id>
-               <wp:tag_slug><![CDATA[spring-social]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[spring-social]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>68</wp:term_id>
-               <wp:tag_slug><![CDATA[tls]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[tls]]></wp:tag_name>
-       </wp:tag>
-       <wp:tag>
-               <wp:term_id>67</wp:term_id>
-               <wp:tag_slug><![CDATA[zookeeper]]></wp:tag_slug>
-               <wp:tag_name><![CDATA[zookeeper]]></wp:tag_name>
-       </wp:tag>
-
-       <generator>https://wordpress.org/?v=5.0.15</generator>
-
-       <item>
-               <title>hama_00054807_stock_recovery</title>
-               <link>https://juplo.de/rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/hama_00054807_stock_recovery/</link>
-               <pubDate>Sun, 16 Feb 2014 11:55:44 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2014/02/hama_00054807_stock_recovery.jpg</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[Screenshot of the stock recovery installed on the Hama 00054807 Intetnet TV Stick]]></excerpt:encoded>
-               <wp:post_id>193</wp:post_id>
-               <wp:post_date><![CDATA[2014-02-16 13:55:44]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-02-16 11:55:44]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[hama_00054807_stock_recovery]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>186</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2014/02/hama_00054807_stock_recovery.jpg]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2014/02/hama_00054807_stock_recovery.jpg]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attachment_metadata]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[a:5:{s:5:"width";i:600;s:6:"height";i:399;s:4:"file";s:40:"2014/02/hama_00054807_stock_recovery.jpg";s:5:"sizes";a:2:{s:9:"thumbnail";a:4:{s:4:"file";s:40:"hama_00054807_stock_recovery-150x150.jpg";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:10:"image/jpeg";}s:6:"medium";a:4:{s:4:"file";s:40:"hama_00054807_stock_recovery-300x199.jpg";s:5:"width";i:300;s:6:"height";i:199;s:9:"mime-type";s:10:"image/jpeg";}}s:10:"image_meta";a:10:{s:8:"aperture";d:5.5999999999999996;s:6:"credit";s:0:"";s:6:"camera";s:9:"NIKON D3S";s:7:"caption";s:0:"";s:17:"created_timestamp";i:1392389293;s:9:"copyright";s:0:"";s:12:"focal_length";s:2:"80";s:3:"iso";s:4:"5000";s:13:"shutter_speed";s:5:"0.008";s:5:"title";s:0:"";}}]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attachment_image_alt]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[stock recovery screenshot]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>jetty.keystore</title>
-               <link>https://juplo.de/jetty/</link>
-               <pubDate>Sun, 23 Feb 2014 10:34:53 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2014/02/jetty.keystore</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>224</wp:post_id>
-               <wp:post_date><![CDATA[2014-02-23 12:34:53]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-02-23 10:34:53]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[jetty]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2014/02/jetty.keystore]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2014/02/jetty.keystore]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>jetty.xml</title>
-               <link>https://juplo.de/configure-https-for-jetty-maven-plugin-9-0-x/jetty-2/</link>
-               <pubDate>Sun, 23 Feb 2014 10:35:40 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2014/02/jetty.xml</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>225</wp:post_id>
-               <wp:post_date><![CDATA[2014-02-23 12:35:40]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-02-23 10:35:40]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[jetty-2]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>209</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2014/02/jetty.xml]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2014/02/jetty.xml]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>jetty-http.xml</title>
-               <link>https://juplo.de/jetty-http/</link>
-               <pubDate>Sun, 23 Feb 2014 10:35:40 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2014/02/jetty-http.xml</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>226</wp:post_id>
-               <wp:post_date><![CDATA[2014-02-23 12:35:40]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-02-23 10:35:40]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[jetty-http]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2014/02/jetty-http.xml]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2014/02/jetty-http.xml]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>jetty-https.xml</title>
-               <link>https://juplo.de/jetty-https/</link>
-               <pubDate>Sun, 23 Feb 2014 10:35:41 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2014/02/jetty-https.xml</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>227</wp:post_id>
-               <wp:post_date><![CDATA[2014-02-23 12:35:41]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-02-23 10:35:41]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[jetty-https]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2014/02/jetty-https.xml]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2014/02/jetty-https.xml]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>jetty-ssl.xml</title>
-               <link>https://juplo.de/jetty-ssl/</link>
-               <pubDate>Sun, 23 Feb 2014 10:35:41 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2014/02/jetty-ssl.xml</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>228</wp:post_id>
-               <wp:post_date><![CDATA[2014-02-23 12:35:41]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-02-23 10:35:41]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[jetty-ssl]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2014/02/jetty-ssl.xml]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2014/02/jetty-ssl.xml]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>der-nutzer-ist-nicht-dazu-berechtigt</title>
-               <link>https://juplo.de/der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen/der-nutzer-ist-nicht-dazu-berechtigt/</link>
-               <pubDate>Sun, 16 Mar 2014 14:17:47 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>276</wp:post_id>
-               <wp:post_date><![CDATA[2014-03-16 16:17:47]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-03-16 14:17:47]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[der-nutzer-ist-nicht-dazu-berechtigt]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>275</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attachment_metadata]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[a:5:{s:5:"width";i:486;s:6:"height";i:244;s:4:"file";s:48:"2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png";s:5:"sizes";a:2:{s:9:"thumbnail";a:4:{s:4:"file";s:48:"der-nutzer-ist-nicht-dazu-berechtigt-150x150.png";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:9:"image/png";}s:6:"medium";a:4:{s:4:"file";s:48:"der-nutzer-ist-nicht-dazu-berechtigt-300x150.png";s:5:"width";i:300;s:6:"height";i:150;s:9:"mime-type";s:9:"image/png";}}s:10:"image_meta";a:10:{s:8:"aperture";i:0;s:6:"credit";s:0:"";s:6:"camera";s:0:"";s:7:"caption";s:0:"";s:17:"created_timestamp";i:0;s:9:"copyright";s:0:"";s:12:"focal_length";i:0;s:3:"iso";i:0;s:13:"shutter_speed";i:0;s:5:"title";s:0:"";}}]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>replace-1</title>
-               <link>https://juplo.de/replace-1/</link>
-               <pubDate>Fri, 08 May 2015 12:06:56 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/05/replace-1.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>342</wp:post_id>
-               <wp:post_date><![CDATA[2015-05-08 14:06:56]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-05-08 12:06:56]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[replace-1]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/05/replace-1.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/05/replace-1.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>replace-2</title>
-               <link>https://juplo.de/replace-2/</link>
-               <pubDate>Fri, 08 May 2015 12:06:58 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/05/replace-2.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>343</wp:post_id>
-               <wp:post_date><![CDATA[2015-05-08 14:06:58]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-05-08 12:06:58]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[replace-2]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/05/replace-2.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/05/replace-2.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-06</title>
-               <link>https://juplo.de/a-perfect-outline/example-06/</link>
-               <pubDate>Tue, 23 Jun 2015 18:33:56 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-06.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>421</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-23 20:33:56]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 18:33:56]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-06]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-06.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-06.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-07</title>
-               <link>https://juplo.de/a-perfect-outline/example-07/</link>
-               <pubDate>Tue, 23 Jun 2015 18:33:57 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-07.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>422</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-23 20:33:57]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 18:33:57]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-07]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-07.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-07.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-08</title>
-               <link>https://juplo.de/a-perfect-outline/example-08/</link>
-               <pubDate>Tue, 23 Jun 2015 18:33:57 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-08.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>423</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-23 20:33:57]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 18:33:57]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-08]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-08.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-08.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-09</title>
-               <link>https://juplo.de/a-perfect-outline/example-09/</link>
-               <pubDate>Tue, 23 Jun 2015 19:46:25 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-09.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>430</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-23 21:46:25]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 19:46:25]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-09]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-09.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-09.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-01</title>
-               <link>https://juplo.de/a-perfect-outline/example-01/</link>
-               <pubDate>Tue, 23 Jun 2015 20:18:20 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-01.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>433</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-23 22:18:20]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 20:18:20]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-01]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-01.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-01.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-02</title>
-               <link>https://juplo.de/a-perfect-outline/example-02/</link>
-               <pubDate>Tue, 23 Jun 2015 20:18:21 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-02.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>434</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-23 22:18:21]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 20:18:21]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-02]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-02.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-02.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-03</title>
-               <link>https://juplo.de/a-perfect-outline/example-03/</link>
-               <pubDate>Tue, 23 Jun 2015 20:18:21 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-03.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>435</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-23 22:18:21]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 20:18:21]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-03]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-03.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-03.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-10</title>
-               <link>https://juplo.de/a-perfect-outline/example-10/</link>
-               <pubDate>Tue, 23 Jun 2015 20:49:51 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-10.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>440</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-23 22:49:51]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 20:49:51]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-10]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-10.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-10.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-04</title>
-               <link>https://juplo.de/a-perfect-outline/example-04/</link>
-               <pubDate>Tue, 23 Jun 2015 20:58:53 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-04.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>442</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-23 22:58:53]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 20:58:53]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-04]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-04.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-04.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-05</title>
-               <link>https://juplo.de/a-perfect-outline/example-05/</link>
-               <pubDate>Tue, 23 Jun 2015 21:03:29 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-05.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>444</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-23 23:03:29]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 21:03:29]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-05]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-05.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-05.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-11</title>
-               <link>https://juplo.de/a-perfect-outline/example-11/</link>
-               <pubDate>Tue, 23 Jun 2015 21:23:01 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-11.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>450</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-23 23:23:01]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 21:23:01]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-11]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-11.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-11.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Lange Ladezeiten durch OpenX-Werbebanner verhindern</title>
-               <link>https://juplo.de/?p=11</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=11</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Wer auf seiner Seite Banner mit Hilfe des freien Ad-Servers <a title="Community-Seite des Ad-Servers OpenX besuchen..." href="http://www.openx.com/community">OpenX</a> Werbe-Banner einbindet, der kennt wahrscheinlich das Problem: <strong>Die Seite lädt ewig lange und ist (insbesondere wenn JavaScript eingesetzt wird) erst dann wirklich bedienbar, wenn alle Werbebanner geladen sind.</strong>\r
-</p>\r
-<h2>Single-Page-Call: Schmerzlinderung - aber keine Heilung</h2>\r
-<p>\r
-Das Problem ist nicht unbekannt. Es gibt unzählige Anleitungen, wie man die Banner-Auslieferung mit Hilfe der <a title="Single-Page-Call-Tutorial lesen" href="http://www.openx.com/docs/tutorials/single+page+call">Single-Page-Call-Technik</a> beschleunigen kann. Single-Page-Call fast die Anfragen, die für die einzelnen Banner an den Ad-Server gestellt werden müssen, in eine Anfrage zusammen und beschleunigt dadurch die Banner-Auslieferung, da unnötige HTTP-Anfragen vermieden werden. Doch das eigentliche Problem wird dadurch nur verringert - nicht behoben:\r
-</p>\r
-<h2>Das Laden der JavaScript-Skripte blockiert die Seite</h2>\r
-<p>\r
-Der Browser muss ein <code>&lt;scrpt&gt;</code>-Tag in dem Moment laden und ausführen, in dem er es in dem HTML-Quellcode der Seite vorfindet. Denn es könnte z.B. einen <code>document.write()</code>-Aufruf enthalten, der die Seite an Ort und Stelle modifiziert. Verschärft wird dieser Umstand weiter dadruch, dass <a href="http://developer.yahoo.com/performance/rules.html#js_bottom" title="Yahoo-Tipps/Erklärungen zu JavaScript anzeigen">der Browser keine anderen Ressourcen laden darf, während er das Skript herunterlädt</a>.\r
-</p>\r
-<p>\r
-Dieser Umstand fällt besonders dann schnell unangenehm auf, wenn OpenX als "Banner" wiederum einen JavaScript-Code eines anderen Ad-Servers (z.B. Google-Ads) ausliefert, so dass sich die Wartezeiten, bis der Browser mit dem Rendern der Seite fortschreiten kann, aufaddieren. <em>Wenn nur einer der Ad-Server in so einer Kette gerade überlastet ist und langsam reagiert, muss der Browser warten!</em>\r
-</p>\r
-<h2>Die Lösung: JavaScript an das Ende der Seite...</h2>\r
-<p>\r
-Die Lösung dieses Problems ist altbekannt. Die JavaScript-Tag's werden an das Ende der HTML-Seite verschoben. Möglichst direkt vor das schließende <code>&lt;/body&gt;</code>-Tag. Ein einfacher Ansatz hierfür wäre, <a href="http://www.openxtips.com/2009/07/tip-20-protect-your-site-from-openx-hangs/" title="Blog-Eintrag, der erklärt wie man die Banner-Codes möglichst weit an das Seitenende verschiebt">einfach die Banner möglichst nah an das Seitenende zu schieben und dann via CSS zu platzieren</a>. Aber dieser Ansatz funktioniert nur mit Bannern vom Typ Superbanner oder Skyscraper. Sobald der Banner im Inhalt stehen soll, wird es schwer (bis unmöglich) dafür via CSS die richtige Menge Platz zu reservieren.\r
-</p>\r
-<p>\r
-Außerdem wäre es noch schöner, wenn man das Laden der Banner erst dann anstoßen könnte, wenn die Seite vollständig geladen ist (und/oder die eigenen Skripte angestoßen/abgearbeitet wurden), also z.B. über das JavaScript-Event <code>window.onload</code>, so daß die Seite bereits voll einsatzfähig ist, bevor die Banner fertig geladen sind.\r
-</p>\r
-<p>Das klingt alles einfach und schön - doch wie so oft gilt leider:\r
-</p>\r
-<h2>Der Teufel steckt im Detail</h2>\r
-\r
-<pre lang="javascript" line="1">\r
-/** Optimierte Methoden für die Werbe-Einblendung via OpenX */\r
-\r
-/** see: http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/ */\r
-\r
-(function( coolibri, $, undefined ) {\r
-\r
-  var\r
-\r
-  /** Muss angepasst werden, wenn die Zonen in OpenX geändert/erweitert werden! */\r
-  zones =  {\r
-    'oa-superbanner' : 15, // Superbanner\r
-    'oa-skyscraper' : 16,  // Skyscraper\r
-    'oa-rectangle' : 14,   // Medium Rectangle\r
-    'oa-content' : 13,     // content quer\r
-    'oa-marginal' : 18,    // Restplatz marginalspalte\r
-    'oa-article' : 17,     // Restplatz unter Artikel\r
-    'oa-prime' : 19,       // Prime Place\r
-    'oa-gallery': 23       // Medium Rectangle Gallery\r
-  },\r
-\r
-  domain = document.location.protocol == 'https:' ? 'https://openx.coolibri.de:8443':'http://openx.coolibri.de',\r
-\r
-  id,\r
-  node,\r
-\r
-  count = 0,\r
-  slots = {},\r
-  queue = [],\r
-  ads = [],\r
-  output = [];\r
-\r
-\r
-  coolibri.show_ads = function() {\r
-\r
-    var name, src = domain;\r
-\r
-    /**\r
-     * Ohne diese Option, hängt jQuery an jede URL, die es per $.getScript()\r
-     * geholt wird einen Timestamp an. Dies kann mit bei Skripten von Dritt-\r
-     * Anbietern zu Problemen führen, wenn diese davon ausgehen, dass die\r
-     * Aufgerufene URL nicht verändert wird...\r
-     */\r
-    $.ajaxSetup({ cache: true });\r
-\r
-    src += "/www/delivery/spc.php?zones=";\r
-\r
-    /** Nur die Banner holen, die in dieser Seite wirklich benötigt werden */\r
-    for(name in zones) {\r
-      $('.oa').each(function() {\r
-        var\r
-        node = $(this),\r
-        id;\r
-        if (node.hasClass(name)) {\r
-          id = 'oa_' + ++count;\r
-          slots[id] = node;\r
-          queue.push(id);\r
-          src += escape(id + '=' + zones[name] + "|");\r
-        }\r
-      });\r
-    }\r
-\r
-    src += "&amp;nz=1&amp;source=" + escape(OA_source);\r
-    src += "&amp;r=" + Math.floor(Math.random()*99999999);\r
-    src += "&amp;block=1&amp;charset=UTF-8";\r
-\r
-    if (window.location)   src += "&amp;loc=" + escape(window.location);\r
-    if (document.referrer) src += "&amp;referer=" + escape(document.referrer);\r
-\r
-    $.getScript(src, init_ads);\r
-\r
-    src = domain + '/www/delivery/fl.js';\r
-    $.getScript(src);\r
-\r
-  }\r
-\r
-  function init_ads() {\r
-\r
-    var i, id;\r
-    for (i=0; i 0) {\r
-\r
-      var result, src, inline, i;\r
-\r
-      id = ads.shift();\r
-      node = slots[id];\r
-\r
-      node.slideDown();\r
-\r
-      // node.append(id + ": " + node.attr('class'));\r
-\r
-      /**\r
-       * Falls zwischenzeitlich Ausgaben über document.write() gemacht wurden,\r
-       * sollen diese als erstes (also bevor die restlichen von dem OpenX-Server\r
-       * gelieferten Statements verarbeitet werden) ausgegeben werden.\r
-       */\r
-      insert_output();\r
-\r
-      while ((result = /&lt;script/i.exec(OA_output[id])) != null) {\r
-        node.append(OA_output[id].slice(0,result.index));\r
-        /** OA_output[id] auf den Text ab &quot;]*)&gt;([\s\S]*?)/i.exec(OA_output[id]);\r
-        if (result == null) {\r
-          /** Ungültige Syntax in der OpenX-Antwort. Rest der Antwort ignorieren! */\r
-          // alert(OA_output[id]);\r
-          OA_output[id] = "";\r
-        }\r
-        else {\r
-          /** Iinline-Code merken, falls vorhanden */\r
-          src = result[1]\r
-          inline = result[2];\r
-          /** OA_output[id] auf den Text nach dem schließenden -Tag kürzen */\r
-          OA_output[id] = OA_output[id].slice(result[0].length,OA_output[id].length);\r
-          result = /src\s*=\s*['"]([^'"]*)['"]/i.exec(src);\r
-          if (result == null) {\r
-            /** script-Tag mit Inline-Anweisungen: Inline-Anweisungen ausführen! */\r
-            result = /^\s* 0)\r
-              /** Der Banner-Code wurde noch nicht vollständig ausgegeben! */\r
-              ads.unshift(id);\r
-            /** So - jetzt erst mal das Skript laden und verarbeiten... */\r
-            $.getScript(result[1], render_ads); // &lt;&lt; jQuery.getScript() erzeugt onload-Handler für _alle_ Browser ;)\r
-            return;\r
-          }\r
-        }\r
-      }\r
-\r
-      node.append(OA_output[id]);\r
-      OA_output[id] = &quot;&quot;;\r
-    }\r
-\r
-    /** Alle Einträge aus OA_output wurden gerendert */\r
-\r
-    id = undefined;\r
-    node = undefined;\r
-\r
-  }\r
-\r
-  /** Mit dieser Funktion werden document.write und document.writeln überschrieben */\r
-  function document_write() {\r
-\r
-    if (id == undefined)\r
-      return;\r
-\r
-    for (var i=0; i 0) {\r
-      output.push(OA_output[id]);\r
-      OA_output[id] = "";\r
-      for (i=0; i&lt;output.length; i++)\r
-        OA_output[id] += output[i];\r
-      output = [];\r
-    }\r
-\r
-  }\r
-\r
-} ( window.coolibri = window.coolibri || {}, jQuery ));\r
-\r
-/** Weil sich der IE sonst ggf. über die nicht definierte Variable lautstark aufregt, wenn irgendetwas schief geht... */\r
-var OA_output = {};\r
-</pre>\r
-\r
-<h2>Weiterlesen...</h2>\r
-<ul>\r
-<li><a href="http://stackoverflow.com/questions/3770570/how-can-we-keep-openx-from-blocking-page-load">How can we keep Openx from blocking page load</a></li>\r
-<li><a href="http://www.openxtips.com/2009/07/tip-20-protect-your-site-from-openx-hangs/">Protect your site from OpenX-hangs</a></li>\r
-<li><a href="http://www.stevesouders.com/blog/2009/04/27/loading-scripts-without-blocking/">Loading scripts without blocking</a></li>\r
-\r
-</ul>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>11</wp:post_id>
-               <wp:post_date><![CDATA[2012-11-25 18:11:52]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Blog</title>
-               <link>https://juplo.de/blog/</link>
-               <pubDate>Thu, 10 Oct 2013 20:43:16 +0000</pubDate>
-               <dc:creator><![CDATA[tortenheber]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?page_id=108</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>108</wp:post_id>
-               <wp:post_date><![CDATA[2013-10-10 22:43:16]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2013-10-10 20:43:16]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[blog]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>1</wp:menu_order>
-               <wp:post_type><![CDATA[page]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Projects</title>
-               <link>https://juplo.de/projects/</link>
-               <pubDate>Tue, 11 Mar 2014 17:54:09 +0000</pubDate>
-               <dc:creator><![CDATA[tortenheber]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?page_id=111</guid>
-               <description></description>
-               <content:encoded><![CDATA[<div class="wip">\r
-  <img class="w" src="/img/comming-soon.png" alt="Comming soon..."/>\r
-\r
-<p>\r
-  <strong>Lorem ipsum</strong> dolor <a href="/projects/typo.html">sit amet</a>, consectetur adipisicing elit, sed do\r
-  eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim\r
-  ad minim veniam, quis nostrud <a href="/projects/html-experimente.html">exercitation</a> ullamco laboris nisi ut\r
-  aliquip ex ea commodo consequat. Duis aute irure dolor in\r
-  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla\r
-  pariatur. Excepteur sint occaecat cupidatat non proident, sunt in\r
-  culpa qui officia deserunt mollit anim id est laborum.\r
-</p>\r
-<h2>Duis aute irure dolor</h2>\r
-<ul>\r
-  <li>Operators and other mathematical stuff: -+/*</li>\r
-  <li>Characters offten used in programming languages: {(&lt;&gt;)}@$?%*#;:&amp;/\!^&#034;&#039;`~</li>\r
-  <li>Special german characters: ÄäÖöÜü</li>\r
-  <li>Other special characters: @€¢§%°</li>\r
-</ul>\r
-<h2>Excepteur sint occaecat cupidatat</h2>\r
-<p>\r
-  Lorem ipsum dolor <em>sit amet</em>, consectetur adipisicing elit, sed do\r
-  eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim\r
-  ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut\r
-  aliquip ex ea commodo consequat. Duis aute irure dolor in\r
-  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla\r
-  pariatur. Excepteur sint occaecat cupidatat non proident, sunt in\r
-  culpa qui officia deserunt mollit anim id est laborum.\r
-</p>\r
-<p>\r
-  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do\r
-  eiusmod tempor incididunt ut labore et dolore magna aliqua. <strong>Ut enim\r
-  ad minim veniam, quis nostrud <em>exercitation ullamco</em> laboris nisi ut\r
-  aliquip ex ea commodo consequat</strong>. Duis aute irure dolor in\r
-  reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla\r
-  pariatur. Excepteur sint occaecat cupidatat non proident, sunt in\r
-  culpa qui officia deserunt mollit anim id est laborum.\r
-</p>\r
-\r
-</div>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>111</wp:post_id>
-               <wp:post_date><![CDATA[2014-03-11 19:54:09]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-03-11 17:54:09]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[projects]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[page]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Home</title>
-               <link>https://juplo.de/?p=180</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[tortenheber]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=180</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>180</wp:post_id>
-               <wp:post_date><![CDATA[2013-12-24 13:38:21]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>1</wp:menu_order>
-               <wp:post_type><![CDATA[nav_menu_item]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_type]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[custom]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_menu_item_parent]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[0]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_object_id]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[180]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_object]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[custom]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_target]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_classes]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[a:1:{i:0;s:0:"";}]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_xfn]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_url]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[http://juplo.de/]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_orphaned]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[1387885101]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title></title>
-               <link>https://juplo.de/?p=182</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[tortenheber]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=182</guid>
-               <description></description>
-               <content:encoded><![CDATA[ ]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>182</wp:post_id>
-               <wp:post_date><![CDATA[2013-12-24 13:38:21]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>1</wp:menu_order>
-               <wp:post_type><![CDATA[nav_menu_item]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_type]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[post_type]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_menu_item_parent]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[0]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_object_id]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[108]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_object]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[page]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_target]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_classes]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[a:1:{i:0;s:0:"";}]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_xfn]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_url]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_menu_item_orphaned]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[1387885101]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Install Google Play on Hama...</title>
-               <link>https://juplo.de/?p=203</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=203</guid>
-               <description></description>
-               <content:encoded><![CDATA[\r
-<a href="http://goo-inside.me/gapps/gapps-ics-20120317-signed.zip" title="Download Google Apps for Android 4.0.x (Ice Cream Sandwich)">Google Aps</a>\r
-\r
-You need the Google Apps for Android 4.0.x (called Ice Cream Sandwich internally). These accord to Cyanogenmod 9 and download-links can be found on the <a href="http://wiki.cyanogenmod.org/w/Google_Apps" title="Google Apps download-page from cyanogenmod">Cyanogenmod's "Google Apps"-page</a>.]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>203</wp:post_id>
-               <wp:post_date><![CDATA[2014-02-17 01:25:20]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>FRONT</title>
-               <link>https://juplo.de/</link>
-               <pubDate>Tue, 11 Mar 2014 17:38:46 +0000</pubDate>
-               <dc:creator><![CDATA[tortenheber]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?page_id=271</guid>
-               <description></description>
-               <content:encoded><![CDATA[<div class="pack bg cf">\r
-  <div class="p right">\r
-      <h2>Funded by the Europian Union</h2>\r
-      <p>\r
-        As partner of the company \r
-        <a href="http://yourshouter.com" title="Visit the Homepage of the company">yourSHOUTER UG (haftungsbeschränkt)</a>\r
-        we publish results of a\r
-        <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-        that is funded by the European Union and the federal state Northrhine-Westphalia.\r
-      </p>\r
-      <p>\r
-        <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-          <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="100%" />\r
-          <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="100%" />\r
-        </a>\r
-      </p>\r
-  </div>\r
-  <div class="p left">\r
-    <h2>About juplo</h2>\r
-    <ul>\r
-      <li><a href="/about.html" title="Visit my about-pag">More about juplo</a></li>\r
-      <li><a href="/blog/" title="(Hopefully) helpful stuff">Blog</a></li>\r
-      <li><a href="/projects/" title="All current projects">Projects</a></li>\r
-      <li><a href="/contact.html" title="All contact-information on a glance">Contact</a></li>\r
-    </ul>\r
-    <h2>Work In Progress...</h2>\r
-    <p>Due to lack of time, this page is still under construction.</p>\r
-    <p style="text-align: center"><img src="/img/wip.gif" alt="Man bashing his head on a computer-keyboard"/></p>\r
-    <p>So, please be a litle more patiance with us...</p>\r
-  </div>\r
-</div>\r
-<div class="single bg">\r
-  <br/>\r
-  <h2>hibernate-maven-plugin</h2>\r
-  <p><strong>A simple Plugin for generating a Database-Schema from Hibernate Mapping-Annotations</strong></p>\r
-  <p>hibernate4-maven-plugin is a plugin for generating a database-schema from your Hibernate-Mappings and create or update your database accordingly. Its main usage is to automatically create and populate a test-database for unit-tests in cooperation with the dbunit-maven-plugin.</p>\r
-  <p><a href="/hibernate-maven-plugin/" title="Visit the plugin-documentation">Learn more</a></p>\r
-</div>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>271</wp:post_id>
-               <wp:post_date><![CDATA[2014-03-11 19:38:46]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-03-11 17:38:46]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[front]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[page]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-12</title>
-               <link>https://juplo.de/a-perfect-outline/example-12/</link>
-               <pubDate>Tue, 23 Jun 2015 22:18:14 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-12.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>454</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-24 00:18:14]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 22:18:14]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-12]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-12.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-12.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-13</title>
-               <link>https://juplo.de/a-perfect-outline/example-13/</link>
-               <pubDate>Tue, 23 Jun 2015 22:18:14 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-13.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>455</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-24 00:18:14]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 22:18:14]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-13]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-13.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-13.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>example-14</title>
-               <link>https://juplo.de/a-perfect-outline/example-14/</link>
-               <pubDate>Tue, 23 Jun 2015 22:40:54 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2015/06/example-14.html</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>458</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-24 00:40:54]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 22:40:54]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[example-14]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>357</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2015/06/example-14.html]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2015/06/example-14.html]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>NextGEN Basic Thumbnails</title>
-               <link>https://juplo.de/?post_type=display_type&#038;p=962</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[tortenheber]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?post_type=display_type&#038;p=962</guid>
-               <description></description>
-               <content:encoded><![CDATA[eyJ0aXRsZSI6Ik5leHRHRU4gQmFzaWMgVGh1bWJuYWlscyIsIm1vZHVsZV9pZCI6InBob3RvY3JhdGktbmV4dGdlbl9iYXNpY19nYWxsZXJ5IiwiZW50aXR5X3R5cGVzIjpbImltYWdlIl0sInByZXZpZXdfaW1hZ2VfcmVscGF0aCI6InBob3RvY3JhdGktbmV4dGdlbl9iYXNpY19nYWxsZXJ5I3RodW1iX3ByZXZpZXcuanBnIiwiZGVmYXVsdF9zb3VyY2UiOiJnYWxsZXJpZXMiLCJ2aWV3X29yZGVyIjoxMDAwMCwiYWxpYXNlcyI6WyJiYXNpY190aHVtYm5haWwiLCJiYXNpY190aHVtYm5haWxzIiwibmV4dGdlbl9iYXNpY190aHVtYm5haWxzIl0sIm5hbWUiOiJwaG90b2NyYXRpLW5leHRnZW5fYmFzaWNfdGh1bWJuYWlscyIsImluc3RhbGxlZF9hdF92ZXJzaW9uIjoiMy4yLjE4IiwiaWRfZmllbGQiOiJJRCIsInNldHRpbmdzIjp7InVzZV9saWdodGJveF9lZmZlY3QiOnRydWUsImRpc3BsYXlfdmlldyI6ImRlZmF1bHQtdmlldy5waHAiLCJpbWFnZXNfcGVyX3BhZ2UiOiIyNCIsIm51bWJlcl9vZl9jb2x1bW5zIjowLCJ0aHVtYm5haWxfd2lkdGgiOjI0MCwidGh1bWJuYWlsX2hlaWdodCI6MTYwLCJzaG93X2FsbF9pbl9saWdodGJveCI6MCwiYWpheF9wYWdpbmF0aW9uIjoxLCJ1c2VfaW1hZ2Vicm93c2VyX2VmZmVjdCI6MCwidGVtcGxhdGUiOiIiLCJkaXNwbGF5X25vX2ltYWdlc19lcnJvciI6MSwiZGlzYWJsZV9wYWdpbmF0aW9uIjowLCJzaG93X3NsaWRlc2hvd19saW5rIjowLCJzbGlkZXNob3dfbGlua190ZXh0IjoiVmlldyBTbGlkZXNob3ciLCJvdmVycmlkZV90aHVtYm5haWxfc2V0dGluZ3MiOjAsInRodW1ibmFpbF9xdWFsaXR5IjoiMTAwIiwidGh1bWJuYWlsX2Nyb3AiOjEsInRodW1ibmFpbF93YXRlcm1hcmsiOjAsIm5nZ190cmlnZ2Vyc19kaXNwbGF5IjoibmV2ZXIiLCJfZXJyb3JzIjpbXX0sImhpZGRlbl9mcm9tX3VpIjpmYWxzZSwiaGlkZGVuX2Zyb21faWd3IjpmYWxzZSwiX19kZWZhdWx0c19zZXQiOnRydWV9]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>962</wp:post_id>
-               <wp:post_date><![CDATA[2019-10-05 11:57:34]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[closed]]></wp:comment_status>
-               <wp:ping_status><![CDATA[closed]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[display_type]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[title]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[NextGEN Basic Thumbnails]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[module_id]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_gallery]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[preview_image_relpath]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_gallery#thumb_preview.jpg]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[default_source]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[galleries]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[view_order]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[10000]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[name]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_thumbnails]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[installed_at_version]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3.2.18]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_ui]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_igw]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[__defaults_set]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[1]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[filter]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[raw]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[entity_types]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJpbWFnZSJd]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[aliases]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJiYXNpY190aHVtYm5haWwiLCJiYXNpY190aHVtYm5haWxzIiwibmV4dGdlbl9iYXNpY190aHVtYm5haWxzIl0=]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[id_field]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[ID]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[settings]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[eyJ1c2VfbGlnaHRib3hfZWZmZWN0Ijp0cnVlLCJkaXNwbGF5X3ZpZXciOiJkZWZhdWx0LXZpZXcucGhwIiwiaW1hZ2VzX3Blcl9wYWdlIjoiMjQiLCJudW1iZXJfb2ZfY29sdW1ucyI6MCwidGh1bWJuYWlsX3dpZHRoIjoyNDAsInRodW1ibmFpbF9oZWlnaHQiOjE2MCwic2hvd19hbGxfaW5fbGlnaHRib3giOjAsImFqYXhfcGFnaW5hdGlvbiI6MSwidXNlX2ltYWdlYnJvd3Nlcl9lZmZlY3QiOjAsInRlbXBsYXRlIjoiIiwiZGlzcGxheV9ub19pbWFnZXNfZXJyb3IiOjEsImRpc2FibGVfcGFnaW5hdGlvbiI6MCwic2hvd19zbGlkZXNob3dfbGluayI6MCwic2xpZGVzaG93X2xpbmtfdGV4dCI6IlZpZXcgU2xpZGVzaG93Iiwib3ZlcnJpZGVfdGh1bWJuYWlsX3NldHRpbmdzIjowLCJ0aHVtYm5haWxfcXVhbGl0eSI6IjEwMCIsInRodW1ibmFpbF9jcm9wIjoxLCJ0aHVtYm5haWxfd2F0ZXJtYXJrIjowLCJuZ2dfdHJpZ2dlcnNfZGlzcGxheSI6Im5ldmVyIiwiX2Vycm9ycyI6W119]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>NextGEN Basic Slideshow</title>
-               <link>https://juplo.de/?post_type=display_type&#038;p=963</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[tortenheber]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?post_type=display_type&#038;p=963</guid>
-               <description></description>
-               <content:encoded><![CDATA[eyJ0aXRsZSI6Ik5leHRHRU4gQmFzaWMgU2xpZGVzaG93IiwibW9kdWxlX2lkIjoicGhvdG9jcmF0aS1uZXh0Z2VuX2Jhc2ljX2dhbGxlcnkiLCJlbnRpdHlfdHlwZXMiOlsiaW1hZ2UiXSwicHJldmlld19pbWFnZV9yZWxwYXRoIjoicGhvdG9jcmF0aS1uZXh0Z2VuX2Jhc2ljX2dhbGxlcnkjc2xpZGVzaG93X3ByZXZpZXcuanBnIiwiZGVmYXVsdF9zb3VyY2UiOiJnYWxsZXJpZXMiLCJ2aWV3X29yZGVyIjoxMDAxMCwiYWxpYXNlcyI6WyJiYXNpY19zbGlkZXNob3ciLCJuZXh0Z2VuX2Jhc2ljX3NsaWRlc2hvdyJdLCJuYW1lIjoicGhvdG9jcmF0aS1uZXh0Z2VuX2Jhc2ljX3NsaWRlc2hvdyIsImluc3RhbGxlZF9hdF92ZXJzaW9uIjoiMy4yLjE4IiwiaWRfZmllbGQiOiJJRCIsInNldHRpbmdzIjp7InVzZV9saWdodGJveF9lZmZlY3QiOnRydWUsImdhbGxlcnlfd2lkdGgiOjc1MCwiZ2FsbGVyeV9oZWlnaHQiOjUwMCwic2hvd190aHVtYm5haWxfbGluayI6MCwidGh1bWJuYWlsX2xpbmtfdGV4dCI6IlZpZXcgVGh1bWJuYWlscyIsInRlbXBsYXRlIjoiIiwiZGlzcGxheV92aWV3IjoiZGVmYXVsdCIsImF1dG9wbGF5IjoxLCJwYXVzZW9uaG92ZXIiOjEsImFycm93cyI6MCwiaW50ZXJ2YWwiOjMwMDAsInRyYW5zaXRpb25fc3BlZWQiOjMwMCwidHJhbnNpdGlvbl9zdHlsZSI6ImZhZGUiLCJuZ2dfdHJpZ2dlcnNfZGlzcGxheSI6Im5ldmVyIiwiX2Vycm9ycyI6W119LCJoaWRkZW5fZnJvbV91aSI6ZmFsc2UsImhpZGRlbl9mcm9tX2lndyI6ZmFsc2UsIl9fZGVmYXVsdHNfc2V0Ijp0cnVlfQ==]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>963</wp:post_id>
-               <wp:post_date><![CDATA[2019-10-05 11:57:34]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[closed]]></wp:comment_status>
-               <wp:ping_status><![CDATA[closed]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[display_type]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[title]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[NextGEN Basic Slideshow]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[module_id]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_gallery]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[preview_image_relpath]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_gallery#slideshow_preview.jpg]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[default_source]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[galleries]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[view_order]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[10010]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[name]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_slideshow]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[installed_at_version]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3.2.18]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_ui]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_igw]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[__defaults_set]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[1]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[filter]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[raw]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[entity_types]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJpbWFnZSJd]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[aliases]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJiYXNpY19zbGlkZXNob3ciLCJuZXh0Z2VuX2Jhc2ljX3NsaWRlc2hvdyJd]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[id_field]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[ID]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[settings]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[eyJ1c2VfbGlnaHRib3hfZWZmZWN0Ijp0cnVlLCJnYWxsZXJ5X3dpZHRoIjo3NTAsImdhbGxlcnlfaGVpZ2h0Ijo1MDAsInNob3dfdGh1bWJuYWlsX2xpbmsiOjAsInRodW1ibmFpbF9saW5rX3RleHQiOiJWaWV3IFRodW1ibmFpbHMiLCJ0ZW1wbGF0ZSI6IiIsImRpc3BsYXlfdmlldyI6ImRlZmF1bHQiLCJhdXRvcGxheSI6MSwicGF1c2VvbmhvdmVyIjoxLCJhcnJvd3MiOjAsImludGVydmFsIjozMDAwLCJ0cmFuc2l0aW9uX3NwZWVkIjozMDAsInRyYW5zaXRpb25fc3R5bGUiOiJmYWRlIiwibmdnX3RyaWdnZXJzX2Rpc3BsYXkiOiJuZXZlciIsIl9lcnJvcnMiOltdfQ==]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>NextGEN Basic ImageBrowser</title>
-               <link>https://juplo.de/?post_type=display_type&#038;p=964</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[tortenheber]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?post_type=display_type&#038;p=964</guid>
-               <description></description>
-               <content:encoded><![CDATA[eyJ0aXRsZSI6Ik5leHRHRU4gQmFzaWMgSW1hZ2VCcm93c2VyIiwiZW50aXR5X3R5cGVzIjpbImltYWdlIl0sInByZXZpZXdfaW1hZ2VfcmVscGF0aCI6InBob3RvY3JhdGktbmV4dGdlbl9iYXNpY19pbWFnZWJyb3dzZXIjcHJldmlldy5qcGciLCJkZWZhdWx0X3NvdXJjZSI6ImdhbGxlcmllcyIsInZpZXdfb3JkZXIiOjEwMDIwLCJhbGlhc2VzIjpbImJhc2ljX2ltYWdlYnJvd3NlciIsImltYWdlYnJvd3NlciIsIm5leHRnZW5fYmFzaWNfaW1hZ2Vicm93c2VyIl0sIm5hbWUiOiJwaG90b2NyYXRpLW5leHRnZW5fYmFzaWNfaW1hZ2Vicm93c2VyIiwiaW5zdGFsbGVkX2F0X3ZlcnNpb24iOiIzLjIuMTgiLCJpZF9maWVsZCI6IklEIiwic2V0dGluZ3MiOnsidXNlX2xpZ2h0Ym94X2VmZmVjdCI6dHJ1ZSwiZGlzcGxheV92aWV3IjoiZGVmYXVsdC12aWV3LnBocCIsInRlbXBsYXRlIjoiIiwiYWpheF9wYWdpbmF0aW9uIjoiMSIsIm5nZ190cmlnZ2Vyc19kaXNwbGF5IjoibmV2ZXIiLCJfZXJyb3JzIjpbXX0sImhpZGRlbl9mcm9tX3VpIjpmYWxzZSwiaGlkZGVuX2Zyb21faWd3IjpmYWxzZSwiX19kZWZhdWx0c19zZXQiOnRydWV9]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>964</wp:post_id>
-               <wp:post_date><![CDATA[2019-10-05 11:57:34]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[closed]]></wp:comment_status>
-               <wp:ping_status><![CDATA[closed]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[display_type]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[title]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[NextGEN Basic ImageBrowser]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[preview_image_relpath]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_imagebrowser#preview.jpg]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[default_source]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[galleries]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[view_order]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[10020]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[name]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_imagebrowser]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[installed_at_version]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3.2.18]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_ui]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_igw]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[__defaults_set]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[1]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[filter]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[raw]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[entity_types]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJpbWFnZSJd]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[aliases]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJiYXNpY19pbWFnZWJyb3dzZXIiLCJpbWFnZWJyb3dzZXIiLCJuZXh0Z2VuX2Jhc2ljX2ltYWdlYnJvd3NlciJd]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[id_field]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[ID]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[settings]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[eyJ1c2VfbGlnaHRib3hfZWZmZWN0Ijp0cnVlLCJkaXNwbGF5X3ZpZXciOiJkZWZhdWx0LXZpZXcucGhwIiwidGVtcGxhdGUiOiIiLCJhamF4X3BhZ2luYXRpb24iOiIxIiwibmdnX3RyaWdnZXJzX2Rpc3BsYXkiOiJuZXZlciIsIl9lcnJvcnMiOltdfQ==]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>NextGEN Basic SinglePic</title>
-               <link>https://juplo.de/?post_type=display_type&#038;p=965</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[tortenheber]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?post_type=display_type&#038;p=965</guid>
-               <description></description>
-               <content:encoded><![CDATA[eyJ0aXRsZSI6Ik5leHRHRU4gQmFzaWMgU2luZ2xlUGljIiwiZW50aXR5X3R5cGVzIjpbImltYWdlIl0sInByZXZpZXdfaW1hZ2VfcmVscGF0aCI6InBob3RvY3JhdGktbmV4dGdlbl9iYXNpY19zaW5nbGVwaWMjcHJldmlldy5naWYiLCJkZWZhdWx0X3NvdXJjZSI6ImdhbGxlcmllcyIsInZpZXdfb3JkZXIiOjEwMDYwLCJoaWRkZW5fZnJvbV91aSI6dHJ1ZSwiaGlkZGVuX2Zyb21faWd3Ijp0cnVlLCJhbGlhc2VzIjpbImJhc2ljX3NpbmdsZXBpYyIsInNpbmdsZXBpYyIsIm5leHRnZW5fYmFzaWNfc2luZ2xlcGljIl0sIm5hbWUiOiJwaG90b2NyYXRpLW5leHRnZW5fYmFzaWNfc2luZ2xlcGljIiwiaW5zdGFsbGVkX2F0X3ZlcnNpb24iOiIzLjIuMTgiLCJpZF9maWVsZCI6IklEIiwic2V0dGluZ3MiOnsidXNlX2xpZ2h0Ym94X2VmZmVjdCI6dHJ1ZSwid2lkdGgiOiIiLCJoZWlnaHQiOiIiLCJtb2RlIjoiIiwiZGlzcGxheV93YXRlcm1hcmsiOjAsImRpc3BsYXlfcmVmbGVjdGlvbiI6MCwiZmxvYXQiOiIiLCJsaW5rIjoiIiwibGlua190YXJnZXQiOiJfYmxhbmsiLCJxdWFsaXR5IjoxMDAsImNyb3AiOjAsInRlbXBsYXRlIjoiIiwibmdnX3RyaWdnZXJzX2Rpc3BsYXkiOiJuZXZlciIsIl9lcnJvcnMiOltdfSwiX19kZWZhdWx0c19zZXQiOnRydWV9]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>965</wp:post_id>
-               <wp:post_date><![CDATA[2019-10-05 11:57:34]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[closed]]></wp:comment_status>
-               <wp:ping_status><![CDATA[closed]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[display_type]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[title]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[NextGEN Basic SinglePic]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[preview_image_relpath]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_singlepic#preview.gif]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[default_source]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[galleries]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[view_order]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[10060]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_ui]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[1]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_igw]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[1]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[name]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_singlepic]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[installed_at_version]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3.2.18]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[__defaults_set]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[1]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[filter]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[raw]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[entity_types]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJpbWFnZSJd]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[aliases]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJiYXNpY19zaW5nbGVwaWMiLCJzaW5nbGVwaWMiLCJuZXh0Z2VuX2Jhc2ljX3NpbmdsZXBpYyJd]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[id_field]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[ID]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[settings]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[eyJ1c2VfbGlnaHRib3hfZWZmZWN0Ijp0cnVlLCJ3aWR0aCI6IiIsImhlaWdodCI6IiIsIm1vZGUiOiIiLCJkaXNwbGF5X3dhdGVybWFyayI6MCwiZGlzcGxheV9yZWZsZWN0aW9uIjowLCJmbG9hdCI6IiIsImxpbmsiOiIiLCJsaW5rX3RhcmdldCI6Il9ibGFuayIsInF1YWxpdHkiOjEwMCwiY3JvcCI6MCwidGVtcGxhdGUiOiIiLCJuZ2dfdHJpZ2dlcnNfZGlzcGxheSI6Im5ldmVyIiwiX2Vycm9ycyI6W119]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>NextGEN Basic TagCloud</title>
-               <link>https://juplo.de/?post_type=display_type&#038;p=966</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[tortenheber]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?post_type=display_type&#038;p=966</guid>
-               <description></description>
-               <content:encoded><![CDATA[eyJ0aXRsZSI6Ik5leHRHRU4gQmFzaWMgVGFnQ2xvdWQiLCJlbnRpdHlfdHlwZXMiOlsiaW1hZ2UiXSwicHJldmlld19pbWFnZV9yZWxwYXRoIjoicGhvdG9jcmF0aS1uZXh0Z2VuX2Jhc2ljX3RhZ2Nsb3VkI3ByZXZpZXcuZ2lmIiwiZGVmYXVsdF9zb3VyY2UiOiJ0YWdzIiwidmlld19vcmRlciI6MTAxMDAsImFsaWFzZXMiOlsiYmFzaWNfdGFnY2xvdWQiLCJ0YWdjbG91ZCIsIm5leHRnZW5fYmFzaWNfdGFnY2xvdWQiXSwibmFtZSI6InBob3RvY3JhdGktbmV4dGdlbl9iYXNpY190YWdjbG91ZCIsImluc3RhbGxlZF9hdF92ZXJzaW9uIjoiMy4yLjE4IiwiaWRfZmllbGQiOiJJRCIsInNldHRpbmdzIjp7InVzZV9saWdodGJveF9lZmZlY3QiOnRydWUsImdhbGxlcnlfZGlzcGxheV90eXBlIjoicGhvdG9jcmF0aS1uZXh0Z2VuX2Jhc2ljX3RodW1ibmFpbHMiLCJudW1iZXIiOjQ1LCJuZ2dfdHJpZ2dlcnNfZGlzcGxheSI6Im5ldmVyIiwiX2Vycm9ycyI6W119LCJoaWRkZW5fZnJvbV91aSI6ZmFsc2UsImhpZGRlbl9mcm9tX2lndyI6ZmFsc2UsIl9fZGVmYXVsdHNfc2V0Ijp0cnVlfQ==]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>966</wp:post_id>
-               <wp:post_date><![CDATA[2019-10-05 11:57:34]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[closed]]></wp:comment_status>
-               <wp:ping_status><![CDATA[closed]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[display_type]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[title]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[NextGEN Basic TagCloud]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[preview_image_relpath]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_tagcloud#preview.gif]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[default_source]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[tags]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[view_order]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[10100]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[name]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_tagcloud]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[installed_at_version]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3.2.18]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_ui]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_igw]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[__defaults_set]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[1]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[filter]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[raw]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[entity_types]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJpbWFnZSJd]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[aliases]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJiYXNpY190YWdjbG91ZCIsInRhZ2Nsb3VkIiwibmV4dGdlbl9iYXNpY190YWdjbG91ZCJd]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[id_field]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[ID]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[settings]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[eyJ1c2VfbGlnaHRib3hfZWZmZWN0Ijp0cnVlLCJnYWxsZXJ5X2Rpc3BsYXlfdHlwZSI6InBob3RvY3JhdGktbmV4dGdlbl9iYXNpY190aHVtYm5haWxzIiwibnVtYmVyIjo0NSwibmdnX3RyaWdnZXJzX2Rpc3BsYXkiOiJuZXZlciIsIl9lcnJvcnMiOltdfQ==]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>NextGEN Basic Compact Album</title>
-               <link>https://juplo.de/?post_type=display_type&#038;p=967</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[tortenheber]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?post_type=display_type&#038;p=967</guid>
-               <description></description>
-               <content:encoded><![CDATA[eyJ0aXRsZSI6Ik5leHRHRU4gQmFzaWMgQ29tcGFjdCBBbGJ1bSIsIm1vZHVsZV9pZCI6InBob3RvY3JhdGktbmV4dGdlbl9iYXNpY19hbGJ1bSIsImVudGl0eV90eXBlcyI6WyJhbGJ1bSIsImdhbGxlcnkiXSwicHJldmlld19pbWFnZV9yZWxwYXRoIjoicGhvdG9jcmF0aS1uZXh0Z2VuX2Jhc2ljX2FsYnVtI2NvbXBhY3RfcHJldmlldy5qcGciLCJkZWZhdWx0X3NvdXJjZSI6ImFsYnVtcyIsInZpZXdfb3JkZXIiOjEwMjAwLCJhbGlhc2VzIjpbImJhc2ljX2NvbXBhY3RfYWxidW0iLCJuZXh0Z2VuX2Jhc2ljX2FsYnVtIiwiYmFzaWNfYWxidW1fY29tcGFjdCIsImNvbXBhY3RfYWxidW0iXSwibmFtZSI6InBob3RvY3JhdGktbmV4dGdlbl9iYXNpY19jb21wYWN0X2FsYnVtIiwiaW5zdGFsbGVkX2F0X3ZlcnNpb24iOiIzLjIuMTgiLCJpZF9maWVsZCI6IklEIiwic2V0dGluZ3MiOnsidXNlX2xpZ2h0Ym94X2VmZmVjdCI6dHJ1ZSwiZGlzcGxheV92aWV3IjoiZGVmYXVsdC12aWV3LnBocCIsImdhbGxlcmllc19wZXJfcGFnZSI6MCwiZW5hYmxlX2JyZWFkY3J1bWJzIjoxLCJkaXNhYmxlX3BhZ2luYXRpb24iOjAsImVuYWJsZV9kZXNjcmlwdGlvbnMiOjAsInRlbXBsYXRlIjoiIiwib3Blbl9nYWxsZXJ5X2luX2xpZ2h0Ym94IjowLCJvdmVycmlkZV90aHVtYm5haWxfc2V0dGluZ3MiOjEsInRodW1ibmFpbF9xdWFsaXR5IjoxMDAsInRodW1ibmFpbF9jcm9wIjoxLCJ0aHVtYm5haWxfd2F0ZXJtYXJrIjowLCJ0aHVtYm5haWxfd2lkdGgiOjI0MCwidGh1bWJuYWlsX2hlaWdodCI6MTYwLCJnYWxsZXJ5X2Rpc3BsYXlfdHlwZSI6InBob3RvY3JhdGktbmV4dGdlbl9iYXNpY190aHVtYm5haWxzIiwiZ2FsbGVyeV9kaXNwbGF5X3RlbXBsYXRlIjoiIiwibmdnX3RyaWdnZXJzX2Rpc3BsYXkiOiJuZXZlciIsIl9lcnJvcnMiOltdfSwiaGlkZGVuX2Zyb21fdWkiOmZhbHNlLCJoaWRkZW5fZnJvbV9pZ3ciOmZhbHNlLCJfX2RlZmF1bHRzX3NldCI6dHJ1ZX0=]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>967</wp:post_id>
-               <wp:post_date><![CDATA[2019-10-05 11:57:34]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[closed]]></wp:comment_status>
-               <wp:ping_status><![CDATA[closed]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[display_type]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[title]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[NextGEN Basic Compact Album]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[module_id]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_album]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[preview_image_relpath]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_album#compact_preview.jpg]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[default_source]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[albums]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[view_order]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[10200]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[name]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_compact_album]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[installed_at_version]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3.2.18]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_ui]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_igw]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[__defaults_set]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[1]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[filter]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[raw]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[entity_types]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJhbGJ1bSIsImdhbGxlcnkiXQ==]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[aliases]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJiYXNpY19jb21wYWN0X2FsYnVtIiwibmV4dGdlbl9iYXNpY19hbGJ1bSIsImJhc2ljX2FsYnVtX2NvbXBhY3QiLCJjb21wYWN0X2FsYnVtIl0=]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[id_field]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[ID]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[settings]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[eyJ1c2VfbGlnaHRib3hfZWZmZWN0Ijp0cnVlLCJkaXNwbGF5X3ZpZXciOiJkZWZhdWx0LXZpZXcucGhwIiwiZ2FsbGVyaWVzX3Blcl9wYWdlIjowLCJlbmFibGVfYnJlYWRjcnVtYnMiOjEsImRpc2FibGVfcGFnaW5hdGlvbiI6MCwiZW5hYmxlX2Rlc2NyaXB0aW9ucyI6MCwidGVtcGxhdGUiOiIiLCJvcGVuX2dhbGxlcnlfaW5fbGlnaHRib3giOjAsIm92ZXJyaWRlX3RodW1ibmFpbF9zZXR0aW5ncyI6MSwidGh1bWJuYWlsX3F1YWxpdHkiOjEwMCwidGh1bWJuYWlsX2Nyb3AiOjEsInRodW1ibmFpbF93YXRlcm1hcmsiOjAsInRodW1ibmFpbF93aWR0aCI6MjQwLCJ0aHVtYm5haWxfaGVpZ2h0IjoxNjAsImdhbGxlcnlfZGlzcGxheV90eXBlIjoicGhvdG9jcmF0aS1uZXh0Z2VuX2Jhc2ljX3RodW1ibmFpbHMiLCJnYWxsZXJ5X2Rpc3BsYXlfdGVtcGxhdGUiOiIiLCJuZ2dfdHJpZ2dlcnNfZGlzcGxheSI6Im5ldmVyIiwiX2Vycm9ycyI6W119]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>NextGEN Basic Extended Album</title>
-               <link>https://juplo.de/?post_type=display_type&#038;p=968</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[tortenheber]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?post_type=display_type&#038;p=968</guid>
-               <description></description>
-               <content:encoded><![CDATA[eyJ0aXRsZSI6Ik5leHRHRU4gQmFzaWMgRXh0ZW5kZWQgQWxidW0iLCJtb2R1bGVfaWQiOiJwaG90b2NyYXRpLW5leHRnZW5fYmFzaWNfYWxidW0iLCJlbnRpdHlfdHlwZXMiOlsiYWxidW0iLCJnYWxsZXJ5Il0sInByZXZpZXdfaW1hZ2VfcmVscGF0aCI6InBob3RvY3JhdGktbmV4dGdlbl9iYXNpY19hbGJ1bSNleHRlbmRlZF9wcmV2aWV3LmpwZyIsImRlZmF1bHRfc291cmNlIjoiYWxidW1zIiwidmlld19vcmRlciI6MTAyMTAsImFsaWFzZXMiOlsiYmFzaWNfZXh0ZW5kZWRfYWxidW0iLCJuZXh0Z2VuX2Jhc2ljX2V4dGVuZGVkX2FsYnVtIiwiZXh0ZW5kZWRfYWxidW0iXSwibmFtZSI6InBob3RvY3JhdGktbmV4dGdlbl9iYXNpY19leHRlbmRlZF9hbGJ1bSIsImluc3RhbGxlZF9hdF92ZXJzaW9uIjoiMy4yLjE4IiwiaWRfZmllbGQiOiJJRCIsInNldHRpbmdzIjp7InVzZV9saWdodGJveF9lZmZlY3QiOnRydWUsImRpc3BsYXlfdmlldyI6ImRlZmF1bHQtdmlldy5waHAiLCJnYWxsZXJpZXNfcGVyX3BhZ2UiOjAsImVuYWJsZV9icmVhZGNydW1icyI6MSwiZGlzYWJsZV9wYWdpbmF0aW9uIjowLCJlbmFibGVfZGVzY3JpcHRpb25zIjowLCJ0ZW1wbGF0ZSI6IiIsIm9wZW5fZ2FsbGVyeV9pbl9saWdodGJveCI6MCwib3ZlcnJpZGVfdGh1bWJuYWlsX3NldHRpbmdzIjoxLCJ0aHVtYm5haWxfcXVhbGl0eSI6MTAwLCJ0aHVtYm5haWxfY3JvcCI6MSwidGh1bWJuYWlsX3dhdGVybWFyayI6MCwidGh1bWJuYWlsX3dpZHRoIjozMDAsInRodW1ibmFpbF9oZWlnaHQiOjIwMCwiZ2FsbGVyeV9kaXNwbGF5X3R5cGUiOiJwaG90b2NyYXRpLW5leHRnZW5fYmFzaWNfdGh1bWJuYWlscyIsImdhbGxlcnlfZGlzcGxheV90ZW1wbGF0ZSI6IiIsIm5nZ190cmlnZ2Vyc19kaXNwbGF5IjoibmV2ZXIiLCJfZXJyb3JzIjpbXX0sImhpZGRlbl9mcm9tX3VpIjpmYWxzZSwiaGlkZGVuX2Zyb21faWd3IjpmYWxzZSwiX19kZWZhdWx0c19zZXQiOnRydWV9]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>968</wp:post_id>
-               <wp:post_date><![CDATA[2019-10-05 11:57:34]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[closed]]></wp:comment_status>
-               <wp:ping_status><![CDATA[closed]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[display_type]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[title]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[NextGEN Basic Extended Album]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[module_id]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_album]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[preview_image_relpath]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_album#extended_preview.jpg]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[default_source]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[albums]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[view_order]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[10210]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[name]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[photocrati-nextgen_basic_extended_album]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[installed_at_version]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3.2.18]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_ui]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[hidden_from_igw]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[__defaults_set]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[1]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[filter]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[raw]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[entity_types]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJhbGJ1bSIsImdhbGxlcnkiXQ==]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[aliases]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[WyJiYXNpY19leHRlbmRlZF9hbGJ1bSIsIm5leHRnZW5fYmFzaWNfZXh0ZW5kZWRfYWxidW0iLCJleHRlbmRlZF9hbGJ1bSJd]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[id_field]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[ID]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[settings]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[eyJ1c2VfbGlnaHRib3hfZWZmZWN0Ijp0cnVlLCJkaXNwbGF5X3ZpZXciOiJkZWZhdWx0LXZpZXcucGhwIiwiZ2FsbGVyaWVzX3Blcl9wYWdlIjowLCJlbmFibGVfYnJlYWRjcnVtYnMiOjEsImRpc2FibGVfcGFnaW5hdGlvbiI6MCwiZW5hYmxlX2Rlc2NyaXB0aW9ucyI6MCwidGVtcGxhdGUiOiIiLCJvcGVuX2dhbGxlcnlfaW5fbGlnaHRib3giOjAsIm92ZXJyaWRlX3RodW1ibmFpbF9zZXR0aW5ncyI6MSwidGh1bWJuYWlsX3F1YWxpdHkiOjEwMCwidGh1bWJuYWlsX2Nyb3AiOjEsInRodW1ibmFpbF93YXRlcm1hcmsiOjAsInRodW1ibmFpbF93aWR0aCI6MzAwLCJ0aHVtYm5haWxfaGVpZ2h0IjoyMDAsImdhbGxlcnlfZGlzcGxheV90eXBlIjoicGhvdG9jcmF0aS1uZXh0Z2VuX2Jhc2ljX3RodW1ibmFpbHMiLCJnYWxsZXJ5X2Rpc3BsYXlfdGVtcGxhdGUiOiIiLCJuZ2dfdHJpZ2dlcnNfZGlzcGxheSI6Im5ldmVyIiwiX2Vycm9ycyI6W119]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>real-life-meme</title>
-               <link>https://juplo.de/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/real-life-meme/</link>
-               <pubDate>Wed, 04 Mar 2020 17:42:05 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2020/03/real-life-meme.png</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1038</wp:post_id>
-               <wp:post_date><![CDATA[2020-03-04 19:42:05]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2020-03-04 17:42:05]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[closed]]></wp:ping_status>
-               <wp:post_name><![CDATA[real-life-meme]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>1037</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2020/03/real-life-meme.png]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attachment_metadata]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[a:5:{s:5:"width";i:1018;s:6:"height";i:1009;s:4:"file";s:26:"2020/03/real-life-meme.png";s:5:"sizes";a:3:{s:9:"thumbnail";a:4:{s:4:"file";s:26:"real-life-meme-150x150.png";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:9:"image/png";}s:6:"medium";a:4:{s:4:"file";s:26:"real-life-meme-300x297.png";s:5:"width";i:300;s:6:"height";i:297;s:9:"mime-type";s:9:"image/png";}s:12:"medium_large";a:4:{s:4:"file";s:26:"real-life-meme-768x761.png";s:5:"width";i:768;s:6:"height";i:761;s:9:"mime-type";s:9:"image/png";}}s:10:"image_meta";a:12:{s:8:"aperture";s:1:"0";s:6:"credit";s:0:"";s:6:"camera";s:0:"";s:7:"caption";s:0:"";s:17:"created_timestamp";s:1:"0";s:9:"copyright";s:0:"";s:12:"focal_length";s:1:"0";s:3:"iso";s:1:"0";s:13:"shutter_speed";s:1:"0";s:5:"title";s:0:"";s:11:"orientation";s:1:"0";s:8:"keywords";a:0:{}}}]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2020/03/real-life-meme.png]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>github-example</title>
-               <link>https://juplo.de/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/github-example/</link>
-               <pubDate>Sat, 07 Mar 2020 13:20:41 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2020/03/github-example.jpg</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1105</wp:post_id>
-               <wp:post_date><![CDATA[2020-03-07 15:20:41]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2020-03-07 13:20:41]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[closed]]></wp:ping_status>
-               <wp:post_name><![CDATA[github-example]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>1037</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2020/03/github-example.jpg]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2020/03/github-example.jpg]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attachment_metadata]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[a:5:{s:5:"width";i:772;s:6:"height";i:242;s:4:"file";s:26:"2020/03/github-example.jpg";s:5:"sizes";a:3:{s:9:"thumbnail";a:4:{s:4:"file";s:26:"github-example-150x150.jpg";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:10:"image/jpeg";}s:6:"medium";a:4:{s:4:"file";s:25:"github-example-300x94.jpg";s:5:"width";i:300;s:6:"height";i:94;s:9:"mime-type";s:10:"image/jpeg";}s:12:"medium_large";a:4:{s:4:"file";s:26:"github-example-768x241.jpg";s:5:"width";i:768;s:6:"height";i:241;s:9:"mime-type";s:10:"image/jpeg";}}s:10:"image_meta";a:12:{s:8:"aperture";s:1:"0";s:6:"credit";s:0:"";s:6:"camera";s:0:"";s:7:"caption";s:0:"";s:17:"created_timestamp";s:1:"0";s:9:"copyright";s:0:"";s:12:"focal_length";s:1:"0";s:3:"iso";s:1:"0";s:13:"shutter_speed";s:1:"0";s:5:"title";s:0:"";s:11:"orientation";s:1:"0";s:8:"keywords";a:0:{}}}]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>outbox-pattern--sending-order</title>
-               <link>https://juplo.de/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table/outbox-pattern-sending-order/</link>
-               <pubDate>Sat, 06 Feb 2021 17:52:39 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/wp-uploads/2021/02/outbox-pattern-sending-order.png</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1212</wp:post_id>
-               <wp:post_date><![CDATA[2021-02-06 19:52:39]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2021-02-06 17:52:39]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[closed]]></wp:ping_status>
-               <wp:post_name><![CDATA[outbox-pattern-sending-order]]></wp:post_name>
-               <wp:status><![CDATA[inherit]]></wp:status>
-               <wp:post_parent>1209</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[attachment]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <wp:attachment_url><![CDATA[http://juplo.de/wp-uploads/2021/02/outbox-pattern-sending-order.png]]></wp:attachment_url>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attached_file]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2021/02/outbox-pattern-sending-order.png]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_attachment_metadata]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[a:5:{s:5:"width";i:767;s:6:"height";i:367;s:4:"file";s:40:"2021/02/outbox-pattern-sending-order.png";s:5:"sizes";a:2:{s:9:"thumbnail";a:4:{s:4:"file";s:40:"outbox-pattern-sending-order-150x150.png";s:5:"width";i:150;s:6:"height";i:150;s:9:"mime-type";s:9:"image/png";}s:6:"medium";a:4:{s:4:"file";s:40:"outbox-pattern-sending-order-300x144.png";s:5:"width";i:300;s:6:"height";i:144;s:9:"mime-type";s:9:"image/png";}}s:10:"image_meta";a:12:{s:8:"aperture";s:1:"0";s:6:"credit";s:0:"";s:6:"camera";s:0:"";s:7:"caption";s:0:"";s:17:"created_timestamp";s:1:"0";s:9:"copyright";s:0:"";s:12:"focal_length";s:1:"0";s:3:"iso";s:1:"0";s:13:"shutter_speed";s:1:"0";s:5:"title";s:0:"";s:11:"orientation";s:1:"0";s:8:"keywords";a:0:{}}}]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>hibernate4-maven-plugin</title>
-               <link>https://juplo.de/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/</link>
-               <pubDate>Wed, 28 Nov 2012 17:29:12 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=34</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>A simple Plugin for generating a Database-Schema from Hibernate 4 Mapping-Annotations</h2>\r
-<p> \r
-Hibernate comes with the buildin functionality, to automatically create or update the database schema. This functionality is configured in the session-configuraton via the parameter <code>hbm2ddl.auto</code> (see <a href="http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#configuration-optional">Hibernate Reference Documentation - Chapter 3.4. Optional configuration properties</a>). But doing so <a href="http://stackoverflow.com/questions/221379/hibernate-hbm2ddl-auto-update-in-production">is not very wise</a>, because you can easily corrupt or erase your production database, if this configuration parameter slips through to your production environment.\r
-</p>\r
-<p>\r
-Alternatively, you can <a href="http://stackoverflow.com/questions/835961/how-to-creata-database-schema-using-hibernate">run the tools <strong>SchemaExport</strong> or <strong>SchemaUpdate</strong> by hand</a>. But that is not very comfortable and being used to maven you will quickly long for a plugin, that does that job automatically for you, when you fire up your test cases.\r
-</p>\r
-<p>In the good old times, there was the <a href="http://mojo.codehaus.org/maven-hibernate3/hibernate3-maven-plugin/">Maven Hibernate3 Plugin</a>, that does this for you. But unfortunatly, this plugin is not compatible with Hibernate 4.x. Since there does not seem to be any successor for the Maven Hibernate3 Plugin and <a href="http://www.google.de/search?q=hibernate4+maven+plugin">googeling</a> does not help, I decided to write up this simple plugin (inspired by these two articles I found: <a href="http://www.tikalk.com/alm/blog/schema-export-hibernate-4-and-maven">Schema Export with Hibernate 4 and Maven</a> and <a href="http://doingenterprise.blogspot.de/2012/05/schema-generation-with-hibernate-4-jpa.html">Schema generation with Hibernate 4, JPA and Maven</a>).\r
-</p>\r
-\r
-<p>\r
-I hope, the resulting simple to use buletproof <a href="/hibernate4-maven-plugin/">hibernate4-maven-plugin</a> is usefull!\r
-</p>\r
-<p>\r
-<strong><a href="/hibernate4-maven-plugin/">Try it out now!</a></strong>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>34</wp:post_id>
-               <wp:post_date><![CDATA[2012-11-28 19:29:12]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2012-11-28 17:29:12]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="hibernate"><![CDATA[Hibernate]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[1]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>55</wp:comment_id>
-                       <wp:comment_author><![CDATA[admin]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@ich-geh-kaputt.de]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[77.178.13.87]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-02-25 20:05:49]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-02-25 18:05:49]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[There is a private git-Repository.\r
-<a href="http://juplo.de/hibernate4-maven-plugin/source-repository.html" rel="nofollow">Check the project-documentation!</a>\r
-\r
-You can <a href="http://juplo.de/hibernate4-maven-plugin/team-list.html" rel="nofollow">send me</a> a patch or a pull-request to kai@juplo.de]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>54</wp:comment_parent>
-                       <wp:comment_user_id>1</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";s:15:"1361815763.7642";s:7:"message";s:44:"admin changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:5:"admin";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";s:15:"1361815549.0353";s:7:"message";s:92:"Akismet was unable to check this comment (response: ), will automatically retry again later.";s:5:"event";s:11:"check-error";s:4:"user";s:5:"admin";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>50</wp:comment_id>
-                       <wp:comment_author><![CDATA[Victor]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[vtatai@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[177.135.17.204]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-02-22 15:28:35]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-02-22 13:28:35]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hey I have modified your code to support envers and generate auditing tables, if you want I can send you a patch. Thanks!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";s:15:"1361539715.0575";s:7:"message";s:92:"Akismet was unable to check this comment (response: ), will automatically retry again later.";s:5:"event";s:11:"check-error";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";s:15:"1361555457.9505";s:7:"message";s:44:"admin changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:5:"admin";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>51</wp:comment_id>
-                       <wp:comment_author><![CDATA[admin]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@ich-geh-kaputt.de]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[87.144.101.150]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-02-22 19:54:51]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-02-22 17:54:51]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Your welcom.
-Send it!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>50</wp:comment_parent>
-                       <wp:comment_user_id>1</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";s:15:"1361555691.1191";s:7:"message";s:92:"Akismet was unable to check this comment (response: ), will automatically retry again later.";s:5:"event";s:11:"check-error";s:4:"user";s:5:"admin";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";s:15:"1361555911.5636";s:7:"message";s:44:"admin changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:5:"admin";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>54</wp:comment_id>
-                       <wp:comment_author><![CDATA[Victor]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[vtatai@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[187.115.180.175]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-02-25 15:28:35]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-02-25 13:28:35]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Where to? Is there a github repo?]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>51</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";s:15:"1361815261.4395";s:7:"message";s:44:"admin changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:5:"admin";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";s:15:"1361798915.7647";s:7:"message";s:92:"Akismet was unable to check this comment (response: ), will automatically retry again later.";s:5:"event";s:11:"check-error";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>567</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[82.113.106.224]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-11-11 13:09:48]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-11-11 11:09:48]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[This plugin is only a tool to automate the generation of the SQL in your development-environment.
-Questions on how to anotate your code correctly are better asked in a user-forum from hibernate or such.
-
-Nevertheless, I think I can give you a usefull hint:
-You are overwriting the automatically generated column-definition with "default TRUE".
-Try it with
-
-@Column(name = “financialEnabled”, nullable = false)
-private boolean financialEnabled;]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>556</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1384168188.5406439304351806640625;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>568</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[82.113.106.224]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-11-11 13:11:47]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-11-11 11:11:47]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Version 1.0.3 of the plugin can now scan for annotations in the dependencies, too.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>391</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1384168307.5790059566497802734375;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>556</wp:comment_id>
-                       <wp:comment_author><![CDATA[Jukes]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[hvegat@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[190.7.219.206]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-11-07 23:18:19]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-11-07 21:18:19]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi thanks a lot for making this plugin available, great work!!\r
-I have a problem generating postgres schema. Looks like the plugin ignores the data type when adding default values and that yields a syntax error from Postgres. Or maybe I'm doing something wrong. I'm using version 1.0.3.\r
-\r
-For example I have in java:\r
-\r
-    @Column(name = "financialEnabled", nullable = false, columnDefinition = "default TRUE")\r
-    private boolean financialEnabled;\r
-\r
-Generated SQL is:\r
-    financialEnabled default TRUE not null,\r
-\r
-As you can see the data type boolean is not translated to the SQL script. Thanks a lot for your help.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1384167686.3741118907928466796875;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1383859099.641871929168701171875;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>391</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[2.244.124.220]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-10-10 22:19:52]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-10-10 20:19:52]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Yes, I am working on the possibility, to scan for annotations in dependencies.
-Unfortunatly, I have no example-project for this use-case by hand.
-It would help a lot, if you could provide a sample-project on github or such.
-
-Greetings kai]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>390</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1381436392.83154392242431640625;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>276</wp:comment_id>
-                       <wp:comment_author><![CDATA[mike]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[mjoecohen@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://bidlogix.com</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[217.33.94.163]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-07-30 12:57:16]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-07-30 10:57:16]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hello,\r
-\r
-I'm upgrading from hibernate3 to to hibernate4 and have moved from the hibernate3-maven-plugin to this version. I haven't undertaken (and don't want to just yet) the big job of changing my hbm mapping files to annotations.\r
-\r
-As far as I can see this is a show stopper for using your nice plugin. Can you please confirm if this is the case and whether you are planning to add support for scanning for hbm files?\r
-\r
-Many thanks,\r
-\r
-Mike Cohen.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1375305000.465466976165771484375;s:7:"message";s:50:"tortenheber changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1375181836.234860897064208984375;s:7:"message";s:92:"Akismet was unable to check this comment (response: ), will automatically retry again later.";s:5:"event";s:11:"check-error";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>277</wp:comment_id>
-                       <wp:comment_author><![CDATA[tortenheber]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@ich-geh-kaputt.de]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[2.244.83.234]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-07-31 23:18:10]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-07-31 21:18:10]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hello Mike,
-
-I added the requested feature in the SNAPSHOT-version.
-It would be nice, if you could test, if the new feature works, because I have no example project by hand, that still uses hibernate-mapping via XML.
-
-You can download an actual build here:
-
-https://oss.sonatype.org/content/repositories/snapshots//de/juplo/hibernate4-maven-plugin/1.0.2-SNAPSHOT/
-
-or build it by yourself from the sources.
-The feature is documented here:
-
-http://juplo.de/hibernate4-maven-plugin-1.0.2-SNAPSHOT/export-mojo.html
-
-
-Best regards
-
-kai]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>276</wp:comment_parent>
-                       <wp:comment_user_id>3</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1375305490.4733030796051025390625;s:7:"message";s:92:"Akismet was unable to check this comment (response: ), will automatically retry again later.";s:5:"event";s:11:"check-error";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>285</wp:comment_id>
-                       <wp:comment_author><![CDATA[Pedro]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[pmmarques@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[5.149.169.43]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-08-07 18:49:38]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-08-07 16:49:38]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi,\r
-\r
-I have the following problem.\r
-The project that I use to test (and use the plugin) has the annotated classes as a dependency.\r
-I am getting the error:\r
-No annotated classes found in directory /target/classes\r
-\r
-Shouldn't the plugin scan all the dependencies also?\r
-\r
-Thanks,\r
-Pedro.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1375895004.1361439228057861328125;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1375894179.01554393768310546875;s:7:"message";s:92:"Akismet was unable to check this comment (response: ), will automatically retry again later.";s:5:"event";s:11:"check-error";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>286</wp:comment_id>
-                       <wp:comment_author><![CDATA[Pedro]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[pmmarques@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[5.149.169.43]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-08-07 18:54:02]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-08-07 16:54:02]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Following my previous question, here is the debug info\r
-\r
-[DEBUG] Dependency: /Users/pmarques/.m2/repository/org/springframework/security/spring-security-acl/3.1.4.RELEASE/spring-security-acl-3.1.4.RELEASE.jar\r
-[DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/atomikos-util/3.6.5/atomikos-util-3.6.5.jar\r
-[DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-api/3.6.5/transactions-api-3.6.5.jar\r
-[DEBUG] Dependency: /Users/pmarques/.m2/repository/javax/transaction/transaction-api/1.1/transaction-api-1.1.jar\r
-[DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jdbc-deprecated/3.6.5/transactions-jdbc-deprecated-3.6.5.jar\r
-[DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jdbc/3.6.5/transactions-jdbc-3.6.5.jar\r
-[DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jta/3.6.5/transactions-jta-3.6.5.jar\r
-[DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions/3.6.5/transactions-3.6.5.jar\r
-[DEBUG] Dependency: /Users/pmarques/.m2/repository/org/apache/geronimo/specs/geronimo-jta_1.0.1B_spec/1.0.1/geronimo-jta_1.0.1B_spec-1.0.1.jar\r
-[DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jms-deprecated/3.6.5/transactions-jms-deprecated-3.6.5.jar\r
-[DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-jms/3.6.5/transactions-jms-3.6.5.jar\r
-[DEBUG] Dependency: /Users/pmarques/.m2/repository/com/atomikos/transactions-hibernate3/3.6.5/transactions-hibernate3-3.6.5.jar\r
-[INFO] Scanning directory /target/classes for annotated classes...]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1375895004.1331250667572021484375;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1375894442.87407207489013671875;s:7:"message";s:92:"Akismet was unable to check this comment (response: ), will automatically retry again later.";s:5:"event";s:11:"check-error";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>287</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[92.224.108.146]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-08-07 19:12:28]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-08-07 17:12:28]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi Pedro,
-
-I think, that your observation is right.
-But otherwise, dependencies should only be scanned if requested, because automatic scanning of the dependencies might lead to errors in other situations.
-
-If you can make your project available to me (for example via github, or simply by mailing zipped version), I would add a configuration-parameter to enable/disable dependency-scanning and upload the refined plugin to central.
-
-Regards,
-
-Kai Moritz]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>285</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1375895548.4618930816650390625;s:7:"message";s:92:"Akismet was unable to check this comment (response: ), will automatically retry again later.";s:5:"event";s:11:"check-error";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>426</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[2.244.90.106]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-10-18 02:52:59]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-10-18 00:52:59]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[The <a href="/hibernate4-maven-plugin-1-0-3-released/" title="Open the release-notes" rel="nofollow">new version 1.0.3</a> of the plugin adds support for annotated classes in dependencies!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>287</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1382057579.0603220462799072265625;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>390</wp:comment_id>
-                       <wp:comment_author><![CDATA[Milios]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[milos.gregor@deutsche-boerse.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[193.29.76.37]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-10-10 15:02:57]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-10-10 13:02:57]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi,\r
-\r
-looks like a very nice plugin. Unfortunately, part of our entities are in other modules/dependencies.\r
-Do you plan to add the possibility to scan also for dependencies of the project or at least of the plugin?\r
-\r
-Also, when I only want to generate the SQL and use the following configuration, I got nothing.\r
-\r
-\r
-Config:\r
-            \r
-                de.juplo\r
-                hibernate4-maven-plugin\r
-                1.0.2\r
-                \r
-                    true\r
-                    SCRIPT\r
-                    NONE\r
-                    com.deutscheboerse.hibernate.PostgreSQLDialect\r
-                    ${project.build.directory}/hibernate4/cmm-schema.sql\r
-                \r
-                \r
-                    \r
-                        com.deutscheboerse.energy\r
-                        energy-commons-hibernate\r
-                        ${commons.hibernate.version}\r
-                    \r
-                    \r
-                        org.springframework.security\r
-                        spring-security-core\r
-                        ${spring.security.version}\r
-                    \r
-                    \r
-                        org.slf4j\r
-                        slf4j-log4j12\r
-                        ${slf4j.version}\r
-                    \r
-                \r
-            \r
-\r
-\r
-Output:\r
-mvn hibernate4:export -e\r
-[INFO] Error stacktraces are turned on.\r
-[INFO] Scanning for projects...\r
-[INFO]\r
-[INFO] ------------------------------------------------------------------------\r
-[INFO] Building CMM WAR 1.0.0-RC5-SNAPSHOT\r
-[INFO] ------------------------------------------------------------------------\r
-[INFO]\r
-[INFO] --- hibernate4-maven-plugin:1.0.2:export (default-cli) @ cmm-war ---\r
-[INFO] Scanning directory D:\_dev\work\ii\src\cmm\trunk\cmm-war\target\classes f\r
-[INFO] No hibernate-properties-file found! (Checked path: D:\_dev\work\ii\src\cm\r
-[INFO] Gathered hibernate-configuration (turn on debugging for details):\r
-[INFO]   hibernate.dialect = com.deutscheboerse.hibernate.PostgreSQLDialect\r
-[INFO] HHH000400: Using dialect: com.deutscheboerse.hibernate.PostgreSQLDialect\r
-[INFO] ------------------------------------------------------------------------\r
-[INFO] BUILD SUCCESS\r
-[INFO] ------------------------------------------------------------------------\r
-[INFO] Total time: 10.932s\r
-[INFO] Finished at: Thu Oct 10 12:51:05 UTC 2013\r
-[INFO] Final Memory: 9M/23M\r
-[INFO] ------------------------------------------------------------------------\r
-\r
-\r
-Thanks for any help,\r
-Milos.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1381435996.0137250423431396484375;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1381410177.72982501983642578125;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>1251</wp:comment_id>
-                       <wp:comment_author><![CDATA[hdave]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[david.h.vree@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[71.245.233.130]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-01-03 01:53:44]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-01-02 23:53:44]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thats awesome - but you need to update your "Known Pitfalls" page then.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>568</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1388706824.3894889354705810546875;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1389809228.5354440212249755859375;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>2654</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[92.224.174.232]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-04-28 14:58:19]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-04-28 12:58:19]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Multiple executions should work as expected, since the plugin obeys the standard rules for maven plugins.
-I also have seen working examples of this kind of configuration...]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>2653</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1398689899.346525;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>2653</wp:comment_id>
-                       <wp:comment_author><![CDATA[JRG]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[jeromerg@gmx.net]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[79.203.73.119]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-04-28 14:39:25]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-04-28 12:39:25]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi, \r
-Thank you for this very useful plugin! Is it possible to define multiple execution-configuration? We need to export two different scripts, on for the "drop commands" and one for the "schema-creation commands". I tried to configure multiple executions by following <a href="http://maven.apache.org/guides/mini/guide-configuring-plugins.html#Using_the_executions_Tag" title="following steps" rel="nofollow">http://maven.apache.org/guides/mini/guide-configuring-plugins.html#Using_the_executions_Tag</a>, but maven build failed...]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1398688765.4994731;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1398689474.898067;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>1407</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[85.181.230.80]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-01-15 20:09:14]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-01-15 18:09:14]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thanks for the hint, I will update the page...]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>1251</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1389809354.1899280548095703125;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>14954</wp:comment_id>
-                       <wp:comment_author><![CDATA[Tarek]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[tarekmnabil@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[163.189.217.40]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-10-10 08:38:41]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-10-10 06:38:41]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi Kai,\r
-\r
-Unlike Pedro, I do not want my dependencies to be scanned. I tried passing an empty value for the "hibernate.export.scan_dependencies" parameter, but it still used the default value (compile).\r
-\r
-I tried passing something else like "system", the behaviour did not change.\r
-\r
-How can I stop it from scanning my dependencies?\r
-\r
-Thanks,\r
-Tarek]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>426</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1412923121.810035;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1414527872.8136239;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>17030</wp:comment_id>
-                       <wp:comment_author><![CDATA[Marcel]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[marcel@frightanic.com]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://frightanic.com</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[212.203.50.100]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-10-27 22:34:24]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-10-27 20:34:24]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[If I may ask, what's the reason you didn't update the hibernate3-maven-plugin to work with Hibernate4 but rather started from scratch? Reference: https://developer.jboss.org/message/853856 and https://issues.jboss.org/browse/JBIDE-12445]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1414442065.226867;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1414527901.628432;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>17088</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[85.181.233.38]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-10-28 22:39:58]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-10-28 20:39:58]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Like always: starting over new was easier than understanding the existing code :/
-If I remember right, I took a quick view into the code of the hibernate3-maven-plugin and realised, that it can do a lot more, than simply generat the database schema.
-So, I decided to start over with a slim layer above the tools from hibernate.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>17030</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1414528798.8922181;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>17092</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[85.181.233.38]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-10-28 23:56:50]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-10-28 21:56:50]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Passing <code>-Dhibernate.export.scan_dependencies=none</code> to the call to maven or setting <code>&lt;scanDependencies&gt;none&lt;/scanDependencies&gt; in the configuration of the hibernate4-maven-plugin should do the trick.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>14954</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1414533414.1059339;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>52865</wp:comment_id>
-                       <wp:comment_author><![CDATA[Alexey]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[bostandyksoft@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[109.202.13.243]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-01-22 13:12:32]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-01-22 11:12:32]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi. Should i set dependecy for the plugin, even class is part of project from dependecies?]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>52862</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1453726122.176383;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1453461152.054549;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>52866</wp:comment_id>
-                       <wp:comment_author><![CDATA[Alexey]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[bostandyksoft@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[109.202.13.243]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-01-22 13:33:18]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-01-22 11:33:18]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Many thanks. It works for me.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>52862</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1453726123.995085;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1453462398.89364;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>33336</wp:comment_id>
-                       <wp:comment_author><![CDATA[Ram]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[rkpunjal@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-12-26 17:42:20]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-12-26 15:42:20]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi, Can we facilitate the envers to be generated to a seperate file?]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1419608540.5358;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1426439227.052516;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>40079</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[92.224.172.232]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-03-15 19:07:31]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-03-15 17:07:31]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Unfortunatly, that is not possible at the moment...]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>33336</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1426439251.2862611;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>52859</wp:comment_id>
-                       <wp:comment_author><![CDATA[Alexey]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[bostandyksoft@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[31.211.22.224]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-01-21 17:56:52]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-01-21 15:56:52]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi. \r
-\r
-I tried to use version 1.0.3, but recieve exception "no annotated classes found in directory" (on MacOS El Capitan)\r
\r
-I updated version to 1.1.0, but i have used a custom HibernateDialect class, that defined in my project and catch following exception \r
-\r
-<code>\r
-Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.tdh.crm.util.JsonPostgreSQLDialect\r
-        at de.juplo.plugins.hibernate4.ValidationConfiguration.secondPassCompile(ValidationConfiguration.java:46)\r
-</code>\r
- I sure, that it is public class with noarg constructor, that extends PostgreSQL9Dialect.\r
-\r
-Can you help me?\r
-\r
-Best regards.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1453391812.4205711;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1453413922.8136079;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>52862</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[87.151.102.121]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-01-22 00:08:05]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-01-21 22:08:05]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[If this class is not part of your project, you have to define the dependency for the plugin like described <a href="http://juplo.de/hibernate4-maven-plugin/pitfalls.html" title="Jump to the FAQ" rel="nofollow">in the FAQ</a> for driver classes.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>52859</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1453414085.5397251;s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>61651</wp:comment_id>
-                       <wp:comment_author><![CDATA[Simon]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[simon.kaufmann@adesso.ch]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[194.230.155.233]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2020-06-15 19:15:58]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2020-06-15 17:15:58]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi thx for updating the plugin to support hibernate 5. :)\r
-\r
-Is there a way to generate "NOT NULL" constraints in the generated "output file" via existing @NotNull annotations (javax.validation.constraints.NotNull) like in the version before?\r
-I don't like to add @column(nullable = false) to every field.\r
-\r
-Thx for your answer :)]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1592241358.500147;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1602360430.03858;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Subscribe to Facebook&#039;s Real-Time Updates with Spring Security OAuth</title>
-               <link>https://juplo.de/?p=266</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=266</guid>
-               <description></description>
-               <content:encoded><![CDATA[<code>invalid_request", error_description="{message=(#15) This method must be called with an app access_token., type=OAuthException, code=15}</code>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>266</wp:post_id>
-               <wp:post_date><![CDATA[2014-02-26 23:29:24]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Disable Spring-Autowireing for Junit-Tests</title>
-               <link>https://juplo.de/?p=283</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=283</guid>
-               <description></description>
-               <content:encoded><![CDATA[<pre class="prettyprint linenums">\r
-<code class="java">\r
-import java.beans.PropertyDescriptor;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-import org.springframework.beans.BeansException;\r
-import org.springframework.beans.PropertyValues;\r
-import org.springframework.beans.factory.BeanCreationException;\r
-import org.springframework.beans.factory.BeanFactory;\r
-import org.springframework.beans.factory.NoSuchBeanDefinitionException;\r
-import org.springframework.beans.factory.support.RootBeanDefinition;\r
-import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;\r
-\r
-\r
-/**\r
- * Swallows all {@link NoSuchBeanDefinitionException}s, and\r
- * {@link BeanCreationException}s, that might be thrown \r
- * during autowireing.\r
- *\r
- * @author kai@juplo.de\r
- */\r
-public class ForgivableCommonAnnotationBeanPostProcessor\r
-    extends\r
-      CommonAnnotationBeanPostProcessor\r
-{\r
-  private static final Logger log =\r
-      LoggerFactory.getLogger(ForgivableCommonAnnotationBeanPostProcessor.class);\r
-\r
-  @Override\r
-  protected Object autowireResource(BeanFactory factory, LookupElement element, String requestingBeanName) throws BeansException\r
-  {\r
-    try\r
-    {\r
-       return super.autowireResource(factory, element, requestingBeanName);\r
-    }\r
-    catch (NoSuchBeanDefinitionException e)\r
-    {\r
-      log.warn(e.getMessage());\r
-      return null;\r
-    }\r
-  }\r
-\r
-  @Override\r
-  public Object postProcessBeforeInitialization(Object bean, String beanName)\r
-  {\r
-    try\r
-    {\r
-      return super.postProcessBeforeInitialization(bean, beanName);\r
-    }\r
-    catch (BeanCreationException e)\r
-    {\r
-      log.warn(e.getMessage());\r
-      return bean;\r
-    }\r
-  }\r
-}\r
-</code>\r
-</pre>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>283</wp:post_id>
-               <wp:post_date><![CDATA[2014-04-01 08:46:44]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Entwicklung einer crowdgestützten vertikalen Suchmaschine für Veranstaltungen und Locations</title>
-               <link>https://juplo.de/?p=530</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=530</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>530</wp:post_id>
-               <wp:post_date><![CDATA[2015-10-01 11:55:54]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Arbeitspaket 1a: Entwicklung eines Facebook-Crawlers</title>
-               <link>https://juplo.de/?p=532</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=532</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>532</wp:post_id>
-               <wp:post_date><![CDATA[2015-10-01 11:57:11]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="facebook"><![CDATA[Facebook]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Parsing JSON From Facebooks Graph-API Using Jackson 2.x And Java&#039;s New Time-API</title>
-               <link>https://juplo.de/?p=550</link>
-               <pubDate>Tue, 07 Jun 2016 09:40:39 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=550</guid>
-               <description></description>
-               <content:encoded><![CDATA[https://github.com/FasterXML/jackson-datatype-jsr310/issues/17\r
-\r
-\r
-Auch noch:\r
-https://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Strange_behavior.2C_unique_constraint_violation.\r
-\r
-\r
-\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>550</wp:post_id>
-               <wp:post_date><![CDATA[2016-06-07 11:40:39]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-06-07 09:40:39]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[parsing-json-from-facebooks-graph-api-using-jackson-2-x-and-javas-new-time-api]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="createmedia-nrw"><![CDATA[CreateMedia.NRW]]></category>
-               <category domain="post_tag" nicename="facebook"><![CDATA[facebook]]></category>
-               <category domain="post_tag" nicename="graph-api"><![CDATA[graph-api]]></category>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="post_tag" nicename="jackson"><![CDATA[jackson]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_oembed_db18ba6b34f5522f0ecb8abddbb529da]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[{{unknown}}]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_oembed_e1a31eec970f0e7dfe4452df3c5b94aa]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[{{unknown}}]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Create A Simulated Network As Docker Does It</title>
-               <link>https://juplo.de/?p=831</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=831</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>Why</h2>\r
-<p>\r
-In this mini-HOWTO, we will configure a simulated network in exact the same way, as Docker does it.\r
-</p>\r
-<p>\r
-Our goal is, to understand how Docker handles virtual networks.\r
-Later (in another post), we will use the gained understanding to simulate segmented multihop networks using Docker-Compose.\r
-</p>\r
-<h2>Step 1: Create The Bridge</h2>\r
-<p>\r
-First, we have to create a bridge, that will act as the switch in our virtual network and bring it up.\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip link add dev switch type bridge\r
-sudo ip link set dev switch up\r
-</code></pre>\r
-<p>\r
-<em>It is crucial, to activate each created device, since new devices are not activated by default.</em>\r
-</p>\r
-<h2>Step 2: Create A Virtual Host</h2>\r
-<p>\r
-Now we can create a virtual host.\r
-This is done by creating a new <strong>network namespace</strong>, that will act as the host:\r
-</p>\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip netns add host_1</code></pre>\r
-<p>\r
-This "virtual host" is not of much use at the moment, because it is not connected to any network, which we will do next...\r
-</p>\r
-<h2>Step 3: Connect The Virtual Host To The Network</h2>\r
-<p>\r
-Connecting the host to the network is done with the help of a <strong><a href="/virtual-networking-with-linux-veth-pairs/" title="Virtual Networking With Linux: Veth-Pairs">veth pair</a></strong>:\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip link add dev host_1 type veth peer name host_if\r
-</code></pre>\r
-<p>\r
-A veth-pair acts as a virtual patch-cable.\r
-As a real cable, it always has two ends and data that enters one end is copied to the other.\r
-Unlike a real cable, each end comes with a network interface card (nic).\r
-To stick with the metaphor: using a veth-pair is like taking a patch-cable with a nic hardwired to each end and installing these nics.\r
-</p>\r
-\r
-<h2>Pitfalls</h2>\r
-<p>\r
-Some common pitfalls, when \r
-\r
-\r
-\r
-\r
-<pre class="prettyprint linenums" id="script"><code class="bash"># Create a bridge in the standard-networknamespace, that represents the switch\r
-sudo ip link add dev switch type bridge\r
-# Bring the bridge up\r
-sudo ip link set dev switch up\r
-\r
-\r
-# Create a veth-pair for the virtual peer host_1\r
-sudo ip link add dev host_1 type veth peer name host_if\r
-# Create a private namespace for host_1 and move the interface host_if into it\r
-sudo ip netns add host_1\r
-sudo ip link set dev host_if netns host_1\r
-# Rename the private interface to eth0\r
-sudo ip netns exec host_1 ip link set dev host_if name eth0\r
-# Set the IP for the interface eth0 and bring it up\r
-sudo ip netns exec host_1 ip addr add 192.168.10.1/24 dev eth0\r
-sudo ip netns exec host_1 ip link set dev eth0 up\r
-# Plug the other end into the virtual switch and bring it up\r
-sudo ip link set dev host_1 master switch\r
-sudo ip link set dev host_1 up\r
-\r
-# Create a veth-pair for the virtual peer host_2\r
-sudo ip link add dev host_2 type veth peer name host_if\r
-# Create a private namespace for host_2 and move the interface host_if into it\r
-sudo ip netns add host_2\r
-sudo ip link set dev host_if netns host_2\r
-# Rename the private interface to eth0\r
-sudo ip netns exec host_2 ip link set dev host_if name eth0\r
-# Set the IP for the interface eth0 and bring it up\r
-sudo ip netns exec host_2 ip addr add 192.168.10.2/24 dev eth0\r
-sudo ip netns exec host_2 ip link set dev eth0 up\r
-# Plug the other end into the virtual switch and bring it up\r
-sudo ip link set dev host_2 master switch\r
-sudo ip link set dev host_2 up\r
-\r
-# Create a veth-pair for the virtual peer host_3\r
-sudo ip link add dev host_3 type veth peer name host_if\r
-# Create a private namespace for host_3 and move the interface host_if into it\r
-sudo ip netns add host_3\r
-sudo ip link set dev host_if netns host_3\r
-# Rename the private interface to eth0\r
-sudo ip netns exec host_3 ip link set dev host_if name eth0\r
-# Set the IP for the interface eth0 and bring it up\r
-sudo ip netns exec host_3 ip addr add 192.168.10.3/24 dev eth0\r
-sudo ip netns exec host_3 ip link set dev eth0 up\r
-# Plug the other end into the virtual switch and bring it up\r
-sudo ip link set dev host_3 master switch\r
-sudo ip link set dev host_3 up\r
-\r
-# Create a veth-pair for the virtual peer host_4\r
-sudo ip link add dev host_4 type veth peer name host_if\r
-# Create a private namespace for host_4 and move the interface host_if into it\r
-sudo ip netns add host_4\r
-sudo ip link set dev host_if netns host_4\r
-# Rename the private interface to eth0\r
-sudo ip netns exec host_4 ip link set dev host_if name eth0\r
-# Set the IP for the interface eth0 and bring it up\r
-sudo ip netns exec host_4 ip addr add 192.168.10.4/24 dev eth0\r
-sudo ip netns exec host_4 ip link set dev eth0 up\r
-# Plug the other end into the virtual switch and bring it up\r
-sudo ip link set dev host_4 master switch\r
-sudo ip link set dev host_4 up\r
-\r
-# Create a veth-pair for the virtual peer host_5\r
-sudo ip link add dev host_5 type veth peer name host_if\r
-# Create a private namespace for host_5 and move the interface host_if into it\r
-sudo ip netns add host_5\r
-sudo ip link set dev host_if netns host_5\r
-# Rename the private interface to eth0\r
-sudo ip netns exec host_5 ip link set dev host_if name eth0\r
-# Set the IP for the interface eth0 and bring it up\r
-sudo ip netns exec host_5 ip addr add 192.168.10.5/24 dev eth0\r
-sudo ip netns exec host_5 ip link set dev eth0 up\r
-# Plug the other end into the virtual switch and bring it up\r
-sudo ip link set dev host_5 master switch\r
-sudo ip link set dev host_5 up\r
-\r
-</code></pre>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>831</wp:post_id>
-               <wp:post_date><![CDATA[2019-06-03 16:05:21]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[create-a-simulated-network-as-docker-does-it]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Virtual Networking With Linux: Veth-Pairs</title>
-               <link>https://juplo.de/?p=835</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=835</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-A veth-pair acts as a virtual patch-cable.\r
-Like a real cable, it always has two ends and data that enters one end is copied to the other.\r
-Unlike a real cable, each end comes with an attached network interface card (nic).\r
-To stick with the metaphor: using a veth-pair is like taking a patch-cable with a nic hardwired to each end and installing these nics.\r
-</p>\r
-<h2>Typical Usages</h2>\r
-<ul>\r
-<li><a href="#netns2netns">Connect Two Network Namespaces</a></li>\r
-<li><a href="#netns2br">Connect A Network Namespace To A Bridge</a></li>\r
-<li><a href="#br2br">Connect Two Bridges</a></li>\r
-</ul>\r
-<h3 id="netns2netns">Connect Two Network Namespaces</h3>\r
-<p>\r
-In this usage scenario, two <a href="/virtual-networking-with-linux-network-namespaces" title="Network Namespaces Explained">network namespaces</a> (i.e., two virtual hosts) are connected with a virtual patch cable (the veth-pair).\r
-One of the two network namespaces may be the default network namespace, but not both (see <a href="#pointless" title="See Pitfall: Wrong (Or Better: Pointless) Usage Of Veth-Pairs">Pitfall: Pointless Usage Of Veth-Pairs</a>).\r
-</p>\r
-<p>\r
-Receipt:\r
-</p>\r
-<ol>\r
-<li>\r
-Create two network namespaces and connect them with a veth-pair:\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip netns add host_1\r
-sudo ip netns add host_2\r
-sudo ip link add dev if_1 type veth peer name if_2\r
-sudo ip link set dev if_1 netns host_1\r
-sudo ip link set dev if_2 netns host_2\r
-</code></pre>\r
-</li>\r
-<li>\r
-Configure the network interfaces and bring them up:\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip netns exec host_1 ip addr add 192.168.111.1/24 dev if_1\r
-sudo ip netns exec host_1 ip link set dev if_1 up\r
-sudo ip netns exec host_2 ip addr add 192.168.111.2/24 dev if_2\r
-sudo ip netns exec host_2 ip link set dev if_2 up\r
-</code></pre>\r
-</li>\r
-<li>\r
-Check the created configuration (same for <code>host_2</code>):\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip netns exec host_1 ip -d addr show\r
-1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1\r
-    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0 \r
-904: if_1@if903: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000\r
-    link/ether 7e:02:d1:d3:36:7e brd ff:ff:ff:ff:ff:ff link-netnsid 1 promiscuity 0 \r
-    veth \r
-    inet 192.168.111.1/32 scope global if_1\r
-       valid_lft forever preferred_lft forever\r
-    inet6 fe80::7c02:d1ff:fed3:367e/64 scope link \r
-       valid_lft forever preferred_lft forever\r
-</code></pre>\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip netns exec host_1 ip route show\r
-192.168.111.0/24 dev if_1  proto kernel  scope link  src 192.168.111.1\r
-</code></pre>\r
-Note, that all interfaces are numbered and that each end of a veth-pair explicitly states the number of the other end of the pair:\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip netns exec host_2 ip addr show\r
-1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1\r
-    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\r
-903: if_2@if904: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000\r
-    link/ether 52:f4:5a:be:dc:9b brd ff:ff:ff:ff:ff:ff link-netnsid 0\r
-    inet 192.168.111.2/24 scope global if_2\r
-       valid_lft forever preferred_lft forever\r
-    inet6 fe80::50f4:5aff:febe:dc9b/64 scope link \r
-       valid_lft forever preferred_lft forever\r
-</code></pre>\r
-<em>Here:</em> <code>if_2</code> with number 903 in the network namespace <code>host_2</code> states, that its other end has the number 904 &mdash; Compare this with the output for the network namespace <code>host_1</code> above!\r
-</li>\r
-<li>\r
-Validate the setup (same for <code>host_2</code>):\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip netns exec host_1 ping -c2 192.168.111.2\r
-PING 192.168.111.2 (192.168.111.2) 56(84) bytes of data.\r
-64 bytes from 192.168.111.2: icmp_seq=1 ttl=64 time=0.066 ms\r
-64 bytes from 192.168.111.2: icmp_seq=2 ttl=64 time=0.059 ms\r
-\r
---- 192.168.111.2 ping statistics ---\r
-2 packets transmitted, 2 received, 0% packet loss, time 999ms\r
-rtt min/avg/max/mdev = 0.059/0.062/0.066/0.008 ms\r
-</code></pre>\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip netns exec host_1 ping -c2 192.168.111.2\r
-# And at the same time in another terminal:\r
-sudo ip netns exec host_1 tcpdump -n -i if_1\r
-tcpdump: verbose output suppressed, use -v or -vv for full protocol decode\r
-listening on if_1, link-type EN10MB (Ethernet), capture size 262144 bytes\r
-^C16:34:44.894396 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 14277, seq 1, length 64\r
-16:34:44.894431 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 14277, seq 1, length 64\r
-16:34:45.893385 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 14277, seq 2, length 64\r
-16:34:45.893418 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 14277, seq 2, length 64\r
-\r
-4 packets captured\r
-4 packets received by filter\r
-0 packets dropped by kernel\r
-</code></pre>\r
-</li>\r
-</ol>\r
-<h3 id="netns2br">Connect A Network Namespace To A Bridge</h3>\r
-<p>\r
-In this usage scenario, a <a href="/virtual-networking-with-linux-network-namespaces" title="Network Namespaces Explained">network namespace</a> (i.e., a virtual host) is connected to a <a href="/virtual-networking-with-linux-virtual-bridges" title="Virtual Bridges Explained">bridge</a> (i.e. a virtual network/switch) with a virtual patch cable (the veth-pair).\r
-The network namespace may be the default network namespace (i.e., the local host).\r
-</p>\r
-<p>Receipt:</p>\r
-<ol>\r
-<li>\r
-Create a bridge and a network namespace.\r
-Then connect the network namespace to the bridge with a veth-pair\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip link add dev switch type bridge\r
-sudo ip netns add host_1\r
-sudo ip link add dev veth0 type veth peer name link_1\r
-sudo ip link set dev veth0 netns host_1\r
-</code></pre>\r
-You can think of the last step (the three last commands) as plugging the virtual host (<em>the network namespace</em>) into the virtual switch (<em>the bridge</em>) with the help of a patch-cable (<em>the veth-pair</em>).\r
-</li>\r
-<li>\r
-Configure the network interfaces and bring all devices up:\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip link set dev switch up\r
-sudo ip link set dev link_1 master switch\r
-sudo ip link set dev link_1 up\r
-sudo ip netns exec host_1 ip addr add 192.168.111.1/24 dev veth0\r
-sudo ip netns exec host_1 ip link set dev veth0 up\r
-</code></pre>\r
-</li>\r
-<p>\r
-<em>The bridge only needs its own IP, if the network has to be routable (see: <a href="/virtual-networking-with-linux-virtual-bridges" title="Read more about virtual bridges, if you want to learn why">Virtual Bridges</a>)</em>\r
-</p>\r
-<li>\r
-Check the created configuration:\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip netns exec host_1 ip -d addr show\r
-1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1\r
-    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0 \r
-947: veth0@if946: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000\r
-    link/ether 3e:70:06:77:fa:67 brd ff:ff:ff:ff:ff:ff link-netnsid 0 promiscuity 0 \r
-    veth \r
-    inet 192.168.111.1/24 scope global veth0\r
-       valid_lft forever preferred_lft forever\r
-    inet6 fe80::3c70:6ff:fe77:fa67/64 scope link \r
-       valid_lft forever preferred_lft forever\r
-</code></pre>\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip netns exec host_1 ip route show\r
-192.168.111.0/24 dev veth0  proto kernel  scope link  src 192.168.111.1\r
-</code></pre>\r
-</li>\r
-<li>\r
-In order to validate the setup, we need a second address in our virtual network for the <code>ping</code>-command.\r
-There are three ways to achieve this.\r
-<em>Choose only one!</em><br />\r
-(There are even more possibilities &mdash; for example connecting the bridge to the real network interface of the host &mdash;, but these are the most straight forward approaches...)\r
-<ul>\r
-<li>\r
-Give the virtual network its own address, so that it becomes routable:\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip addr add 192.168.111.254/24 dev switch\r
-ping -c2 192.168.111.1\r
-sudo ip netns exec host_1 ping -c2 192.168.111.254\r
-</code></pre>\r
-In this commonly used approach, the kernel sets up all needed routing entries automatically.\r
-</li>\r
-<li>\r
-Add a second virtual host to the network:\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip netns add host_2\r
-sudo ip link add dev veth0 type veth peer name link_2\r
-sudo ip link set dev veth0 netns host_2\r
-sudo ip link set dev link_2 master switch\r
-sudo ip link set dev link_2 up\r
-sudo ip netns exec host_2 ip addr add 192.168.111.2/24 dev veth0\r
-sudo ip netns exec host_2 ip link set dev veth0 up\r
-sudo ip netns exec host_2 ping -c2 192.168.111.1\r
-sudo ip netns exec host_1 ping -c2 192.168.111.2\r
-</code></pre>\r
-In this approach, the virtual network is kept separated from the host.\r
-Only the virtual hosts, that are plugged into the virtual network can reach each other.\r
-</li>\r
-<li>\r
-Connect the local host to the virtual network\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip link add dev veth0 type veth peer name link_2\r
-sudo ip link set dev link_2 master switch\r
-sudo ip link set dev link_2 up\r
-sudo ip addr add 192.168.111.2/24 dev veth0\r
-sudo ip link set dev veth0 up\r
-ping -c2 192.168.111.1\r
-sudo ip netns exec host_1 ping -c2 192.168.111.2\r
-</code></pre>\r
-Strictly speaking, this is a special case of the former approach, where the default network namespace is used instead of a private one.\r
-<br />\r
-In general, it is advisable, to use the first approach, if you do need a connection to the local host, because it does not clutter your default network namespace with two more interfaces (here: <code>veth0</code> and <code>link_2</code>).\r
-</li>\r
-</ul>\r
-</li>\r
-</ol>\r
-\r
-<h3 id="br2br">Connect Two Bridges</h3>\r
-<p>\r
-</p>\r
-<p>Receipt:</p>\r
-<ol>\r
-<li>\r
-<pre class="prettyprint" id="script"><code class="bash"></code></pre>\r
-</li>\r
-<li>\r
-<pre class="prettyprint" id="script"><code class="bash"></code></pre>\r
-</li>\r
-<li>\r
-<pre class="prettyprint" id="script"><code class="bash"></code></pre>\r
-</li>\r
-</ol>\r
-\r
-\r
-<h2>Pitfalls</h2>\r
-<ul>\r
-<li><a href="#prefix-length">Do Not Forget To Specifiy The Prefix-Length For The Addresses</a></li>\r
-<li><a href="#capturing">Capturing Packages On Virtual Interfaces</a></li>\r
-<li><a href="#pointless">Wrong (Or Better: Pointless) Usage Of Veth-Pairs</a></li>\r
-</ul>\r
-<h3 id="prefix-length">Do Not Forget To Specifiy The Prefix-Length For The Addressses</h3>\r
-<p>\r
-<strong>If you forget to specifiy the prefix-length for one of the addresses, you will not be able to ping the host on the other end of the veth-pair.</strong>\r
-</p>\r
-<p>\r
-<code>192.168.111.1<strong>/24</strong></code> specifies the address <code>192.168.111.1</code> as part of the subnet with the network-mask <code>255.255.255.0</code>. If you forget the prefix, the address will be interpreted as <code>192.168.111.1<strong>/32</strong></code> and the kernel will not add a network-route. Hence, you will not be able to ping the other end (<code>192.168.111.2</code>), because the kernel would not know, that it is reachable via the interface that belongs to the address <code>192.168.111.1</code>.\r
-</p>\r
-<h3 id="capturing">Capturing Packages On Virtual Interfaces</h3>\r
-<p>\r
-If you run <code>tcpdump</code> on an interface in the default-namespace, the captured packages show up immediatly.\r
-I.e.: You can watch the exchange of ICMP-packages live, as it happens.\r
-But: <strong>If you run <code>tcpdump</code> in a named network-namespace, the captured packages will not show up, until you stop the command with <code>CRTL-C</code>!</strong>\r
-</p>\r
-<p>\r
-<em>Do not ask me why &mdash; I just witnessed that odd behaviour on my linux-box and found it noteworthy, because I thought, that my setup was not working several times, before I realised, that I had to kill <code>tcpdump</code> to see the captured packages.</em>\r
-</p>\r
-<h3 id="pointless">Wrong (Or Better: Pointless) Usage Of Veth-Pairs</h3>\r
-<p>\r
-This is another reason, why packages might not show up on the virtual interfaces of the configured veth-pair.\r
-Often, veth-pairs are used as a simple example for virtual networking like in the following snippet:\r
-</p>\r
-<pre class="prettyprint" id="script"><code class="bash">sudo ip link add dev if_1 type veth peer name if_2\r
-sudo ip addr add 192.168.111.1 dev if_1\r
-sudo ip link set dev if_1 up\r
-sudo ip addr add 192.168.111.2 dev if_2\r
-sudo ip link set dev if_2 up\r
-</code></pre>\r
-<p>\r
-<em>\r
-Note, that additionally, the prefix was not specified with the given addresses (<a href="#prefix-length" title="Compare with the remarkes considering the prefix length">compare with above</a>)!\r
-This works here, because both interfaces are local, so that the kernel does know how to reach them without any routing information.\r
-</em>\r
-<p>\r
-The setup is then <em>"validated"</em> with a ping from one address to the other:\r
-</p>\r
-<pre class="prettyprint" id="script"><code class="bash">ping -c 3 -I 192.168.111.1 192.168.111.2\r
-PING 192.168.111.2 (192.168.111.2) from 192.168.111.1 : 56(84) bytes of data.\r
-64 bytes from 192.168.111.2: icmp_seq=1 ttl=64 time=0.068 ms\r
-64 bytes from 192.168.111.2: icmp_seq=2 ttl=64 time=0.079 ms\r
-64 bytes from 192.168.111.2: icmp_seq=3 ttl=64 time=0.105 ms\r
-\r
---- 192.168.111.2 ping statistics ---\r
-3 packets transmitted, 3 received, 0% packet loss, time 2052ms\r
-rtt min/avg/max/mdev = 0.068/0.084/0.105/0.015 ms\r
-</code></pre>\r
-<p>\r
-Though it looks like the setup is working as intended, this is not the case:\r
-<em>The packets are not routed through the virtual network interfaces <code>if_1</code> and <code>if_2</code></em>\r
-</p>\r
-<pre class="prettyprint" id="script"><code class="bash">sudo tcpdump -i if_1 -n\r
-tcpdump: verbose output suppressed, use -v or -vv for full protocol decode\r
-listening on if_1, link-type EN10MB (Ethernet), capture size 262144 bytes\r
-^C\r
-0 packets captured\r
-0 packets received by filter\r
-0 packets dropped by kernel\r
-</code></pre>\r
-<p>\r
-Instead, they show up on the local interface:\r
-</p>\r
-<pre class="prettyprint" id="script"><code class="bash">sudo tcpdump -i lo -n\r
-tcpdump: verbose output suppressed, use -v or -vv for full protocol decode\r
-listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes\r
-12:20:09.899325 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 28048, seq 1, length 64\r
-12:20:09.899353 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 28048, seq 1, length 64\r
-12:20:10.909627 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 28048, seq 2, length 64\r
-12:20:10.909684 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 28048, seq 2, length 64\r
-12:20:11.933584 IP 192.168.111.1 > 192.168.111.2: ICMP echo request, id 28048, seq 3, length 64\r
-12:20:11.933630 IP 192.168.111.2 > 192.168.111.1: ICMP echo reply, id 28048, seq 3, length 64\r
-^C\r
-6 packets captured\r
-12 packets received by filter\r
-0 packets dropped by kernel\r
-</code></pre>\r
-<p>\r
-This happens, because the kernel adds entries for both interfaces in the local routing table, since both interfaces are connected to the default network namespace of the host:\r
-</p>\r
-<pre class="prettyprint" id="script"><code class="bash">ip route show table local\r
-broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 \r
-local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1 \r
-local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 \r
-broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 \r
-<strong>local 192.168.111.1 dev if_1  proto kernel  scope host  src 192.168.111.1 \r
-local 192.168.111.2 dev if_2  proto kernel  scope host  src 192.168.111.2</strong>\r
-</code></pre>\r
-<p>\r
-When routing the packages, the kernel looks up this entries and consequently routes the packages through the <code>lo</code>-interface, since both addresses are local addresses.\r
-</p>\r
-<p>\r
-There is nothing strange or even wrong with this behavior.\r
-<strong>\r
-If there is something wrong in this setup, it is the idea to create two connected virtual local interfaces.\r
-</strong>\r
-That is equally pointless, as installing two nics into one computer and connecting both cards with a cross-over patch cable...\r
-</p>\r
-<h2>References</h2>\r
-<ul>\r
-<li><a href="https://gabhijit.github.io/linux-virtual-interfaces.html" title="Linux Virtual Interfaces">Linux Virtual Interfaces</a></li>\r
-<li><a href="http://linux-ip.net/html/routing-tables.html" title="Guide to IP Layer Network Administration with Linux, Chapter 4. IP Routing, Section 4.8 Routing Tables">Guide to IP Layer Network Administration with Linux</a></li>\r
-</ul>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>835</wp:post_id>
-               <wp:post_date><![CDATA[2019-06-04 15:19:22]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[virtual-networking-with-linux-veth-pairs]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="explained"><![CDATA[Explained]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Virtual Networking With Linux: Network Namespaces</title>
-               <link>https://juplo.de/?p=856</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=856</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>856</wp:post_id>
-               <wp:post_date><![CDATA[2019-06-03 19:50:08]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[virtual-networking-with-linux-network-namespaces]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Virtual Networking With Linux: Virtual Bridges</title>
-               <link>https://juplo.de/?p=858</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=858</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>858</wp:post_id>
-               <wp:post_date><![CDATA[2019-06-04 09:27:40]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[virtual-networking-with-linux-virtual-bridges]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Debugging The OAuth2-Flow in Spring Security</title>
-               <link>https://juplo.de/?p=971</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=971</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>TL;DR</h2>\r
-<p>\r
-Use <strong><code>CommonsRequestLoggingFilter</code></strong> and place it befor the filter, that represents Spring Security.\r
-</p>\r
-<p>Jump to the <a href="details">configuration details</a></p> \r
-<h2>The problem: Logging the Request/Response-Flow</h2>\r
-<p>\r
-If you want to understand the OAuth2-Flow or have to debug any issues involving it, the crucial part about it is the request/response-flow between your application and the provider.\r
-<strong>Unfortunately, this \r
-</p>\r
-<pre class="prettyprint"><code class="properties">spring.security.filter.order=-100\r
-</code></pre>\r
-https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#security-properties\r
-\r
-https://mtyurt.net/post/spring-how-to-insert-a-filter-before-springsecurityfilterchain.html\r
-\r
-https://spring.io/guides/topicals/spring-security-architecture#_web_security\r
-<pre class="prettyprint"><code class="properties">logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG\r
-</code></pre>\r
-<pre class="prettyprint"><code class="java">@Bean\r
-public FilterRegistrationBean requestLoggingFilter()\r
-{\r
-  CommonsRequestLoggingFilter loggingFilter = new CommonsRequestLoggingFilter();\r
-\r
-  loggingFilter.setIncludeClientInfo(true);\r
-  loggingFilter.setIncludeQueryString(true);\r
-  loggingFilter.setIncludeHeaders(true);\r
-  loggingFilter.setIncludePayload(true);\r
-  loggingFilter.setMaxPayloadLength(64000);\r
-\r
-  FilterRegistrationBean reg = new FilterRegistrationBean(loggingFilter);\r
-  reg.setOrder(-101); // Default for spring.security.filter.order is -100\r
-  return reg;\r
-}\r
-</code></pre>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>971</wp:post_id>
-               <wp:post_date><![CDATA[2019-12-28 00:34:36]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="hacking"><![CDATA[Hacking]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="oauth2"><![CDATA[oauth2]]></category>
-               <category domain="category" nicename="spring-boot"><![CDATA[Spring-Boot]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_oembed_0a2776cf844d7b8b543bf000729407fe]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[{{unknown}}]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_oembed_4484ca19961800dfe51ad98d0b1fcfef]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[{{unknown}}]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_oembed_b0575eccf8471857f8e25e8d0f179f68]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[{{unknown}}]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Enabling Decoupled Template Logic For Thymeleaf In A Spring-Boot App</title>
-               <link>https://juplo.de/?p=1004</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1004</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1004</wp:post_id>
-               <wp:post_date><![CDATA[2019-12-28 00:36:30]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Select Text-Content Of A Tag With Thymeleaf&#039;s Markup Selection</title>
-               <link>https://juplo.de/?p=1006</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1006</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1006</wp:post_id>
-               <wp:post_date><![CDATA[2019-12-28 14:06:47]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Implementing Narrow IntegrationTests By Combining MockServer With Testcontainers</title>
-               <link>https://juplo.de/?p=1009</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1009</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1009</wp:post_id>
-               <wp:post_date><![CDATA[2020-01-11 13:41:39]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>In Need Of A MockWebClient? Mock WebClient With A Short-Circuit-ExchangeFunction</title>
-               <link>https://juplo.de/?p=1011</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1011</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1011</wp:post_id>
-               <wp:post_date><![CDATA[2020-01-11 13:45:04]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>UnitTest or IntegrationTest? A Practical Guide</title>
-               <link>https://juplo.de/?p=1013</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1013</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p><em>Idee:</em> Zeigen, dass die Entscheidung nicht akademisch, sondern praktisch getroffen werden sollte / muss</p>\r
-<p>TODO</p>\r
-<ul>\r
-<li>Am Beispiel von WebClient mit Mockito zeigen das Mocking schnell zu einem schlechten Unit-Test führt: Getestet werden Implementierungsdetails, wie genau wann die Fluid-API aufgerufen wird! Insbesondere gefährlich, wenn zusätzlich verifiziert wird</li>\r
-<li>Außerdem: Häufig wird gar nicht mehr die Implementierung getestet, sondern irgendwelche Toos! Ein Beispiel: Commit-Schlechter-Unit-Tests. Z.B. zu sehen hier: https://stackoverflow.com/a/57196768/247276 und hier: https://www.baeldung.com/spring-mocking-webclient#mockito\r
-<li>Eigentlich will man: Das ggf. benötigte Verhalten möglichst unscharf aber passen erlauben. Eventuell: Aufrufe die als Seiteneffekte passieren müssen verifizieren</li>\r
-<li>\r
-Als Konsequenz aus obigem auch: \r
-<ul>\r
-<li>Wenn Mocking komplexer Klassen benötigt wird besser nicht mit UnitTest anfangen. Dann hätte man nämlich das Problem, das man ggf. noch gar nicht weiß, wie sich die ersetzte Klasse intern verhält.</li>\r
-<li>Besser hier mit einem <em>Narro</em> Integration-Test anfangen. Der hat dann auch den schönen Nebeneffekt, dass man ihn wie den ersten Klienten des neu definierten Kontrakts betrachten kann! Erst wenn so klar geworden ist, wie der Kontrakt genau aussieht und welche einzelnen Methoden-Signaturen und -Kontrakte sich daraus ergeben diese in UnitTests überführen, die wesentlich schneller testbar sind.</li>\r
-<li><strong>Problem bei dieser Überlegung:</strong> Abgrenzung / Kombination mit TDD!</li>\r
-<li><em>Ggf. Antwort:</em> Hier wird klar, wann die Unterscheidung zwischen Unit-Tests und Integration-Tests künstlich wird.</li>\r
-<li>Mit einem Unit-Test, der akademisch betrachtet schon ein Narrow Integration-Test ist, sollte sich TDD weiterhin problemlos durchhalten lassen</li>\r
-</ul>\r
-<li>Mit einer Stub/Mock-Kombination ließe sich hier schon mehr ausrichten? Gemeint: Stub für alle aus Test-Sicht unwesenlichen Aufrufe und Unterklassen der Fluid-API des WebClient implementieren und das Verhalten von diesem an der für den Test wichtigen Stelle von außen konfigurierbar &mdash; <code>mockbar</code> &mdash; machen</li>\r
-<li>Noch ein Schritt weiter (oder direkt überspringen): WebClient direkt benutzen und nur die Exchange-Function ersetzen: siehe https://dzone.com/articles/unit-tests-for-springs-webclient\r
-</ul>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1013</wp:post_id>
-               <wp:post_date><![CDATA[2020-01-14 16:42:01]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Testing Spring WebFlux with @SpringBootTest</title>
-               <link>https://juplo.de/?p=1034</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1034</guid>
-               <description></description>
-               <content:encoded><![CDATA[]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1034</wp:post_id>
-               <wp:post_date><![CDATA[2020-01-14 10:36:23]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="tips"><![CDATA[Tips]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>How To Redirect To Spring Security OAuth2 Behind a Gateway/Proxy -- Part 3: Debugging The OAuth2-Flow</title>
-               <link>https://juplo.de/?p=1116</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1116</guid>
-               <description></description>
-               <content:encoded><![CDATA[If you only see something like the following, after starting NGINX, you have forgotten, to start your app before (in the network <code>juplo</code>):\r
-<pre class="prettyprint"><code class="sh">2020/03/06 14:31:20 [emerg] 1#1: host not found in upstream "app:8080" in /etc/nginx/conf.d/proxy.conf:2\r
-nginx: [emerg] host not found in upstream "app:8080" in /etc/nginx/conf.d/proxy.conf:2\r
-</code></pre>\r
-<pre class="prettyprint"><code class="sh">\r
-</code></pre>\r
-<pre class="prettyprint"><code class="sh">\r
-</code></pre>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1116</wp:post_id>
-               <wp:post_date><![CDATA[2020-03-07 15:58:36]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>The Outbox-Pattern - Pro / Contra / Alternatives</title>
-               <link>https://juplo.de/?p=1225</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1225</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>The Outbox</h2>\r
-<p>\r
-The outbox is represented by an additionally table in the database, thate takes part in the transaction.\r
-All messages, that should be send if and only if the transaction is sucessfully completed, are stored in this table.\r
-The sending of this messages is thus postponed after the transaction is completed.\r
-</p>\r
-<p>\r
-If the table is read outside of the transaction context, only entries related to sucessfully commited transactions are visible.\r
-These entries can then be read and queued for sending.\r
-If the entries are only removed from the outbox-table after a successful transmission has been confirmed by the messaging middleware, no messages can be lost.\r
-<h2>Drawback Of The Outbox-Pattern</h2>\r
-<p>\r
-The biggest drawback of the Outbox-Pattern is the postponent of all messages, that are send as part of a transaction after the completion of the transaction.\r
-This changes the order in which the messages are sent.\r
-</p>\r
-</p><img src="http://juplo.de/wp-uploads/2021/02/outbox-pattern-sending-order.png" alt="Sending Order in the Outbox-Patern" width="100%"/><p>\r
-Messages B1 and B2 of a transaction B, that started after a transation A will be sent before messages A1 and A2, that belong to transaction A, if transaction B completes before transaction A, even if the recording of messages A1 and A2 happend before the recording of messages B1 and B2.\r
-This happens, because all messages, that are written in transaction A will only become visible to the processing of the messages, after the completion of the transaction, because the processing of the messaging happens outside of the scope of the transaction.\r
-Therefore, the commit-order dictates the order, in which messages are sent.\r
-</p>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1225</wp:post_id>
-               <wp:post_date><![CDATA[2021-02-12 08:57:51]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="explained"><![CDATA[Explained]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Implementing The Outbox-Pattern With Kafka - Part 2: Sending Messages From The Outbox</title>
-               <link>https://juplo.de/?p=1257</link>
-               <pubDate>Mon, 30 Nov -0001 00:00:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1257</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p><em>This article is part of a Blog-Series</em></p>
-<p>
-Based on a <a href="/implementing-the-outbox-pattern-with-kafka-part-0-the-example/">very simple example-project</a>
-we will implemnt the <a href="https://microservices.io/patterns/data/transactional-outbox.html">Outbox-Pattern</a> with <a href="https://kafka.apache.org/quickstart">Kafka</a>.
-</p>
-<ul>
-<li><a href="/implementing-the-outbox-pattern-with-kafka-part-0-the-example/" title="Jump to the explanation of the example project">Part 0: The Example-Project</a></li>
-<li><a href="/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table/" title="Jump to the explanation what has to be added, to enqueue messages in an outbox for successfully written transactions">Part 1: Writing In The Outbox-Table</a></li>
-<li>Part 2: Sending Messages From The Outbox</li>
-</ul>
-<h2>TL;DR</h2>
-<p>
-In this part, we will add a first simple version of the logic, that is needed to poll the outbox-table and send the found entries as messages into a Apache Kafka topic.
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1257</wp:post_id>
-               <wp:post_date><![CDATA[2021-05-16 14:56:45]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[0000-00-00 00:00:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[implementing-the-outbox-pattern-with-kafka-part-2-sending-messages-from-the-outbox]]></wp:post_name>
-               <wp:status><![CDATA[draft]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>hibernate4-maven-plugin 1.0 released!</title>
-               <link>https://juplo.de/hibernate4-maven-plugin-1-0-released/</link>
-               <pubDate>Thu, 29 Nov 2012 20:04:25 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=55</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p><strong>Yeah!</strong> We successfully released our first artifact to <a href="http://search.maven.org/" title="Central">Central</a>.</p>\r
-<p>\r
-  <strong><a href="/hibernate4-maven-plugin/" title="hibernate4-maven-plugin">hibernate4-maven-plugin</a></strong> is now available in the <a href="http://search.maven.org/#artifactdetails|de.juplo|hibernate4-maven-plugin|1.0|maven-plugin" title="Central Maven Repository">Central Maven Repository</a>\r
-</p>\r
-<p>\r
-  That means, that you now can use it without manually downloading and adding it to your local repository.\r
-</p>\r
-<p>\r
-  Simply define it in your <code>plugins</code>-section...\r
-</p>\r
-<pre lang="javascript" line="1">\r
-<plugin>\r
-  <groupId>de.juplo</groupId>\r
-  <artifactId>hibernate4-maven-plugin</artifactId>\r
-  <version>1.0</version>\r
-</plugin>\r
-</pre>\r
-<p>\r
-  ...and there you go!\r
-</p>\r
-<ul>\r
-  <li><a href="/hibernate4-maven-plugin/" title="hibernate4-maven-plugin">hibernate4-maven-plugin?</a> What's that for?!?</li>\r
-  <li><a href="/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/" title="About the hibernate4-maven-plugin">Read more about the hibernate4-maven-plugin...</a></li>\r
-  <li><a href="/hibernate4-maven-plugin-1.0/examples.html" title="Quickstart">Jump to the quickstart-guide!</a></li>\r
-</ul>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>55</wp:post_id>
-               <wp:post_date><![CDATA[2012-11-29 22:04:25]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2012-11-29 20:04:25]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[hibernate4-maven-plugin-1-0-released]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="hibernate"><![CDATA[Hibernate]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_old_slug]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[hibernat4-maven-plugin-1-0-released]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>hibernate4-maven-plugin 1.0.1 released!</title>
-               <link>https://juplo.de/hibernate4-maven-plugin-1-0-1-released/</link>
-               <pubDate>Tue, 15 Jan 2013 23:10:59 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=64</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Today we released the bugfix-version 1.0.1 of <a href="/hibernate4-maven-plugin" title="hibernate4-maven-plugin">hibernate4-maven-plugin</a> to <a href="http://search.maven.org/" title="Central">Central</a>.\r
-</p>\r
-<p>Appart from two bugfixes, this version includes some minor improvements, which might come in handy for you.</p>\r
-<p>\r
-<strong><a href="/hibernate4-maven-plugin/" title="hibernate4-maven-plugin">hibernate4-maven-plugin 1.0.1</a></strong> should be available in the <a href="http://search.maven.org/#artifactdetails|de.juplo|hibernate4-maven-plugin|1.0.1|maven-plugin" title="Central Maven Repository">Central Maven Repository</a> in a few hours.\r
-</p>\r
-<ul>\r
-  <li><a href="/hibernate4-maven-plugin/" title="hibernate4-maven-plugin">hibernate4-maven-plugin?</a> What's that for?!?</li>\r
-  <li><a href="/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/" title="About the hibernate4-maven-plugin">Read more about the hibernate4-maven-plugin...</a></li>\r
-  <li><a href="/hibernate4-maven-plugin/configuration.html" title="Quickstart">Jump to the quickstart-guide!</a></li>\r
-</ul>\r
-<h2>Release notes:</h2>\r
-<code>\r
-commit 4b507b15b0122ac180e44b8418db8d9143ae9c3a\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Tue Jan 15 23:09:01 2013 +0100\r
-\r
-    Reworked documentation: splited and reorderd pages and menu\r
-\r
-commit 65bbbdbaa7df1edcc92a3869122ff06a3895fe57\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Tue Jan 15 22:39:39 2013 +0100\r
-\r
-    Added breadcrumb to site\r
-\r
-commit a8c4f4178a570da392c94e384511f9e671b0d040\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Tue Jan 15 22:33:48 2013 +0100\r
-\r
-    Added Google-Analytics tracking-code to site\r
-\r
-commit 1feb1053532279981a464cef954072cfefbe01a5\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Tue Jan 15 22:21:54 2013 +0100\r
-\r
-    Added release information to site\r
-\r
-commit bf5e8c39287713b9eb236ca441473f723059357a\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Tue Dec 18 00:14:08 2012 +0100\r
-\r
-    Reworked documentation: added documentation for new features etc.\r
-\r
-commit 36af74be42d47438284677134037ce399ea0b58e\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Tue Jan 15 10:40:09 2013 +0100\r
-\r
-    Test-Classes can now be included into the scanning for Hibernate-Annotations\r
-\r
-commit bcf07578452d7c31dc97410bc495c73bd0f87748\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Tue Jan 15 09:09:05 2013 +0100\r
-\r
-    Bugfix: database-parameters for connection were not taken from properties\r
-    \r
-    The hibernate-propertiesfile was read and used for the configuration of\r
-    the SchemaExport-class, but the database-parameters from these source were\r
-    ignored, when the database-connection was opened.\r
-\r
-commit 54b22b88de40795a73397ac8b3725716bc80b6c4\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Wed Jan 9 20:57:22 2013 +0100\r
-\r
-    Bugfix: connection was closed, even when it was never created\r
-    \r
-    Bugreport from: Adriano Machado <adriano.m.machado@hotmail.com>\r
-    \r
-    When only the script is generated and no export is executed, no database-\r
-    connection is opend. Nevertheless, the code tried to close it in the\r
-    finally-block, which lead to a NPE.\r
-\r
-commit b9ab24b21d3eb65e2a2208be658ff447c1846894\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Tue Dec 18 00:31:22 2012 +0100\r
-\r
-    Implemented new parameter "force"\r
-    \r
-    If -Dhibernate.export.force is specified, the schema-export will be forced.\r
-\r
-commit 19740023bb37770ad8e08c8e50687cb507e2fbfd\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Fri Dec 14 02:16:44 2012 +0100\r
-\r
-    Plugin ignores upper- or lower-case mismatches for "type" and "target"\r
-\r
-commit 8a2e08b6409034fd692c4bea72058f785e6802ad\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Fri Dec 14 02:13:05 2012 +0100\r
-\r
-    The Targets EXPORT and NONE force excecution\r
-    \r
-    Otherwise, an explicitly requestes SQL-export or mapping-test-run would be\r
-    skipped, if no annotated class was modified.\r
-    \r
-    If the export is skipped, this is signaled via the maven-property\r
-    hibernate.export.skipped.\r
-    \r
-    Refactored name of the skip-property to an public final static String\r
-\r
-commit 55a33e35422b904b974a19d3d6368ded60ea1811\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Fri Dec 14 01:43:45 2012 +0100\r
-\r
-    Configuration via properties reworked\r
-    \r
-     * export-type and -target are now also configurable via properties\r
-     * schema-filename, -delemiter and -format are now also configurable via\r
-       porperties\r
-\r
-commit 5002604d2f9024dd7119190915b6c62c75fbe1d6\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Thu Dec 13 16:19:55 2012 +0100\r
-\r
-    schema is now rebuild, when SQL-dialect changes\r
-\r
-commit a2859d3177a64880ca429d4dfd9437a7fb78dede\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Tue Dec 11 17:30:19 2012 +0100\r
-\r
-    Skipping of unchanged scenarios is now based on MD5-sums of all classes\r
-    \r
-    When working with Netbeans, the schema was often rebuild without need.\r
-    The cause of this behaviour was, that Netbeans (or Maven itself) sometimes\r
-    touches unchanged classes. To avoid this, hibernat4-maven-plugin now\r
-    calculates MD5-sums for all annotated classes and compares these instead of\r
-    the last-modified value.\r
-\r
-commit a4de03f352b21ce6abad570d2753467e3a972a10\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Tue Dec 11 17:02:14 2012 +0100\r
-\r
-    hibernate4:export is skipped, when annotated classes are unchanged\r
-    \r
-    Hbm2DdlMojo now checks the last-modified-timestamp of all found annotated\r
-    classes and aborts the schema-generation, when no class has changed and no\r
-    new class was added since the last execution.\r
-    \r
-    It then sets a maven-property, to indicate to other plugins, that the\r
-    generation was skipped.\r
-\r
-commit 2f3807b9fbde5c1230e3a22010932ddec722871b\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Thu Nov 29 18:23:59 2012 +0100\r
-\r
-    Found annotated classes get logged now\r
-\r
-</code>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>64</wp:post_id>
-               <wp:post_date><![CDATA[2013-01-16 01:10:59]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2013-01-15 23:10:59]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[hibernate4-maven-plugin-1-0-1-released]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="hibernate"><![CDATA[Hibernate]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>hibernate4-maven-plugin 1.0.2 released!</title>
-               <link>https://juplo.de/hibernate4-maven-plugin-1-0-2-release/</link>
-               <pubDate>Fri, 02 Aug 2013 00:06:08 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=75</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Today we released the version 1.0.2 of <a href="/hibernate4-maven-plugin" title="hibernate4-maven-plugin">hibernate4-maven-plugin</a> to <a href="http://search.maven.org/" title="Central">Central</a>.\r
-</p>\r
-<p>This release includes:</p>\r
-<ul>\r
-<li>Improved documentation (thanks to Adriano Machado)</li>\r
-<li>Support for the <code>hibernateNamingStrategy</code>-configuration-option (thanks to Lorenzo Nicora)</li>\r
-<li>Mapping via <code>*.hbm.xml</code>-files (old approach without annotations)</li>\r
-</ul>\r
-<p>\r
-<strong><a href="/hibernate4-maven-plugin/" title="hibernate4-maven-plugin">hibernate4-maven-plugin 1.0.2</a></strong> is available in the <a href="http://search.maven.org/#artifactdetails|de.juplo|hibernate4-maven-plugin|1.0.2|maven-plugin" title="Central Maven Repository">Central Maven Repository</a>.\r
-</p>\r
-<ul>\r
-  <li><a href="/hibernate4-maven-plugin/" title="hibernate4-maven-plugin">hibernate4-maven-plugin?</a> What's that for?!?</li>\r
-  <li><a href="/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/" title="About the hibernate4-maven-plugin">Read more about the hibernate4-maven-plugin...</a></li>\r
-  <li><a href="/hibernate4-maven-plugin/configuration.html" title="Quickstart">Jump to the quickstart-guide!</a></li>\r
-</ul>\r
-<h2>Release notes:</h2>\r
-<code>\r
-commit 4edef457d2b747d939a141de24bec5e32abbc0c7\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Fri Aug 2 00:37:40 2013 +0200\r
-\r
-    Last preparations for release\r
-\r
-commit 82eada1297cdc295dcec9f43660763a04c1b1deb\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Fri Aug 2 00:37:22 2013 +0200\r
-\r
-    Upgrade to Hibernate 4.2.3.Final\r
-\r
-commit 3d355800b5a5d2a536270b714f37a84d50b12168\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Thu Aug 1 12:41:06 2013 +0200\r
-\r
-    Mapping-configurations are opend as given before searched in resources\r
-\r
-commit 1ba817af3ae5ab23232fca001061f8050cecd6a7\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Thu Aug 1 01:45:22 2013 +0200\r
-\r
-    Improved documentaion (new FAQ-entries)\r
-\r
-commit 02312592d27d628cc7e0d8e28cc40bf74a80de21\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Wed Jul 31 23:07:26 2013 +0200\r
-\r
-    Added support for mapping-configuration through mapping-files (*.hbm.xml)\r
-\r
-commit b6ac188a40136102edc51b6824875dfb07c89955\r
-Author: nicus <lorenzo.nicora@nicus.it>\r
-Date:   Fri Apr 19 15:27:21 2013 +0200\r
-\r
-    Fixed problem with NamingStrategy (contribution from Lorenzo Nicora)\r
-    \r
-     * NamingStrategy is set explicitly on Hibernate Configuration (not\r
-       passed by properties)\r
-     * Added  'hibernateNamingStrategy' configuration property\r
-\r
-commit c2135b5dedc55fc9e3f4dd9fe53f8c7b4141204c\r
-Author: Kai Moritz <kai@coolibri.de>\r
-Date:   Mon Feb 25 22:35:33 2013 +0100\r
-\r
-    Integration of the maven-plugin-plugin for automated helpmojo-generation\r
-    \r
-    Thanks to Adriano Machado, who contributed this patch!\r
-\r
-</code>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>75</wp:post_id>
-               <wp:post_date><![CDATA[2013-08-02 02:06:08]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2013-08-02 00:06:08]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[hibernate4-maven-plugin-1-0-2-release]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="hibernate"><![CDATA[Hibernate]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>326</wp:comment_id>
-                       <wp:comment_author><![CDATA[Daniel McCafferty]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[daniel@danm.cc]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://danm.cc</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[170.148.215.156]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-09-06 14:58:41]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-09-06 12:58:41]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hey, is there a mode for this plugin where it can generate update rather than create statements.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1378593028.1295869350433349609375;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1378654914.853373050689697265625;s:7:"message";s:55:"Akismet cleared this comment during an automatic retry.";s:5:"event";s:10:"cron-retry";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1378472321.7545559406280517578125;s:7:"message";s:92:"Akismet was unable to check this comment (response: ), will automatically retry again later.";s:5:"event";s:11:"check-error";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>329</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[2.244.42.92]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-09-08 00:51:18]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-09-07 22:51:18]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Unfortunatly: no.
-
-The plugin is build around the <a href="http://docs.jboss.org/hibernate/core/4.2/manual/en-US/html/ch21.html#d5e9612" title="Documentaiton of the command-line-switches of SchemaExport" rel="nofollow">SchemaExport-Tool</a>, which does only support drop and create.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>326</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1378654913.931003093719482421875;s:7:"message";s:55:"Akismet cleared this comment during an automatic retry.";s:5:"event";s:10:"cron-retry";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1378594278.268208026885986328125;s:7:"message";s:92:"Akismet was unable to check this comment (response: ), will automatically retry again later.";s:5:"event";s:11:"check-error";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Bidirectional Association with @ElementCollection</title>
-               <link>https://juplo.de/bidirectional-association-with-elementcollection/</link>
-               <pubDate>Thu, 03 Oct 2013 09:11:36 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=90</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Have you ever wondered, how to map a bidirectional association from an entity to the instances of its element-collection? Actually, it is very easy, if you are using hibernate. It is just somehow hard to find in the documentation, if you are searching for it (look for chapter 2.4.3.4 in the <a href="http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec-property" title="Chapter 2.4.3 of the Hibernate-Annotation-Documentation">Hibernate-Annotationss-Documentation</a>).\r
-</p>\r
-<h2>Hibernate</h2>\r
-<p>\r
-So, here we go:\r
-Just add the <code>@Parent</code>-annotation to the attribute of your associated <code>@Embeddable</code>-class, that points back to its <em>parent</em>.\r
-</p>\r
-<pre lang="javascript" line="1">\r
-@Entity\r
-class Cat\r
-{\r
-  @Id\r
-  Long id;\r
-\r
-  @ElementCollection\r
-  Set<Kitten> kittens;\r
-\r
-  ...\r
-}\r
-\r
-@Embeddable\r
-class Kitten\r
-{\r
-  // Embeddable's have no ID-property!\r
-\r
-  @Parent\r
-  private Cat mother;\r
-\r
-  ...\r
-}\r
-</pre>\r
-<h2>Drawback</h2>\r
-<p>\r
-But this clean approach has a drawback: it only works with hibernate. If you work with other JPA-implementations or plain old JPA itself, it will not work. Hence, it will not work in googles appengine, for example!\r
-</p>\r
-<p>\r
-Unfortunatly, there are no clean workarounds, to get bidirectional associations to <code>@ElementCollections</code>'s working with JPA. The only workarounds I found, only work for directly embedded instances - not for collections of embedded instances:\r
-</p>\r
-<ul>\r
- <li>Applying <code>@Embedded</code> to a getter/setter pair rather than to the member itself (found on <a href="http://stackoverflow.com/a/5061089/247276" title="Open the Answer in stackoverflow.com">stackoverflow.com</a>).</li>\r
-  <li>Set the parent in the property set method (found in the <a href="http://en.wikibooks.org/wiki/Java_Persistence/Embeddables#Example_of_setting_a_relationship_in_an_embeddable_to_its_parent" title="Open the Java-Persistence WikiBook">Java-Persistence WikiBook</a>).\r
-</ul>\r
-<p>\r
-<strong>\r
-If you want bidirectiona associations to the elements of your embedded collection, it works only with hibernate!\r
-</strong>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>90</wp:post_id>
-               <wp:post_date><![CDATA[2013-10-03 11:11:36]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2013-10-03 09:11:36]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[bidirectional-association-with-elementcollection]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="hibernate"><![CDATA[Hibernate]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="jpa"><![CDATA[JPA]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Log out from wrong Account with maven-appengine-plugin</title>
-               <link>https://juplo.de/log-out-from-wrong-account-with-maven-appengine-plugin/</link>
-               <pubDate>Thu, 03 Oct 2013 09:33:56 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=97</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Do you work with the <a href="https://developers.google.com/appengine/docs/java/tools/maven" title="Open documentation">maven-appengine-plugin</a> and several google-accounts? If you do, or if you ever were logged in to the wrong google-account while executing <code>mvn appengine:update</code>, like me yesterday, you surely wondering, <strong>how to logout from maven-appengine-plugin</strong>.\r
-</p>\r
-<p>\r
-maven-appengine-plugin somehow miracolously stores your credentials for you, when you attemp to upload an app for the first time. This comes in very handy, if you work with just one google-account. But it might get a "pain-in-the-ass", if you work with several accounts. Because, if you once logged in into an account, there is no way (I mean: no goal of the maven-appengine-plugin) to log out, in order to change the account!\r
-</p>\r
-<h2>The solution: clear the credentials, that the maven-appengine-plugin stored on your behalf</h2>\r
-<p>\r
-Only after hard googling, i found a solution to this problem in a <a href="http://www.radomirml.com/blog/2009/09/20/delete-cached-google-app-engine-credentials/" title="Open the blog-post">blog-post</a>: maven-appengine-plugin stores its oauth2-credentials in the file <code>.appcfg_oauth2_tokens_java</code> in your home directory (on Linux - sorry Windows-folks, you have to figure out yourself, where the plugin stores the credentials on Windows).\r
-</p>\r
-<p>\r
-<strong>Just delete the file <code>.appcfg_oauth2_tokens_java</code> and your logged out!</strong> The next time you call <code>mvn appengine:upload</code> you will be asked again to accept the request and, hence, can switch accounts. <em>If you are not using oauth2, just look for <code>.appcfg*</code>-files in your home directory. I am sure, you will find another file with stored credentials, that you can delet to logout, like Radomir, who <a href="http://www.radomirml.com/blog/2009/09/20/delete-cached-google-app-engine-credentials/" title="Open Radomir's Blog-Post to read more...">deleted <code>.appcfg_cookiesy</code> to log out</a></em>.\r
-</p>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>97</wp:post_id>
-               <wp:post_date><![CDATA[2013-10-03 11:33:56]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2013-10-03 09:33:56]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[log-out-from-wrong-account-with-maven-appengine-plugin]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="appengine"><![CDATA[appengine]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <category domain="category" nicename="oauth2"><![CDATA[oauth2]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_old_slug]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[logout-from-wrong-account-with-maven-appengine-plugin]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>52833</wp:comment_id>
-                       <wp:comment_author><![CDATA[Nick Cotter]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[nick@extropy.net]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://cosmo-opticon.net</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[213.152.59.125]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-01-12 12:50:07]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-01-12 10:50:07]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thanks muchly for posting this!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1452595807.263144;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1452605699.2086589;s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>hibernate4-maven-plugin 1.0.3 released!</title>
-               <link>https://juplo.de/hibernate4-maven-plugin-1-0-3-released/</link>
-               <pubDate>Fri, 18 Oct 2013 00:46:23 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=114</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Today we released the version 1.0.3 of <a href="/hibernate4-maven-plugin" title="hibernate4-maven-plugin">hibernate4-maven-plugin</a> to <a href="http://search.maven.org/" title="Central">Central</a>.\r
-</p>\r
-<h2>Scanning dependencies</h2>\r
-<p>\r
-This release of the plugin now supports scanning of dependencies. By default all dependencies in the scope <code>compile</code> are scanned for annotated classes. Thanks to Guido Wimmel, who pointed out, that this was really missing and supported the implementation with a little test-project for this use-case. <a href="/hibernate4-maven-plugin/export-mojo.html#scanDependencies" title="Configuring dependency-scanning">Learn more...</a>\r
-</p>\r
-<h2>Support for Hibernate Envers</h2>\r
-<p>\r
-Another new feature of this release is support for <a href="http://docs.jboss.org/envers/docs/" title="Open documentation">Hibernate Envers - Easy Entity Auditing</a>. Thanks a lot to Victor Tatai, how implemented this, and Erik-Berndt Scheper, who helped integrating it and who supported the testin with a little test-project, that demonstrates the new feature. You can <a href="https://bitbucket.org/fbascheper/hibernate4-maven-plugin-envers-sample" title="Open the example project">visit it at bitbucket</a> as a starting point for your own experiments with this technique.\r
-</p>\r
-<h2>Less bugs!</h2>\r
-<p>\r
-Many thanks also to Stephen Johnson and Eduard Szente, who pointed out bugs and helped eleminating them...\r
-<p>\r
-<h2>Get your hands on - on central!</h2>\r
-<p>\r
-<strong><a href="/hibernate4-maven-plugin/" title="hibernate4-maven-plugin">hibernate4-maven-plugin 1.0.3</a></strong> is available in the <a href="http://search.maven.org/#artifactdetails|de.juplo|hibernate4-maven-plugin|1.0.3|maven-plugin" title="Central Maven Repository">Central Maven Repository</a>.\r
-</p>\r
-<ul>\r
-  <li>hibernate4-maven-plugin? <a href="/hibernate4-maven-plugin/" title="hibernate4-maven-plugin">What's that for?!?</a></li>\r
-  <li><a href="/hibernate4-maven-plugin-a-simple-plugin-for-generating-a-database-schema-from-hibernate-4-mapping-annotations/" title="About the hibernate4-maven-plugin">Read more about the hibernate4-maven-plugin...</a></li>\r
-  <li><a href="/hibernate4-maven-plugin/configuration.html" title="Quickstart">Jump to the quickstart-guide!</a></li>\r
-</ul>\r
-<h2>Release notes:</h2>\r
-<code>\r
-commit adb20bc4da63d4cec663ca68648db0f808e3d181\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Fri Oct 18 01:52:27 2013 +0200\r
-\r
-    Added missing documentation for skip-configuration\r
-\r
-commit 99a7eaddd1301df0d151f01791e3d177297670aa\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Fri Oct 18 00:38:29 2013 +0200\r
-\r
-    Added @since-Annotation to configuration-parameters\r
-\r
-commit 221d977368ee1897377f80bfcdd50dcbcd1d4b83\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Wed Oct 16 01:18:53 2013 +0200\r
-\r
-    The plugin now scans for annotated classes in dependencies too\r
-\r
-commit ef1233a6095a475d9cdded754381267c5d1e336f\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Wed Oct 9 21:37:58 2013 +0200\r
-\r
-    Project-Documentation now uses the own skin juplo-skin\r
-\r
-commit 84e8517be79d88d7e2bec2688a8f965f591394bf\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Wed Oct 9 21:30:28 2013 +0200\r
-\r
-    Reworked APT-Documentation: page-titles were missing\r
-\r
-commit f27134cdec6c38b4c8300efb0bb34fc8ed381033\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Wed Oct 9 21:29:30 2013 +0200\r
-\r
-    maven-site-plugin auf Version 3.3 aktualisiert\r
-\r
-commit d38b2386641c7ca00f54d69cb3f576c20b0cdccc\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Wed Sep 18 23:59:13 2013 +0200\r
-\r
-    Reverted to old behaviour: export is skipped, when maven.test.skip=true\r
-\r
-commit 7d935b61a3d80260b9cacf959984e14708c3a96b\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Wed Sep 18 18:15:38 2013 +0200\r
-\r
-    No configuration for hibernate.dialect might be a valid configuration too\r
-\r
-commit caa492b70dc1daeaef436748db38df1c19554943\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Wed Sep 18 18:14:54 2013 +0200\r
-\r
-    Improved log-messages\r
-\r
-commit 2b1147d5e99c764c1f6816f4d4f000abe260097c\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Wed Sep 18 18:10:32 2013 +0200\r
-\r
-    Variable "envers" should not be put into hibernate.properties\r
-    \r
-    "hibernate.exoprt.envers" is no Hibernate-Configuration-Parameter.\r
-    Hence, it should not be put into the hibernate.properties-file.\r
-\r
-commit 0a52dca3dd6729b8b6a43cc3ef3b69eb22755b0a\r
-Author: Erik-Berndt Scheper <erik.berndt.scheper@gmail.com>\r
-Date:   Tue Sep 10 16:18:47 2013 +0200\r
-\r
-    Rename envers property to hibernate.export.envers\r
-\r
-commit 0fb85d6754939b2f30ca4fc18823c5f7da1add31\r
-Author: Erik-Berndt Scheper <erik.berndt.scheper@gmail.com>\r
-Date:   Tue Sep 10 08:20:23 2013 +0200\r
-\r
-    Ignore IntelliJ project files\r
-\r
-commit e88830c968c1aabc5c32df8a061a8b446c26505c\r
-Author: Victor Tatai <vtatai@gmail.com>\r
-Date:   Mon Feb 25 16:23:29 2013 -0300\r
-\r
-    Adding envers support (contribution from Victor Tatai)\r
-\r
-commit e59ac1191dda44d69dfb8f3afd0770a0253a785c\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Sep 10 20:46:55 2013 +0200\r
-\r
-    Added Link to old Version 1.0.2 in documentation\r
-\r
-commit 97a45d03e1144d30b90f2f566517be22aca39358\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Sep 10 20:29:15 2013 +0200\r
-\r
-    Execution is only skipped, if explicitly told so\r
-\r
-commit 8022611f93ad6f86534ddf3568766f88acf863f3\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sun Sep 8 00:25:51 2013 +0200\r
-\r
-    Upgrade to Scannotation 1.0.3\r
-\r
-commit 9ab53380a87c4a1624654f654158a701cfeb0cae\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sun Sep 8 00:25:02 2013 +0200\r
-\r
-    Upgrade to Hibernate 4.2.5.Final\r
-\r
-commit 5715c7e29252ed230389cfce9c1a0376fec82813\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sat Aug 31 09:01:43 2013 +0200\r
-\r
-    Fixed failure when target/classes does not exist when runnin mvn test phase\r
-    \r
-    Thanks to Stephen Johnson <stejohns@redhat.com>\r
-    \r
-    Details from the original email:\r
-    ---------\r
-    The following patch stops builds failing when target/classes (or no main java exists), and target/test-classes and src/tests exist.\r
-    \r
-    So for example calling\r
-    \r
-    mvn test -> invokes compiler:compile and if you have export bound to process-classes phase in executions it will fail.  Maybe better to give info and carry on.  Say for example they want to leave the executions in place that deal with process-classes and also process-test-classes but they do not want it to fail if there is no java to annotate in src/classes.  The other way would be to comment out the executions bound to process-classes.  What about export being bound to process-class by default?  Could this also cause issues?\r
-    \r
-    In either case I think the plugin code did checks for src/classes directory existing, in which case even call "mvn test" would fail as src/classes would not exist as no java existed in src/main only in src/test.  Have a look through the patch and see if its of any use.\r
-\r
-commit 9414e11c9ffb27e195193f5fa53c203c6297c7a4\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sat Aug 31 11:28:51 2013 +0200\r
-\r
-    Improved log-messages\r
-\r
-commit da0b3041b8fbcba6175d05a2561b38c365111ed8\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sat Aug 31 08:51:03 2013 +0200\r
-\r
-    Fixed NPE when using nested classes in entities with @EmbeddedId/@Embeddable\r
-    \r
-    Patch supplied by Eduard Szente <eduard.szente@gmail.com>\r
-    \r
-    Details:\r
-    ----------------\r
-    Hi,\r
-    \r
-    when using your plugin for schema export the presence of nested classes\r
-    in entities (e.g. when using @EmbeddedId/@Embeddable and defining the Id\r
-    within the target entity class)\r
-    yields to NPEs.\r
-    \r
-    public class Entity {\r
-    \r
-      @EmbeddedId\r
-      private Id id;\r
-    \r
-      @Embeddable\r
-      public static class Id implements Serializable {\r
-        ....\r
-      }\r
-    \r
-    }\r
-    \r
-    Entity.Id.class.getSimplename == "Id", while the compiled class is named\r
-    "Entity$Id.class"\r
-    \r
-    Patch appended.\r
-    \r
-    Best regards,\r
-    Eduard\r
-\r
-</code>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>114</wp:post_id>
-               <wp:post_date><![CDATA[2013-10-18 02:46:23]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2013-10-18 00:46:23]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[hibernate4-maven-plugin-1-0-3-released]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="hibernate"><![CDATA[Hibernate]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>785</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[85.181.231.97]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-12-02 17:15:32]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-12-02 15:15:32]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi Augustino,
-
-thanks a lot for your bug-report, first.
-
-If you could provide me with a small example-project, that triggers the error, that would ease and therefore speed up the bugfixing.
-Youd could simply send it as .zip or .tgz to kai@juplo.de, or share it at githupb or something else.
-
-Kind regards
-
-Kai Moritz]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>783</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1385997332.1305179595947265625;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>783</wp:comment_id>
-                       <wp:comment_author><![CDATA[Agustino]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[agustino_alim@yahoo.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[218.186.19.225]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2013-12-02 16:45:49]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2013-12-02 14:45:49]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi,\r
-\r
-When using this plugin, this class package-info is ignored. You need to invoke Configuration.addPackage(packageName).]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1385995549.8418190479278564453125;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1385997010.0317618846893310546875;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>1544</wp:comment_id>
-                       <wp:comment_author><![CDATA[Andreas Kuhtz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[andreas.kuhtz@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[217.115.65.20]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-02-21 18:03:36]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-02-21 16:03:36]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi Kai,\r
-Thank you for this great plugin!\r
-When will the next version be released? We ran into an issue that is fixed on trunk (schema file created in non-existing subdirectory).\r
-Regards,\r
-Andreas]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1393156074.0233459;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1392998616.3407769;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>1315</wp:comment_id>
-                       <wp:comment_author><![CDATA[hdave]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[david.h.vree@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[71.245.233.130]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-01-07 04:56:36]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-01-07 02:56:36]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[I've got your plugin in production now and it works great.  Thanks a ton.  One thing however, it pumps out a lot of text during the maven build.  Our team works hard to cut down on the clutter.  Any chance of getting a "quiet" setting or level?]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1389063396.686624050140380859375;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1389809232.834311962127685546875;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>1558</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[87.144.105.181]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-02-23 13:50:04]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-02-23 11:50:04]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi Andreas,
-
-I am working on the next release. Nearly everything is in place to put it online. The only thing missing is the fact, that I planed to add some test-cases to ensure, that the fixes does not break the known use-cases. I hope I will find some time in the next days, to complete this plan...
-
-Regards,
-Kai]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>1544</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1393156204.81198;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>1409</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[85.181.230.80]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-01-15 20:12:55]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-01-15 18:12:55]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[That is a good idea!\r
-I will include a switch in the next release...\r
-Thanks for the clue.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>1315</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1389809575.09414005279541015625;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Combining jetty-maven-plugin and wro4j-maven-plugin for Dynamic Reloading of LESS-Resources</title>
-               <link>https://juplo.de/combining-jetty-maven-plugin-and-wro4j-maven-plugin-for-dynamic-reloading-of-less-resources/</link>
-               <pubDate>Fri, 06 Dec 2013 10:58:17 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=140</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>Ever searched for a simple configuration, that lets you use your <a href="http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin" title="See the documentation for mor information">jetty-maven-plugin</a> as you are used to, while working with <a href="http://www.lesscss.org/" title="See LESS CSS documentation for mor informations">LESS</a> to simplify your stylesheets?</p>\r
-\r
-<p>You cannot do both, use the <a href="http://www.lesscss.org/#usage" title="More about the client-side usage of LESS">Client-side mode</a> of LESS to ease development and use the <a href="https://github.com/marceloverdijk/lesscss-maven-plugin" title="Homepage of the official LESS CSS maven plugin">lesscss-maven-plugin</a> to automatically compile the LESS-sources into CSS for production. That does not work, because your stylesheets must be linked in different ways if you are switching between the client-side mode - which is best for development - and the pre-compiled mode - which is best for production. For the client-side mode you need something like:</p>\r
-<pre class="prettyprint linenums">\r
-<code class="html">\r
-&lt;link rel="stylesheet/less" type="text/css" href="styles.less" /&gt;\r
-&lt;script src="less.js" type="text/javascript"&gt;&lt;/script&gt;\r
-</code>\r
-</pre>\r
-<p>While, for the pre-compiled mode, you want to link to your stylesheets as usual, with:</p>\r
-<pre class="prettyprint linenums">\r
-<code class="html">\r
-&lt;link rel="stylesheet" type="text/css" href="styles.css" /&gt;\r
-</code>\r
-</pre>\r
-\r
-<p>While looking for a solution to this dilemma, I stumbled accross <a href="https://code.google.com/p/wro4j/" title="See the documentation of ths wounderfull tool">wro4j</a>. Originally intended, to speed up page-delivery by combining and minimizing multiple resources into one through the use of a servlet-filter, this tool also comes with a maven-plugin, that let you do the same offline, while compiling your webapp.</p>\r
-\r
-<p>The idea is, to use the <a href="http://code.google.com/p/wro4j/wiki/MavenPlugin" title="See the documentation of hte wro4j-maven-plugin">wro4j-maven-plugin</a> to compile and combine your LESS-sources into CSS for production and to use the <a href="http://code.google.com/p/wro4j/wiki/Installation" title="See how to configure the filter">wro4j filter</a>, to dynamically deliver the compiled CSS while developing. This way, you do not have to alter your HTML-code, when switching between development and production, because you always link to the CSS-files.</p>\r
-\r
-<p>So, lets get dirty!</p>\r
-\r
-<h2>Step 1: Configure wro4j</h2>\r
-<p>First, we configure <strong>wro4j</strong>, like as we want to use it to speed up our page. The details are explained and linked on wro4j's <a href="http://code.google.com/p/wro4j/wiki/GettingStarted" title="Visit the Getting-Started-Page">Getting-Started-Page</a>. In short, we just need two files: <strong>wro.xml</strong> and <strong>wro.properties</strong>.</p>\r
-<h3>wro.xml</h3>\r
-<p>wro.xml tells wro4j, which resources should be combined and how the result should be named. I am using the following configuration to generate all LESS-Sources beneath <code>base/</code> into one CSS-file called <code>base.css</code>:</p>\r
-<pre class="prettyprint linenums">\r
-<code class="xml">\r
-&lt;groups xmlns="http://www.isdc.ro/wro"&gt;\r
-  &lt;group name="base"&gt;\r
-    &lt;css&gt;/less/base/*.less&lt;/css&gt;\r
-  &lt;/group&gt;\r
-</code>\r
-</pre>\r
-<p>wro4j looks for <code>/less/base/*.less</code> inside the root of the web-context, which is equal to <code>src/main/webapp</code> in a normal maven-project. There are <a href="http://code.google.com/p/wro4j/wiki/ResourceTypes" title="See the resource locator documentation of wro4j for more details">other ways to specifie the resources</a>, which enable you to store them elswhere. But this approach works best for our goal, because the path is understandable for both: the wro4j servlet-filter, we are configuring now for our development-environment, and the wro4j-maven-plugin, that we will configure later for build-time compilation.</p>\r
-\r
-<h3>wro.properties</h3>\r
-<p>wro.properties in short tells wro4j, how or if it should convert the combined sources and how it should behave. I am using the following configuration to tell wro4j, that it should convert <code>*.less</code>-sources into CSS and do that on <em>every request</em>:</p>\r
-<pre class="prettyprint linenums">\r
-<code class="properties">\r
-managerFactoryClassName=ro.isdc.wro.manager.factory.ConfigurableWroManagerFactory\r
-preProcessors=cssUrlRewriting,lessCssImport\r
-postProcessors=less4j\r
-disableCache=true\r
-</code>\r
-</pre>\r
-<p>First of all we specify the <code>ConfigurableWroManagerFactory</code>, because otherwise, wro4j would not pick up our pre- and post-processor-configuration. This is a little bit confusing, because wro4j is already reading the <code>wro.properties</code>-file - otherwise wro4j would never detect the <code>managerFactoryClassName</code>-directive - and you might think: "Why? He is already interpreting our configuration!" But belive me, he is not! You can <a href="http://code.google.com/p/wro4j/wiki/ConfigurableWroManagerFactory" title="Read the full story in wro4j's documentation">read more about that in wro4j's documentation</a>. The <code>disableCache=true</code> is also crucial, because otherwise, we would not see the changes take effect when developing with <strong>jetty-maven-plugin</strong> later on. The pre-processors <code>lessCssImport</code>  and <code>cssUrlRewriting</code> merge together all our LESS-resources under <code>/less/base/*.less</code> and do some URL-rewriting, in case you have specified paths to images, fonts or other resources inside your LESS-code, to reflect that the resulting CSS is found under <code>/css/base.css</code> and not <code>/css/base/YOURFILE.css</code> like the LESS-resources.</p>\r
-\r
-<p>You can do much more with your resources here, for example <a href="https://code.google.com/p/wro4j/wiki/AvailableProcessors" title="See all available processors">minimizing</a>. Also, there are countless <a href="http://code.google.com/p/wro4j/wiki/ConfigurationOptions" title="See all configuration options">configuration options</a> to fine-tune the behaviour of wro4j. But for our goal, we are now only intrested in the compilation of our LESS-sources.</p>\r
-\r
-\r
-<h2>Step 2: Configure the wro4j servlet-filter</h2>\r
-<p>Configuring the filter in the <strong>web.xml</strong> is easy. It is explained in wro4j's <a href="https://code.google.com/p/wro4j/wiki/Installation" title="See the installation instructions for the wro4j servlet-filter">installation-insctuctions</a>. But the trick is, that we do not want to configure that filter for the production-version of our webapp, because we want to compile the resources offline, when the webapp is build. To acchieve this, we can use the <code>&lt;overrideDescriptor&gt;</code>-Parameter of the <a href="http://wiki.eclipse.org/Jetty/Feature/Jetty_Maven_Plugin#Configuring_Your_WebApp" title="Read more about the configuration of the jetty-maven-plugin">jetty-maven-plugin</a>.</p>\r
-<h2>&lt;overrideDescriptor&gt;</h2>\r
-<p>This parameter lets you specify additional configuration options for the web.xml of your webapp. I am using the following configuration for my jetty-maven-plugin:</p>\r
-<pre class="prettyprint linenums">\r
-<code class="xml">\r
-&lt;plugin&gt;\r
-  &lt;groupId&gt;org.eclipse.jetty&lt;/groupId&gt;\r
-  &lt;artifactId&gt;jetty-maven-plugin&lt;/artifactId&gt;\r
-  &lt;configuration&gt;\r
-    &lt;webApp&gt;\r
-      &lt;overrideDescriptor&gt;${project.basedir}/src/test/resources/jetty-web.xml&lt;/overrideDescriptor&gt;\r
-    &lt;/webApp&gt;\r
-  &lt;/configuration&gt;\r
-  &lt;dependencies&gt;\r
-    &lt;dependency&gt;\r
-      &lt;groupId&gt;ro.isdc.wro4j&lt;/groupId&gt;\r
-      &lt;artifactId&gt;wro4j-core&lt;/artifactId&gt;\r
-      &lt;version&gt;${wro4j.version}&lt;/version&gt;\r
-    &lt;/dependency&gt;\r
-    &lt;dependency&gt;\r
-      &lt;groupId&gt;ro.isdc.wro4j&lt;/groupId&gt;\r
-      &lt;artifactId&gt;wro4j-extensions&lt;/artifactId&gt;\r
-      &lt;version&gt;${wro4j.version}&lt;/version&gt;\r
-      &lt;exclusions&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;javax.servlet&lt;/groupId&gt;\r
-          &lt;artifactId&gt;servlet-api&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;org.apache.commons&lt;/groupId&gt;\r
-          &lt;artifactId&gt;commons-lang3&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;commons-io&lt;/groupId&gt;\r
-          &lt;artifactId&gt;commons-io&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;org.springframework&lt;/groupId&gt;\r
-          &lt;artifactId&gt;spring-web&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;com.google.code.gson&lt;/groupId&gt;\r
-          &lt;artifactId&gt;gson&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;com.google.javascript&lt;/groupId&gt;\r
-          &lt;artifactId&gt;closure-compiler&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;com.github.lltyk&lt;/groupId&gt;\r
-          &lt;artifactId&gt;dojo-shrinksafe&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;org.jruby&lt;/groupId&gt;\r
-          &lt;artifactId&gt;jruby-core&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;org.jruby&lt;/groupId&gt;\r
-          &lt;artifactId&gt;jruby-stdlib&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;me.n4u.sass&lt;/groupId&gt;\r
-          &lt;artifactId&gt;sass-gems&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;nz.co.edmi&lt;/groupId&gt;\r
-          &lt;artifactId&gt;bourbon-gem-jar&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;org.codehaus.gmaven.runtime&lt;/groupId&gt;\r
-          &lt;artifactId&gt;gmaven-runtime-1.7&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;org.webjars&lt;/groupId&gt;\r
-          &lt;artifactId&gt;jshint&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;org.webjars&lt;/groupId&gt;\r
-          &lt;artifactId&gt;emberjs&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;org.webjars&lt;/groupId&gt;\r
-          &lt;artifactId&gt;handlebars&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;org.webjars&lt;/groupId&gt;\r
-          &lt;artifactId&gt;coffee-script&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;org.webjars&lt;/groupId&gt;\r
-          &lt;artifactId&gt;jslint&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;org.webjars&lt;/groupId&gt;\r
-          &lt;artifactId&gt;json2&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-        &lt;exclusion&gt;\r
-          &lt;groupId&gt;org.webjars&lt;/groupId&gt;\r
-          &lt;artifactId&gt;jquery&lt;/artifactId&gt;\r
-        &lt;/exclusion&gt;\r
-      &lt;/exclusions&gt;\r
-    &lt;/dependency&gt;\r
-  &lt;/dependencies&gt;\r
-&lt;/plugin&gt;</code>\r
-</pre>\r
-<p>The dependencies to <strong>wro4j-core</strong> and <strong>wro4j-extensions</strong> are needed by jetty, to be able to enable the filter defined below. Unfortunatly, one of the transitive dependencies of <code>wro4j-extensions</code> triggers an uggly error when running the jetty-maven-plugin. Therefore, all unneeded dependencies of <code>wro4j-extensions</code> are excluded, as a workaround for this error/bug.</p>\r
-\r
-<h2>jetty-web.xml</h2>\r
-<p>And my jetty-web.xml looks like this:</p>\r
-<pre class="prettyprint linenums">\r
-<code class="xml">\r
-&lt;?xml version="1.0" encoding="UTF-8"?&gt;\r
-&lt;web-app xmlns="http://java.sun.com/xml/ns/javaee"\r
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"\r
-  version="2.5"&gt;\r
-  &lt;filter&gt;\r
-    &lt;filter-name&gt;wro&lt;/filter-name&gt;\r
-    &lt;filter-class&gt;ro.isdc.wro.http.WroFilter&lt;/filter-class&gt;\r
-  &lt;/filter&gt;\r
-  &lt;filter-mapping&gt;\r
-    &lt;filter-name&gt;wro&lt;/filter-name&gt;\r
-    &lt;url-pattern&gt;*.css&lt;/url-pattern&gt;\r
-  &lt;/filter-mapping&gt;\r
-&lt;/web-app&gt;\r
-</code>\r
-</pre>\r
-<p>The filter processes any URI's that end with <code>.css</code>. This way, the wro4j servlet-filter makes <code>base.css</code> available under any path, because for exampl <code>/base.css</code>, <code>/css/base.css</code> and <code>/foo/bar/base.css</code> all end with <code>.css</code>.</p>\r
-\r
-<p>This is all, that is needed to develop with dynamically reloadable compiled LESS-resources. Just fire up your browser and browse to <code>/what/you/like/base.css</code>. (But do not forget to put some LESS-files in <code>src/main/webapp/less/base/</code> first!)</p>\r
-\r
-\r
-<h2>Step 3: Install wro4j-maven-plugin</h2>\r
-<p>All that is left over to configure now, is the build-process. If you would build and deploy your webapp now, the CSS-file <code>base.css</code> would not be generated and the link to your stylesheet, that already works in our jetty-maven-plugin environment would point to a 404. Hence, we need to set up the <strong>wro4j-maven-plugin</strong>. I am using this configuration:</p>\r
-<pre class="prettyprint linenums">\r
-<code class="xml">\r
-&lt;plugin&gt;\r
-  &lt;groupId&gt;ro.isdc.wro4j&lt;/groupId&gt;\r
-  &lt;artifactId&gt;wro4j-maven-plugin&lt;/artifactId&gt;\r
-  &lt;version&gt;${wro4j.version}&lt;/version&gt;\r
-  &lt;configuration&gt;\r
-    &lt;wroManagerFactory&gt;ro.isdc.wro.maven.plugin.manager.factory.ConfigurableWroManagerFactory&lt;/wroManagerFactory&gt;\r
-    &lt;cssDestinationFolder&gt;${project.build.directory}/${project.build.finalName}/css/&lt;/cssDestinationFolder&gt;\r
-  &lt;/configuration&gt;\r
-  &lt;executions&gt;\r
-    &lt;execution&gt;\r
-      &lt;phase&gt;prepare-package&lt;/phase&gt;\r
-      &lt;goals&gt;\r
-        &lt;goal&gt;run&lt;/goal&gt;\r
-      &lt;/goals&gt;\r
-    &lt;/execution&gt;\r
-  &lt;/executions&gt;\r
-&lt;/plugin&gt;\r
-</code>\r
-</pre>\r
-<p>I connected the <code>run</code>-goal with the <code>package</code>-phase, because the statically compiled CSS-file is needed only in the final war. The <code>ConfigurableWroManagerFactory</code> tells wro4j, that it should look up further configuration options in our <code>wro.properties</code>-file, where we tell wro4j, that it should compile our LESS-resources. The <code>&lt;cssDestinationFolder&gt;</code>-tag tells wro4j, where it should put the generated CSS-file. You can adjust that to suite your needs.</p>\r
-\r
-<p>That's it: now the same CSS-file, which is created on the fly by the wro4j servlet-filter when using <code>mvn jetty:run</code> and, thus, enables dynamic reloading of our LESS-resources, is generated during the build-process by the wro4j-maven-plugin.</p>\r
-\r
-<h2>Cleanup and further considerations</h2>\r
-<h3>lesscss-maven-plugin</h3>\r
-<p>If you already compile your LESS-resources with the lesscss-maven-plugin, you can stick with it and skip step 3. But I strongly recommend giving wro4j-maven-plugin a try, because it is a much more powerfull tool, that can speed up your final webapp even more.</p>\r
-\r
-<h3>Clean up your mess </h3>\r
-<p>With a configuration like the above one, your LESS-resources and wro4j-configuration-files will be packed into your production-war. That might be confusing later, because neither wro4j nor LESS is used in the final war. You can add the following to your <code>pom.xml</code> to exclude these files from your war for the sake of clarity:</p>\r
-<pre class="prettyprint linenums">\r
-<code class="xml">\r
-&lt;plugin&gt;\r
-  &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;\r
-  &lt;configuration&gt;\r
-    &lt;warSourceExcludes&gt;\r
-      WEB-INF/wro.*,\r
-      less/**\r
-    &lt;/warSourceExcludes&gt;\r
-  &lt;/configuration&gt;\r
-&lt;/plugin&gt;\r
-</code>\r
-</pre>\r
-\r
-<h3>What's next?</h3>\r
-<p>We only scrached the surface, of what can be done with wro4j. Based on this configuration, you can easily enable additional features to fine-tune your final build for maximum speed. You really should take a look at the <a href="https://code.google.com/p/wro4j/wiki/AvailableProcessors" title="Available Processors">list of available Processors</a>!</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>140</wp:post_id>
-               <wp:post_date><![CDATA[2013-12-06 12:58:17]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2013-12-06 10:58:17]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[combining-jetty-maven-plugin-and-wro4j-maven-plugin-for-dynamic-reloading-of-less-resources]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="jetty"><![CDATA[Jetty]]></category>
-               <category domain="category" nicename="less"><![CDATA[less]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <category domain="category" nicename="wro4j"><![CDATA[wro4j]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Rooting the hama 00054807 Internet TV Stick with the help of factory_update_param.aml</title>
-               <link>https://juplo.de/rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml/</link>
-               <pubDate>Sun, 16 Feb 2014 23:26:24 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=186</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>No Play Store - No Fun</h2>\r
-<p>Recently, I bought myself the <a href="https://de.hama.com/00054807/hama-internet-tv-stick_eng" title="Visit the product page">Hama 00054807 Internet TV Stick</a>. This stick is a low-budget option, to pimp your TV, if it has a HDMI-port, but no built in smart-tv functionality (or a crapy one). You just plug in the stick and connect its dc-port to a USB-port of the TV (or the included adapter) and there you go.</p>\r
-\r
-<p>But one big drawback of the <code>Hama 00054807</code> is, that there are nearly no usefull apps preinstalled and Google forbidds Hama to install the original<a href="https://play.google.com/store?hl=en" title="Visit Google Play">Google Play Store</a> on the device. Hence, you are locked out of any easy access to all the apps, that constitute the usability of android.</p>\r
-\r
-<p>Because of that, I decided to <a href="http://en.wikipedia.org/wiki/Rooting_%28Android_OS%29" title="Learn mor about rooting android devices">root</a> my <code>Hama00054807</code> as a first step on the way to fully utilize this neat little toy of mine.</p>\r
-\r
-<p>I began with opening the device and found the device-ID <code>B.AML8726.6B 12122</code>. But there seems to be <a href="https://www.google.de/search?q=root+B.AML8726.6B" title="Google for it">no one else, who ever tried it</a>. But as it turned out, it is fairly easy, because stock recovery is not locked and so you can just install everything you want.</p>\r
-\r
-<h2>Boot Into Recovery</h2>\r
-[caption id="attachment_193" align="left" width="300"]<a href="http://juplo.de/wp-uploads/2014/02/hama_00054807_stock_recovery.jpg"><img src="http://juplo.de/wp-uploads/2014/02/hama_00054807_stock_recovery-300x199.jpg" alt="stock recovery screenshot" width="300" height="199" class="size-medium wp-image-193" /></a> Screenshot of the stock recovery installed on the Hama 00054807 Intetnet TV Stick[/caption]\r
-\r
-<p>I found out, that you can boot into recovery, by pressing the reset-button, while the stick is booting. You can reach the reset-button without the need to open the case through a little hole in the back of the device. Just hold the button pressed, until recovery shows up (see screenshot).</p>\r
-\r
-<p>Unfortunatly, the keyboard does not work, while you are in recovery-mode. So at first glance, you can do nothing, expect looking at the nice picture of the android-bot being repaired.</p>\r
-\r
-<h2>Installing Updates Without Keyboard-Interaction</h2>\r
-<p>But I found out, that you can control stock recovery with the help of a file called <code>factory_update_param.aml</code>, which is read from the external sd-card and interpreted by stock recovery on startup. Just create a text-file with the following content (I think it should use <a href="http://en.wikipedia.org/wiki/Newline#Representations" title="Learn more about line endings">unix stle newlines, aka LF</a>):</p>\r
-<pre class="prettyprint linenums">\r
-<code class="html">\r
---update_package=/sdcard/update.zip\r
-</code>\r
-</pre>\r
-<p>Place this file on the sd-card and name it <code>factory_update_param.aml</code>. Now you can place any suitable correctly signed android-update on the sd-card and rename it to <code>update.zip</code> and stock recovery will install it upon boot, if you boot into recovery with the sd-card inserted.</p>\r
-\r
-<p>If you want to wipe all data as well and factory reset your device, you can extend <code>factory_update_param.aml</code> like this:</p>\r
-<pre class="prettyprint linenums">\r
-<code class="html">\r
---update_package=/sdcard/update.zip\r
---wipe_data\r
---wipe_cache\r
---wipe_media</code>\r
-</pre>\r
-<p>But be carefull to remove these extra-lines later, because they are executed <em>every time</em> you boot into recovery with the sd-card inserted! You have been warned :)</p>\r
-\r
-<h2>Let's root</h2>\r
-<p>So, actually rooting the device is fairly easy now. You just have to download any correclty signed <a href="http://androidsu.com/superuser/" title="Visit superuser home">Superuser</a>-Update. For example this one from the <a href="http://androidsu.com/superuser/" title="Visit superuser home">superuser homepage</a>: <a href="http://downloads.noshufou.netdna-cdn.com/superuser/Superuser-3.1.3-arm-signed.zip" title="Download Superuser-3.1.3-arm-signed.zip">Superuser-3.1.3-arm-signed.zip</a>. Then, put it on the sd-card, rename it to <code>update.zip</code>, boot into recovery with the sd-card inserted and that's it, you'r root!</p>\r
-\r
-<p>If you reboot your device, you should now find the superuser-app among your apps. To verify, that everything went right, you could install any app that requires root-privileges. If the app requests root-privileges, you should see a dialog from the superuser-app, that asks you if the privileges should be granted, or not. For example, you can install a <a href="https://play.google.com/store/apps/details?id=jackpal.androidterm&hl=en" title="For example this one">terminal-app</a> and type <code>su</code> and hit return to request root-privileges.</p>\r
-\r
-<h2>What's next...</h2>\r
-<p>So now your device is rooted and you are prepared to install custom updates on it. But still the Google Play Store is missing. I hope I will find some time to accomplish that, too. Stay tuned!</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>186</wp:post_id>
-               <wp:post_date><![CDATA[2014-02-17 01:26:24]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-02-16 23:26:24]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[rooting-the-hama-00054807-internet-tv-stick-with-the-help-of-factory_update_param-aml]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="android"><![CDATA[Android]]></category>
-               <category domain="category" nicename="hacking"><![CDATA[Hacking]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>2842</wp:comment_id>
-                       <wp:comment_author><![CDATA[xjoshyx92]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[joshua-schneider@freenet.de]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[79.251.181.251]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-05-01 23:52:42]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-05-01 21:52:42]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Nice work. But for me it is not working in the recovery it says everything went fine but after reboot nothing changed there is no super user and no root. Also tried to install gapps but the same here. Did you make a wipe bevore or after install or some other special kind of stuff?]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1398981162.7854021;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1399031880.319504;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>4092</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[92.228.252.85]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-06-17 10:26:07]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-06-17 08:26:07]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[I did not remember to make a wipe.
-As far as I can say, I wrote down every little step, I have taken.
-But, I never really used my TV-stick, before I rooted it.
-So, it might help you, to do a complete wipe and factory reset!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>2842</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1402993567.2418389;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>14982</wp:comment_id>
-                       <wp:comment_author><![CDATA[Luca Tavecchio]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[tavecchio.luca@tiscali.it]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[79.14.1.77]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-10-10 14:44:44]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-10-10 12:44:44]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi, i came here looking for a solution with the same id device (B.AML8726.6B 12122.), mine is a branded in a different way (also the form factor, but that is just plastic) and come with google play store.. anyway i'm curious about the general wifi performance on your device? mine is quite poor yours? it was poor and you were maybe able to fix it in some way??]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1412945084.2914009;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1414527875.482244;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>17089</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[85.181.233.38]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-10-28 22:41:58]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-10-28 20:41:58]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[I am sorry, but up until now, I did not do a lot more with the stick, than just hack it.
-I am too busy with other stuff...]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>14982</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1414528919.0422151;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>43147</wp:comment_id>
-                       <wp:comment_author><![CDATA[Hama Internet TV Stick 00054807 19,95 Euro - Android-Hilfe.de]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://www.android-hilfe.de/android-mini-pc-usb-hdmi-sticks-allgemein/674603-hama-internet-tv-stick-00054807-19-95-euro.html#post8838217</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-04-22 22:02:37]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-04-22 20:02:37]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[[&#8230;]  [&#8230;]]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[pingback]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1430653562.119962;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>33290</wp:comment_id>
-                       <wp:comment_author><![CDATA[Richard]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[rha@onlinehome.de]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-12-26 11:05:39]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-12-26 09:05:39]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hello,\r
-I tried to update the old android version with android 4.2.1 and 4.2.2 using  c5ea6e959840.update_mysidspr_FH05_to_GA02.zip or  eaef14432ff5.signed-mantaray-JDQ39-from-JOP40D.eaef1443 (1).zip, but had errors like:\r
-E: Badbootloader arguments "(null)"\r
-....\r
-....\r
-....\r
-E: Signature verification failed\r
-Installation aborted.\r
-\r
-What did I make wrong?\r
-(Can I also write to this blog in German?)\r
-\r
-xmas-greetings from Ric]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1430653531.330632;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1419584739.843827;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Configure HTTPS for jetty-maven-plugin 9.0.x</title>
-               <link>https://juplo.de/configure-https-for-jetty-maven-plugin-9-0-x/</link>
-               <pubDate>Sun, 23 Feb 2014 10:52:23 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=209</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>For the impatient</h2>\r
-<p>If you do not want to know why it does not work and how I fixed it, just <a href="#quick-fix">jump to the quick fix</a>!</p>\r
-<h2>jetty-maven-plugin 9.0.x breaks the HTTPS-Connector</h2>\r
-<p>With Jetty 9.0.x the configuration of the <code>jetty-maven-plugin</code> (formaly known as <code>maven-jetty-plugin</code>) has changed dramatically. Since then, it is no more possible to configure a HTTPS-Connector in the plugin easily. Normally, connecting your development-container via HTTPS was not often necessary. But since <a title="Read more about Edward Snowden" href="http://en.wikipedia.org/wiki/Edward_Snowden">Snowden</a>, encryption is on everybodys mind. And so, testing the encrypted part of your webapp becomes more and more important.</p>\r
-<h2>Why it is "broken" in <code>jetty-maven-plugin</code> 9.0.x</h2>\r
-<p><cite><a title="Read the bug-report" href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=408962">A bug-report</a></cite> stats, that\r
-<q>\r
-Since the constructor signature changed for Connectors in jetty-9 to require the Server instance to be passed into it, it is no longer possible to configure Connectors directly with the plugin (because maven requires no-arg constructor for any &lt;configuration&gt; elements).\r
-</q></p>\r
-<p><a title="Jump to the documentation of the jetty-maven-plugin" href="http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html">The documentation</a> includes an example, <a title="Jump to the example in the documentation of the jetty-maven-plugin" href="http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html#maven-config-https">how to configure a HTTPS Connector with the help of a <code>jetty.xml</code>-file</a>. But unfortunatly, this example is broken. Jetty refuses to start with the following error: <code>[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.0.5.v20130815:run (default-cli) on project FOOBAR: Failure: Unknown configuration type: New in org.eclipse.jetty.xml.XmlConfiguration@4809f93a -&gt; [Help 1]</code>.</p>\r
-<h2>Get HTTPS running again</h2>\r
-<p>So, here is, what you have to do to fix this <a title="Jump to the example in the documentation of the jetty-maven-plugin" href="http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html#maven-config-https">broken example</a>: the content shown for the file <code>jetty.xml</code> in the example is wrong. It has to look like the other example-files. That is, ith has to start with a <code>&lt;Configure&gt;</code>-tag. The corrected content of the file looks like this:</p>\r
-<pre class="prettyprint linenums" id="jetty-xml"><code class="html">\r
-&lt;?xml version="1.0"?&gt;\r
-&lt;!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"&gt;\r
-\r
-&lt;!-- ============================================================= --&gt;\r
-&lt;!-- Configure the Http Configuration                              --&gt;\r
-&lt;!-- ============================================================= --&gt;\r
-&lt;Configure id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration"&gt;\r
-  &lt;Set name="secureScheme"&gt;https&lt;/Set&gt;\r
-  &lt;Set name="securePort"&gt;&lt;Property name="jetty.secure.port" default="8443" /&gt;&lt;/Set&gt;\r
-  &lt;Set name="outputBufferSize"&gt;32768&lt;/Set&gt;\r
-  &lt;Set name="requestHeaderSize"&gt;8192&lt;/Set&gt;\r
-  &lt;Set name="responseHeaderSize"&gt;8192&lt;/Set&gt;\r
-  &lt;Set name="sendServerVersion"&gt;true&lt;/Set&gt;\r
-  &lt;Set name="sendDateHeader"&gt;false&lt;/Set&gt;\r
-  &lt;Set name="headerCacheSize"&gt;512&lt;/Set&gt;\r
-\r
-  &lt;!-- Uncomment to enable handling of X-Forwarded- style headers\r
-  &lt;Call name="addCustomizer"&gt;\r
-    &lt;Arg&gt;&lt;New class="org.eclipse.jetty.server.ForwardedRequestCustomizer"/&gt;&lt;/Arg&gt;\r
-  &lt;/Call&gt;\r
-  --&gt;\r
-&lt;/Configure&gt;\r
-</code></pre>\r
-<h2>But it's not running!</h2>\r
-<p>If you are getting the error <code>[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.0.5.v20130815:run (default-cli) on project FOOBAR: Failure: etc/jetty.keystore (file or directory not found) -&gt; [Help 1]</code> now, this is because you have to create/get a certificate for your HTTPS-Connector. For development, a selfsigned certificate is sufficient. You can easily create one like back in the <a title="Example for configuring the HTTPS-Connector of the old maven-jetty-plugin" href="http://mrhaki.blogspot.de/2009/05/configure-maven-jetty-plugin-for-ssl.html">good old <code>maven-jetty-plugin</code>-times</a>, with this command: <code id="keytool">keytool -genkey -alias jetty -keyalg RSA -keystore src/test/resources/jetty.keystore -storepass secret -keypass secret -dname "CN=localhost"</code>. Just be sure, to change the example file <code>jetty-ssl.xml</code>, to reflect the path to your new keystore file and password. Your <code>jetty-ssl.xml</code> should look like:</p>\r
-<pre class="prettyprint linenums" id="jetty-ssl-xml"><code class="html">\r
-&lt;?xml version="1.0"?&gt;\r
-&lt;!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"&gt;\r
-\r
-&lt;!-- ============================================================= --&gt;\r
-&lt;!-- Configure a TLS (SSL) Context Factory                         --&gt;\r
-&lt;!-- This configuration must be used in conjunction with jetty.xml --&gt;\r
-&lt;!-- and either jetty-https.xml or jetty-spdy.xml (but not both)   --&gt;\r
-&lt;!-- ============================================================= --&gt;\r
-&lt;Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory"&gt;\r
-  &lt;Set name="KeyStorePath"&gt;&lt;Property name="jetty.base" default="." /&gt;/&lt;Property name="jetty.keystore" default="src/test/resources/jetty.keystore"/&gt;&lt;/Set&gt;\r
-  &lt;Set name="KeyStorePassword"&gt;&lt;Property name="jetty.keystore.password" default="secret"/&gt;&lt;/Set&gt;\r
-  &lt;Set name="KeyManagerPassword"&gt;&lt;Property name="jetty.keymanager.password" default="secret"/&gt;&lt;/Set&gt;\r
-  &lt;Set name="TrustStorePath"&gt;&lt;Property name="jetty.base" default="." /&gt;/&lt;Property name="jetty.truststore" default="src/test/resources/jetty.keystore"/&gt;&lt;/Set&gt;\r
-  &lt;Set name="TrustStorePassword"&gt;&lt;Property name="jetty.truststore.password" default="secret"/&gt;&lt;/Set&gt;\r
-  &lt;Set name="EndpointIdentificationAlgorithm"&gt;&lt;/Set&gt;\r
-  &lt;Set name="ExcludeCipherSuites"&gt;\r
-    &lt;Array type="String"&gt;\r
-      &lt;Item&gt;SSL_RSA_WITH_DES_CBC_SHA&lt;/Item&gt;\r
-      &lt;Item&gt;SSL_DHE_RSA_WITH_DES_CBC_SHA&lt;/Item&gt;\r
-      &lt;Item&gt;SSL_DHE_DSS_WITH_DES_CBC_SHA&lt;/Item&gt;\r
-      &lt;Item&gt;SSL_RSA_EXPORT_WITH_RC4_40_MD5&lt;/Item&gt;\r
-      &lt;Item&gt;SSL_RSA_EXPORT_WITH_DES40_CBC_SHA&lt;/Item&gt;\r
-      &lt;Item&gt;SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA&lt;/Item&gt;\r
-      &lt;Item&gt;SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA&lt;/Item&gt;\r
-    &lt;/Array&gt;\r
-  &lt;/Set&gt;\r
-\r
-  &lt;!-- =========================================================== --&gt;\r
-  &lt;!-- Create a TLS specific HttpConfiguration based on the        --&gt;\r
-  &lt;!-- common HttpConfiguration defined in jetty.xml               --&gt;\r
-  &lt;!-- Add a SecureRequestCustomizer to extract certificate and    --&gt;\r
-  &lt;!-- session information                                         --&gt;\r
-  &lt;!-- =========================================================== --&gt;\r
-  &lt;New id="sslHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration"&gt;\r
-    &lt;Arg&gt;&lt;Ref refid="httpConfig"/&gt;&lt;/Arg&gt;\r
-    &lt;Call name="addCustomizer"&gt;\r
-      &lt;Arg&gt;&lt;New class="org.eclipse.jetty.server.SecureRequestCustomizer"/&gt;&lt;/Arg&gt;\r
-    &lt;/Call&gt;\r
-  &lt;/New&gt;\r
-\r
-&lt;/Configure&gt;\r
-</code></pre>\r
-<h2>But it's still not running!</h2>\r
-<p>Unless you are running <code>mvn jetty:run</code> as <code>root</code>, you should see another error now: <code>[ERROR] Failed to execute goal org.eclipse.jetty:jetty-maven-plugin:9.0.5.v20130815:run (default-cli) on project FOOBAR: Failure: Permission denied -&gt; [Help 1]</code>. This is, because the ports are set to the numbers <code>80</code> and <code>443</code> of the privileged port-range.</p>\r
-\r
-<p>You have to change <code>jetty-http.xml</code> like this:</p>\r
-<pre class="prettyprint linenums" id="jetty-http-xml"><code class="html">\r
-&lt;?xml version="1.0"?&gt;\r
-&lt;!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"&gt;\r
-\r
-&lt;!-- ============================================================= --&gt;\r
-&lt;!-- Configure the Jetty Server instance with an ID "Server"       --&gt;\r
-&lt;!-- by adding a HTTP connector.                                   --&gt;\r
-&lt;!-- This configuration must be used in conjunction with jetty.xml --&gt;\r
-&lt;!-- ============================================================= --&gt;\r
-&lt;Configure id="Server" class="org.eclipse.jetty.server.Server"&gt;\r
-\r
-  &lt;!-- =========================================================== --&gt;\r
-  &lt;!-- Add a HTTP Connector.                                       --&gt;\r
-  &lt;!-- Configure an o.e.j.server.ServerConnector with a single     --&gt;\r
-  &lt;!-- HttpConnectionFactory instance using the common httpConfig  --&gt;\r
-  &lt;!-- instance defined in jetty.xml                               --&gt;\r
-  &lt;!--                                                             --&gt;\r
-  &lt;!-- Consult the javadoc of o.e.j.server.ServerConnector and     --&gt;\r
-  &lt;!-- o.e.j.server.HttpConnectionFactory for all configuration    --&gt;\r
-  &lt;!-- that may be set here.                                       --&gt;\r
-  &lt;!-- =========================================================== --&gt;\r
-  &lt;Call name="addConnector"&gt;\r
-    &lt;Arg&gt;\r
-      &lt;New class="org.eclipse.jetty.server.ServerConnector"&gt;\r
-        &lt;Arg name="server"&gt;&lt;Ref refid="Server" /&gt;&lt;/Arg&gt;\r
-        &lt;Arg name="factories"&gt;\r
-          &lt;Array type="org.eclipse.jetty.server.ConnectionFactory"&gt;\r
-            &lt;Item&gt;\r
-              &lt;New class="org.eclipse.jetty.server.HttpConnectionFactory"&gt;\r
-                &lt;Arg name="config"&gt;&lt;Ref refid="httpConfig" /&gt;&lt;/Arg&gt;\r
-              &lt;/New&gt;\r
-            &lt;/Item&gt;\r
-          &lt;/Array&gt;\r
-        &lt;/Arg&gt;\r
-        &lt;Set name="host"&gt;&lt;Property name="jetty.host" /&gt;&lt;/Set&gt;\r
-        &lt;Set name="port"&gt;&lt;Property name="jetty.port" default="8080" /&gt;&lt;/Set&gt;\r
-        &lt;Set name="idleTimeout"&gt;&lt;Property name="http.timeout" default="30000"/&gt;&lt;/Set&gt;\r
-      &lt;/New&gt;\r
-    &lt;/Arg&gt;\r
-  &lt;/Call&gt;\r
-\r
-&lt;/Configure&gt;\r
-</code></pre>\r
-<p>... and <code>jetty-https.xml</code> like this:</p>\r
-<pre class="prettyprint linenums" id="jetty-https-xml"><code class="html">\r
-&lt;?xml version="1.0"?&gt;\r
-&lt;!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd"&gt;\r
-\r
-&lt;!-- ============================================================= --&gt;\r
-&lt;!-- Configure a HTTPS connector.                                  --&gt;\r
-&lt;!-- This configuration must be used in conjunction with jetty.xml --&gt;\r
-&lt;!-- and jetty-ssl.xml.                                            --&gt;\r
-&lt;!-- ============================================================= --&gt;\r
-&lt;Configure id="Server" class="org.eclipse.jetty.server.Server"&gt;\r
-\r
-  &lt;!-- =========================================================== --&gt;\r
-  &lt;!-- Add a HTTPS Connector.                                      --&gt;\r
-  &lt;!-- Configure an o.e.j.server.ServerConnector with connection   --&gt;\r
-  &lt;!-- factories for TLS (aka SSL) and HTTP to provide HTTPS.      --&gt;\r
-  &lt;!-- All accepted TLS connections are wired to a HTTP connection.--&gt;\r
-  &lt;!--                                                             --&gt;\r
-  &lt;!-- Consult the javadoc of o.e.j.server.ServerConnector,        --&gt;\r
-  &lt;!-- o.e.j.server.SslConnectionFactory and                       --&gt;\r
-  &lt;!-- o.e.j.server.HttpConnectionFactory for all configuration    --&gt;\r
-  &lt;!-- that may be set here.                                       --&gt;\r
-  &lt;!-- =========================================================== --&gt;\r
-  &lt;Call id="httpsConnector" name="addConnector"&gt;\r
-    &lt;Arg&gt;\r
-      &lt;New class="org.eclipse.jetty.server.ServerConnector"&gt;\r
-        &lt;Arg name="server"&gt;&lt;Ref refid="Server" /&gt;&lt;/Arg&gt;\r
-          &lt;Arg name="factories"&gt;\r
-            &lt;Array type="org.eclipse.jetty.server.ConnectionFactory"&gt;\r
-              &lt;Item&gt;\r
-                &lt;New class="org.eclipse.jetty.server.SslConnectionFactory"&gt;\r
-                  &lt;Arg name="next"&gt;http/1.1&lt;/Arg&gt;\r
-                  &lt;Arg name="sslContextFactory"&gt;&lt;Ref refid="sslContextFactory"/&gt;&lt;/Arg&gt;\r
-                &lt;/New&gt;\r
-              &lt;/Item&gt;\r
-              &lt;Item&gt;\r
-                &lt;New class="org.eclipse.jetty.server.HttpConnectionFactory"&gt;\r
-                  &lt;Arg name="config"&gt;&lt;Ref refid="sslHttpConfig"/&gt;&lt;/Arg&gt;\r
-                &lt;/New&gt;\r
-              &lt;/Item&gt;\r
-            &lt;/Array&gt;\r
-          &lt;/Arg&gt;\r
-          &lt;Set name="host"&gt;&lt;Property name="jetty.host" /&gt;&lt;/Set&gt;\r
-          &lt;Set name="port"&gt;&lt;Property name="https.port" default="8443" /&gt;&lt;/Set&gt;\r
-          &lt;Set name="idleTimeout"&gt;&lt;Property name="https.timeout" default="30000"/&gt;&lt;/Set&gt;\r
-        &lt;/New&gt;\r
-    &lt;/Arg&gt;\r
-  &lt;/Call&gt;\r
-&lt;/Configure&gt;\r
-</code></pre>\r
-<p>Now, it should be running, <em>but...</em></p>\r
-<h2>That is all much to complex. I just want a quick fix to get it running!</h2>\r
-<p>So, now it is working. But you still have to clutter your project with several files and avoid some pitfalls (belive me or not: if you put the filenames in the <code>&lt;jettyXml&gt;</code>-tag of your <code>pom.xml</code> on separate lines, jetty won't start!). Last but not least, the HTTP-Connector will stop working, if you forget to add the <code>jetty-http.xml</code>, that is mentioned at the end of the example.</p>\r
-\r
-<p>Because of that, I've created a simple 6-step quick-fix-guide to get the HTTPS-Connector of the <code>jetty-maven-plugin</code> running.</p>\r
-<h2 id="quick-fix">Quick Fix</h2>\r
-<ol>\r
-       <li>Download <a href="http://juplo.de/wp-uploads/2014/02/jetty.xml">jetty.xml</a> or copy it <a href="#jetty-xml">from above</a> and place it in <code>src/test/resources/jetty.xml</code></li>\r
-       <li>Download <a href="http://juplo.de/wp-uploads/2014/02/jetty-http.xml">jetty-http.xml</a> or copy it <a href="#jetty-http-xml">from above</a> and place it in <code>src/test/resources/jetty-http.xml</code></li>\r
-       <li>Download <a href="http://juplo.de/wp-uploads/2014/02/jetty-ssl.xml">jetty-ssl.xml</a> or copy it <a href="#jetty-ssl-xml">from above</a> and place it in <code>src/test/resources/jetty-ssl.xml</code></li>\r
-       <li>Download <a href="http://juplo.de/wp-uploads/2014/02/jetty-https.xml">jetty-https.xml</a> or copy it <a href="#jetty-https-xml">from above</a> and place it in <code>src/test/resources/jetty-https.xml</code></li>\r
-       <li>Download <a href="http://juplo.de/wp-uploads/2014/02/jetty.keystore">jetty.keystore</a> or generate it with the command <a href="#keytool">keytool-command from above</a> and place it in <code>src/test/resources/jetty.keystore</code></li>\r
-       <li>Update the configuration of the <code>jetty-maven-plugin</code> in your <code>pom.xml</code> to include the XML-configurationfiles. But be aware, the ordering of the files is important and there should be no newlines inbetween. You have been warned! It should look like:\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;plugin&gt;\r
-  &lt;groupId&gt;org.eclipse.jetty&lt;/groupId&gt;\r
-  &lt;artifactId&gt;jetty-maven-plugin&lt;/artifactId&gt;\r
-  &lt;configuration&gt;\r
-    &lt;jettyXml&gt;\r
-      ${project.basedir}/src/test/resources/jetty.xml,${project.basedir}/src/test/resources/jetty-http.xml,${project.basedir}/src/test/resources/jetty-ssl.xml,${project.basedir}/src/test/resources/jetty-https.xml\r
-    &lt;/jettyXml&gt;\r
-  &lt;/configuration&gt;\r
-&lt;/plugin&gt;\r
-  </code></pre>\r
-</li>\r
-</ol>\r
-<p>That's it. You should be done!</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>209</wp:post_id>
-               <wp:post_date><![CDATA[2014-02-23 12:52:23]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-02-23 10:52:23]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[configure-https-for-jetty-maven-plugin-9-0-x]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="jetty"><![CDATA[Jetty]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>4454</wp:comment_id>
-                       <wp:comment_author><![CDATA[Eric]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[eric@hotmail.no]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[213.187.190.50]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-07-04 13:01:27]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-07-04 11:01:27]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thanks for this! Perfect for devs trawling the net for a quick and easy solution to make https work for maven-jetty-plugin 9.x. Used this for 9.1.5.x and worked fine!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1404471687.9980321;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1405771342.571753;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>52409</wp:comment_id>
-                       <wp:comment_author><![CDATA[Goncalo Bv]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[goncalo.bv@hotmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-10-27 13:24:13]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-10-27 11:24:13]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Great post! Works as a charm.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1445945053.4411521;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1445955756.5097909;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>43011</wp:comment_id>
-                       <wp:comment_author><![CDATA[Matteo]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[sgalahad@tiscal.it]]></wp:comment_author_email>
-                       <wp:comment_author_url>https://twitter.com/matteopelucco</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-04-21 16:33:48]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-04-21 14:33:48]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[So useful.. many thanks!\r
-Perfectly running with Jetty Maven Plugin 9.2.9.v20150224\r
-\r
-Matteo]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1429626828.2339921;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1430653543.23611;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>54943</wp:comment_id>
-                       <wp:comment_author><![CDATA[Simon]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[simonwck@yahoo.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2017-10-05 00:12:12]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2017-10-04 22:12:12]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thank you for the very helpful instructions. I am getting close but seeing "Failure: no valid keystore" error for 9.3.3. Any ideas or suggestions?]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1507155132.4982431;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1526597950.801882;s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>20731</wp:comment_id>
-                       <wp:comment_author><![CDATA[romu]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[romu31@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-11-12 23:58:47]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-11-12 21:58:47]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[life saver , thanks alot]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1415829527.2871151;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1430653522.886322;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>47820</wp:comment_id>
-                       <wp:comment_author><![CDATA[Mark]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[bigtrashcaninthesky@yahoo.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-07-23 19:30:18]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-07-23 17:30:18]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[<strong>Awesome job! Just download the files, copy three lines and presto, instant SSL without having to bash your head against the wall.\r
-\r
-One question. Why do the files have to be in src/test and not src/main? I actually first put them in src/main and changed the jetty-ssl.xml file to have src/main as the default for the KeyStorePath and TrustStorePath properties.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1439219076.8741789;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1437672618.53965;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>49624</wp:comment_id>
-                       <wp:comment_author><![CDATA[Jayadev]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[jayadevpr@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://vedayaj.cm</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-09-04 08:45:52]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-09-04 06:45:52]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Awesome Post. Followed the steps and could easily configure the Jetty with SSL. Thanks a lot :)]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1441349152.3080151;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1441358200.536515;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>52527</wp:comment_id>
-                       <wp:comment_author><![CDATA[Felipe]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[fzuleta@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-11-15 17:50:14]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-11-15 15:50:14]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi, this is awesome, I think the article needs updating, on jetty (9.3.5.v20151012) I had to place your jetty-ssl.xml in a jetty-ssl-context.xml  then it worked fine.  cheers and thank you!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1447602614.7599919;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1452605768.091794;s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>53352</wp:comment_id>
-                       <wp:comment_author><![CDATA[Matt Tyson]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[matthewcarltyson@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-05-18 02:31:31]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-05-18 00:31:31]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Wow.  I can't believe how involved that is now.  Thanks for writing the only clear description on the internet.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1463531491.447124;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1464248847.7812729;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>58361</wp:comment_id>
-                       <wp:comment_author><![CDATA[java - Cómo usar https / ssl con Maven/Mortbay Jetty Plugin?]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[]]></wp:comment_author_email>
-                       <wp:comment_author_url>https://rstopup.com/como-usar-https-ssl-con-maven-mortbay-jetty-plugin.html</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[207.180.211.189]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2019-05-02 01:20:27]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2019-05-01 23:20:27]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[[&#8230;] Aquí es el único de trabajo, claro el paso a paso que he encontrado para Jetty 9: juplo.de/configure-https-for-jetty-maven-plugin-9-0-x/&#8230; [&#8230;]]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[pingback]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1558691851.9724081;s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1556752827.557153;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>55237</wp:comment_id>
-                       <wp:comment_author><![CDATA[Phil]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[philmkieti@hotmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2018-01-14 17:55:49]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2018-01-14 15:55:49]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Awesome tutorial. Works like magic. Better than the jetty docs.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1515945349.3914831;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1526597917.3787291;s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>57303</wp:comment_id>
-                       <wp:comment_author><![CDATA[java - Comment faire pour utiliser https / ssl avec Maven/Mortbay Jetée Plugin?]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[]]></wp:comment_author_email>
-                       <wp:comment_author_url>https://askcodez.com/comment-faire-pour-utiliser-https-ssl-avec-maven-mortbay-jetee-plugin.html</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[185.43.220.19]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2019-01-05 10:03:50]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2019-01-05 08:03:50]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[[&#8230;] Ici est le seul à travailler, clairement, étape par étape, que j&#039;ai trouvé pour Jetty 9: juplo.de/configure-https-for-jetty-maven-plugin-9-0-x/... [&#8230;]]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[pingback]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1558691959.1636829;s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1546675430.2820809;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>53736</wp:comment_id>
-                       <wp:comment_author><![CDATA[Richard]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[ra22597@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://www.researchspace.com</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-10-21 13:11:11]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-10-21 11:11:11]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thanks very much ! I just used your 6 files verbatim and it and it all worked fine on Jetty 9.3.12\r
-You have saved me endless hours resolving this...\r
-\r
-Btw I have put the xml files and keystone in a a folder /jetty and it all works fine, to keep these config files out of application resource folders]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1477048271.8890131;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1477054561.968163;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>53676</wp:comment_id>
-                       <wp:comment_author><![CDATA[Nikola]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[nikola.milikic@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-09-15 13:03:09]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-09-15 11:03:09]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thanks a million! This worked like a charm.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1473937389.850652;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1478610260.9033599;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>62582</wp:comment_id>
-                       <wp:comment_author><![CDATA[Mike Croteau]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[croteau.mike@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://www.zeus.social</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[209.112.145.229]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2020-10-11 19:58:00]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2020-10-11 17:58:00]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Do you have a Patreon account? How can I buy you a coffee! This had to have taken a long time to configure. Thank you.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1602439080.025724;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1605370755.704574;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>62195</wp:comment_id>
-                       <wp:comment_author><![CDATA[Mike Croteau]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[croteau.mike@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[107.77.97.16]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2020-08-17 22:40:52]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2020-08-17 20:40:52]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[I am getting an invalid certificate on the browser window. What could be causing this? Everything seems to be exact. \r
-\r
-Thank you by the way! Im excited to have gotten this far thanks to you.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1597696852.674406;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1602360445.296556;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>64428</wp:comment_id>
-                       <wp:comment_author><![CDATA[MichaelDax]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[evgeniyxsb7vo@bk.ru]]></wp:comment_author_email>
-                       <wp:comment_author_url>https://gpu-z.eu</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[185.189.115.18]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2021-10-04 00:53:47]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2021-10-03 22:53:47]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[<a href="https://gpu-z.eu" rel="nofollow">techpowerup gpu z 0</a> - gpu z download +for windows, gpu z x64]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[0]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1633301627.341872;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>57037</wp:comment_id>
-                       <wp:comment_author><![CDATA[Maurice Wipf]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[maurice@gmx.de]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[192.168.66.1]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2018-08-17 10:29:23]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2018-08-17 08:29:23]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[I had rtouble to access the webapp with https.\r
-\r
-I figured out that there are two locahosts:\r
-\r
-https://localhost:8443 and\r
-http://localhost:8080.\r
-\r
-The ports are configured in jetty-https.xml and jetty-http.xml.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1534494564.4304199;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1558692037.9689789;s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Disable automatic p and br tags in the wordpress editor - and do it as early, as you can!</title>
-               <link>https://juplo.de/disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can/</link>
-               <pubDate>Mon, 24 Feb 2014 22:58:00 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=255</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>Why you should disable them as early, as you can</h2>\r
-<p>\r
-I don't like visual HTML-editors, because they always mess up your HTML. So the first thing, that I've done in my wordpress-profile, was checking the check-box <code>Disable the visual editor when writing</code>.\r
-But today I found out, that this is worth nothing.\r
-Even when in text-mode, wordpress is adding some <code>&lt;p&gt;-</code> and <code>&lt;br&gt;</code>-tags automagically and, hence, is automagically messing up my neatly hand-crafted HTML-code.\r
-</p>\r
-<p><strong>Fuck wordpress!</strong> <em>(Ehem - sorry for that outburst)</em>...</p>\r
-<p>\r
-But what is even worse: after <a href="#disable" title="Jump to the tech-section, if you only want to find out, how to disable wordpress's auto-messup functionality">really turning off wordpress's automagically-messup-functionality</a>, nearly all my handwritten <code>&lt;p&gt;</code>-tags were gone, too.\r
-So, if you want to turn of automatic <code>&lt;p&gt;-</code> and <code>&lt;br&gt;</code>-tags, you should really do it as early, as you can. Otherwise, you will have to clean up all your old posts afterwards like me. TI've lost some hours with usless HTML-editing today, because of that sh#%&amp;*!\r
-</p>\r
-<h2 id="disable">How to disable them</h2>\r
-<p>\r
-The <a href="https://codex.wordpress.org/TinyMCE#Automatic_use_of_Paragraph_Tags">wordpress-documentation of the build-in HTML-editor</a> links to <a href="http://redrokk.com/2010/08/16/removing-p-tags-in-wordpress/">this post</a>, which describs how to disable autmatic use of paragraph tags.\r
-Simple open the file <code>wp-includes/default-filters.php</code> of you wordpress-installation and comment out the following line:\r
-<p>\r
-<pre class="prettyprint linenums" id="jetty-xml">\r
-<code class="html">\r
-addfilter('the_content', 'wpautop');\r
-</code>\r
-</pre>\r
-<p>\r
-If you are building your own wordpress-theme - like me - you alternatively can add the following to the <code>functions.php</code>-file of your theme:\r
-</p>\r
-<pre class="prettyprint linenums" id="jetty-xml">\r
-<code class="html">\r
-remove_filter('the_content', 'wpautop');\r
-</code>\r
-</pre>\r
-<h2>Why you should disable automatic paragraph tags</h2>\r
-<p>\r
-For example, I was wondering a while, where all that whitespace in my posts were coming from.\r
-Being used to handcraft my HTML, I often wrote one sentence per line, or put some empty lines inbetween to clearly arange my code.\r
-There comes wordpress, messing everything up by automagically putting every sentence in its own paragraph, because it was written on its own line and putting <code>&lt;br&gt;</code> inbetween, to reflect my empty lines.\r
-</p>\r
-<p>\r
-But even worse, wordpress also puts these unwanted <code>&lt;p&gt;</code>-tags <a href="http://wordpress.org/support/topic/disable-automatic-p-and-br-tags-in-html-editor" title="Another example is described in this forum-request. One guy puts a plugin in his post, but it does not work, because wordpress automagically messed up his HTML...">arround HTML-code, that breaks because of it</a>.\r
-For example, I eventually found out about this auto-messup functionallity, because I was checking my blog-post with a <a href="http://validator.w3.org/">html-validator</a> and was wondering, why the validator was grumping about a <code>&lt;quote&gt;</code>-tag inside <a href="http://dev.w3.org/html5/html-author/#flow-content">flow content</a>, which I've never put there. It turned out, that wordpress had put it there for me...\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>255</wp:post_id>
-               <wp:post_date><![CDATA[2014-02-25 00:58:00]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-02-24 22:58:00]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[disable-automatic-p-and-br-tags-in-the-wordpress-editor-and-do-it-as-early-as-you-can]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="html5"><![CDATA[HTML(5)]]></category>
-               <category domain="category" nicename="wordpress"><![CDATA[Wordpress]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>46574</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[92.231.12.159]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-06-23 13:55:37]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-06-23 11:55:37]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi Richard,
-
-thank you for your hint.
-I will take a look at it.
-I was not able to find that plugin, when I first stumbled accross the problem.
-So, it is good, this probably easier alternative is pointed out here.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>46568</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1435060537.609107;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>41602</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[87.151.102.90]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-03-30 16:20:48]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-03-30 14:20:48]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi Sofian,
-
-I think, that that would be the effect of my code.
-Unfortunatly, I cannot test this now, because I turned of the visual HTML-editor in my wordpress-installation, because I do not need it.
-So, I think you will get what you are looking for.
-But it would be nice, if you could report back, if my trick worked for you, so that future readers can profit from your work.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>41591</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1427725248.98843;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>41591</wp:comment_id>
-                       <wp:comment_author><![CDATA[sofian]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[sascha50000@gmx.de]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-03-30 13:31:29]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-03-30 11:31:29]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hello, thanks for this post, I am in the same situation, I find WP's HTML Editor behaviour a joke. \r
-\r
-Now if I understood correctly, the use of remove_filter('the_content', 'wpautop'); should result in my p-tags to stay when i switch to visual and back, but they dont.\r
-\r
-Is this the effect that that code brings to you? Can you normally work now in your HTML Editor with all tags? Are they getting lost if you switch to visual and back?\r
-\r
-Thank you\r
-Sofian]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1427724820.3969741;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1427715089.501791;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>46568</wp:comment_id>
-                       <wp:comment_author><![CDATA[Richard]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[Bower39@yahoo.co.uk]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-06-23 11:17:09]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-06-23 09:17:09]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[The Raw HTML plugin offers a "Disable automatic paragraphs" function.\r
-\r
-Works for me to enable the Ordnance Survey OS API, for maps and POI markers.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1435051029.6340389;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1435060426.3393359;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>56975</wp:comment_id>
-                       <wp:comment_author><![CDATA[Pihu Gupta]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[refernloot@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url>https://refernloot.com/</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[192.168.66.1]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2018-07-20 11:23:50]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2018-07-20 09:23:50]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thanks, Actually I wants to adding a style code with using some multiple Input &amp; Id, Values in the Single Posts. But I just fix this. Thank You So Much Sir.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1558692061.9444511;s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1532078630.4957621;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Der Benutzer ist nicht dazu berechtigt, diese Anwendung zu sehen</title>
-               <link>https://juplo.de/der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen/</link>
-               <pubDate>Sun, 16 Mar 2014 14:28:27 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=275</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>Du bist gerade bei Facebook über die folgende Fehlermeldung gestolpert:</p>\r
-<p>\r
-<strong>Fehler</strong><br/>\r
-Der Nutzer ist nicht dazu berechtigt, diese Anwendung zu sehen.:<br/>\r
-Der Benutzer ist nicht berrechtigt diese Applikation an zusehen. Der Entwickler hat dies so eingestellt.\r
-</p>\r
-<p><a href="http://juplo.de/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt.png"><img src="http://juplo.de/wp-uploads/2014/03/der-nutzer-ist-nicht-dazu-berechtigt-300x150.png" alt="Fehler Der Nutzer ist nicht dazu berechtigt, diese Anwendung zu sehen.: Der Benutzer ist nicht berrechtigt diese Applikation an zusehen. Der Entwickler hat dies so eingestellt." width="300" height="150" class="alignnone size-medium wp-image-276" /></a></p>\r
-<p>Da dazu nichts bei Googel zu finden war, hier die einfache Erklärung, was da schief läuft:</p>\r
-<p>\r
-<strong>\r
-Du hast die bei Facebook als Testbenutzer einer deiner Apps eingeloggt und das beim Zugriff auf eine andere App vergessen!\r
-</strong>\r
-</p>\r
-<p>\r
-Die Testbenutzer einer App dürfen offensichtlich nur auf diese App und sonst auf keine Seiten/Apps in Facebook zugreifen - macht ja auch Sinn.\r
-Verwirrend nur, dass Facebook behauptet, man hättte da etwas selber von Hand eingestellt...\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>275</wp:post_id>
-               <wp:post_date><![CDATA[2014-03-16 16:28:27]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-03-16 14:28:27]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[der-benutzer-ist-nicht-dazu-berechtigt-diese-anwendung-zu-sehen]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>61327</wp:comment_id>
-                       <wp:comment_author><![CDATA[steve]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[nope@web.de]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[2003:ca:5725:d1bb:f51a:7cc9:78:3f84]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2020-04-22 17:45:06]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2020-04-22 15:45:06]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[wow, thanks!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1588338092.122419;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1587570306.584071;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>hibernate4-maven-plugin 1.0.4 released!</title>
-               <link>https://juplo.de/hibernate4-maven-plugin-1-0-4-released/</link>
-               <pubDate>Mon, 02 Jun 2014 09:40:09 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=288</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-We finally did it.\r
-Today we released the version 1.0.4 of <a href="/hibernate4-maven-plugin" title="hibernate4-maven-plugin">hibernate4-maven-plugin</a> to <a href="http://search.maven.org/#search|gav|1|g%3A%22de.juplo%22%20AND%20a%3A%22hibernate4-maven-plugin%22" title="Central">Central</a>!\r
-</p>\r
-<p>\r
-This release mainly is a library-upgrade to version 4.3.1.Final of hibernate.\r
-It also includes some bug-fixes provided by the community.\r
-Please see the release notes for details.\r
-</p>\r
-<p>\r
-It took us quiet some time, to release this version and we are sorry for that.\r
-But with a growing number of users, we are becoming more anxious to break some special use-cases.\r
-Because of that, we started to add some integration-tests, to avoid that hassle, and that took us some time...\r
-</p>\r
-<p>\r
-If you have some special small-sized (example) use-cases for the plugin, we would appreciate it, if you would provide them to us, so we can add them es additional integration-tests.\r
-</p>\r
-<h2>Release notes:</h2>\r
-<code>\r
-commit f3dabc0e6e3676244986b5bbffdb67d427c8383c\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Mon Jun 2 10:31:12 2014 +0200\r
-\r
-    [maven-release-plugin] prepare release hibernate4-maven-plugin-1.0.4\r
-\r
-commit 856dd31c9b90708e841163c91261a865f9efd224\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Mon Jun 2 10:12:24 2014 +0200\r
-\r
-    Updated documentation\r
-\r
-commit 64900890db2575b7a28790c5e4d5f45083ee94b3\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Apr 29 20:43:15 2014 +0200\r
-\r
-    Switched documentation to xhtml, to be able to integrate google-pretty-print\r
-\r
-commit bd78c276663790bf7a3f121db85a0d62c64ce38c\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Apr 29 19:42:41 2014 +0200\r
-\r
-    Fixed bug in site-configuration\r
-\r
-commit 1628bcf6c9290a729352215ee22e5b48fa628c4c\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Apr 29 18:07:44 2014 +0200\r
-\r
-    Verifying generated SQL in integration-test hibernate4-maven-plugin-envers-sample\r
-\r
-commit 25079f13c0eda6807d5aee67086a21ddde313213\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Apr 29 18:01:10 2014 +0200\r
-\r
-    Added integration-test provided by Erik-Berndt Scheper <erik.berndt.scheper@gmail.com>\r
-\r
-commit 69458703cddc2aea1f67e06db43bce6950c6f3cb\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Apr 29 17:52:17 2014 +0200\r
-\r
-    Verifying generated SQL in integration-test schemaexport-example\r
-\r
-commit a53a2ad438038084200a8449c557a41159e409dc\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Apr 29 17:46:05 2014 +0200\r
-\r
-    Added integration-test provided by Guido Wimmel <Wimmel.Guido@swm.de>\r
-\r
-commit f18f820198878cddcea8b98c2a5e0c9843b923d2\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Apr 29 09:43:06 2014 +0200\r
-\r
-    Verifying generated SQL in integration-test hib-test\r
-\r
-commit 4bb462610138332087d808a62c84a0c9776b24cc\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Apr 29 08:58:33 2014 +0200\r
-\r
-    Added integration-test provided by Joel Johnson <mrjoel@lixil.net>\r
-\r
-commit c5c4c7a4007bc2bd58b850150adb78f8518788da\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Apr 29 08:43:28 2014 +0200\r
-\r
-    Prepared POM for integration-tests via invoker-maven-plugin\r
-\r
-commit d8647fedfe936f49476a5c1f095d51a9f5703d3d\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Apr 29 08:41:50 2014 +0200\r
-\r
-    Upgraded Version of maven from 3.0.4 to 3.2.1\r
-\r
-commit 1979c6349fc2a9e0fe3f028fa1cc76557b32031c\r
-Author: Frank Schimmel <frank@lynix.net>\r
-Date:   Wed Feb 12 15:16:18 2014 +0100\r
-\r
-    Properly support constraints expressed by bean validation (jsr303) annotations.\r
-    \r
-     * Access public method of package-visible TypeSafeActivator class without reflection.\r
-     * Fix arguments to call of TypeSafeActivator.applyRelationalConstraints().\r
-     * Use hibernate version 4.3.1.Final for all components.\r
-     * Minor refactorings in exception handling.\r
-\r
-commit c3a16dc3704517d53501914bb8a0f95f856585f4\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Fri Jan 17 09:05:05 2014 +0100\r
-\r
-    Added last contributors to the POM\r
-\r
-commit 5fba40e135677130cbe0ff3c59f6055228293d92\r
-Author: Mark Robinson <mark@mrobinson.ca>\r
-Date:   Fri Jan 17 08:53:47 2014 +0100\r
-\r
-    Generated schema now corresponds to hibernate validators set on the beans\r
-\r
-commit aedcc19cfb89a8b387399a978afab1166be816e3\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Thu Jan 16 18:33:32 2014 +0100\r
-\r
-    Upgrade to Hibernate 4.3.0.Final\r
-\r
-commit 734356ab74d2896ec8d7530af0d2fa60ff58001f\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Thu Jan 16 18:23:12 2014 +0100\r
-\r
-    Improved documentation of the dependency-scanning on the pitfalls-page\r
-\r
-commit f2955fc974239cbb266922c04e8e11101d7e9dd9\r
-Author: Joel Johnson <mrjoel@lixil.net>\r
-Date:   Thu Dec 26 14:33:51 2013 -0700\r
-\r
-    Text cleanup, spelling, etc.\r
-\r
-commit 727d1a35bb213589270b097d04d5a1f480bffef6\r
-Author: Joel Johnson <mrjoel@lixil.net>\r
-Date:   Thu Dec 26 14:02:29 2013 -0700\r
-\r
-    Make output file handling more robust\r
-    \r
-    * Ensure output file directory path exists\r
-    * Anchor relative paths in build directory\r
-\r
-commit eeb182205a51c4507e61e1862af184341e65dbd3\r
-Author: Joel Johnson <mrjoel@lixil.net>\r
-Date:   Thu Dec 26 13:53:37 2013 -0700\r
-\r
-    Check that md5 path is file and has content\r
-\r
-commit 64c0a52bdd82142a4c8caef18ab0671a74fdc6c1\r
-Author: Joel Johnson <mrjoel@lixil.net>\r
-Date:   Thu Dec 26 11:25:34 2013 -0700\r
-\r
-    Use more descriptive filename for schema md5\r
-\r
-commit ba2e48a347a839be63cbce4b7ca2469a600748c6\r
-Author: Joel Johnson <mrjoel@lixil.net>\r
-Date:   Thu Dec 26 11:20:24 2013 -0700\r
-\r
-    Offer explicit disable option\r
-    \r
-    Use an explicit disable property, but still default it to test state\r
-\r
-commit e44434257040745e66e0596b262dd0227b085729\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Fri Oct 18 01:55:11 2013 +0200\r
-\r
-    [maven-release-plugin] prepare for next development iteration\r
-\r
-</code>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>288</wp:post_id>
-               <wp:post_date><![CDATA[2014-06-02 11:40:09]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-06-02 09:40:09]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[hibernate4-maven-plugin-1-0-4-released]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="hibernate"><![CDATA[Hibernate]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>4093</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[92.228.252.85]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-06-17 10:32:30]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-06-17 08:32:30]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thanks to Tim Astle, who pointed out, that the 1.0.4-build was still missing from central.\r
-\r
-I had forgotten, to perform the final step of the process: the release of the staging repository to centra. Sorry, folks.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1402993950.2692549;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Changes in log4j.properties are ignored, when running sl4fj under Tomcat</title>
-               <link>https://juplo.de/changes-in-log4j-properties-are-ignored-when-running-sl4fj-under-tomcat/</link>
-               <pubDate>Tue, 03 Jun 2014 09:55:28 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=291</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Lately, I run into this very subtle bug:\r
-my logs were all visible, like intended and configured in <code>log4j.properties</code> (or <code>log4j.xml</code>), when I fired up my web-application in development-mode under <a href="http://www.eclipse.org/jetty/" title="Lern more about Jetty">Jetty</a> with <code>mvn jetty:run</code>.\r
-But if I installed the application on the production-server, which uses a <a href="http://tomcat.apache.org/" title="Lern more about Tomcat">Tomcat 7</a> servlet-container, no special logger-configuration where picked up from my configuration-file.\r
-<em>But - very strange - my configuration-file was not ignored completely.</em>\r
-The appender-configuration and the log-level from the root-logger where picked up from my configuration-file.\r
-<strong>Only all special logger-configuration were ignored</strong>.\r
-</p>\r
-<h2>Erroneous logging-configuration</h2>\r
-<p>Here is my configuration, as it was when I run into the problem:</p>\r
-<ul>\r
-  <li>Logging was done with <a href="http://www.slf4j.org" title="Learn more about slf4j">slf4j</a></li>\r
-  <li>Logs were written by <a href="http://logging.apache.org/log4j/2.x/" title="Learn more about log4j">log4j</a> with the help of <strong>slf4j-log4j12</strong></li>\r
-  <li>\r
-    Because I was using some legacy libraries, that were using other logging-frameworks, I had to include some <a href="http://www.slf4j.org/legacy.html" title="Lern more about slf4j-bridges">bridges</a> to be able to include the log-messages, that were logged through this frameworks in my log-files.\r
-    I used: <strong>jcl-over-slf4j</strong> and <strong>log4j-over-slf4j</strong>.\r
-  </li>\r
-</ul>\r
-<h2>Do not use sl4fj-log4j and log4j-over-slf4j together!</h2>\r
-<p>\r
-  As said before:\r
-  <em>All worked as expected while developing under Jetty and in production under Tomcat, only special logger-confiugrations where ignored.</em>\r
-</p>\r
-<p>\r
-  Because of that, it took me quiet a while and a lot of reading, to figure out, that <strong>this was not a configuration-issue, but a clash of libraries</strong>.\r
-  The cause of this strange behaviour were the fact, that <strong>one must not use the log4j-binding <em>slf4j-log4j12</em> and the log4j-bridge <em>log4j-over-slf4j</em> together</strong>.\r
-</p>\r
-<p>\r
-  This fact is quiet logically, because it <em>should</em> push all your logging-statements into an endless loop, where they are handed back and forth between sl4fj and log4j as stated in the sl4fj-documentation <a href="http://www.slf4j.org/legacy.html#log4j-over-slf4j" title="Here you can read the warning in the documentation">here</a>.\r
-  But if you see all your log-messages in development and in production only the configuration behaves strangley, this mistake is realy hard to figure out!\r
-  So, I hope I can save you some time by dragging your attention to this.\r
-</p>\r
-<h2>The solution</h2>\r
-<p>\r
-  Only the cause is hard to find.\r
-  The solution is very simple:\r
-  <strong>Just switch from log4j to <a href="http://logback.qos.ch/index.html" title="Learn more about logback">logback</a></strong>.\r
-</p>\r
-<p>\r
-  There are some more good reasons, why you should do this anyway, over which you can <a href="http://logback.qos.ch/reasonsToSwitch.html" title="Learn why you should switch from log4j to logback anyway">learn more here</a>.\r
-</p>\r
-\r
-\r
-\r
-\r
-  ]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>291</wp:post_id>
-               <wp:post_date><![CDATA[2014-06-03 11:55:28]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-06-03 09:55:28]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[changes-in-log4j-properties-are-ignored-when-running-sl4fj-under-tomcat]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="jetty"><![CDATA[Jetty]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>aspectj-maven-plugin can not compile valid Java-7.0-Code</title>
-               <link>https://juplo.de/aspectj-maven-plugin-can-not-compile-valid-java-7-0-code/</link>
-               <pubDate>Fri, 18 Jul 2014 08:18:25 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=302</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-I stumbled over a valid construction, that can not be compiled by the <a href="http://mojo.codehaus.org/aspectj-maven-plugin/" title="Jump to the homepage of the aspectj-maven-plugin">aspectj-maven-plugin</a>:\r
-</p>\r
-<pre class="prettyprint linenums" id="jetty-xml"><code class="java">\r
-class Outer<T>\r
-{\r
-  void outer(Inner inner)\r
-  {\r
-  }\r
-\r
-  class Inner\r
-  {\r
-    Outer outer;\r
-\r
-    void inner()\r
-    {\r
-      outer.outer(this);\r
-    }\r
-  }\r
-}\r
-</code></pre>\r
-<p>\r
-This code might look very useless.\r
-Originally, it <code>Inner</code> was a Thread, that wants to signal its enclosing class, that it has finished some work.\r
-I just striped down all other code, that was not needed, to trigger the error.\r
-</p>\r
-<p>\r
-If you put the class <code>Outer</code> in a maven-project and configure the aspectj-maven-plugin to weave this class with compliance-level 1.6, you will get the following error:\r
-</p>\r
-<pre class="prettyprint linenums" id="jetty-xml"><code>\r
-[ERROR] Failed to execute goal org.codehaus.mojo:aspectj-maven-plugin:1.6:compile (default-cli) on project shouter: Compiler errors:\r
-[ERROR] error at outer.inner(this);\r
-[ERROR] \r
-[ERROR] /home/kai/juplo/shouter/src/main/java/Outer.java:16:0::0 The method inner(Outer<T>.Inner) is undefined for the type Outer\r
-[ERROR] error at queue.done(this, System.currentTimeMillis() - start);\r
-[ERROR] \r
-</code></pre>\r
-<p>\r
-The normal compilation works, because the class is syntactically correct Java-7.0-Code.\r
-But the AspectJ-Compiler (Version 1.7.4) bundeled with the aspectj-maven-pluign will fail!\r
-</p>\r
-<p>\r
-Fortunately, I found out, <a href="http://juplo.de/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/" title="Read, how to run the aspectj-maven-plugin with a current version of AspectJ">how to use the aspectj-maven-plugin with AspectJ 1.8.3</a>.\r
-</p>\r
-<p>\r
-So, if you have a similar problem, <a href="http://juplo.de/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/" title="Read, how you can solve this ajc compilation error">read on...</a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>302</wp:post_id>
-               <wp:post_date><![CDATA[2014-07-18 10:18:25]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-07-18 08:18:25]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[aspectj-maven-plugin-can-not-compile-valid-java-7-0-code]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>4648</wp:comment_id>
-                       <wp:comment_author><![CDATA[Running aspectj-maven-plugin with the current Version 1.8.1 of AspectJ | juplo]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[88.198.150.85]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-07-18 10:32:21]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-07-18 08:32:21]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[[&#8230;] I stumbled over a syntactically valid class, that can not be compiled by the aspectj-maven-plugin, even so it is a valid Java-7.0 [&#8230;]]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[pingback]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1405771374.543746;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1405672341.888912;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Running aspectj-maven-plugin with the current Version 1.8.1 of AspectJ</title>
-               <link>https://juplo.de/running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj/</link>
-               <pubDate>Fri, 18 Jul 2014 08:32:18 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=306</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Lately, I stumbled over a syntactically valid class, that <a href="http://juplo.de/aspectj-maven-plugin-can-not-compile-valid-java-7-0-code/" title="Read more about the code, that triggers the AspectJ compilation error">can not be compiled by the aspectj-maven-plugin</a>, even so it is a valid Java-7.0 class.\r
-</p>\r
-<p>\r
-Using the current version (<a href="http://search.maven.org/#artifactdetails|org.aspectj|aspectjtools|1.8.1|jar" title="See informations about the current version 1.8.1 of AspectJ on Maven Central">Version 1.8.1</a>) of <a href="http://www.eclipse.org/aspectj/" title="Visit the homepage of the AspectJ-project">AspectJ</a> solves this issue.\r
-But unfortunatly, there is no new version of the <a href="http://mojo.codehaus.org/aspectj-maven-plugin/" title="Learn more about the aspectj-maven-plugin">aspectj-maven-plugin</a> available, that uses this new version of AspectJ.\r
-<a href="http://search.maven.org/#artifactdetails|org.codehaus.mojo|aspectj-maven-plugin|1.6|maven-plugin" title="Read more informations about the latest version of the aspectj-maven-plugin on Maven Central">The last version of the aspectj-maven-plugin</a> was released to Maven Central on December the 4th 2013 and this versions is bundeled with the version 1.7.2 of AspectJ.\r
-</p>\r
-<p>\r
-The simple solution is, to bring the aspectj-maven-plugin to use the current version of AspectJ.\r
-This can be done, by overwriting its dependency to the bundled aspectj.\r
-This definition of the plugin does the trick:\r
-</p>\r
-<pre class="prettyprint linenums" id="jetty-xml"><code class="xml">\r
-&lt;plugin&gt;\r
-  &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;\r
-  &lt;artifactId&gt;aspectj-maven-plugin&lt;/artifactId&gt;\r
-  &lt;version&gt;1.6&lt;/version&gt;\r
-  &lt;configuration&gt;\r
-    &lt;complianceLevel&gt;1.7&lt;/complianceLevel&gt;\r
-    &lt;aspectLibraries&gt;\r
-      &lt;aspectLibrary&gt;\r
-        &lt;groupId&gt;org.springframework&lt;/groupId&gt;\r
-        &lt;artifactId&gt;spring-aspects&lt;/artifactId&gt;\r
-      &lt;/aspectLibrary&gt;\r
-    &lt;/aspectLibraries&gt;\r
-  &lt;/configuration&gt;\r
-  &lt;executions&gt;\r
-    &lt;execution&gt;\r
-      &lt;goals&gt;\r
-        &lt;goal&gt;compile&lt;/goal&gt;\r
-      &lt;/goals&gt;\r
-    &lt;/execution&gt;\r
-  &lt;/executions&gt;\r
-  &lt;dependencies&gt;\r
-    &lt;dependency&gt;\r
-      &lt;groupId&gt;org.aspectj&lt;/groupId&gt;\r
-      &lt;artifactId&gt;aspectjtools&lt;/artifactId&gt;\r
-      &lt;version&gt;1.8.1&lt;/version&gt;\r
-    &lt;/dependency&gt;\r
-  &lt;/dependencies&gt;\r
-&lt;/plugin&gt;\r
-</code></pre>\r
-<p>\r
-The crucial part is the explicit dependency, the rest depends on your project and might have to be adjusted accordingly:\r
-</p>\r
-<pre class="prettyprint linenums" id="jetty-xml"><code class="xml">\r
-  &lt;dependencies&gt;\r
-    &lt;dependency&gt;\r
-      &lt;groupId&gt;org.aspectj&lt;/groupId&gt;\r
-      &lt;artifactId&gt;aspectjtools&lt;/artifactId&gt;\r
-      &lt;version&gt;1.8.1&lt;/version&gt;\r
-    &lt;/dependency&gt;\r
-  &lt;/dependencies&gt;\r
-</code></pre>\r
-<p>\r
-I hope, that helps, folks!\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>306</wp:post_id>
-               <wp:post_date><![CDATA[2014-07-18 10:32:18]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-07-18 08:32:18]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[running-aspectj-maven-plugin-with-the-current-version-1-8-1-of-aspectj]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>4649</wp:comment_id>
-                       <wp:comment_author><![CDATA[aspectj-maven-plugin can not compile valid Java-7.0-Code | juplo]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de/aspectj-maven-plugin-can-not-compile-valid-java-7-0-code/</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[88.198.150.85]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-07-18 10:36:19]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-07-18 08:36:19]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[[&#8230;] I found out, how to use the aspectj-maven-plugin with AspectJ 1.8.3. Read [&#8230;]]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[pingback]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1405771377.5910339;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1405672579.1356101;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>hibernate4-maven-plugin 1.0.5 released!</title>
-               <link>https://juplo.de/hibernate4-maven-plugin-1-0-5-released/</link>
-               <pubDate>Tue, 11 Nov 2014 16:08:16 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=319</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Today we released the version 1.0.5 of <a href="/hibernate4-maven-plugin" title="hibernate4-maven-plugin">hibernate4-maven-plugin</a> to <a href="http://search.maven.org/#search|gav|1|g%3A%22de.juplo%22%20AND%20a%3A%22hibernate4-maven-plugin%22" title="Central">Central</a>!\r
-</p>\r
-<p>\r
-This release mainly fixes a NullPointerException-bug, that was introduced in 1.0.4.\r
-The NPE was triggered, if a <code>hibernate.properties</code>-file is present and the dialect is specified in that file and not in the plugin configuration.\r
-Thanks to Paulo Pires and and everflux, for pointing me at that bug.\r
-</p>\r
-<p>\r
-But there are also some minor improvements to talk about:\r
-</p>\r
-<ul>\r
-  <li>Package level annotations are now supported (Thanks to Joachim Van der Auwera for that)</li>\r
-  <li><code>Hibernate Core</code> was upgraded to 4.3.7.Final</li>\r
-  <li><code>Hibernate Envers</code> was upgraded to 4.3.7.Final</li>\r
-  <li><code>Hibernate Validator</code> was upgrades to 5.1.3.Final</l>\r
-</ul>\r
-<p>\r
-The upgrade of <code>Hibernate Validator</code> is a big step, because 5.x supports Bean Validation 1.1 (<a href="https://jcp.org/en/jsr/detail?id=349" title="Read the specification at jpc.org">JSR 349</a>).\r
-See <a href="http://hibernate.org/validator/faq/" title="Read the first entry for more details on the supported version of Bean Validation">the FAQ of hibernate-validator</a> for more details on this.\r
-</p>\r
-<p>\r
-Because <code>Hibernate Validator 5</code> requires the Unified Expression Language (EL) in version 2.2 or later,  a dependency to <code>javax.el-api:3.0.0</code> was added.\r
-That does the trick for the integration-tests included in the source code of the plugin.\r
-But, because I am not using <code>Hibernate Validator</code> in any of my own projects, at the moment, the upgrade may rise some backward compatibility errors, that I am not aware of.\r
-<em>If you stumble across any problems, please let me know!</em>\r
-</p>\r
-<h2>Release notes:</h2>\r
-<code>\r
-commit ec30af2068f2d12a9acf65474ca1a4cdc1aa7122\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Nov 11 15:28:12 2014 +0100\r
-\r
-    [maven-release-plugin] prepare for next development iteration\r
-\r
-commit 18840e3c775584744199d8323eb681b73b98e9c4\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Nov 11 15:27:57 2014 +0100\r
-\r
-    [maven-release-plugin] prepare release hibernate4-maven-plugin-1.0.5\r
-\r
-commit b95416ef16bbaafecb3d40888fe97e70cdd75c77\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Nov 11 15:10:32 2014 +0100\r
-\r
-    Upgraded hibernate-validator from 4.3.2.Final to 5.1.3.Final\r
-    \r
-    Hibernate Validator 5 requires the Unified Expression Language (EL) in\r
-    version 2.2 or later. Therefore, a dependency to javax.el-api:3.0.0 was\r
-    added. (Without that, the compilation of some integration-tests fails!)\r
-\r
-commit ad979a8a82a7701a891a59a183ea4be66672145b\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Nov 11 14:32:42 2014 +0100\r
-\r
-    Upgraded hibernate-core, hibernate-envers, hibernate-validator and maven-core\r
-    \r
-     * Upgraded hibernate-core      from 4.3.1.Final to 4.3.7.Final\r
-     * Upgraded hibernate-envers    from 4.3.1.Final to 4.3.7.Final\r
-     * Upgraded hibernate-validator from 4.3.1.Final to 4.3.2.Final\r
-     * Upgraded maven-core          from 3.2.1       to 3.2.3\r
-\r
-commit 347236c3cea0f204cefd860c605d9f086e674e8b\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Nov 11 14:29:23 2014 +0100\r
-\r
-    Added FAQ-entry for problem with whitespaces in the path under Windows\r
-\r
-commit 473c3ef285c19e0f0b85643b67bbd77e06c0b926\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Tue Oct 28 23:37:45 2014 +0100\r
-\r
-    Explained how to suppress dependency-scanning in documentation\r
-    \r
-    Also added a test-case to be sure, that dependency-scanning is skipped, if\r
-    the parameter "dependencyScanning" is set to "none".\r
-\r
-commit 74c0dd783b84c90e116f3e7f1c8d6109845ba71f\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Mon Oct 27 09:04:48 2014 +0100\r
-\r
-    Fixed NullPointerException, when dialect is specified in properties-file\r
-    \r
-    Also added an integration test-case, that proofed, that the error was\r
-    solved.\r
-\r
-commit d27f7af23c82167e873ce143e50ce9d9a65f5e61\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sun Oct 26 11:16:00 2014 +0100\r
-\r
-    Renamed an integration-test to test for whitespaces in the filename\r
-\r
-commit 426d18e689b89f33bf71601becfa465a00067b10\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sat Oct 25 17:29:41 2014 +0200\r
-\r
-    Added patch by Joachim Van der Auwera to support package level annotations\r
-\r
-commit 3a3aeaabdb1841faf5e1bf8d220230597fb22931\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sat Oct 25 16:52:34 2014 +0200\r
-\r
-    Integrated integration test provided by Claus Graf (clausgraf@gmail.com)\r
-\r
-commit 3dd832edbd50b1499ea6d53e4bcd0ad4c79640ed\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Mon Jun 2 10:31:13 2014 +0200\r
-\r
-    [maven-release-plugin] prepare for next development iteration\r
-</code>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>319</wp:post_id>
-               <wp:post_date><![CDATA[2014-11-11 18:08:16]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2014-11-11 16:08:16]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[hibernate4-maven-plugin-1-0-5-released]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="hibernate"><![CDATA[Hibernate]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>39525</wp:comment_id>
-                       <wp:comment_author><![CDATA[yuxh]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[28391418@qq.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-03-10 09:14:53]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-03-10 07:14:53]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[I tried appfuse 3.5 which intergrate with version 1.0.5 of hibernate4-maven-plugin. when I run &gt;mvn hibernate4:export -X ,I found:<code>\r
-[DEBUG] Setting dialect [org.hibernate.dialect.Oracle10gDialect]\r
-[INFO] HHH000227: Running hbm2ddl schema export\r
-[DEBUG] Import file not found: /import.sql\r
-[DEBUG]\r
-    drop table app_user cascade constraints\r
-\r
-    drop table app_user cascade constraints;\r
-[ERROR] HHH000389: Unsuccessful: drop table app_user cascade constraints\r
-[ERROR] ORA-00911: invalid character</code>\r
-I didnot modify anything,can you help me.thank you]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1426438263.944947;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1425971693.537987;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>43007</wp:comment_id>
-                       <wp:comment_author><![CDATA[Anna]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[anna.fuczko.extern@bertelsmann.de]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-04-21 15:54:53]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-04-21 13:54:53]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi,\r
-I'm using as dialect a class which is specified in project where we are using your plugin. Since version 1.4 I'm getting\r
-\r
-Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: <strong>myDialect.MySQLServerDialect</strong>\r
-        at de.juplo.plugins.hibernate4.ValidationConfiguration.(ValidationConfiguration.java:36)\r
-        at de.juplo.plugins.hibernate4.Hbm2DdlMojo.execute(Hbm2DdlMojo.java:679)\r
-\r
-With version 1.3 everything works fine. \r
-\r
-Could you guys check it please?]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1429624493.3229151;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1430653538.1869111;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>30938</wp:comment_id>
-                       <wp:comment_author><![CDATA[Klaus Unger]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[klaus.unger@iq-consultancy.net]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2014-12-16 16:53:56]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2014-12-16 14:53:56]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[first things first ... thanks for the great plugin!!!\r
-\r
-my colleague and myself have come across some minor issues:\r
-\r
-We do have the following snippets\r
-\r
-<code>\r
-@ElementCollection\r
-@CollectionTable(name = "T2", joinColumns = @JoinColumn(name = "T1_ID", foreignKey = @ForeignKey(name = "FK_T2_TO_T1")))\r
-</code>\r
-\r
-It seems, that the ForeignKey annotation embedded in the CollectionTable has no effect.\r
-\r
-<code>\r
-@Table(name = "T1", uniqueConstraints=@UniqueConstraint(name="U_REFERENZ", columnNames="REFERENCE"))\r
-</code>\r
-\r
-It also seems, that the uniqueConstraint annotation embedded in the table has no effect.\r
-\r
-Are me missing some configuration part, is it by intention or have me spotted a minor glitch?\r
-Thanks for a short reply.\r
-\r
-Again ... thanks for the great plugin\r
-cheers\r
-Klaus]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1426439273.2141061;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1418741636.418071;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>40075</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[92.224.172.232]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-03-15 18:55:07]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-03-15 16:55:07]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi  yuxh,
-
-this does not look like a bug in the plugin.
-
-It looks like there is some invalid data in the table, that stops the drop.
-
-I would drop the table manually and give it a retry...]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>39525</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1426438507.3114369;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>40080</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[92.224.172.232]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-03-15 19:12:41]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-03-15 17:12:41]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[At the first glance, that does not look like a bug in the plugin.
-
-Under the hood, the plugin is using the official SchemaExport-Tool from Hibernate (see: <a href="https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/toolsetguide.html#toolsetguide-s1-3" title="See the hibernate documentation" rel="nofollow">the offical Toolset-Guide</a>).
-
-Try running the export manualy with that tool.
-If the error persists, it is a hibernate-bug and you should ask that guys.
-If not, please contact me again!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>30938</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1426439561.0724931;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>44012</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[92.231.13.79]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-05-03 13:52:31]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-05-03 11:52:31]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[If you can provide me with some example-code, that generates the error, I would look into it.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>43007</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1430653951.8874769;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Logging Request- and Response-Data From Requets Made Through RestTemplate</title>
-               <link>https://juplo.de/logging-request-and-response-data-from-requets-made-through-resttemplate/</link>
-               <pubDate>Mon, 09 Feb 2015 10:52:15 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=326</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Logging request- and response-data for requests made through Spring's <code>RestTemplate</code> is quite easy, if you know, what to do.\r
-But it is rather hard, if you have no clue where to start.\r
-Hence, I want to give you some hints in this post.\r
-</p>\r
-<p>\r
-In its default configuration, the <code>RestTemplate</code> uses the <a href="https://hc.apache.org/httpcomponents-client-4.4.x/index.html" title="Visit the project homepage of httpcomponents-client">HttpClient</a> of the <a href="https://hc.apache.org/index.html" title="Visit the project homepage of apache-httpcomonents">Apache HttpComponents</a> package.\r
-You can verify this and the used version with the mvn-command\r
-</p>\r
-<pre class="prettyprint" id="jetty-xml"><code class="bash">\r
-mvn dependency:tree\r
-</code></pre>\r
-<p>\r
-To enable for example logging of the HTTP-Headers send and received, you then simply can add the following to your logging configuration:\r
-</p>\r
-<pre class="prettyprint" id="jetty-xml"><code class="xml">\r
-&lt;logger name="org.apache.http.headers"&gt;\r
-  &lt;level value="debug"/&gt;\r
-&lt;/logger&gt;\r
-</code></pre>\r
-<h2>Possible Pitfalls</h2>\r
-<p>\r
-If that does not work, you should check, which version of the Apache HttpComponents your project actually is using, because the name of the logger has changed between version <code>3.x</code> and <code>4.x</code>.\r
-Another common cause of problems is, that the Apache HttpComponets uses <a href="http://commons.apache.org/proper/commons-logging/" title="Visit the project homepage of commons-logging">Apache Commons Logging</a>.\r
-If the jar for that library is missing, or if your project uses another logging library, the messages might get lost because of that.\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>326</wp:post_id>
-               <wp:post_date><![CDATA[2015-02-09 12:52:15]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-02-09 10:52:15]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[logging-request-and-response-data-from-requets-made-through-resttemplate]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="spring"><![CDATA[Spring]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Replace text by graphic without extra markup</title>
-               <link>https://juplo.de/replace-text-by-graphic-without-extra-markup/</link>
-               <pubDate>Fri, 08 May 2015 12:05:44 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=339</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Here is a little trick for you, to replace text by a graphic through pure CSS without the need to add extra markup:\r
-</p>\r
-<pre class="prettyprint linenums">\r
-<code class="java">\r
-SELECTOR\r
-{\r
-  text-indent: -99em;\r
-  line-height: 0;\r
-}\r
-SELECTOR:after\r
-{\r
-  display: block;\r
-  text-indent: 0;\r
-  content: REPLACEMENT;\r
-}\r
-</code>\r
-</pre>\r
-<p>\r
-<code>SELECTOR</code> can be any valid CSS-selector.\r
-<code>REPLACEMENT</code> references the graphic, which should replace the text.\r
-This can be a SVG-graphic, a vector-graphics from a font, any bitmap graphic or (quiet useless, but a simple case to understand the source like in <a href="http://juplo.de/wp-uploads/2015/05/replace-1.html" title="This example replaces the h1-heading with another text">the first of my two examples</a>) other text.\r
-SVG- and bitmap-graphics are simply referred by an url in the <code>content</code>-directive, like I have done it with a data-url in <a href="http://juplo.de/wp-uploads/2015/05/replace-2.html" title="This example replaces the h1-heading with a svg-graphic referenced through a data-url">my second example</a>.\r
-For the case of an icon embedded in a vector you simply put the character-code of the icon in the <code>content</code>-directive, like described in <a href="http://alistapart.com/article/the-era-of-symbol-fonts" title="See the alistapart-article to icon fonts">the according ALA-article</a>.\r
-</p>\r
-<h2>Examples</h2>\r
-<ol>\r
- <li><a href="http://juplo.de/wp-uploads/2015/05/replace-1.html" title="Replaces the h1-heading with another text">Example 1</a></li>\r
- <li><a href="http://juplo.de/wp-uploads/2015/05/replace-2.html" title="Replaces the h1-heading with a svg-graphic referenced through a data-url">Example 2</a></li>\r
-</ol>\r
-<h2>What is it good for?</h2>\r
-<p>\r
-If you need backward compatibility for Internet Explorer 8 and below or Android 2.3 and below, you have to use icon-fonts to support these old browsers.\r
-I use this often, if I have a brand logo, that should be inserted in a accessible way and do not want to bloat up the html-markup with useless tag's, to achieve this.\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>339</wp:post_id>
-               <wp:post_date><![CDATA[2015-05-08 14:05:44]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-05-08 12:05:44]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[replace-text-by-graphic-without-extra-markup]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="css"><![CDATA[CSS]]></category>
-               <category domain="category" nicename="html5"><![CDATA[HTML(5)]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>hibernate4-maven-plugin 1.1.0 released!</title>
-               <link>https://juplo.de/hibernate4-maven-plugin-1-1-0-released/</link>
-               <pubDate>Sat, 16 May 2015 14:52:37 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=348</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Today we released the version 1.1.0 of <a href="/hibernate4-maven-plugin" title="hibernate4-maven-plugin">hibernate4-maven-plugin</a> to <a href="http://search.maven.org/#search|gav|1|g%3A%22de.juplo%22%20AND%20a%3A%22hibernate4-maven-plugin%22" title="Central">Central</a>!\r
-</p>\r
-<p>\r
-The main work in this release were modification to the process of configuration-gathering.\r
-The plugin now also is looking for a <code>hibernate.cfg.xml</code> on the classpath or a persistence-unit specified in a <code>META-INF/persistence.xml</code>.\r
-</p>\r
-<p>\r
-With this enhancement, the plugin is now able to deal with all examples from the official\r
-<a href="https://docs.jboss.org/hibernate/orm/3.6/quickstart/en-US/html/index.html" title="Read the Tutorial">Hibernate Getting Started Guide</a>.\r
-</p>\r
-<p>\r
-All configuration infos found are merged together with the same default precedences applied by hibernate.\r
-So, the overall order, in which possible configuration-sources are checked is now (each later source might overwrite settings of a previous source):\r
-</p>\r
-<ol>\r
-  <li><code>hibernate.properties</code></li>\r
-  <li><code>hibernate.cfg.xml</code></li>\r
-  <li><code>persistence.xml</code></li>\r
-  <li>maven properties</li>\r
-  <li>plugin configuration</li>\r
-</ol>\r
-<p>\r
-Because the possible new configuration-sources might change the expected behavior of the plugin, we lifted the version to 1.1.\r
-</p>\r
-<p>\r
-This release also fixes a bug, that occured on some platforms, if the path to the project includes one or more space characters.\r
-</p>\r
-<h2>Release notes:</h2>\r
-<code>\r
-commit 94e6b2e93fe107e75c9d20aa1eb3126e78a5ed0a\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sat May 16 14:14:44 2015 +0200\r
-\r
-    Added script to check outcome of the hibernate-tutorials\r
-\r
-commit b3f8db2fdd9eddbaac002f94068dd1b4e6aef9a8\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Tue May 5 12:43:15 2015 +0200\r
-\r
-    Configured hibernate-tutorials to use the plugin\r
-\r
-commit 4b6fc12d443b0594310e5922e6ad763891d5d8fe\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Tue May 5 12:21:39 2015 +0200\r
-\r
-    Fixed the settings in the pom's of the tutorials\r
-\r
-commit 70bd20689badc18bed866b3847565e1278433503\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Tue May 5 11:49:30 2015 +0200\r
-\r
-    Added tutorials of the hibernate-release 4.3.9.Final as integration-tests\r
-\r
-commit 7e3e9b90d61b077e48b59fc0eb63059886c68cf5\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sat May 16 11:04:36 2015 +0200\r
-\r
-    JPA-jdbc-properties are used, if appropriate hibernate-properties are missing\r
-\r
-commit c573877a186bec734915fdb3658db312e66a9083\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Thu May 14 23:43:13 2015 +0200\r
-\r
-    Hibernate configuration is gathered from class-path by default\r
-\r
-commit 2a85cb05542795f9cd2eed448f212f92842a85e8\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Wed May 13 09:44:18 2015 +0200\r
-\r
-    Found no way to check, that mapped classes were found\r
-\r
-commit 038ccf9c60be6c77e2ba9c2d2a2a0d261ce02ccb\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue May 12 22:13:23 2015 +0200\r
-\r
-    Upgraded scannotation from 1.0.3 to 1.0.4\r
-    \r
-    This fixes the bug that occures on some platforms, if the path contains a\r
-    space. Created a fork of scannotation to bring the latest bug-fixes from SVN\r
-    to maven central...\r
-\r
-commit c43094689043d7da04df6ca55529d0f0c089d820\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sun May 10 19:06:27 2015 +0200\r
-\r
-    Added javadoc-jar to deployed artifact\r
-\r
-commit 524cb8c971de87c21d0d9f0e04edf6bd30f77acc\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sat May 9 23:48:39 2015 +0200\r
-\r
-    Be sure to relase all resources (closing db-connections!)\r
-\r
-commit 1e5cca792c49d60e20d7355eb97b13d591d80af6\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sat May 9 22:07:31 2015 +0200\r
-\r
-    Settings in a hibernate.cfg.xml are read\r
-\r
-commit 9156c5f6414b676d34eb0c934e70604ba822d09a\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue May 5 23:42:40 2015 +0200\r
-\r
-    Catched NPE, if hibernate-dialect is not set\r
-\r
-commit 62859b260a47e70870e795304756bba2750392e3\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sun May 3 18:53:24 2015 +0200\r
-\r
-    Upgraded oss-type, maven-plugin-api and build/report-plugins\r
-\r
-commit c1b3b60be4ad2c5c78cb1e3706019dfceb390f89\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sun May 3 18:53:04 2015 +0200\r
-\r
-    Upgraded hibernate to 4.3.9.Final\r
-\r
-commit 038ccf9c60be6c77e2ba9c2d2a2a0d261ce02ccb\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue May 12 22:13:23 2015 +0200\r
-\r
-    Upgraded scannotation from 1.0.3 to 1.0.4\r
-    \r
-    This fixes the bug that occures on some platforms, if the path contains a\r
-    space. Created a fork of scannotation to bring the latest bug-fixes from SVN\r
-    to maven central...\r
-\r
-commit c43094689043d7da04df6ca55529d0f0c089d820\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sun May 10 19:06:27 2015 +0200\r
-\r
-    Added javadoc-jar to deployed artifact\r
-\r
-commit 524cb8c971de87c21d0d9f0e04edf6bd30f77acc\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sat May 9 23:48:39 2015 +0200\r
-\r
-    Be sure to relase all resources (closing db-connections!)\r
-\r
-commit 1e5cca792c49d60e20d7355eb97b13d591d80af6\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sat May 9 22:07:31 2015 +0200\r
-\r
-    Settings in a hibernate.cfg.xml are read\r
-\r
-commit 9156c5f6414b676d34eb0c934e70604ba822d09a\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue May 5 23:42:40 2015 +0200\r
-\r
-    Catched NPE, if hibernate-dialect is not set\r
-\r
-commit 62859b260a47e70870e795304756bba2750392e3\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sun May 3 18:53:24 2015 +0200\r
-\r
-    Upgraded oss-type, maven-plugin-api and build/report-plugins\r
-\r
-commit c1b3b60be4ad2c5c78cb1e3706019dfceb390f89\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sun May 3 18:53:04 2015 +0200\r
-\r
-    Upgraded hibernate to 4.3.9.Final\r
-\r
-commit 038ccf9c60be6c77e2ba9c2d2a2a0d261ce02ccb\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue May 12 22:13:23 2015 +0200\r
-\r
-    Upgraded scannotation from 1.0.3 to 1.0.4\r
-    \r
-    This fixes the bug that occures on some platforms, if the path contains a\r
-    space. Created a fork of scannotation to bring the latest bug-fixes from SVN\r
-    to maven central...\r
-\r
-commit c43094689043d7da04df6ca55529d0f0c089d820\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sun May 10 19:06:27 2015 +0200\r
-\r
-    Added javadoc-jar to deployed artifact\r
-\r
-commit 524cb8c971de87c21d0d9f0e04edf6bd30f77acc\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sat May 9 23:48:39 2015 +0200\r
-\r
-    Be sure to relase all resources (closing db-connections!)\r
-\r
-commit 1e5cca792c49d60e20d7355eb97b13d591d80af6\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sat May 9 22:07:31 2015 +0200\r
-\r
-    Settings in a hibernate.cfg.xml are read\r
-\r
-commit 9156c5f6414b676d34eb0c934e70604ba822d09a\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue May 5 23:42:40 2015 +0200\r
-\r
-    Catched NPE, if hibernate-dialect is not set\r
-\r
-commit 62859b260a47e70870e795304756bba2750392e3\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sun May 3 18:53:24 2015 +0200\r
-\r
-    Upgraded oss-type, maven-plugin-api and build/report-plugins\r
-\r
-commit c1b3b60be4ad2c5c78cb1e3706019dfceb390f89\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sun May 3 18:53:04 2015 +0200\r
-\r
-    Upgraded hibernate to 4.3.9.Final\r
-\r
-commit 248ff3220acc8a2c11281959a1496adc024dd4df\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sun May 3 18:09:12 2015 +0200\r
-\r
-    Renamed nex release to 1.1.0\r
-\r
-commit 2031d4cfdb8b2d16e4f2c7bbb5c03a15b4f64b21\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sun May 3 16:48:43 2015 +0200\r
-\r
-    Generation of tables and rows for auditing is now default\r
-\r
-commit 42465d2a5e4a5adc44fbaf79104ce8cc25ecd8fd\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sun May 3 16:20:58 2015 +0200\r
-\r
-    Fixed mojo to scan for properties in persistence.xml\r
-\r
-commit d5a4326bf1fe2045a7b2183cfd3d8fdb30fcb406\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sun May 3 14:51:12 2015 +0200\r
-\r
-    Added an integration-test, that depends on properties from a persistence.xml\r
-\r
-commit 5da1114d419ae10f94a83ad56cea9856a39f00b6\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sun May 3 14:51:46 2015 +0200\r
-\r
-    Switched to usage of a ServiceRegistry\r
-\r
-commit fed9fc9e4e053c8b61895e78d1fbe045fadf7348\r
-Author: Kai Moritz <km@juplo.de>\r
-Date:   Sun May 3 11:42:54 2015 +0200\r
-\r
-    Integration-Test for envers really generates the SQL\r
-\r
-commit fee05864d61145a06ee870fbffd3bff1e95af08c\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sun Mar 15 16:56:22 2015 +0100\r
-\r
-    Extended integration-test "hib-test" to check for package-level annotations\r
-\r
-commit 7518f2a7e8a3d900c194dbe61609efa34ef047bd\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sun Mar 15 15:42:01 2015 +0100\r
-\r
-    Added support for m2e\r
-    \r
-    Thanks to Andreas Khutz\r
-\r
-</code>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>348</wp:post_id>
-               <wp:post_date><![CDATA[2015-05-16 16:52:37]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-05-16 14:52:37]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[hibernate4-maven-plugin-1-1-0-released]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="hibernate"><![CDATA[Hibernate]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="jpa"><![CDATA[JPA]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>A Perfect Outline</title>
-               <link>https://juplo.de/a-perfect-outline/</link>
-               <pubDate>Tue, 23 Jun 2015 22:42:06 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=357</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>Point Out Your Content: Utilize the HTML5 Outline-Algorithm</h2>\r
-<p>\r
-HTML5 introduces new semantic elements accompained by the definition of <a href="https://developer.mozilla.org/de/docs/Web/Guide/HTML/Sections_and_Outlines_of_an_HTML5_document" title="Read all about the new possibilities to mark up the outline of your document">a new algorithm to calculate the document-outline</a> from the mark up.\r
-There are plenty of <a href="http://www.smashingmagazine.com/2011/08/16/html5-and-the-document-outlining-algorithm/" title="This is a very good overview, because it also pointes out, what to watch out for">good explanations</a> of these new possibilities, to point out your content in a more controlled way.\r
-But the most of these explanations fall short, if it comes to how to put these new markup into use, so that it results in a sensible outline of the document, that was marked up.\r
-</p>\r
-<p>\r
-In this article I will try to explain, how to use the new semantic markup, to produce an outline, that is usable as a real content table of the document - not just as an partially orderd overview of all headings.\r
-I will do so, by showing simple examples, that will illuminate the principles behind the new markup.\r
-</p>\r
-<h2>All Messed Up!</h2>\r
-<p>\r
-Although, the ideas behind the new markup seems to be simple and clear, nearly nobody accomplishes to produce a sensible outline.\r
-Even the big players, who <a href="http://www.html5rocks.com/de/" title="Great guidance - but bad outline">guide us through the jungle of the new specifications</a> and are giving <a href="http://www.smashingmagazine.com/2013/01/18/the-importance-of-sections/" title="Great explanation - but bad outline">great explanations about the subject</a>, either fail on there sites (see by yourself with the help of the help of <a href="https://h5o.github.io/" title="Just drag and drop the bookmarklet to your favorites.">the h5o HTML5 Outline Bookmarklet</a>), or produce the outline in the old way by the usage of <code>h1</code>-<code>h6</code> only, like the fabulous HTML5-bible <a href="http://diveintohtml5.info/semantics.html#footer-element" title="A wounderful introduction to the new possibilities of HTML5 - but the tid outline is produced the old way">Dive Into HTML5</a>.\r
-</p>\r
-<p>\r
-This is, because there is a lot to mix up in a wrong way, when trying to adopt the new features.\r
-Here is, what I ended up with, on my first try to combine what I have learned about <a href="http://www.w3schools.com/html/html5_semantic_elements.asp" title="Overview of the new semantic elements, available in HTML5">semantic elements</a> and the <a href="http://html5doctor.com/outlines/" title="An explanation, of what the specs told you about the document outline">document outline</a>:\r
-</p>\r
-<div id="example-01" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 01: Markup</h4>\r
-<pre class="prettyprint linenums">\r
-<code class="html">\r
-&lt;!DOCTYPE html&gt;\r
-&lt;title&gt;Example 01&lt;/title&gt;\r
-&lt;header&gt;\r
-  &lt;h2&gt;Header&lt;/h2&gt;\r
-  &lt;nav&gt;Navigation&lt;/nav&gt;\r
-&lt;/header&gt;\r
-&lt;main&gt;\r
-  &lt;h1&gt;Main&lt;/h1&gt;\r
-  &lt;section&gt;\r
-    &lt;h2&gt;Section I&lt;/h2&gt;\r
-  &lt;/section&gt;\r
-  &lt;section&gt;\r
-    &lt;h2&gt;Section II&lt;/h2&gt;\r
-    &lt;section&gt;\r
-      &lt;h3&gt;Subsection a&lt;/h3&gt;\r
-    &lt;/section&gt;\r
-    &lt;section&gt;\r
-      &lt;h3&gt;Subsection b&lt;/h3&gt;\r
-    &lt;/section&gt;\r
-  &lt;/section&gt;\r
-  &lt;section&gt;\r
-    &lt;h2&gt;Section III&lt;/h2&gt;\r
-    &lt;section&gt;\r
-      &lt;h3&gt;Subsection a&lt;/h3&gt;\r
-    &lt;/section&gt;\r
-  &lt;/section&gt;\r
-&lt;/main&gt;\r
-&lt;aside&gt;\r
-  &lt;h1&gt;Aside&lt;/h1&gt;\r
-&lt;/aside&gt;\r
-&lt;footer&gt;\r
-  &lt;h2&gt;Footer&lt;/h2&gt;\r
-&lt;/footer&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 01: Outline</h4>\r
-<ol>\r
-  <li>\r
-    Header\r
-    <ol>\r
-      <li><em>Untitled section</em></li>\r
-    </ol>\r
-  </li>\r
-  <li>\r
-    Main\r
-    <ol>\r
-      <li>Section I</li>\r
-      <li>\r
-        Section II\r
-        <ol>\r
-          <li>Subsection a</li>\r
-          <li>Subsection b</li>\r
-        </ol>\r
-      </li>\r
-      <li>\r
-        Section III\r
-        <ol>\r
-          <li>Subsection a</li>\r
-        </ol>\r
-      </li>\r
-      <li>Aside</li>\r
-      <li>Footer</li>\r
-    </ol>\r
-  </li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-01.html">View example 01</a>\r
-</p>\r
-</div>\r
-</div>\r
-<p>\r
-That quiet was not the outline, that I had expected.\r
-I planed, that <em>Header</em>, <em>Main</em>, <em>Aside</em> and <em>Footer</em> are ending up at the same level.\r
-Instead of that, <em>Aside</em> and <em>Footer</em> had become sections of my <em>Main</em>-content.\r
-And where the hell comes that <em>Untitled section</em> from?!?\r
-My first thought on that was: No problem, I just forgot the <code>header</code>-tags.\r
-But after adding them, the only thing that cleared out, was where the <em>Untitled section</em> was coming from:\r
-</p>\r
-<div id="example-02" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 02: Markup</h4>\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;!DOCTYPE html&gt;\r
-&lt;title&gt;Example 02&lt;/title&gt;\r
-&lt;header&gt;\r
-  &lt;h2&gt;Header&lt;/h2&gt;\r
-  &lt;nav&gt;\r
-    &lt;header&gt;&lt;h3&gt;Navigation&lt;/h3&gt;&lt;/header&gt;\r
-  &lt;/nav&gt;\r
-&lt;/header&gt;\r
-&lt;main&gt;\r
-  &lt;header&gt;&lt;h1&gt;Main&lt;/h1&gt;&lt;/header&gt;\r
-  &lt;section&gt;\r
-    &lt;header&gt;&lt;h2&gt;Section I&lt;/h2&gt;&lt;/header&gt;\r
-  &lt;/section&gt;\r
-  &lt;section&gt;\r
-    &lt;header&gt;&lt;h2&gt;Section II&lt;/h2&gt;&lt;/header&gt;\r
-    &lt;section&gt;\r
-      &lt;header&gt;&lt;h3&gt;Subsection a&lt;/h3&gt;&lt;/header&gt;\r
-    &lt;/section&gt;\r
-    &lt;section&gt;\r
-      &lt;header&gt;&lt;h3&gt;Subsection b&lt;/h3&gt;&lt;/header&gt;\r
-    &lt;/section&gt;\r
-  &lt;/section&gt;\r
-  &lt;section&gt;\r
-    &lt;header&gt;&lt;h2&gt;Section III&lt;/h2&gt;&lt;/header&gt;\r
-    &lt;section&gt;\r
-      &lt;header&gt;&lt;h3&gt;Subsection a&lt;/h3&gt;&lt;/header&gt;\r
-    &lt;/section&gt;\r
-  &lt;/section&gt;\r
-&lt;/main&gt;\r
-&lt;footer&gt;\r
-  &lt;header&gt;&lt;h2&gt;Footer&lt;/h2&gt;&lt;/header&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 02: Outline</h4> \r
-<ol>\r
-  <li>\r
-    Header\r
-    <ol>\r
-      <li>Navigation</li>\r
-    </ol>\r
-  </li>\r
-  <li>\r
-    Main\r
-    <ol>\r
-      <li>Section I</li>\r
-      <li>\r
-        Section II\r
-        <ol>\r
-          <li>Subsection a</li>\r
-          <li>Subsection b</li>\r
-        </ol>\r
-      </li>\r
-      <li>\r
-        Section III\r
-        <ol>\r
-          <li>Subsection a</li>\r
-        </ol>\r
-      </li>\r
-      <li>Aside</li>\r
-      <li>Footer</li>\r
-    </ol>\r
-  </li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-02.html">View example 02</a>\r
-</p>\r
-</div>\r
-</div>\r
-<p>\r
-So I thought: Maybe the <code>main</code>-tag was the wrong choice.\r
-Perhaps it should be replaced by an <code>article</code>.\r
-But after that change, the outline even got worse.\r
-Now, <em>Navigation</em>, <em>Main</em> and <em>Aside</em> appeared on the same level, all as a subsection of <em>Header</em>.\r
-At least, <em>Footer</em> suddenly was a sibling of <em>Header</em> as planed:\r
-</p>\r
-<div id="example-03" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 03: Markup</h4>\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;!DOCTYPE html&gt;\r
-&lt;title&gt;Example 03&lt;/title&gt;\r
-&lt;header&gt;\r
-  &lt;h2&gt;Header&lt;/h2&gt;\r
-  &lt;nav&gt;\r
-    &lt;header&gt;&lt;h3&gt;Navigation&lt;/h333&gt;&lt;/header&gt;\r
-  &lt;/nav&gt;\r
-&lt;/header&gt;\r
-&lt;article&gt;\r
-  &lt;header&gt;&lt;h1&gt;Article (Main)&lt;/h1&gt;&lt;/header&gt;\r
-  &lt;section&gt;\r
-    &lt;header&gt;&lt;h2&gt;Section I&lt;/h2&gt;&lt;/header&gt;\r
-  &lt;/section&gt;\r
-  &lt;section&gt;\r
-    &lt;header&gt;&lt;h2&gt;Section II&lt;/h2&gt;&lt;/header&gt;\r
-    &lt;section&gt;\r
-      &lt;header&gt;&lt;h3&gt;Subsection a&lt;/h3&gt;&lt;/header&gt;\r
-    &lt;/section&gt;\r
-    &lt;section&gt;\r
-      &lt;header&gt;&lt;h3&gt;Subsection b&lt;/h3&gt;&lt;/header&gt;\r
-    &lt;/section&gt;\r
-  &lt;/section&gt;\r
-  &lt;section&gt;\r
-    &lt;header&gt;&lt;h2&gt;Section III&lt;/h2&gt;&lt;/header&gt;\r
-    &lt;section&gt;\r
-      &lt;header&gt;&lt;h3&gt;Subsection a&lt;/h3&gt;&lt;/header&gt;\r
-    &lt;/section&gt;\r
-  &lt;/section&gt;\r
-&lt;/article&gt;\r
-&lt;footer&gt;\r
-  &lt;header&gt;&lt;h2&gt;Footer&lt;/h2&gt;&lt;/header&gt;\r
-&lt;/footer&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 03: Outline</h4> \r
-<ol>\r
-  <li>\r
-    Header\r
-    <ol>\r
-      <li>Navigation</li>\r
-  <li>\r
-    Main\r
-    <ol>\r
-      <li>Section I</li>\r
-      <li>\r
-        Section II\r
-        <ol>\r
-          <li>Subsection a</li>\r
-          <li>Subsection b</li>\r
-        </ol>\r
-      </li>\r
-      <li>\r
-        Section III\r
-        <ol>\r
-          <li>Subsection a</li>\r
-        </ol>\r
-      </li>\r
-    </ol>\r
-  </li>\r
-      <li>Aside</li>\r
-    </ol>\r
-  </li>\r
-      <li>Footer</li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-03.html">View example 03</a>\r
-</p>\r
-</div>\r
-</div>\r
-<p>\r
-After that, I was totally confused and decided, to sort it out step by step.\r
-That procedure finally gave me the clue, I want to share with you now.\r
-</p>\r
-<h2>Step by Step (Uh Baby!)</h2>\r
-<h3 id="step-01">Step I: Investigate the Structured Part</h3>\r
-<p>\r
-Let us start with the strictly structured part of the document: <strong>the article and it's subsections</strong>.\r
-At first a minimal example with no markup except the <code>article</code>- and the <code>section</code>-tags:\r
-</p>\r
-<div id="example-04" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 04: Markup</h4>\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;!DOCTYPE html&gt;\r
-&lt;title&gt;Example 04&lt;/title&gt;\r
-&lt;article&gt;\r
-  Main\r
-  &lt;section&gt;\r
-    Section I\r
-  &lt;/section&gt;\r
-  &lt;section&gt;\r
-    Section II\r
-    &lt;section&gt;\r
-      Subsection a\r
-    &lt;/section&gt;\r
-    &lt;section&gt;\r
-      Subsection b\r
-    &lt;/section&gt;\r
-  &lt;/section&gt;\r
-  &lt;section&gt;\r
-    Section III\r
-    &lt;section&gt;\r
-      Subsection a\r
-    &lt;/section&gt;\r
-  &lt;/section&gt;\r
-&lt;/main&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 04: Outline</h4> \r
-<ol>\r
-  <li>\r
-    <em>Untitled BODY</em>\r
-    <ol>\r
-      <li>\r
-        <em>Untitled ARTICLE</em>\r
-        <ol>\r
-          <li><em>Untitled SECTION</em></li>\r
-          <li>\r
-            <em>Untitled SECTION</em>\r
-            <ol>\r
-              <li><em>Untitled SECTION</em></li>\r
-              <li><em>Untitled SECTION</em></li>\r
-            </ol>\r
-          </li>\r
-          <li>\r
-            <em>Untitled SECTION</em>\r
-            <ol>\r
-              <li><em>Untitled SECTION</em></li>\r
-            </ol>\r
-          </li>\r
-        </ol>\r
-      </li>\r
-    </ol>\r
-  </li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-04.html">View Example 04</a>\r
-</p>\r
-</div>\r
-</div>\r
-<p>\r
-Nothing really unexpected here.\r
-The <code>article</code>- and <code>section</code>-tags are reflected in the outline according to their nesting.\r
-The only thing notably here is, that the <code>body</code> itself is also reflected in the outline.\r
-It appears on its own level as the root-element of all tags.\r
-We can think of it as the title of our document.\r
-</p>\r
-<p>\r
-We can add headings of any kind (<code>h1</code>-<code>h6</code>) here and will always get an identically structured outline, that reflects the text of our headings.\r
-If we want to give the body a title, we have to place a heading outside and before any sectioning-elements:\r
-</p>\r
-<div id="example-05" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 05: Markup</h4>\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;!DOCTYPE html&gt;\r
-&lt;title&gt;Example 05&lt;/title&gt;\r
-&lt;h1&gt;Page&lt;/h1&gt;\r
-&lt;article&gt;\r
-  &lt;h1&gt;Article&lt;/h1&gt;\r
-  &lt;section&gt;\r
-    &lt;h1&gt;Section I&lt;/h1&gt;\r
-  &lt;/section&gt;\r
-  &lt;section&gt;\r
-    &lt;h1&gt;Section II&lt;/h1&gt;\r
-    &lt;section&gt;\r
-      &lt;h1&gt;Subsection a&lt;/h1&gt;\r
-    &lt;/section&gt;\r
-    &lt;section&gt;\r
-      &lt;h1&gt;Subsection b&lt;/h1&gt;\r
-    &lt;/section&gt;\r
-  &lt;/section&gt;\r
-  &lt;section&gt;\r
-    &lt;h1&gt;Section III&lt;/h1&gt;\r
-    &lt;section&gt;\r
-      &lt;h1&gt;Subsection a&lt;/h1&gt;\r
-    &lt;/section&gt;\r
-  &lt;/section&gt;\r
-&lt;/article&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 05: Outline</h4> \r
-<ol>\r
-  <li>\r
-    Page\r
-    <ol>\r
-      <li>\r
-        Article\r
-        <ol>\r
-          <li>Section I</li>\r
-          <li>\r
-            Section II\r
-            <ol>\r
-              <li>Subsection a</em></li>\r
-              <li>Subsection b</em></li>\r
-            </ol>\r
-          </li>\r
-          <li>\r
-           Section III\r
-            <ol>\r
-              <li>Subsection a</li>\r
-            </ol>\r
-          </li>\r
-        </ol>\r
-      </li>\r
-    </ol>\r
-  </li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-05.html">View Example 05</a>\r
-</p>\r
-</div>\r
-</div>\r
-<p>\r
-This is the new part of the outline algorithm introduced in HTML5: <em>The nesting of elements, that define sections, defines the outline of the document.</em>\r
-The rank of the heading element is ignored by this algorithm!\r
-</p>\r
-<p>\r
-Among the elements, that define sections in HTML5 are the <code>article</code> and the <code>section</code> tags.\r
-But there are more.\r
-<a href="#sectioning-elemnts" title="Jump to the explanation of all sectioning-elements now">I will discuss them later</a>.\r
-For now, you only have to know, that in HTML5, sectioning elements define the structure of the outline.\r
-Also, you should memorize, that the outline always has a single root without any siblings: the <code>body</code>.\r
-</p>\r
-<h3 id="step-2">Step II: Investigate the Page-Elements</h3>\r
-<p>\r
-So, let us do the same with the tags that represent the different logical sections of a web-page: <strong>the page-elements</strong>.\r
-We start with a minimal example again, that contains no markup except the <code>header</code>- the <code>main</code> and the <code>footer</code>-tags:\r
-</p>\r
-<div id="example-06" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 06: Markup</h4>\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;!DOCTYPE html&gt;\r
-&lt;title&gt;Example 06&lt;/title&gt;\r
-&lt;header&gt;Page&lt;/header&gt;\r
-&lt;main&gt;Main&lt;/main&gt;\r
-&lt;footer&gt;Footer&lt;/footer&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 06: Outline</h4> \r
-<ol>\r
-  <li>\r
-    <em>Untitled BODY</em>\r
-  </li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-06.html">View Example 06</a>\r
-</p>\r
-</div>\r
-</div>\r
-<p>\r
-That is wired, ehh?\r
-There is only one untitled element in the outline.\r
-The explanation for this is, that neither the <code>header</code>- nor the <code>main</code>- nor the <code>footer</code>-tag belong to the elements, that define a section in HTML5!\r
-This is often confused, because these elements define <em>the logical sections</em>  (header &ndash; main-content &ndash; footer) of a website.\r
-But these logical sections do not have to do anything with the structural sectioning of the document, that defines the outline.\r
-</p>\r
-<h3>Step III: Investigate the Headings</h3>\r
-<p>\r
-So, what happens, if we add the desired markup for our headings?\r
-We want a <code>h1</code>-heading for our main-content, because it is the important part of our page.\r
-The header should have a <code>h2</code>-heading and the footer a <code>h3</code>-heading, because it is rather unimportant.\r
-</p>\r
-<div id="example-07" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 07: Markup</h4>\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;!DOCTYPE html&gt;\r
-&lt;title&gt;Example 07&lt;/title&gt;\r
-&lt;header&gt;&lt;h2&gt;Page&lt;/h2&gt;&lt;/header&gt;\r
-&lt;main&gt;&lt;h1&gt;Main&lt;/h1&gt;&lt;/main&gt;\r
-&lt;footer&gt;&lt;h3&gt;Footer&lt;/h3&gt;&lt;/footer&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 07: Outline</h4> \r
-<ol>\r
-  <li>Page</li>\r
-  <li>\r
-    Main\r
-    <ol>\r
-      <li>Footer</li>\r
-    </ol>\r
-  </li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-07.html">View Example 07</a>\r
-</p>\r
-</div>\r
-</div>\r
-<p>\r
-Now, there is an outline again.\r
-But why?\r
-And why is it looking this way?\r
-</p>\r
-<p>\r
-What happens here, is <a href="https://developer.mozilla.org/de/docs/Web/Guide/HTML/Sections_and_Outlines_of_an_HTML5_document#Implicit_Sectioning" title="Read all about implicit sectioning">implicit sectioning</a>.\r
-In short, implicit sectioning is the outline algorithm of HTML4.\r
-HTML5 needs implicit sectioning, to keep compatible with HTML4, which still dominates the web.\r
-In fact, we could have used plain HTML4, with <code>div</code> instead of <code>header</code>, <code>main</code> and <code>footer</code>, and it would have yield the exact same outline:\r
-</p>\r
-<div id="example-07" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 08: Markup</h4>\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;\r
-&lt;html&gt;\r
-  &lt;head&gt;&lt;title&gt;Example 08&lt;/title&gt;&lt;/head&gt;\r
-  &lt;body&gt;\r
-    &lt;div class="header"&gt;&lt;h2&gt;Page&lt;/h2&gt;&lt;/div&gt;\r
-    &lt;div class="main"&gt;&lt;h1&gt;Main&lt;/h1&gt;&lt;/div&gt;\r
-    &lt;div class="footer"&gt;&lt;h3&gt;Footer&lt;/h3&gt;&lt;/div&gt;\r
-  &lt;/body&gt;\r
-&lt;/html&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 08: Outline</h4> \r
-<ol>\r
-  <li>Page</li>\r
-  <li>\r
-    Main\r
-    <ol>\r
-      <li>Footer</li>\r
-    </ol>\r
-  </li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-08.html">View Example 08</a>\r
-</p>\r
-</div>\r
-</div>\r
-<p>\r
-In HTML4, solely the headings (<code>h1</code>-<code>h6</code>) define the outline of a document.\r
-The enclosing elements or any nesting of them are ignored altogether.\r
-The level, at which a heading appears in the outline, is defined by the rank of the heading alone.\r
-(Strictly speaking, HTML4 does not define anything like a document outline.\r
-But as a result of the common usage and interpretation, this is, how people outline their documents with HTML4.)\r
-</p>\r
-<p>\r
-The implicit sectioning of HTML5 works in a way, that is backward compatible with this way of outlining, but closes the gaps in the resulting hierarchy:\r
-<em>Each heading implicitly opens a section &ndash; hence the name &ndash;, but if there is a gap between its rank and the rank of its ancestor &ndash; that is the last preceding heading with a higher rank &ndash; it is placed in the level directly beneath its ancestor</em>:\r
-</p>\r
-<div id="example-09" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 09: Markup</h4>\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;!DOCTYPE html&gt;\r
-&lt;title&gt;Example 09&lt;/title&gt;\r
-&lt;h4&gt;h4&lt;/h4&gt;\r
-&lt;h2&gt;h2&lt;/h2&gt;\r
-&lt;h4&gt;h4&lt;/h4&gt;\r
-&lt;h3&gt;h3&lt;/h3&gt;\r
-&lt;h2&gt;h2&lt;/h2&gt;\r
-&lt;h1&gt;h1&lt;/h1&gt;\r
-&lt;h2&gt;h2&lt;/h2&gt;\r
-&lt;h3&gt;h3&lt;/h3&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 09: Outline</h4> \r
-<ol>\r
-  <li>h4</li>\r
-  <li>\r
-    h2\r
-    <ol>\r
-      <li>h4</li>\r
-      <li>h3</li>\r
-    </ol>\r
-  </li>\r
-  <li>h2</li>\r
-  <li>\r
-    h1\r
-    <ol>\r
-      <li>\r
-        h2\r
-        <ol>\r
-          <li>h3</li>\r
-        </ol>\r
-      </li>\r
-    </ol>\r
-  </li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-09.html">View Example 09</a>\r
-</p>\r
-</div>\r
-</div>\r
-<p>\r
-See, how the first heading <code>h4</code> ends up on the same level as the second, which is a <code>h2</code>.\r
-Or, how the third and fourth headings are both on the same level under the <code>h2</code>, although they are of different rank.\r
-And note, how the <code>h2</code> and <code>h3</code> end up on different sectioning-levels as their earlier appearances, if they follow a <code>h1</code> in the natural order.\r
-</p>\r
-<h3>Step IV: Mixing it all together</h3>\r
-<p>\r
-With the gathered clues in mind, we can now retry to layout our document with the desired outline.\r
-If we want, that <em>Header</em>, <em>Main</em> and <em>Footer</em> end up as top level citizens in our planed outline, we simply have to achieve, that they are all recognized as sections under the top level by the HTML5 outline algorithm.\r
-We can do that, by explicitly stating, that the <code>header</code> and the <code>footer</code> are section:\r
-<div id="example-10" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 10: Markup</h4>\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;!DOCTYPE html&gt;\r
-&lt;title&gt;Example 10&lt;/title&gt;\r
-&lt;header&gt;\r
-  &lt;section&gt;\r
-    &lt;h2&gt;Main&lt;/h2&gt;\r
-  &lt;/section&gt;\r
-&lt;/header&gt;\r
-&lt;main&gt;\r
-  &lt;article&gt;\r
-    &lt;h1&gt;Article&lt;/h1&gt;\r
-    &lt;section&gt;\r
-      &lt;h2&gt;Section I&lt;/h2&gt;\r
-    &lt;/section&gt;\r
-    &lt;section&gt;\r
-      &lt;h2&gt;Section II&lt;/h2&gt;\r
-      &lt;section&gt;\r
-        &lt;h3&gt;Subsection a&lt;/h3&gt;\r
-      &lt;/section&gt;\r
-      &lt;section&gt;\r
-        &lt;h3&gt;Subsection b&lt;/h3&gt;\r
-      &lt;/section&gt;\r
-    &lt;/section&gt;\r
-    &lt;section&gt;\r
-      &lt;h2&gt;Section III&lt;/h2&gt;\r
-      &lt;section&gt;\r
-        &lt;h3&gt;Subsection a&lt;/h3&gt;\r
-      &lt;/section&gt;\r
-    &lt;/section&gt;\r
-  &lt;/article&gt;\r
-&lt;/main&gt;\r
-&lt;footer&gt;\r
-  &lt;section&gt;\r
-    &lt;h3&gt;Footer&lt;/h3&gt;\r
-  &lt;/section&gt;\r
-&lt;/footer&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 10: Outline</h4> \r
-<ol>\r
-  <li>\r
-    <em>Untitled BODY</em>\r
-    <ol>\r
-      <li>Main</li>\r
-      <li>\r
-        Article\r
-        <ol>\r
-          <li>Section I</li>\r
-          <li>\r
-            Section II\r
-            <ol>\r
-              <li>Subsection a</li>\r
-              <li>Subsection b</li>\r
-            </ol>\r
-          </li>\r
-          <li>\r
-            Section III\r
-            <ol>\r
-              <li>Subsection a</li>\r
-            </ol>\r
-          </li>\r
-        </ol>\r
-      </li>\r
-      <li>Footer</li>\r
-    </ol>\r
-  </li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-10.html">View Example 10</a>\r
-</p>\r
-</div>\r
-</div>\r
-<p>\r
-So far, so good.\r
-But what about the untitled body?\r
-We forgot about the single root of any outline, that is defined by the body, how we learned back in <a href="#step-01" title="Jump back to step 1, if you do not remember...">step 1</a>. As shown in <a href="#example-05" title="Revisit example 5">example 05</a>, we can simply name that by putting a heading outside and before any element, that defines a section:\r
-</p>\r
-<div id="example-11" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 11: Markup</h4>\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;!DOCTYPE html&gt;\r
-&lt;title&gt;Example 11&lt;/title&gt;\r
-&lt;header&gt;\r
-  &lt;h2&gt;Page&lt;/h2&gt;\r
-  &lt;section&gt;\r
-    &lt;h3&gt;Header&lt;/h3&gt;\r
-  &lt;/section&gt;\r
-&lt;/header&gt;\r
-&lt;main&gt;\r
-  &lt;article&gt;\r
-    &lt;h1&gt;Article&lt;/h1&gt;\r
-    &lt;section&gt;\r
-      &lt;h2&gt;Section I&lt;/h2&gt;\r
-    &lt;/section&gt;\r
-    &lt;section&gt;\r
-      &lt;h2&gt;Section II&lt;/h2&gt;\r
-      &lt;section&gt;\r
-        &lt;h3&gt;Subsection a&lt;/h3&gt;\r
-      &lt;/section&gt;\r
-      &lt;section&gt;\r
-        &lt;h3&gt;Subsection b&lt;/h3&gt;\r
-      &lt;/section&gt;\r
-    &lt;/section&gt;\r
-    &lt;section&gt;\r
-      &lt;h2&gt;Section III&lt;/h2&gt;\r
-      &lt;section&gt;\r
-        &lt;h3&gt;Subsection a&lt;/h3&gt;\r
-      &lt;/section&gt;\r
-    &lt;/section&gt;\r
-  &lt;/article&gt;\r
-&lt;/main&gt;\r
-&lt;footer&gt;\r
-  &lt;section&gt;\r
-    &lt;h3&gt;Footer&lt;/h3&gt;\r
-  &lt;/section&gt;\r
-&lt;/footer&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 11: Outline</h4> \r
-<ol>\r
-  <li>\r
-    <em>Page</em>\r
-    <ol>\r
-      <li>Header</li>\r
-      <li>\r
-        Main\r
-        <ol>\r
-          <li>Section I</li>\r
-          <li>\r
-            Section II\r
-            <ol>\r
-              <li>Subsection a</li>\r
-              <li>Subsection b</li>\r
-            </ol>\r
-          </li>\r
-          <li>\r
-            Section III\r
-            <ol>\r
-              <li>Subsection a</li>\r
-            </ol>\r
-          </li>\r
-        </ol>\r
-      </li>\r
-      <li>Footer</li>\r
-    </ol>\r
-  </li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-11.html">View Example 11</a>\r
-</p>\r
-</div>\r
-</div>\r
-<h3 id="sectioning-elements">Step V: Be Aware, Which Elements Define Sections</h3>\r
-<p>\r
-The eagle-eyed among you might have noticed, that I had "forgotten" the two element-types <code>nav</code> and <code>aside</code>, when we were investigating the elements, that define the logical structure of the page in <a href="#step-2" title="Revisit step 2">step 2</a>.\r
-I did not forgot about these &ndash; I left them out intentionally.\r
-Because otherwise, the results of <a href="#example-07" title="Revisit example 07">example 07</a> would have been too confusing, to made my point about implicit sectioning.\r
-Let us look, what would have happend:\r
-</p>\r
-<div id="example-12" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 12: Markup</h4>\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;!DOCTYPE html&gt;\r
-&lt;title&gt;Example 12&lt;/title&gt;\r
-&lt;header&gt;\r
-  &lt;h1&gt;Page&lt;/h1&gt;\r
-  &lt;nav&gt;&lt;h1&gt;Navigation&lt;/h1&gt;&lt;/nav&gt;\r
-&lt;/header&gt;\r
-&lt;main&gt;&lt;h1&gt;Main&lt;/h1&gt;&lt;/main&gt;\r
-&lt;aside&gt;&lt;h1&gt;Aside&lt;/h1&gt;&lt;/aside&gt;\r
-&lt;footer&gt;&lt;h1&gt;Footer&lt;/h1&gt;&lt;/footer&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 07: Outline</h4> \r
-<ol>\r
-  <li>\r
-    Page\r
-    <ol>\r
-      <li>Navigation</li>\r
-    </ol>\r
-  </li>\r
-  <li>\r
-    Main\r
-    <ol>\r
-      <li>Aside</li>\r
-    </ol>\r
-  </li>\r
-  <li>Footer</li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-12.html">View Example 12</a>\r
-</p>\r
-</div>\r
-</div>\r
-<p>\r
-What is wrong there?\r
-Why are <em>Navigation</em> and <em>Aside</em> showing up as children, albeit we marked up every element with headings of the same rank?\r
-The reason for this is, that <code>nav</code> and <code>aside</code> are sectioning elements:\r
-<div id="example-12" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 12: Markup</h4>\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;!DOCTYPE html&gt;\r
-&lt;title&gt;Example 13&lt;/title&gt;\r
-&lt;header&gt;\r
-  Page\r
-  &lt;nav&gt;Navigation&lt;/nav&gt;\r
-&lt;/header&gt;\r
-&lt;main&gt;Main&lt;/main&gt;\r
-&lt;aside&gt;Aside&lt;/aside&gt;\r
-&lt;footer&gt;Footer&lt;/footer&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 07: Outline</h4> \r
-<ol>\r
-  <li>\r
-    <em>Untitled BODY</em>\r
-    <ol>\r
-      <li><em>Untitled NAV</em></li>\r
-      <li><em>Untitled ASIDE</em></li>\r
-    </ol>\r
-  </li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-13.html">View Example 13</a>\r
-</p>\r
-</div>\r
-</div>\r
-<p>\r
-The HTML5 spec defines four <a href="http://www.w3.org/WAI/GL/wiki/Using_HTML5_section_elements" title="Read about the intended use of these sectioning elements">sectioning elements</a>: <code>article</code>, <code>section</code>, <code>nav</code> and <code>aside</code>!\r
-Some explain the confusion about this fact with the constantly evolving standard, that leads to <a href="http://www.smashingmagazine.com/2013/01/18/the-importance-of-sections/#cad-middle" title="Jump to this rather lame excuse in an otherwise great article">structurally unclear specifications</a>.\r
-I will be frank:\r
-<em>I cannot imagine any good reason for this decision!</em>\r
-In my opinion, the concept would be much clearer, if <code>article</code> and <code>section</code> would be the only two sectioning elements and <code>nav</code> and <code>aside</code> would only define the logical structure of the page, like <code>header</code> and <code>footer</code>.\r
-<h2>Putting It All Together</h2>\r
-<p>\r
-Knowing, that <code>nav</code> and <code>aside</code> will define sections, we now can complete our outline skillfully avoiding the appearance of untitled sections:\r
-</p>\r
-<div id="example-14" class="cf">\r
-<div  style="width: 60%; float:left;">\r
-<h4>Example 14: Markup</h4>\r
-<pre class="prettyprint linenums"><code class="html">\r
-&lt;!DOCTYPE html&gt;\r
-&lt;title&gt;Example 14&lt;/title&gt;\r
-&lt;header&gt;\r
-  &lt;h2&gt;Page&lt;/h2&gt;\r
-  &lt;section&gt;\r
-    &lt;h3&gt;Header&lt;/h3&gt;\r
-    &lt;nav&gt;&lt;h4&gt;Navigation&lt;/h4&gt;&lt;/nav&gt;\r
-  &lt;/section&gt;\r
-&lt;/header&gt;\r
-&lt;main&gt;\r
-  &lt;article&gt;\r
-    &lt;h1&gt;Main&lt;/h1&gt;\r
-    &lt;section&gt;\r
-      &lt;h2&gt;Section I&lt;/h2&gt;\r
-    &lt;/section&gt;\r
-    &lt;section&gt;\r
-      &lt;h2&gt;Section II&lt;/h2&gt;\r
-      &lt;section&gt;\r
-        &lt;h3&gt;Subsection a&lt;/h3&gt;\r
-      &lt;/section&gt;\r
-      &lt;section&gt;\r
-        &lt;h3&gt;Subsection b&lt;/h3&gt;\r
-      &lt;/section&gt;\r
-    &lt;/section&gt;\r
-    &lt;section&gt;\r
-      &lt;h2&gt;Section III&lt;/h2&gt;\r
-      &lt;section&gt;\r
-        &lt;h3&gt;Subsection a&lt;/h3&gt;\r
-      &lt;/section&gt;\r
-    &lt;/section&gt;\r
-  &lt;/article&gt;\r
-&lt;/main&gt;\r
-&lt;aside&gt;&lt;h3&gt;Aside&lt;/h3&gt;&lt;/aside&gt;\r
-&lt;footer&gt;\r
-  &lt;section&gt;\r
-    &lt;h3&gt;Footer&lt;/h3&gt;\r
-  &lt;/section&gt;\r
-&lt;/footer&gt;\r
-</code></pre>\r
-</div>\r
-<div style="width:35%; margin-left:5%; float:left;">\r
-<h4>Example 14: Outline</h4> \r
-<ol>\r
-  <li>\r
-    <em>Page</em>\r
-    <ol>\r
-      <li>\r
-        Header\r
-        <ol>\r
-          <li>Navigation</li>\r
-        </ol>\r
-      </li>\r
-      <li>\r
-        Main\r
-        <ol>\r
-          <li>Section I</li>\r
-          <li>\r
-            Section II\r
-            <ol>\r
-              <li>Subsection a</li>\r
-              <li>Subsection b</li>\r
-            </ol>\r
-          </li>\r
-          <li>\r
-            Section III\r
-            <ol>\r
-              <li>Subsection a</li>\r
-            </ol>\r
-          </li>\r
-        </ol>\r
-      </li>\r
-      <li>Aside</li>\r
-      <li>Footer</li>\r
-    </ol>\r
-  </li>\r
-</ol>\r
-<p>\r
-  <a href="/wp-uploads/2015/06/example-14.html">View Example 14</a>\r
-</p>\r
-</div>\r
-</div>\r
-<p>\r
-<em>Et voilà: Our Perfect Outline!</em>\r
-</p>\r
-<p>\r
-If you memorize the concepts, that you have learned in this little tutorial, you should now be able to mark up your documents to generate <em>your perfect outline</em>...\r
-</p>\r
-<p>\r
-...but: one last word about headings:\r
-</p>\r
-<h2>A Word On The Ranks Of The Headings</h2>\r
-<p>\r
-It is crucial to note, that <a href="http://www.paciellogroup.com/blog/2013/10/html5-document-outline/" title="Read, why it may be dangerous, to miss that it is not yet real">the new outline-algorithm still is a fiction</a>: most user agents do not implement the algorithm yet.\r
-Hence, you still should stick to the old <a href="https://dequeuniversity.com/assets/html/jquery-summit/html5/slides/headings.html" title="Tipps, how to create a logical outline of your document the old way">hints for keeping your content accessible</a> and point out the most important heading to the search engines.\r
-</p>\r
-<p>\r
-But there is no reason, not to apply the new possibilities shown in this article to your markup: it will only make it more feature-proof.\r
-It is very likely, that <a href="http://html5doctor.com/html5-seo-search-engine-optimisation/" title="Read more about, what search engines already pick up from the new fruits, that HTML5 has to offer">search engines will start to adopt the HTML5 outline algorithm</a>, to make more sense out of your content in near feature - or are already doing so...\r
-So, why not be one of the first, to gain from that new technique.\r
-</p>\r
-<p>\r
-<em>I would advise you, to adopt the new possibilities to section your content and generate a sensible outline, while still keeping the old heading ranks to be backward compatible.</em>\r
-</p>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[This small tutorial will show you with the help of some working examples, how to use the new semantic markup, so that the HTML5 outline algorithm will produce a sensible table of content for your page.]]></excerpt:encoded>
-               <wp:post_id>357</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-24 00:42:06]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-23 22:42:06]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[a-perfect-outline]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="html5"><![CDATA[HTML(5)]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>58167</wp:comment_id>
-                       <wp:comment_author><![CDATA[bijibuji]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[bijibuji@yahoo.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[5.115.15.228]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2019-04-18 18:56:45]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2019-04-18 16:56:45]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[What is the exact use case of "Page" &amp; "Main" titles according to a single blog page. Is "Page" the website name or the single blog title? What about "Main"? Also how do you deal with starting the page with an  heading as it is not valid (using W3C validator tells you that you have a missing  in your heading-level outline)]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1558691886.9282429;s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1555606605.820214;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>61251</wp:comment_id>
-                       <wp:comment_author><![CDATA[Izhari Ishak Aksa]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[izharishaksa@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://www.izharishaksa.com</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[103.54.0.2]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2020-04-10 11:53:39]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2020-04-10 09:53:39]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[I think main navigation should be right below the page. Furthermore each section could also have their own navigation. For example in a product page there could navigation for specs, reviews, description etc.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1588338140.186213;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1586512419.185527;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Configure pac4j for a Social-Login along with a Spring-Security based Form-Login</title>
-               <link>https://juplo.de/configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login/</link>
-               <pubDate>Sun, 28 Jun 2015 11:15:47 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=462</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>The Problem &ndash; What will be explained</h2>\r
-<p>\r
-If you just want to enable your spring-based webapplication to let users log in with their social accounts, without changing anything else, <a href="http://www.pac4j.org/#1" title="The authentication solution for java">pac4j</a> should be your first choice.\r
-But the <a href="https://github.com/pac4j/spring-security-pac4j-demo" title="Clone the examples on GitHub">provided example</a> only shows, how to define all authentication mechanisms via pac4j.\r
-If you already have set up your log-in via spring-security, you have to reconfigure it with the appropriate pac4j-mechanism.\r
-That is a lot of unnecessary work, if you just want to supplement the already configured log in with the additionally possibility, to log in via a social provider.\r
-</p>\r
-<p>\r
-In this short article, I will show you, how to set that up along with the normal <a href="http://docs.spring.io/spring-security/site/docs/4.0.1.RELEASE/reference/htmlsingle/#ns-form-and-basic" title="Read, how to set up the form-based login of Spring-Security">form-based login of Spring-Security</a>.\r
-I will show this for a Login via Facabook along the Form-Login of Spring-Security.\r
-The method should work as well for <a href="https://github.com/pac4j/spring-security-pac4j#providers-supported" title="See a list of all login-mechanisms, supported by spring-security-pac4j">other social logins, that are supported by spring-security-pac4j</a>, along other login-mechanisms provided by spring-security out-of-the-box.\r
-</p>\r
-<p>\r
-In this article I will not explain, how to store the user-profile-data, that was retrieved during the social login.\r
-Also, if you need more social interaction, than just a login and access to the default data in the user-profile you probably need <a href="http://projects.spring.io/spring-social/" title="Homepage of the spring-social project">spring-social</a>. How to combine spring-social with spring-security for that purpose, is explained in this nice article about how to <a href="http://www.petrikainulainen.net/programming/spring-framework/adding-social-sign-in-to-a-spring-mvc-web-application-configuration/" title="Read this article about how to integrate spring-security with spring-social">add social sign in to a spring-mvc weba-pplication</a>.\r
-</p>\r
-<h2>Adding the Required Maven-Artifacts</h2>\r
-<p>\r
-In order to use spring-security-pac4j to login to facebook, you need the following maven-artifacts:\r
-</p>\r
-<pre class="prettyprint linenums"><code class="xml">\r
-&lt;dependency&gt;\r
-  &lt;groupId&gt;org.pac4j&lt;/groupId&gt;\r
-  &lt;artifactId&gt;spring-security-pac4j&lt;/artifactId&gt;\r
-  &lt;version&gt;1.2.5&lt;/version&gt;\r
-&lt;/dependency&gt;\r
-&lt;dependency&gt;\r
-  &lt;groupId&gt;org.pac4j&lt;/groupId&gt;\r
-  &lt;artifactId&gt;pac4j-http&lt;/artifactId&gt;\r
-  &lt;version&gt;1.7.1&lt;/version&gt;\r
-&lt;/dependency&gt;\r
-&lt;dependency&gt;\r
-  &lt;groupId&gt;org.pac4j&lt;/groupId&gt;\r
-  &lt;artifactId&gt;pac4j-oauth&lt;/artifactId&gt;\r
-  &lt;version&gt;1.7.1&lt;/version&gt;\r
-&lt;/dependency&gt;\r
-</code></pre>\r
-\r
-<h2>Configuration of Spring-Security (Without Social Login via pac4j)</h2>\r
-<p>\r
-This is a bare minimal configuration to get the form-login via Spring-Security working:\r
-</p>\r
-<pre class="prettyprint linenums"><code class="xml">\r
-&lt;?xml version="1.0" encoding="UTF-8"?&gt;\r
-&lt;beans\r
-    xmlns="http://www.springframework.org/schema/beans"\r
-    xmlns:security="http://www.springframework.org/schema/security"\r
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-    xsi:schemaLocation="\r
-      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\r
-      http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd\r
-    "&gt;\r
-\r
-  &lt;security:http use-expressions="true"&gt;\r
-    &lt;security:intercept-url pattern="/**" access="permitAll"/&gt;\r
-    &lt;security:intercept-url pattern="/home.html" access="isAuthenticated()"/&gt;\r
-    &lt;security:form-login login-page="/login.html" authentication-failure-url="/login.html?failure"/&gt;\r
-    &lt;security:logout/&gt;\r
-    &lt;security:remember-me/&gt;\r
-  &lt;/security:http&gt;\r
-\r
-  &lt;security:authentication-manager&gt;\r
-    &lt;security:authentication-provider&gt;\r
-      &lt;security:user-service&gt;\r
-       &lt;security:user name="user" password="user" authorities="ROLE_USER" /&gt;\r
-      &lt;/security:user-service&gt;\r
-    &lt;/security:authentication-provider&gt;\r
-  &lt;/security:authentication-manager&gt;\r
-\r
-&lt;/beans&gt;\r
-</code></pre>\r
-<p>\r
-The <code>http</code> defines, that the access to the url <code>/home.html</code> is restriced and must be authenticated via a form-login on url <code>/login.html</code>.\r
-The <code>authentication-manager</code> defines an in-memory authentication-provider for testing purposes with just one user (username: <code>user</code>, password: <code>user</code>).\r
-For more details, see the <a href="http://docs.spring.io/spring-security/site/docs/4.0.1.RELEASE/reference/htmlsingle/#ns-form-and-basic" title="Read more about the available configuration-parameters in the spring-security documentation">documentation of spring-security</a>.\r
-</p>\r
-<h2>Enabling pac4j via spring-security-pac4j alongside</h2>\r
-<p>\r
-To enable pac4j alongside, you have to add/change the following:\r
-</p>\r
-<pre class="prettyprint linenums"><code class="xml">\r
-&lt;?xml version="1.0" encoding="UTF-8"?&gt;\r
-&lt;beans\r
-    xmlns="http://www.springframework.org/schema/beans"\r
-    xmlns:security="http://www.springframework.org/schema/security"\r
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-    xsi:schemaLocation="\r
-      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd\r
-      http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd\r
-    "&gt;\r
-\r
-  &lt;security:http use-expressions="true"&gt;\r
-    &lt;security:custom-filter position="OPENID_FILTER" ref="clientFilter"/&gt;\r
-    &lt;security:intercept-url pattern="/**" access="permitAll()"/&gt;\r
-    &lt;security:intercept-url pattern="/home.html" access="isAuthenticated()"/&gt;\r
-    &lt;security:form-login login-page="/login.html" authentication-failure-url="/login.html?failure"/&gt;\r
-    &lt;security:logout/&gt;\r
-  &lt;/security:http&gt;\r
-\r
-  &lt;security:authentication-manager alias="authenticationManager"&gt;\r
-    &lt;security:authentication-provider&gt;\r
-      &lt;security:user-service&gt;\r
-       &lt;security:user name="user" password="user" authorities="ROLE_USER" /&gt;\r
-      &lt;/security:user-service&gt;\r
-    &lt;/security:authentication-provider&gt;\r
-    &lt;security:authentication-provider ref="clientProvider"/&gt;\r
-  &lt;/security:authentication-manager&gt;\r
-\r
-  &lt;!-- entry points --&gt;\r
-  &lt;bean id="facebookEntryPoint" class="org.pac4j.springframework.security.web.ClientAuthenticationEntryPoint"&gt;\r
-    &lt;property name="client" ref="facebookClient"/&gt;\r
-  &lt;/bean&gt;\r
-\r
-  &lt;!-- client definitions --&gt;\r
-  &lt;bean id="facebookClient" class="org.pac4j.oauth.client.FacebookClient"&gt;\r
-    &lt;property name="key" value="145278422258960"/&gt;\r
-    &lt;property name="secret" value="be21409ba8f39b5dae2a7de525484da8"/&gt;\r
-  &lt;/bean&gt;\r
-  &lt;bean id="clients" class="org.pac4j.core.client.Clients"&gt;\r
-    &lt;property name="callbackUrl" value="http://localhost:8080/callback"/&gt;\r
-    &lt;property name="clients"&gt;\r
-      &lt;list&gt;\r
-        &lt;ref bean="facebookClient"/&gt;\r
-      &lt;/list&gt;\r
-    &lt;/property&gt;\r
-  &lt;/bean&gt;\r
-\r
-  &lt;!-- common to all clients --&gt;\r
-  &lt;bean id="clientFilter" class="org.pac4j.springframework.security.web.ClientAuthenticationFilter"&gt;\r
-    &lt;constructor-arg value="/callback"/&gt;\r
-    &lt;property name="clients" ref="clients"/&gt;\r
-    &lt;property name="sessionAuthenticationStrategy" ref="sas"/&gt;\r
-    &lt;property name="authenticationManager" ref="authenticationManager"/&gt;\r
-  &lt;/bean&gt;\r
-  &lt;bean id="clientProvider" class="org.pac4j.springframework.security.authentication.ClientAuthenticationProvider"&gt;\r
-    &lt;property name="clients" ref="clients"/&gt;\r
-  &lt;/bean&gt;\r
-  &lt;bean id="httpSessionRequestCache" class="org.springframework.security.web.savedrequest.HttpSessionRequestCache"/&gt;\r
-  &lt;bean id="sas" class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy"/&gt;\r
-\r
-&lt;/beans&gt;\r
-</code></pre>\r
-<p>\r
-In short:\r
-</p>\r
-<ol>\r
-<li>\r
-You have to add an additional filter in <code>http</code>.\r
-I added this filter on position <code>OPENID_FILTER</code>, because pac4j introduces a unified way to handle OpenID and OAuth and so on.\r
-If you are using the OpenID-mechanism of spring-security, you have to use another position in the filter-chain (for example <code>CAS_FILTER</code>) or reconfigure OpenID to use the pac4j-mechanism, which should be fairly straight-forward.\r
-<br />\r
-The new Filter has the ID <code>clientFilter</code> and needs a reference to the <code>authenticationManager</code>.\r
-Also, the callback-URL (here: <code>/callback</code>) must be mapped to your web-application!\r
-</li>\r
-<li>\r
-You have to add an additional <code>authentication-provider</code> to the <code>authentication-manager</code>, that references your newly defined pac4j-ClientProvider (<code>clientProvider</code>).\r
-</li>\r
-<li>\r
-You have to configure your entry-points as pac4j-clients.\r
-In the example above, only one pac4j-client, that authenticats the user via Facebook, is configured.\r
-You easily can add more clients: just copy the definitions from the <a href="https://github.com/pac4j/spring-security-pac4j-demo" title="Browse the source of that example on GitHub">spring-security-pac4j example</a>.\r
-</li>\r
-</ol>\r
-<p>\r
-That should be all, that is necessary, to enable a Facebook-Login in your Spring-Security web-application.\r
-</p>\r
-<h2>Do Not Forget To Use Your Own APP-ID!</h2>\r
-<p>\r
-The App-ID <code>145278422258960</code> and the accompanying secret <code>be21409ba8f39b5dae2a7de525484da8</code> were taken from the <a href="https://github.com/pac4j/spring-security-pac4j-demo" title="Browse the source of that example on GitHub">spring-security-pac4j example</a> for simplicity.\r
-That works for a first test-run on <code>localhost</code>.\r
-<em>But you have to replace that with your own App-ID and -scecret, that you have to generate using <a href="https://developers.facebook.com/apps" title="You can generate your own apps on your App Dashboard">your App Dashboard on Facebook</a>!</em>\r
-</p>\r
-<h2>More to come...</h2>\r
-<p>\r
-This short article does not show, how to save the retrieved user-profiles in your user-database, if you need that.\r
-I hope, I will write a follow-up on that soon.\r
-In short:\r
-pac4j creates a Spring-Security <code>UserDetails</code>-Instance for every user, that was authenticated against it.\r
-You can use this, to access the data in the retrieved user-profile (for example to write out the name of the user in a greeting or contact him via e-mail).\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>462</wp:post_id>
-               <wp:post_date><![CDATA[2015-06-28 13:15:47]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-06-28 11:15:47]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[configure-pac4j-for-a-social-login-along-with-a-spring-security-based-form-login]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="facebook"><![CDATA[Facebook]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="oauth2"><![CDATA[oauth2]]></category>
-               <category domain="category" nicename="spring"><![CDATA[Spring]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>50844</wp:comment_id>
-                       <wp:comment_author><![CDATA[Jérôme LELEU]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[leleuj@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://www.pac4j.org</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[82.232.204.3]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-09-23 17:24:58]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-09-23 15:24:58]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thanks for the tutorial.\r
-\r
-spring-security-pac4j v1.3 is now based on Spring Security v4.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1443021898.0557239;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1443807264.0149059;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>53056</wp:comment_id>
-                       <wp:comment_author><![CDATA[Pascal]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[pnueesch@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[212.25.0.228]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-03-11 15:20:10]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-03-11 13:20:10]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[And how can I trigger the facebookEntryPoint with a "Facebook Login"-button on the login form page?\r
-\r
-Thanks]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1457702410.4230311;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1459082388.0643201;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>53556</wp:comment_id>
-                       <wp:comment_author><![CDATA[Zamir]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[zgarcia83@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[122.59.213.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-06-26 10:40:45]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-06-26 08:40:45]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[I've followed all instructions, but it doesn't intercept any URL. It doesn't show any error.\r
-\r
-Can anyone help me?]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1466930445.4435151;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1469712648.5964;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Bypassing the Same-Origin-Policy For Local Files During Development</title>
-               <link>https://juplo.de/bypassing-the-same-origin-policiy-for-loal-files-during-development/</link>
-               <pubDate>Tue, 25 Aug 2015 15:16:32 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=481</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>downloadable font: download failed ...: status=2147500037</h2>\r
-<p>\r
-Are you ever stumbled accross weired errors with font-files, that could not be loaded, or SVG-graphics, that are not shown during local development on your machine using <code>file:///</code>-URI's, though everything works as expected, if you push the content to a webserver and access it via HTTP?\r
-Furthermore, the browsers behave very differently here.\r
-Firefox, for example, just states, that the download of the font failed:\r
-</p>\r
-<pre class="prettyprint linenums">\r
-<code class="bash">\r
-downloadable font: download failed (font-family: "XYZ" style:normal weight:normal stretch:normal src index:0): status=2147500037 source: file:///home/you/path/to/font/xyz.woff\r
-</code></pre>\r
-<p>\r
-Meanwhile, Chrome just happily uses the same font.\r
-Considering the SVG-graphics, that are not shown, Firefox just does not show them, like it would not be able to at all.\r
-Chrome logs an error:\r
-</p>\r
-<pre class="prettyprint linenums">\r
-<code class="bash">\r
-Unsafe attempt to load URL file:///home/you/path/to/project/img/sprite.svg#logo from frame with URL file:///home/you/path/to/project/templates/layout.html. Domains, protocols and ports must match</code>\r
-</code></pre>\r
-<p>\r
-...though, no protocol, domain or port is involved.\r
-</p>\r
-\r
-<h2>The Same-Origin Policy</h2>\r
-<p>\r
-The reason for this strange behavior is the <a href="https://en.wikipedia.org/wiki/Same-origin_policy" title="Read more about the Same-origin policy on wikipedia">Same-origin policy</a>.\r
-Chrome gives you a hint in this direction with the remark that something does not match.\r
-I found the trail, that lead me to this explanation, while <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=760436" title="Read the bug-entry, that explains the meaning of the error-message">googling for the strange error message</a>, that Firefox gives for the fonts, that can not be loaded.\r
-</p>\r
-<p>\r
-<em>\r
-The Same-origin policy forbids, that locally stored files can access any data, that is stored in a parent-directory.\r
-They only have access to files, that reside in the same directory or in a directory beneath it.\r
-</em>\r
-</p>\r
-<p>\r
-You can read more about that rule on <a href="https://developer.mozilla.org/en-US/docs/Same-origin_policy_for_file%3A_URIs" title="Same-origin policy for file: URIs">MDN</a>.\r
-</p>\r
-<p id="my-case">\r
-I often violate that rule, when developing templates for dynamically rendered pages with <a href="http://www.thymeleaf.org/" title="Read more about the XML/XHTML/HTML5 template engine Thymeleaf">Thymeleaf</a>, or similar techniques.\r
-That is, because I like to place the template-files on a subdirectory of the directory, that contains my webapp (<code>src/main/webapp</code> with Maven):\r
-</p>\r
-<pre>\r
-<code>\r
-+ src/main/webapp/\r
-  + css/\r
-  + img/\r
-  + fonts/\r
-  + thymeleaf/templates/\r
-</code>\r
-</pre>\r
-<p>\r
-I packed a simple example-project for developing static templates with <a href="http://lesscss.org/" title="Read more about less">LESS</a>, <a href="https://nodejs.org/" title="Read more about nodejs">nodejs</a> and <a href="http://gruntjs.com/" title="Read more about grunt">grunt</a>, that shows the problem and the <a href="#quick-solution" title="Jump to the quick solution for Firefox">quick solution for Firefox</a> presented later.\r
-You can browse it on my <a href="http://juplo.de/gitweb/?p=examples/template-development;a=tree;h=1.0.3;hb=1.0.3" title="Browse the example-project on juplo.de/gitweb">juplo.de/gitweb</a>, or clone it with:\r
-</p>\r
-<pre class="prettyprint linenums">\r
-<code class="bash">\r
-git clone http://juplo.de/git/examples/template-development\r
-</code></pre>\r
-<h2>Cross-Browser Solution</h2>\r
-Unfortunately, there is no simple cross-browser solution, if you want to access your files through <code>file:///</code>-URI's during development.\r
-The only real solution is, to access your files through the HTTP-protocol, like in production.\r
-If you do not want to do that, the only two cross-browser solutions are, to\r
-</p>\r
-<ol>\r
- <li>\r
-  turn of the Same-origin policy for local files in all browsers, or\r
- </li>\r
- <li>\r
-  rearrange your files in such a way, that they do not violate the Same-origin policy (as a rule, all resources linked in a HTML-file must reside in the same directory as the file, or beneath it).\r
- </li>\r
-</ol>\r
-<p>\r
-The only real cross-browser solution is to circumvent the problem altogether and serve the content with a local webserver, so that you can access it through HTTP, like in production.\r
-You can <a href="http://juplo.de/serve-static-html-with-nodjs-and-grunt/" title="Read the article 'Serving Static HTML With Nodjs And Grunt For Template-Development'">read how to extend the example-project mentioned above to achieve that goal</a> in a follow up article.\r
-</p>\r
-<h2>Turn Of Security</h2>\r
-<p>\r
-Turning of the Same-origin policy is not recommended.\r
-I would only do that, if you only use your browser, to access the HTML-files under development &dash; which I doubt, that it is the case.\r
-Anyway, this is a good quick test to validate, that the Same-origin policy is the source of your problems &dash; if you quickly re-enable it after the validation.\r
-</p>\r
-<dl>\r
- <dt>Firefox:</dt>\r
- <dd>\r
-  Set <code>security.fileuri.strict_origin_policy</code> to <code>false</code> on the <a href="about:config">about:config</a>-page.\r
- </dd>\r
- <dt>Chrome:</dt>\r
- <dd>\r
-  Restart Chrome with <code>--disable-web-security</code> or <code>--allow-file-access-from-files</code> (for more, see this <a href="http://stackoverflow.com/questions/3102819/disable-same-origin-policy-in-chrome" title="Read more on how to turn of the Same-origin policy in chrome">question on Stackoverflow)</a>.\r
- </dd>\r
-</dl>\r
-\r
-<h2 id="quick-solution">Quick Fix For Firefox</h2>\r
-<p>\r
-If you develop with Firefox, there is a quick fix, to bypass the Same-origin policy for local files.\r
-</p>\r
-<p>\r
-As the <a href="https://developer.mozilla.org/en-US/docs/Same-origin_policy_for_file%3A_URIs" title="Read the explanation on MDM">explanation on MDM</a> stats, a file loaded in a frame shares the same origin as the file, that contains the frameset.\r
-This can be used to bypass the policy, if you place a file with a frameset in the topmost directory of your development-folder and load the template under development through that file.\r
-</p>\r
-<p>\r
-In <a href="#my-case" title="See the directory-tree I use this frameset with">my case</a>, the frameset-file looks like this:\r
-</p>\r
-<pre class="prettyprint linenums">\r
-<code class="html">\r
-&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd"&gt;\r
-&lt;html&gt;\r
-  &lt;head&gt;\r
-    &lt;meta http-equiv="content-type" content="text/html; charset=utf-8"&gt;\r
-    &lt;title&gt;Frameset to Bypass Same-Origin-Policy</title>\r
-  &lt;/head&gt;\r
-  &lt;frameset&gt;\r
-    &lt;frame src="thymeleaf/templates/layout.html"&gt;\r
-  &lt;/frameset&gt;\r
-&lt;/html&gt;\r
-</code></pre>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>481</wp:post_id>
-               <wp:post_date><![CDATA[2015-08-25 17:16:32]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-08-25 15:16:32]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[bypassing-the-same-origin-policiy-for-loal-files-during-development]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="css"><![CDATA[CSS]]></category>
-               <category domain="category" nicename="grunt"><![CDATA[grunt]]></category>
-               <category domain="category" nicename="html5"><![CDATA[HTML(5)]]></category>
-               <category domain="category" nicename="less"><![CDATA[less]]></category>
-               <category domain="category" nicename="nodejs"><![CDATA[nodejs]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Serving Static HTML With Nodjs And Grunt For Template-Development</title>
-               <link>https://juplo.de/serve-static-html-with-nodjs-and-grunt/</link>
-               <pubDate>Tue, 25 Aug 2015 17:22:39 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=500</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>A Simple Nodejs/Grunt-Development-Environment for static HTML-Templates</h2>\r
-<p>\r
-Nowadays, <a href="https://en.wikipedia.org/wiki/Front_end_development" title="Read more about frontend-development">frontend-development</a> is mostly done with <a href="https://nodejs.org/" title="Read more about Nodjs">Nodjs</a> and <a href="http://gruntjs.com/" title="Read more about grunt">Grunt</a>.\r
-On <a href="https://www.npmjs.com/" title="Read more about npm">npm</a>, there are plenty of useful plugin's, that ease the development of HTML and CSS.\r
-For example <a href="https://www.npmjs.com/package/grunt-contrib-less" title="Read the description of the plugin on npm">grunt-contrib-less</a> to automate the compilation of <a href="http://lesscss.org/" title="Read more about LESS">LESS</a>-sourcecode to CSS, or <a href="https://www.npmjs.com/package/grunt-svgstore" title="Read the description of the plugin on npm">grunt-svgstore</a> to pack several SVG-graphics in a single SVG-sprite.\r
-</p>\r
-<p>\r
-Because of that, I decided to switch to Nodejs and Grunt to develop the HTML- and CSS-Markup for the templates, that I need for my <a href="http://projects.spring.io/spring-framework/" title="Read more about the spring-framework">Spring</a>/<a href="http://www.thymeleaf.org/" title="Read more about the XML/XHTML/HTML5 template engine Thymeleaf">Thymeleaf</a>-Applications.\r
-But as with everything new, I had some hard work, to plug together what I needed.\r
-In this article I want to share, how I have set up a really minimalistic, but powerful development-environment for static HTML-templates, that suites all of my initial needs.\r
-</p>\r
-<p>\r
-This might not be the best solutions, but it is a good starting point for beginners like me and it is here to be improved through your feedback!\r
-</p>\r
-<p>\r
-You can browse the example-development-environment on <a href="http://juplo.de/gitweb/?p=examples/template-development;a=tree;h=1.0.3;hb=1.0.3" title="Browse the example development-environment on juplo.de/gitweb">juplo.de/gitweb</a>, or clone it with:\r
-<pre class="prettyprint linenums">\r
-<code class="bash">\r
-git clone http://juplo.de/git/examples/template-development\r
-</code></pre>\r
-<p>\r
-After <a href="https://docs.npmjs.com/getting-started/installing-node" title="Read how to install npm">installing npm</a> you have to fetch the dependencies with:\r
-</p>\r
-<pre class="prettyprint linenums">\r
-<code class="bash">\r
-npm install\r
-</code></pre>\r
-<p>\r
-Than you can fire up a build with:\r
-</p>\r
-<pre class="prettyprint linenums">\r
-<code class="bash">\r
-grunt\r
-</code></pre>\r
-<p>\r
-...or start a webserver for development with:\r
-<pre class="prettyprint linenums">\r
-<code class="bash">\r
-git run-server\r
-</code></pre>\r
-\r
-<h2>Serving The HTML and CSS For Local Development</h2>\r
-<p>\r
-The hardest part while putting together the development-environment was my need to automatically build the static HTML and CSS after file-changes and serve them via a local webserver.\r
-<a href="/bypassing-the-same-origin-policiy-for-loal-files-during-development/" title="Read the article 'Bypassing the Same-Origin-Policy For Local Files During Development'">As I wrote in an earlier article</a>, I often stumble over problems, that arise from the <a href="https://en.wikipedia.org/wiki/Same-origin_policy" title="Read more about the Same-Origin Policy on wikipedia">Same-origin policy</a> when accessing the files locally through <code>file:///</code>-URI's).\r
-</p>\r
-<p>\r
-I was a bit surprised, that I could not find a simple explanation, how to set up a grunt-task to build the project automatically on file-changes and serve the generated HTML and CSS locally.\r
-That is the main reason, why I am writing this explanation now, in order to fill that gap ;)\r
-</p>\r
-<p>\r
-I realised that goal by implemnting a grunt-task, that spawn's a process that uses the <a href="https://www.npmjs.com/package/http-server" title="Read the description of the plugin on npm">http-server</a> to serve up the files and combine that task with a common watch-task:\r
-</p>\r
-<pre class="prettyprint linenums">\r
-<code class="javascript">\r
-grunt.registerTask('http-server', function() {\r
-\r
-  grunt.util.spawn({\r
-    cmd: 'node_modules/http-server/bin/http-server',\r
-    args: [ 'dist' ],\r
-    opts: { stdio: 'inherit' }\r
-  });\r
-\r
-});\r
-\r
-grunt.registerTask('run-server', [ 'default', 'http-server', 'watch' ]);\r
-</code></pre>\r
-<p>\r
-The rest of the configuration is really pretty self-explaining.\r
-I just put together the pieces I needed for my template development (copy some static HTML and generate CSS from the LESS-sources) and configured <a href="https://www.npmjs.com/package/grunt-contrib-watch" title="Read the description of the plugin on npm">grunt-contrib-watch</a> to rebuild the project automatically, if anything changes.\r
-</p>\r
-<p>\r
-The result is put under <code>dist/</code> and is ready to be included in my Spring/Thymeleaf-Application as it is.\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>500</wp:post_id>
-               <wp:post_date><![CDATA[2015-08-25 19:22:39]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-08-25 17:22:39]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[serve-static-html-with-nodjs-and-grunt]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="css"><![CDATA[CSS]]></category>
-               <category domain="category" nicename="grunt"><![CDATA[grunt]]></category>
-               <category domain="category" nicename="html5"><![CDATA[HTML(5)]]></category>
-               <category domain="category" nicename="less"><![CDATA[less]]></category>
-               <category domain="category" nicename="nodejs"><![CDATA[nodejs]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>49153</wp:comment_id>
-                       <wp:comment_author><![CDATA[Integrating A Maven-Backend- With A Nodjs/Grunt-Fronted-Project | juplo]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[]]></wp:comment_author_email>
-                       <wp:comment_author_url>https://juplo.de/integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project/</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-08-26 13:57:46]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-08-26 11:57:46]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[[&#8230;] I already wrote in a previous article, frontend-development is mostly done with Nodjs and Grunt nowadays. As I am planing to base the [&#8230;]]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[pingback]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1440590266.0441849;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1443807385.3109319;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>49119</wp:comment_id>
-                       <wp:comment_author><![CDATA[Bypassing the Same-Origin-Policy For Local Files During Development | juplo]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[]]></wp:comment_author_email>
-                       <wp:comment_author_url>https://juplo.de/bypassing-the-same-origin-policiy-for-loal-files-during-development/</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-08-25 20:25:28]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-08-25 18:25:28]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[[&#8230;] content with a local webserver, so that you can access it through HTTP, like in production. You can read how to extend the example-project mentioned above to achieve that goal in a follow up [&#8230;]]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[pingback]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1443807396.365309;s:7:"message";s:42:"kai changed the comment status to approved";s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:4:{s:4:"time";d:1440527128.110132;s:7:"message";s:28:"Akismet cleared this comment";s:5:"event";s:9:"check-ham";s:4:"user";s:0:"";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Integrating A Maven-Backend- With A Nodjs/Grunt-Fronted-Project</title>
-               <link>https://juplo.de/integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project/</link>
-               <pubDate>Wed, 26 Aug 2015 11:57:43 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=509</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>Frontend-Development With Nodjs and Grunt</h2>\r
-<p>\r
-As I already wrote in <a href="http://juplo.de/serve-static-html-with-nodjs-and-grunt/" title="Serving Static HTML With Nodjs And Grunt For Template-Development">a previous article</a>, frontend-development is mostly done with <a href="https://nodejs.org/" title="Read more about nodjs">Nodjs</a> and <a href="http://gruntjs.com/" title="Read more about grunt">Grunt</a> nowadays.\r
-As I am planing to base the frontend of my next Spring-Application on <a href="http://getbootstrap.com/" title="Read more about Bootstrap">Bootstrap</a>, I was looking for a way to integrate my backend, which is build using <a href="http://projects.spring.io/spring-framework/" title="Read more about the Springframework">Spring</a> and <a href="http://www.thymeleaf.org/" title="Read more about Thymeleaf">Thymeleaf</a> and managed with Maven, with a frontend, which is based on Bootstrap and, hence, build with Nodjs and Grunt.\r
-</p>\r
-<h2>Integrate The Frontend-Build Into The Maven-Build-Process</h2>\r
-<p>\r
-As I found out, one can integrate a npm-based build into a maven project with the help of the <a href="https://github.com/eirslett/frontend-maven-plugin" title="Read more about the frontend-maven-plugin">frontend-maven-plugin</a>.\r
-This plugin automates the managment of Nodjs and its libraries and ensures that the version of Node and NPM being run is the same in every build environment.\r
-As a backend-developer, you do not have to install any of the frontend-tools manualy.\r
-Because of that, this plugin is ideal to integrate a separately developed frontend into a maven-build, without bothering the backend-developers with details of the frontend-build-process.\r
-</p>\r
-<h2>Seperate The Frontend-Project From The Maven-Based Backend-Project</h2>\r
-<p>\r
-The drawback with this approach is, that the backend- and the frontend-project are tightly coupled.\r
-You can configure the frontend-maven-plugin to use a separate subdirectory as working-directory (for example <code>src/main/frontend</code>) and utilize this to separate the frontend-project in its own repository (for example by using <a href="https://git-scm.com/book/en/v2/Git-Tools-Submodules" title="Read more about how to use git-submodules">the submodule-functions of git</a>).\r
-But the grunt-tasks, that you call in the frontend-project through the frontend-maven-plugin, must be defined in that project.\r
-</p>\r
-<p>\r
-Since I am planing to integrate a &dash; slightly modified &dash; version of Bootstrap as frontend into my project, that would mean that I have to mess around with the configuration of the Bootstrap-project a lot.\r
-But that is not a very good idea, because it hinders upgrades of the Bootstrap-base, because merge-conflicts became more and more likely.\r
-</p>\r
-<p>\r
-So, I decided to program a special <code>Gruntfile.js</code>, that resides in the base-folder of my Maven-project and lets me redefine and call tasks of a separated frontend-project in a subdirectory.\r
-</p>\r
-<h2>Redefine And Call Tasks Of An Included Gruntfile From A Sub-Project</h2>\r
-<p>\r
-As it turned out, there are several npm-plugins for managing and building sub-projects (like <a href="https://www.npmjs.com/package/grunt-subgrunt" title="Read more about the npm-plugin grunt-subgrunt">grunt-subgrunt</a> or <a href="https://www.npmjs.com/package/grunt-recurse" title="Read more about the npm-plugin grunt-recurse">grunt-recurse</a>) or including existing Gruntfiles from sub-projects (like <a href="https://www.npmjs.com/package/grunt-load-gruntfile" title="Read more about the npm-plugin grunt-load-gruntfile">grunt-load-gruntfile</a>), but none of them lets you redefine tasks of the subproject before calling them.\r
-</p>\r
-<p>\r
-I programmed a simple <a href="http://juplo.de/gitweb/?p=examples/maven-grunt-integration;a=blob_plain;f=Gruntfile.js;hb=2.0.0" title="Download the Gruntfile from juplo.de/gitweb">Gruntfile</a>, that lets you do exactly this:\r
-<p>\r
-<pre class="prettyprint linenums">\r
-<code class="javascript">\r
-module.exports = function(grunt) {\r
-\r
-  grunt.loadNpmTasks('grunt-newer');\r
-\r
-  grunt.registerTask('frontend','Build HTML &amp; CSS for Frontend', function() {\r
-    var\r
-    done = this.async(),\r
-    path = './src/main/frontend';\r
-\r
-    grunt.util.spawn({\r
-      cmd: 'npm',\r
-      args: ['install'],\r
-      opts: { cwd: path, stdio: 'inherit' }\r
-    }, function (err, result, code) {\r
-      if (err || code &gt; 0) {\r
-        grunt.fail.warn('Failed installing node modules in "' + path + '".');\r
-      }\r
-      else {\r
-        grunt.log.ok('Installed node modules in "' + path + '".');\r
-      }\r
-\r
-      process.chdir(path);\r
-      require(path + '/Gruntfile.js')(grunt);\r
-      grunt.task.run('newer:copy');\r
-      grunt.task.run('newer:less');\r
-      grunt.task.run('newer:svgstore');\r
-\r
-      done();\r
-    });\r
-  });\r
-\r
-\r
-  grunt.registerTask('default', [ 'frontend' ]);\r
-\r
-};\r
-</code></pre>\r
-<p>\r
-This Gruntfile loads the npm-taks <a href="https://www.npmjs.com/package/grunt-newer" title="Read more about the npm-plugin grunt-newer">grunt-newer</a>.\r
-Then, it registers a grunt-task called <code>frontend</code>, that loads the dependencies of the specified sub-project, read in its Gruntfile and runs redefined versions of the tasks <code>copy</code>, <code>less</code> and <code>svgstore</code>, which are defined in the sub-project.\r
-The sub-project itself does not register grunt-newer itself.\r
-This is done in this parent-project, to demonstrate how to register additional grunt-plugins and redefine tasks of the sub-project without touching it at all.\r
-</p>\r
-<p>\r
-The separated frontend-project can be used by the frontend-team to develop the temlates, needed by the backend-developers, without any knowledge of the maven-project.\r
-The frontend-project is then included into the backend, which is managed by maven, and can be used by the backend-developers without the need to know anything about the techniques that were used to develop the templates.\r
-</p>\r
-<p id="example-project">\r
-The whole example can be browsed at <a href="http://juplo.de/gitweb/?p=examples/maven-grunt-integration;a=tree;h=2.0.0" title="Browse the example on juplo.de/gitweb">juplo.de/gitweb</a> or cloned with:\r
-</p>\r
-<pre class="prettyprint linenums">\r
-<code class="bash">\r
-git clone http://juplo.de/git/examples/maven-grunt-integration\r
-</code></pre>\r
-<p>\r
-Be sure to checkout the tag <code>2.0.0</code> for the corresponding version after the cloning, in case i add more commits to demonstrate other stuff.\r
-Also, you have to init and clone the submodule after checkout:\r
-</p>\r
-<pre class="prettyprint linenums">\r
-<code class="bash">\r
-git submodule init\r
-git submodule update\r
-</code></pre>\r
-<p>\r
-If you run <code>mvn jetty:run</code>, you will notice, that the frontend-maven-plugin will automatically download Nodejs into a the folder <code>node</code> of the parent-project.\r
-Afterwards, the dependencies of the parent-project are downloaded in the folder <code>node_modules</code> of the parent-project and the dpendencies of the sub-project are downloaded in the folder <code>src/main/frontend/node_modules</code> and the sub-project is build automatically in the folder <code>src/main/frontend/dist</code>, which is included into the directory-tree that is served by the <a href="http://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html" title="Read more about the jetty-maven-plugin">jetty-maven-plugin</a>.\r
-</p>\r
-<p>\r
-The sub-project is fully usable standalone to drive the development of the frontend separately.\r
-You can <a href="http://juplo.de/serve-static-html-with-nodjs-and-grunt/" title="Read more about the example development-environment">read more about it in this previous article</a>.\r
-</p>\r
-<h2>Conclusion</h2>\r
-<p>\r
-In this article, I showed how to integrate a separately developed frontend-project into a backend-project managed by Maven.\r
-This enables you to separate the development of the layout and the logic of a classic <a href="http://roca-style.org/" title="Read more about the ROCA principles">ROCA</a>-project nearly totally.\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>509</wp:post_id>
-               <wp:post_date><![CDATA[2015-08-26 13:57:43]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-08-26 11:57:43]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[integrating-a-maven-backend-with-a-nodjsgrunt-fronted-project]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="bootstrap"><![CDATA[Bootstrap]]></category>
-               <category domain="category" nicename="css"><![CDATA[CSS]]></category>
-               <category domain="category" nicename="grunt"><![CDATA[grunt]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="less"><![CDATA[less]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <category domain="category" nicename="nodejs"><![CDATA[nodejs]]></category>
-               <category domain="category" nicename="spring"><![CDATA[Spring]]></category>
-               <category domain="category" nicename="thymeleaf"><![CDATA[Thymeleaf]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>java.lang.Exception: Method XZY should have no parameters</title>
-               <link>https://juplo.de/java-lang-exception-method-xzy-should-have-no-parameters/</link>
-               <pubDate>Sun, 11 Oct 2015 13:59:24 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=535</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Did you ever stumbled across the following error during developing test-cases with <a href="http://junit.org/" title="Visit the homepage of the JUnit-Project">JUnit</a> and <a href="http://jmockit.org/" title="Visit the homepage of the JMockit-Project">JMockit</a>?\r
-</p>\r
-<pre class="prettyprint linenums"><code class="bash">java.lang.Exception: Method XZY should have no parameters\r
-</code></pre>\r
-<p> \r
-Here is the quick and easy fix for it:\r
-<strong>Fix the ordering of the dependencies in your pom.xml. </strong>\r
-The dependency for JMockit has to come first!\r
-</p>\r
-\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>535</wp:post_id>
-               <wp:post_date><![CDATA[2015-10-11 15:59:24]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-10-11 13:59:24]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[java-lang-exception-method-xzy-should-have-no-parameters]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="jmockit"><![CDATA[JMockIt]]></category>
-               <category domain="category" nicename="junit"><![CDATA[JUnit]]></category>
-               <category domain="category" nicename="maven"><![CDATA[Maven]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>52513</wp:comment_id>
-                       <wp:comment_author><![CDATA[Jifar Mekonnen]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[jifarh2@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2015-11-12 15:36:33]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2015-11-12 13:36:33]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[I fixed my pom as you said and it worked! \r
-\r
-Thank you!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1447335393.1247671;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1447337078.065438;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>53717</wp:comment_id>
-                       <wp:comment_author><![CDATA[dz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[dz@email.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[36.110.120.142]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-10-09 10:29:40]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-10-09 08:29:40]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[It works! Thank you!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1476001780.5725031;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1478610256.3738451;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Fix Hot Reload of Thymeleaf-Templates In spring-boot:run</title>
-               <link>https://juplo.de/fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun/</link>
-               <pubDate>Mon, 26 Oct 2015 10:19:45 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=543</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>The Problem: Hot-Reload Of Thymeleaf-Templates Does Not Work, When The Application Is Run With <code>spring-boot:run</code></h2>\r
-<p>\r
-A lot of people seem to have problems with hot reloading of static HTML-ressources when developing a <a href="http://projects.spring.io/spring-boot/#quick-start" title="Learn more about Spring-Boot">Spring-Boot</a> application that uses <a href="http://www.thymeleaf.org/" title="Learn more about Thymeleaf">Thymeleaf</a> as templateing engine with <a href="http://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html" title="Learn more about the spring-boot-maven-plugin"><code>spring-boot:run</code></a>.\r
-There are a lot of tips out there, how to fix that problem:\r
-</p>\r
-<ul>\r
-<li><a href="http://docs.spring.io/spring-boot/docs/current/reference/html/howto-hotswapping.html" title="Read the official guide">The official Hot-Swapping-Guide</a> says, that you just have to add <code>spring.thymeleaf.cache=false</code> in your application-configuration in <code>src/main/resources/application.properties</code>.</li>\r
-<li><a href="http://stackoverflow.com/a/26562302/247276" title="Read the whole suggestion">Some say</a>, that you have to disable caching by setting <code>spring.template.cache=false</code> <strong>and</strong> <code>spring.thymeleaf.cache=false</code> and/or run the application in debugging mode.</li>\r
-<li><a href="http://stackoverflow.com/a/31641587/247276" title="Read the suggestion">Others say</a>, that you have to add a dependency to <code>org.springframework:springloaded</code> to the configuration of the <code>spring-boot-maven-plugin</code>.</li>\r
-<li>There is even a <a href="https://github.com/spring-projects/spring-boot/issues/34" title="Read the whole bug-report on GitHub">bug-report on GitHub</a>, that says, that you have to run the application from your favored IDE.</li>\r
-</ul>\r
-<p>\r
-But none of that fixes worked for me.\r
-Some may work, if I would switch my IDE (I am using Netbeans), but I have not tested that, because I am not willing to switch my beloved IDE because of that issue.\r
-</p>\r
-<h2>The Solution: Move Your Thymeleaf-Templates Back To <code>src/main/webapp</code></h2>\r
-<p>\r
-Fortunatly, I found a simple solution, to fix the issue without all the above stuff.\r
-<strong>You simply have to move your Thymeleaf-Templates back to where they belong (IMHO): <code>src/main/webapp</code> and turn of the caching.</strong>\r
-It is not necessary to run the application in debugging mode and/or from your IDE, nor is it necessary to add the dependency to <code>springloaded</code> or more configuration-switches.\r
-</p>\r
-<p>\r
-To move the templates and disable caching, just add the following to your application configuration in <code>src/main/application.properties</code>:\r
-</p>\r
-<pre class="prettyprint linenums"><code class="properties">spring.thymeleaf.prefix=/thymeleaf/\r
-spring.thymeleaf.cache=false\r
-</code></pre>\r
-<p>\r
-Of course, you also have to move your Thymeaf-Templates from <code>src/main/resources/templates/</code> to <code>src/main/webapp/thymeleaf/</code>.\r
-In my opinion, the templates belong there anyway, in order to have them accessible as normal static HTML(5)-files.\r
-If they are locked away in the classpath you cannot access them, which foils the approach of Thymeleaf, that you can view your templates in a browser as thy are.\r
-</p>\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>543</wp:post_id>
-               <wp:post_date><![CDATA[2015-10-26 12:19:45]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-10-26 10:19:45]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[fix-hot-reload-of-thymeleaf-templates-in-spring-bootrun]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="spring"><![CDATA[Spring]]></category>
-               <category domain="category" nicename="spring-boot"><![CDATA[Spring-Boot]]></category>
-               <category domain="category" nicename="thymeleaf"><![CDATA[Thymeleaf]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>52975</wp:comment_id>
-                       <wp:comment_author><![CDATA[Benny]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[bacta@gmx.net]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[188.194.73.34]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-02-23 19:56:07]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-02-23 17:56:07]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[I understand your point, if you deliver the app as war file, which will deployed inside a tomcat webapp dir.\r
-But what if you want to deliver just a single, runnable jar?\r
-And <code>spring.thymeleaf.cache = false</code> did quite a good job while developing. (using spring boot 1.3.2)\r
-\r
-kind regards]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1456250167.7389159;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1456330495.4416521;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>52855</wp:comment_id>
-                       <wp:comment_author><![CDATA[Jan]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[jan@will-not-give-it-away.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[47.70.67.143]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-01-20 23:35:48]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-01-20 21:35:48]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thank you very much!\r
-Your advice helped me a lot with Netbeans 8.0.2. :-)]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1453325748.321466;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1453332747.9289141;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>52980</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-02-24 18:20:52]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-02-24 16:20:52]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[I am not sure, what you are objecting against.\r
-Does it work with spring boot 1.3.2 without moving the templates? Or do you say, that you do not need your templates to be accessible, when you deliver your app?]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>52975</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1456330852.973918;s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>53154</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Tønder]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@getshop.com]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://www.getshop.com</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[80.213.212.49]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-04-14 18:17:21]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-04-14 16:17:21]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thank you, what I did to solve this issue is to simply set this two lines in the beginning of the main function. (using netbeans too )\r
-\r
-               System.setProperty("spring.template.cache", "false");\r
-               System.setProperty("spring.thymeleaf.cache", "false");]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1460650641.316828;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1464248883.578794;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>55310</wp:comment_id>
-                       <wp:comment_author><![CDATA[Pablo Caviglia]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[pablo.caviglia@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[167.60.26.183]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2018-01-30 01:23:07]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2018-01-29 23:23:07]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[excellent!\r
-after doing every other way to fix it, your way worked at once... sincerely i dont understand why there are so much invalid ways to do it, and yours that's the simplest one no one mentions it...\r
-\r
-Thanks a lot my friend!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1517268187.109889;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1526597911.7903309;s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>53789</wp:comment_id>
-                       <wp:comment_author><![CDATA[Hodglem]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[cory.hartford.1974@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[98.103.214.67]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-11-11 20:36:56]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-11-11 18:36:56]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thank you! Been banging my head on this for hours.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1478889416.554812;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1478969030.2549829;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>60433</wp:comment_id>
-                       <wp:comment_author><![CDATA[no]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[no@name.com]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://reergymerej.github.io/</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[50.225.245.66]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2019-12-10 19:41:08]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2019-12-10 17:41:08]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[December 2019, still works.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1575999668.983395;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1576059616.691936;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>61382</wp:comment_id>
-                       <wp:comment_author><![CDATA[Konstantin]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[konstantinProskurnya@ya.ru]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[188.234.89.124]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2020-05-01 14:06:13]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2020-05-01 12:06:13]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Best solution ever!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1588334773.105209;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1588338089.502033;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>How To Keep The Time-Zone When Deserializing A ZonedDateTime With Jackson</title>
-               <link>https://juplo.de/how-to-keep-the-time-zone-when-deserializing-a-zoneddatetime-with-jackson/</link>
-               <pubDate>Thu, 12 Nov 2015 15:12:05 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=554</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>The Problem: Jackson Loses The Time-Zone During Dezerialization Of A ZonedDateTime</h2>\r
-<p>\r
-In its default configuration <a href="http://wiki.fasterxml.com/JacksonHome" title="Visit the homepage of the Jackson-project">Jackson</a> adjusts the time-zone of a <code>ZonedDateTime</code> to the time-zone of the local context.\r
-As, by default, the time-zone of the local context is not set and has to be configured manually, Jackson adjusts the time-zone to GMT.\r
-</p>\r
-<p>\r
-This behavior is very unintuitive and not well documented.\r
-<a href="http://stackoverflow.com/questions/19460004/jackson-loses-time-offset-from-dates-when-deserializing-to-jodatime/33674296" title="Read this question on Stackoverflow for example">It looks like Jackson just loses the time-zone during deserialization</a> and, <a href="https://github.com/FasterXML/jackson-datatype-jsr310/issues/22" title="See this issue on the jackson-datatype-jsr310 on GitHub">if you serialize and deserialize a <code>ZonedDateTime</code>, the result will not equal the original instance</a>, because it has a different time-zone.\r
-</p>\r
-<h2>The Solution: Tell Jackson, Not To Adjust the Time-Zone</h2>\r
-<p>\r
-Fortunately, there is a quick and simple fix for this odd default-behavior: you just have to tell Jackson, not to adjust the time-zone.\r
-Tis can be done with this line of code:\r
-</p>\r
-<pre class="prettyprint linenums"><code class="java">mapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);</code></pre>\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>554</wp:post_id>
-               <wp:post_date><![CDATA[2015-11-12 17:12:05]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2015-11-12 15:12:05]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[how-to-keep-the-time-zone-when-deserializing-a-zoneddatetime-with-jackson]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="jackson"><![CDATA[Jackson]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="leitmarkt-wettbewerb-createmedia-nrw"><![CDATA[Leitmarkt-Wettbewerb CreateMedia.NRW]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[3]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Develop a Facebook-App with Spring-Social - Part 0: Prepare</title>
-               <link>https://juplo.de/develop-a-facebook-app-with-spring-social-part-00/</link>
-               <pubDate>Thu, 21 Jan 2016 23:24:03 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=558</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of <a href="http://projects.spring.io/spring-social/" title="Learn more about Spring-Social">Spring-Social</a>.\r
-</p>\r
-<p>\r
-The goal of this series is not, to show how simple it is to set up your first social app with Spring Social.\r
-Even though the usual getting-started guides, like <a href="http://spring.io/guides/gs/accessing-facebook/" title="Read the official guide, that was the starting point of this series">the one this series is based on</a>, are really simple at first glance, they IMHO tend to be confusing, if you try to move on.\r
-I started with <a href="https://github.com/spring-guides/gs-accessing-facebook.git" title="Browse the source of the original example">the example from the original Getting-Started guide "Accessing Facebook Data"</a> and planed to extend it to handle a sign-in via the canvas-page of facebook, like in the <a href="https://github.com/spring-projects/spring-social-samples/tree/master/spring-social-canvas" title="Browse the source of the Spring Social Canvas-Example">Spring Social Canvas-Example</a>.\r
-But I was not able to achieve that simple refinement and ran into multiple obstacles.\r
-</p>\r
-<p>\r
-Because of that, I wanted to show the refinement-process from a simple example up to a full-fledged facebook-app.\r
-My goal is, that you should be able to reuse the final result of the last part of this series as blueprint and starting-point for your own project.\r
-At the same time, you should be able to jump back to earlier posts and read all about the design-decisions, that lead up to that result.\r
-</p>\r
-<p>\r
-This part of my series will handle the preconditions of our first real development-steps.\r
-</p>\r
-<h2>The Source is With You</h2>\r
-<p>\r
-The source-code can be found on <a href="http://juplo.de/git/examples/facebook-app/" title="Link for cloning">http://juplo.de/git/examples/facebook-app/</a>\r
-and <a href="http://juplo.de/gitweb/?p=examples/facebook-app;a=summary" title="Browse the source-code now">browsed via gitweb</a>.\r
-For every part I will add a corresponding tag, that denotes the differences between the earlier and the later development steps.\r
-</p>\r
-<h2>Keep it Simple</h2>\r
-<p>\r
-We will start with the most simple app possible, that just displays the public profile data of the logged in user.\r
-This app is based on the code of <a href="http://spring.io/guides/gs/accessing-facebook/" title="Jump to the original guide">the original Getting-Started guide "Accessing Facebook Data" from Spring-Social</a>.\r
-</p>\r
-<p>\r
-But it is simplified and cleand a little.\r
-And I fixed some small bugs: the original code from\r
-<a href="https://github.com/spring-guides/gs-accessing-facebook.git" title="Link to clone the original code">https://github.com/spring-guides/gs-accessing-facebook.git</a>\r
- produces a \r
-<a href="https://github.com/spring-guides/gs-accessing-facebook/issues/15" title="Read more about this bug">NullPointerException</a> and won't work with the current version 2.0.3.RELEASE of spring-social-facebook, because it uses the <a href="https://developers.facebook.com/docs/facebook-login/permissions#reference-read_stream">depreceated</a> scope <code>read_stream</code>.\r
-</p>\r
-<p>\r
-The code for this.logging.level.de.juplo.yourshouter= part is tagged with <code>part-00</code>.\r
-Appart from the HTML-templates, the attic for spring-boot and the build-definitions in the <code>pom.xml</code> it mainly consists of one file:\r
-</p>\r
-<pre class="prettyprint linenums" id="HomeController"><code class="Java">@Controller\r
-@RequestMapping("/")\r
-public class HomeController\r
-{\r
-  private final static Logger LOG = LoggerFactory.getLogger(HomeController.class);\r
-\r
-\r
-  private final Facebook facebook;\r
-\r
-\r
-  @Inject.logging.level.de.juplo.yourshouter=\r
-  public HomeController(Facebook facebook)\r
-  {\r
-    this.facebook = facebook;\r
-  }\r
-\r
-\r
-  @RequestMapping(method = RequestMethod.GET)\r
-  public String helloFacebook(Model model)\r
-  {\r
-    boolean authorized = true;\r
-    try\r
-    {\r
-      authorized = facebook.isAuthorized();\r
-    }\r
-    catch (NullPointerException e)\r
-    {\r
-      LOG.debug("NPE while acessing Facebook: {}", e);\r
-      authorized = false;\r
-    }\r
-    if (!authorized)\r
-    {\r
-      LOG.info("no authorized user, redirecting to /connect/facebook");\r
-      return "redirect:/connect/facebook";\r
-    }\r
-\r
-    User user = facebook.userOperations().getUserProfile();\r
-    LOG.info("authorized user {}, id: {}", user.getName(), user.getId());\r
-    model.addAttribute("user", user);\r
-    return "home";\r
-  }\r
-}\r
-</code></pre>\r
-<p>\r
-I removed every unnecessary bit, to clear the view for the relevant part.\r
-You can add your styling and stuff by yourself later...\r
-</p>\r
-<h2>Automagic</h2>\r
-<p>\r
-The magic of Spring-Social is hidden in the autoconfiguration of <a href="http://projects.spring.io/spring-boot/" title="Learn more about Spring Boot">Spring-Boot</a>, which will be revealed and refined/replaced in the next parts of this series.\r
-</p>\r
-<h2>Run it!</h2>\r
-<p>\r
-You can clone the repository, checkout the right version and run it with the following commands:\r
-</p>\r
-<pre class="prettyprint linenums"><code class="bash">git clone http://juplo.de/git/examples/facebook-app/\r
-cd facebook-app\r
-checkout part-00\r
-mvn spring-boot:run \\r
-    -Dfacebook.app.id=YOUR_ID \\r
-    -Dfacebook.app.secret=YOUR_SECRET\r
-</code></pre>\r
-<p>\r
-Of course, you have to replace <code>YOUR_ID</code> and <code>YOUR_SECRET</code> with the ID and secret of your Facebook-App.\r
-What you have to do to register as a facebook-developer and start your first facebook-app is described in this <a href="http://spring.io/guides/gs/register-facebook-app/" title="Read, how to register your first facebook-app">"Getting Started"-guide from Spring-Social</a>.\r
-</p>\r
-<p>\r
-In addition to what is described there, you have to <strong>configure the URL of your website</strong>.\r
-To do so, you have to navigate to the <em>Settings</em>-panel of your newly registered facebook-app.\r
-Click on <em>Add Platform</em> and choose <em>Website</em>.\r
-Then, enter <code>http://localhost:8080/</code> as the URL of your website.\r
-</p>\r
-<p>\r
-After maven has downloaded all dependencies and started the Spring-Boot application in the embedded tomcat, you can point your browser to <a href="http://localhost:8080" title="Jump to your first Facebook-App">http://localhost:8080</a>, connect, go back to the welcome-page and view the public data of the account you connected with your app.\r
-</p>\r
-<h2>Coming next...</h2>\r
-<p>\r
-Now, you are prepared to learn Spring-Social and develop your first app step by step.\r
-I will guide you through the process in the upcoming parts of this series.\r
-</p>\r
-<p>\r
-In <a href="develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes" title="Jump to the next part of this series and read on...">the next part</a> of this series I will explain, why this example from the "Getting Started"-guide would not work as a real application and what has to be done, to fix that.\r
-</p>\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>558</wp:post_id>
-               <wp:post_date><![CDATA[2016-01-22 01:24:03]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-01-21 23:24:03]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[develop-a-facebook-app-with-spring-social-part-00]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="createmedia-nrw"><![CDATA[CreateMedia.NRW]]></category>
-               <category domain="post_tag" nicename="facebook"><![CDATA[facebook]]></category>
-               <category domain="post_tag" nicename="graph-api"><![CDATA[graph-api]]></category>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <category domain="post_tag" nicename="oauth2"><![CDATA[oauth2]]></category>
-               <category domain="post_tag" nicename="spring"><![CDATA[spring]]></category>
-               <category domain="post_tag" nicename="spring-boot"><![CDATA[spring-boot]]></category>
-               <category domain="post_tag" nicename="spring-social"><![CDATA[spring-social]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_old_slug]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[develop-a-facebook-app-with-spring-social-part-i]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_old_slug]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[develop-a-facebook-app-with-spring-social-part-0]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>52940</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-02-09 15:58:31]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-02-09 13:58:31]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi Beppe,\r
-\r
-thanks a lot for your comment.\r
-\r
-I added the missing <code>git</code>.\r
-\r
-The issues you noted in 2 and 3, arise from the fact, that I am messing around with the history of the repository a bit.\r
-\r
-I decided, that it is more important, that each commit contains exactly the changes of the next step and that there are no obfuscating commits that only contain small bug-fixes of earlier commits.\r
-\r
-This way, one can read the diffs and clearly see, what was changed and why.\r
-\r
-On the downside, nasty things may happen, if somebody checks out the project, while I am in the middle of some cleaning up.\r
-\r
-If you clone a fresh copy now, everything should work as expected and as described in the blog-article.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>52912</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1455026311.914705;s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>53085</wp:comment_id>
-                       <wp:comment_author><![CDATA[Maxi Wu]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[maxi326@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-03-25 08:57:09]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-03-25 06:57:09]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[just started to try SpringSocial a few days ago. Their documents does not match their sample project. And there is so much stuff unrelated to the simplest basic thing which is really needed to connect with facebook.\r
-I really like your post which remove unnecessary bits. thank you]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1459082382.3372791;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1458889029.853724;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>52912</wp:comment_id>
-                       <wp:comment_author><![CDATA[Beppe Serra]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[beppe.serra@yahoo.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.46.40.141]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2016-02-01 18:33:47]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2016-02-01 16:33:47]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hello, here are the few problems I had and managed to fix.\r
-1) "checkout part-00" is actually "git checkout part-00"\r
-2) "git checkout part-00" fails with "error: pathspec 'part-00' did not match any file(s) known to git." "git tag" shows that the only available tag is "part-01", so I proceeded with that one.\r
-3) in the mvn ... run command, change:\r
--Dfacebook.app.id= and \r
--Dfacebook.app.secret=\r
- to:\r
--Dfacebook.client.id= and \r
--Dfacebook.client.secret=\r
-to match the application.properties file contents.\r
-\r
-Cheers,\r
-\r
-- Beppe -]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1455023867.610893;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1454344427.905972;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Develop a Facebook-App with Spring-Social - Part I: Behind the Scenes</title>
-               <link>https://juplo.de/develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes/</link>
-               <pubDate>Fri, 22 Jan 2016 16:19:12 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=579</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of <a href="http://projects.spring.io/spring-social/" title="Learn more about Spring-Social">Spring-Social</a>.\r
-</p>\r
-<p>\r
-In <a href="/develop-a-facebook-app-with-spring-social-part-00/" title="Read part 0 of this series, to get prepared!">the last and first part of this series</a>, I prepared you for our little course.\r
-</p>\r
-<p>\r
-In this part we will take a look behind the scenes and learn more about the autoconfiguration performed by Spring-Boot, which made our first small example so automagically.\r
-</p>\r
-<h2>The Source is With You</h2>\r
-<p>\r
-You can find the source-code on <a href="http://juplo.de/git/examples/facebook-app/" title="Link for cloning">http://juplo.de/git/examples/facebook-app/</a>\r
-and <a href="http://juplo.de/gitweb/?p=examples/facebook-app;a=summary" title="Browse the source-code now">browse it via gitweb</a>.\r
-Check out <code>part-01</code> to get the source for this part of the series.\r
-</p>\r
-<h2>Our Silent Servant Behind the Scenes: Spring-Boot</h2>\r
-<p>\r
-While looking at our simple example from the last part of this series, you may have wondered, how all this is wired up.\r
-You can log in a user from facebook, access his public profile and all this without one line of configuration.\r
-</p>\r
-<p>\r
-<strong>\r
-This is achieved via <a href="http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#using-boot-auto-configuration" title="Learn more about Spring-Boot's autoconfiguration-mechanism">Spring-Boot autoconfiguration</a>.\r
-</strong>\r
-</p>\r
-<p>\r
-What comes in very handy in the beginning, sometimes get's in your way, when your project grows.\r
-This may happen, because these parts of the code are not under your control and you do not know what the autoconfiguration  is doing on your behalf.\r
-Because of that, in this part of our series, we will rebuild the most relevant parts of the configuration by hand.\r
-As you will see later, this is not only an exercise, but will lead us to the first improvement of our little example.\r
-</p>\r
-<h2>What Is Going On Here?</h2>\r
-<p>\r
-In our case, two Spring-Boot configuration-classes are defining the configuration.\r
-These two classes are <a href="https://github.com/spring-projects/spring-boot/blob/v1.3.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java" title="View the class on github">SocialWebAutoConfiguration</a> and <a href="https://github.com/spring-projects/spring-boot/blob/v1.3.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/FacebookAutoConfiguration.java" title="View the class on github">FacebookAutoConfiguration</a>.\r
-Both classes are located in the package <a href="https://github.com/spring-projects/spring-boot/tree/v1.3.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social" title="View the package on github">spring-boot-autoconfigure</a>.\r
-</p>\r
-<p>\r
-The first one configures the <code>ConnectController</code>, sets up an instance of <code>InMemoryUsersConnectionRepository</code> as persitent store for user/connection-mappings and sets up a <code>UserIdService</code> on our behalf, that always returns the user-id <code>anonymous</code>.\r
-</p>\r
-<p>\r
-The second one adds an instance of <code>FacebookConnectionFactory</code> to the list of available connection-factories, if the required properties (<code>spring.social.facebook.appId</code> and <code>spring.social.facebook.appSecret</code>) are available.\r
-It also configures, that a request-scoped bean of the type <code>Connection&lt;Facebook&gt;</code> is created for each request, that has a known user, who is connected to the Graph-API.\r
-</p>\r
-<h2>Rebuild This Configuration By Hand</h2>\r
-<p>\r
-The following class rebuilds the same configuration explicitly:\r
-</p>\r
-<pre class="prettyprint linenums" id="SocialConfig"><code class="Java">@Configuration\r
-@EnableSocial\r
-public class SocialConfig extends SocialConfigurerAdapter\r
-{\r
-  /**\r
-   * Add a {@link FacebookConnectionFactory} to the configuration.\r
-   * The factory is configured through the keys &lt;code&gt;facebook.app.id&lt;/code&gt;\r
-   * and &lt,code&gt;facebook.app.secret&lt;/code&gt;.\r
-   *\r
-   * @param config\r
-   * @param env \r
-   */\r
-  @Override\r
-  public void addConnectionFactories(\r
-      ConnectionFactoryConfigurer config,\r
-      Environment env\r
-      )\r
-  {\r
-    config.addConnectionFactory(\r
-        new FacebookConnectionFactory(\r
-            env.getProperty("facebook.app.id"),\r
-            env.getProperty("facebook.app.secret")\r
-            )\r
-        );\r
-  }\r
-\r
-  /**\r
-   * Configure an instance of {@link InMemoryUsersConnection} as persistent\r
-   * store of user/connection-mappings.\r
-   *\r
-   * At the moment, no special configuration is needed.\r
-   *\r
-   * @param connectionFactoryLocator\r
-   *     The {@link ConnectionFactoryLocator} will be injected by Spring.\r
-   * @return\r
-   *     The configured {@link UsersConnectionRepository}.\r
-   */\r
-  @Override\r
-  public UsersConnectionRepository getUsersConnectionRepository(\r
-      ConnectionFactoryLocator connectionFactoryLocator\r
-      )\r
-  {\r
-    InMemoryUsersConnectionRepository repository =\r
-        new InMemoryUsersConnectionRepository(connectionFactoryLocator);\r
-    return repository;\r
-  }\r
-\r
-  /**\r
-   * Configure a {@link UserIdSource}, that is equivalent to the one, that is\r
-   * created by Spring-Boot.\r
-   *\r
-   * @return\r
-   *     An instance of {@link AnonymousUserIdSource}.\r
-   *\r
-   * @see {@link AnonymousUserIdSource}\r
-   */\r
-  @Override\r
-  public UserIdSource getUserIdSource()\r
-  {\r
-    return new AnonymousUserIdSource();\r
-  }\r
-\r
-\r
-  /**\r
-   * Configuration of the controller, that handles the authorization against\r
-   * the Facebook-API, to connect a user to Facebook.\r
-   *\r
-   * At the moment, no special configuration is needed.\r
-   *\r
-   * @param factoryLocator\r
-   *     The {@link ConnectionFactoryLocator} will be injected by Spring.\r
-   * @param repository\r
-   *     The {@link ConnectionRepository} will be injected by Spring.\r
-   * @return\r
-   *     The configured controller.\r
-   */\r
-  @Bean\r
-  public ConnectController connectController(\r
-      ConnectionFactoryLocator factoryLocator,\r
-      ConnectionRepository repository\r
-      )\r
-  {\r
-    ConnectController controller =\r
-        new ConnectController(factoryLocator, repository);\r
-    return controller;\r
-  }\r
-\r
-  /**\r
-   * Configure a scoped bean named &lt;code&gt;facebook&lt;/code&gt;, that enables\r
-   * access to the Graph-API in the name of the current user.\r
-   *\r
-   * @param repository\r
-   *     The {@link ConnectionRepository} will be injected by Spring.\r
-   * @return\r
-   *     A {@Connection<Facebook>}, that represents the authorization of the\r
-   *     current user against the Graph-API, or <code>null</code>, if the\r
-   *     current user is not connected to the API.\r
-   */\r
-  @Bean\r
-  @Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)\r
-  public Facebook facebook(ConnectionRepository repository)\r
-  {\r
-    Connection<Facebook> connection =\r
-        repository.findPrimaryConnection(Facebook.class);\r
-    return connection != null ? connection.getApi() : null;\r
-  }\r
-}\r
-</code></pre>\r
-<p>\r
-If you run this refined version of our app, you will see, that it behaves in exact the same way, as the initial version.\r
-</p>\r
-<h2>Coming next</h2>\r
-<p>\r
-You may ask, why we should rebuild the configuration by hand, if it does the same thing.\r
-This is, because the example, so far, would not work as a real app.\r
-The first step, to refine it, is to take control of the configuration.\r
-</p>\r
-<p>\r
-In <a href="develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works" title="Jump to the third part of this series and read on...">the next part</a> of this series, I will show you, why this is necessary.\r
-But, first, we have to take a short look into Spring Social.\r
-</p>\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>579</wp:post_id>
-               <wp:post_date><![CDATA[2016-01-22 18:19:12]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-01-22 16:19:12]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="createmedia-nrw"><![CDATA[CreateMedia.NRW]]></category>
-               <category domain="post_tag" nicename="facebook"><![CDATA[facebook]]></category>
-               <category domain="post_tag" nicename="graph-api"><![CDATA[graph-api]]></category>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <category domain="post_tag" nicename="oauth2"><![CDATA[oauth2]]></category>
-               <category domain="post_tag" nicename="spring"><![CDATA[spring]]></category>
-               <category domain="post_tag" nicename="spring-boot"><![CDATA[spring-boot]]></category>
-               <category domain="post_tag" nicename="spring-social"><![CDATA[spring-social]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Develop a Facebook-App with Spring-Social - Part II: How Spring Social Works</title>
-               <link>https://juplo.de/develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works/</link>
-               <pubDate>Fri, 22 Jan 2016 23:10:04 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=592</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of <a href="http://projects.spring.io/spring-social/" title="Learn more about Spring-Social">Spring-Social</a>.\r
-</p>\r
-<p>\r
-In <a href="/develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes/" title="Read part 1 of this series, to take a look behind the scenes!">the last part of this series</a>, we took control of the autoconfiguration, that Spring Boot had put in place for us.\r
-But there is still a lot of magic in our little example, that was borrowed from <a href="http://spring.io/guides/gs/accessing-facebook/" title="Read the official guide">the offical "Getting Started"-guides</a> or at least, it looks so.\r
-</p>\r
-<h2>First Time In The Electric-Wonder-Land</h2>\r
-<p>\r
-When I first run the example, I wondered like <em>"Wow, how does this little piece of code figures out which data to fetch? How is Spring Social told, which data to fetch? That must be stored in the session, or so! But where is that configured?"</em> and so on and so on.\r
-</p>\r
-<p>\r
-When we connect to Facebook, Facebook tells Spring Social, which user is logged in and if this user authorizes the requested access.\r
-We get an access-token from facebook, that can be used to retrieve user-related data from the Graph-API.\r
-Our application has to manage this data.\r
-</p>\r
-<p>\r
-Spring Social assists us on that task.\r
-But in the end, we have to make the decisions, how to deal with it.\r
-</p>\r
-<h2>Whom Are You Intrested In?</h2>\r
-<p>\r
-Spring Social provides the concept of a <code>ConnectionRepository</code>, which is used to persist the connections of specific user.\r
-Spring Social also provides the concept of a <code>UsersConnectionRepository</code>, which stores, whether a user is connected to a specific social service or not.\r
-As described in <a href="http://docs.spring.io/spring-social/docs/1.1.4.RELEASE/reference/htmlsingle/#configuring-connectcontroller" title="For further details, please read  the official implementations">the official documentation</a>, Spring Social uses the <code>UsersConnectionRepository</code> to create a request-scoped <code>ConnectionRepository</code> bean (the bean named <code>facebook</code> in <a href="/develop-a-facebook-app-with-spring-social-part-00/#HomeController" title="Go back to part 00, to reread the code-example, that uses this bean to access the facebook-data">our little example</a>), that is used by us to access the Graph-API.\r
-</p>\r
-<p>\r
-<strong>But to be able to do so, it must know <em>which user</em> we are interested in!</strong>\r
-</p>\r
-<p>\r
-Hence, Spring Social requires us to configure a <code>UserIdSource</code>.\r
-Every time, when it prepares a request for us, Spring Social will ask this source, which user we are interested in.\r
-</p>\r
-<p>\r
-Attentive readers might have noticed, that we have configured such a source, when we were <a href="/develop-a-facebook-app-with-spring-social-part-01-behind-the-scenes/" title="Jump back to re-read our explicitly rebuild configuration">explicitly rebuilding</a> the automatic default-configuration of Spring Boot:\r
-</p>\r
-<pre class="prettyprint linenums" id="AnonymousUserIdSource"><code class="Java">public class AnonymousUserIdSource implements UserIdSource\r
-{\r
-  @Override\r
-  public String getUserId()\r
-  {\r
-    return "anonymous";\r
-  }\r
-}\r
-</code></pre>\r
-<h2>No One Special...</h2>\r
-<p>\r
-But what is that?!?\r
-All the time we are only interested in one and the same user, whose connections should be stored under the key <code>anonymous</code>?\r
-</p>\r
-<p>\r
-<strong>And what will happen, if a second user connects to our app?</strong>\r
-</p>\r
-<h2>Let's Test That!</h2>\r
-<p>\r
-To see what happens, if more than one user connects to your app, you have to create a <a href="https://developers.facebook.com/docs/apps/test-users" title="Read more about test users">test user</a>.\r
-This is very simple.\r
-Just go to the dashboard of your app, select the menu-item <em>"Roles"</em> and click on the tab <em>"Test Users"</em>.\r
-Select a test user (or create a new one) and click on the <em>"Edit"</em>-button.\r
-There you can select <em>"Log in as this test user"</em>.\r
-</p>\r
-<p>\r
-<strong>If you first connect to the app as yourself and afterwards as test user, you will see, that your data is presented to the test user.</strong>\r
-</p>\r
-<p>\r
-That is, because we are telling Spring Social that every user is called <code>anonymous</code>.\r
-Hence, every user is the same for Spring Social!\r
-When the test user fetches the page, after you have connected to Facebook as yourself, Spring-Social is thinking, that the same user is returning and serves your data.\r
-</p>\r
-<h2>Coming next...</h2>\r
-<p>\r
-In <a href="develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source" title="Jump to the next part of this series and read on...">the next part</a> of this series, we will try to teach Spring Social to distinguish between several users.\r
-</p>\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>592</wp:post_id>
-               <wp:post_date><![CDATA[2016-01-23 01:10:04]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-01-22 23:10:04]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="createmedia-nrw"><![CDATA[CreateMedia.NRW]]></category>
-               <category domain="post_tag" nicename="facebook"><![CDATA[facebook]]></category>
-               <category domain="post_tag" nicename="graph-api"><![CDATA[graph-api]]></category>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <category domain="post_tag" nicename="oauth2"><![CDATA[oauth2]]></category>
-               <category domain="post_tag" nicename="spring"><![CDATA[spring]]></category>
-               <category domain="post_tag" nicename="spring-boot"><![CDATA[spring-boot]]></category>
-               <category domain="post_tag" nicename="spring-social"><![CDATA[spring-social]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Develop a Facebook-App with Spring-Social – Part III: Implementing a UserIdSource</title>
-               <link>https://juplo.de/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source/</link>
-               <pubDate>Mon, 25 Jan 2016 13:43:26 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=613</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of <a href="http://projects.spring.io/spring-social/" title="Learn more about Spring-Social">Spring-Social</a>\r
-</p>\r
-<p>\r
-In <a href="/develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works/" title="Read part 2 of this series, to understand, why the first example cannot work as a real app!">the last part of this series</a>, I explained, why the nice little example from the Getting-Started-Guide "<a href="http://spring.io/guides/gs/accessing-facebook/" title="Read the official Getting-Started-Guide">Accessing Facebook Data</a>" cannot function as a real facebook-app.\r
-</p>\r
-<p>\r
-In this part, we will try to solve that problem, by implementing a <code>UserIdSource</code>, that tells Spring Social, which user it should connect to the API.\r
-</p>\r
-<h2>The Source is With You</h2>\r
-<p>\r
-You can find the source-code on <a href="http://juplo.de/git/examples/facebook-app/" title="Link for cloning">http://juplo.de/git/examples/facebook-app/</a>\r
-and <a href="http://juplo.de/gitweb/?p=examples/facebook-app;a=summary" title="Browse the source-code now">browse it via gitweb</a>.\r
-Check out <code>part-03</code> to get the source for this part of the series.\r
-</p>\r
-<h2>Introducing <code>UserIdSource</code></h2>\r
-<p>\r
-The <code>UserIdSource</code> is used by Spring Social to ask us, which user it should connect with the social net.\r
-Clearly, to answer that question, we must remeber, which user we are currently interested in!\r
-</p>\r
-<h2 id="remember">Remember Your Visitors</h2>\r
-<p>\r
-In order to remember the current user, we implement a simple mechanism, that stores the ID of the current user in a cookie and retrieves it from there for subsequent calls.\r
-This concept was borrowed &mdash; again &mdash; from <a href="https://github.com/spring-projects/spring-social-samples" title="Clone the official code examples from GitHub">the official code examples</a>.\r
-You can find it for example in the <a href="https://github.com/spring-projects/spring-social-samples/tree/master/spring-social-quickstart" title="Clone the quickstart-example from GitHub">quickstart-example</a>.\r
-</p>\r
-<p>\r
-<strong>It is crucial to stress, that this concept is inherently insecure and should never be used in a production-environment.</strong>\r
-As the ID of the user is stored in a cookie, an attacker could simply take over control by sending the ID of any currently connected user, he is interested in.\r
-</p>\r
-<p>\r
-The concept is implemented here only for educational purposes.\r
-It will be replaced by Spring Security later on.\r
-But for the beginning, it is easier to understand, how Spring Social works, if we implement a simple version of the mechanism ourself.\r
-</p>\r
-<h2>Pluging in Our New Memory</h2>\r
-<p>\r
-The internals of our implementation are not of interest.\r
-You may explore them by yourself.\r
-In short, it stores the ID of each new user in a cookie.\r
-By inspecting that cookie, it can restore the ID of the user on subsequent calls.\r
-</p>\r
-<p>\r
-What is from interest here is, how we can plug in this simple example-mechanism in Spring Social.\r
-</p>\r
-<p>\r
-Mainly, there are two hooks to do that, that means: two interfaces, we have to implement:\r
-</p>\r
-<ol>\r
-<li>\r
-<strong>UserIdSource</strong>:\r
-Spring Social uses an instance of this interface to ask us, which users authorizations it should load from its persistent store of user/connection-mappings.\r
-We already have seen an implementation of that one in <a href="develop-a-facebook-app-with-spring-social-part-02-how-spring-social-works/#AnonymousUserIdSource" title="Jump back to the last part of our series">the last part of our series</a>.\r
-</li>\r
-<li>\r
-<strong>ConnectionSignUp</strong>:\r
-Spring Social uses an instance of this interface, to ask us about the name it should use for a new user during sign-up.\r
-</li>\r
-</ol>\r
-<h2>Implementation</h2>\r
-<p>\r
-The implementation of <code>ConnectionSignUp</code> simply uses the ID, that is provided by the social network.\r
-Since we are only signing in users from Facebook, these ID's are guaranteed to be unique.\r
-</p>\r
-<pre class="prettyprint linenums" id="ProviderUserIdConnectionSignUp"><code class="Java">public class ProviderUserIdConnectionSignUp implements ConnectionSignUp\r
-{\r
-  @Override\r
-  public String execute(Connection<?> connection)\r
-  {\r
-    return connection.getKey().getProviderUserId();\r
-  }\r
-}\r
-</code></pre>\r
-<p>\r
-The implementation of <code>UserIdSource</code> retrieves the ID, that was stored in the <code>SecurityContext</code> (our simple implementation &mdash; not to be confused with the class from Spring Security).\r
-If no user is stored in the <code>SecurityContext</code>, it falls back to the old behavior and returns the fix id <code>anonymous</code>.\r
-</p>\r
-<pre class="prettyprint linenums" id=""><code class="Java">public class SecurityContextUserIdSource implements UserIdSource\r
-{\r
-  private final static Logger LOG =\r
-      LoggerFactory.getLogger(SecurityContextUserIdSource.class);\r
-\r
-\r
-  @Override\r
-  public String getUserId()\r
-  {\r
-    String user = SecurityContext.getCurrentUser();\r
-    if (user != null)\r
-    {\r
-      LOG.debug("found user \"{}\" in the security-context", user);\r
-    }\r
-    else\r
-    {\r
-      LOG.info("found no user in the security-context, using \"anonymous\"");\r
-      user = "anonymous";\r
-    }\r
-    return user;\r
-  }\r
-}\r
-</code></pre>\r
-<h2>Actual Plumbing</h2>\r
-<p>\r
-To replace the <code>AnonymousUserIdSource</code> by our new implementation, we simply instantiate that instead of the old one in our configuration-class <code>SocialConfig</code>:\r
-<pre class="prettyprint linenums" id="plumbing-UserIdSource"><code class="Java">@Override\r
-public UserIdSource getUserIdSource()\r
-{\r
-  return new SecurityContextUserIdSource();\r
-}\r
-</code></pre>\r
-<p>\r
-There are several ways to plug in the <code>ConnectionSignUp</code>.\r
-I decided, to plug it into the instance of <code>InMemoryUsersConnectionRepository</code>, that our configuration uses, because this way, the user will be signed up automatically on sign in, if it is not known to the application:\r
-</p>\r
-<pre class="prettyprint linenums" id="plumbing-ConnectionSignUp"><code class="Java">@Override\r
-public UsersConnectionRepository getUsersConnectionRepository(\r
-    ConnectionFactoryLocator connectionFactoryLocator\r
-    )\r
-{\r
-  InMemoryUsersConnectionRepository repository =\r
-      new InMemoryUsersConnectionRepository(connectionFactoryLocator);\r
-  repository.setConnectionSignUp(new ProviderUserIdConnectionSignUp());\r
-  return repository;\r
-}\r
-</code></pre>\r
-<p>\r
-This makes sense, because our facebook-app uses Facebook, to sign in its users, and, because of that, does not have its own user-model.\r
-It can just reuse the user-data provided by facebook.\r
-</p>\r
-<p>\r
-The other approach would be, to officially sign up users, that are not known to the app.\r
-This is achieved, by redirecting to a special URL, if a sign-in fails, because the user is unknown.\r
-These URL then presents a formular for sign-up, which can be prepopulated with the user-data provided by the social network.\r
-You can read more about this approach in the <a href="http://docs.spring.io/spring-social/docs/1.1.4.RELEASE/reference/htmlsingle/#signing-up-after-a-failed-sign-in" title="Read more on signing up after a faild sign-in in the official documentation">official documentation</a>.\r
-</p>\r
-<h2>Run It!</h2>\r
-<p>\r
-So, let us see, if our refinement works. Run the following command and log into your app with at least two different users:\r
-</p>\r
-<pre class="prettyprint linenums"><code class="bash">git clone http://juplo.de/git/examples/facebook-app/\r
-cd facebook-app\r
-checkout part-00\r
-mvn spring-boot:run \\r
-    -Dfacebook.app.id=YOUR_ID \\r
-    -Dfacebook.app.secret=YOUR_SECRET \\r
-    -Dlogging.level.de.juplo.yourshouter=debug\r
-</code></pre>\r
-<p>\r
-(The last part of the command turns on the <code>DEBUG</code> logging-level, to see in detail, what is going on.\r
-</p>\r
-<h2>But What The *#! Is Going On There?!?</h2>\r
-<p>\r
-<strong>Unfortunately, our application shows exactly the same behavior as, before our last refinement.</strong>\r
-Why that?\r
-</p>\r
-<p>\r
-If you run the application in a debugger and put a breakpoint in our implementation of <code>ConnectionSignUp</code>, you will see, that this code is never called.\r
-But it is plugged in in the right place and should be called, if <em>a new user signs in</em>!\r
-</p>\r
-<p>\r
-The solution is, that we are using the wrong mechanism.\r
-We are still using the <code>ConnectController</code> which was configured in the simple example, we extended.\r
-But this controller is meant to connect a <em>known user</em> to one or more <em>new social services</em>.\r
-This controller assumes, that the user is already signed in to the application and can be retrieved via the configured <code>UserIdSource</code>.\r
-</p>\r
-<p>\r
-<strong>\r
-To sign in a user to our application, we have to use the <code>ProviderSignInController</code> instead!\r
-</strong>\r
-</p>\r
-<h2>Coming next...</h2>\r
-<p>\r
-In <a href="/develop-a-facebook-app-with-spring-social-part-04-signing-in-users" title="Jump to the next part of this series and read on...">the next part</a> of this series, I will show you, how to change the configuration, so that the <code>ProviderSignInController</code> is used to sign in (and automatically sign up) users, that were authenticated through the Graph-API from Facebook.\r
-</p>\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>613</wp:post_id>
-               <wp:post_date><![CDATA[2016-01-25 15:43:26]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-01-25 13:43:26]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="createmedia-nrw"><![CDATA[CreateMedia.NRW]]></category>
-               <category domain="post_tag" nicename="facebook"><![CDATA[facebook]]></category>
-               <category domain="post_tag" nicename="graph-api"><![CDATA[graph-api]]></category>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <category domain="post_tag" nicename="oauth2"><![CDATA[oauth2]]></category>
-               <category domain="post_tag" nicename="spring"><![CDATA[spring]]></category>
-               <category domain="post_tag" nicename="spring-boot"><![CDATA[spring-boot]]></category>
-               <category domain="post_tag" nicename="spring-social"><![CDATA[spring-social]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Develop a Facebook-App with Spring-Social – Part IV: Signing In Users</title>
-               <link>https://juplo.de/develop-a-facebook-app-with-spring-social-part-04-signing-in-users/</link>
-               <pubDate>Mon, 25 Jan 2016 17:59:59 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=626</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of <a href="http://projects.spring.io/spring-social/" title="Learn more about Spring-Social">Spring-Social</a>\r
-</p>\r
-<p>\r
-In <a href="/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source" title="Go back to part 3 of this series, to learn how you plug in user-recognition into Spring Social">the last part of this series</a>, we tried to teach Spring Social how to remember our signed in users and learned, that we have to sign in a user first.\r
-</p>\r
-<p>\r
-In this part, I will show you, how you sign (and automatically sign up) users, that are authenticated via the Graph-API.\r
-</p>\r
-<h2>The Source is With You</h2>\r
-<p>\r
-You can find the source-code on <a href="http://juplo.de/git/examples/facebook-app/" title="Link for cloning">http://juplo.de/git/examples/facebook-app/</a>\r
-and <a href="http://juplo.de/gitweb/?p=examples/facebook-app;a=summary" title="Browse the source-code now">browse it via gitweb</a>.\r
-Check out <code>part-04</code> to get the source for this part of the series.\r
-</p>\r
-<h2>In Or Up? Up And In!</h2>\r
-<p>\r
-In the last part of our series we ran in the problem, that we wanted to connect several (new) users to our application.\r
-We tried to achieve that, by extending our initial configuration.\r
-But the mistake was, that we tried to <em>connect</em> new users.\r
-In the world of Spring Social we can only connect a <em>known user</em> to a <em>new social service</em>.\r
-</p>\r
-<p>\r
-To know a user, Spring Social requires us to <em>sign in</em> that user.\r
-But again, if you try to <em>sign in</em> a <em>new user</em>, Spring Social requires us to <em>sign up</em> that user first.\r
-Because of that, we had already implemented a <a href="/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source/#ProviderUserIdConnectionSignUp" title="Jump back to the last part and view the source of our implementation"><code>ConnectionSignUp</code></a> and <a href="/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source/#plumbing-ConnectionSignUp" title="Jump back to the last part to view how we pluged in our ConnectionSignUp">configured Spring Social to call it</a>, whenever it does not know a user, that was authenticated by Facebook.\r
-If you forget that (or if you remove the according configuration, that tells Spring Social to use our <code>ConnectionSignUp</code>), Spring Social will redirect you to the URL <code>/signup</code> &mdash; a Sign-Up page you have to implement &mdash; after a successfull authentication of a user, that Spring Social does not know yet.\r
-</p>\r
-<p>\r
-The confusion &mdash; or, to be honest, <em>my</em> confusion &mdash; about <em>sign in</em> and <em>sign up</em> arises from the fact, that we are developing a Facebook-Application.\r
-We do not care about signing up users.\r
-Each user, that is known to Facebook &mdash; that is, who has signed up to Facebook &mdash; should be able to use our application.\r
-An explicit sign-up to our application is not needed and not wanted.\r
-So, in our use-case, we have to implement the automatically sign-up of new users.\r
-But Spring Social is designed for a much wider range of use cases.\r
-Hence, it has to distinguish between sign-in and sign-up.\r
-</p>\r
-<h2>Implementation Of The Sign-In</h2>\r
-<p>\r
-Spring Social provides the interface <code>SignInAdapter</code>, that it calls every time, it has authenticated a user against a social service.\r
-This enables us, to be aware of that event and remember the user for subsequent calls.\r
-Our implementation stores the user in our <code>SecurityContext</code> to sign him in and creates a cookie to remember him for subsequent calls:\r
-</p>\r
-<pre class="prettyprint linenums" id="UserCookieSignInAdapter"><code class="Java">public class UserCookieSignInAdapter implements SignInAdapter\r
-{\r
-  private final static Logger LOG =\r
-      LoggerFactory.getLogger(UserCookieSignInAdapter.class);\r
-\r
-\r
-  @Override\r
-  public String signIn(\r
-      String user,\r
-      Connection<?> connection,\r
-      NativeWebRequest request\r
-      )\r
-  {\r
-    LOG.info(\r
-        "signing in user {} (connected via {})",\r
-        user,\r
-        connection.getKey().getProviderId()\r
-        );\r
-    SecurityContext.setCurrentUser(user);\r
-    UserCookieGenerator\r
-        .INSTANCE\r
-        .addCookie(usSigning In Userser, request.getNativeResponse(HttpServletResponse.class));\r
-\r
-    return null;\r
-  }\r
-}\r
-</code></pre>\r
-<p>\r
-It returns <code>null</code>, to indicate, that the user should be redirected to the default-URL after an successful sign-in.\r
-This URL can be configured in the <code>ProviderSignInController</code> and defaults to <code>/</code>, which matches our use-case.\r
-If you return a string here, for example <code>/welcome.html</code>, the controller would ignore the configured URL and redirect to that URL after a successful sign-in.\r
-</p>\r
-<h2>Configuration Of The Sign-In</h2>\r
-<p>\r
-To enable the Sign-In, we have to plug our <code>SignInAdapter</code> into the <code>ProviderSignInController</code>:\r
-</p>\r
-<pre class="prettyprint linenums" id="plumbing-SignInAdapter"><code class="Java">@Bean\r
-public ProviderSignInController signInController(\r
-    ConnectionFactoryLocator factoryLocator,\r
-    UsersConnectionRepository repository\r
-    )\r
-{\r
-  ProviderSignInController controller = new ProviderSignInController(\r
-      factoryLocator,\r
-      repository,\r
-      new UserCookieSignInAdapter()\r
-      );\r
-  return controller;\r
-}\r
-</code></pre>\r
-<p>\r
-Since we are using Spring Boot, an alternative configuration would have been to just create a bean-instance of our implementation named <code>signInAdapter</code>.\r
-Then, the auto-configuration of Spring Boot would discover that bean, create an instance of <code>ProviderSignInController</code> and plug in our implementation for us.\r
-If you want to learn, how that works, take a look at the implementation of the auto-configuration in the class <a href="https://github.com/spring-projects/spring-boot/blob/v1.3.1.RELEASE/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/social/SocialWebAutoConfiguration.java#L112" title="Jump to GitHub to study the implementation of the SocialWebAutoConfiguration">SocialWebAutoConfiguration</a>, lines 112ff.\r
-</p>\r
-<h2>Run it!</h2>\r
-<p>\r
-If you run our refined example and visit it after impersonating different facebook-users, you will see that everything works as expected now.\r
-If you visit the app for the first time (after a restart) with a new user, the user is signed up and in automatically and a cookie is generated, that stores the Facebook-ID of the user in the browser.\r
-On subsequent calls, his ID is read from this cookie and the corresponding connection is restored from the persistent store by Spring Social.\r
-</p>\r
-<h2>Coming Next...</h2>\r
-<p>\r
-In <a href="/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic" title="Jump to the next part of this series and read on...">the next part</a> of this little series, we will move the redirect-if-unknown logic from our <code>HomeController</code> into our <code>UserCookieInterceptor</code>, so that the behavior of our so-called "security"-concept more closely resembles the behavior of Spring Security.\r
-That will ease the migration to that solution in a later step.\r
-</p>\r
-<p>\r
-Perhaps you want to skip that, rather short and boring step and jump to the part after the next, that explains, how to sign in users by the <code>signed_request</code>, that Facebook sends, if you integrate your app as a canvas-page.\r
-</p>\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>626</wp:post_id>
-               <wp:post_date><![CDATA[2016-01-25 19:59:59]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-01-25 17:59:59]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[develop-a-facebook-app-with-spring-social-part-04-signing-in-users]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="createmedia-nrw"><![CDATA[CreateMedia.NRW]]></category>
-               <category domain="post_tag" nicename="facebook"><![CDATA[facebook]]></category>
-               <category domain="post_tag" nicename="graph-api"><![CDATA[graph-api]]></category>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <category domain="post_tag" nicename="oauth2"><![CDATA[oauth2]]></category>
-               <category domain="post_tag" nicename="spring"><![CDATA[spring]]></category>
-               <category domain="post_tag" nicename="spring-boot"><![CDATA[spring-boot]]></category>
-               <category domain="post_tag" nicename="spring-social"><![CDATA[spring-social]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Develop a Facebook-App with Spring-Social – Part V: Refactor The Redirect-Logic</title>
-               <link>https://juplo.de/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic/</link>
-               <pubDate>Tue, 26 Jan 2016 14:34:23 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=644</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of <a href="http://projects.spring.io/spring-social/" title="Learn more about Spring-Social">Spring-Social</a>\r
-</p>\r
-<p>\r
-In <a href="/develop-a-facebook-app-with-spring-social-part-04-signing-in-users" title="Go back to part 4 of this series, to learn how to sign in users">the last part of this series</a>, we reconfigured our app, so that users are signed in after an authentication against Facebook and new users are signed up automatically on the first visit.\r
-</p>\r
-<p>\r
-In this part, we will refactor our redirect-logic for unauthenticated users, so that it more closely resembles the behavior of Spring Social, hence, easing the planed switch to that technology in a feature step.\r
-</p>\r
-<h2>The Source is With You</h2>\r
-<p>\r
-You can find the source-code on <a href="http://juplo.de/git/examples/facebook-app/" title="Link for cloning">http://juplo.de/git/examples/facebook-app/</a>\r
-and <a href="http://juplo.de/gitweb/?p=examples/facebook-app;a=summary" title="Browse the source-code now">browse it via gitweb</a>.\r
-Check out <code>part-05</code> to get the source for this part of the series.\r
-</p>\r
-<h2>Mimic Spring Security</h2>\r
-<p>\r
-<strong>To stress that again: our simple authentication-concept is only meant for educational purposes. <a href="/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source#remember" title="Jump back to part 3 to learn, why our authentication-concept is insecure">It is inherently insecure!</a></strong>\r
-We are not refining it here, to make it better or more secure.\r
-We are refining it, so that it can be replaced with Spring Security later on, without a hassle!\r
-</p>\r
-<p>\r
-In our current implementation, a user, who is not yet authenticated, would be redirected to our sign-in-page only, if he visits the root of our webapp (<code>/</code>).\r
-To move all redirect-logic out of <code>HomeController</code> and redirect unauthenicated users from all pages to our sign-in-page, we can simply modify our interceptor <code>UserCookieInterceptor</code>, which already intercepts each and every request.\r
-</p>\r
-<p>\r
-We refine the method <code>preHandle</code>, so that it redirects every request to our sign-in-page, that is not authenticated:\r
-</p>\r
-<pre class="prettyprint linenums" id="redirect"><code class="Java">@Override\r
-public boolean preHandle(\r
-    HttpServletRequest request,\r
-    HttpServletResponse response,\r
-    Object handler\r
-    )\r
-    throws\r
-      Exception\r
-{\r
-  if (request.getServletPath().startsWith("/signin"))\r
-    return true;\r
-\r
-  String user = UserCookieGenerator.INSTANCE.readCookieValue(request);\r
-  if (user != null)\r
-  {\r
-    if (!repository\r
-        .findUserIdsConnectedTo("facebook", Collections.singleton(user))\r
-        .isEmpty()\r
-        )\r
-    {\r
-      LOG.info("loading user {} from cookie", user);\r
-      SecurityContext.setCurrentUser(user);\r
-      return true;\r
-    }\r
-    else\r
-    {\r
-      LOG.warn("user {} is not known!", user);\r
-      UserCookieGenerator.INSTANCE.removeCookie(response);\r
-    }\r
-  }\r
-\r
-  response.sendRedirect("/signin.html");\r
-  return false;\r
-}\r
-</code></pre>\r
-<p>\r
-If the user, that is identified by the cookie, is not known to Spring Security, we send a redirect to our sign-in-page and flag the request as already handled, by returning <code>false</code>.\r
-To prevent an endless loop of redirections, we must not redirect request, that were already redirected to our sign-in-page.\r
-Since these requests hit our webapp as a new request for the different location, we can filter out and wave through at the beginning of this method.\r
-</p>\r
-<h2>Run It!</h2>\r
-<p>\r
-That is all there is to do.\r
-Run the app and call the page <code>http://localhost:8080/profile.html</code> as first request.\r
-You will see, that you will be redirected to our sigin-in-page.\r
-</p>\r
-<h2>Cleaning Up Behind Us...</h2>\r
-<p>\r
-As it is now not possible, to call any page except the sigin-up-page, without beeing redirected to our sign-in-page, if you are not authenticated, it is impossible to call any page without being authenticated.\r
-Hence, we can (and should!) refine our <code>UserIdSource</code>, to throw an exception, if that happens anyway, because it has to be a sign for a bug:\r
-</p>\r
-<pre class="prettyprint linenums" id="refine"><code class="Java">public class SecurityContextUserIdSource implements UserIdSource\r
-{\r
-\r
-  @Override\r
-  public String getUserId()\r
-  {\r
-    Assert.state(SecurityContext.userSignedIn(), "No user signed in!");\r
-    return SecurityContext.getCurrentUser();\r
-  }\r
-}\r
-</code></pre>\r
-<h2>Coming Next...</h2>\r
-<p>\r
-In the next part of this series, we will enable users to sign in through the canvas-page of our app.\r
-The canvas-page is the page that Facebook embeds into its webpage, if we render our app inside of Facebook.\r
-</p>\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>644</wp:post_id>
-               <wp:post_date><![CDATA[2016-01-26 16:34:23]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-01-26 14:34:23]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="createmedia-nrw"><![CDATA[CreateMedia.NRW]]></category>
-               <category domain="post_tag" nicename="facebook"><![CDATA[facebook]]></category>
-               <category domain="post_tag" nicename="graph-api"><![CDATA[graph-api]]></category>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <category domain="post_tag" nicename="oauth2"><![CDATA[oauth2]]></category>
-               <category domain="post_tag" nicename="spring"><![CDATA[spring]]></category>
-               <category domain="post_tag" nicename="spring-boot"><![CDATA[spring-boot]]></category>
-               <category domain="post_tag" nicename="spring-social"><![CDATA[spring-social]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Develop a Facebook-App with Spring-Social – Part VI: Sign In Users Through The Canvas-Page</title>
-               <link>https://juplo.de/develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page/</link>
-               <pubDate>Tue, 26 Jan 2016 16:05:28 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=671</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of <a href="http://projects.spring.io/spring-social/" title="Learn more about Spring-Social">Spring-Social</a>\r
-</p>\r
-<p>\r
-In <a href="/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic/" title="Read part 5 of this series">the last part of this series</a>, we refactored our authentication-concept, so that it can be replaced by Spring Security later on more easy.\r
-</p>\r
-<p>\r
-In this part, we will turn our app into a real Facebook-App, that is rendered inside Facebook and signs in users through the <code>signed_request</code>.\r
-</p>\r
-<h2>The Source is With You</h2>\r
-<p>\r
-You can find the source-code on <a href="http://juplo.de/git/examples/facebook-app/" title="Link for cloning">http://juplo.de/git/examples/facebook-app/</a>\r
-and <a href="http://juplo.de/gitweb/?p=examples/facebook-app;a=summary" title="Browse the source-code now">browse it via gitweb</a>.\r
-Check out <code>part-06</code> to get the source for this part of the series.\r
-</p>\r
-<h2>What The *#&! Is a <code>signed_request</code></h2>\r
-<p>\r
-If you add the platform <strong>Facebook Canvas</strong> to your app, you can present your app inside of Facebook.\r
-It will be accessible on a URL like <strong><code>https://apps.facebook.com/YOUR_NAMESPACE</code></strong> then and if a (known!) user accesses this URL, facebook will send a <a href="https://developers.facebook.com/docs/reference/login/signed-request" title="Read more about the fields, that are contained in the signed_request"><code>signed_request</code></a>, that already contains some data of this user an an authorization to retrieve more.\r
-</p>\r
-<h2>Sign In Users With <code>signed_request</code> In 5 Simple Steps</h2>\r
-<p>\r
-As I first tried to extend the <a href="http://spring.io/guides/gs/accessing-facebook/" title="Read the original guide, this article-series is based on">simple example</a>, this article-series is based on, I stumbled across multiple misunderstandings.\r
-But now, as I guided you around all that obstacles, it is fairly easy to refine our app, so that is can sign in users through the signed_request, send to a Canvas-Page.\r
-</p>\r
-<p>\r
-You just have to:\r
-</p>\r
-<ol>\r
-<li>Add the platform "Facebook Canvas" in the settings of your app and choose a canvas-URL.</li>\r
-<li>Reconfigure your app to support HTTPS, because Facebook requires the canvas-URL to be secured by SSL.</li>\r
-<li>Configure the <code>CanvasSignInController</code>.</li>\r
-<li>Allow the URL of the canvas-page to be accessed unauthenticated.</li>\r
-<li>Enable Sign-Up throw your canvas-page.</li>\r
-</ol>\r
-<p>\r
-That is all, there is to do.\r
-But now, step by step...\r
-</p>\r
-<h2>Step 1: Turn Your App Into A Canvas-Page</h2>\r
-<p>\r
-Go to the settings-panel of your app on <a href="https://developers.facebook.com/apps" title="Log in to your developer-account on Facebook now">https://developers.facebook.com/apps</a> and click on <em>Add Platform</em>.\r
-Choose <em>Facebook Canvas</em>.\r
-Pick a secure URL, where your app will serve the canvas-page.\r
-</p>\r
-<p>\r
-For example: <code>https://localhost:8443</code>.\r
-</p>\r
-<p>\r
-Be aware, that the URL has to be publicly available, if you want to enable other users to access your app.\r
-But that also counts for the Website-URL <code>http://localhost:8080</code>, that we are using already.\r
-</p>\r
-<p>\r
-Just remember, if other people should be able to access your app later, you have to change these URL's to something, they can access, because all the content of your app is served by you, not by Facebook.\r
-A Canvas-App just embedds your content in an iFrame inside of Facebook.\r
-</p>\r
-<h2>Step 2: Reconfigure Your App To Support HTTPS</h2>\r
-<p>\r
-Add the following lines to your <code>src/main/resources/application.properties</code>:\r
-</p>\r
-<pre class="prettyprint linenums" id="HTTPS"><code class="properties">server.port: 8443\r
-server.ssl.key-store: keystore\r
-server.ssl.key-store-password: secret\r
-</code></pre>\r
-<p>\r
-I have included a self-signed <code>keystore</code> with the password <code>secret</code> in the source, that you can use for development and testing.\r
-But of course, later, you have to create your own keystore with a certificate that is signed by an official certificate authority, that is known by the browsers of your users.\r
-</p>\r
-<p>\r
-Since your app now listens on <code>8443</code> an uses <code>HTTPS</code>, you have to change the URL, that is used for the platform "Website", if you want your sign-in-page to continue to work in parallel to the sign-in through the canvas-page.\r
-</p>\r
-<p>\r
-For now, you can simply change it to <code>https://locahost:8443/</code> in the settings-panel of your app.\r
-</p>\r
-<h2>Step 3: Configure the <code>CanvasSignInController</code></h2>\r
-<p>\r
-To actually enable the <a href="https://developers.facebook.com/docs/games/gamesonfacebook/login#usingsignedrequest" title="Read about all the cumbersome steps, that would be necesarry, if you had to handle a signed_requst by yourself">automatic handling</a> of the <code>signed_request</code>, that is, decoding the <code>signed_request</code> and sign in the user with the data provided in the <code>signed_request</code>, you just have to add the <code>CanvasSignInController</code> as a bean in your <code>SocialConfig</code>:\r
-</p>\r
-<pre class="prettyprint linenums" id="PATTERN"><code class="Java">@Bean\r
-public CanvasSignInController canvasSignInController(\r
-    ConnectionFactoryLocator connectionFactoryLocator,\r
-    UsersConnectionRepository usersConnectionRepository,\r
-    Environment env\r
-    )\r
-{\r
-  return\r
-      new CanvasSignInController(\r
-          connectionFactoryLocator,\r
-          usersConnectionRepository,\r
-          new UserCookieSignInAdapter(),\r
-          env.getProperty("facebook.app.id"),\r
-          env.getProperty("facebook.app.secret"),\r
-          env.getProperty("facebook.app.canvas")\r
-          );\r
-}\r
-</code></pre>\r
-<h2>Step 4: Allow the URL Of Your Canvas-Page To Be Accessed Unauthenticated</h2>\r
-<p>\r
-Since <a href="/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic" title="Read more about the refactoring, that ensures, that every request, that is made to our app, is authenticated">we have "secured" all of our pages</a> except of our sign-in-page <code>/signin*</code>, so that they can only be accessed by an authenticated user, we have to explicitly allow unauthenticated access to our new special sign-in-page.\r
-</p>\r
-<p>\r
-To achieve that, we have to refine our <a href="/develop-a-facebook-app-with-spring-social-part-05-refactor-the-redirect-logic#redirect" title="Compare the changes to the unchanged method of our UserCookieInterceptor"><code>UserCookieInterceptor</code></a> as follows.\r
-First add a pattern for all pages, that are allowed to be accessed unauthenticated:\r
-</p>\r
-<pre class="prettyprint linenums" id="PATTERN"><code class="Java">private final static Pattern PATTERN = Pattern.compile("^/signin|canvas");\r
-</code></pre>\r
-<p>\r
-Then match the requests against this pattern, instead of the fixed string <code>/signin</code>:\r
-</p>\r
-<pre class="prettyprint linenums" id="matcher"><code class="Java">if (PATTERN.matcher(request.getServletPath()).find())\r
-  return true;\r
-</code></pre>\r
-<h2>Step 5: Enable Sign-Up Through Your Canvas-Page</h2>\r
-<p>\r
-Facebook always sends a <code>signed_request</code> to your app, if a user visits your app through the canvas-page.\r
-But on the first visit of a user, the <code>signed_request</code> does not authenticate the user.\r
-In this case, the only data that is presented to your page is the language and locale of the user and his or her age.\r
-</p>\r
-<p>\r
-Because the data, that is needed to sign in the user, is missing, the <code>CanvasSignInController</code> will issue an explicit authentication-request to the Graph-API via a so called <a href="https://developers.facebook.com/docs/games/gamesonfacebook/login#serversidelogin" title="Read more details about the process of a Server-Side Log-In on Facebook">Server-Side Log-In</a>.\r
-This process includes a redirect to the Login-Dialog of Facebook and then a second redirect back to your app.\r
-It requires the specification of a full absolute URL to redirect back to.\r
-</p>\r
-<p>\r
-Since we are configuring the canvas-login-in, we want, that new users are redirected to the canvas-page of our app.\r
-Hence, you should use the Facebook-URL of your app: <code>https://apps.facebook.com/YOUR_NAMESPACE</code>.\r
-This will result in a call to your canvas-page with a <code>signed_request</code>, that authenticates the new user, if the user accepts to share the requested data with your app.\r
-</p>\r
-<p>\r
-Any other page of your app would work as well, but the result would be a call to the stand-alone version of your app (the version of your app that is called the "Website"-platform of your app by Facebook), meaning, that your app is not rendered inside of Facebook.\r
-Also it requires one more call of your app to the Graph-API to actually sign-in the new user, because Facebook sends the <code>signed_request</code> only the canvas-page of your app.\r
-</p>\r
-<p>\r
-To specify the URL I have introduced a new attribute <code>facebook.app.canvas</code> that is handed to the <code>CanvasSignInController</code>.\r
-You can specifiy it, when starting your app:\r
-</p>\r
-<pre class="prettyprint linenums"><code class="bash">mvn spring-boot:run \\r
-    -Dfacebook.app.id=YOUR_ID \\r
-    -Dfacebook.app.secret=YOUR_SECRET \\r
-    -Dfacebook.app.canvas=https://apps.facebook.com/YOUR_NAMESPACE\r
-</code></pre>\r
-<p>\r
-Be aware, that this process requires the automatic sign-up of new users, that we enabled in <a href="/develop-a-facebook-app-with-spring-social-part-03-implementing-a-user-id-source#plumbing-UserIdSource" title="Jump back to part 3 of this series to reread, how we enabled the automatic sign-up">part 3</a> of this series.\r
-Otherwise, the user would be redirected to the sign-up-page of your application, after he allowed your app to access the requested data.\r
-Obviously, that would be very confusing for the user, so we really nead automati sign-up in this use-case!\r
-</p>\r
-<h2>Coming Next...</h2>\r
-<p>\r
-In <a href="/develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire/" title="Jump to the next part of this series and learn how to turn on debugging for the HTTP-communication between your app and the Graph-API">the next part</a> of this series, I will show you, how you can debug the calls, that Spring Social makes to the Graph-API, by turning on the debugging of the classes, that process the HTTP-requests and -responses, that your app is making.\r
-</p>\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>671</wp:post_id>
-               <wp:post_date><![CDATA[2016-01-26 18:05:28]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-01-26 16:05:28]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="createmedia-nrw"><![CDATA[CreateMedia.NRW]]></category>
-               <category domain="post_tag" nicename="facebook"><![CDATA[facebook]]></category>
-               <category domain="post_tag" nicename="graph-api"><![CDATA[graph-api]]></category>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <category domain="post_tag" nicename="oauth2"><![CDATA[oauth2]]></category>
-               <category domain="post_tag" nicename="spring"><![CDATA[spring]]></category>
-               <category domain="post_tag" nicename="spring-boot"><![CDATA[spring-boot]]></category>
-               <category domain="post_tag" nicename="spring-social"><![CDATA[spring-social]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Develop a Facebook-App with Spring-Social – Part VII: What is Going On On The Wire</title>
-               <link>https://juplo.de/develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire/</link>
-               <pubDate>Fri, 29 Jan 2016 09:18:33 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=694</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-In this series of Mini-How-Tow's I will describe how to develop a facebook app with the help of <a href="http://projects.spring.io/spring-social/" title="Learn more about Spring-Social">Spring-Social</a>\r
-</p>\r
-<p>\r
-In <a href="/develop-a-facebook-app-with-spring-social-part-06-sign-in-users-through-the-canvas-page" title="Read part 6 of this series to learn, how you turn your spring-social-app into a real facebook-app">the last part of this series</a>, I showed you, how you can sign-in your users through the <code>signed_request</code>, that is send to your canvas-page.</p>\r
-<p>\r
-In this part, I will show you, how to turn on logging of the HTTP-requests, that your app sends to, and the -responses it recieves from the Facebook Graph-API.\r
-</p>\r
-<h2>The Source is With You</h2>\r
-<p>\r
-You can find the source-code on <a href="http://juplo.de/git/examples/facebook-app/" title="Link for cloning">http://juplo.de/git/examples/facebook-app/</a>\r
-and <a href="http://juplo.de/gitweb/?p=examples/facebook-app;a=summary" title="Browse the source-code now">browse it via gitweb</a>.\r
-Check out <code>part-07</code> to get the source for this part of the series.\r
-</p>\r
-<h2>Why You Want To Listen On The Wire</h2>\r
-<p>\r
-If you are developing your app, you will often wonder, why something does not work as expected.\r
-In this case, it is often very usefull to be able to debug the communitation between your app and the Graph-API.\r
-But since all requests to the Graph-API are secured by SSL you can not simply listen in with tcpdump or wireshark.\r
-</p>\r
-<p>\r
-Fortunately, you can turn on the debugging of the underling classes, that process theses requests, to sidestep this problem.\r
-</p>\r
-<h2>Introducing HttpClient</h2>\r
-<p>\r
-In its default-configuration, the Spring Framework will use the <code>HttpURLConnection</code>, which comes with the JDK, as http-client.\r
-As described in the <a href="http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#rest-client-access" title="Read more about that in the Spring-documentation">documentation</a>, some advanced methods are not available, when using <code>HttpURLConnection</code>\r
-Besides, the package <a href="https://hc.apache.org/httpcomponents-client-4.5.x/index.html" title="Visit the project home of Apache HttpClient"><code>HttpClient</code></a>, which is part of Apaches <code>HttpComponents</code> is a much more mature, powerful and configurable alternative.\r
-For example, you easily can plug in connection pooling, to speed up the connection handling, or caching to reduce the amount of requests that go through the wire.\r
-In production, you should always use this implementation, instead of the default-one, that comes with the JDK.\r
-</p>\r
-<p>\r
-Hence, we will switch our configuration to use the <code>HttpClient</code> from Apache, before turning on the debug-logging.\r
-</p>\r
-<h2>Switching From Apaches <code>HttpCompnents</code> To <code>HttpClient</code></h2>\r
-<p>\r
-To siwtch from the default client, that comes with the JDK to Apaches <code>HttpClient</code>, you have to configure an instance of <code>HttpComponentsClientHttpRequestFactory</code> as <code>HttpRequestFactory</code> in your <code>SocialConfig</code>:\r
-<pre class="prettyprint linenums" id="PATTERN"><code class="Java">@Bean\r
-public HttpComponentsClientHttpRequestFactory requestFactory(Environment env)\r
-{\r
-  HttpComponentsClientHttpRequestFactory factory =\r
-      new HttpComponentsClientHttpRequestFactory();\r
-  factory.setConnectTimeout(\r
-      Integer.parseInt(env.getProperty("httpclient.timeout.connection"))\r
-      );\r
-  factory.setReadTimeout(\r
-      Integer.parseInt(env.getProperty("httpclient.timeout.read"))\r
-      );\r
-  return factory;\r
-}\r
-</code></pre>\r
-<p>\r
-To use this configuration, you also have to add the dependency <code>org.apache.httpcomonents:httpclient</code> in your <code>pom.xml</code>.\r
-</p>\r
-<p>\r
-As you can see, this would also be the right place to enable other specialized configuration-options.\r
-</p>\r
-<h2>Logging The Headers From HTTP-Requests And Responses</h2>\r
-<p>\r
-I configured a short-cut to enable the logging of the HTTP-headers of the communication between the app and the Graph-API.\r
-Simply run the app with the additionally switch <code>-Dhttpclient.logging.level=DEBUG</code>\r
-</p>\r
-<h2>Take Full Control</h2>\r
-<p>\r
-If the headers are not enough to answer your questions, you can enable a lot more debugging messages.\r
-You just have to overwrite the default logging-levels.\r
-Read <a href="https://hc.apache.org/httpcomponents-client-4.5.x/logging.html" title="Jump to the logging-guide form HttpClient now.">the original documentation of <code>HttpClient</code></a>, for more details.\r
-</p>\r
-<p>\r
-For example, to enable logging of the headers and the content of all requests, you have to start your app like this:\r
-</p>\r
-<pre class="prettyprint linenums" id="PATTERN"><code class="bash">mvn spring-boot:run \\r
-    -Dfacebook.app.id=YOUR_ID \\r
-    -Dfacebook.app.secret=YOUR_SECRET \\r
-    -Dfacebook.app.canvas=https://apps.facebook.com/YOUR_NAMESPACE\r
-    -Dlogging.level.org.apache.http=DEBUG \\r
-    -Dlogging.level.org.apache.http.wire=DEBUG\r
-</code></pre>\r
-<p>\r
-The second switch is necessary, because I defined the default-level <code>ERROR</code> for that logger in our <code>src/main/application.properties</code>, to enable the short-cut for logging only the headers.\r
-</p>\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>694</wp:post_id>
-               <wp:post_date><![CDATA[2016-01-29 11:18:33]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-01-29 09:18:33]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[develop-a-facebook-app-with-spring-social-part-07-what-is-going-on-on-the-wire]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="createmedia-nrw"><![CDATA[CreateMedia.NRW]]></category>
-               <category domain="post_tag" nicename="facebook"><![CDATA[facebook]]></category>
-               <category domain="post_tag" nicename="graph-api"><![CDATA[graph-api]]></category>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <category domain="post_tag" nicename="oauth2"><![CDATA[oauth2]]></category>
-               <category domain="post_tag" nicename="spring"><![CDATA[spring]]></category>
-               <category domain="post_tag" nicename="spring-boot"><![CDATA[spring-boot]]></category>
-               <category domain="post_tag" nicename="spring-social"><![CDATA[spring-social]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_old_slug]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[develop-a-facebook-app-with-spring-social-part-07-whats-on-the-wire]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Release Of A Maven-Plugin to Maven Central Fails With &quot;error: unknown tag: goal&quot;</title>
-               <link>https://juplo.de/release-of-a-maven-plugin-to-maven-central-fails-with-error-unknown-tag-goal/</link>
-               <pubDate>Tue, 08 Mar 2016 00:29:46 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=711</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>error: unknown tag: goal</h2>\r
-<p>\r
-Releasing a maven-plugin via Maven Central does not work, if you have switched to Java 8.\r
-This happens, because hidden in the <code>oss-parent</code>, that you have to configure as <code>parent</code> of your project to be able to release it via Sonatype, the <code>maven-javadoc-plugin</code> is configured for you.\r
-And the version of <code>javadoc</code>, that is shipped with Java 8, by default checks the syntax of the comments and fails, if anything unexpected is seen.\r
-</p>\r
-<p>\r
-<strong>\r
-Unfortunatly, the special javadoc-tag's, like <code>@goal</code> or <code>@phase</code>, that are needed to configure the maven-plugin, are unexpected for javadoc.\r
-</strong>\r
-</p>\r
-<h2>Solution 1: Turn Of The Linting Again</h2>\r
-<p>\r
-As described elswehere, you can easily <a href="http://blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html" title="Read, how to turn of the automatic linting of javadoc in Java 8">turn of the linting</a> in the plugins-section of your <code>pom.xml</code>:\r
-</p>\r
-<pre class="prettyprint linenums"><code class="xml">&lt;plugin&gt;\r
-  &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;\r
-  &lt;artifactId&gt;maven-javadoc-plugin&lt;/artifactId&gt;\r
-  &lt;version&gt;2.7&lt;/version&gt;\r
-  &lt;configuration&gt;\r
-    &lt;additionalparam&gt;-Xdoclint:none&lt;/additionalparam&gt;\r
-  &lt;/configuration&gt;\r
-&lt;/plugin&gt;\r
-</code></pre>\r
-<h2>Solution 2: Tell javadoc About The Unknown Tags</h2>\r
-<p>\r
-Another not so well known approach, that I found in a <a href="https://github.com/julianhyde/hydromatic-resource/commit/da5b2f203402324c68dd2eb2e5ce628f722fefbb" title="Read the fix with the additional configuration for the unknown tags">fix</a> for <a href="https://github.com/julianhyde/hydromatic-resource/issues/1" title="See the issue, that lead me to the fix">an issue of some project</a>, is, to add the unknown tag's in the configuration of the <code>maven-javadoc-plugin</code>:\r
-</p>\r
-<pre class="prettyprint linenums"><code class="xml">&lt;plugin&gt;\r
-  &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;\r
-  &lt;artifactId&gt;maven-javadoc-plugin&lt;/artifactId&gt;\r
-  &lt;version&gt;2.7&lt;/version&gt;\r
-  &lt;configuration&gt;\r
-    &lt;tags&gt;\r
-      &lt;tag&gt;\r
-        &lt;name&gt;goal&lt;/name&gt;\r
-        &lt;placement&gt;a&lt;/placement&gt;\r
-        &lt;head&gt;Goal:&lt;/head&gt;\r
-      &lt;/tag&gt;\r
-      &lt;tag&gt;\r
-        &lt;name&gt;phase&lt;/name&gt;\r
-        &lt;placement&gt;a&lt;/placement&gt;\r
-        &lt;head&gt;Phase:&lt;/head&gt;\r
-      &lt;/tag&gt;\r
-      &lt;tag&gt;\r
-        &lt;name&gt;threadSafe&lt;/name&gt;\r
-        &lt;placement&gt;a&lt;/placement&gt;\r
-        &lt;head&gt;Thread Safe:&lt;/head&gt;\r
-      &lt;/tag&gt;\r
-      &lt;tag&gt;\r
-        &lt;name&gt;requiresDependencyResolution&lt;/name&gt;\r
-        &lt;placement&gt;a&lt;/placement&gt;\r
-        &lt;head&gt;Requires Dependency Resolution:&lt;/head&gt;\r
-      &lt;/tag&gt;\r
-      &lt;tag&gt;\r
-        &lt;name&gt;requiresProject&lt;/name&gt;\r
-        &lt;placement&gt;a&lt;/placement&gt;\r
-        &lt;head&gt;Requires Project:&lt;/head&gt;\r
-      &lt;/tag&gt;\r
-    &lt;/tags&gt;\r
-  &lt;/configuration&gt;\r
-&lt;/plugin&gt;\r
-</code></pre>\r
-\r
-\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>711</wp:post_id>
-               <wp:post_date><![CDATA[2016-03-08 02:29:46]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-03-08 00:29:46]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[release-of-a-maven-plugin-to-maven-central-fails-with-error-unknown-tag-goal]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="createmedia-nrw"><![CDATA[CreateMedia.NRW]]></category>
-               <category domain="category" nicename="explained"><![CDATA[Explained]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <category domain="post_tag" nicename="maven"><![CDATA[maven]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>hibernate-maven-plugin 2.0.0 released!</title>
-               <link>https://juplo.de/hibernate-maven-plugin-2-0-0-released/</link>
-               <pubDate>Wed, 09 Mar 2016 16:43:27 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=721</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Today we released the version 2.0.0 of <a href="/hibernate-maven-plugin" title="hibernate-maven-plugin">hibernate-maven-plugin</a> to <a href="http://search.maven.org/#search|gav|1|g%3A%22de.juplo%22%20AND%20a%3A%22hibernate-maven-plugin%22" title="Central">Central</a>!\r
-</p>\r
-<h2>Why Now?</h2>\r
-<p>\r
-During one of our other projects &dash; the development of <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Read more about our project">a vertical search-engine for events and locations</a>, which is <a href="http://yourshouter.com/partner/mweimh-nrw.html" title="Read more about the support by the ministery">funded by the mistery of economy of NRW</a> &dash;, we realized, that we were in the need of Hibernate 5 and some of the more sophisticated JPA-configuration-options.\r
-</p>\r
-<p>\r
-Unfortunatly &dash; <em>for us</em> &dash; the old releases of this plugin neither support Hibernate 5 nor all configuration options, that are available for use in the <code>META-INF/persistence.xml</code>.\r
-</p>\r
-<p>\r
-Fortunatly &dash; <em>for you</em> &dash; we decided, that we really need all that and have to integrate it in our little plugin.\r
-</p>\r
-<h2>Nearly Complete Rewrite</h2>\r
-<p>\r
-Due to <a href="http://docs.jboss.org/hibernate/orm/5.0/integrationsGuide/en-US/html_single/" title="Read more about this changes in the official Integrations Guide for Hibernate 5">changes in the way Hibernate has to be configured internally</a>, this release is a nearly complete rewrite.\r
-It was no longer possible, to just use the <a href="https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/toolsetguide.html#toolsetguide-s1-3">SchemaExport</a>-Tool to build up the configuration and support all possible configuration-approaches.\r
-Hence, the plugin now builds up the configuration using <a href="http://docs.jboss.org/hibernate/orm/5.0/integrationsGuide/en-US/html_single/#services" title="Read more about services and registries">Services and Registries</a>, like described in the Integration Guide.\r
-</p>\r
-<h2>Simplified Configuration: No Drop-In-Replacement!</h2>\r
-<p>\r
-We also took the opportunity, to simplify the configuration.\r
-Beforehand, the plugin had just used the configuration, that was set up in the class <a href="https://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/tool/hbm2ddl/SchemaExport.html">SchemaExport</a>.\r
-This reliefed us from the burden, to understand the configuration internals, but brought up some oddities of the internal implementation of the tool.\r
-It also turned out to be a bad decision in the long run, because some configuration options are hard coded in that class and cannot be changed.\r
-</p>\r
-<p>\r
-By building up the whole configuration by hand, it is now possible to implement separate goals for creating and dropping the schema.\r
-Also, it enables us to add a goal <code>update</code> in one of the next releases.\r
-Because of all this improvements, you have to revise your configuration, if you want to switch from 1.x to 2.x.\r
-</p>\r
-<p>\r
-<strong>Be warned: this release is <em>no drop-in replacement</em> of the previous releases!</strong>\r
-</p>\r
-<h2>Not Only For 4, But For Any Version</h2>\r
-<p>\r
-While rewirting the plugin, we focused on Hibernate 5, which was not supported by the older releases, because of some of the oddities of the internal implementation of the SchemaExport-tool.\r
-We tried to maintain backward compatibility.\r
-</p>\r
-<p>\r
-You should be able to use the new plugin with Hibernate 5 and also with older versions of Hibernate (we only tested that for Hibernate 4).\r
-Because of that, we dropped the 4 in the name of the plugin!\r
-</p>\r
-<h2>Extended Support For JPA-Configurations</h2>\r
-<p>\r
-We tried to support all possible configuration-approaches, that Hibernate 5 understands.\r
-Including hard coded XML-mapping-files in the <code>META-INF/persistence.xml</code>, that do not seem to be used very often, but which we needed in one of our own projects.\r
-</p>\r
-<p>\r
-Therefore, the plugin now understands all (or most of?) the relevant configuration options, that one can specify through a standard JPA-configuration.\r
-The plugin now should work with any configuration, that you drop in from your existing JPA- or Hibernate-projects.\r
-All recognized configuration from the different possible configuration-sources are merged together, considering the <a href="http://juplo.de/hibernate-maven-plugin/configuration.html#precedence" title="Jump to the documentation to read more about the configuration-method-precedence">configuration-method-precedence</a>, described in the documentation.\r
-</p>\r
-<p>\r
-We hope, we did not make any unhandy assumptions, while designing the merge-process.\r
-<em>Please let us know, if something wents wrong in your projects and you think it is, because we messed it up!</em>\r
-</p>\r
-<h2>Release notes:</h2>\r
-<pre>\r
-commit 64b7446c958efc15daf520c1ca929c6b8d3b8af5\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Mar 8 00:25:50 2016 +0100\r
-\r
-    javadoc hat to be configured multiple times for release:prepare\r
-\r
-commit 1730d92a6da63bdcc81f7a1c9020e73cdc0adc13\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Mar 8 00:13:10 2016 +0100\r
-\r
-    Added the special javadoc-tags for maven-plugins to the configuration\r
-\r
-commit 0611db682bc69b80d8567bf9316668a1b6161725\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Mon Mar 7 16:01:59 2016 +0100\r
-\r
-    Updated documentation\r
-\r
-commit a275df25c52fdb7b5b4275fcf9a359194f7b9116\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Mon Mar 7 17:56:16 2016 +0100\r
-\r
-    Fixed missing menu on generated site: moved template from skin to project\r
-\r
-commit e8263ad80b1651b812618c964fb02f7e5ddf3d7e\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Mon Mar 7 14:44:53 2016 +0100\r
-\r
-    Turned of doclint, that was introduced in Java 8\r
-    \r
-    See: http://blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html\r
-\r
-commit 62ec2b1b98d5ce144f1ac41815b94293a52e91e6\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Dec 22 19:56:41 2015 +0100\r
-\r
-    Fixed ConcurrentModificationException\r
-\r
-commit 9d6e06c972ddda45bf0cd2e6a5e11d8fa319c290\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Mon Dec 21 17:01:42 2015 +0100\r
-\r
-    Fixed bug regarding the skipping of unmodified builds\r
-    \r
-    If a property or class was removed, its value or md5sum stayed in the set\r
-    of md5sums, so that each following build (without a clean) was juged as\r
-    modified.\r
-\r
-commit dc652540d007799fb23fc11d06186aa5325058db\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sun Dec 20 21:06:37 2015 +0100\r
-\r
-    All packages up to the root are checked for annotations\r
-\r
-commit 851ced4e14fefba16b690155b698e7a39670e196\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sun Dec 20 13:32:48 2015 +0100\r
-\r
-    Fixed bug: the execution is no more skipped after a failed build\r
-    \r
-    After a failed build, further executions of the plugin were skipped, because\r
-    the MD5-summs suggested, that nothing is to do because nothing has changed.\r
-    Because of that, the MD5-summs are now removed in case of a failure.\r
-\r
-commit 08649780d2cd70f2861298d683aa6b1945d43cda\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sat Dec 19 18:02:02 2015 +0100\r
-\r
-    Mappings from JPA-mapping-files are considered\r
-\r
-commit bb8b638714db7fc02acdc1a9032cc43210fe5c0e\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Sat Dec 19 03:46:49 2015 +0100\r
-\r
-    Fixed minor misconfiguration in integration-test dependency test\r
-    \r
-    Error because of multiple persistence-units by repeated execution\r
-\r
-commit 3a7590b8862c3be691b05110f423865f6674f6f6\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Thu Dec 17 03:10:33 2015 +0100\r
-\r
-    Considering mapping-configuration from persistence.xml and hibernate.cfg.xml\r
-\r
-commit 23668ccaa93bfbc583c1697214bae116bd9f4ef6\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Thu Dec 17 02:53:38 2015 +0100\r
-\r
-    Sidestepped bug in Hibernate 5\r
-\r
-commit 8e5921c9e76b4540f1d4b75e05e338001145ff6d\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Wed Dec 16 22:09:00 2015 +0100\r
-\r
-    Introduced the goal "drop"\r
-    \r
-     * Fixed integration-test hibernate4-maven-plugin-envers-sample by adapting\r
-       it to the new drop-goal\r
-     * Adapted the other integration-tests to the new naming schema for the\r
-       create-script\r
-\r
-commit 6dff3bfb0f9ea7a1d0cc56398aaad29e31a17b91\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Wed Dec 16 18:08:56 2015 +0100\r
-\r
-    Reworked configuration and the tracking thereof\r
-    \r
-     * Moved common parameters from CreateMojo to AbstractSchemaMojo\r
-     * Reordered parameters into sensible groups\r
-     * Renamed the maven-property-names of the parameters\r
-     * All configuration-parameters are tracked, not only hibernate-parameters\r
-     * Introduced special treatment for some of the plugin-parameters (export\r
-       and show)\r
-\r
-commit b316a5b4122c3490047b68e1e4a6df205645aad5\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Wed Oct 21 11:49:56 2015 +0200\r
-\r
-    Reworked plugin-configuration: worshipped the DRY-principle\r
-\r
-commit 4940080670944a15916c68fb294e18a6bfef12d5\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Fri Oct 16 12:16:30 2015 +0200\r
-\r
-    Refined reimplementation of the plugin for Hibernate 5.x\r
-    \r
-    Renamed the plugin from hibernate4-maven-plugin to hibernate-maven-plugin,\r
-    because the goal is, to support all recent older versions with the new\r
-    plugin.\r
-\r
-commit fdda82a6f76deefd10f83da89d7e82054e3c3ecd\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Wed Oct 21 12:18:29 2015 +0200\r
-\r
-    Integration-Tests are skiped, if "maven.test.skip" is set to true\r
-\r
-commit b971570e28cbdc3b27eca15a7395586bee787446\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue Sep 8 13:55:43 2015 +0200\r
-\r
-    Updated version of juplo-skin for generation of documentation\r
-\r
-commit 3541cf3742dd066b94365d351a3ca39a35e3d3c8\r
-Author: Kai Moritz <kai@juplo.de>\r
-Date:   Tue May 19 21:41:50 2015 +0200\r
-\r
-    Added new configuration sources in documentation about precedence\r
-\r
-\r
-</pre>\r
-\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>721</wp:post_id>
-               <wp:post_date><![CDATA[2016-03-09 18:43:27]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-03-09 16:43:27]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[hibernate-maven-plugin-2-0-0-released]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="createmedia-nrw"><![CDATA[CreateMedia.NRW]]></category>
-               <category domain="post_tag" nicename="hibernate"><![CDATA[hibernate]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <category domain="post_tag" nicename="jpa"><![CDATA[jpa]]></category>
-               <category domain="post_tag" nicename="maven"><![CDATA[maven]]></category>
-               <category domain="category" nicename="projects"><![CDATA[Projects]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>61730</wp:comment_id>
-                       <wp:comment_author><![CDATA[Simon]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[simon.kaufmann@adesso.ch]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[194.230.155.233]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2020-06-24 11:32:38]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2020-06-24 09:32:38]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hey thanks for the update to hibernate 5.\r
-We are just migrating from your older version and we have a question:\r
-Is there a way to add support for @NotNull annotations (javax.validation.constraints)?\r
-\r
-In the previous version (for hibernate 4) the plugin could handle those @NotNull annotated fields and generated a Not Null constraint.\r
-But now with the current version all fields which only had @NotNull will rest nullable in the generated script until you add @Column(nullable = false).]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1592991158.407962;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1602360430.037055;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Problems Deploying A Spring-Boot-App As WAR</title>
-               <link>https://juplo.de/problems-deploying-a-spring-boot-app-as-war/</link>
-               <pubDate>Fri, 08 Apr 2016 20:38:35 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=735</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>Spring-Boot-App Is Not Started, When Deployed As WAR</h2>\r
-<p>\r
-Recently, I had a lot of trouble, deploying my spring-boot-app as war under Tomcat 8 on Debian Jessie.\r
-The WAR was found and deployed by tomcat, but it was never started.\r
-Browsing the URL of the app resulted in a 404.\r
-And instead of <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html" title="See, what Spring-Boot usually shows, when starting...">the fancy Spring-Boot ASCII-art banner</a>, the only matching entry that showed up in my log-file was:\r
-</p>\r
-<pre class="prettyprint linenums" id="failed-startup"><code class="Bash">INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Spring WebApplicationInitializers detected on classpath: [org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration$JerseyWebApplicationInitializer@1fe086c]\r
-</code></pre>\r
-<p>\r
-<a href="http://stefan-isele.logdown.com/posts/201646" title="A short overview of Springs startup-mechanism and what can go wrong">A blog-post from Stefan Isle</a> lead me to the solution, what was going wrong.\r
-In my case, there was no wrong version of Spring on the classpath.\r
-But my <code>WebApplicationInitializer</code> was not found, because I had it compiled with a version of Java, that was not available on my production system.\r
-</p>\r
-<h2><code>WebApplicationInitializer</code> Not Found Because Of Wrong Java Version</h2>\r
-<p>\r
-On my development box, I had compiled and tested the WAR with Java 8.\r
-But on my production system, running Debian 8 (Jessie), only Java 7 was available.\r
-And because of that, my <code>WebApplicationInitializer</code>\r
-</p>\r
-<p>\r
-After installing Java 8 from <a href="http://backports.debian.org/Instructions/" title="Learn more on debian-backports">debian-backports</a> on my production system, like described in this <a href="https://github.com/OpenTreeOfLife/germinator/wiki/Debian-upgrade-notes:-jessie-and-openjdk-8" title="Read, how to install Java 8 from debian-backports">nice debian-upgrade note</a>, the <code>WebApplicationInitializer</code> of my App was found and everything worked like a charme, again.\r
-</p>\r
-\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>735</wp:post_id>
-               <wp:post_date><![CDATA[2016-04-08 22:38:35]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-04-08 20:38:35]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[problems-deploying-a-spring-boot-app-as-war]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="createmedia-nrw"><![CDATA[CreateMedia.NRW]]></category>
-               <category domain="post_tag" nicename="debian"><![CDATA[debian]]></category>
-               <category domain="category" nicename="explained"><![CDATA[Explained]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <category domain="post_tag" nicename="spring"><![CDATA[spring]]></category>
-               <category domain="post_tag" nicename="spring-boot"><![CDATA[spring-boot]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Show Spring-Boot Auto-Configuration-Report When Running Via &quot;mvn spring-boot:run&quot;</title>
-               <link>https://juplo.de/show-spring-boot-auto-configuration-report-when-running-via-mvn-spring-boot-run/</link>
-               <pubDate>Thu, 23 Jun 2016 10:49:03 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=754</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-There are a lot of explanations, how to turn on the Auto-Configuration-Report offered by Spring-Boot to debug the configuration of ones app.\r
-For an good example take a look at this little <a href="http://www.leveluplunch.com/java/tutorials/009-spring-boot-what-autoconfigurations-turned-on/" title="This guide shows nearly all options, to turn on the report">Spring boot troubleshooting auto-configuration</a> guide.\r
-But most often, when I want to see the Auto-Configuration-Report, I am running my app via <code>mvn:spring-boot:run</code>.\r
-And, unfortunatly, none of the guids you can find by google tells you, how to turn on the Auto-Configuration-Report in this case.\r
-Hence, I hope I can help out, with this little tip.\r
-</p>\r
-<h2>How To Turn On The Auto-Configuration-Report When Running <code>mvn spring-boot:run</code></h2>\r
-<p>\r
-The report is shown, if the logging for <code>org.springframework.boot.autoconfigure.logging</code> is set to <code>DEBUG</code>.\r
-The most simple way to do that, is to add the following line to your <code>src/main/resources/application.properties</code>:\r
-</p>\r
-<pre class="prettyprint linenums" id="redirect"><code class="shell">logging.level.org.springframework.boot.autoconfigure.logging=DEBUG\r
-</code></pre>\r
-<p>\r
-I was not able, to enable the logging via a command-line-switch.\r
-The seemingly obvious way to add the property to the command line with a <code>-D</code> like this:\r
-</p>\r
-<pre class="prettyprint linenums" id="redirect"><code class="shell">mvn spring-boot:run -Dlogging.level.org.springframework.boot.autoconfigure.logging=DEBUG\r
-</code></pre>\r
-<p>\r
-did not work for me.\r
-If anyone could point out, how to do that in a comment to this post, I would be realy grateful!\r
-</p>\r
-\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>754</wp:post_id>
-               <wp:post_date><![CDATA[2016-06-23 12:49:03]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-06-23 10:49:03]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[show-spring-boot-auto-configuration-report-when-running-via-mvn-spring-boot-run]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <category domain="post_tag" nicename="maven"><![CDATA[maven]]></category>
-               <category domain="post_tag" nicename="spring"><![CDATA[spring]]></category>
-               <category domain="post_tag" nicename="spring-boot"><![CDATA[spring-boot]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>XPath 2.0 deep-equal Does Not Match Like Expected - The Problem With Whitespace</title>
-               <link>https://juplo.de/xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace/</link>
-               <pubDate>Tue, 08 Nov 2016 14:32:07 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=762</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-I just stumbled accros a problem with the <code>deep-equal()</code>-method introduced by <code>XPath 2.0</code>.\r
-It costs me two hours at minimum to find out, what was going on.\r
-So I want to share this with you, in case your are wasting time on the same problem and try to find a solution via google ;)\r
-</p>\r
-<p>\r
-If you never heard of <code>deep-equal()</code> and just wonder how to compare XML-nodes in the right way, you should probably read this <a href="http://www.xml.com/lpt/a/1589" title="Read more about the posibilities to compare nodes in XSLT">exelent article about equality in XSLT</a> as a starter.\r
-</p>\r
-<h2>My Problem</h2>\r
-<p>\r
-My problem was, that I wanted to parse/output a node only, if there exists no node on the <code>ancestor</code>-axis, that has a exact duplicate of that node as a direct child.\r
-</p>\r
-<h2>The Difference Between A Comparison With <code>=</code> And With <code>deep-equal()</code></h2>\r
-<p>\r
-If you just use simple equality (with <code>=</code> or <code>eq</code>), the two compared nodes are converted into strings implicitly.\r
-That is no problem, if you are comparing attributes, or nodes, that only contain text.\r
-But in all other cases, you will only compare the text-contents of the two nodes and their children.\r
-Hence, if they differ only in an attribute, your test will report that they are equal, which might not be what you are expecting.\r
-</p>\r
-<p>\r
-For example, the XPath-expression\r
-</p>\r
-<pre class="prettyprint"><code class="XPath">//child/ref[ancestor::parent/ref=.]</code></pre>\r
-<p>\r
- will match the <code>&lt;ref&gt;</code>-node with <code>@id='bar'</code>, that is nested insiede the <code>&lt;child&gt;</code>-node in this example-XML, what I was not expecting:\r
-</p>\r
-<pre class="prettyprint linenums" id="PATTERN"><code class="Java">&lt;root&gt;\r
-  &lt;parent&gt;\r
-    &lt;ref id="foo"&gt;&lt;content&gt;Same Text-Content&lt;/content&gt;&lt;/ref&gt;\r
-    &lt;child&gt;\r
-      &lt;ref id="bar"&gt;&lt;content&gt;Same Text-Content&lt;/content&gt;&lt;/ref&gt;\r
-    &lt;/child&gt;\r
-  &lt;parent&gt;\r
-&lt;list&gt;</code></pre>\r
-<p>\r
-So, what I tried, after I found out about <code>deep-equal()</code> was the following <code>Xpath</code>-expression, which solves the problem in the above example:\r
-</p>\r
-<pre class="prettyprint"><code class="XPath">//child/ref[deep-equal(ancestor::parent/ref,.)]</code></pre>\r
-<h2>The Unexpected Behaviour Of <code>deep-equal()</code></h2>\r
-<p>\r
-But, moving on I stumbled accross cases, where I was expecting a match, but <code>deep-equal()</code> does not match the nodes.\r
-For example:\r
-</p>\r
-<pre class="prettyprint linenums" id="PATTERN"><code class="Java">&lt;root&gt;\r
-  &lt;parent&gt;\r
-    &lt;ref id="same"&gt;\r
-      &lt;content&gt;Same Text-Content&lt;/content&gt;\r
-    &lt;/ref&gt;\r
-    &lt;child&gt;\r
-      &lt;ref id="same"&gt;\r
-        &lt;content&gt;Same Text-Content&lt;/content&gt;\r
-      &lt;/ref&gt;\r
-    &lt;/child&gt;\r
-  &lt;parent&gt;\r
-&lt;list&gt;</code></pre>\r
-<p>\r
-You probably catch the diffrenece at first glance, since I laid out the examples accordingly and gave you a hint in the heading of this post - but it really took me a long time to get that:\r
-</p>\r
-<h2>It is all about whitespace!</h2>\r
-<p>\r
-<code>deep-equal()</code> compares <em>all</em> child-nodes and only yields a match, if the compared nodes have exactly the same child-nodes.\r
-But in the second example, the compared <code>&lt;ref&gt;</code>-nodes contain whitespace befor and after their child-node <code>&lt;content&gt;</code>.\r
-And these whitespace are in fact implicite child-nodes of type text.\r
-Hence, the two nodes in the second example differe, because the indentation on the second one has two more spaces.\r
-</p>\r
-<h2>The solution...?</h2>\r
-<p>\r
-Unfortunatly, I do not really know a good solution.\r
-(If you come up with one, feel free to note or link it in the comments!)\r
-</p>\r
-<p>\r
-The best solution would be an option additional argument for <code>deep-equal()</code>, that can be selected to tell the function to ignore such whitespace.\r
-In fact, some XSLT-parsers do provide such an argument.\r
-</p>\r
-<p>\r
-The only other solution, I can think of, is, to write another XSLT-script to remove all the whitespaces between tags to circumvent this at the first glance unexpected behaviour of <code>deep-equal()</code>\r
-</p>\r
-\r
-\r
-\r
-\r
-<h2>Funded by the Europian Union</h2>\r
-<p>\r
-  This article was published in the course of a\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project">resarch-project</a>,\r
-  that is funded by the European Union and the federal state Northrhine-Wetphalia.\r
-</p>\r
-<p>\r
-  <a href="http://yourshouter.com/projekte/crowdgest%C3%BCtzte-veranstaltungs-suchmaschine.html" title="Show details about the funded resarch-project" class="img">\r
-    <img src="/img/EFRE_Foerderhinweis_deutsch_farbig.svg" alt="Europäische Union: Investitionen in unsere Zukunft - Europäischer Fonds für regionale Entwicklung" width="50%" />\r
-    <img src="/img/Ziel2NRW_4c_1809_eps.svg" alt="EFRE.NRW 2014-2020: Invesitionen in Wachstum und Beschäftigung" width="80%" />\r
-  </a>\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>762</wp:post_id>
-               <wp:post_date><![CDATA[2016-11-08 16:32:07]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2016-11-08 14:32:07]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[xpath-2-0-deep-equal-does-not-match-like-expected-the-problem-with-whitespace]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="explained"><![CDATA[Explained]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>57054</wp:comment_id>
-                       <wp:comment_author><![CDATA[yashpal gandhi]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[yashpal.gandhi@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[192.168.66.1]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2018-09-28 08:38:10]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2018-09-28 06:38:10]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Plugin doesn't support hibernate-core v5.2.5 and above. Please update.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1558692007.1256471;s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1538116690.3000131;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Encrypt Communication Between Kafka And ZooKeeper With TLS</title>
-               <link>https://juplo.de/encrypt-communication-between-kafka-and-zookeeper-with-tls/</link>
-               <pubDate>Tue, 25 Jun 2019 19:22:45 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=881</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>TL;DR</h2>\r
-<ol>\r
-<li>Download and unpack <a href="https://juplo.de/wp-uploads/zookeeper+tls.tgz">zookeeper+tls.tgz</a>.</li>\r
-<li>Run <a href="https://juplo.de/wp-uploads/zookeeper+tls/README.sh">README.sh</a> for a fully automated example of the presented setup.</li>\r
-</ol>\r
-<p>\r
-Copy and paste to execute the two steps on Linux:\r
-</p>\r
-<pre class="prettyprint"><code class="bash">curl -sc - https://juplo.de/wp-uploads/zookeeper+tls.tgz | tar -xzv && cd zookeeper+tls && ./README.sh\r
-</code></pre>\r
-A <a href="https://www.trion.de/news/2019/06/28/kafka-zookeeper-tls.html" title="Hier findest du eine deutsche Übersetzung dieses Artikels">german translation</a> of this article can be found on <a href="https://www.trion.de/news/" title="A lot of intresting posts about Java, Docker, Kubernetes, Spring Boot and so on can be found @trion">http://trion.de</a>.\r
-\r
-<h2>Current Kafka Cannot Encrypt ZooKeeper-Communication</h2>\r
-<p>\r
-Up until now (<a href="https://kafka.apache.org/documentation/#security_overview" title="Read more about the supported options in the original documentation of version 2.3.0">Version 2.3.0 of Apache Kafka</a>) it is not possible, to encrypt the communication between the Kafka-Brokers and their ZooKeeper-ensemble.\r
-This is not possiible, because ZooKeeper 3.4.13, which is shipped with Apache Kafka 2.3.0, lacks support for TLS-encryption.\r
-</p>\r
-<p>\r
-The documentation deemphasizes this, with the observation, that usually only non-sensitive data (configuration-data and status information) is stored in ZooKeeper and that it would not matter, if this data is world-readable, as long as it can be protected against manipulation, which can be done through proper authentication and ACL's for zNodes:\r
-</p>\r
-<blockquote cite="https://docs.confluent.io/2.0.0/kafka/zookeeper-authentication.html"><em>The rationale behind this decision is that the data stored in ZooKeeper is not sensitive, but inappropriate manipulation of znodes can cause cluster disruption.</em> (<a href="https://kafka.apache.org/documentation/#zk_authz" title="Read the documentation about how to secure ZooKeeper">Kafka-Documentation</a>)</blockquote>\r
-<p>\r
-This quote obfuscates the <a href="https://kafka.apache.org/documentation/#security_sasl_scram_security" title="The security considerations for SASL/SCRAM are clearly stating, that ZooKeeper must be protected, because it stores sensitive authentication data in this case">elsewhere mentioned fact</a>, that there are use-cases that store sensible data in ZooKeeper.\r
-For example, if authentication via <a href="https://kafka.apache.org/documentation/#security_sasl_scram_clientconfig" title="Read more about authentication via SASL/SCRAM">SASL/SCRAM</a> or <a href="https://kafka.apache.org/documentation/#security_delegation_token" tile="Read more about delegation tokens">Delegation Tokens</a> is used.\r
-Accordingly, the documentation often stresses, that usually there is no need to make ZooKeeper accessible to normal clients.\r
-Nowadays, only admin-tools need direct access to the ZooKeeper-ensemble.\r
-Hence, it is stated as a best practice, to make the ensemble only available on a local network, hidden behind a firewall or such.\r
-</p>\r
-<p>\r
-<strong>In cleartext: One must not run a Kafka-Cluster, that spans more than one data-center &mdash; or at least make sure, that all communication is tunneled through a virtual private network.</strong>\r
-</p>\r
-<h2>ZooKeeper 3.5.5 To The Rescue</h2>\r
-<p>\r
-On may the 20th 2019, <a href="http://zookeeper.apache.org/releases.html#releasenotes" title="Read the release notes">version 3.5.5 of ZooKeeper</a> has been released.\r
-Version 3.5.5 is the first stable release of the 3.5.x branch, that introduces the support for TLS-encryption, the community has yearned for so long.\r
-It supports the encryption of all communication between the nodes of a ZooKeeper-ensemble and between ZooKeeper-Servers and -Clients.\r
-</p>\r
-<p>\r
-Part of ZooKeeper is a sophisticated client-API, that provide a convenient abstraction for the communication between clients and servers over the <em>Atomic Broadcast Protocol</em>.\r
-The TLS-encryption is applied by this API transparently.\r
-Because of that, all client-implementations can profit from this new feature through a simple library-upgrade from 3.4.13 to 3.5.5.\r
-<strong>\r
-This article will walk you through an example, that shows how to carry out such a library-upgrade for Apache Kafka 2.3.0 and configure a cluster to use TLS-encryption, when communicating with a standalone ZooKeeper.\r
-</strong>\r
-</p>\r
-<h2>Disclaimer</h2>\r
-<p>\r
-<strong>The presented setup is ment for evaluation only!</strong>\r
-</p>\r
-<p>\r
-It fiddles with the libraries, used by Kafka, which might cause unforseen issues.\r
-Furthermore, using TLS-encryption in ZooKeeper requires one to switch from the battle-tested <code>NIOServerCnxnFactory</code>, which uses the <a href="https://en.wikipedia.org/wiki/Non-blocking_I/O_(Java)" title="Learn more about non-blocking I/O in Java">NIO-API</a> directly, to the newly introduced <code>NettyServerCnxnFactory</code>, which is build on top of <a href="https://netty.io/" title="Learn more about Netty">Netty</a>.\r
-</p>\r
-<h2>Recipe To Enable TLS Between Broker And ZooKeeper</h2>\r
-<p>\r
-The article will walk you step by step through the setup now.\r
-If you just want to evaluate the example, you can <a href="#scripts" title="I am so inpatient, just get me to the fully automated example">jump to the download-links</a>.\r
-</p>\r
-<p>\r
-All commands must be executed in the same directory.\r
-We recommend, to create a new directory for that purpose.\r
-</p>\r
-<h3>Download Kafka and ZooKeeper</h3>\r
-<p>\r
-First of all: Download version 2.3.0 of Apache Kafka and version 3.5.5 of Apache ZooKeeper:\r
-</p>\r
-<pre class="prettyprint"><code class="bash">curl -sc - http://ftp.fau.de/apache/zookeeper/zookeeper-3.5.5/apache-zookeeper-3.5.5-bin.tar.gz | tar -xzv\r
-curl -sc - http://ftp.fau.de/apache/kafka/2.3.0/kafka_2.12-2.3.0.tgz | tar -xzv\r
-</code></pre>\r
-<h3>Switch Kafka 2.3.0 from ZooKeeper 3.4.13 to ZooKeeper 3.5.5</h3>\r
-<p>Remove the 3.4.13-version from the <code>libs</code>-directory of Apache Kafka:\r
-<pre class="prettyprint"><code class="bash">rm -v kafka_2.12-2.3.0/libs/zookeeper-3.4.14.jar\r
-</code></pre>\r
-<p>Then copy the JAR's of the new version of Apache ZooKeeper into that directory. (The last JAR is only needed for CLI-clients, like for example <code>zookeeper-shell.sh</code>.)</p>\r
-<pre class="prettyprint"><code class="bash">cp -av apache-zookeeper-3.5.5-bin/lib/zookeeper-3.5.5.jar kafka_2.12-2.3.0/libs/\r
-cp -av apache-zookeeper-3.5.5-bin/lib/zookeeper-jute-3.5.5.jar kafka_2.12-2.3.0/libs/\r
-cp -av apache-zookeeper-3.5.5-bin/lib/netty-all-4.1.29.Final.jar kafka_2.12-2.3.0/libs/\r
-cp -av apache-zookeeper-3.5.5-bin/lib/commons-cli-1.2.jar kafka_2.12-2.3.0/libs/\r
-</code></pre>\r
-<p>\r
-That is all there is to do to upgrade ZooKeeper.\r
-If you run one of the Kafka-commands, it will use ZooKeeper 3.5.5. from now on.\r
-</p>\r
-<h3>Create A Private CA And The Needed Certificates</h3>\r
-<p>\r
-<em>\r
-You can <a href="http://juplo.de/create-self-signed-multi-domain-san-certificates/" title="Lern how to set up a private CA and create self-signed certificates">read more about setting up a private CA in this post</a>...\r
-</em>\r
-</p>\r
-<p>\r
-Create the root-certificate for the CA and store it in a Java-truststore:\r
-</p>\r
-<pre class="prettyprint"><code class="bash">openssl req -new -x509 -days 365 -keyout ca-key -out ca-cert -subj "/C=DE/ST=NRW/L=MS/O=juplo/OU=kafka/CN=Root-CA" -passout pass:superconfidential\r
-keytool -keystore truststore.jks -storepass confidential -import -alias ca-root -file ca-cert -noprompt\r
-</code></pre>\r
-<p>\r
-The following commands will create a self-signed certificate in <strong><code>zookeeper.jks</code></strong>.\r
-What happens is:\r
-</p>\r
-<ol>\r
-<li>Create a new key-pair and certificate for <code>zookeeper</code></li>\r
-<li>Generate a certificate-signing-request for that certificate</li>\r
-<li>Sign the request with the key of private CA and also add a SAN-extension, so that the signed certificate is also valid for <code>localhost</code></li>\r
-<li>Import the root-certificate of the private CA into the keystore <code>zookeeper.jks</code></li>\r
-<li>Import the signed certificate for <code>zookeeper</code> into the keystore <code>zookeeper.jks</code></li>\r
-</ol>\r
-<p>\r
-<em>\r
-You can <a href="http://juplo.de/create-self-signed-multi-domain-san-certificates/#sign-with-san" title="Lern how to sign certificates with SAN-extension">read more about creating self-signed certificates with multiple domains and building a Chain-of-Trust here</a>...\r
-</em>\r
-</p>\r
-<pre class="prettyprint"><code class="bash">NAME=zookeeper\r
-keytool -keystore $NAME.jks -storepass confidential -alias $NAME -validity 365 -genkey -keypass confidential -dname "CN=$NAME,OU=kafka,O=juplo,L=MS,ST=NRW,C=DE"\r
-keytool -keystore $NAME.jks -storepass confidential -alias $NAME -certreq -file cert-file\r
-openssl x509 -req -CA ca-cert -CAkey ca-key -in cert-file -out $NAME.pem -days 365 -CAcreateserial -passin pass:superconfidential -extensions SAN -extfile <(printf "\n[SAN]\nsubjectAltName=DNS:$NAME,DNS:localhost")\r
-keytool -keystore $NAME.jks -storepass confidential -import -alias ca-root -file ca-cert -noprompt\r
-keytool -keystore $NAME.jks -storepass confidential -import -alias $NAME -file $NAME.pem\r
-</code></pre>\r
-<p>\r
-Repeat this with:\r
-</p>\r
-<ul>\r
-<li><strong><code>NAME=kafka-1</code></strong></li>\r
-<li><strong><code>NAME=kafka-2</code></strong></li>\r
-<li><strong><code>NAME=client</code></strong></li>\r
-</ul>\r
-<p>\r
-Now we have signed certificates for all participants in our small example, that are stored in separate keystores, each with a Chain-of-Trust set up, that is rooting in our private CA.\r
-We also have a truststore, that will validate all these certificates, because it contains the root-certificate of the Chain-of-Trust: the certificate of our private CA.\r
-</p>\r
-<h3>Configure And Start ZooKeeper</h3>\r
-<p>\r
-<em>We hightlight/explain only the configuration-options here, that are needed for TLS-encryption!</em>\r
-</p>\r
-<p>\r
-In our setup, the standalone ZooKeeper essentially needs two specially tweaked configuration files, to use encryption.\r
-</p>\r
-<p>Create the file <strong><code>java.env</code></strong>:</p>\r
-<pre class="prettyprint"><code class="bash">SERVER_JVMFLAGS="-Xms512m -Xmx512m -Dzookeeper.serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory"\r
-ZOO_LOG_DIR=.\r
-</code></pre>\r
-<ul>\r
-<li>The Java-Environmentvariable <strong><code>zookeeper.serverCnxnFactory</code></strong> switches the connection-factory to use the Netty-Framework.<br /><strong>Without this, TLS is not possible!</strong></li>\r
-</ul>\r
-<p>Create the file <strong><code>zoo.cfg</code></strong>:</p>\r
-<pre class="prettyprint"><code class="bash">dataDir=/tmp/zookeeper\r
-secureClientPort=2182\r
-maxClientCnxns=0\r
-authProvider.1=org.apache.zookeeper.server.auth.X509AuthenticationProvider\r
-ssl.keyStore.location=zookeeper.jks\r
-ssl.keyStore.password=confidential\r
-ssl.trustStore.location=truststore.jks\r
-ssl.trustStore.password=confidential\r
-</code></pre>\r
-<ul>\r
-<li><strong><code>secureClientPort</code></strong>: We only allow encrypted connections!<br />(If we want to allow unencrypted connections too, we can just specify <code>clientPort</code> additionally.)</li>\r
-<li><strong><code>authProvider.1</code></strong>: Selects authentification through client certificates</li>\r
-<li><strong><code>ssl.keyStore.*</code></strong>: Specifies the path to and password of the keystore, with the <code>zookeeper</code>-certificate</li>\r
-<li><strong><code>ssl.trustStore.*</code></strong>: Specifies the path to and password of the common truststore with the root-certificate of our private CA</li>\r
-</ul>\r
-<p>Copy the file <strong><code>log4j.properties</code></strong> into the current working directory, to enable logging for ZooKeeper (see also <code>java.env</code>):</p>\r
-<pre class="prettyprint"><code class="bash">cp -av apache-zookeeper-3.5.5-bin/conf/log4j.properties .\r
-</code></pre>\r
-<p>Start the ZooKeeper-Server:</p>\r
-<pre class="prettyprint"><code class="bash">apache-zookeeper-3.5.5-bin/bin/zkServer.sh --config . start\r
-</code></pre>\r
-<ul>\r
-<li><strong><code>--config .</code></strong>: The script should search in the current directory for the configration data and certificates.</li>\r
-</ul>\r
-<h3>Konfigure And Start The Brokers</h3>\r
-<p>\r
-<em>\r
-We hightlight/explain only the configuration-options and start-parameters here, that are needed to encrypt the communication between the Kafka-Brokers and the ZooKeeper-Server!\r
-</em>\r
-</p>\r
-<p>\r
-The other parameters shown here, that are concerned with SSL are only needed for securing the communication between the Brokers itself and between Brokers and Clients.\r
-You can read all about them in the <a href="https://kafka.apache.org/documentation/#security">standard documentation</a>.\r
-In short: This example is set up, to use SSL for authentication between the brokers and SASL/PLAIN for client-authentification &mdash; both channels are encrypted with TLS.\r
-</em>\r
-</p>\r
-<p>\r
-TLS for the ZooKeeper Client-API is configured through Java-Environmentvariables.\r
-Hence, most of the SSL-configuration for connecting to ZooKeeper has to be specified, when starting the broker.\r
-Only the address and port for the connction itself is specified in the configuration-file.\r
-</p>\r
-<p>Create the file <strong><code>kafka-1.properties</code></strong>:</p>\r
-<pre class="prettyprint"><code class="bash">broker.id=1\r
-zookeeper.connect=zookeeper:2182\r
-listeners=SSL://kafka-1:9193,SASL_SSL://kafka-1:9194\r
-security.inter.broker.protocol=SSL\r
-ssl.client.auth=required\r
-ssl.keystore.location=kafka-1.jks\r
-ssl.keystore.password=confidential\r
-ssl.key.password=confidential\r
-ssl.truststore.location=truststore.jks\r
-ssl.truststore.password=confidential\r
-listener.name.sasl_ssl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required user_consumer="pw4consumer" user_producer="pw4producer";\r
-sasl.enabled.mechanisms=PLAIN\r
-log.dirs=/tmp/kafka-1-logs\r
-offsets.topic.replication.factor=2\r
-transaction.state.log.replication.factor=2\r
-transaction.state.log.min.isr=2\r
-</code></pre>\r
-<ul>\r
-<li><strong><code>zookeeper.connect</code></strong>: If you allow unsecure connections too, be sure to specify the right port here!</li>\r
-<li><em>All other options are not relevant for encrypting the connections to ZooKeeper</em></li>\r
-</ul>\r
-<p>\r
-Start the broker in the background and remember its PID in the file <strong><code>KAFKA-1</code></strong>:</p>\r
-<pre class="prettyprint"><code class="bash">(\r
-  export KAFKA_OPTS="\r
-    -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty\r
-    -Dzookeeper.client.secure=true\r
-    -Dzookeeper.ssl.keyStore.location=kafka-1.jks\r
-    -Dzookeeper.ssl.keyStore.password=confidential\r
-    -Dzookeeper.ssl.trustStore.location=truststore.jks\r
-    -Dzookeeper.ssl.trustStore.password=confidential\r
-  "\r
-  kafka_2.12-2.3.0/bin/kafka-server-start.sh kafka-1.properties & echo $! > KAFKA-1\r
-) > kafka-1.log &\r
-</code></pre>\r
-<p>Check the logfile <strong><code>kafka-1.log</code></strong> to confirm that the broker starts without errors!</p>\r
-<ul>\r
-<li><strong><code>zookeeper.clientCnxnSocket</code></strong>: Switches from NIO to the Netty-Framework.<br /><strong>Without this, the ZooKeeper Client-API (just like the ZooKeeper-Server) cannot use TLS!</strong></li>\r
-<li><strong><code>zookeeper.client.secure=true</code></strong>: Switches on TLS-encryption, for all connections to any ZooKeeper-Server</li>\r
-<li><strong><code>zookeeper.ssl.keyStore.*</code></strong>: Specifies the path to and password of the keystore, with the <code>kafka-1</code>-certificate</li>\r
-<li><strong><code>zookeeper.ssl.trustStore.*</code></strong>: Specifies the path to and password of the common truststore with the root-certificate of our private CA</li>\r
-</ul>\r
-<p>\r
-<em>\r
-Do the same for <strong><code>kafka-2</code></strong>!\r
-And do not forget, to adapt the config-file accordingly &mdash; or better: just <a href="https://juplo.de/wp-uploads/zookeeper+tls/kafka-2.properties">download a copy</a>...\r
-</em>\r
-</p>\r
-<h3>Configure And Execute The CLI-Clients</h3>\r
-<p>\r
-All scripts from the Apache-Kafka-Distribution that connect to ZooKeeper are configured in the same way as seen for <code>kafka-server-start.sh</code>.\r
-For example, to create a topic, you will run:\r
-</p>\r
-<pre class="prettyprint"><code class="bash">export KAFKA_OPTS="\r
-  -Dzookeeper.clientCnxnSocket=org.apache.zookeeper.ClientCnxnSocketNetty\r
-  -Dzookeeper.client.secure=true\r
-  -Dzookeeper.ssl.keyStore.location=client.jks\r
-  -Dzookeeper.ssl.keyStore.password=confidential\r
-  -Dzookeeper.ssl.trustStore.location=truststore.jks\r
-  -Dzookeeper.ssl.trustStore.password=confidential\r
-"\r
-kafka_2.12-2.3.0/bin/kafka-topics.sh \\r
-  --zookeeper zookeeper:2182 \\r
-  --create --topic test \\r
-  --partitions 1 --replication-factor 2\r
-</code></pre>\r
-<p><em>Note:</em> A different keystore is used here (<code>client.jks</code>)!</p>\r
-<p>\r
-CLI-clients, that connect to the brokers, can be called as usual.\r
-</p>\r
-<p>\r
-In this example, they use an encrypted listener on port 9194 (for <code>kafka-1</code>) and are authenticated using SASL/PLAIN.\r
-The client-configuration is kept in the files <code>consumer.config</code> and <code>producer.config</code>.\r
-Take a look at that files and compare them with the broker-configuration above.\r
-If you want to lern more about securing broker/client-communication, we refere you to the <a href="https://kafka.apache.org/documentation/#security" title="The official documentation does a good job on this topic!">official documentation</a>.\r
-</p>\r
-<p>\r
-<em>\r
-If you have trouble to start these clients, download the scripts and take a look at the examples in <a href="https://juplo.de/wp-uploads/zookeeper+tls/README.sh">README.sh</a>\r
-</em>\r
-</p>\r
-<h3>TBD: Further Steps To Take...</h3>\r
-<p>\r
-This recipe only activates TLS-encryption between Kafka-Brokers and a Standalone ZooKeeper.\r
-It does not show, how to enable TLS between ZooKeeper-Nodes (which should be easy) or if it is possible to authenticate Kafka-Brokers via TLS-certificates. These topics will be covered in future articles...\r
-</p>\r
-<h2 id="scripts">Fully Automated Example Of The Presented Setup</h2>\r
-<p>\r
-Download and unpack <a href="https://juplo.de/wp-uploads/zookeeper+tls.tgz">zookeeper+tls.tgz</a> for an evaluation of the presented setup:\r
-</p>\r
-<pre class="prettyprint"><code class="bash">curl -sc - https://juplo.de/wp-uploads/zookeeper+tls.tgz | tar -xzv\r
-</code></pre>\r
-<p>\r
-The archive contains a fully automated example.\r
-Just run <a href="https://juplo.de/wp-uploads/zookeeper+tls/README.sh">README.sh</a> in the unpacked directory.\r
-</p>\r
-<p>\r
-It downloads the required software, carries out the library-upgrade, creates the required certificates and starts a standalone ZooKeeper and two Kafka-Brokers, that use TLS to encrypt all communication.\r
-It also executes a console-consumer and a console-producer, that read and write to a topic, and a zookeeper-shell, that communicates directly with the ZooKeeper-node, to proof, that the setup is working.\r
-The ZooKeeper and the Brokers-instances are left running, to enable the evaluation of the fully encrypted cluster.\r
-</p>\r
-<h3>Usage</h3>\r
-<ul>\r
-<li>Run <strong><code>README.sh</code></strong>, to execute the automated example</li>\r
-<li>After running <code>README.sh</code>, the Kafka-Cluster will be still running, so that one can experiment with commands from <code>README.sh</code> by hand</li>\r
-<li><code>README.sh</code> can be executed repeatedly: it will skip all setup-steps, that are already done automatically</li>\r
-<li>Run <strong><code>README.sh stop</code></strong>, to stop the Kafka-Cluster (it can be restarted by re-running <code>README.sh</code>)</li>\r
-<li>Run <strong><code>README.sh cleanup</code></strong>, to stop the Cluster and remove all created files and data (only the downloaded packages will be left untouched)</li>\r
-</ul>\r
-</p>\r
-<h3>Separate Downloads For The Packaged Files</h3>\r
-<ul>\r
-<li><a href="https://juplo.de/wp-uploads/zookeeper+tls/README.sh">README.sh</a></li>\r
-<li><a href="https://juplo.de/wp-uploads/zookeeper+tls/create-certs.sh">create-certs.sh</a></li>\r
-<li><a href="https://juplo.de/wp-uploads/zookeeper+tls/gencert.sh">gencert.sh</a></li>\r
-<li><a href="https://juplo.de/wp-uploads/zookeeper+tls/zoo.cfg">zoo.cfg</a></li>\r
-<li><a href="https://juplo.de/wp-uploads/zookeeper+tls/java.env">java.env</a></li>\r
-<li><a href="https://juplo.de/wp-uploads/zookeeper+tls/kafka-1.properties">kafka-1.properties</a></li>\r
-<li><a href="https://juplo.de/wp-uploads/zookeeper+tls/kafka-2.properties">kafka-2.properties</a></li>\r
-<li><a href="https://juplo.de/wp-uploads/zookeeper+tls/consumer.config">consumer.config</a></li>\r
-<li><a href="https://juplo.de/wp-uploads/zookeeper+tls/producer.config">producer.config</a></li>\r
-</ul>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>881</wp:post_id>
-               <wp:post_date><![CDATA[2019-06-25 21:22:45]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2019-06-25 19:22:45]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[encrypt-communication-between-kafka-and-zookeeper-with-tls]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="encryption"><![CDATA[encryption]]></category>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="post_tag" nicename="java"><![CDATA[java]]></category>
-               <category domain="post_tag" nicename="kafka"><![CDATA[kafka]]></category>
-               <category domain="post_tag" nicename="security"><![CDATA[security]]></category>
-               <category domain="post_tag" nicename="tls"><![CDATA[tls]]></category>
-               <category domain="post_tag" nicename="zookeeper"><![CDATA[zookeeper]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>59920</wp:comment_id>
-                       <wp:comment_author><![CDATA[Moni]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[stonebridge8@yahoo.it]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[2a02:1205:34f9:f5f0:1830:28ff:feac:8cf]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2019-09-23 13:31:42]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2019-09-23 11:31:42]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Zookeeper with SSL works fine for me, but on kafka I get:\r
-java.lang.ClassNotFoundException: org.apache.zookeeper.ClientCnxnSocketNetty\r
-\r
-I'm running kafka_2.11-1.0.0, is there particular minimum kafka version to have the ssl support, or is there a way to have an old kafka connect to zookeeper in ssl ( maybe touching the classpath) ?]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1570269259.33104;s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1569238302.865076;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>62211</wp:comment_id>
-                       <wp:comment_author><![CDATA[Peter]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[vtdang_1@yahoo.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[2601:3c2:8300:a22:25c0:ff95:7b7f:fc6d]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2020-08-19 15:46:34]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2020-08-19 13:46:34]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Hi, I ran your README.sh and after successful installation of certs and all the kafka configs completed, getting this message..\r
-"nc: getaddrinfo for host "kafka-1" port 9193: Temporary failure in name resolution\r
-Waiting for kafka-1" and nothing else happening.  Am I missing something here?\r
-thanks,]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1597844794.909219;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1602360430.033945;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>60168</wp:comment_id>
-                       <wp:comment_author><![CDATA[Gan]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[gangadhar.balikai@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[193.108.157.6]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2019-10-29 13:34:22]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2019-10-29 11:34:22]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[I am running kafka_2.12-2.3.0 and zookeeper-3.5.5. Configuration are exactly set to what you have described above. \r
-\r
-But broker fails to init Zookeeper connection and fails with \r
-java.io.IOException: Couldn't instantiate org.apache.zookeeper.ClientCnxnSocketNetty\r
-        at org.apache.zookeeper.ZooKeeper.getClientCnxnSocket(ZooKeeper.java:1851)\r
-        at org.apache.zookeeper.ZooKeeper.(ZooKeeper.java:453)\r
-        at org.apache.zookeeper.ZooKeeper.(ZooKeeper.java:384)\r
-        at kafka.zookeeper.ZooKeeperClient.(ZooKeeperClient.scala:103)\r
-        at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1826)\r
-        at kafka.server.KafkaServer.createZkClient$1(KafkaServer.scala:364)\r
-        at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:387)\r
-        at kafka.server.KafkaServer.startup(KafkaServer.scala:207)\r
-        at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38)\r
-        at kafka.Kafka$.main(Kafka.scala:84)\r
-        at kafka.Kafka.main(Kafka.scala)\r
-Caused by: java.lang.NoSuchMethodException: org.apache.zookeeper.ClientCnxnSocketNetty.()\r
-        at java.lang.Class.getConstructor0(Class.java:3082)\r
-        at java.lang.Class.getDeclaredConstructor(Class.java:2178)\r
-        at org.apache.zookeeper.ZooKeeper.getClientCnxnSocket(ZooKeeper.java:1848)\r
-        ... 10 more\r
-\r
-Have you seen this issue before?]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1572348862.676111;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1572366555.554769;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>60170</wp:comment_id>
-                       <wp:comment_author><![CDATA[Kai Moritz]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[kai@juplo.de]]></wp:comment_author_email>
-                       <wp:comment_author_url>http://juplo.de</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[78.48.79.171]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2019-10-29 18:33:48]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2019-10-29 16:33:48]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[No, haven't seen this before.
-Sorry, that I cannot supply any helping information.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>60168</wp:comment_parent>
-                       <wp:comment_user_id>2</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1572366828.611244;s:5:"event";s:9:"check-ham";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>62518</wp:comment_id>
-                       <wp:comment_author><![CDATA[RB]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[ritesh.biltheria@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[2620:149:e0:5001::331]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2020-09-25 23:23:17]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2020-09-25 21:23:17]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Am getting below fatal error, any idea?\r
-\r
-KeeperErrorCode = NoAuth for /brokers/ids]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1601068997.111035;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1602360430.031505;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Create Self-Signed Multi-Domain (SAN) Certificates</title>
-               <link>https://juplo.de/create-self-signed-multi-domain-san-certificates/</link>
-               <pubDate>Wed, 26 Jun 2019 08:40:59 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=887</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>TL;DR</h2>\r
-<p>\r
-The SAN-extension is removed during signing, if not respecified explicitly.\r
-To create a private CA with self-signed multi-domain certificats for your development setup, you simply have to:\r
-</p>\r
-<ol>\r
-<li>Run <a href="https://juplo.de/wp-uploads/selfsigned+san/create-ca.sh">create-ca.sh</a> to generate the root-certificate for your private CA.</li>\r
-<li>Run <a href="https://juplo.de/wp-uploads/selfsigned+san/gencert.sh">gencert.sh NAME</a> to generate selfsigned certificates for the CN NAME with an exemplary SAN-extension.</li>\r
-</ol>\r
-\r
-<h2>Subject Alternative Name (SAN) And Self-Signed Certificates</h2>\r
-<p>\r
-Multi-Domain certificates are implemented as a certificate-extension called <strong>Subject Alternative Name (SAN)</strong>.\r
-One can simply specify the additional domains (or IP's) when creating a certificate.\r
-</p>\r
-<p>\r
-The following example shows the syntax for the <strong><code>keytool</code></strong>-command, that comes with the JDK and is frequently used by Java-programmers to create certificates:\r
-</p>\r
-<pre class="prettyprint"><code class="bash">keytool \\r
- -keystore test.jks -storepass confidential -keypass confidential \\r
- -genkey -alias test -validity 365 \\r
- -dname "CN=test,OU=security,O=juplo,L=Juist,ST=Niedersachsen,C=DE" \\r
- -ext "SAN=DNS:test,DNS:localhost,IP:127.0.0.1"\r
-</code></pre>\r
-\r
-<p>If you list the content of the newly created keystore with...</p>\r
-<pre class="prettyprint"><code class="bash">keytool -list -v -keystore test.jks\r
-</code></pre>\r
-<p>...you should see a section like the following one:</p>\r
-<pre class="prettyprint"><code class="bash">#1: ObjectId: 2.5.29.17 Criticality=false\r
-SubjectAlternativeName [\r
-  DNSName: test\r
-  DNSName: localhost\r
-  IPAddress: 127.0.0.1\r
-]\r
-</code></pre>\r
-<p>\r
-The certificate is also valid for this additionally specified domains and IP's.\r
-</p>\r
-<p>\r
-The problem is, that it is not signed and will not be trusted, unless you publicize it explicitly through a truststore.\r
-This is feasible, if you just want to authenticate and encrypt one point-2-point communication.\r
-But if more clients and/or servers have to be authenticated to each other, updating and distributing the truststore will soon become hell.\r
-</p>\r
-<p>\r
-The common solution in this situation is, to create a private CA, that can sign newly created certificates.\r
-This way, only the root-certificate of that private CA has to be distributed.\r
-Clients, that know the root-certificate of the private CA will automatically trust all certificates, that are signed by that CA.\r
-</p>\r
-<p>\r
-But unfortunatly, <strong>if you sign your certificate, the SAN-extension vanishes</strong>: the signed certificate is only valid for the CN.\r
-<em>(One may think, that you just have to specify the export of the SAN-extension into the certificate-signing-request - which is not exported by default - but the SAN will still be lost after signing the extended request...)</em>\r
-<p>\r
-This removal of the SAN-extension is not a bug, but a feature.\r
-A CA has to be in control, which domains and IP's it signes certificates for.\r
-If a client could write arbitrary additional domains in the SAN-extension of his certificate-signing-request, he could fool the CA into signing a certificate for any domain.\r
-Hence, all entries in a SAN-extension are removed by default during signing.\r
-</p>\r
-<p>\r
-This default behavior is very annoying, if you just want to run your own private CA, to authenticate all your services to each other.\r
-</p>\r
-<p>\r
-In the following sections, I will walk you through a solution to circumvent this pitfall.\r
-If you just need a working solution for your development setup, you may skip the explanation and just <a href="#scripts" title="Jump to the downloads">download the scripts</a>, that combine the presented steps.\r
-</p>\r
-<h2>Recipe To Create A Private CA With Self-Signed Multi-Domain Certificates</h2>\r
-<h3>Create And Distribute The Root-Certificate Of The CA</h3>\r
-<p>\r
-We are using <strong><code>openssl</code></strong> to create the root-certificate of our private CA:\r
-</p>\r
-<pre class="prettyprint"><code class="bash">openssl req \\r
-  -new -x509 -subj "/C=DE/ST=Niedersachsen/L=Juist/O=juplo/OU=security/CN=Root-CA" \\r
-  -keyout ca-key -out ca-cert -days 365 -passout pass:extraconfidential\r
-</code></pre>\r
-<p>\r
-This should create two files:\r
-</p>\r
-<ul>\r
-<li><strong><code>ca-cert</code></strong>, the root-certificate of your CA</li>\r
-<li><strong><code>ca-key</code></strong>, the private key of your CA with the password <strong><code>extraconfidential</code></strong></li>\r
-</ul>\r
-<p>\r
-<em>Be sure to protect <code>ca-key</code> and its password, because anyone who has access to both of them, can sign certificates in the name of your CA!</em>\r
-</p>\r
-<p>\r
-To distribute the root-certificate, so that your Java-clients can trust all certificates, that are signed by your CA, you have to import the root-certificate into a truststore and make that truststore available to your Java-clients:\r
-</p>\r
-<pre class="prettyprint"><code class="bash">keytool \\r
-  -keystore truststore.jks -storepass confidential \\r
-  -import -alias ca-root -file ca-cert -noprompt\r
-</code></pre>\r
-<h3>Create A Certificate-Signing-Request For Your Certificat</h3>\r
-<p>\r
-We are reusing the already created certificate here.\r
-If you create a new one, there is no need to specify the SAN-extension, since it will not be exported into the request and this version of the certificate will be overwritten, when the signed certificate is reimported:\r
-</p>\r
-<pre class="prettyprint"><code class="bash">keytool \\r
-  -keystore test.jks -storepass confidential \\r
-  -certreq -alias test -file cert-file\r
-</code></pre>\r
-<p>\r
-This will create the file <strong><code>cert-file</code></strong>, which contains the certificate-signing-request.\r
-This file can be deleted, after the certificate is signed (which is done in the next step).\r
-</p>\r
-<h3 id="sign-with-san">Sign The Request, Adding The Additional Domains In A SAN-Extension</h3>\r
-<p>\r
-We use <strong><code>openssl x509</code></strong> to sign the request:\r
-</p>\r
-<pre class="prettyprint"><code class="bash">openssl x509 \\r
-  -req -CA ca-cert -CAkey ca-key -in cert-file -out test.pem \\r
-  -days 365 -CAcreateserial -passin pass:extraconfidential \\r
-  -extensions SAN -extfile &lt;(printf "\n[SAN]\nsubjectAltName=DNS:test,DNS:localhost,IP:127.0.0.1")\r
-</code></pre>\r
-<p>\r
-This can also be done with <code>openssl ca</code>, which has a slightly different and little bit more complicated API.\r
-<code>openssl ca</code> is ment to manage a real full-blown CA.\r
-But we do not need the extra options and complexity for our simple private CA.\r
-</p>\r
-<p>\r
-The important part here is all that comes after <strong><code>-extensions SAN</code></strong>.\r
-It specifies the <em>Subject-Alternative-Name</em>-section, that we want to include additionally into the signed certificate.\r
-Because we are in full control of our private CA, we can specify any domains and/or IP's here, that we want.\r
-The other options are ordinary certificate-signing-stuff, that is <a href="https://stackoverflow.com/a/21340898" title="For example, you can read more in this answer on stackoverflow.com">already better explained elswhere</a>.\r
-</p>\r
-<p>\r
-We use a special syntax with the option <code>-extfile</code>, that allows us to specify the contents of a virtual file as part of the command.\r
-You can as well write your SAN-extension into a file and hand over the name of that file here, as it is done usually.\r
-If you want to specify the same SAN-extension in a file, that file would have to contain:\r
-</p>\r
-<pre class="prettyprint"><code class="bash">[SAN]\r
-subjectAltName=DNS:test,DNS:localhost,IP:127.0.0.1\r
-</code></pre>\r
-<p>\r
-Note, that the name that you give the extension on the command-line with <code>-extension SAN</code> has to match the header in the (virtual) file (<code>[SAN]</code>).\r
-</p>\r
-<p>\r
-As a result of the command, the file <strong><code>test.pem</code></strong> will be created, which contains the signed x509-certificate.\r
-You can disply the contents of that certificate in a human readable form with:\r
-</p>\r
-<pre class="prettyprint"><code class="bash">openssl x509 -in test.pem -text\r
-</code></pre>\r
-<p><em>It should display something similar to this <a href="https://juplo.de/wp-uploads/selfsigned+san/pem.txt" title="Display the example-output for a x509-certificate in PEM-format">example-output</a></em></p>\r
-\r
-<h3>Import The Root-Certificate Of The CA And The Signed Certificate Into The Keystore</h3>\r
-If you want your clients, that do only know the root-certificate of your CA, to trust your Java-service, you have to build up a <em>Chain-of-Trust</em>, that leads from the known root-certificate to the signed certificate, that your service uses to authenticate itself.\r
-<em>(Note: SSL-encryption always includes the authentication of the service a clients connects to through its certificate!)</em>\r
-In our case, that chain only has two entries, because our certificate was directly signed by the root-certificate.\r
-Therefore, you have to import the root-certificate (<code>ca-cert</code>) and your signed certificate (<code>test.pem</code>) into a keystore and make that keystore available to the Java-service, in order to enable it to authentificate itself using the signed certificate, when a client connects.\r
-</p>\r
-<p>Import the root-certificate of the CA:</p>\r
-<pre class="prettyprint"><code class="bash">keytool \\r
- -keystore test.jks -storepass confidential \\r
- -import -alias ca-root -file ca-cert -noprompt\r
-</code></pre>\r
-<p>Import the signed certificate (this will overwrite the unsigned version):</p>\r
-<pre class="prettyprint"><code class="bash">keytool \\r
- -keystore test.jks -storepass confidential \\r
- -import -alias test -file test.pem\r
-</code></pre>\r
-<p>\r
-<strong>That's it: we are done!</strong>\r
-</p>\r
-<p>\r
-You can validate the contents of the created keystore with:\r
-</p>\r
-<pre class="prettyprint"><code class="bash">keytool \\r
- -keystore test.jks -storepass confidential \\r
- -list -v\r
-</code></pre>\r
-<p><em>It should display something similar to this <a href="https://juplo.de/wp-uploads/selfsigned+san/jks.txt" title="Display the example-output for a JKS-keystore">example-output</a></em></p>\r
-<p>\r
-To authenticate service A against client B you will have to:\r
-</p>\r
-<ul>\r
-<li>make the keystore <strong><code>test.jks</code></strong> available to the service <strong>A</strong></li>\r
-<li>make the truststore <strong><code>truststore.jks</code></strong> available to the client <strong>B</strong></li>\r
-</ul>\r
-<p>\r
-<em>If you want, that your clients also authentificate themselfs to your services, so that only clients with a trusted certificate can connect (2-Way-Authentication), client B also needs its own signed certificate to authenticate against service A and service A also needs access to the truststore, to be able to trust that certificate.</em>\r
-</p>\r
-<h2 id="scripts">Simple Example-Scripts To Create A Private CA And Self-Signed Certificates With SAN-Extension</h2>\r
-<p>\r
-The following two scripts automate the presented steps and may be useful, when setting up a private CA for Java-development:\r
-<ul>\r
-<li>Run <a href="https://juplo.de/wp-uploads/selfsigned+san/create-ca.sh" title="Read the source of create-ca.sh">create-ca.sh</a> to create the root-certificate for the CA and import it into a truststore (creates <strong><code>ca-cert</code></strong> and <strong><code>ca-key</code></strong> and the truststore <strong><code>truststore.p12</code></strong>)</li>\r
-<li>Run <a href="https://juplo.de/wp-uploads/selfsigned+san/gencert.sh" title="Read the source of gencert.sh">gencert.sh CN</a> to create a certificate for the common name CN, sign it using the private CA (also exemplarily adding alternative names) and building up a valid Chain-of-Trust in a keystore (creates <strong><code>CN.pem</code></strong> and the keystore <strong><code>CN.p12</code></strong>)</li>\r
-<li>Global options can be set in the configuration file <a href="https://juplo.de/wp-uploads/selfsigned+san/settings.conf" title="Read the source of setings.conf">settings.conf</a></li>\r
-</ul>\r
-<p><em>Read the source for more options...</em></p>\r
-<p>\r
-Differing from the steps shown above, these scripts use the keystore-format PKCS12.\r
-This is, because otherwise, <code>keytool</code> is nagging about the non-standard default-format JKS in each and every step.\r
-</p>\r
-<p>\r
-<strong>Note:</strong> PKCS12 does not distinguish between a store-password and a key-password. Hence, only a store-passwort is specified in the scripts.\r
-</p>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>887</wp:post_id>
-               <wp:post_date><![CDATA[2019-06-26 10:40:59]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2019-06-26 08:40:59]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[create-self-signed-multi-domain-san-certificates]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>58795</wp:comment_id>
-                       <wp:comment_author><![CDATA[Encrypt Communication Between Kafka And ZooKeeper With TLS | juplo]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[]]></wp:comment_author_email>
-                       <wp:comment_author_url>https://juplo.de/encrypt-communication-between-kafka-and-zookeeper-with-tls/</wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[2a01:4f8:110:4242::2]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2019-06-26 16:56:06]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2019-06-26 14:56:06]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[[&#8230;] You can read more about setting up a private CA in this post&#8230; [&#8230;]]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[pingback]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1561717527.2135401;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1561560966.4643359;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>60423</wp:comment_id>
-                       <wp:comment_author><![CDATA[Cause Chung]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[cuzfrog@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[128.22.126.94]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2019-12-09 17:55:30]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2019-12-09 15:55:30]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[when use keytool -genkey\r
-\r
--keyalg RSA needs to be added\r
-\r
-otherwise a possible cipher suite problem]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1576059635.623004;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1575906930.341696;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Actuator HTTP Trace Does Not Work With Spring Boot 2.2.x</title>
-               <link>https://juplo.de/actuator-httptrace-does-not-work-with-spring-boot-2-2/</link>
-               <pubDate>Wed, 25 Dec 2019 15:57:53 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=970</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>TL;DR</h2>\r
-<p>\r
-In Spring Boot 2.2.x, you have to instanciate a <strong><code>@Bean</code></strong> of type <strong><code>InMemoryHttpTraceRepository</code></strong> to enable the HTTP Trace Actuator.\r
-</p>\r
-<p>Jump to the <a href="#explanation">explanation</a> of and <a href="#fix">example code for the fix</a></p>\r
-<h2><code>Enabling HTTP Trace — <em>Before 2.2.x...</em></code></h2>\r
-<p>\r
-Spring Boot comes with a very handy feature called <a href="https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready" title="Show the Spring Boot Documentation for the Actuator Feature">Actuator</a>.\r
-Actuator provides a build-in production-ready REST-API, that can be used to monitor / menage / debug your bootified App.\r
-To enable it &mdash; <em>prior to 2.2.x</em> &mdash;, one only had to:\r
-</p>\r
-<ol>\r
-  <li>\r
-    Specifiy the dependency for Spring Boot Actuator:\r
-</code></pre>\r
-<pre class="wp-block-code prettyprint"><code>&lt;dependency&gt;\r
-  &lt;groupId&gt;org.springframework.boot</groupId>\r
-  &lt;artifactId&gt;spring-boot-starter-actuator</artifactId>\r
-&lt;/dependency&gt;\r
-\r
-</code></pre>\r
-  </li>\r
-  <li>\r
-    Expose the needed endpoints via HTTP:\r
-<pre class="prettyprint"><code class="properties">management.endpoints.web.exposure.include=*\r
-</code></pre>\r
-    <ul>\r
-      <li>This exposes <strong>all available endpoints</strong> via HTTP.</li>\r
-      <li>\r
-        <em><strong>Advise:</strong> Do not copy this into a production config</em><br />\r
-        (Without thinking about it twice and &mdash; at least &mdash; <a href="https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-endpoints-security" title="Read, how to secure HTTP-endpoints in the documentation of Spring Boot">enable some security measures</a> to protect the exposed endpoints!)\r
-      </li>\r
-    </ul>\r
-  </li>\r
-</ol>\r
-<h2>The problem: <em>It simply does not work any more in 2.2 :(</em></h2>\r
-<p>\r
-<em>But...</em>\r
-</p>\r
-<ul>\r
-<li>If you upgrade your existing app with a working <code>httptrace</code>-actuator to Spring Boot 2.2.x, or</li>\r
-<li>If you start with a fresh app in Spring Boot 2.2.x and try to enable the <code>httptrace</code>-actuator <a href="https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready-endpoints-exposing-endpoints" title="Read, how to expose HTTP-endpoints in the documentation of Spring Boot">as described in the documentation</a></li>\r
-</ul>\r
-<p><strong>...it simply does not work at all!</strong></p>\r
-<h2 id="fix">The Fix</h2>\r
-<p>\r
-The simple fix for this problem is, to add a <code>@Bean</code> of type <code>InMemoryHttpTraceRepository</code> to your <strong><code>@Configuration</code></strong>-class:\r
-</p>\r
-<pre class="wp-block-code prettyprint"><code>@Bean\r
-public HttpTraceRepository htttpTraceRepository()\r
-{\r
-  return new InMemoryHttpTraceRepository();\r
-}\r
-</code></pre>\r
-<h2 id="explanation">The Explanation</h2>\r
-<p>\r
-The cause of this problem is not a bug, but a legitimate change in the default configuration.\r
-Unfortunately, this change is not noted in the according section of the documentation.\r
-Instead it is burried in the <a href="https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.2.0-M3-Release-Notes#actuator-http-trace-and-auditing-are-disabled-by-default">Upgrade Notes for Spring Boot 2.2</a>\r
-</p>\r
-<p>\r
-The default-implementation stores the captured data in memory.\r
-Hence, it consumes much memory, without the user knowing, or even worse: needing it.\r
-This is especially undesirable in cluster environments, where memory is a precious good.\r
-<em>And remember:</em> Spring Boot was invented to simplify cluster deployments!\r
-</p>\r
-<p>\r
-<strong>That is, why this feature is now turned of by default and has to be turned on by the user explicitly, if needed.</strong>\r
-</p>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>970</wp:post_id>
-               <wp:post_date><![CDATA[2019-12-25 17:57:53]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2019-12-25 15:57:53]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[actuator-httptrace-does-not-work-with-spring-boot-2-2]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="explained"><![CDATA[Explained]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="spring-boot"><![CDATA[Spring-Boot]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_oembed_0a2776cf844d7b8b543bf000729407fe]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[{{unknown}}]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_oembed_4484ca19961800dfe51ad98d0b1fcfef]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[{{unknown}}]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_oembed_b0575eccf8471857f8e25e8d0f179f68]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[{{unknown}}]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_oembed_8a143b8145082a48cc586f0fdb19f9b5]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[{{unknown}}]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>64802</wp:comment_id>
-                       <wp:comment_author><![CDATA[saladin]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[jkl123@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[20.56.35.144]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2022-02-01 10:39:01]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2022-02-01 08:39:01]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[You got a typo htttpTraceRepository -&gt; httpTraceRepository]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[0]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1643704741.29548;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>64232</wp:comment_id>
-                       <wp:comment_author><![CDATA[Sharofiddin]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[pardayev.sharofiddin@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[195.158.16.60]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2021-07-30 08:46:38]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2021-07-30 06:46:38]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thank you]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1627627598.404651;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1640284332.587;s:5:"event";s:15:"status-approved";s:4:"user";s:11:"tortenheber";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-               <wp:comment>
-                       <wp:comment_id>61796</wp:comment_id>
-                       <wp:comment_author><![CDATA[Amir]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[amirtc@walla.co.il]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[81.218.241.25]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2020-07-02 13:24:07]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2020-07-02 11:24:07]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Thank you so much for your article\r
-Actuator HTTP Trace Does Not Work With Spring Boot 2.2.x\r
-A true life saver!]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1593689047.982963;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1602360430.035446;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>Compare Two Files In Different Branches With Git</title>
-               <link>https://juplo.de/compare-two-files-in-different-branches-with-git/</link>
-               <pubDate>Mon, 13 Jan 2020 16:20:34 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1019</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>Ever wanted to do a quick diff between two different files in two different commits with git? Then read on, here's how you can do it...</p>\r
-<h2>Goal</h2>\r
-<ul>\r
-<li><strong>Compare two files in two commits with <em>git</em></strong></li>\r
-<li>Commit may be anything denominatable by git (commit, branch, HEAD, remote-branch)</li>\r
-<li>Name / Path may differ</li>\r
-<li>Branch may differ</li>\r
-</ul>\r
-<h2>Tip</h2>\r
-<h3>Syntax</h3>\r
-<pre class="prettyprint"><code class="bash">git diff BRANCH:PATH OTHER_BRANCH:OTHER_PATH\r
-</code></pre>\r
-<h3>Examples</h3>\r
-<ul>\r
-<li>\r
-Compare two different files in two different branches:\r
-<pre class="prettyprint"><code class="bash">git diff branch_a:file_a.txt branch_b:file_b.txt\r
-</code></pre>\r
-</li>\r
-<li>\r
-Compare a file with another version of itself in another commit\r
-<pre class="prettyprint"><code class="bash">git diff HEAD:file.txt a09127a:file.txt\r
-</code></pre>\r
-</li>\r
-<li>\r
-Same as above, but the commit is denominated by its branch:\r
-<pre class="prettyprint"><code class="bash">git diff HEAD:file.txt branchname:file.txt\r
-</code></pre>\r
-</li>\r
-<li>\r
-Same as above, but with shortcut-syntax for the currently checked-out commit:\r
-<pre class="prettyprint"><code class="bash">git diff :file.txt branchname:file.txt\r
-</code></pre>\r
-</li>\r
-<li>\r
-Compare a file with itself four commits ago (readable syntax):\r
-<pre class="prettyprint"><code class="bash">git diff :file.txt HEAD~4:file.txt\r
-</code></pre>\r
-</li>\r
-<li>\r
-Compare a file with itself four commits ago (handy syntax):\r
-<pre class="prettyprint"><code class="bash">git diff :file.txt HEAD~4:file.txt\r
-</code></pre>\r
-</li>\r
-<li>\r
-Compare a file with its latest version in the origin-repository:\r
-<pre class="prettyprint"><code class="bash">git diff :file.txt remotes/origin/master:file.txt\r
-</code></pre>\r
-</li>\r
-<li>\r
-Compare a file with its fourth-latest version in the <code>foo</code>-branch of the <code>bar</code>-repository:\r
-<pre class="prettyprint"><code class="bash">git diff :file.txt remotes/bar/foo~4:file.txt\r
-</code></pre>\r
-</li>\r
-</ul>\r
-<h2 id="explanation">Explanation</h2>\r
-<p>If the path (aka <em>object name</em>) contains a colon (<strong><code>:</code></strong>), git interprets the part before the colon as a commit and the part after it as the path in the tree, denominated by the commit. (For more details refere to this post with <a href="/cat-any-file-in-any-commit-with-git/" title="Read more on how to cat any file in any commit with git, without checking it out first">tips for <code>git show</code></a>)</p>\r
-<ul>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1019</wp:post_id>
-               <wp:post_date><![CDATA[2020-01-13 18:20:34]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2020-01-13 16:20:34]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[compare-two-files-in-different-branches-with-git]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="bash"><![CDATA[bash]]></category>
-               <category domain="post_tag" nicename="git"><![CDATA[git]]></category>
-               <category domain="category" nicename="tips"><![CDATA[Tips]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Cat Any File in Any Commit With Git</title>
-               <link>https://juplo.de/cat-any-file-in-any-commit-with-git/</link>
-               <pubDate>Mon, 13 Jan 2020 16:13:13 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1025</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>Ever wanted to do take a quick look at the version of some file in a different commit without checking out that commit first? Then read on, here's how you can do it...</p>\r
-<h2>Goal</h2>\r
-<ul>\r
-<li><strong>Take a quick look at a special version of a file with <em>git</em> withou checking out the commit first</strong></li>\r
-<li>Commit may be anything denominatable by git (commit, branch, HEAD, remote-branch)</li>\r
-<li>Branch may differ</li>\r
-<li>Pipe into another command in the shell</li>\r
-<li>Overwrite a file with an older version of itself</li>\r
-</ul>\r
-<h2>Tip</h2>\r
-<h3>Syntax</h3>\r
-<pre class="prettyprint"><code class="bash">git show BRANCH:PATH\r
-</code></pre>\r
-<h3>Examples</h3>\r
-<ul>\r
-<li>\r
-Show the content of file <code>file.txt</code> in commit <code>a09127</code>:\r
-<pre class="prettyprint"><code class="bash">git show a09127a:file.txt\r
-</code></pre>\r
-<em>The commit can be specified with any valid denominator and may belong to any local- or remote-branch...</em>\r
-<ul>\r
-<li>\r
-Same as above, but specify the commit relativ to the checked-out commit (handy syntax):\r
-<pre class="prettyprint"><code class="bash">git show HEAD^^^^:file.txt\r
-</code></pre>\r
-</li>\r
-<li>\r
-Same as above, but specify the commit relativ to the checked-out commit (readable syntax):\r
-<pre class="prettyprint"><code class="bash">git show HEAD~4:file.txt\r
-</code></pre>\r
-</li>\r
-<li>\r
-Same as above for a remote-branch:\r
-<pre class="prettyprint"><code class="bash">git show remotes/origin/master~4:file.txt\r
-</code></pre>\r
-</li>\r
-<li>\r
-Same as above for the branch <code>foo</code> in repository <code>bar</code>:\r
-<pre class="prettyprint"><code class="bash">git show remotes/bar/foo~4:file.txt\r
-</code></pre>\r
-</li>\r
-</ul>\r
-</li>\r
-<li>\r
-Pipe the file into another command:\r
-<pre class="prettyprint"><code class="bash">git show a09127a:file.txt | wc -l\r
-</code></pre>\r
-</li>\r
-<li>\r
-Overwrite the file with its version four commits ago:\r
-<pre class="prettyprint"><code class="bash">git show HEAD~4:file.txt > file.txt\r
-</code></pre>\r
-</li>\r
-</ul>\r
-<h2 id="explanation">Explanation</h2>\r
-<p>If the path (aka <em>object name</em>) contains a colon (<strong><code>:</code></strong>), git interprets the part before the colon as a commit and the part after it as the path in the tree, denominated by the commit.</p>\r
-<ul>\r
-<li>The <strong>commit</strong> can be specified by its reference, or the name of a local or remote branch</li>\r
-<li>The <strong>path</strong> is interpreted as absolut to the origin of the tree, denominated by the commit</li>\r
-<li>If you want to use a relative path (i.e, current directory), prepend the path accordingly &mdash; for example <strong><code>./file</code></strong>. <br />\r
-<em>But in this case, be aware that the path is expanded against the checked-out version and not the version, that is specified before the colon!</em>\r
-</ul>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1025</wp:post_id>
-               <wp:post_date><![CDATA[2020-01-13 18:13:13]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2020-01-13 16:13:13]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[cat-any-file-in-any-commit-with-git]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="post_tag" nicename="bash"><![CDATA[bash]]></category>
-               <category domain="post_tag" nicename="git"><![CDATA[git]]></category>
-               <category domain="category" nicename="tips"><![CDATA[Tips]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>How To Redirect To Spring Security OAuth2 Behind a Gateway/Proxy -- Part 2: Hiding The App Behind A Reverse-Proxy (Aka Gateway)</title>
-               <link>https://juplo.de/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/</link>
-               <pubDate>Mon, 09 Mar 2020 18:41:44 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1037</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-This post is part of a series of Mini-Howtos, that gather some help, to get you started, when switching from localhost to production with SSL and a reverse-proxy (aka gateway) in front of your app, that forwards the requests to your app that listens on a different name/IP, port and protocol.\r
-</p>\r
-<h2 style="clear:both;">In This Series We...</h2>\r
-<ol>\r
- <li><a href="/howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker/">Run the official Spring-Boot-OAuth2-Tutorial as a container in docker</a></li>\r
- <li>Simulate production by hiding the app behind a gateway (this part)</li>\r
- <li>Show how to debug the oauth2-flow for the whole crap!</li>\r
- <li>Enable SSL on our gateway</li>\r
- <li>Show how to do the same with Facebook, instead of GitHub</li>\r
-</ol>\r
-<p>\r
-I will also give some advice for those of you, who are new to Docker - <em>but just enough to enable you to follow</em>.\r
-</p>\r
-<p>\r
-This is <strong>part 2</strong> of this series, that shows how to <strong>run a Spring-Boot OAuth2 App behind a gateway</strong>\r
-- <a href="#">Part 1</a> is linked above.\r
-</p>\r
-\r
-\r
-<h2>Our Plan: Simulating A Production-Setup</h2>\r
-<p>\r
-We will simulate a production-setup by adding the domain, that will be used in production - <code>example.com</code> in our case -, as an alias for <code>localhost</code>.\r
-</p>\r
-<p>\r
-Additionally, we will start an <a href="https://nginx.com">NGINX</a> as reverse-proxy alongside our app and put both containers into a virtual network.\r
-This simulates a real-world secenario, where your app will be running behinde a gateway together with a bunch of other apps and will have to deal with forwarded requests.\r
-</p>\r
-<p>\r
-Together, this enables you to test the production-setup of your oauth2-provider against a locally running development environment, including the configuration of the finally used URIs and nasty forwarding-errors.\r
-</p>\r
-<p>To reach this goal we will have to:</p>\r
-<ol>\r
-<li><a href="#provider-production-setup">Reconfigure our oauth-provider for the new domain</a></li>\r
-<li><a href="#set-alias-for-domain">Add the domain as an alias for localhost</a></li>\r
-<li><a href="#create-virtual-network">Create a virtual network</a></li>\r
-<li><a href="#move-app-into-virtual-network">Move the app into the created virtual network</a></li>\r
-<li><a href="#start-gateway-in-virtual-network">Configure and start nginx as gateway in the virtual network</a></li>\r
-</ol>\r
-<p>\r
-<em>By the way:</em>\r
-Any other server, that can act as reverse proxy, or some real gateway,like <a href="https://github.com/Netflix/zuul" title="In real real-world you should consider something like Zuul of similar">Zuul</a> would work as well, but we stick with good old NGINX, to keep it simple.\r
-</p>\r
-\r
-\r
-<h2 id="provider-production-setup">Switching The Setup Of Your OAuth2-Provider To Production</h2>\r
-<p>\r
-In our example we are using GitHub as oauth2-provider and <code>example.com</code> as the domain, where the app should be found after the release.\r
-So, we will have to change the <strong>Authorization callback URL</strong> to\r
-<strong><code>http://example.de/login/oauth2/code/github</code></strong>\r
-</p>\r
-<p><img src="http://juplo.de/wp-uploads/2020/03/github-example.jpg" alt="" width="100%"  /></p>\r
-<p>\r
-O.k., that's done.\r
-</p>\r
-<p>\r
-But we haven't released yet and nothing can be found on the reals server, that hosts <code>example.com</code>...\r
-But still, we really would like to test that production-setup to be sure that we configured all bits and pieces correctly!\r
-</p>\r
-<p>\r
-<em>\r
-In order to tackle this chicken-egg-problem, we will fool our locally running browser to belive, that <code>example.com</code> is our local development system.\r
-</em>\r
-</p>\r
-\r
-\r
-<h2 id="set-alias-for-domain">Setting Up The Alias for <code>example.com</code></h2>\r
-<p>\r
-On Linux/Unix this can be simply done by editing <strong><code>/etc/hosts</code></strong>.\r
-You just have to add the domain (<code>example.com</code>) at the end of the line that starts with <code>127.0.0.1</code>:\r
-</p>\r
-<pre class="prettyprint"><code class="hosts">127.0.0.1 localhost example.com\r
-</code></pre>\r
-<p>\r
-Locally running programms - like your browser - will now resolve <code>example.com</code> as <code>127.0.0.1</code>\r
-</p>\r
-\r
-\r
-<h2 id="create-virtual-network">Create A Virtual Network With Docker</h2>\r
-<p>Next, we have to create a virtual network, where we can put in both containers:</p>\r
-<pre class="prettyprint"><code class="sh">docker network create juplo\r
-</code></pre>\r
-<p>\r
-Yes, with Docker it is as simple as that.\r
-</p>\r
-<p>\r
-Docker networks also come with some extra goodies.\r
-Especially one, which is extremly handy for our use-case is: They are enabling automatic name-resolving for the connected containers.\r
-Because of that, we do not need to know the IP-addresses of the participating containers, if we give each connected container a name.\r
-</p>\r
-\r
-\r
-<h2>Docker vs. Kubernetes vs. Docker-Compose</h2>\r
-<p>\r
-We are using Docker here on purpose.\r
-Using Kubernetes just to test / experiment on a DevOp-box would be overkill.\r
-Using Docker-Compose might be an option.\r
-But we want to keep it as simple as possible for now, hence we stick with Docker.\r
-Also, we are just experimenting here.\r
-</p>\r
-<p>\r
-<em>\r
-You might want to switch to Docker-Compose later.\r
-Especially, if you plan to set up an environment, that you will frequently reuse for manual tests or such.\r
-</em>\r
-</p>\r
-\r
-\r
-<h2 id="move-app-into-virtual-network">Move The App Into The Virtual Network</h2>\r
-<p>\r
-To move our app into the virtual network, we have to start it again with the additional parameter <strong><code>--network</code></strong>.\r
-We also want to give it a name this time, by using <strong><code>--name</code></strong>, to be able to contact it by name.\r
-</p>\r
-<p>\r
-<em>\r
-You have to stop and remove the old container from part 1 of this HowTo-series with <code>CTRL-C</code> beforehand, if it is still running - Removing is done automatically, because we specified <code>--rm</code>\r
-</em>:\r
-</p>\r
-<pre class="prettyprint"><code class="sh">docker run \\r
-  -d \\r
-  --name app \\r
-  --rm \\r
-  --network juplo \\r
-  juplo/social-logout:0.0.1 \\r
-  --server.use-forward-headers=true \\r
-  --spring.security.oauth2.client.registration.github.client-id=YOUR_GITHUB_ID \\r
-  --spring.security.oauth2.client.registration.github.client-secret=YOUR_GITHUB_SECRET\r
-</code></pre>\r
-<p>\r
-Summary of the changes in comparison to <a href="/howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker/#build-a-docker-image" title="Skip back to part 1, if you want to compare...">the statement used in part 1</a>:\r
-</p>\r
-<ul>\r
-<li>\r
-We added <strong><code>-d</code></strong> to run the container in the background - <em>See tips below...</em>\r
-</li>\r
-<li>\r
-We added <strong><code>--server.use-forward-headers=true</code></strong>, which is needed, because our app is running behind a gateway now - <em>I will explain this in more detail later</em>\r
-<li>\r
-<em>And:</em> Do not forget the <strong><code>--network juplo</code></strong>,\r
-which is necessary to put the app in our virtual network <code>juplo</code>, and <strong><code>--name app</code></strong>, which is necessary to enable DNS-resolving.\r
-</li>\r
-<li>\r
-You do not need the port-mapping this time, because we will only talk to our app through the gateway.<br />\r
-Remember: <em>We are <strong>hiding</strong> our app behind the gateway!</em>\r
-</li>\r
-</ul>\r
-<p>\r
-\r
-\r
-<h2>Some quick tips to Docker-newbies</h2>\r
-<ul>\r
-<li>\r
-Since we are starting multiple containers, that shall run in parallel, you have to start each command in a separate terminal, because <strong><code>CTRL-C</code></strong> will stop (and in our case remove) the container again.\r
-</li>\r
-<li>\r
-Alternatively, you can add the parameter <strong><code>-d</code></strong> (for daemonize) to start the container in the background.\r
-</l<<i>\r
-<li>\r
-Then, you can look at its output with <strong><code>docker logs -f NAME</code></strong> (safely disruptable with <code>CTRL-C</code>) and stop (and in our case remove) the container with <strong><code>docker stop NAME</code></strong>.\r
-</li>\r
-<li>\r
-If you wonder, which containers are actually running, <strong><code>docker ps</code></strong> is your friend.\r
-</li>\r
-</ul>\r
-\r
-\r
-<h2 id="start-gateway-in-virtual-network">Starting the Reverse-Proxy Aka Gateway</h2>\r
-<p>\r
-Next, we will start NGINX alongside our app and configure it as reverse-proxy:\r
-</p>\r
-<ol>\r
-<li>\r
-Create a file <strong><code>proxy.conf</code></strong> with the following content:\r
-<pre class="prettyprint"><code class="sh">upstream upstream_a {\r
-  server        app:8080;\r
-}\r
-\r
-server {\r
-  listen        80;\r
-  server_name   example.com;\r
-\r
-  proxy_set_header     X-Real-IP           $remote_addr;\r
-  proxy_set_header     X-Forwarded-For     $proxy_add_x_forwarded_for;\r
-  proxy_set_header     X-Forwarded-Proto   $scheme;\r
-  proxy_set_header     Host                $host;\r
-  proxy_set_header     X-Forwarded-Host    $host;\r
-  proxy_set_header     X-Forwarded-Port    $server_port;\r
-\r
-  location / {\r
-    proxy_pass  http://upstream_a;\r
-  }\r
-}\r
-</code></pre>\r
-<ul>\r
-<li>We define a server, that listens to requests for the host <strong><code>example.com</code></strong> (<code>server_name</code>) on port <strong><code>80</code></strong>.</li>\r
-<li>With the <code>location</code>-directive we tell this server, that all requests shall be handled by the upstream-server <strong><code>upstream_a</code></strong>.</li>\r
-<li>This server was defined in the <code>upstream</code>-block at the beginning of the configuration-file to be a forward to <strong><code>app:8080</code></strong></li>\r
-<li><strong><code>app</code></strong> is simply the name of the container, that is running our oauth2-app - Rembember: the name is resolvable via DNS</li>\r
-<li><strong><code>8080</code></strong> is the port, our app listens on in that container.</li>\r
-<li>The <code>proxy_set_header</code>-directives are needed by Spring-Boot Security, for dealing correctly with the circumstance, that it is running behind a reverse-proxy.</li>\r
-</ul>\r
-<em>In part 3, we will survey the <code>proxy_set_header</code>-directives in more detail.</em>\r
-</li>\r
-<li>\r
-Start nginx in the virtual network and connect port <code>80</code> to <code>localhost</code>:\r
-<pre class="prettyprint"><code class="sh">docker run \\r
-  --name proxy \\r
-  --rm \\r
-  --network juplo -p 80:80 \\r
-  --volume $(pwd)/proxy.conf:/etc/nginx/conf.d/proxy.conf:ro \\r
-  nginx:1.17\r
-</code></pre>\r
-<p><em>This command has to be executed in the direcotry, where you have created the file <code>proxy.conf</code>.</em></p>\r
-<ul>\r
-<li>\r
-I use NGINX here, because I want to demystify the work of a gateway<br />\r
-<em><a href="https://docs.traefik.io/" title="Read more about this great tool">traefik</a> would have been easier to configure in this setup, but it would have disguised, what is going on behind the scene: with NGINX we have to configure all manually, which is more explicitly and hence, more informative</em></li>\r
-</li>\r
-<li>We can use port <code>80</code> on </code>localhost</code>, since the docker-daemon runs with root-privileges and hence, can use this privileged port - <em>if you do not have another webserver running locally there</em>.</li>\r
-<li><code>$(pwd)</code> resolves to your current working-directory - This is the most convenient way to produce the absolute path to <code>proxy.conf</code>, that is required by <code>--volume</code> to work correclty.</li>\r
-</ul>\r
-</li>\r
-</ul>\r
-<p>\r
-If you have reproduced the receipt exacly, your app should be up and running now.\r
-That is:  \r
-</p>\r
-<ul>\r
-<li>Because we set the alias <code>example.com</code> to point at <code>localhost</code> you should now be able to open your app as <strong><code>http://example.com</code> in a locally running browser</strong></li>\r
-<li>You then should be able to login/logount without errors</li>\r
-<li>If you have configured everything correctly, neither your app nor GitHub should mutter at you during the redirect to GitHub and back to your app</li>\r
-</ul>\r
-\r
-\r
-<h2>Whats next... is what can go wrong!</h2>\r
-<p>\r
-In this simulated production-setup a lot of stuff can go wrong!\r
-You may face nearly any problem from configuration-mismatches considering the redirect-URIs to nasty and hidden redirect-issues due to forwarded requests.\r
-</p>\r
-<p>\r
-<em>\r
-Do not mutter at me...\r
-<strong>Remember:</strong> That was the reason, we set up this simulated production-setup in the first place!\r
-</em>\r
-</p>\r
-<p>\r
-In the next part of this series I will explain some of the most common problems in a production-setup with forwarded requests.\r
-I will also show, how you can debug the oauth2-flow in your simulated production-setup, to discover and solve these problems\r
-</p>\r
-]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1037</wp:post_id>
-               <wp:post_date><![CDATA[2020-03-09 20:41:44]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2020-03-09 18:41:44]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="oauth2"><![CDATA[oauth2]]></category>
-               <category domain="category" nicename="spring"><![CDATA[Spring]]></category>
-               <category domain="category" nicename="spring-boot"><![CDATA[Spring-Boot]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:comment>
-                       <wp:comment_id>62909</wp:comment_id>
-                       <wp:comment_author><![CDATA[Vu Chu]]></wp:comment_author>
-                       <wp:comment_author_email><![CDATA[anhvutnu@gmail.com]]></wp:comment_author_email>
-                       <wp:comment_author_url></wp:comment_author_url>
-                       <wp:comment_author_IP><![CDATA[2607:fb90:e74:86f8:8955:5cc2:ddf6:dc9c]]></wp:comment_author_IP>
-                       <wp:comment_date><![CDATA[2020-11-10 07:20:07]]></wp:comment_date>
-                       <wp:comment_date_gmt><![CDATA[2020-11-10 05:20:07]]></wp:comment_date_gmt>
-                       <wp:comment_content><![CDATA[Very nice! Thank you for such informative post. Waiting for your part 3 and 4 of this series.]]></wp:comment_content>
-                       <wp:comment_approved><![CDATA[1]]></wp:comment_approved>
-                       <wp:comment_type><![CDATA[]]></wp:comment_type>
-                       <wp:comment_parent>0</wp:comment_parent>
-                       <wp:comment_user_id>0</wp:comment_user_id>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_result]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[false]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:2:{s:4:"time";d:1604985607.436168;s:5:"event";s:9:"check-ham";}]]></wp:meta_value>
-                       </wp:commentmeta>
-                       <wp:commentmeta>
-                               <wp:meta_key><![CDATA[akismet_history]]></wp:meta_key>
-                               <wp:meta_value><![CDATA[a:3:{s:4:"time";d:1605370738.648007;s:5:"event";s:15:"status-approved";s:4:"user";s:3:"kai";}]]></wp:meta_value>
-                       </wp:commentmeta>
-               </wp:comment>
-       </item>
-       <item>
-               <title>How To Redirect To Spring Security OAuth2 Behind a Gateway/Proxy - Part 1: Running Your  App In Docker</title>
-               <link>https://juplo.de/howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker/</link>
-               <pubDate>Fri, 06 Mar 2020 22:02:44 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1064</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>Switching From Tutorial-Mode (aka POC) To Production Is Hard</h2>\r
-<p>\r
-Developing Your first OAuth2-App on <a href="https://www.google.com/search?q=there+no+place+like+%22127.0.0.1%22&tbm=isch&ved=2ahUKEwjF-8XirIHoAhWzIMUKHWcZBJYQ2-cCegQIABAA&oq=there+no+place+like+%22127.0.0.1%22&gs_l=img.3..0i30l3j0i8i30l4.8396.18840..19156...0.0..0.114.2736.30j1......0....1..gws-wiz-img.......35i39j0j0i19j0i30i19j0i8i30i19.joOmqxpmfsw&ei=EeZfXoWvIrPBlAbnspCwCQ&bih=949&biw=1853"><code>localhost</code></a> with <a href="https://docs.spring.io/spring-security-oauth2-boot/docs/current/reference/htmlsingle/" title="Learn more about OAuth2 Boot">OAuth2 Boot</a> may be easy, ...\r
-</p>\r
-<p>\r
-...but what about running it in <strong>real life</strong>?\r
-</p>\r
-<img src="http://juplo.de/wp-uploads/2020/03/real-life-meme-300x297.png" alt="Looking for the real life" class="alignnone size-medium wp-image-1038" style="float:left; \r
- padding:0 1em 2em 0"/>\r
-<p>\r
-This is the first post of a series of Mini-Howtos, that gather some help, to get you started, when switching from localhost to production with SSL and a reverse-proxy (aka gateway) in front of your app, that forwards the requests to your app that listens on a different name/IP, port and protocol.\r
-</p>\r
-<h2 style="clear:both;">In This Series We Will...</h2>\r
-<ol>\r
- <li><a href="#spring-boot-oauth2">Start with</a> the fantastic official <a href="https://spring.io/guides/tutorials/spring-boot-oauth2/" title="You definitely should work through this tutorial first!">OAuth2-Tutorial</a> from the Spring-Boot folks - <em>love it!</em> - and <a href="#build-a-docker-image">run it as a container in docker</a></li>\r
- <li><a href="/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/" title="Jump to part 2 and learn how to set up a simulated production-installation">Hide that behind a reverse-proxy, like in production - <em>nginx in our case, but could be any pice of software, that can act as a gateway</em></li>\r
- <li>Show how to debug the oauth2-flow for the whole crap!</li>\r
- <li>Enable SSL for our gateway - because oauth2-providers (like Facebook) are pressing us to do so</li>\r
- <li>Show how to do the same with Facebook, instead of GitHub</li>\r
-</ol>\r
-<p>\r
-I will also give some advice for those of you, who are new to Docker - <em>but just enough to enable you to follow</em>.\r
-</p>\r
-<p>This is <strong>Part 1</strong> of this series, that shows how to <strong>package a Spring-Boot-App as Docker-Image and run it as a container</strong>\r
-<h2 id="spring-boot-oauth2"><code>tut-spring-boot-oauth2/logout</code></h2>\r
-<p>\r
-As an example for a simple app, that uses <a href="https://tools.ietf.org/html/rfc6749" title="Read all about OAuth2 in the RFC 6749">OAuth2</a> for authentication, we will use the third step of the <a href="https://spring.io/guides/tutorials/spring-boot-oauth2/" title="You definitely should work through this tutorial first!">Spring-Boot OAuth2-Tutorial</a>.\r
-</p>\r
-<p>\r
-You should work through that tutorial up until that step - called <strong>logout</strong> -, if you have not done yet.\r
-This will guide you through programming and setting up a simple app, that uses the <a href="https://developer.github.com/v3/" title="Learn more about the API provided by GitHub">GitHub-API</a> to authenticate its users.\r
-</p>\r
-<p>\r
-Especially, it explains, how to <strong><a href="https://spring.io/guides/tutorials/spring-boot-oauth2/#github-register-application" title="This links directly to the part of the tutorial, that explains the setup & configuration needed in GitHub Developers">create and set up a OAuth2-App on GitHub</a></strong> - <em>Do not miss out on that part: You need your own app-ID and -secret and a correctly configured <strong>redirect URI</strong></em>.\r
-</p>\r
-<p>\r
-You should be able to build the app as JAR and start that with  the ID/secret of your GitHub-App without changing code or configuration-files as follows:\r
-</p>\r
-<pre class="prettyprint"><code class="docker">mvn package\r
-java -jar target/social-logout-0.0.1-SNAPSHOT.jar \\r
-  --spring.security.oauth2.client.registration.github.client-id=YOUR_GITHUB_APP_ID\r
-  --spring.security.oauth2.client.registration.github.client-secret=YOUR_GITHUB_APP_SECRET\r
-</code></pre>\r
-<p>\r
-<em>If the app is running corectly, you should be able to Login/Logout via <strong><code>http://localhost:8080/</code></strong></em>\r
-<p>\r
-The folks at Spring-Boot are keeping the guide and this repository up-to-date pretty well.\r
-At the date of the writing of this article it is up to date with version <a href="https://github.com/spring-guides/tut-spring-boot-oauth2/commit/274b864a2bcab5326979bc2ba370e32180510362" title="Check out the exact version of this example-project, that is used in this article, if you want">2.2.2.RELEASE</a> of Spring-Boot.\r
-</p>\r
-<p><em>You may as well use any other OAuth2-application here. For example your own POC, if you already have build one that works while running on <code>localhost</code></em></p>\r
-<h2>Some Short Notes On OAuth2</h2>\r
-<p>I will only explain the protocol in very short words here, so that you can understand what goes wrong in case you stumble across one of the many pitfalls, when setting up oauth2.\r
-You can <a href="https://www.oauth.com/oauth2-servers/getting-ready/" title="And you most probably should: At least if you are planning to use it in production!">read more about oauth2 elswhere</a></p>\r
-<p>\r
-For authentication, <a href="https://tools.ietf.org/html/rfc6749" title="OAuth2 is a standardized protocol, that was implemented by several authorities and organizations">oauth2</a> redirects the browser of your user to a server of your oauth2-provider.\r
-This server authenticates the user and redirects the browser back to your server, providing additionally information and ressources, that lets your server know that the user was authenticated successfully and enables it to request more information in the name of the user.\r
-</p>\r
-<p>\r
-Hence, when configuring oath2 one have to:\r
-</p>\r
-<ol>\r
-<li>Provide the URI of the server of your oauth2-provider, the browser will be redirected to for authentication</li>\r
-<li>Tell the server of the oauth2-provider the URL, the browser will be redirected to back after authentication</li>\r
-<li>Also, your app has to provide some identification - a client-ID and -secret - when redirecting to the server of your oauth2-provider, which it has to know</li>\r
-</ol>\r
-<p>\r
-There are a lot more things, which can be configured in oauth2, because the protocol is designed to fit a wide range of use-cases.\r
-But in our case, it usually boils down to the parameters mentioned above.\r
-</p>\r
-<p>\r
-Considering our combination of <strong><code>spring-security-oauth2</code></strong> with <strong>GitHub</strong> this means:\r
-</p>\r
-<ol>\r
-<li>The redirect-URIs of well known oauth2-providers like GitHub are build into the library and do not have to be configured explicitly.</li>\r
-<li>\r
-The URI, the provider has to redirect the browser back to after authenticating the user, is predefined by the library as well.<br />\r
-<em>\r
-But as an additional security measure, almost every oauth2-provider requires you, to also specify this redirect-URI in the configuration on the side of the oauth2-provider.\r
-</em><br />\r
-This is a good and necessary protection against fraud, but at the same time the primary source for missconfiguration:\r
-<strong>If the specified URI in the configuration of your app and on the server of your oauth2-provider does not match, ALL WILL FAIL!</strong>\r
-</li>\r
-<li>The ID and secret of the client (your GitHub-app) always have to be specified explicitly by hand.</li>\r
-</ol>\r
-<p>\r
-Again, everything can be manually overriden, if needed.\r
-Configuration-keys starting with <strong><code>spring.security.oauth2.client.registration.github</code></strong> are choosing GitHub as the oauth2-provider and trigger a bunch of predifined default-configuration.\r
-If you have set up your own oauth2-provider, you have to configure everything manually.\r
-</p>\r
-<h2 id="build-a-docker-image">Running The App Inside Docker</h2>\r
-<p>\r
-To faciliate the debugging - and because this most probably will be the way you are deploying your app anyway - we will start by building a docker-image from the app\r
-</p>\r
-<p>\r
-For this, you do not have to change a single character in the example project - <em>all adjustments to the configuration will be done, when the image is started as a container</em>.\r
-Just change to the subdirectory <a href="https://github.com/spring-guides/tut-spring-boot-oauth2/tree/master/logout" title="This is the subdirectory of the GitHub-Porject, that contains that step of the guide"><code>logout</code></a> of the checked out project and create the following <code>Dockerfile</code> there:\r
-</p>\r
-<pre class="prettyprint"><code class="docker">FROM openjdk:8-jre-buster\r
-\r
-COPY  target/social-logout-0.0.1-SNAPSHOT.jar /opt/app.jar\r
-EXPOSE 8080\r
-ENTRYPOINT [ "/usr/local/openjdk-8/bin/java", "-jar", "/opt/app.jar" ]\r
-CMD []\r
-</code></pre>\r
-<p>\r
-This defines a docker-image, that will run the app.\r
-</p>\r
-<ul>\r
-  <li>The image deduces from <strong><code>openjdk:8-jre-buster</code></strong>, which is an installation of the latest <a href="https://openjdk.java.net/projects/jdk8/">OpenJDK-JDK8</a> on a <a href="https://www.debian.org/releases/stable/index.de.html" title="Have a look at the Release notes of that Debian-Version">Debian-Buster</a></li>\r
-  <li>The app will listen on port <strong><code>8080</code></strong></li>\r
-  <li>By default, a container instanciated from this image will automatically start the Java-app</li>\r
-  <li>The <strong><code>CMD []</code></strong> overwrites the default from the parent-image with an empty list - <em>this enables us to pass command-line parameters to our spring-boot app which we will need to pass in our configuration</em></li>\r
-</ul>\r
-<p>\r
-You can build and tag this image with the following commands:\r
-</p>\r
-<pre class="prettyprint"><code class="sh">mvn clean package\r
-docker build -t juplo/social-logout:0.0.1 .\r
-</code></pre>\r
-<p>This will tag your image as <strong><code>juplo/social-logout:0.0.1</code></strong> - you obviously will/should use your own tag here, for example: <code>myfancytag</code></p>\r
-<p><em>Do not miss out on the flyspeck (<code>.</code>) at the end of the last line!</em></p>\r
-<p>You can run this new image with the follwing command - <em>and you should do that, to test that everything works as expected</em>:</p>\r
-<pre class="prettyprint"><code class="sh">docker run \\r
-  --rm \\r
-  -p 8080:8080 \\r
-  juplo/social-logout:0.0.1 \\r
-  --spring.security.oauth2.client.registration.github.client-id=YOUR_GITHUB_ID \\r
-  --spring.security.oauth2.client.registration.github.client-secret=YOUR_GITHUB_SECRET\r
-</code></pre>\r
-<ul>\r
-  <li><strong><code>--rm</code></strong> removes this test-container automatically, once it is stopped again</li>\r
-  <li><strong><code>-p 8080:8080</code></strong> redirects port <code>8080</code> on <code>localhost</code> to the app</li>\r
-</ul>\r
-<p>\r
-Everything <em>after</em> the specification of the image (here: <code>juplo/social-logout:0.0.1</code>) is handed as a command-line parameter to the started Spring-Boot app - That is, why we needed to declare <code>CMD []</code> in our <code>Dockerfile</code>\r
- <p>\r
-   We utilize this here to pass the ID and secret of your GitHub-app into the docker container -- just like when we started the JAR directly \r
- </p>\r
-</ul>\r
-<p>\r
-The app should behave exactly the same now lik in the test above, where we started it directly by calling the JAR.\r
-</p>\r
-<p>\r
-That means, that you should still be able to login into and logout of your app, if you browse to <code>http://localhost:8080</code> --\r
-<em>At least, if you correctly configured <code>http://localhost:8080/login/oauth2/code/github</code> as authorization callback URL in the <a href="https://github.com/settings/developers" title="If you have any problems here, you should check your settings: do not proceede, until this works!">settings of your OAuth App</a> on GitHub</em>.\r
-</p>\r
-<h2>Comming Next...</h2>\r
-<p>\r
-In the <a href="/how-to-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-hiding-the-app-behind-a-reverse-proxy-gateway/" title="Jump to the next part and read on...">next part</a> of this series, we will hide the app behind a proxy and simulate that the setup is running on our real server <strong><code>example.com</code></strong>.\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1064</wp:post_id>
-               <wp:post_date><![CDATA[2020-03-07 00:02:44]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2020-03-06 22:02:44]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[howto-redirect-to-spring-security-oauth2-behind-a-gateway-proxy-running-your-app-in-docker]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="oauth2"><![CDATA[oauth2]]></category>
-               <category domain="category" nicename="spring"><![CDATA[Spring]]></category>
-               <category domain="category" nicename="spring-boot"><![CDATA[Spring-Boot]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_wp_old_date]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2020-03-06]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Using Jackson Without Annotations To Quickly Add Logging Of Object-Graphs As JSON</title>
-               <link>https://juplo.de/using-jackson-without-annotations-to-quickly-add-logging-of-object-graphs-as-json/</link>
-               <pubDate>Sat, 15 Aug 2020 17:02:52 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1130</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Normally, you have to add Annotations to your classes, if you want to serialize them with Jackson.\r
-The following snippet shows, how you can configure Jackson in order to serialize vanilla classes without adding annotations.\r
-This is usefull, if you want to add logging-statements, that print out graphs of objects in JSON-notation for classes, that are not prepared for serialization.\r
-</p>\r
-<pre class="prettyprint"><code class="sh">\r
-ObjectMapper mapper = new ObjectMapper();\r
-mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);\r
-mapper.enable(SerializationFeature.INDENT_OUTPUT);\r
-String str = mapper.writeValueAsString(new Bar());\r
-</code></pre>\r
-<p>\r
-I have put together a tiny sample-project, that demonstrates the approach.\r
-URL for cloning with GIT:\r
-<a href="https://juplo.de/git/demos/noanno/">https://juplo.de/git/demos/noanno/</a>\r
-</p>\r
-<p>It can be executed with <code>mvn spring-boot:run</code></p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1130</wp:post_id>
-               <wp:post_date><![CDATA[2020-08-15 19:02:52]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2020-08-15 17:02:52]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[using-jackson-without-annotations-to-quickly-add-logging-of-object-graphs-as-json]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="jackson"><![CDATA[Jackson]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="tips"><![CDATA[Tips]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Testing Exception-Handling in Spring-MVC</title>
-               <link>https://juplo.de/testing-exception-handling-in-spring-mvc/</link>
-               <pubDate>Sat, 03 Oct 2020 15:00:17 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1133</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>Specifying Exception-Handlers for Controllers in Spring MVC</h2>\r
-<p>\r
-Spring offers the annotation <strong><code>@ExceptionHandler</code></strong> to handle exceptions thrown by controllers.\r
-The annotation can be added to methods of a specific controller, or to methods of a <strong><code>@Component</code></strong>-class, that is itself annotated with <strong><code>@ControllerAdvice</code></strong>.\r
-The latter defines global exception-handling, that will be carried out by the <code>DispaterServlet</code> for all controllers.\r
-The former specifies exception-handlers for a single controller-class.\r
-</p>\r
-<p>\r
-This mechanism is documented in the <a href="https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/web.html#mvc-exceptionhandlers">Springframework Documentation</a> and it is neatly summarized in the blog-article\r
-<a href="https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc">Exception Handling in Spring MVC</a>.\r
-<strong>In this article, we will focus on testing the sepcified exception-handlers.</strong>\r
-</p>\r
-<h2>Testing Exception-Handlers with the <code>@WebMvcTest</code>-Slice</h2>\r
-<p>\r
-Spring-Boot offers the annotation <strong><code>@WebMvcTest</code></strong> for tests of the controller-layer of your application.\r
-For a test annotated with <code>@WebMvcTest</code>, Spring-Boot will:\r
-</p>\r
-<ul>\r
-<li>Auto-configure Spring MVC, Jackson, Gson, Message converters etc.</li>\r
-<li>Load relevant components (<code>@Controller</code>, <code>@RestController</code>, <code>@JsonComponent</code> etc.)</li>\r
-<li>Configure <code>MockMVC</code>\r
-</ul>\r
-<p>\r
-All other beans configured in the app will be ignored.\r
-Hence, a <code>@WebMvcTest</code> fits perfectly for testing exception-handlers, which are part of the controller-layer.\r
-It enables us, to mock away the other layers of the application and concentrate on the part, that we want to test.\r
-</p>\r
-<p>\r
-Consider the following controller, that defines a request-handling and an accompanying exception-handler, for an\r
-<code>IllegalArgumentException</code>, that may by thrown in the business-logic:\r
-</p>\r
-<code><pre>@Controller\r
-public class ExampleController\r
-{\r
-  @Autowired\r
-  ExampleService service;\r
-\r
-  @RequestMapping("/")\r
-  public String controller(\r
-      @RequestParam(required = false) Integer answer,\r
-      Model model)\r
-  {\r
-    Boolean outcome = answer == null ? null : service.checkAnswer(answer);\r
-    model.addAttribute("answer", answer);\r
-    model.addAttribute("outcome", outcome);\r
-   return "view";\r
-  }\r
-\r
-  @ResponseStatus(HttpStatus.BAD_REQUEST)\r
-  @ExceptionHandler(IllegalArgumentException.class)\r
-  public ModelAndView illegalArgumentException(IllegalArgumentException e)\r
-  {\r
-    LOG.error("{}: {}", HttpStatus.BAD_REQUEST, e.getMessage());\r
-    ModelAndView mav = new ModelAndView("400");\r
-    mav.addObject("exception", e);\r
-    return mav;\r
-  }\r
-}</pre></code>\r
-<p>\r
-The exception-handler resolves the exception as <code>400: Bad Request</code> and renders the specialized error-view <code>400</code>.\r
-</p>\r
-<p>\r
-With the help of <code>@WebMvcTest</code>, we can easily mock away the actual implementation of the business-logic and concentrate on the code under test:\r
-our specialized exception-handler.\r
-</p>\r
-<code><pre>@WebMvcTest(ExampleController.class)\r
-class ExceptionHandlingApplicationTests\r
-{\r
-  @MockBean  ExampleService service;\r
-  @Autowired MockMvc mvc;\r
-\r
-  @Test\r
-  @Autowired\r
-  void test400ForExceptionInBusinessLogic() throws Exception {\r
-    when(service.checkAnswer(anyInt())).thenThrow(new IllegalArgumentException("FOO!"));\r
-\r
-    mvc\r
-      .perform(get(URI.create("http://FOO/?answer=1234")))\r
-      .andExpect(status().isBadRequest());\r
-\r
-    verify(service, times(1)).checkAnswer(anyInt());\r
-  }\r
-}</pre></code>\r
-<p>\r
-We preform a <code>GET</code> with the help of the provided <code>MockMvc</code> and check, that the status of the response fullfills our expectations, if we tell our mocked business-logic to throw the <code>IllegalArgumentException</code>, that is resolved by our exception-handler.]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1133</wp:post_id>
-               <wp:post_date><![CDATA[2020-10-03 17:00:17]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2020-10-03 15:00:17]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[testing-exception-handling-in-spring-mvc]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="spring"><![CDATA[Spring]]></category>
-               <category domain="category" nicename="spring-boot"><![CDATA[Spring-Boot]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Deduplicating Partitioned Data With a Kafka Streams ValueTransformer</title>
-               <link>https://juplo.de/deduplicating-partitioned-data-with-kafka-streams/</link>
-               <pubDate>Sat, 10 Oct 2020 20:02:49 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1147</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p>\r
-Inspired by a current customer project and this article about\r
-<a href="https://blog.softwaremill.com/de-de-de-de-duplicating-events-with-kafka-streams-ed10cfc59fbe">deduplicating events with Kafka Streams</a>\r
-I want to share a simple but powerful implementation of a deduplication mechanism, that works well for partitioned data and does not suffer of memory leaks, because a countless number of message-keys has to be stored.\r
-</p>\r
-<p>\r
-Yet, the presented approach does not work for all use-cases, because it presumes, that a strictly monotonically increasing sequence numbering can be established across all messages - at least concerning all messages, that are routed to the same partition.\r
-</p>\r
-<h2>The Problem</h2>\r
-<p>\r
-A source produces messages, with reliably unique ID's.\r
-From time to time, sending these messages to Kafka may fail.\r
-The order, in which these messages are send, is crucial with respect to the incedent, they belong to.\r
-Resending the messages in correct order after a failure (or downtime) is no problem.\r
-But some of the messages may be send twice (or more often), because the producer does not know exactly, which messages were send successful.\r
-</p>\r
-<code><pre>\r
-Incident A - { id: 1,  data: "ab583cc8f8" }\r
-Incident B - { id: 2,  data: "83ccc8f8f8" }\r
-Incident C - { id: 3,  data: "115tab5b58" }\r
-Incident C - { id: 4,  data: "83caac564b" }\r
-Incident B - { id: 5,  data: "a583ccc8f8" }\r
-Incident A - { id: 6,  data: "8f8bc8f890" }\r
-Incident A - { id: 7,  data: "07583ab583" }\r
-\r
-<< DOWNTIME OR FAILURE >>\r
-\r
-Incident C - { id: 4,  data: "83caac564b" }\r
-Incident B - { id: 5,  data: "a583ccc8f8" }\r
-Incident A - { id: 6,  data: "8f8bc8f890" }\r
-Incident A - { id: 7,  data: "07583ab583" }\r
-Incident A - { id: 8,  data: "930fce58f3" }\r
-Incident B - { id: 9,  data: "7583ab93ab" }\r
-Incident C - { id: 10, data: "7583aab583" }\r
-Incident B - { id: 11, data: "b583075830" }\r
-</pre></code>\r
-<p>\r
-Since eache message has a unique ID, all messages are inherently idempotent:\r
-<strong>Deduplication is no problem, if the receiver keeps track of the messages, he has already seen.</strong>\r
-</p>\r
-<p>\r
-<em>Where is the problem?</em>, you may ask. <em>That's trivial, I just code the deduplication into my consumer!</em>\r
-</p>\r
-<p>\r
-But this approach has several drawbacks, including:\r
-</p>\r
-<ul>\r
-<li>Implementing the trivial algorithm described above is not efficent, since the algorithm in general has to remember the IDs of all messages for an indefinit period of time.</li>\r
-<li>Implementing the algorithm over and over again for every consumer is cumbersome and errorprone.</li> \r
-</ul>\r
-<p>\r
-<em>Wouldn't it be much nicer, if we had an efficient and bulletproof algorithm, that we can simply plug into our Kafka-pipelines?</em>\r
-</p>\r
-<h2>The Idea</h2>\r
-<p>\r
-In his <a href="https://blog.softwaremill.com/de-de-de-de-duplicating-events-with-kafka-streams-ed10cfc59fbe">blog-article</a>\r
-Jaroslaw Kijanowski describes three deduplication algorithms.\r
-The first does not scale well, because it does only work for single-partition topics.\r
-The third aims at a slightly different problem and might fail deduplicating some messages, if the timing is not tuned correctly.\r
-The looks like a robust solution.\r
-But it also looks a bit hacky and is unnecessary complex in my opinion.\r
-</p>\r
-<p>\r
-Playing around with his ideas, i have come up with the following algorithm, that combines elements of all three solutions:\r
-</p>\r
-<ul>\r
-<li>\r
-All messages are keyed by an ID that represents the incident - not the message.\r
-<em>This guarantees, that all messages concerning a specific incident will be stored in the same partition, so that their ordering is retained.</em>\r
-</li>\r
-<li>\r
-We generate unique strictly monotonically increasing sequence numbers, that are assigned to each message.\r
-<em>If the IDs of the messages fullfill these requirements and are stored in the value (like above), they can be reused as sequence numbers</em>\r
-</li>\r
-<li>We keep track of the sequence number last seen for each partition.</li>\r
-<li>We drop all messages with sequnce numbers, that are not greater than the last sequence number, that we saw on that partition.</li>\r
-</ul>\r
-<p>\r
-The algorithm uses the well known approach, that TCP/IP uses to detect and drop duplicate packages.\r
-It is efficient, since we never have to store more sequence numbers, than partitions, that we are handling.\r
-The algorithm can be implemented easily based on a <code>ValueTransformer</code>, because Kafka Streams provides the ability to store state locally.\r
-</p>\r
-<h2>A simplified example-implementation</h2>\r
-<p>\r
-To clearify the idea, I further simplified the problem for the example implementation:\r
-</p>\r
-<ul>\r
-<li>\r
-Key and value of the messages are of type <code>String</code>, for easy scripting.\r
-</li>\r
-<li>\r
-In the example implementation, person-names take the part of the ID of the incident, that acts out as message-key.\r
-</li>\r
-<li>\r
-The value of the message solely consists of the sequence number.\r
-<em>\r
-In a real-world use-case, the sequence number would be stored in the message-value and would have to be extracted from there.\r
-Or it would be stored as a message-header.\r
-</em> \r
-</li>\r
-</ul>\r
-<p>\r
-That is, our message stream is simply a mapping from names to unique sequence numbers and we want to be able to separate out the contained sequence for a single person, without duplicate entries and without jeopardizing the order of that sequence.\r
-</p>\r
-<p>\r
-In this simplified setup, the implementation effectively boils down to the following method-override:\r
-</p>\r
-<code class="java"><pre>@Override\r
-public Iterable&lt;String&gt; transform(String value)\r
-{\r
-  Integer partition = context.partition();\r
-  long sequenceNumber = Long.parseLong(value);\r
-\r
-  Long seen = store.get(partition);\r
-  if (seen == null || seen &lt; sequenceNumber)\r
-  {\r
-    store.put(partition, sequenceNumber);\r
-    return Arrays.asList(value);\r
-  }\r
-\r
-  return Collections.emptyList();\r
-}\r
-</pre></code>\r
-<ul>\r
-<li>We can get the active partition from the <code>ProcessorContext</code>, that is handed to our Instance in the constructor, which is not shown here for brevity.</li>\r
-<li>Parsing the <code>String</code>-value of the message as <code>long</code> corresponds to the extraction of the sequence number from the value of the message in our simplified setup.</li>\r
-<li>\r
-We then check the local state, if a sequence-number was already seen for the active partition.\r
-<em>\r
-Kafka Streams takes care of the initialization and resurection of the local state.\r
-Take a look at the <a href="https://github.com/juplo/demos-kafka-deduplication" title="Browse the source on github.com">full source-code</a> see, how we instruct Kafka Streams to do so.\r
-</em>\r
-</li>\r
-<li>\r
-If this is the first sequence-number, that we see for this partition, or if the sequence-number is greater (that is: newer) than the stored one, we store it in our local state and return the value of the message, because it was seen for the first time.\r
-</li>\r
-<li>\r
-Otherwise, we instruct Kafka Streams to drop the current (duplicate!) value, by returning an empty array.\r
-</li>\r
-</ul>\r
-<p>\r
-We can use our <code>ValueTransformer</code> with <strong><code>flatTransformValues()</code></strong>,\r
-to let Kafka Streams drop the detected duplicate values:\r
-</p>\r
-<code class="java"><pre>streamsBuilder\r
-    .stream("input")\r
-    .flatTransformValues(\r
-        new ValueTransformerSupplier()\r
-        {\r
-          @Override\r
-          public ValueTransformer get()\r
-          {\r
-            return new DeduplicationTransformer();\r
-          }\r
-        },\r
-        "SequenceNumbers")\r
-    .to("output");\r
-</pre></code>\r
-<p>\r
-One has to register an appropriate store to the <code>StreamsBuilder</code> under the referenced name.\r
-</p>\r
-<p>\r
-<a href="https://github.com/juplo/demos-kafka-deduplication" title="Browse the source on github.com">The full source is available on github.com</a>\r
-</p>\r
-<h2>Recapping Our Assumptions...</h2>\r
-<p>\r
-The presented deduplication algorithm presumes some assumptions, that may not fit your use-case.\r
-It is crucial, that these prerequisites are not violated.\r
-Therefor, I will spell them out once more:</p>\r
-<ol>\r
-<li>\r
-We can generate <strong>unique strictly monotonically increasing sequence numbers</strong> for all messages (of a partition).\r
-</li>\r
-<li>\r
-We have a <strong>strict ordering of all messages</strong> (per partition).\r
-</li>\r
-<li>\r
-And hence, since we want to handle more than one partition:\r
-<strong>The data is partitioned by key</strong>.\r
-That is, all messages for a specific key must always be routed to the same partition.\r
-</li>\r
-</ol>\r
-<p>\r
-As a conclusion of this assumptions, we have to note:\r
-<strong>We can only deduplicate messages, that are routed to the same partition.</strong>\r
-This follows, because we can only guarantee message-order per partition. But it should not be a problem for the same reason:\r
-<strong>We assume a use-case, where all messages concerning a specific incident are captured in the same partition.</strong>\r
-</p>\r
-<h2>What is <em>not</em> needed - <em>but also does not hurt</em></h2>\r
-<p>\r
-Since we are only deduplicating messages, that are routed to the same partition, we do not need globally unique sequence numbers.\r
-Our sequence numbers only have to be unique per partition, to enable us to detect, that we have seen a specific message before on that partition.\r
-Golbally unique sequence numbers clearly are a stronger condition:\r
-<strong>It does not hurt, if the sequence numbers are globally unique, because they are always unique per partition, if they are also globally unique.</strong>\r
-</p>\r
-<p>\r
-We detect unseen messages, by the fact that their sequence number is greater than the last stored hight watermark for the partition, they are routed to.\r
-Hence, we do not rely on a seamless numbering without gaps.\r
-<strong>It does not hurt, if the series of sequence numbers does not have any gaps, as long as two different messages on the same partition never are assigned to the same sequence number.</strong>\r
-</p>\r
-<p>\r
-That said, it should be clear, that a globally unique seamless numbering of all messages across all partitions - as in our simple example-implementation - does fit well with our approach, because the numbering is still unique, if one only considers the messages in one partition, and the gaps in the numbering, that are introduced by focusing only on the messages of a single partition, are not violating our assumptions.\r
-</p>\r
-<h2>Pointless / Contradictorily Usage Of The Presented Approach</h2>\r
-<p>\r
-Last but not least, I want to point out, that this approach silently assumes, that the sequence number of the message is not identically to the key of the message.\r
-On the contrary: <strong>The sequence number is expected to be different from the key of the message!</strong>\r
-</p>\r
-<p>\r
-If one would use the key of the message as its sequence number (provided that it is unique and represents a strictly increasing sequence of numbers), one would indeed assure, that all duplicates can be detected, but he would at once force the implementation to be indifferent, concerning the order of the messages.\r
-</p>\r
-<p>\r
-That is, because subsequent messages are forced to have different keys, because all messages are required to have unique sequence numbers.\r
-But messages with different keys may be routed to different partitions - and Kafka can only guarantee message ordering for messages, that live on the same partition.\r
-Hence, one has to assume, that the order in which the messages are send is not retained, if he uses the message-keys as sequence numbers - <em>unless,</em> only one partition is utilized, which is contradictory to our primary goal here: enabling scalability through data-sharding.\r
-</p>\r
-<p>\r
-This is also true, if the key of a message contains an invariant ID and only embeds the changing sequence number.\r
-Because, the default partitioning algorithm always considers the key as a whole, and if any part of it changes, the outcome of the algorithm might change.\r
-</p>\r
-<p>\r
-In a production-ready implementation of the presented approach, I would advice, to store the sequence number in a message header, or provide a configurable extractor, that can derive the sequence number from the contents of the value of the message.\r
-It would be perfectly o.k., if the IDs of the messages are used as sequence numbers, as long as they are unique and monotonically increasing and are stored in the value of the message - not in / as the key!\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1147</wp:post_id>
-               <wp:post_date><![CDATA[2020-10-10 22:02:49]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2020-10-10 20:02:49]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[deduplicating-partitioned-data-with-kafka-streams]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="demos"><![CDATA[Demos]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="kafka"><![CDATA[Kafka]]></category>
-               <category domain="category" nicename="spring-boot"><![CDATA[Spring-Boot]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>How To Instantiatiate Multiple Beans Dinamically in Spring-Boot Depending on Configuration-Properties</title>
-               <link>https://juplo.de/how-to-instantiatiate-multiple-beans-dinamically-in-spring-boot-based-on-configuration-properties/</link>
-               <pubDate>Sat, 21 Nov 2020 10:12:57 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1185</guid>
-               <description></description>
-               <content:encoded><![CDATA[<h2>TL;DR</h2>\r
-<p>\r
-In this mini-HowTo I will show a way, how to instantiate multiple beans dinamically in Spring-Boot, depending on configuration-properties.\r
-We will:\r
-</p>\r
-<ul>\r
-  <li>write a <strong><code>ApplicationContextInitializer</code></strong> to add the beans to the context, before it is refreshed</li>\r
-  <li>write a <strong><code>EnvironmentPostProcessor</code></strong> to access the configured configuration sources</li>\r
-  <li>register the <code>EnvironmentPostProcessor</code> with Spring-Boot</li>\r
-</ul>\r
-<h2>Write an ApplicationContextInitializer</h2>\r
-<p>\r
-Additionally Beans can be added programatically very easy with the help of an <code><a href="https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ApplicationContextInitializer.html">ApplicationContextInitializer</a></code>:\r
-</p>\r
-<code class="java"><pre>@AllArgsConstructor\r
-public class MultipleBeansApplicationContextInitializer\r
-    implements\r
-      ApplicationContextInitializer<ConfigurableApplicationContext>\r
-{\r
-  private final String[] sites;\r
-\r
-  @Override\r
-  public void initialize(ConfigurableApplicationContext context)\r
-  {\r
-    ConfigurableListableBeanFactory factory =\r
-        context.getBeanFactory();\r
-    for (String site : sites)\r
-    {\r
-      SiteController controller =\r
-          new SiteController(site, "Descrition of site " + site);\r
-      factory.registerSingleton("/" + site, controller);\r
-    }\r
-  }\r
-}\r
-</pre></code>\r
-<p>\r
-This simplified example is configured with a list of strings that should be registered as controllers with the <code>DispatcherServlet</code>.\r
-All "sites" are insances of the same controller <code>SiteController</code>, which are instanciated and registered dynamically.\r
-</p>\r
-<p>\r
-The instances are registered as beans with the method <strong><code>registerSingleton(String name, Object bean)</code></strong>\r
-of a  <code>ConfigurableListableBeanFactory</code> that can be accessed through the provided <code>ConfigurableApplicationContext</code>\r
-<p>\r
-The array of strings represents the accessed configuration properties in the simplified example.\r
-The array will most probably hold more complex data-structures in a real-world application.\r
-</p>\r
-<p>\r
-<em>But how do we get access to the configuration-parameters, that are injected in this array here...?</em>\r
-</p>\r
-\r
-<h2>Accessing the Configured Property-Sources</h2>\r
-<p>\r
-Instantiating and registering the additionally beans is easy.\r
-The real problem is to access the configuration properties in the early plumbing-stage of the application-context, in that our <code>ApplicationContextInitializer</code> runs in:\r
-<br/>\r
-<em>The initializer cannot be instantiated and autowired by Spring!</em>\r
-</p>\r
-<p>\r
-<p><strong>The Bad News:</strong> In the early stage we are running in, we cannot use autowiring or access any of the other beans that will be instantiated by spring - especially not any of the beans, that are instantiated via <code>@ConfigurationProperties</code>, we are intrested in.\r
-</p>\r
-<p><strong>The Good News:</strong> We will present a way, how to access initialized instances of all property sources, that will be presented to your app</p>\r
-\r
-<h2>Write an EnvironmentPostProcessor</h2>\r
-<p>\r
-If you write an <strong><code>EnvironmentPostProcessor</code></strong>, you will get access to an instance of <code>ConfigurableEnvironment</code>, that contains a complete list of all <code>PropertySource</code>'s, that are configured for your Spring-Boot-App.\r
-</p>\r
-<code class="java"><pre>public class MultipleBeansEnvironmentPostProcessor\r
-    implements\r
-      EnvironmentPostProcessor\r
-{\r
-  @Override\r
-  public void postProcessEnvironment(\r
-      ConfigurableEnvironment environment,\r
-      SpringApplication application)\r
-  {\r
-    String sites =\r
-        environment.getRequiredProperty("juplo.sites", String.class);\r
-\r
-    application.addInitializers(\r
-        new MultipleBeansApplicationContextInitializer(\r
-            Arrays\r
-                .stream(sites.split(","))\r
-                .map(site -&gt; site.trim())\r
-                .toArray(size -&gt; new String[size])));\r
-  }\r
-}\r
-</pre></code>\r
-<p>\r
-<strong>The Bad News:</strong>\r
-Unfortunately, you have to scan all property-sources for the parameters, that you are interested in.\r
-Also, all values are represented as stings in this early startup-phase of the application-context, because Spring's convenient conversion mechanisms are not available yet.\r
-So, you have to convert any values by yourself and stuff them in more complex data-structures as needed.\r
-</p>\r
-<p>\r
-<strong>The Good News:</strong>\r
-The property names are consistently represented in standard Java-Properties-Notation, regardless of the actual type (<code>.properties</code> / <code>.yml</code>) of the property source.\r
-</p>\r
-\r
-<h2>Register the EnvironmentPostProcessor</h2>\r
-<p>\r
-Finally, you have to <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-customize-the-environment-or-application-context" title="Read more on details and/or alternatives of the mechanism">register</a> the <code>EnvironmentPostProcessor</code> with your Spring-Boot-App.\r
-This is done in the <strong><code>META-INF/spring.factories</code></strong>:\r
-</p>\r
-<code class="java"><pre>org.springframework.boot.env.EnvironmentPostProcessor=\\r
-  de.juplo.demos.multiplebeans.MultipleBeansEnvironmentPostProcessor\r
-</pre></code>\r
-<p><strong>That's it, your done!</strong></p>\r
-<h2>Source Code</h2>\r
-<p>You can find the whole source code in a working mini-application on juplo.de and GitHub:</p>\r
-<ul>\r
-  <li><a href="https://juplo.de/git/demos/multiple-beans/">https://juplo.de/git/demos/multiple-beans/</a></li>\r
-  <li><a href="https://github.com/juplo/demos-multiple-beans">https://github.com/juplo/demos-multiple-beans</a></li>\r
-</ul>\r
-<h2>Other Blog-Posts On The Topic</h2>\r
-<ul>\r
-  <li>The blog-post <a href="https://blog.pchudzik.com/201705/dynamic-beans/">Dynamic Beans in Spring</a> shows a way to register beans dynamically, but does not show how to access the configuration. Also, meanwhile another interface was added to spring, that facilitates this approach: <code>BeanDefinitionRegistryPostProcessor </code></li>\r
-  <li>Benjamin shows in <a href="https://comsystoreply.de/blog-post/how-to-create-your-own-dynamic-bean-definitions-in-spring">How To Create Your Own Dynamic Bean Definitions In Spring</a>, how this interface can be applied and how one can access the configuration. But his example only works with plain Spring in a Servlet Container</li>\r
-</ul>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1185</wp:post_id>
-               <wp:post_date><![CDATA[2020-11-21 12:12:57]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2020-11-21 10:12:57]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[how-to-instantiatiate-multiple-beans-dinamically-in-spring-boot-based-on-configuration-properties]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="demos"><![CDATA[Demos]]></category>
-               <category domain="category" nicename="explained"><![CDATA[Explained]]></category>
-               <category domain="category" nicename="howto"><![CDATA[HOWTO]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="spring"><![CDATA[Spring]]></category>
-               <category domain="category" nicename="spring-boot"><![CDATA[Spring-Boot]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Implementing The Outbox-Pattern With Kafka - Part 0: The example</title>
-               <link>https://juplo.de/implementing-the-outbox-pattern-with-kafka-part-0-the-example/</link>
-               <pubDate>Fri, 05 Feb 2021 17:59:38 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1201</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p><em>This article is part of a Blog-Series</em></p>\r
-<p>\r
-Based on a <a href="/implementing-the-outbox-pattern-with-kafka-part-0-the-example/">very simple example-project</a>\r
-we will implemnt the <a href="https://microservices.io/patterns/data/transactional-outbox.html">Outbox-Pattern</a> with <a href="https://kafka.apache.org/quickstart">Kafka</a>.\r
-</p>\r
-<ul>\r
-<li>Part 0: The Example-Project</li>\r
-<li><a href="/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table/" title="Jump to the explanation what has to be added, to enqueue messages in an outbox for successfully written transactions">Part 1: Writing In The Outbox-Table</a></li>\r
-</ul>\r
-<h2>TL;DR</h2>\r
-<p>\r
-In this part, a small example-project is introduced, that features a component, which has to inform another component upon every succsessfully completed operation.</p>\r
-<h2>The Plan</h2>\r
-<p>\r
-In this mini-series I will implement the <a href="https://microservices.io/patterns/data/transactional-outbox.html">Outbox-Pattern</a>\r
-as described on Chris Richardson's fabolous website <a href="https://microservices.io/">microservices.io</a>.\r
-</p>\r
-<p>\r
-The pattern enables you, to send a message as part of a database transaction in a reliable way, effectively turining the writing of the data\r
-to the database and the sending of the message into an <strong><a href="https://en.wikipedia.org/wiki/Atomicity_(database_systems)">atomic operation</a></strong>: \r
-either both operations are successful or neither.\r
-</p>\r
-<p>\r
-The pattern is well known and implementing it with <a href="https://kafka.apache.org/quickstart">Kafka</a> looks like an easy straight forward job at first glance.\r
-However, there are many obstacles that easily lead to an incomplete or incorrect implementation.\r
-In this blog-series, we will circumnavigate these obstacles together step by step.\r
-</p>\r
-<h2>The Example Project</h2>\r
-<p>\r
-To illustrate our implementation, we will use a simple example-project.\r
-It mimics a part of the registration process for an web application:\r
-a (very!) simplistic service takes registration orders for new users.\r
-</p>\r
-<ul><li>\r
-Successfull registration requests will return a 201 (Created), that carries the URI, under which the data of the newly registered user can be accessed in the <code>Location</code>-header:\r
-<br/ >\r
-<code><pre>echo peter | http :8080/users\r
-\r
-HTTP/1.1 201 \r
-Content-Length: 0\r
-Date: Fri, 05 Feb 2021 14:44:51 GMT\r
-Location: http://localhost:8080/users/peter\r
-</pre></code>\r
-</li>\r
-<li>\r
-Requests to registrate an already existing user will result in a 400 (Bad Request):\r
-<br/>\r
-<code><pre>echo peter | http :8080/users\r
-\r
-HTTP/1.1 400 \r
-Connection: close\r
-Content-Length: 0\r
-Date: Fri, 05 Feb 2021 14:44:53 GMT\r
-</pre></code>\r
-</li>\r
-<li>\r
-Successfully registrated users can be listed:\r
-<code><pre>http :8080/users\r
-\r
-HTTP/1.1 200 \r
-Content-Type: application/json;charset=UTF-8\r
-Date: Fri, 05 Feb 2021 14:53:59 GMT\r
-Transfer-Encoding: chunked\r
-\r
-[\r
-    {\r
-        "created": "2021-02-05T10:38:32.301",\r
-        "loggedIn": false,\r
-        "username": "peter"\r
-    },\r
-    ...\r
-]\r
-</pre></code>\r
-</li>\r
-</ul>\r
-<h2>The Messaging Use-Case</h2>\r
-<p>\r
-As our messaging use-case imagine, that there has to happen several processes after a successful registration of a new user.\r
-This may be the generation of an invoice, some business analytics or any other lengthy process that is best carried out asynchronously.\r
-Hence, we have to generate an event, that informs the responsible services about new registrations.\r
-</p>\r
-<p>\r
-Obviously, these events should only be generated, if the registration is completed successfully.\r
-The event must not be fired, if the registration is rejected, because a duplicate username.\r
-</p>\r
-<p>\r
-On the other hand, the publication of the event must happen reliably, because otherwise, the new might not be charged for the services, we offer...\r
-</p>\r
-<h2>The Transaction</h2>\r
-<p>\r
-The users are stored in a database and the creation of a new user happens in a transaction.\r
-A "brilliant" colleague came up with the idea, to trigger an <code>IncorrectResultSizeDataAccessException</code> to detect duplicate usernames:\r
-</p>\r
-<code><pre>User user = new User(username);\r
-repository.save(user);\r
-// Triggers an Exception, if more than one entry is found\r
-repository.findByUsername(username);\r
-</pre></code>\r
-<p>\r
-The query for the user by its names triggers an <code>IncorrectResultSizeDataAccessException</code>, if more than one entry is found.\r
-The uncaught exception will mark the transaction for rollback, hence, canceling the requested registration.\r
-The 400-response is then generated by a corresponding <code>ExceptionHandler</code>:\r
-</p>\r
-<code><pre>@ExceptionHandler\r
-public ResponseEntity<?> incorrectResultSizeDataAccessException(\r
-    IncorrectResultSizeDataAccessException e)\r
-{\r
-  LOG.info("User already exists!");\r
-  return ResponseEntity.badRequest().build();\r
-}\r
-</pre></code>\r
-<p>\r
-Please do not code this at home...\r
-</p>\r
-<p>\r
-But his weired implementation perfectly illustrates the requirements for our messaging use-case:\r
-The user is written into the database.\r
-But the registration is not successfully completed until the transaction is commited.\r
-If the transaction is rolled back, no message must be send, because no new user was registered.\r
-</p>\r
-<h2>Decoupling with Springs EventPublisher</h2>\r
-<p>\r
-In the example implementation I am using an <code>EventPublisher</code> to decouple the business logic from the implementation of the messaging.\r
-The controller publishes an event, when a new user is registered:\r
-</p>\r
-<code><pre>publisher.publishEvent(new UserEvent(this, usernam));\r
-</pre></code>\r
-<p>\r
-A listener annotated with <code>@TransactionalEventListener</code> receives the events and handles the messaging:\r
-</p>\r
-<code><pre>@TransactionalEventListener\r
-public void onUserEvent(UserEvent event)\r
-{\r
-    // Sending the message happens here...\r
-}\r
-</pre></code>\r
-<p>\r
-In non-critical use-cases, it might be sufficient to actually send the message to Kafka right here.\r
-Spring ensures, that the message of the listener is only called, if the transaction completes successfully.\r
-But in the case of a failure this naive implementation can loose messages.\r
-If the application crashes, after the transaction has completed, but before the message could be send, the event would be lost.\r
-</p>\r
-<p>\r
-In the following blog posts, we will step by step implement a solution based on the Outbox-Pattern, that can guarantee  Exactly-Once semantics for the send messages.\r
-</p>\r
-<h2>May The Source Be With You!</h2>\r
-<p>\r
-The complete source code of the example-project can be cloned here:\r
-</p>\r
-<ul>\r
-<li><code>git clone <a href="https://juplo.de/git/demos/spring/data-jdbc">https://juplo.de/git/demos/spring/data-jdbc</a></code></li>\r
-<li><code>git clone <a href="https://github.com/juplo/demos-spring-data-jdbc.git">https://github.com/juplo/demos-spring-data-jdbc.git</a></code></li>\r
-</ul>\r
-<p>\r
-It includes a <a href="https://github.com/juplo/demos-spring-data-jdbc/blob/master/docker-compose.yml">Setup for Docker Compose</a>, that can be run without compiling\r
-the project. And a runnable <a href="https://github.com/juplo/demos-spring-data-jdbc/blob/master/README.sh">README.sh</a>, that compiles and run the application and illustrates the example.\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1201</wp:post_id>
-               <wp:post_date><![CDATA[2021-02-05 19:59:38]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2021-02-05 17:59:38]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[implementing-the-outbox-pattern-with-kafka-part-0-the-example]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="demos"><![CDATA[Demos]]></category>
-               <category domain="category" nicename="explained"><![CDATA[Explained]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="kafka"><![CDATA[Kafka]]></category>
-               <category domain="category" nicename="spring"><![CDATA[Spring]]></category>
-               <category domain="category" nicename="spring-boot"><![CDATA[Spring-Boot]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-       <item>
-               <title>Implementing The Outbox-Pattern With Kafka - Part 1: Writing In The Outbox-Table</title>
-               <link>https://juplo.de/implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table/</link>
-               <pubDate>Sun, 14 Feb 2021 18:10:38 +0000</pubDate>
-               <dc:creator><![CDATA[kai]]></dc:creator>
-               <guid isPermaLink="false">http://juplo.de/?p=1209</guid>
-               <description></description>
-               <content:encoded><![CDATA[<p><em>This article is part of a Blog-Series</em></p>\r
-<p>\r
-Based on a <a href="/implementing-the-outbox-pattern-with-kafka-part-0-the-example/">very simple example-project</a>\r
-we will implemnt the <a href="https://microservices.io/patterns/data/transactional-outbox.html">Outbox-Pattern</a> with <a href="https://kafka.apache.org/quickstart">Kafka</a>.\r
-</p>\r
-<ul>\r
-<li><a href="/implementing-the-outbox-pattern-with-kafka-part-0-the-example/" title="Jump to the explanation of the example project">Part 0: The Example-Project</a></li>\r
-<li>Part 1: Writing In The Outbox-Table</li>\r
-</ul>\r
-<h2>TL;DR</h2>\r
-<p>\r
-In this part, we will implement the outbox (aka: the queueing of the messages in a database-table).\r
-</p>\r
-<h2>The Outbox Table</h2>\r
-<p>\r
-The outbox is represented by an additionall table in the database.\r
-This table acts as a queue for messages, that should be send as part of the transaction.\r
-Instead of sending the messages, the application stores them in the outbox-table.\r
-The actual sending of the messages occures outside of the transaction.\r
-</p>\r
-<p>\r
-Because the messages are read from the table outside of the transaction context, only entries related to sucessfully commited transactions are visible.\r
-Hence, the sending of the message effectively becomes a part of the transaction.\r
-It happens only, if the transaction was successfully completed.\r
-Messages associated to an aborted transaction will not be send.\r
-<h2>The Implementation</h2>\r
-<p>\r
-No special measures need to be taken when writing the messages to the table.\r
-The only thing to be sure of is that the writing takes part in the transaction.\r
-</p>\r
-<p>\r
-In our implementation, we simply store the <strong>serialized message</strong>, together with a <strong>key</strong>, that is needed for the partitioning of your data in Kafka, in case the order of the messages is important.\r
-We also store a timestamp, that we plan to record as <a href="https://kafka.apache.org/0110/documentation/streams/core-concepts">Event Time</a> later.\r
-</p>\r
-<p>\r
-One more thing that is worth noting is that we utilize the database to create an unique record-ID.\r
-The generated <strong>unique and monotonically increasing id</strong> is required later, for the implementation of <strong>Exactly-Once</strong> semantics.\r
-</p>\r
-<p>\r
-<p><a href="https://github.com/juplo/demos-spring-data-jdbc/blob/part-1/src/main/resources/db/migration/h2/V2__Table_outbox.sql">The SQL for the table</a> looks like this:</p>\r
-<code><pre>CREATE TABLE outbox (\r
-  id BIGINT PRIMARY KEY AUTO_INCREMENT,\r
-  key VARCHAR(127),\r
-  value varchar(1023),\r
-  issued timestamp\r
-);\r
-</pre></code>\r
-<h2>Decoupling The Business Logic</h2>\r
-<p>\r
-In order to decouple the business logic from the implementation of the messaging mechanism, I have implemented a thin layer, that uses <a href="https://docs.spring.io/spring-integration/docs/current/reference/html/event.html">Spring Application Events</a> to publish the messages.\r
-</p>\r
-<p>\r
-Messages are send as a <a href="https://github.com/juplo/demos-spring-data-jdbc/blob/part-1/src/main/java/de/juplo/kafka/outbox/OutboxEvent.java">subclass of <code>ApplicationEvent</code></a>:\r
-</p>\r
-<code><pre>publisher.publishEvent(\r
-  new UserEvent(\r
-    this,\r
-    username,\r
-    CREATED,\r
-    ZonedDateTime.now(clock)));\r
-</pre></code>\r
-<p>\r
-The event takes a key (<code>username</code>) and an object as value (an instance of an enum in our case).\r
-An <code>EventListener</code> receives the events and writes them in the outbox table:\r
-</p>\r
-<code><pre>@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)\r
-public void onUserEvent(OutboxEvent event)\r
-{\r
-  try\r
-  {\r
-    repository.save(\r
-        event.getKey(),\r
-        mapper.writeValueAsString(event.getValue()),\r
-        event.getTime());\r
-  }\r
-  catch (JsonProcessingException e)\r
-  {\r
-    throw new RuntimeException(e);\r
-  }\r
-}\r
-</pre></code>\r
-<p>\r
-The <code>@TransactionalEventListener</code> is not really needed here.\r
-A normal <code>EventListener</code> would also suffice, because spring immediately executes all registered normal event listeners.\r
-Therefore, the registered listeners would run in the same thread, that published the event, and participate in the existing transaction.\r
-</p>\r
-<p>\r
-But if a <code>@TransactionalEventListener</code> is used, like in our example project, it is crucial, that the phase is switched to <code>BEFORE_COMMIT</code> when the Outbox Pattern is introduced.\r
-This is, because the listener has to be executed in the same transaction context in which the event was published.\r
-Otherwise, the writing of the messages would not be coupled to the success or abortion of the transaction, thus violating the idea of the pattern.\r
-</p>\r
-<p>\r
-</p>\r
-<h2>May The Source Be With You!</h2>\r
-<p>\r
-Since this part of the implementation only stores the messages in a normal database, it can be published as an independent component that does not require any dependencies on Kafka.\r
-To highlight this, the implementation of this step does not use Kafka at all.\r
-In a later step, we will separate the layer, that decouples the business code from our messaging logic in a separate package.\r
-</p>\r
-<p>\r
-The complete source code of the example-project can be cloned here:\r
-</p>\r
-<ul>\r
-<li><code>git clone -b part-1 <a href="https://github.com/juplo/demos-spring-data-jdbc/tree/part-1">https://juplo.de/git/demos/spring/data-jdbc</a></code></li>\r
-<li><code>git clone -b part-1 <a href="https://github.com/juplo/demos-spring-data-jdbc.git">https://github.com/juplo/demos-spring-data-jdbc.git</a></code></li>\r
-</ul>\r
-<p>\r
-This version only includes the logic, that is needed to fill the outbox-tabel.\r
-Reading the messages from this table and sending them through Kafka will be the topic of the next part of this blog-series.\r
-</p>\r
-<p>\r
-The sources include a <a href="https://github.com/juplo/demos-spring-data-jdbc/blob/master/docker-compose.yml">Setup for Docker Compose</a>, that can be run without compiling\r
-the project. And a runnable <a href="https://github.com/juplo/demos-spring-data-jdbc/blob/master/README.sh">README.sh</a>, that compiles and run the application and illustrates the example.\r
-</p>]]></content:encoded>
-               <excerpt:encoded><![CDATA[]]></excerpt:encoded>
-               <wp:post_id>1209</wp:post_id>
-               <wp:post_date><![CDATA[2021-02-14 20:10:38]]></wp:post_date>
-               <wp:post_date_gmt><![CDATA[2021-02-14 18:10:38]]></wp:post_date_gmt>
-               <wp:comment_status><![CDATA[open]]></wp:comment_status>
-               <wp:ping_status><![CDATA[open]]></wp:ping_status>
-               <wp:post_name><![CDATA[implementing-the-outbox-pattern-with-kafka-part-1-the-outbox-table]]></wp:post_name>
-               <wp:status><![CDATA[publish]]></wp:status>
-               <wp:post_parent>0</wp:post_parent>
-               <wp:menu_order>0</wp:menu_order>
-               <wp:post_type><![CDATA[post]]></wp:post_type>
-               <wp:post_password><![CDATA[]]></wp:post_password>
-               <wp:is_sticky>0</wp:is_sticky>
-               <category domain="category" nicename="demos"><![CDATA[Demos]]></category>
-               <category domain="category" nicename="explained"><![CDATA[Explained]]></category>
-               <category domain="category" nicename="java"><![CDATA[Java]]></category>
-               <category domain="category" nicename="kafka"><![CDATA[Kafka]]></category>
-               <category domain="category" nicename="spring"><![CDATA[Spring]]></category>
-               <category domain="category" nicename="spring-boot"><![CDATA[Spring-Boot]]></category>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[classic-editor-remember]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[classic-editor]]></wp:meta_value>
-               </wp:postmeta>
-               <wp:postmeta>
-                       <wp:meta_key><![CDATA[_edit_last]]></wp:meta_key>
-                       <wp:meta_value><![CDATA[2]]></wp:meta_value>
-               </wp:postmeta>
-       </item>
-</channel>
-</rss>