From b0b0a3104bf2a0bf9e9a3aa5347bc98983c6b0a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 00:51:53 +0000 Subject: [PATCH 001/365] [10.0.x] Bump the build-deps group with 10 updates Bumps the build-deps group with 10 updates: | Package | From | To | | --- | --- | --- | | [org.apache.maven.plugin-tools:maven-plugin-tools-api](https://github.com/apache/maven-plugin-tools) | `3.11.0` | `3.12.0` | | [org.apache.maven.plugin-tools:maven-plugin-annotations](https://github.com/apache/maven-plugin-tools) | `3.11.0` | `3.12.0` | | [org.apache.maven.plugins:maven-deploy-plugin](https://github.com/apache/maven-deploy-plugin) | `3.1.1` | `3.1.2` | | [org.apache.maven.plugins:maven-install-plugin](https://github.com/apache/maven-install-plugin) | `3.1.1` | `3.1.2` | | [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) | `3.3.0` | `3.4.1` | | [org.apache.maven.plugins:maven-plugin-plugin](https://github.com/apache/maven-plugin-tools) | `3.11.0` | `3.12.0` | | [org.apache.maven.plugins:maven-shade-plugin](https://github.com/apache/maven-shade-plugin) | `3.5.2` | `3.5.3` | | [org.apache.maven.plugins:maven-source-plugin](https://github.com/apache/maven-source-plugin) | `3.3.0` | `3.3.1` | | [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) | `3.2.2` | `3.2.4` | | [com.github.spotbugs:spotbugs-maven-plugin](https://github.com/spotbugs/spotbugs-maven-plugin) | `4.8.3.1` | `4.8.4.0` | Updates `org.apache.maven.plugin-tools:maven-plugin-tools-api` from 3.11.0 to 3.12.0 - [Release notes](https://github.com/apache/maven-plugin-tools/releases) - [Commits](https://github.com/apache/maven-plugin-tools/compare/maven-plugin-tools-3.11.0...maven-plugin-tools-3.12.0) Updates `org.apache.maven.plugin-tools:maven-plugin-annotations` from 3.11.0 to 3.12.0 - [Release notes](https://github.com/apache/maven-plugin-tools/releases) - [Commits](https://github.com/apache/maven-plugin-tools/compare/maven-plugin-tools-3.11.0...maven-plugin-tools-3.12.0) Updates `org.apache.maven.plugin-tools:maven-plugin-annotations` from 3.11.0 to 3.12.0 - [Release notes](https://github.com/apache/maven-plugin-tools/releases) - [Commits](https://github.com/apache/maven-plugin-tools/compare/maven-plugin-tools-3.11.0...maven-plugin-tools-3.12.0) Updates `org.apache.maven.plugins:maven-deploy-plugin` from 3.1.1 to 3.1.2 - [Release notes](https://github.com/apache/maven-deploy-plugin/releases) - [Commits](https://github.com/apache/maven-deploy-plugin/compare/maven-deploy-plugin-3.1.1...maven-deploy-plugin-3.1.2) Updates `org.apache.maven.plugins:maven-install-plugin` from 3.1.1 to 3.1.2 - [Release notes](https://github.com/apache/maven-install-plugin/releases) - [Commits](https://github.com/apache/maven-install-plugin/compare/maven-install-plugin-3.1.1...maven-install-plugin-3.1.2) Updates `org.apache.maven.plugins:maven-jar-plugin` from 3.3.0 to 3.4.1 - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.3.0...maven-jar-plugin-3.4.1) Updates `org.apache.maven.plugins:maven-plugin-plugin` from 3.11.0 to 3.12.0 - [Release notes](https://github.com/apache/maven-plugin-tools/releases) - [Commits](https://github.com/apache/maven-plugin-tools/compare/maven-plugin-tools-3.11.0...maven-plugin-tools-3.12.0) Updates `org.apache.maven.plugins:maven-shade-plugin` from 3.5.2 to 3.5.3 - [Release notes](https://github.com/apache/maven-shade-plugin/releases) - [Commits](https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.5.2...maven-shade-plugin-3.5.3) Updates `org.apache.maven.plugins:maven-source-plugin` from 3.3.0 to 3.3.1 - [Commits](https://github.com/apache/maven-source-plugin/compare/maven-source-plugin-3.3.0...maven-source-plugin-3.3.1) Updates `org.apache.maven.plugins:maven-gpg-plugin` from 3.2.2 to 3.2.4 - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.2.2...maven-gpg-plugin-3.2.4) Updates `com.github.spotbugs:spotbugs-maven-plugin` from 4.8.3.1 to 4.8.4.0 - [Release notes](https://github.com/spotbugs/spotbugs-maven-plugin/releases) - [Commits](https://github.com/spotbugs/spotbugs-maven-plugin/compare/spotbugs-maven-plugin-4.8.3.1...spotbugs-maven-plugin-4.8.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugin-tools:maven-plugin-tools-api dependency-type: direct:production update-type: version-update:semver-minor dependency-group: build-deps - dependency-name: org.apache.maven.plugin-tools:maven-plugin-annotations dependency-type: direct:production update-type: version-update:semver-minor dependency-group: build-deps - dependency-name: org.apache.maven.plugin-tools:maven-plugin-annotations dependency-type: direct:production update-type: version-update:semver-minor dependency-group: build-deps - dependency-name: org.apache.maven.plugins:maven-deploy-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: build-deps - dependency-name: org.apache.maven.plugins:maven-install-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: build-deps - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-minor dependency-group: build-deps - dependency-name: org.apache.maven.plugins:maven-plugin-plugin dependency-type: direct:production update-type: version-update:semver-minor dependency-group: build-deps - dependency-name: org.apache.maven.plugins:maven-shade-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: build-deps - dependency-name: org.apache.maven.plugins:maven-source-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: build-deps - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: build-deps - dependency-name: com.github.spotbugs:spotbugs-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: build-deps ... Signed-off-by: dependabot[bot] --- pom.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 7c45e42258e5..60f141997e8a 100644 --- a/pom.xml +++ b/pom.xml @@ -296,7 +296,7 @@ 1.3.14 10.3.6 3.3.3 - 3.11.0 + 3.12.0 3.1.0 3.7.1 5.1.9 @@ -305,21 +305,21 @@ false 3.13.0 3.6.1 - 3.1.1 + 3.1.2 3.4.1 3.2.0 - 3.2.2 - 3.1.1 + 3.2.4 + 3.1.2 3.6.1 - 3.3.0 + 3.4.1 3.6.3 - 3.11.0 + 3.12.0 3.0.1 3.2.0 1.9.18 3.3.1 - 3.5.2 - 3.3.0 + 3.5.3 + 3.3.1 3.2.5 3.9.0 3.4.0 @@ -339,7 +339,7 @@ UTF-8 src/it/settings.xml 2.0.9 - 4.8.3.1 + 4.8.4.0 2.1.1.RELEASE 0 1.2.5 From eb396ccad43d7286861eaca1fae3ce0bcb3aa7e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 00:10:44 +0000 Subject: [PATCH 002/365] [11.0.x] Bump the integration-deps group with 2 updates Bumps the integration-deps group with 2 updates: [org.wildfly.security:wildfly-elytron](https://github.com/wildfly-security/wildfly-elytron) and [com.google.cloud:google-cloud-datastore](https://github.com/googleapis/java-datastore). Updates `org.wildfly.security:wildfly-elytron` from 2.3.1.Final to 2.4.1.Final - [Commits](https://github.com/wildfly-security/wildfly-elytron/compare/2.3.1.Final...2.4.1.Final) Updates `com.google.cloud:google-cloud-datastore` from 2.19.0 to 2.19.1 - [Release notes](https://github.com/googleapis/java-datastore/releases) - [Changelog](https://github.com/googleapis/java-datastore/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/java-datastore/compare/v2.19.0...v2.19.1) --- updated-dependencies: - dependency-name: org.wildfly.security:wildfly-elytron dependency-type: direct:production update-type: version-update:semver-minor dependency-group: integration-deps - dependency-name: com.google.cloud:google-cloud-datastore dependency-type: direct:production update-type: version-update:semver-patch dependency-group: integration-deps ... Signed-off-by: dependabot[bot] --- jetty-gcloud/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jetty-gcloud/pom.xml b/jetty-gcloud/pom.xml index d6aa22ea98bc..fbd66d5c9f50 100644 --- a/jetty-gcloud/pom.xml +++ b/jetty-gcloud/pom.xml @@ -17,7 +17,7 @@ - 2.19.0 + 2.19.1 diff --git a/pom.xml b/pom.xml index 224fdb8ea55c..9367850250c7 100644 --- a/pom.xml +++ b/pom.xml @@ -352,7 +352,7 @@ 2.16.2 4.0.3.Final 1.7.0.Final - 2.3.1.Final + 2.4.1.Final 2.4.8 From 762ccf2cd137eb62a1c74bf354d15270c431d21f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 May 2024 01:03:29 +0000 Subject: [PATCH 003/365] [10.0.x] Bump the dev-dependencies group with 20 updates Bumps the dev-dependencies group with 20 updates: | Package | From | To | | --- | --- | --- | | [com.google.errorprone:error_prone_annotations](https://github.com/google/error-prone) | `2.26.1` | `2.27.0` | | [com.google.errorprone:error_prone_core](https://github.com/google/error-prone) | `2.26.1` | `2.27.0` | | [commons-codec:commons-codec](https://github.com/apache/commons-codec) | `1.16.1` | `1.17.0` | | commons-io:commons-io | `2.16.0` | `2.16.1` | | [io.grpc:grpc-core](https://github.com/grpc/grpc-java) | `1.62.2` | `1.63.0` | | [org.codehaus.plexus:plexus-utils](https://github.com/codehaus-plexus/plexus-utils) | `4.0.0` | `4.0.1` | | [org.jboss.logmanager:jboss-logmanager](https://github.com/jboss-logging/jboss-logmanager) | `3.0.4.Final` | `3.0.6.Final` | | [com.puppycrawl.tools:checkstyle](https://github.com/checkstyle/checkstyle) | `10.15.0` | `10.16.0` | | [com.hazelcast:hazelcast](https://github.com/hazelcast/hazelcast) | `5.3.6` | `5.4.0` | | [org.bouncycastle:bcpkix-jdk15to18](https://github.com/bcgit/bc-java) | `1.77` | `1.78.1` | | [org.bouncycastle:bcprov-jdk15to18](https://github.com/bcgit/bc-java) | `1.77` | `1.78.1` | | [org.bouncycastle:bcutil-jdk15to18](https://github.com/bcgit/bc-java) | `1.77` | `1.78.1` | | [org.apache.maven.resolver:maven-resolver-api](https://github.com/apache/maven-resolver) | `1.9.18` | `1.9.20` | | [org.apache.maven.resolver:maven-resolver-connector-basic](https://github.com/apache/maven-resolver) | `1.9.18` | `1.9.20` | | [org.apache.maven.resolver:maven-resolver-impl](https://github.com/apache/maven-resolver) | `1.9.18` | `1.9.20` | | [org.apache.maven.resolver:maven-resolver-spi](https://github.com/apache/maven-resolver) | `1.9.18` | `1.9.20` | | [org.apache.maven.resolver:maven-resolver-transport-file](https://github.com/apache/maven-resolver) | `1.9.18` | `1.9.20` | | org.apache.maven.resolver:maven-resolver-transport-http | `1.9.18` | `1.9.20` | | [org.apache.maven.resolver:maven-resolver-util](https://github.com/apache/maven-resolver) | `1.9.18` | `1.9.20` | | org.apache.maven.scm:maven-scm-provider-jgit | `2.0.1` | `2.1.0` | Updates `com.google.errorprone:error_prone_annotations` from 2.26.1 to 2.27.0 - [Release notes](https://github.com/google/error-prone/releases) - [Commits](https://github.com/google/error-prone/compare/v2.26.1...v2.27.0) Updates `com.google.errorprone:error_prone_core` from 2.26.1 to 2.27.0 - [Release notes](https://github.com/google/error-prone/releases) - [Commits](https://github.com/google/error-prone/compare/v2.26.1...v2.27.0) Updates `commons-codec:commons-codec` from 1.16.1 to 1.17.0 - [Changelog](https://github.com/apache/commons-codec/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-codec/compare/rel/commons-codec-1.16.1...rel/commons-codec-1.17.0) Updates `commons-io:commons-io` from 2.16.0 to 2.16.1 Updates `io.grpc:grpc-core` from 1.62.2 to 1.63.0 - [Release notes](https://github.com/grpc/grpc-java/releases) - [Commits](https://github.com/grpc/grpc-java/compare/v1.62.2...v1.63.0) Updates `org.codehaus.plexus:plexus-utils` from 4.0.0 to 4.0.1 - [Release notes](https://github.com/codehaus-plexus/plexus-utils/releases) - [Commits](https://github.com/codehaus-plexus/plexus-utils/compare/plexus-utils-4.0.0...plexus-utils-4.0.1) Updates `org.jboss.logmanager:jboss-logmanager` from 3.0.4.Final to 3.0.6.Final - [Release notes](https://github.com/jboss-logging/jboss-logmanager/releases) - [Commits](https://github.com/jboss-logging/jboss-logmanager/compare/3.0.4.Final...3.0.6.Final) Updates `com.puppycrawl.tools:checkstyle` from 10.15.0 to 10.16.0 - [Release notes](https://github.com/checkstyle/checkstyle/releases) - [Commits](https://github.com/checkstyle/checkstyle/compare/checkstyle-10.15.0...checkstyle-10.16.0) Updates `com.google.errorprone:error_prone_core` from 2.26.1 to 2.27.0 - [Release notes](https://github.com/google/error-prone/releases) - [Commits](https://github.com/google/error-prone/compare/v2.26.1...v2.27.0) Updates `com.hazelcast:hazelcast` from 5.3.6 to 5.4.0 - [Release notes](https://github.com/hazelcast/hazelcast/releases) - [Commits](https://github.com/hazelcast/hazelcast/compare/v5.3.6...v5.4.0) Updates `org.bouncycastle:bcpkix-jdk15to18` from 1.77 to 1.78.1 - [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html) - [Commits](https://github.com/bcgit/bc-java/commits) Updates `org.bouncycastle:bcprov-jdk15to18` from 1.77 to 1.78.1 - [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html) - [Commits](https://github.com/bcgit/bc-java/commits) Updates `org.bouncycastle:bcutil-jdk15to18` from 1.77 to 1.78.1 - [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html) - [Commits](https://github.com/bcgit/bc-java/commits) Updates `org.bouncycastle:bcprov-jdk15to18` from 1.77 to 1.78.1 - [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html) - [Commits](https://github.com/bcgit/bc-java/commits) Updates `org.bouncycastle:bcutil-jdk15to18` from 1.77 to 1.78.1 - [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html) - [Commits](https://github.com/bcgit/bc-java/commits) Updates `org.apache.maven.resolver:maven-resolver-api` from 1.9.18 to 1.9.20 - [Release notes](https://github.com/apache/maven-resolver/releases) - [Commits](https://github.com/apache/maven-resolver/compare/maven-resolver-1.9.18...maven-resolver-1.9.20) Updates `org.apache.maven.resolver:maven-resolver-connector-basic` from 1.9.18 to 1.9.20 - [Release notes](https://github.com/apache/maven-resolver/releases) - [Commits](https://github.com/apache/maven-resolver/compare/maven-resolver-1.9.18...maven-resolver-1.9.20) Updates `org.apache.maven.resolver:maven-resolver-impl` from 1.9.18 to 1.9.20 - [Release notes](https://github.com/apache/maven-resolver/releases) - [Commits](https://github.com/apache/maven-resolver/compare/maven-resolver-1.9.18...maven-resolver-1.9.20) Updates `org.apache.maven.resolver:maven-resolver-spi` from 1.9.18 to 1.9.20 - [Release notes](https://github.com/apache/maven-resolver/releases) - [Commits](https://github.com/apache/maven-resolver/compare/maven-resolver-1.9.18...maven-resolver-1.9.20) Updates `org.apache.maven.resolver:maven-resolver-transport-file` from 1.9.18 to 1.9.20 - [Release notes](https://github.com/apache/maven-resolver/releases) - [Commits](https://github.com/apache/maven-resolver/compare/maven-resolver-1.9.18...maven-resolver-1.9.20) Updates `org.apache.maven.resolver:maven-resolver-transport-http` from 1.9.18 to 1.9.20 Updates `org.apache.maven.resolver:maven-resolver-util` from 1.9.18 to 1.9.20 - [Release notes](https://github.com/apache/maven-resolver/releases) - [Commits](https://github.com/apache/maven-resolver/compare/maven-resolver-1.9.18...maven-resolver-1.9.20) Updates `org.apache.maven.scm:maven-scm-provider-jgit` from 2.0.1 to 2.1.0 Updates `org.apache.maven.resolver:maven-resolver-connector-basic` from 1.9.18 to 1.9.20 - [Release notes](https://github.com/apache/maven-resolver/releases) - [Commits](https://github.com/apache/maven-resolver/compare/maven-resolver-1.9.18...maven-resolver-1.9.20) Updates `org.apache.maven.resolver:maven-resolver-impl` from 1.9.18 to 1.9.20 - [Release notes](https://github.com/apache/maven-resolver/releases) - [Commits](https://github.com/apache/maven-resolver/compare/maven-resolver-1.9.18...maven-resolver-1.9.20) Updates `org.apache.maven.resolver:maven-resolver-spi` from 1.9.18 to 1.9.20 - [Release notes](https://github.com/apache/maven-resolver/releases) - [Commits](https://github.com/apache/maven-resolver/compare/maven-resolver-1.9.18...maven-resolver-1.9.20) Updates `org.apache.maven.resolver:maven-resolver-transport-file` from 1.9.18 to 1.9.20 - [Release notes](https://github.com/apache/maven-resolver/releases) - [Commits](https://github.com/apache/maven-resolver/compare/maven-resolver-1.9.18...maven-resolver-1.9.20) Updates `org.apache.maven.resolver:maven-resolver-transport-http` from 1.9.18 to 1.9.20 Updates `org.apache.maven.resolver:maven-resolver-util` from 1.9.18 to 1.9.20 - [Release notes](https://github.com/apache/maven-resolver/releases) - [Commits](https://github.com/apache/maven-resolver/compare/maven-resolver-1.9.18...maven-resolver-1.9.20) --- updated-dependencies: - dependency-name: com.google.errorprone:error_prone_annotations dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: com.google.errorprone:error_prone_core dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: commons-codec:commons-codec dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: commons-io:commons-io dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: io.grpc:grpc-core dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: org.codehaus.plexus:plexus-utils dependency-type: direct:development update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: org.jboss.logmanager:jboss-logmanager dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: com.puppycrawl.tools:checkstyle dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: com.google.errorprone:error_prone_core dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: com.hazelcast:hazelcast dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: org.bouncycastle:bcpkix-jdk15to18 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: org.bouncycastle:bcprov-jdk15to18 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: org.bouncycastle:bcutil-jdk15to18 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: org.bouncycastle:bcprov-jdk15to18 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: org.bouncycastle:bcutil-jdk15to18 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: org.apache.maven.resolver:maven-resolver-api dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: org.apache.maven.resolver:maven-resolver-connector-basic dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: org.apache.maven.resolver:maven-resolver-impl dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: org.apache.maven.resolver:maven-resolver-spi dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: org.apache.maven.resolver:maven-resolver-transport-file dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: org.apache.maven.resolver:maven-resolver-transport-http dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: org.apache.maven.resolver:maven-resolver-util dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: org.apache.maven.scm:maven-scm-provider-jgit dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: org.apache.maven.resolver:maven-resolver-connector-basic dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: org.apache.maven.resolver:maven-resolver-impl dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: org.apache.maven.resolver:maven-resolver-spi dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: org.apache.maven.resolver:maven-resolver-transport-file dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: org.apache.maven.resolver:maven-resolver-transport-http dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: org.apache.maven.resolver:maven-resolver-util dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies ... Signed-off-by: dependabot[bot] --- jetty-keystore/pom.xml | 2 +- jetty-util/pom.xml | 2 +- pom.xml | 18 +++++++++--------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/jetty-keystore/pom.xml b/jetty-keystore/pom.xml index cbd7d3892242..d607d1944e04 100644 --- a/jetty-keystore/pom.xml +++ b/jetty-keystore/pom.xml @@ -12,7 +12,7 @@ Test keystore with self-signed SSL Certificate. - 1.77 + 1.78.1 ${project.groupId}.keystore diff --git a/jetty-util/pom.xml b/jetty-util/pom.xml index 9c15dc3369ff..8fa8ba19da24 100644 --- a/jetty-util/pom.xml +++ b/jetty-util/pom.xml @@ -74,7 +74,7 @@ org.apache.maven.scm maven-scm-provider-jgit - 2.0.1 + 2.1.0 diff --git a/pom.xml b/pom.xml index 60f141997e8a..4038b12d00c5 100644 --- a/pom.xml +++ b/pom.xml @@ -207,11 +207,11 @@ 3.5.0 1.5 3.2.0 - 10.15.0 - 1.16.1 + 10.16.0 + 1.17.0 3.14.0 1.26.1 - 2.16.0 + 2.16.1 11 11 11 @@ -221,16 +221,16 @@ 7.0.5 3.0.2 1.6.0 - 2.26.1 + 2.27.0 4.0.6 - 1.62.2 + 1.63.0 2.10.1 33.1.0-jre 5.1.0 1.0.10 2.2 3.0.1 - 5.3.6 + 5.4.0 4.6.5.Final 11.0.19.Final false @@ -259,7 +259,7 @@ 2.0 1.4.1.v201005082020 1.2.5 - 3.0.4.Final + 3.0.6.Final 3.6.1.Final 2.2.1.Final 2.2.1.Final @@ -316,7 +316,7 @@ 3.12.0 3.0.1 3.2.0 - 1.9.18 + 1.9.20 3.3.1 3.5.3 3.3.1 @@ -334,7 +334,7 @@ 1.3.0 org.slf4j;version="[1.7,3.0)", org.slf4j.event;version="[1.7,3.0)", org.slf4j.helpers;version="[1.7,3.0)", org.slf4j.spi;version="[1.7,3.0)" 2.2.0 - 4.0.0 + 4.0.1 4.0.3 UTF-8 src/it/settings.xml From 55fa036dac40bd0792351e2569a9079535e7f727 Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Wed, 1 May 2024 20:30:21 +1000 Subject: [PATCH 004/365] revert git scm upgrade which break the build Signed-off-by: Olivier Lamy --- jetty-util/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetty-util/pom.xml b/jetty-util/pom.xml index 8fa8ba19da24..9c15dc3369ff 100644 --- a/jetty-util/pom.xml +++ b/jetty-util/pom.xml @@ -74,7 +74,7 @@ org.apache.maven.scm maven-scm-provider-jgit - 2.1.0 + 2.0.1 From f8c087f1b5ccd5b55f7668d266d330818a663c76 Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Wed, 1 May 2024 21:00:49 +1000 Subject: [PATCH 005/365] hazelcast upgrade would need more work Signed-off-by: Olivier Lamy --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4038b12d00c5..c19e52831f69 100644 --- a/pom.xml +++ b/pom.xml @@ -230,7 +230,7 @@ 1.0.10 2.2 3.0.1 - 5.4.0 + 5.3.6 4.6.5.Final 11.0.19.Final false From e594703a72fa59d9e96b9c7fe23f5f3ad75363be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 00:38:51 +0000 Subject: [PATCH 006/365] [10.0.x] Bump the integration-deps group with 2 updates Bumps the integration-deps group with 2 updates: [org.wildfly.security:wildfly-elytron](https://github.com/wildfly-security/wildfly-elytron) and [com.google.cloud:google-cloud-datastore](https://github.com/googleapis/java-datastore). Updates `org.wildfly.security:wildfly-elytron` from 2.3.1.Final to 2.4.1.Final - [Commits](https://github.com/wildfly-security/wildfly-elytron/compare/2.3.1.Final...2.4.1.Final) Updates `com.google.cloud:google-cloud-datastore` from 2.19.0 to 2.19.1 - [Release notes](https://github.com/googleapis/java-datastore/releases) - [Changelog](https://github.com/googleapis/java-datastore/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/java-datastore/compare/v2.19.0...v2.19.1) --- updated-dependencies: - dependency-name: org.wildfly.security:wildfly-elytron dependency-type: direct:production update-type: version-update:semver-minor dependency-group: integration-deps - dependency-name: com.google.cloud:google-cloud-datastore dependency-type: direct:production update-type: version-update:semver-patch dependency-group: integration-deps ... Signed-off-by: dependabot[bot] --- jetty-gcloud/pom.xml | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jetty-gcloud/pom.xml b/jetty-gcloud/pom.xml index c10bd111b3b8..180c17ef9bca 100644 --- a/jetty-gcloud/pom.xml +++ b/jetty-gcloud/pom.xml @@ -17,7 +17,7 @@ - 2.19.0 + 2.19.1 diff --git a/pom.xml b/pom.xml index c19e52831f69..7dd2313f8b2f 100644 --- a/pom.xml +++ b/pom.xml @@ -348,7 +348,7 @@ 2.16.2 3.1.9.Final 1.7.0.Final - 2.3.1.Final + 2.4.1.Final 2.4.8 From 11908bbbfd01f74840a05b04eb13c67ed7c53aba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 06:31:43 +0000 Subject: [PATCH 007/365] [11.0.x] Bump the dev-dependencies group across 1 directory with 5 updates Bumps the dev-dependencies group with 5 updates in the / directory: | Package | From | To | | --- | --- | --- | | [ch.qos.logback:logback-core](https://github.com/qos-ch/logback) | `1.5.3` | `1.5.6` | | [com.google.errorprone:error_prone_annotations](https://github.com/google/error-prone) | `2.27.0` | `2.27.1` | | [com.google.errorprone:error_prone_core](https://github.com/google/error-prone) | `2.27.0` | `2.27.1` | | [com.hazelcast:hazelcast](https://github.com/hazelcast/hazelcast) | `5.3.6` | `5.4.0` | | org.apache.maven.scm:maven-scm-provider-jgit | `2.0.1` | `2.1.0` | Updates `ch.qos.logback:logback-core` from 1.5.3 to 1.5.6 - [Commits](https://github.com/qos-ch/logback/compare/v_1.5.3...v_1.5.6) Updates `com.google.errorprone:error_prone_annotations` from 2.27.0 to 2.27.1 - [Release notes](https://github.com/google/error-prone/releases) - [Commits](https://github.com/google/error-prone/compare/v2.27.0...v2.27.1) Updates `com.google.errorprone:error_prone_core` from 2.27.0 to 2.27.1 - [Release notes](https://github.com/google/error-prone/releases) - [Commits](https://github.com/google/error-prone/compare/v2.27.0...v2.27.1) Updates `com.google.errorprone:error_prone_core` from 2.27.0 to 2.27.1 - [Release notes](https://github.com/google/error-prone/releases) - [Commits](https://github.com/google/error-prone/compare/v2.27.0...v2.27.1) Updates `com.hazelcast:hazelcast` from 5.3.6 to 5.4.0 - [Release notes](https://github.com/hazelcast/hazelcast/releases) - [Commits](https://github.com/hazelcast/hazelcast/compare/v5.3.6...v5.4.0) Updates `org.apache.maven.scm:maven-scm-provider-jgit` from 2.0.1 to 2.1.0 --- updated-dependencies: - dependency-name: ch.qos.logback:logback-core dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: com.google.errorprone:error_prone_annotations dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: com.google.errorprone:error_prone_core dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: com.google.errorprone:error_prone_core dependency-type: direct:production update-type: version-update:semver-patch dependency-group: dev-dependencies - dependency-name: com.hazelcast:hazelcast dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies - dependency-name: org.apache.maven.scm:maven-scm-provider-jgit dependency-type: direct:production update-type: version-update:semver-minor dependency-group: dev-dependencies ... Signed-off-by: dependabot[bot] --- jetty-util/pom.xml | 2 +- pom.xml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/jetty-util/pom.xml b/jetty-util/pom.xml index 30c6a57dd0cb..2543a806e2a5 100644 --- a/jetty-util/pom.xml +++ b/jetty-util/pom.xml @@ -74,7 +74,7 @@ org.apache.maven.scm maven-scm-provider-jgit - 2.0.1 + 2.1.0 diff --git a/pom.xml b/pom.xml index 88b1a5a5ef0d..65b5908bd539 100644 --- a/pom.xml +++ b/pom.xml @@ -221,7 +221,7 @@ 7.0.5 3.0.2 1.6.0 - 2.27.0 + 2.27.1 4.0.6 1.63.0 2.10.1 @@ -230,7 +230,7 @@ 1.0.11 2.2 3.0.1 - 5.3.6 + 5.4.0 4.6.5.Final 11.0.19.Final false @@ -297,7 +297,7 @@ 4.3 ${project.build.directory}/local-repo 2.23.1 - 1.5.3 + 1.5.6 10.3.6 3.3.3 3.12.0 From 409326f7e456e890d768f54d7c3881a066724c2e Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Thu, 2 May 2024 17:33:29 +1000 Subject: [PATCH 008/365] revert maven-scm-provider-jgit upgrade Signed-off-by: Olivier Lamy --- jetty-util/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jetty-util/pom.xml b/jetty-util/pom.xml index 2543a806e2a5..30c6a57dd0cb 100644 --- a/jetty-util/pom.xml +++ b/jetty-util/pom.xml @@ -74,7 +74,7 @@ org.apache.maven.scm maven-scm-provider-jgit - 2.1.0 + 2.0.1 From b7765730f4c86bdda593bc37f6a8bc87cd71fd4c Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Thu, 2 May 2024 17:49:49 +1000 Subject: [PATCH 009/365] revert hazelcast upgrade Signed-off-by: Olivier Lamy --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 65b5908bd539..5a8d741c15f9 100644 --- a/pom.xml +++ b/pom.xml @@ -230,7 +230,7 @@ 1.0.11 2.2 3.0.1 - 5.4.0 + 5.3.6 4.6.5.Final 11.0.19.Final false From 7f9312fe20e7a8db6020844afd9b9ca6efb62cfa Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Fri, 10 May 2024 10:27:10 +0000 Subject: [PATCH 010/365] Issue #11766 - null out ReadListener on recycle to aid GC. --- .../src/main/java/org/eclipse/jetty/ee10/servlet/HttpInput.java | 1 + .../src/main/java/org/eclipse/jetty/ee9/nested/HttpInput.java | 1 + 2 files changed, 2 insertions(+) diff --git a/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/HttpInput.java b/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/HttpInput.java index 7b5d756b0d3a..de0f83f8a0e9 100644 --- a/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/HttpInput.java +++ b/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/HttpInput.java @@ -65,6 +65,7 @@ public void recycle() LOG.debug("recycle {}", this); _blockingContentProducer.recycle(); _contentProducer = _blockingContentProducer; + _readListener = null; } } diff --git a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/HttpInput.java b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/HttpInput.java index 9f729ca88091..57782e9c297f 100644 --- a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/HttpInput.java +++ b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/HttpInput.java @@ -61,6 +61,7 @@ public void recycle() if (LOG.isDebugEnabled()) LOG.debug("recycle {}", this); _blockingContentProducer.recycle(); + _readListener = null; } } From 6f2f599b17209e117d5f3e582dd36340a4495efa Mon Sep 17 00:00:00 2001 From: Jan Bartel Date: Mon, 13 May 2024 01:44:13 +0200 Subject: [PATCH 011/365] Issue #11761 fix jetty maven doco and integration test (#11771) * Issue #11761 fix jetty maven doco and integration test --- .../maven/jetty-maven-plugin.adoc | 4 +++- .../jetty-ee10-demo-jetty-webapp/pom.xml | 4 +++- .../jetty-ee10-demo-spec-webapp/pom.xml | 4 +++- .../jetty-simple-webapp/pom.xml | 3 ++- .../config/{login.xml => realm.properties} | 0 .../src/main/webapp/WEB-INF/web.xml | 20 +++++++++++++++++++ .../src/main/webapp/auth/index.html | 3 +++ .../src/main/webapp/logon.html | 20 +++++++++++++++++++ .../src/main/webapp/logonError.html | 4 ++++ .../jetty-ee8-demo-jetty-webapp/pom.xml | 4 +++- .../jetty-ee8-demo-spec-webapp/pom.xml | 4 +++- .../jetty-simple-webapp/pom.xml | 3 ++- .../config/{login.xml => realm.properties} | 0 .../src/main/webapp/WEB-INF/web.xml | 20 +++++++++++++++++++ .../src/main/webapp/auth/index.html | 3 +++ .../src/main/webapp/logon.html | 20 +++++++++++++++++++ .../src/main/webapp/logonError.html | 4 ++++ .../jetty-ee9-demo-jetty-webapp/pom.xml | 4 +++- .../jetty-ee9-demo-spec-webapp/pom.xml | 4 +++- .../jetty-simple-webapp/pom.xml | 3 ++- .../config/{login.xml => realm.properties} | 0 .../src/main/webapp/WEB-INF/web.xml | 20 +++++++++++++++++++ .../src/main/webapp/auth/index.html | 3 +++ .../src/main/webapp/logon.html | 20 +++++++++++++++++++ .../src/main/webapp/logonError.html | 4 ++++ 25 files changed, 168 insertions(+), 10 deletions(-) rename jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/{login.xml => realm.properties} (100%) create mode 100644 jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/auth/index.html create mode 100644 jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logon.html create mode 100644 jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logonError.html rename jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/{login.xml => realm.properties} (100%) create mode 100644 jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/auth/index.html create mode 100644 jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logon.html create mode 100644 jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logonError.html rename jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/{login.xml => realm.properties} (100%) create mode 100644 jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/auth/index.html create mode 100644 jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logon.html create mode 100644 jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logonError.html diff --git a/documentation/jetty-documentation/src/main/asciidoc/programming-guide/maven/jetty-maven-plugin.adoc b/documentation/jetty-documentation/src/main/asciidoc/programming-guide/maven/jetty-maven-plugin.adoc index c19fea9d0593..855d94736577 100644 --- a/documentation/jetty-documentation/src/main/asciidoc/programming-guide/maven/jetty-maven-plugin.adoc +++ b/documentation/jetty-documentation/src/main/asciidoc/programming-guide/maven/jetty-maven-plugin.adoc @@ -954,7 +954,9 @@ Here's an example of setting up the `HashLoginService` for a webapp: Test Realm - ${project.basedir}/src/etc/realm.properties + + ${basedir}/src/etc/realm.properties + diff --git a/jetty-ee10/jetty-ee10-demos/jetty-ee10-demo-jetty-webapp/pom.xml b/jetty-ee10/jetty-ee10-demos/jetty-ee10-demo-jetty-webapp/pom.xml index 6a55a422d328..f91702d2e91c 100644 --- a/jetty-ee10/jetty-ee10-demos/jetty-ee10-demo-jetty-webapp/pom.xml +++ b/jetty-ee10/jetty-ee10-demos/jetty-ee10-demo-jetty-webapp/pom.xml @@ -105,7 +105,9 @@ Test Realm - src/test/resources/test-realm.properties + + src/test/resources/test-realm.properties + diff --git a/jetty-ee10/jetty-ee10-demos/jetty-ee10-demo-spec/jetty-ee10-demo-spec-webapp/pom.xml b/jetty-ee10/jetty-ee10-demos/jetty-ee10-demo-spec/jetty-ee10-demo-spec-webapp/pom.xml index 3f0a9f44605a..36f354e14684 100644 --- a/jetty-ee10/jetty-ee10-demos/jetty-ee10-demo-spec/jetty-ee10-demo-spec-webapp/pom.xml +++ b/jetty-ee10/jetty-ee10-demos/jetty-ee10-demo-spec/jetty-ee10-demo-spec-webapp/pom.xml @@ -85,7 +85,9 @@ Test Realm - src/etc/realm.properties + + src/etc/realm.properties + diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml index 521f49c0d94e..328c5ca6cff1 100644 --- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml +++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml @@ -112,8 +112,9 @@ + Test Realm - ${basedir}/src/config/login.xml + ${basedir}/src/config/realm.properties diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/login.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/realm.properties similarity index 100% rename from jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/login.xml rename to jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/realm.properties diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/WEB-INF/web.xml b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/WEB-INF/web.xml index 2a5ac4b71bf5..dd5eabf4a704 100644 --- a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/WEB-INF/web.xml +++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/WEB-INF/web.xml @@ -4,4 +4,24 @@ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> Jetty Simple Webapp run-mojo-it + + + + Any Authenticated User + /auth/* + + + * + + + + + FORM + Test Realm + + /logon.html?param=test + /logonError.html?param=test + + + diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/auth/index.html b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/auth/index.html new file mode 100644 index 000000000000..c8f121557372 --- /dev/null +++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/auth/index.html @@ -0,0 +1,3 @@ + +

Authenticated

+ diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logon.html b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logon.html new file mode 100644 index 000000000000..6bededa576d4 --- /dev/null +++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logon.html @@ -0,0 +1,20 @@ + +

FORM Authentication demo

+
+ + + + + + + + + + + + +
Username:
Password:
+ +
+
+ \ No newline at end of file diff --git a/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logonError.html b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logonError.html new file mode 100644 index 000000000000..66a838690614 --- /dev/null +++ b/jetty-ee10/jetty-ee10-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logonError.html @@ -0,0 +1,4 @@ + +

Authentication ERROR

+Username, password or role incorrect. + diff --git a/jetty-ee8/jetty-ee8-demos/jetty-ee8-demo-jetty-webapp/pom.xml b/jetty-ee8/jetty-ee8-demos/jetty-ee8-demo-jetty-webapp/pom.xml index eefdb612b9b4..8754eafe188a 100644 --- a/jetty-ee8/jetty-ee8-demos/jetty-ee8-demo-jetty-webapp/pom.xml +++ b/jetty-ee8/jetty-ee8-demos/jetty-ee8-demo-jetty-webapp/pom.xml @@ -101,7 +101,9 @@ Test Realm - ${project.build.testOutputDirectory}/test-realm.properties + + ${project.build.testOutputDirectory}/test-realm.properties + diff --git a/jetty-ee8/jetty-ee8-demos/jetty-ee8-demo-spec/jetty-ee8-demo-spec-webapp/pom.xml b/jetty-ee8/jetty-ee8-demos/jetty-ee8-demo-spec/jetty-ee8-demo-spec-webapp/pom.xml index 10049122d9e2..401f58c26f6c 100644 --- a/jetty-ee8/jetty-ee8-demos/jetty-ee8-demo-spec/jetty-ee8-demo-spec-webapp/pom.xml +++ b/jetty-ee8/jetty-ee8-demos/jetty-ee8-demo-spec/jetty-ee8-demo-spec-webapp/pom.xml @@ -61,7 +61,9 @@ Test Realm - ${project.build.directory}/realm.properties + + ${project.build.directory}/realm.properties + diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml index 94439d89a518..3e81fd0f5c70 100644 --- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml +++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml @@ -140,8 +140,9 @@ + Test Realm - ${basedir}/src/config/login.xml + ${basedir}/src/config/realm.properties diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/login.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/realm.properties similarity index 100% rename from jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/login.xml rename to jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/realm.properties diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/WEB-INF/web.xml b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/WEB-INF/web.xml index 2a5ac4b71bf5..fb11917c5aad 100644 --- a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/WEB-INF/web.xml +++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/WEB-INF/web.xml @@ -4,4 +4,24 @@ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> Jetty Simple Webapp run-mojo-it + + + + Any Authenticated User + /auth/* + + + * + + + + + FORM + Test Realm + + /logon.html?param=test + /logonError.html?param=test + + + diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/auth/index.html b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/auth/index.html new file mode 100644 index 000000000000..c8f121557372 --- /dev/null +++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/auth/index.html @@ -0,0 +1,3 @@ + +

Authenticated

+ diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logon.html b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logon.html new file mode 100644 index 000000000000..6bededa576d4 --- /dev/null +++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logon.html @@ -0,0 +1,20 @@ + +

FORM Authentication demo

+
+ + + + + + + + + + + + +
Username:
Password:
+ +
+
+ \ No newline at end of file diff --git a/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logonError.html b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logonError.html new file mode 100644 index 000000000000..66a838690614 --- /dev/null +++ b/jetty-ee8/jetty-ee8-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logonError.html @@ -0,0 +1,4 @@ + +

Authentication ERROR

+Username, password or role incorrect. + diff --git a/jetty-ee9/jetty-ee9-demos/jetty-ee9-demo-jetty-webapp/pom.xml b/jetty-ee9/jetty-ee9-demos/jetty-ee9-demo-jetty-webapp/pom.xml index 856214335738..8ba0fc74c4fe 100644 --- a/jetty-ee9/jetty-ee9-demos/jetty-ee9-demo-jetty-webapp/pom.xml +++ b/jetty-ee9/jetty-ee9-demos/jetty-ee9-demo-jetty-webapp/pom.xml @@ -111,7 +111,9 @@ Test Realm - src/test/resources/test-realm.properties + + src/test/resources/test-realm.properties + diff --git a/jetty-ee9/jetty-ee9-demos/jetty-ee9-demo-spec/jetty-ee9-demo-spec-webapp/pom.xml b/jetty-ee9/jetty-ee9-demos/jetty-ee9-demo-spec/jetty-ee9-demo-spec-webapp/pom.xml index e8cecdf4907a..8d64f43bd3ec 100644 --- a/jetty-ee9/jetty-ee9-demos/jetty-ee9-demo-spec/jetty-ee9-demo-spec-webapp/pom.xml +++ b/jetty-ee9/jetty-ee9-demos/jetty-ee9-demo-spec/jetty-ee9-demo-spec-webapp/pom.xml @@ -61,7 +61,9 @@ Test Realm - src/etc/realm.properties + + src/etc/realm.properties + diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml index e5779619b9df..38f84bae349b 100644 --- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml +++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/pom.xml @@ -112,8 +112,9 @@ + Test Realm - ${basedir}/src/config/login.xml + ${basedir}/src/config/realm.properties diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/login.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/realm.properties similarity index 100% rename from jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/login.xml rename to jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/config/realm.properties diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/WEB-INF/web.xml b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/WEB-INF/web.xml index 2a5ac4b71bf5..ad17a05cf812 100644 --- a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/WEB-INF/web.xml +++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/WEB-INF/web.xml @@ -4,4 +4,24 @@ xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> Jetty Simple Webapp run-mojo-it + + + + Any Authenticated User + /auth/* + + + * + + + + + FORM + Test Realm + + /logon.html?param=test + /logonError.html?param=test + + + diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/auth/index.html b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/auth/index.html new file mode 100644 index 000000000000..c8f121557372 --- /dev/null +++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/auth/index.html @@ -0,0 +1,3 @@ + +

Authenticated

+ diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logon.html b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logon.html new file mode 100644 index 000000000000..6bededa576d4 --- /dev/null +++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logon.html @@ -0,0 +1,20 @@ + +

FORM Authentication demo

+
+ + + + + + + + + + + + +
Username:
Password:
+ +
+
+ \ No newline at end of file diff --git a/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logonError.html b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logonError.html new file mode 100644 index 000000000000..66a838690614 --- /dev/null +++ b/jetty-ee9/jetty-ee9-maven-plugin/src/it/jetty-start-mojo-it/jetty-simple-webapp/src/main/webapp/logonError.html @@ -0,0 +1,4 @@ + +

Authentication ERROR

+Username, password or role incorrect. + From 1995b5ea591fd5db442eee4321913ec612eabf17 Mon Sep 17 00:00:00 2001 From: Sheldon Shao Date: Mon, 13 May 2024 00:14:55 -0700 Subject: [PATCH 012/365] HttpExchange/HttpRequest got retained by HttpSenderOverHTTP (#11782) --- .../org/eclipse/jetty/client/http/HttpSenderOverHTTP.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpSenderOverHTTP.java b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpSenderOverHTTP.java index af502abf683b..30e0b4e1d43d 100644 --- a/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpSenderOverHTTP.java +++ b/jetty-client/src/main/java/org/eclipse/jetty/client/http/HttpSenderOverHTTP.java @@ -39,7 +39,6 @@ public class HttpSenderOverHTTP extends HttpSender private final IteratingCallback headersCallback = new HeadersCallback(); private final IteratingCallback contentCallback = new ContentCallback(); private final HttpGenerator generator = new HttpGenerator(); - private HttpExchange exchange; private MetaData.Request metaData; private ByteBuffer contentBuffer; private boolean lastContent; @@ -62,7 +61,6 @@ protected void sendHeaders(HttpExchange exchange, ByteBuffer contentBuffer, bool { try { - this.exchange = exchange; this.contentBuffer = contentBuffer; this.lastContent = lastContent; this.callback = callback; @@ -91,7 +89,6 @@ protected void sendContent(HttpExchange exchange, ByteBuffer contentBuffer, bool { try { - this.exchange = exchange; this.contentBuffer = contentBuffer; this.lastContent = lastContent; this.callback = callback; @@ -157,6 +154,7 @@ private HeadersCallback() protected Action process() throws Exception { HttpClient httpClient = getHttpChannel().getHttpDestination().getHttpClient(); + HttpExchange exchange = getHttpExchange(); ByteBufferPool byteBufferPool = httpClient.getByteBufferPool(); boolean useDirectByteBuffers = httpClient.isUseOutputDirectByteBuffers(); while (true) From ceaaa9167c58faab8709e626d63ce3791c428d18 Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Thu, 9 May 2024 16:33:48 +0200 Subject: [PATCH 013/365] HTTP/2 parser improvements. Refactored length checks so that they are mostly performed once, rather than multiple times, during parsing. Signed-off-by: Simone Bordet --- .../jetty/http2/generator/PriorityGenerator.java | 1 + .../jetty/http2/parser/GoAwayBodyParser.java | 12 ++---------- .../jetty/http2/parser/HeadersBodyParser.java | 13 +++++-------- .../jetty/http2/parser/PriorityBodyParser.java | 1 + .../jetty/http2/parser/PushPromiseBodyParser.java | 8 ++++---- .../jetty/http2/parser/SettingsBodyParser.java | 10 ++-------- 6 files changed, 15 insertions(+), 30 deletions(-) diff --git a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/generator/PriorityGenerator.java b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/generator/PriorityGenerator.java index b21879a4ccb7..7304d54fa01f 100644 --- a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/generator/PriorityGenerator.java +++ b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/generator/PriorityGenerator.java @@ -61,6 +61,7 @@ public void generatePriorityBody(ByteBuffer header, int streamId, int parentStre if (exclusive) parentStreamId |= 0x80_00_00_00; header.putInt(parentStreamId); + // SPEC: for RFC 7540 weight is 1..256, for RFC 9113 is an unused value. header.put((byte)(weight - 1)); } } diff --git a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/GoAwayBodyParser.java b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/GoAwayBodyParser.java index 5bc6bc7999eb..5d07da941cc4 100644 --- a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/GoAwayBodyParser.java +++ b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/GoAwayBodyParser.java @@ -56,6 +56,8 @@ public boolean parse(ByteBuffer buffer) return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_go_away_frame"); state = State.LAST_STREAM_ID; length = getBodyLength(); + if (length < 8) + return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_go_away_frame"); break; } case LAST_STREAM_ID: @@ -66,8 +68,6 @@ public boolean parse(ByteBuffer buffer) lastStreamId &= 0x7F_FF_FF_FF; state = State.ERROR; length -= 4; - if (length <= 0) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_go_away_frame"); } else { @@ -82,14 +82,10 @@ public boolean parse(ByteBuffer buffer) --cursor; lastStreamId += currByte << (8 * cursor); --length; - if (cursor > 0 && length <= 0) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_go_away_frame"); if (cursor == 0) { lastStreamId &= 0x7F_FF_FF_FF; state = State.ERROR; - if (length == 0) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_go_away_frame"); } break; } @@ -100,8 +96,6 @@ public boolean parse(ByteBuffer buffer) error = buffer.getInt(); state = State.PAYLOAD; length -= 4; - if (length < 0) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_go_away_frame"); if (length == 0) return onGoAway(lastStreamId, error, null); } @@ -118,8 +112,6 @@ public boolean parse(ByteBuffer buffer) --cursor; error += currByte << (8 * cursor); --length; - if (cursor > 0 && length <= 0) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_go_away_frame"); if (cursor == 0) { state = State.PAYLOAD; diff --git a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeadersBodyParser.java b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeadersBodyParser.java index e63b6d5a6f5e..de8820625dd9 100644 --- a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeadersBodyParser.java +++ b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/HeadersBodyParser.java @@ -113,17 +113,19 @@ else if (hasFlag(Flags.PRIORITY)) } case PADDING_LENGTH: { + if (length < 1) + return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_headers_frame_padding"); paddingLength = buffer.get() & 0xFF; --length; length -= paddingLength; state = hasFlag(Flags.PRIORITY) ? State.EXCLUSIVE : State.HEADERS; loop = length == 0; - if (length < 0) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_headers_frame_padding"); break; } case EXCLUSIVE: { + if (length < 5) + return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_headers_frame"); // We must only peek the first byte and not advance the buffer // because the 31 least significant bits represent the stream id. int currByte = buffer.get(buffer.position()); @@ -139,8 +141,6 @@ else if (hasFlag(Flags.PRIORITY)) parentStreamId &= 0x7F_FF_FF_FF; length -= 4; state = State.WEIGHT; - if (length < 1) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_headers_frame"); } else { @@ -155,14 +155,10 @@ else if (hasFlag(Flags.PRIORITY)) --cursor; parentStreamId += currByte << (8 * cursor); --length; - if (cursor > 0 && length <= 0) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_headers_frame"); if (cursor == 0) { parentStreamId &= 0x7F_FF_FF_FF; state = State.WEIGHT; - if (length < 1) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_headers_frame"); } break; } @@ -171,6 +167,7 @@ else if (hasFlag(Flags.PRIORITY)) // SPEC: stream cannot depend on itself. if (getStreamId() == parentStreamId) return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_priority_frame"); + // SPEC: for RFC 7540 weight is 1..256, for RFC 9113 is an unused value. weight = (buffer.get() & 0xFF) + 1; --length; state = State.HEADERS; diff --git a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/PriorityBodyParser.java b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/PriorityBodyParser.java index 3598931ea649..af5008c983fe 100644 --- a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/PriorityBodyParser.java +++ b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/PriorityBodyParser.java @@ -97,6 +97,7 @@ public boolean parse(ByteBuffer buffer) // SPEC: stream cannot depend on itself. if (getStreamId() == parentStreamId) return connectionFailure(buffer, ErrorCode.PROTOCOL_ERROR.code, "invalid_priority_frame"); + // SPEC: for RFC 7540 weight is 1..256, for RFC 9113 is an unused value. int weight = (buffer.get() & 0xFF) + 1; return onPriority(buffer, parentStreamId, weight, exclusive); } diff --git a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/PushPromiseBodyParser.java b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/PushPromiseBodyParser.java index fa41e4a0b63b..dff50b4878e7 100644 --- a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/PushPromiseBodyParser.java +++ b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/PushPromiseBodyParser.java @@ -73,16 +73,18 @@ public boolean parse(ByteBuffer buffer) } case PADDING_LENGTH: { + if (length < 1) + return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_push_promise_frame"); paddingLength = buffer.get() & 0xFF; --length; length -= paddingLength; state = State.STREAM_ID; - if (length < 4) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_push_promise_frame"); break; } case STREAM_ID: { + if (length < 4) + return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_push_promise_frame"); if (buffer.remaining() >= 4) { streamId = buffer.getInt(); @@ -104,8 +106,6 @@ public boolean parse(ByteBuffer buffer) --cursor; streamId += currByte << (8 * cursor); --length; - if (cursor > 0 && length <= 0) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_push_promise_frame"); if (cursor == 0) { streamId &= 0x7F_FF_FF_FF; diff --git a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/SettingsBodyParser.java b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/SettingsBodyParser.java index b985a7b46ef3..9310a4fa22bd 100644 --- a/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/SettingsBodyParser.java +++ b/jetty-core/jetty-http2/jetty-http2-common/src/main/java/org/eclipse/jetty/http2/parser/SettingsBodyParser.java @@ -110,13 +110,13 @@ private boolean parse(ByteBuffer buffer, int streamId, int bodyLength) } case SETTING_ID: { + if (length < 6) + return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_settings_frame"); if (buffer.remaining() >= 2) { settingId = buffer.getShort() & 0xFF_FF; state = State.SETTING_VALUE; length -= 2; - if (length <= 0) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_settings_frame"); } else { @@ -132,12 +132,8 @@ private boolean parse(ByteBuffer buffer, int streamId, int bodyLength) --cursor; settingId += currByte << (8 * cursor); --length; - if (length <= 0) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_settings_frame"); if (cursor == 0) - { state = State.SETTING_VALUE; - } break; } case SETTING_VALUE: @@ -168,8 +164,6 @@ private boolean parse(ByteBuffer buffer, int streamId, int bodyLength) --cursor; settingValue += currByte << (8 * cursor); --length; - if (cursor > 0 && length <= 0) - return connectionFailure(buffer, ErrorCode.FRAME_SIZE_ERROR.code, "invalid_settings_frame"); if (cursor == 0) { if (LOG.isDebugEnabled()) From 980576d6cbb598ce02ef849e80a0b0b7be2912f1 Mon Sep 17 00:00:00 2001 From: Olivier Lamy Date: Mon, 13 May 2024 10:29:59 +0200 Subject: [PATCH 014/365] build cache 1.2.0 (#11783) Signed-off-by: Olivier Lamy --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e3df6f861512..a2b5756392a6 100644 --- a/pom.xml +++ b/pom.xml @@ -240,7 +240,7 @@ 10.3.6 3.3.3 0.13.1 - 1.1.0 + 1.2.0 3.12.0 3.1.0 3.7.1 From c54141a4cb7b0df9e4302afecaf313f0bef4e6cf Mon Sep 17 00:00:00 2001 From: Ludovic Orban Date: Tue, 7 May 2024 15:28:01 +0200 Subject: [PATCH 015/365] #11736 do not rethrow already thrown exception Signed-off-by: Ludovic Orban --- .../io/content/ContentSinkOutputStream.java | 15 ++++- .../content/ContentSinkOutputStreamTest.java | 58 +++++++++++++++++++ 2 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 jetty-core/jetty-io/src/test/java/org/eclipse/jetty/io/content/ContentSinkOutputStreamTest.java diff --git a/jetty-core/jetty-io/src/main/java/org/eclipse/jetty/io/content/ContentSinkOutputStream.java b/jetty-core/jetty-io/src/main/java/org/eclipse/jetty/io/content/ContentSinkOutputStream.java index c02498fa2a5a..b46abba30ec5 100644 --- a/jetty-core/jetty-io/src/main/java/org/eclipse/jetty/io/content/ContentSinkOutputStream.java +++ b/jetty-core/jetty-io/src/main/java/org/eclipse/jetty/io/content/ContentSinkOutputStream.java @@ -33,6 +33,7 @@ public class ContentSinkOutputStream extends OutputStream { private final Blocker.Shared _blocking = new Blocker.Shared(); private final Content.Sink sink; + private boolean failed; public ContentSinkOutputStream(Content.Sink sink) { @@ -55,7 +56,7 @@ public void write(byte[] b, int off, int len) throws IOException } catch (Throwable x) { - throw IO.rethrow(x); + handleException(x); } } @@ -69,7 +70,7 @@ public void flush() throws IOException } catch (Throwable x) { - throw IO.rethrow(x); + handleException(x); } } @@ -83,7 +84,7 @@ public void close() throws IOException } catch (Throwable x) { - throw IO.rethrow(x); + handleException(x); } } @@ -91,4 +92,12 @@ public void close(Callback callback) throws IOException { sink.write(true, null, callback); } + + private void handleException(Throwable x) throws IOException + { + if (failed) + throw new IOException(x.toString()); + failed = true; + throw IO.rethrow(x); + } } diff --git a/jetty-core/jetty-io/src/test/java/org/eclipse/jetty/io/content/ContentSinkOutputStreamTest.java b/jetty-core/jetty-io/src/test/java/org/eclipse/jetty/io/content/ContentSinkOutputStreamTest.java new file mode 100644 index 000000000000..51e9c422e5a7 --- /dev/null +++ b/jetty-core/jetty-io/src/test/java/org/eclipse/jetty/io/content/ContentSinkOutputStreamTest.java @@ -0,0 +1,58 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +package org.eclipse.jetty.io.content; + +import java.io.IOException; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.StringWriter; + +import org.eclipse.jetty.io.Content; +import org.eclipse.jetty.io.EofException; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; +import static org.junit.jupiter.api.Assertions.fail; + +public class ContentSinkOutputStreamTest +{ + @Test + public void testNoDuplicateExceptionThrown() + { + EofException eofException = new EofException(); + Content.Sink sink = (last, byteBuffer, callback) -> callback.failed(eofException); + + StringWriter stringWriter = new StringWriter(); + try (OutputStream body = new ContentSinkOutputStream(sink)) + { + try + { + body.write('a'); + fail("expected IOException in write()"); + } + catch (IOException e) + { + body.flush(); + fail("expected IOException in flush()"); + } + } + catch (IOException ex) + { + ex.printStackTrace(new PrintWriter(stringWriter)); + } + assertThat(stringWriter.toString(), not(containsString("CIRCULAR REFERENCE"))); + } +} From 9160108b6bf51322ff98250d9e5f07f594deaf75 Mon Sep 17 00:00:00 2001 From: Joakim Erdfelt Date: Fri, 10 May 2024 12:05:12 +0000 Subject: [PATCH 016/365] Issue #11776 - NPE proteection in Request.getServerPort If the HttpURI is scheme-less, the attempt to get the port can result in a NPE --- .../test/java/org/eclipse/jetty/http/HttpURITest.java | 2 ++ .../main/java/org/eclipse/jetty/server/Request.java | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/HttpURITest.java b/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/HttpURITest.java index 95fcfea142fb..be00b41d00c6 100644 --- a/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/HttpURITest.java +++ b/jetty-core/jetty-http/src/test/java/org/eclipse/jetty/http/HttpURITest.java @@ -1109,6 +1109,8 @@ public static Stream concatNormalizedURICases() Arguments.of("hTTps", "example.org", 443, "/", null, null, "https://example.org/"), Arguments.of("WS", "example.org", 8282, "/", null, null, "ws://example.org:8282/"), Arguments.of("wsS", "example.org", 8383, "/", null, null, "wss://example.org:8383/"), + // Undefined scheme + Arguments.of(null, "example.org", 8181, "/", null, null, "//example.org:8181/"), // Undefined Ports Arguments.of("http", "example.org", 0, "/", null, null, "http://example.org/"), Arguments.of("https", "example.org", -1, "/", null, null, "https://example.org/"), diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java index 0673d9160167..aa494c761ec1 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java @@ -486,9 +486,13 @@ static int getServerPort(Request request) return authority.getPort(); // Is there a scheme with a default port? - HttpScheme scheme = HttpScheme.CACHE.get(request.getHttpURI().getScheme()); - if (scheme != null && scheme.getDefaultPort() > 0) - return scheme.getDefaultPort(); + String rawScheme = uri.getScheme(); + if (StringUtil.isNotBlank(rawScheme)) + { + HttpScheme scheme = HttpScheme.CACHE.get(rawScheme); + if (scheme != null && scheme.getDefaultPort() > 0) + return scheme.getDefaultPort(); + } // Is there a local port? SocketAddress local = request.getConnectionMetaData().getLocalSocketAddress(); From 33bc4f7376d5cfab2fb8c60aeaea269590a9b5b4 Mon Sep 17 00:00:00 2001 From: Ludovic Orban Date: Mon, 13 May 2024 12:03:29 +0200 Subject: [PATCH 017/365] #11777 change Index to allow null string keys to avoid having to add null checks Signed-off-by: Ludovic Orban --- .../main/java/org/eclipse/jetty/server/Request.java | 10 +++------- .../java/org/eclipse/jetty/util/AbstractTrie.java | 4 ++-- .../java/org/eclipse/jetty/util/ArrayTernaryTrie.java | 6 ------ .../src/main/java/org/eclipse/jetty/util/Index.java | 10 +++++----- .../test/java/org/eclipse/jetty/util/TrieTest.java | 11 +++++++++++ 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java index aa494c761ec1..0673d9160167 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/Request.java @@ -486,13 +486,9 @@ static int getServerPort(Request request) return authority.getPort(); // Is there a scheme with a default port? - String rawScheme = uri.getScheme(); - if (StringUtil.isNotBlank(rawScheme)) - { - HttpScheme scheme = HttpScheme.CACHE.get(rawScheme); - if (scheme != null && scheme.getDefaultPort() > 0) - return scheme.getDefaultPort(); - } + HttpScheme scheme = HttpScheme.CACHE.get(request.getHttpURI().getScheme()); + if (scheme != null && scheme.getDefaultPort() > 0) + return scheme.getDefaultPort(); // Is there a local port? SocketAddress local = request.getConnectionMetaData().getLocalSocketAddress(); diff --git a/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/AbstractTrie.java b/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/AbstractTrie.java index 812372ae754d..d26d3653d666 100644 --- a/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/AbstractTrie.java +++ b/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/AbstractTrie.java @@ -63,7 +63,7 @@ public V remove(String s) public V get(String s) { - return get(s, 0, s.length()); + return get(s, 0, s == null ? 0 : s.length()); } public V get(ByteBuffer b) @@ -73,7 +73,7 @@ public V get(ByteBuffer b) public V getBest(String s) { - return getBest(s, 0, s.length()); + return getBest(s, 0, s == null ? 0 : s.length()); } public V getBest(byte[] b, int offset, int len) diff --git a/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayTernaryTrie.java b/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayTernaryTrie.java index aec1e8e12512..b9410d1d35fe 100644 --- a/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayTernaryTrie.java +++ b/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/ArrayTernaryTrie.java @@ -259,12 +259,6 @@ public V get(ByteBuffer b, int offset, int len) return _value[t]; } - @Override - public V getBest(String s) - { - return getBest(0, s, 0, s.length()); - } - @Override public V getBest(String s, int offset, int length) { diff --git a/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/Index.java b/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/Index.java index dd52406f7d22..1202f65d95f6 100644 --- a/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/Index.java +++ b/jetty-core/jetty-util/src/main/java/org/eclipse/jetty/util/Index.java @@ -29,7 +29,7 @@ public interface Index /** * Get an exact match from a String key * - * @param s The key + * @param s The key, possibly null * @return the value for the string key */ V get(String s); @@ -45,7 +45,7 @@ public interface Index /** * Get an exact match from a String key * - * @param s The key + * @param s The key, possibly null * @param offset The offset within the string of the key * @param len the length of the key * @return the value for the string / offset / length @@ -65,7 +65,7 @@ public interface Index /** * Check if there is an exact match from a String key * - * @param s The key + * @param s The key, possibly null * @return true if there is a match, false otherwise */ default boolean contains(String s) @@ -76,7 +76,7 @@ default boolean contains(String s) /** * Get the best match from key in a String. * - * @param s The string + * @param s The string, possibly null * @param offset The offset within the string of the key * @param len the length of the key * @return The value or null if not found @@ -87,7 +87,7 @@ default boolean contains(String s) * Get the best match from key in a String, which may be * a prefix match or an exact match. * - * @param s The string + * @param s The string, possibly null * @return The value or null if not found */ V getBest(String s); diff --git a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/TrieTest.java b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/TrieTest.java index d5eb875df67d..cb55a282181a 100644 --- a/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/TrieTest.java +++ b/jetty-core/jetty-util/src/test/java/org/eclipse/jetty/util/TrieTest.java @@ -414,6 +414,17 @@ public void testIsEmpty(AbstractTrie trie) throws Exception assertTrue(trie.isEmpty()); } + @ParameterizedTest + @MethodSource("emptyImplementations") + public void testGetNullStringKey(AbstractTrie trie) throws Exception + { + assertNull(trie.get((String)null)); + assertNull(trie.get((String)null, 0, 0)); + assertFalse(trie.contains(null)); + assertNull(trie.getBest((String)null)); + assertNull(trie.getBest((String)null, 0, 0)); + } + @ParameterizedTest @MethodSource("implementations") public void testIsNotEmpty(AbstractTrie trie) throws Exception From a9b2da533f64b923cf06306b5f5faf2c5132f7ce Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Tue, 14 May 2024 10:37:00 +0200 Subject: [PATCH 018/365] Fixes #11763 - Race condition in QoSHandler. (#11772) * Fixes #11763 - Race condition in QoSHandler. Now using a read-write lock to atomically execute expire(). This guarantees that there are no races with resume(). The concurrency between handle() and resume(), which should be the most common case, is handled by atomic data structures. Signed-off-by: Simone Bordet --- .../jetty/server/handler/QoSHandler.java | 139 ++++++++++++------ 1 file changed, 93 insertions(+), 46 deletions(-) diff --git a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/QoSHandler.java b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/QoSHandler.java index 42d90fbb86d5..eb7442c62299 100644 --- a/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/QoSHandler.java +++ b/jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/QoSHandler.java @@ -24,6 +24,8 @@ import java.util.concurrent.ConcurrentSkipListSet; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.io.CyclicTimeouts; @@ -74,6 +76,7 @@ public class QoSHandler extends ConditionalHandler.Abstract private static final Logger LOG = LoggerFactory.getLogger(QoSHandler.class); private static final String EXPIRED_ATTRIBUTE_NAME = QoSHandler.class.getName() + ".expired"; + private final ReadWriteLock lock = new ReentrantReadWriteLock(); private final AtomicInteger state = new AtomicInteger(); private final Map> queues = new ConcurrentHashMap<>(); private final Set priorities = new ConcurrentSkipListSet<>(Comparator.reverseOrder()); @@ -181,35 +184,55 @@ protected void doStop() throws Exception @Override public boolean onConditionsMet(Request request, Response response, Callback callback) throws Exception + { + return process(request, response, callback); + } + + private boolean process(Request request, Response response, Callback callback) throws Exception { if (LOG.isDebugEnabled()) - LOG.debug("{} handling {}", this, request); + LOG.debug("{} processing {}", this, request); - int permits = state.getAndDecrement(); - if (permits > 0) - { - return handleWithPermit(request, response, callback); - } - else + boolean expired = false; + + // The read lock allows concurrency with resume(), + // which is the common case, but not with expire(). + lock.readLock().lock(); + try { - if (request.getAttribute(EXPIRED_ATTRIBUTE_NAME) != null) - { - // This is a request that was suspended, and it expired. - // Do not suspend it again, just complete it with 503. - state.getAndIncrement(); - notAvailable(response, callback); - } - else + int permits = state.decrementAndGet(); + if (permits < 0) { - // Avoid this race condition: - // T1 in handle() may find no permits, so it will suspend the request. - // T2 in resume() finds no suspended requests and increments the permits. - // T1 suspends the request, which will remain suspended despite permits are available. - // See correspondent state machine logic in resume() and expire(). - suspend(request, response, callback); + if (request.getAttribute(EXPIRED_ATTRIBUTE_NAME) == null) + { + // Cover this race condition: + // T1 in this method may find no permits, so it will suspend the request. + // T2 in resume() finds no suspended request yet and increments the permits. + // T1 suspends the request, despite permits are available. + // This is avoided in resume() using a spin loop to wait for the request to be suspended. + // See correspondent state machine logic in resume() and expire(). + suspend(request, response, callback); + return true; + } + else + { + // This is a request that was suspended, it expired, and was re-handled. + // Do not suspend it again, just complete it with 503 unavailable. + state.incrementAndGet(); + expired = true; + } } - return true; } + finally + { + lock.readLock().unlock(); + } + + if (!expired) + return handleWithPermit(request, response, callback); + + notAvailable(response, callback); + return true; } @Override @@ -287,24 +310,33 @@ private void suspend(Request request, Response response, Callback callback) private void resume(Throwable x) { - // See correspondent state machine logic in handle() and expire(). - int permits = state.getAndIncrement(); - if (permits >= 0) - { - if (LOG.isDebugEnabled()) - LOG.debug("{} no suspended requests to resume", this, x); - return; - } - - while (true) + // Allows concurrency with process(), but not with expire(). + lock.readLock().lock(); + try { - if (resumeSuspended()) + // See correspondent state machine logic in process() and expire(). + int permits = state.incrementAndGet(); + if (permits > 0) + { + if (LOG.isDebugEnabled()) + LOG.debug("{} no suspended requests to resume", this, x); return; + } - // Found no suspended requests yet, but there will be. - // This covers the small race window in handle(), where - // the state is updated and then the request suspended. - Thread.onSpinWait(); + while (true) + { + if (resumeSuspended()) + return; + + // Found no suspended requests yet, but there will be. + // This covers the small race window in process(), where + // the state is updated and then the request suspended. + Thread.onSpinWait(); + } + } + finally + { + lock.readLock().unlock(); } } @@ -357,17 +389,32 @@ public long getExpireNanoTime() private void expire() { - // The request timed out, therefore it never acquired a permit. - boolean removed = queues.get(priority).remove(this); - if (removed) + boolean removed; + // It should be rare that requests expire. + // Grab the write lock to atomically operate on the queue and + // the state, avoiding concurrency with process() and resume(). + lock.writeLock().lock(); + try { - // See correspondent state machine logic in handle() and resume(). - state.getAndIncrement(); - if (LOG.isDebugEnabled()) - LOG.debug("{} timeout {}", QoSHandler.this, request); - request.setAttribute(EXPIRED_ATTRIBUTE_NAME, true); - failSuspended(request, response, callback, HttpStatus.SERVICE_UNAVAILABLE_503, new TimeoutException()); + // The request timed out, therefore it was not handled. + removed = queues.get(priority).remove(this); + // The remove() may fail to a concurrent resume(). + if (removed) + { + // See correspondent state machine logic in process() and resume(). + state.incrementAndGet(); + if (LOG.isDebugEnabled()) + LOG.debug("{} timeout {}", QoSHandler.this, request); + request.setAttribute(EXPIRED_ATTRIBUTE_NAME, true); + } } + finally + { + lock.writeLock().unlock(); + } + + if (removed) + failSuspended(request, response, callback, HttpStatus.SERVICE_UNAVAILABLE_503, new TimeoutException()); } @Override From 66b13d5df1d459133996c85517d86a8fa5cf0b6d Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Thu, 16 May 2024 19:04:48 +0200 Subject: [PATCH 019/365] Updated XML example to use ${project.basedir} instead of ${basedir}. Signed-off-by: Simone Bordet --- .../asciidoc/programming-guide/maven/jetty-maven-plugin.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/jetty-documentation/src/main/asciidoc/programming-guide/maven/jetty-maven-plugin.adoc b/documentation/jetty-documentation/src/main/asciidoc/programming-guide/maven/jetty-maven-plugin.adoc index 855d94736577..5e054efef2c4 100644 --- a/documentation/jetty-documentation/src/main/asciidoc/programming-guide/maven/jetty-maven-plugin.adoc +++ b/documentation/jetty-documentation/src/main/asciidoc/programming-guide/maven/jetty-maven-plugin.adoc @@ -955,7 +955,7 @@ Here's an example of setting up the `HashLoginService` for a webapp: Test Realm - ${basedir}/src/etc/realm.properties + ${project.basedir}/src/etc/realm.properties From c97c9956421160fd93d0d788ce0d0c538ca2f4e1 Mon Sep 17 00:00:00 2001 From: Ludovic Orban Date: Fri, 17 May 2024 11:39:01 +0200 Subject: [PATCH 020/365] Don't create circular throwables and don't throw StackOverflowError if one gets logged (#11793) #11792 detect loops in throwables to avoid StackOverflowError Signed-off-by: Ludovic Orban --- .../eclipse/jetty/logging/StdErrAppender.java | 20 ++++++++++++++---- .../jetty/logging/StdErrAppenderTest.java | 21 +++++++++++++++++++ .../jetty/ee10/servlet/AsyncContextEvent.java | 6 ++---- .../jetty/ee9/nested/AsyncContextEvent.java | 6 ++---- 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/jetty-core/jetty-slf4j-impl/src/main/java/org/eclipse/jetty/logging/StdErrAppender.java b/jetty-core/jetty-slf4j-impl/src/main/java/org/eclipse/jetty/logging/StdErrAppender.java index 9b341c913437..719f2e7afd78 100644 --- a/jetty-core/jetty-slf4j-impl/src/main/java/org/eclipse/jetty/logging/StdErrAppender.java +++ b/jetty-core/jetty-slf4j-impl/src/main/java/org/eclipse/jetty/logging/StdErrAppender.java @@ -14,7 +14,10 @@ package org.eclipse.jetty.logging; import java.io.PrintStream; +import java.util.Collections; +import java.util.IdentityHashMap; import java.util.Objects; +import java.util.Set; import java.util.TimeZone; import org.slf4j.event.Level; @@ -175,7 +178,7 @@ private void format(StringBuilder builder, JettyLogger logger, Level level, long } else { - appendCause(builder, cause, ""); + appendCause(builder, cause, "", Collections.newSetFromMap(new IdentityHashMap<>())); } } } @@ -199,9 +202,18 @@ private String renderedLevel(Level level) } } - private void appendCause(StringBuilder builder, Throwable cause, String indent) + private void appendCause(StringBuilder builder, Throwable cause, String indent, Set visited) { builder.append(EOL).append(indent); + if (visited.contains(cause)) + { + builder.append("[CIRCULAR REFERENCE: "); + appendEscaped(builder, cause.toString()); + builder.append("]"); + return; + } + visited.add(cause); + appendEscaped(builder, cause.toString()); StackTraceElement[] elements = cause.getStackTrace(); for (int i = 0; elements != null && i < elements.length; i++) @@ -213,14 +225,14 @@ private void appendCause(StringBuilder builder, Throwable cause, String indent) for (Throwable suppressed : cause.getSuppressed()) { builder.append(EOL).append(indent).append("Suppressed: "); - appendCause(builder, suppressed, "\t|" + indent); + appendCause(builder, suppressed, "\t|" + indent, visited); } Throwable by = cause.getCause(); if (by != null && by != cause) { builder.append(EOL).append(indent).append("Caused by: "); - appendCause(builder, by, indent); + appendCause(builder, by, indent, visited); } } diff --git a/jetty-core/jetty-slf4j-impl/src/test/java/org/eclipse/jetty/logging/StdErrAppenderTest.java b/jetty-core/jetty-slf4j-impl/src/test/java/org/eclipse/jetty/logging/StdErrAppenderTest.java index 99cd8bc0ba83..ba3721837d07 100644 --- a/jetty-core/jetty-slf4j-impl/src/test/java/org/eclipse/jetty/logging/StdErrAppenderTest.java +++ b/jetty-core/jetty-slf4j-impl/src/test/java/org/eclipse/jetty/logging/StdErrAppenderTest.java @@ -20,6 +20,27 @@ public class StdErrAppenderTest { + @Test + public void testCircularThrowable() + { + JettyLoggerConfiguration config = new JettyLoggerConfiguration(); + JettyLoggerFactory factory = new JettyLoggerFactory(config); + CapturedStream output = new CapturedStream(); + StdErrAppender appender = (StdErrAppender)factory.getRootLogger().getAppender(); + appender.setStream(output); + JettyLogger logger = factory.getJettyLogger("org.eclipse.jetty.logging.LogTest"); + + // Build an exception with circular refs. + IllegalArgumentException commonCause = new IllegalArgumentException(); + Throwable thrown = new Throwable(commonCause); + RuntimeException suppressed = new RuntimeException(thrown); + thrown.addSuppressed(suppressed); + + appender.emit(logger, Level.INFO, System.currentTimeMillis(), "tname", thrown, "the message"); + + output.assertContains("CIRCULAR REFERENCE"); + } + @Test public void testStdErrLogFormat() { diff --git a/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/AsyncContextEvent.java b/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/AsyncContextEvent.java index 583b51de6259..847e57c44b76 100644 --- a/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/AsyncContextEvent.java +++ b/jetty-ee10/jetty-ee10-servlet/src/main/java/org/eclipse/jetty/ee10/servlet/AsyncContextEvent.java @@ -20,6 +20,7 @@ import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; import org.eclipse.jetty.http.HttpURI; +import org.eclipse.jetty.util.ExceptionUtil; import org.eclipse.jetty.util.thread.Scheduler; public class AsyncContextEvent extends AsyncEvent implements Runnable @@ -149,9 +150,6 @@ public void run() public void addThrowable(Throwable e) { - if (_throwable == null) - _throwable = e; - else if (e != _throwable) - _throwable.addSuppressed(e); + _throwable = ExceptionUtil.combine(_throwable, e); } } diff --git a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/AsyncContextEvent.java b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/AsyncContextEvent.java index 82b3d91753fa..2e4490216ae3 100644 --- a/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/AsyncContextEvent.java +++ b/jetty-ee9/jetty-ee9-nested/src/main/java/org/eclipse/jetty/ee9/nested/AsyncContextEvent.java @@ -19,6 +19,7 @@ import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import org.eclipse.jetty.http.HttpURI; +import org.eclipse.jetty.util.ExceptionUtil; import org.eclipse.jetty.util.thread.Scheduler; public class AsyncContextEvent extends AsyncEvent implements Runnable @@ -149,9 +150,6 @@ public void run() public void addThrowable(Throwable e) { - if (_throwable == null) - _throwable = e; - else if (e != _throwable) - _throwable.addSuppressed(e); + _throwable = ExceptionUtil.combine(_throwable, e); } } From a4c297011bde6d57d2a1933e9d9794dd144367e7 Mon Sep 17 00:00:00 2001 From: Simone Bordet Date: Sun, 19 May 2024 19:32:37 +0200 Subject: [PATCH 021/365] Fixes #11072 - Jetty 12: CompleteCallbackHandler (#11786) Introduced StateTrackingHandler. StateTrackingHandler is a troubleshooting Handler that helps to identify those cases where the Handler/Request/Response APIs are used improperly. In particular, it tracks the events described in StateTrackingHandler.Listener, such as the Handler callback not completed, or blocking demand callback, or a write callback not completed, etc. It also provides dump() capabilities, so the current requests and their state is dumped to help troubleshooting. Signed-off-by: Simone Bordet --- .../modules/module-state-tracking.adoc | 31 + .../modules/modules-standard.adoc | 3 +- .../troubleshooting/chapter.adoc | 3 +- .../troubleshooting/troubleshooting-dump.adoc | 2 +- .../troubleshooting-handlers.adoc | 28 + .../images/jmc-server-dump.png | Bin 0 -> 268442 bytes .../server/http/server-http-handler-use.adoc | 28 + .../programming-guide/troubleshooting.adoc | 22 +- .../server/http/HTTPServerDocs.java | 28 + .../main/config/etc/jetty-state-tracking.xml | 16 + .../main/config/modules/state-tracking.mod | 39 + .../src/main/config/modules/well-known.mod | 2 +- .../org/eclipse/jetty/server/Request.java | 2 +- .../server/handler/StateTrackingHandler.java | 938 ++++++++++++++++++ .../server/internal/HttpChannelState.java | 22 +- .../handler/StateTrackingHandlerTest.java | 742 ++++++++++++++ .../eclipse/jetty/util/thread/Scheduler.java | 36 + .../tests/distribution/DistributionTests.java | 29 + 18 files changed, 1958 insertions(+), 13 deletions(-) create mode 100644 documentation/jetty-documentation/src/main/asciidoc/operations-guide/modules/module-state-tracking.adoc create mode 100644 documentation/jetty-documentation/src/main/asciidoc/operations-guide/troubleshooting/troubleshooting-handlers.adoc create mode 100644 documentation/jetty-documentation/src/main/asciidoc/programming-guide/images/jmc-server-dump.png create mode 100644 jetty-core/jetty-server/src/main/config/etc/jetty-state-tracking.xml create mode 100644 jetty-core/jetty-server/src/main/config/modules/state-tracking.mod create mode 100644 jetty-core/jetty-server/src/main/java/org/eclipse/jetty/server/handler/StateTrackingHandler.java create mode 100644 jetty-core/jetty-server/src/test/java/org/eclipse/jetty/server/handler/StateTrackingHandlerTest.java diff --git a/documentation/jetty-documentation/src/main/asciidoc/operations-guide/modules/module-state-tracking.adoc b/documentation/jetty-documentation/src/main/asciidoc/operations-guide/modules/module-state-tracking.adoc new file mode 100644 index 000000000000..449f55342423 --- /dev/null +++ b/documentation/jetty-documentation/src/main/asciidoc/operations-guide/modules/module-state-tracking.adoc @@ -0,0 +1,31 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +[[og-module-state-tracking]] +===== Module `state-tracking` + +The `state-tracking` Jetty module inserts the `StateTrackingHandler` at the beginning of the Handler chain. + +`StateTrackingHandler` is a xref:og-troubleshooting[troubleshooting] `Handler` that tracks usages of `Handler`/`Request`/`Response` asynchronous APIs, and logs at warning level invalid usages of the APIs that may lead to blockages, deadlocks, or missing completion of ``Callback``s. + +This module can be enabled to troubleshoot web applications that do not behave as expected, for example: + +* That consume a lot of threads (possibly because they block). +* That do not send responses (or send only partial responses) to clients. +* That timeout when apparently they have received or have sent all data. + +The module properties are: + +---- +include::{jetty-home}/modules/state-tracking.mod[tags=documentation] +---- diff --git a/documentation/jetty-documentation/src/main/asciidoc/operations-guide/modules/modules-standard.adoc b/documentation/jetty-documentation/src/main/asciidoc/operations-guide/modules/modules-standard.adoc index 132cb491bc44..f00ba02c71a2 100644 --- a/documentation/jetty-documentation/src/main/asciidoc/operations-guide/modules/modules-standard.adoc +++ b/documentation/jetty-documentation/src/main/asciidoc/operations-guide/modules/modules-standard.adoc @@ -20,6 +20,7 @@ include::module-console-capture.adoc[] include::module-core-deploy.adoc[] include::module-cross-origin.adoc[] include::module-eeN-deploy.adoc[] +include::module-eeN-webapp.adoc[] include::module-http.adoc[] include::module-http2.adoc[] include::module-http2c.adoc[] @@ -34,9 +35,9 @@ include::module-rewrite.adoc[] include::module-server.adoc[] include::module-ssl.adoc[] include::module-ssl-reload.adoc[] +include::module-state-tracking.adoc[] include::module-test-keystore.adoc[] include::module-threadpool.adoc[] include::module-threadpool-virtual.adoc[] include::module-threadpool-virtual-preview.adoc[] -include::module-eeN-webapp.adoc[] include::module-well-known.adoc[] diff --git a/documentation/jetty-documentation/src/main/asciidoc/operations-guide/troubleshooting/chapter.adoc b/documentation/jetty-documentation/src/main/asciidoc/operations-guide/troubleshooting/chapter.adoc index 81a17733b12a..21192124b75b 100644 --- a/documentation/jetty-documentation/src/main/asciidoc/operations-guide/troubleshooting/chapter.adoc +++ b/documentation/jetty-documentation/src/main/asciidoc/operations-guide/troubleshooting/chapter.adoc @@ -14,7 +14,7 @@ [[og-troubleshooting]] === Troubleshooting -To troubleshoot Jetty when used as a production server, there are two main tools: the Jetty Server Dump and enabling DEBUG level logging. +To troubleshoot Jetty when used as a standalone server, there are two main tools: the Jetty Server Dump and enabling DEBUG level logging. Jetty is based on components organized as a tree, with the `Server` instance at the root of the tree. @@ -36,3 +36,4 @@ IMPORTANT: Make sure you read about how to secure the access to Jetty when using include::troubleshooting-dump.adoc[] include::troubleshooting-logging.adoc[] include::troubleshooting-debugging.adoc[] +include::troubleshooting-handlers.adoc[] diff --git a/documentation/jetty-documentation/src/main/asciidoc/operations-guide/troubleshooting/troubleshooting-dump.adoc b/documentation/jetty-documentation/src/main/asciidoc/operations-guide/troubleshooting/troubleshooting-dump.adoc index ffce8f78da29..b79cb55becd5 100644 --- a/documentation/jetty-documentation/src/main/asciidoc/operations-guide/troubleshooting/troubleshooting-dump.adoc +++ b/documentation/jetty-documentation/src/main/asciidoc/operations-guide/troubleshooting/troubleshooting-dump.adoc @@ -14,7 +14,7 @@ [[og-troubleshooting-dump]] ==== Server Dump -The Jetty Server Dump is obtained by invoking, via JMX, the `Server.dump()` operation, as shown below. +The Jetty Server Dump is obtained by invoking, via JMX, the `Server.dump()` operation, as shown below using link:https://adoptium.net/jmc.html[Java Mission Control (JMC)]: image::jmc-server-dump.png[] diff --git a/documentation/jetty-documentation/src/main/asciidoc/operations-guide/troubleshooting/troubleshooting-handlers.adoc b/documentation/jetty-documentation/src/main/asciidoc/operations-guide/troubleshooting/troubleshooting-handlers.adoc new file mode 100644 index 000000000000..04e4543a3208 --- /dev/null +++ b/documentation/jetty-documentation/src/main/asciidoc/operations-guide/troubleshooting/troubleshooting-handlers.adoc @@ -0,0 +1,28 @@ +// +// ======================================================================== +// Copyright (c) 1995 Mort Bay Consulting Pty Ltd and others. +// +// This program and the accompanying materials are made available under the +// terms of the Eclipse Public License v. 2.0 which is available at +// https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0 +// which is available at https://www.apache.org/licenses/LICENSE-2.0. +// +// SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 +// ======================================================================== +// + +[[og-troubleshooting-handlers]] +==== Troubleshooting Handlers + +[[og-troubleshooting-handlers-state-tracking]] +===== `StateTrackingHandler` + +Jetty's `StateTrackingHandler` (described in xref:og-module-state-tracking[this module]) can be used to troubleshoot problems in web applications. + +`StateTrackingHandler` tracks the usages of `Handler`/`Request`/`Response` asynchronous APIs by web applications, emitting events (logged at warning level) when an invalid usage of the APIs is detected. + +In conjunction with xref:og-troubleshooting-dump[dumping the Jetty component tree], it dumps the state of current requests, detailing whether they have reads or writes that are pending, whether callbacks have been completed, along with thread stack traces (including virtual threads) of operations that have been started but not completed, or are stuck in blocking code. + +You need to enable the `state-tracking` Jetty module, and configure it to track what you are interested in tracking (for more details, see the link:{javadoc-url}/org/eclipse/jetty/server/handler/StateTrackingHandler.html[javadocs]). + +// TODO: add a section about DebugHandler. diff --git a/documentation/jetty-documentation/src/main/asciidoc/programming-guide/images/jmc-server-dump.png b/documentation/jetty-documentation/src/main/asciidoc/programming-guide/images/jmc-server-dump.png new file mode 100644 index 0000000000000000000000000000000000000000..33cd92938cbe75fb4cfec68b54ab6c1d940bc786 GIT binary patch literal 268442 zcmafa1yEc;^XCJCTS5pBoZtir!QI{6A-KCcNpK17?(Xgc5AF_&yZZtQNAmr@x~r?J zx~aFdZ)Zn(dV0Ehe$x{oFDr(Mgo^|K0IGzzup$7wAq4=Kdj#m$95csk$mk zz*M*Iw9O@_sHjLCXQ7BH>qnLoo0ek-A6E220IY%n2;@kZxms&F#=$hwbak4{B($@$ z14R>R1b3p_cGMr#d(Hi6qTb1B)pv%N?fq%wDb_1t6qgfCh)@x8r?}<=50l;k2qgY* z1&y=5O!5DFLr~#(5OW3oW+ISWBX^6#{O48qX5r%Eg0BVrKc%wuBGTM(qobp3*V@1& z?E;;YDFx~2>8L0ulG|Gq!G9|&L#R0u4Z}ph`1GCU-bO}7W@be{fBtN42H&0Nt4K;q zdp$oj$Hpohe0XNL2ZNmtXAZ>fa)t&Wo)FyDP1~JBzSFk^Vc_|IH4baOS^cyz)Z@ofP#STm0o` zd;Sl;7<;*Z1@7+&Dp^p&XOtIF{M3<9fS$M2{=xZK{n;kY6YJH~+2T*!PfDeM4du9+ z-ii^MV=+_EvL1)2IWZZR4om7Q6VpiqJDx0G z$!@f0hPVaWQ4P}FFwI^Fx$9m7>%0QE0zw?(dUxt!#cB1UaPf{vA?2&Fb3ZlTOHW;d>lRPe+^~?*o03p-D%~Xm&~>!GQO}Y&a_+5drB88i(RX#{Ax$pt96I->cXg$9N7%D6 zS(l}=L^kGzgzAf6Pq_*KD!z%(s|-Ya;+t&N)`*4+8b*>xn1UW6rnhj}Z{Rf-P`07Z zZaPdw_bZ27El%G@=vD*lTP>r~rl0Qe z0FsQ#iSNvVThm(mpjIK>jKD9vl-Q^U4ZKZLxg-NA=ur7yv=wzJ4S3t~phgZGDPLQ1 zGM~*<+QM^<){G(N>r*DuyMrv%e&Sw=%9^S0FfloL*JnO7p3{U=VdhW)RdX1bo;~O4 zn31SnteB69A{Ptt1A=`)sxT>9Hr}(*_aS#(P`}@2HqbIn4f-@Y3Xd;xFzM;x7^}-m z;~sT-O|9@iojEX{@C=k+WUOdMLIV^B4Ri~1NXy5X>{uE zZ6w4VMXk=%g?UuSo?L7LfkBy-UMC`IlMloz)TbufkV8gciQvK0LYLk1@;SzY@M*lc zJE(Bnd*-YmdzKBI3GjQ1AO*Qp9Rh%nYhKNqg&kO)9okf|)qI(VDTcI`3laCCXkt8g zV{)e!uW-$qJk6+E~R49xx;mSh)zpGrGv>kh!OSeF2Eo3ahM`9rN{6+Zz>J0 zp`AvTF-+kX?OdP3E*TQ@rQzDtM7q`OJNlrV3vw;|8lUwn)J0vXJ32O>M%&X(-X50I zOgv+WH5+5S2*g4lHVjFt9cJuOV`SDj5UP9W87uc5RofAeC@OMrd$puFAwT}`uVk2mpv93GMdbzSjAw#s|T zj>aeDVsS6yo3_+<{*+;i>^1f%-G)$+GVHXWI&KvsG>%%5ThMc3+D(r`!@@%o***LD zr4)_KH0t~*c9uP5uv`r7!HGpFoRQ0pJ}yeP%d0;hXi@K@QpP9iuW&l7w%X7r97;?L zenr@=+#M*P4HWqlB3jNxI8NpanS~j_o~3f^=w(t8IW~K+rYB@9ay7xB0>o%3Dr(MH zz_}-WILFlCQqrz3tTV6I9%$~67-DDlaQwNz5ZwlWkddXj%6MZ{XF2m@WJ}G#Spm0S zLED#s=hQpyN5gk7Grx&veF|04?XdxN8|~Ywu_zu&QaA`{TqfV5=(FgSL$i;MPdcYF zr^|6tVj?!M(&j!rJIg{$>^BVI82I&fL1ZqDJJYMF=1pqi>;4SUpPCXkLHjdi+FU={ z(BR4C5o~UVTvyLwz);h_DQLx<)iG}mB86ZO#8@2>u_ZgK%a|E05tmz}IDz-fNO2nD zqpEc;tx2grtu^!D^2Vi7f#K#T#T3K|$?FMc3F{x-!A3C#B4ylYLx zcBMo<$-5B{0oy#9Q@MAn`>k%{HJoJI=Tjo>ZI@5BBesL^gPt{QVwEy6r;d$uPIFlO zg=VwcfIOUx82u{SALX##mFtWSw{5EdwMS30_-97FZ+k4hX+exP7gI|dweVxbH&&LO z&H>gELaY#uotT3ap63&pB>!_1rrdD_jKb%b0P-74!H62^S?YpUQ_(j(O(n1f2XXP2h}YdN=gC-lgSDD zZoaNLg`9%%G$%ErEVA5qelYU2=T#2sCAr z@jJ$&q|ckfW1EOp5-C-}f=c|*&|T})aWW!>K@9`^9_BPV-?4p50p2RqZZV-d!uSro zT$8|}_QcECQ5LHOWHgw|NX3q;&8p>`Apq+`hwgHQ#)i1B3SN}}ECB`9#lGetd=;p)P*t)oHRW3KhmPx$hU3eGBDmR7dYipub}F@9a3At~67~q)=)8 z$2A*rcOZ%vDs@=grFi09-A~>koqcl?agZK@_&I@|r^#}_uS-ie9LK4?V$!5CfP#2T zwScFgXPsnhF%eBql7xS%0>3%xgfmaCoXA6`J&uGy%}HUS8j*xv2@MB*m8?-+Wvv-O zC5?)!wI|#d76#YKU^Y6_iAS%KB~!*1kqHT*7E|Su`{T87MsjMa%5TDf276bgKi(JH z>2G>B!*a54z*Q2}N-H2O ztdj&yRA!O!OL*>U#_Auq!3Mw5ocHYl?B67#kg!5-9NV`y=Q}i>L>!2-ujp zYwt>GdwXxMu&~fqrSjchA03bC^VDEr%;K%~@2oj69C+N7$b8?5!mhNsf4G4tO!wk6 z{Z%XRB8Q`>DwKaGgCSK^f7kQn-2H)S*rRK3&JMDkj3e>mEW1=WDB63pbKH;|;d@eD z8-~QtTNU2c$!;kW5=;>uZ8qA|PQ?7gd}kRMSZSmCM~u(Z;B!{RURD;SobNg2QIdHM z&=_fKS|9R0O~%h&8NL5q&WU7{`?1;e(imHYS_f4DhY_RTT5Ku`^=FXv<36|ZJordW zuJXEu%2zGlj1>=uTFFGK&BM@Jmz#(84~fZ(p3N_UIc~b90Hr?H51JrxB8>MKe35ZG zl)VKC526pu6BGn$+TPfBklmf5!K7uT6Z85&nZp_Z{SGfS+co@GgF2eZ7H0Bre~&`I zd40Jv{Na@TuP5(AX{^IT-cXg>q)$DM2Ae76Vr?PVgve}dZlE=ux+7TT)6($|XVcqYKfZ_3tj8M{lLdm8oOzlGrg<&iCWkQaXt` zY_rc_@3`rC&c@PI84?>9eD!^Px)6G>+2Xe^l-rEsW-?^Q^y+XqaEO*4L>1s-mgkpC zVDR>bcD3CzbZHY}JJdMh_!)HKy$A}Cfwt%y0boMEzoz|a_k%XG2uvz0Ep8kNlac+K z<+(+Hs*}@n@nR`DEI@n>b}j4!JNt6gcWb3iG~35ju6G!T3~F*aLEP@6%**VycAu@0 za8NC+Tb$BE<0i2HAm3zlx01yg?j~*LwAuRQXUJGN)pvd%**saALnxxJ%A%zS$7r?b z1MTs8H_TuM_PM+j$KcLYFS@44cuoP;$LK#${f$& zxw^dc^72BW3?4pp4*O^3mLi*n>HL_6u7z33 zEY1nKY|1HmA=}pG7OdaQgWwa#^?9`BiqEY@GFB+fzE~MF&P%z-q+WK2B^ETal!Xt9 zC3;o(U+|cOyUgbSBPp!4++JRHaFz;MmZ-sDBT+J|-;x*A?Z?;Hea1R0Wn!YT4-OTy zgrw5R-hh1Y4G#^T@}XkvU040YCLou=*fn6O(wcx zTzTn-=$$_hmFHH<7q1&WCVtnf5?E{6Z)tV(Dqba*8vCy%DE#L7VNxt?lk zYHDu0v5ywN_(Jh-5n+I?wJXZRNvXf=+p8N4s~-Bx=FV!6v85d4i4m>=?>~Gi27+Ss zsTP=OLlTHJlWsSat#J8|evpR*Tbf067=!iJBm_GY(p78G%E7~j!|o&l_A?;525GMu zmzDERiPmo~cP!qERCZ!OxoKUy<9>M6{P~M!BQ2=)a`-px9cLg?4HUgb(RQq@Ih1{M zF;?}SnnNyA&E4IfVrrm~7>8MB)RT0pI67RG>TT9e3agC_EI2>^Q+WZ0o^CWJ^Z0n_PM)$-da_e}T*#Qb!oQ`j2-n>3qdprU$3K4-8{l`-?Z~izSYoe_GqO z3M$gqJS_|2N(-#jOYLRoN`%v;RHPcz`9&18Hhb0f+So=z#6LLH(c(Gj)*C8%vjY2W zbXr909=~h8cNjPyxgg`ZFH+TBIUdS#I#8KTt@Qmw+p}2k9OK#Gsi8mxa+bq5QCjmf zr+?Q&euNDKHK$^s^u2B}f^(?o6OYc$7*e6>Q;C1+!~LDOA(42up~~YmaLv3F9_Pr} zQ}ny3I=C-_-foQM(2x`^%728ZJm6=QF-EN1j$Zi(DbJ8e^QM-M z?<6e=+3-r}`=$N~F8*S#JL=&c<&nPajbT#YHE44i!KDX_1C5^RhztrPL!o-y=Dj90 zPtiE$^`29x6bsW#e`$P7PBm_YJ+fh8bV!77S^nvJX!Drf%Vc4iOLN?a4h&h0JZ1RX z|63ZSsqh7lvMGvnyjw%0zS{irqVJ^;j&XHrsdcdM2HhAbq!O(nD@)+;5&zo)YIlt1(!T1?zr{PT z|9?Q#{}Z#SENfkPhJJc_@^QlMh}UzQoft=RmHpfL?@9vmI5&LGlHK#`>v_Kcg4ceo zJ!!n@gVf~ycKF(BNk$qYDsLt_00x6W?M(Y@SdBMuUKTrWQeKjM<*f(%nwxXcQ{epeM-OVe-i9tEa6ID z^w}eYw;*}5!^gZ*xjNDHYjp0*ZPB+|; zZ~nWix#O*lL^b6g#N-tZX4RQt7~u(?rekMU*UMrM9B`<9HB~i@9XJ&fX^W{ z#N|q(qh)^4sHS$}jxCBiyR@IbXUyO-diD^n0xMgQTl>Aer8Hm8JN1!a?O?nqrLJZ5 zG<^+Ne;rCy(wS9Ie{98P4b!I{NCO=g#)hZpr|3{}#puB%-K{co*Y_Bii!7(;fN+}4 z)(kckf@jlWzp+>I2O472L|bl`&f@5`MOdBPbWa$7zt+zL>eY*4oj7LQZBuPnl2j4z zC3!h%X7cv_3 z-cA+xf!)0Bz{&+~5{h};1LmircuE!mCW8&{cy?FCO)quR*sm-aa;MQbqi7ZxMac}B zRxEtZUog{!UuV6808t3W@0AxPw4?1rglDQCr36PxW@=83Jz2Au{E!mbLNfO~S#k?Y zrE$l#srQE^+}?C5Fgh&Wbnz5~H{>Wf^^V-UDZ#r ziNVQB5pX`n<5FB)o$E2ZUr9qR<*lx8MXQMn=#P29e~#oFDU4p$y12ikYT@?zP;u5= zz>a<>DlV>`!9_pZt=jJ=co(&jwlXe8CV|e|;4yky>ng~bx9#Xei&uBbWPfVJpta~t zmNYnBTWH;Rb9qwO8$P0qs5ZRNqMr(-wEN52v>z4#Hj+sSyk)oF{<;#(Y%Y6IJ-zV# zNI6+D?K0AdSJ=oJclQ#kNbsn55_5(8?Jh<~O$cM8fZMI9D`Yf}o44r_k6pZT~S%Bg5NSB=`imSK@uXNOS^XuD;Cw?&Rn%H~)XTuZD z6Nzt4Hfxnnlyg~*J+cg1ZD8s3qoO!&O&KlF#L8GT#9!sAC22y^D(x$$2AJ=!A-qQ9Z$)zA_?&B9U})vLAZ+Q^Jxn)>Z_^Mo3j|A4DKQnJ6Op#=H2QWEPduh!mz0M zEEF2@W>2n7wMR3iN4;H>tpiI$7k=EE;4C^029{6X0HkM6RLT~(|BHH z+DZ^#bA4g&s`xqB>lTVBL#OIYo`>yoFh%a4I&g&&V|( z{MK_xX#VO^Zk{811SsN=M2dRCrblPOY<7zW58P&njmAiN33D++x%gVy$vm4{_a2jAH2X7nksJ~X9yWvt z-(KODE&lZ(E~*3cHP6>Tkr(P)D%4x^w6lBFpXmO`$VdpWYkcgjjQcSl$j@i4){n)^ z=9B)e$BG&Ie^v+FNjWcaPC+kJuzqPl-{t(<5o=V2y(oov(q}Arf7O&cav@wB z4^Nn927)tRDw`WJzBl9#j2xMxU|Z)4B= z<3+ZZ=*+I7@cn65ol4^+LjH7_F%K&cdvSg$g&6zJ=`PkLZ$nWjVNb}iI2CX#!^y?RI)iDH!HTx;Uzffi+;C1;&f&7 z_FE|pz;2^&hqX0G&&@uW1eT*&OLf~?BbwVD2dpic>`190!3t}Iq^|rs3`0Wui(Ib7 z13G)bg%TCc^fwmTwAzi66P*xu+^;p!sKK9`@KnNhzKDF5zKtGFW;$E*mG7Vld>e%{ zOcRZb3ZMw(VMqjUYJ|77-yN^~s);1D#)SqjQ)|tWOiL?d=~6r}s za;XBGr~17`U6Nf-)MtL%#|D_A4ClNI{^EQGFO?AI`6l{!?^~2*g?A0O*J;et z2PS&yt$IhL<$IqM2Lt)1b2TK9z$6RfhJsvgH`izQ8{d_MwYdUWNI|&=%GXVpw^4DO z_S>$C8%UpCO@Aj;bR4RPiK{o z-=ZWABNt`h(PK9?yxbmIIb>&@V9>lDc8mGiH9 z+vWKhJuqDGc7J(mBq5JVjbI?ux1n%mq)_iw-p_Z3#lC3CxCiO!TO4Pb%dF1fWRVo% z8K(~4e1nS<8uHtd-P6oQ&BhN}=~F*`94fEgmm0k#h1bl`CW=l$!W___pi<*)W0-QP zE-hpqLq3Batt%8UC!s8Gd3@}JH{aaZ(Xv6;oTufW)<6P;G4DPRSGXB&*3C%6HNEqM zb9+9)rlf9W6;8?&3vKBBTA|+!CkQOG{qPi%$jA6(%M}NzR$Uo4USLVbXD%L(|3WSC z2L+I)>F?(xZWWgpo>7P8N063u2*pGguMS8(eQ-tG#CAR7kwujxvEX@#VD)soIEZb% zJ2i(hexKzwMweOwO%hizKedwx8sovcrQW~xS;Y4awOldjOU{iYfSqz+`xW{m`)_KP z7H?$rcFnyyRB0%=l~w)t`zkUlHd)$^v3`2pZiJtMX4Ka9Sy(BeB+r$U3U=aJyyKPTAXkqic|K8=jz20IKqu6${ zxp(gmKvk%&@_K8Iu!Bj`#bZfHzb5atw6rkiNt&lW2a(>nD14sH+uvB5P23{$S9DC@ z@U)Y3eE;F1k5A^2P=-=ZllnsvGWDkGz2Hpr3VUTD#>QRQ~vw7F&!oDGI3SsE5{^KDtt8|DV?hG$WpYrj z{tk+mjE`}9YR+88qW0h9C_!;8z z1<)iHM!!7w1cfi`^0bigfj;z5o_6oAyaaXVyrLg21)1pr;pMl>vQP&=t?3S zp{jY|zo?6Z*I7Mph+nedK}bD!D3*1Fb{rWu6Drf(Z{7fYtS+`TJxE@3(USRf0`KQF ztwN{sH0W+;zcB(6DK@7!95qONwsLfY-af2-o0j_rNdA8iKMF#}l}K^1@r3$irA6fS zru@?=1dKhZuWu#K|^}4yaw4So1#8(qG#LTNL_^g`<8vzuPcU%!_A$ zD8}WQi45&0j zQFYX|GGQYaFV}^<`+T2^N#&C}Cvy+`;qvercUJE5+;+3d{NTxEO=uRJM<^9wGnt(PCKUmg6D zr6$ffNBsK=iq8}!-*eMnh{Mhn8UG?(rekRbGsQ~!CL0xl+eS1Ra?%$4vptrXdRH(& zVMF@TErG3x**WUN-(w9D<#=8K&EX9@MQsnv(Ka`(vZD!I5mVLUMdubL**z?m09$9G zj1OUbCO-=kYz#)fm+A!F)~HgK;vF?+X7HBjkUz+kTJRS;a&$39fFyrnt=_{Yw6i-v zez)N5rgO?AvFK?@-KBKO>3>)D+g*!!6_OLE4#z45tb9XDCF=;6p9KvkOuDyoBm6|Z z1b^|T3As>`>t-0MJ6}P`?~rxoYCY*9QwtIS*BI1>ww# zLpr`FSULm_9mU`Tv{{Gv^${O@mFf0J2 zaAbKRAp{EG*zb%e;2*3= zpeMAPr_xAMRK%Ii{txG~aBBL8^O5BL{n>tqnes14jf9*!oY^SST68~k=+7Ss35n_| zsz>VYIRD^71c;ZNG>nQTj@iGe5dT-8b(Ww{EgQCkuLb)rt%Blc6bxdMVj!|9vuetx z+d)lGj>$D%OuuOGG={Ge!#_AL3cs!a%KC)(F4q>roEsUTvL zf;mi18yR$Pm}sl_|e#49XA1@TX=yKKt8EY5V7{;zy3TzUZ^ zx5=}d8p9G3KbFDrQPe}{wM9e^Z^>mQXX7D=OYd0}PxO2VuT-2mFb zO4nq?mjxh;kk{+s+T6~?Mb@Pu?Q;uRx3)xW{#^#2Z(X(J4Z*>;`OM?TYjEsOq43MA zJ`hA()63V!8?vNiyBn_%Xe6@M>PAOa`&2w5y-5nH{T{uT*L##xPGwOYo*_=kPcRNZQeBUYhd+J(V^Z}x`o1WY<+$^~B_>T#dUI3- z1~=LA9F}wLl#~@dpN5-}eho`*zI&;ENjp_4zV<^0tY%MLLV9{~LYlRj_>-ATrYw5l5sFWa^|12zcL$HLT9<#uzb z4!dxkL37{x*&3}h9s?{AtOr>x9A7G1`;1=6hz8K zN*z0Mc)NO+@umKXsAPN$jg5iOi+XbIuCIjaR(XBlY%w$kt5Z(y9~l$l#b2+Oe-ZL{ ztap8{88)&$Zn;_S%h87e7UnC+Q?p5=3Ml%G=SU(}*vucu>!Sx6Z|4i*1{nn1OqUZV zDGXh#h(PT^l?R?|C>Sf+omU}w>L<3p&N?eu?c(o<2vKnx@LH`^h?ac!s_)1tsHrAZ z|L6{Y)Oi-_3mW_?3v8zy4tPiaKjzz|ODGu&vrDjMf(%>*O7Lg1K(LdC0hcKrsSH#Q z=|ufiT8HyM+w-W^jSB1`g{-$K{Ln|^=nm~E{%?Gb(Rp_ET84Cg3pO|r)NBYm?2-50 z6)sj$h333zkKBU>f^+HV505NLD+_WAcX$n!x4tr1(=16&&W8>G{66;~=IMvHC6~(A zC(8^d;-3}Up9=CfxIAubKnA^4d~r)v|JLk&q2eD;xpZD{Tp$n?PgOLzEJ89aa)to2 zQyoW5W62HP%%=_pA@Xlp*A`iq%QW<7lQCmD?R`Ahrt3s~uhU2nR)Cp5J=?4eUKkxSa)_Ba^o8J@wQrw5y! zR^?aNwyicJX~oj%+Ae0Fpn^Hh=*u#A%Ez5r=UchmfiC-$UB_=p9H?~#0RS0$i-P%!J>Rf?CVpZ6Rv}>8Tc>up4Y9wVCEm zR;$}Re@)yHCmV8Hqp#C>7YfoQk{`+eK|Xj*nN(x#pK~*GDIq~HuR8gR|I}4}k;XSs z%lJnGh9Jm))$_dR+`3s!4oYU2$WbBgr#2YD^|-w z`U_%H<({gWJJTh7tc0b}-XV+R`|LARmK#iszqC^4t*z{N7A|4iXvFM3p3O}>IA)&V z+m1t;&F-13p0-ZmKxX@rBUH-olb%%=7}C7c zTVq-OteF!Y?qy~Zq0)o`q6${7?K|b;10;a>ONmNlMt#{8+0AiFI^#*>ispn?B(zx- z`C-jTOzihmt_C%q)geK}F>79&t(sonfj6IV0ZlXbv%6L;m+5r36f^>E2M0w(8ZVDt zqXNlKf=#lgD$}0+J~TO|jSH$bNH4hqJ+BsY!c}RLt4Le#h8vY$ZDahz{GILByy_IN zhT_jakHFm;>Bpsp+j?s#DgYWF;uRj~?e~^}$0U6-)VvTfb*owHyV=DjHZzAS2~%WN zvcu#-cim~>QOkaPQHy_dN;oINR!Vj(VOQbqihlH?WU+zpv>*&Z7$oJvMn5N(P@T*e zpB@*7+y(m$FB!M{+5aKgau|K3K>;-EvgwTLMu9o9`hLX94+!UDoR) zUKqq&Zvb@oS4#qtIylR6P~n}z`SQ&#$9)4Vfk-V;>8zp-L_KflkE|~L;(`AFPLs!! zvi@;4Obt2=v8wxC4Mo;ZDT%E5g^!mt{_7W3Dj!1WR2N;xqpi)n$ctvL)s>$Fc(hFR z&i5^1A2CGNnz$D#k0PfJ6&i6aFTn5rYo^65S4eEVRZ zXD&f&?Y&4M|35|am~RM1@+rX1EVs0U-E2a)t%P~K5Yi=& zdF1nBf->}^>U4AG*(3gle^FgkCKbm-xAQ`Jp_&?xZYcvrvCMo-<>SukVp4bQ;E5C~=(5uKWSY~m;v}$quEVwlD>lLJKY=kjX#>bm8 zfKmP}bh(}Vh6Z|2eE1u$9N2VuuCiwt=SkIqrAW8ho(hrw;$GaRPM)wqM@Z~6S4!Feu7o!W}n6SPunYR2N|oM1_$( zhF47$^IT}YhTE>Z5bojEo}3|aL7>NM?;S6r+Y;W3u^C~1h9M)RVc+j>=8+0yvE_Uy zm|gifyj+x6RQQ9coiJ8RgGX=4a(^f{(Ppj1<+iJNU0bqsxz7HUA>r=Dau}S-=FJA- z_$DHrj;PdXrfM@A_q$?8JM-mse`s{iR{L(%_t=MK|0aofiqlD^Q(zeFVYSH_(w!ag zvN}!%)Kzq#g|ygT4lPS7UOU5j3YxoS@^;AX59vY@@msvEZX-UscGpU5utqO4kFWhs zSh-p}xjTfw=Qj%Ld)6p@MtWbMN3FBExuV}ce0g`$EyOQ+yF3+n%1t5tx@Ui&Q{1@w zqSa@BA)-m!%V>lEiTW}03M)G^;_-NKo|qT_IpHZ;>*3g=1jBipcWvE#_334x~7 zLNd$AvvS4ZF_Ht>^D&skiaW9C+P-|+BH~4(Jvr=7=CGapJ@e?%o$jJzRVkb`huL%7 zmG4Q3Ih23hlX-o|Ogy>&QVU?k66 zygTp~KQ||8#r0|k=^uDIIIHS>w)+g0Z*?1CwI0))?DN-lRwB5gCW3BL_3t?R$9%so=U%1AD_UOe zV29yWB^N<_(I9%?qzx=oEBvv{a5d*Gmkh6G%vY^cNUZTqm5eg4r6^;o6TC!!p6qTx7saV%Ckwi z-Wb`6*b>@XvOT+_!2<_J`Gn=z?U>l3xyqjDp(~3&3(Y=)#UBtE9;^4rWrxpnk~K<) zUVQ)VIWS(UKdwbTnuj=Y6ip<-i6}_EhT?uR(Mddsk3Ro;ISmmc&X$-rout2L=Zg^Y)bM@ zAazXmsNS)}65(%+lB9tVje32)WW|WRjNl3ypXt%Sl^| zdSs-f{UqD1GS4!Ve>J_SyT%LtbgsIe!6oK#;9CocFtKmqCWHb+KVeBB_HEiNVgl!{ zcMKk^eZ!wwB*??X1^u8!yD>o`!=Er2qu#^MB*L#0nWeBEajrjU231V!#?v#{X7rCc zun*E-Lj$37@+v!+WeE8c>&m<8QIbYV!$r-jB7eR1M(8{aFJz{X6CbW3ZarGgGFMRK5*Hr+IQp9cWaPm81QISBHY;({(#9T@_EAHvoqhQvlQ!o0V} zHz#%VslvU-mZM4O7*GH_xW*$75$b55iEBoAmW|E%05ZN2MH@AniC0yp1>s~(@d%_T za8C0W<-Mjrr$WlBbbZ>{**yMcWkWN;#ALHzIPx7kS$;D|bo6^ru4C+bhuB=XTZLRd z#fzobgtVyCv?!N6iLM{f<*6LFI3F*r=|*`HR^KH~27Tr0R_2Kjrj0(ydyQHE=eNkB zb2Qk)zjwrQ*!)GCX>SBZq1bH*4RsMMQI~b6^0~phaU?(sIH^fDg(vG1&hP*C_*);2 zRJw)Ll=P18GEbSB?;~)YhErfl@GXhx1?4Zh%xb|={TV$#(?;dVMTGhk3Qe)O?X?rh zZeI6tnQ`h|e}ghhYcX%bwkL=*7WDh|6wNjhsna#?%9+i%+`_uCPqGoRFB=y&?d05K zbQ5{nch_}s{%i1xzH`Nua!*WK!9WoXDj_>WS8}Dtx|J|OV^Z18d*F0l5!F!0+)L0$ zQt@jxZ6~cDRNr<1Wv^){l$nr{A*%?K5lC}?)>x@1xX{wPTh7DNaJVT-`1eU}J1X`1 zWHJ#SBJ4wf1xE;DWyLA}jl}BnTAS#|fG4&s-=Ca&+=mv6kBDbBXDQ4{74Pcm>sN;5 zLK|eE0CAA+g6pj+mfh_2jf%q*M@ryvn%32ao9yt@Y@*_qWi;j2*M+3x)+nU8n(3KQ7DK1XA;2dAT z%{zxcOGa(AWwZ=0*{U=fub|n^&%i+T+152Fc<-{4s}j`ib!FkLg&MQpdgp~A1ZAgH z=9BPrD-rdQ|M)DWRr=!|(%xE~N9>km`Q**Ht<;-~N=OsOeA^8!%*pZooPhMV|)_A)73p%Wl4Msn#dPox3Pb~xwdI=UcG2FC*zwC=> zpC2Zy5Ovo6JKBwu1>LVHAwcXfRSw0pW1`c>0P=}q9c-VH+wtJU4qQA^z z-#5J#m(@)1hi*h@y$mW%S(9{ex6n%b+Z1%?8Ar9@GaveXUgkUtoqG#A?MG_n~2kbT1F zQiL4cwX-*Q_Y)`E51E2?8_6&vH<@0qC7v~rA%W_gD`xgXuZAWJI*SC(0zmSYp_fg?%v&)I zu{4d7+w`(V|3KJqR~POT?|nX{{@W7Lvno-9Y>;%ouKBmT?>>SKvgKc=nLcK*)YmgF zKeII5Mzef}{{>yXdQ=I;x>PtrO)PEV!Rp7~fKa%Rx25(P>%#x_iIVef>271FV#^j@ zmLeR}4}<;sW3Cc9GeKTQ~C#rP6^GmD`q5>tDfw2x@GsVldj^10R5VCgFdZ1J|b4V zf^?wIpqdK!G=%*DMC-s%MzdA5*;3x*(LDCxjQ7&&aJGNx*^!8)-Q3dE{G)N;Z#X3S zFY_$DwAZtQK3Tn2&LGM|tFU0ro8KqxYCSh6OKDx>&8tMl7nVpuebG2b_Ww%dP#~v( z`9~^LYK#=`4_uW5KMR< z9NV64N37mNz&KyhP*)GB4~pNOh)VQAOr_OXK?EELQonDxX{q+c+kuj& zB)oztu%b1jwm&A!@HlDkJp%yqIi3upMvY2FY_&z_)M#0ffGGsCKH3>k^Xjwm#`mmDTW_B9i#E9=f&0OK21%E ztA)Yqdg#t#yDhNZ{>?j*>((B3+}c;TvJ{Va$$TWJ}c(C}?8 zm5<{W;fIPU3%6SQ1Q53{fmVmc)_ND(ZWpc)QOc(s%or?Lt$ECL{c!OqPFKj(gkn=f z`{52*G-;a{;6knEx+a5Rb5gHXR=7NGwf7TsH~Ula8Ajy21_Ci)L+ND|{>eyEiChc< zxw}COWkP6x@v3J@PhA!A^88ooJAowir28_j=%_dl5>?W>XATHT5KP>2-B-Fx+#wlo*%RyuOa2v=E*|z`)fVIV(HJy z(Tow9=XUb)(iemkRU%7H`vp83@3HWku6P;Wjf}hzM1;kU_*MGLHpj&Ckr(_nvsaa^ zs=D%I*Px$fP8%$i=090oKi@$__&}RdYJK{3JrZpBux`luYU37M<-q~*zM@T+GcO#V zuE|qd*Woy?Ptnj&Ssx`<@Au$xMvPW*BU0w())i5D5CXcd!$-2%E_gIKe2l~PDOH+H z{iWXLXar&jlkF8RBS6$;cG2m*2pxU2#BU4=51nL>bJZT8E}Tcofk0Rr@c*)U|FkVyCSjYT zW`p&V9UaR0BC@iuu&Ai0+&Z$rVRdki7Oh>nLHaFOXbgmbrEldqnkMk2FO^)pxGDp` zBAlxk-Yk?qo{*&w*FUbD-vy8EtHc#%J_bkK{ebTa-~ZP2C;d2Gu9_2B^e*f9Vmb}| z9{{N<)0T}a<3EN}Ef_dtqV`QSr8sYZfwP88_6rBdJpE%QKsU;b_6@UH1?lfXMEB)1 z2Xl(~8F_JmsJOU~EO8K=^zYXApE5+&7iC313#z=P%aGeYOty-B_d9>AxhtloDp{gX zG8h~M=Vx^uJ~X`yWtJxoJRWhJyA*AV7F%h87Cz0-vBs25Fp9*1{*D1wHPLXYwV+>5ImK{y(^Y-(Q{SUpZ#6UMC%GwY8$!RMgzu zyWXPa(Zm{!%P>5Jmgc6$#-;`8%k}42YaMi|YZsx6k&=>c(Jo$P$i-6`!|}?Qu|qm~ z%lTck=|US7hMx<~36iC#4rfOvT0ho){IPP3@U>-~!Q*#RweXtW2!pj!&pN)5^v)U| z8giSh8DwrUOQJS%m^sZm-JI25DnE^bX4UtZH{eu8%_tGO(@7 z#&Rvv5C5@8S+;t}ZQ2Vez1$Og1S~RDnwpsv-SZDS3S8}Cc>IN@lz;|MXj`k!O#NP5fj}^|5~xLc;~Vbs1L1pON_7+hz+` z)q7O)bqsNNJx)CHLs|*6-f2wk`X}YR9ONK)+O%j1W`f0bth1P$=5zdch^#XP`^)39 zI$u?nqDELaXJJ59=~x`Ip}X0E@#$FguQ!Z!29m$2NeRjz-e~uCe2I5GXS5CXw7-gC zzyQIY=0ih56e-qG(%sI55NHJ{%OT|*;Z%* z>osq6>hyT(4n}nuv|Z->uRkYsHnd!hpO3~=ct8HScYbzzk|KYNWIy24e${IN&{{Wj z4LB}?p;Hx#shS*{*cValxWqIhl)CN?;vv7huEda=CV~N!I}dGw>o!hbb*jpKMZM6! z{PHS0zN-4I+x0Gq=)^(}_ty8-j) zWi2@)?C;2Ll$7`9Ql&!oYU&Ic*hCmO7DNQ53I(Df+V3KkU7|Bi(8-epR&grkTKk-N zPf)Vb$}}NKSdY|6W*~hLF?%)?N*D(BmksV%)?wM@W)t=6zrY->qFVR3E3=?`jev0P zt3fpFG{qS#jmgwSv$l;h-KkOwJ0v1_ zo!>Z%$KUA9{@})!?6Hay!GtFVIGWl@`my%S*j7mvDA`e{i4E1o;r|wrh8-CCE<2Ip zi-t-}1$A@NRq*y%@495D#O4e1bhj_{&PclE{|*fZ5BDR5Y%*HH8+yg9&J=9FZ`5z! zW3OpP`6?!gj;^THw%4-x{w^%JPVy8^JayC>aEpsDtZEYnj6D7GDCBk1G3KVTa zXTUPPmDtIJZ@vKQxio__@JtrgdiI^^NmXZhIJ;mIXSlPZh}4(yWu_!fFDprL`7c4l(-M|Pp=aUNkU z<&LGKi9}RgoWuOoT0~1i z`5KPxGJa;W6P%Sr0S3~Gy54-cCEGJ{jMu-0(Kz*_ym*#s-(>6ws%EVz#bub&Z} z02bOy+c(vB*Q$)SB&4Rm!%R^h<%J;@3FpXaV$|N($A535Xo@5lF$DiL>rU-Oo;9`lqM;`EUzI zNF<}*eA>%Jt3|QoY?B*g;kB(OS$`5FB#rgE53s1@=gs73UVq1i+pBw^z@$4LMV>Ob z=(JCkN9&KD2r74O4_(s^W~xWl(C`+C3hN2{yK`3suU`4Eg0kgqU7j>p>-v33ThwHl zEU+sq{LANJ5q76API_4q03ypS9>zEE&LGVV6uYxkLG3bw+SRDvkeYF5H7uCP-SK)C z*lcoMvc=ujUO-0Khf?#5wk!Ar0cL3U?}@p?2LS~InE+w-lz{8RiHYS4LFP?LlgqO{ z16HamHzNVLQnNDBiOMSOqobyb2Z`t}Yt8>2=rj0W03(V*I;ap?iD6kN zsND4Qyx;ctuFlR2iyy07liB^CWEwWs*6BQ0QH7?q1UJS{h&H&+s;mIu_ib`wJQM@( zR7q-NSU4>ay4Fa*4u=@Uc~HfeVfU({JVh@P9|rJ8{<@Us0mN0;px)P+m)-}zIZiu z|GEOP9Blss;Q{fyXmrnB(GiRA4xo2zN@04^O4^zm{FgE8@k zXhfZwEl<)W$C%c=W+xA(W(0zz`9<=CJVDsr^jkU34vw<4sIR83c6KZ?y?1N)0YANt z80qLLO6&a^*rukY*s&ITZ|;GLfRzhMjvmB_@!#fKuW z7+0HZV`%W4%~zIo={?V4iN5Cx7GD=yLjFronR9p^8glA^z$T!g2vW7-NK1#7X0slc zZ)G&WN-*$?bK>-4CcD^v^(&C z7WkUwT{|fgwjf{d&v_A@8VM!UoL)$$>Se0P0fj_V-~^tEXuftS4b3 z{zswaX(ZhQib1b!yJc*^ARQd5(!D78h;t_X3m|l4XI}RffQq`$PmTm&PkRscawD}> zrMKl@1$J9kygaQ`>IiE_F^a7X2sl)N@!jK5NkQZgX_h z%EyG5B1egV9+#6_^9Oa@bhBynh;M0vm-%g$E2Om;=}7){>vYEK##B~~U=ML4Q;U6y z0WDAN1p8Z>MKYK6nCUZz6S0B?7Rz zx(YF4?i!2?A>36$(#@MHL|pRn8HL9QiHQG=^P5yWh|&3M#10Pp+Uiwe(jO|Ch#+gZ-wGHa z_HO;#Wi>LN>Zx-7=YH~*DB=7)9nl8Klh3PpCTZyC*3r=s0RaJwn3%X{X{njz2Z2~E zHwY&bvB4eT{4K3Y@a4-F$QRIUoviWU|M#4e_k~OXWX5gp&!f^9ki%5#_2!D$ouZ?o z11WH~hrJb=JwKr!Al^cYhp&oEud@ID_G1@7A zZCp0GW;!9x8;iffVr>D3#r%i8x5Nc378sC* z=W;TU`51)ogt}mcp)ddY_d7f@Orc1k?Fz$ASp3L8~|Up!pSR=sy?Ax4MM5?&Fu(ARtV9}64V ztn_t_!tTtDrUb%iEfNPn+R{u%*@~X$tO>bPe8Kh@b`s?%*rc;aMIz`NonJ_|xC=wJ z^KoeSO4&h1ba!_BHx`yU5|eF)2V`1nH5FQU@XDD1N7(HhU1i0cnk9#kGzI$-RG|j1aJd-gb zogSUKasU+4_5=QwGqN7KNG_L~%q>MbO3^-jGcKHZIR$Ctr#Mr)soex-{i=`AAtRx%yu zo<92a$MYY@Y>q?$Y$A6I<5iUpMoFI`N_t&j9+p1#qppWO*`!E)L!+SE~Hv;xG>S22vb;7_bI>|3|%&5NgfwS_Ai*?97Zc{NDKJ8G}`fMVt%4DIiS zn}T*PouPlH>50J*a3hJMz&9Etv~YDMXDb~Gqg^UXh&|i;!c04fRX6wb;a5P$HAki-Fo5XLWMLrB$}tV=3A|~(;qa^pHx^ZD*@|qp z1|5|ggvHO_hF}^3-10i?QzS=2&&3O`aASEcudZjag)&&x6iB}vl9Am>ps*Bh*mF|M zT&ML!k~hXkLZ8UcI>axcs*a7NG5NN5y+w%_rwQMOr?&7?X{fd7+#5}Ej`mqgO`9Xa z?i}YjAb%mGjOdrLkv;vZ8~yP1bbBP^u-Pay7k~jwPD0A@iV&_YPIgXM4bH>0aUg(! zp}q|69+SR<@i$9H>3>A;S4%e6Q&vO*{HEoSrWvL8tSg!oR8{hCJF9echQI=Hh4$G{|pz*BsrbG(zm9)v=-akCrCxjMblku z;(j8EkI5E=+lQc>5f-EjlL_diUT!RYmk1KeuT_oO5VwV+{&u$Z?D5HX`O{JsH?Vlk zV}E8~T9cg>E=!OoRTi`o8X41K&C#u%cCS2i8(;l)7zg5RZ=PzMa0 za%Q~}%k}hVLzmTN$Zusx>DAM|PNZ5dg7b5$RyR|v@ELtvoeNpHRF%edR}v&;BLO+% zNV%^pw%XeF48!U=ZP_cPel7=(0Y(B|8+m$_c0F8L@a{6RdD)P~Co%eL<9br+k$5FL zimGJZwZE5s?XNRyiOy~qgEBs$*{psRqrsgj8)Niwz8*5PZ;gG%EU>ag=w~gr8P70W z7(1?+W$C`U)*L>Gt?`=2x{p$5opJ%z8?egM6B#hk(a1!f+@rHl67p1Mk;|NuU1Mb@ zhkGgV%d-|oaaOJ15(k~$|Gq7_3|{L_P0aod`K-v;V9g_Dva3bQC(-xnP#e}?%6yVh z2$J=#u^5VHcElIVz%K{@o99VWrEu$-Z{9+j@SVJNb}`wnEsS`1K;iRfTMvRU@loAQ zm{=^Af7_eb_w8sh>^&!Otk}GGlwarhh&l5ZkLJIbpFKz;`;`M$Jw`7 zS!1T~EWm!;>=u6+NkRM3w9a3hpmo0~m*)y~#Lxohbu)Zy{EqB)w)=c@&%0=+`Z0%* z=wHT^xjC+m#9jz6%{%>@owg7sO5?q%XgF(WMXPj=U;kdk@D)(8+PHe8=x1*+nJQ;p zL#o;|w)c?IV0Z{>oR90={k??pT+~gMW+R5>oXBhsfPn=$k!Zc7%dL6g|R9X*}JBEX#W0r^$2|=d4`K)#OU;lxfrN zhq|kEjE%!p!!l4-27r8f{4dQ4F06)n4F#YlN!#=O@>2Oa6UT|pU6Je;WPlf~=*xyo zZrSEq#t-a9Z$ZX;91Yu{M?71-mBHZLp9V(CGp&-!Rxn@y_EJHnwzk#S5rx{0R_43J zV^a~(;L3qP6(wj-ZIYKDv7un5q5Dh)}D)bwa5E62z9{0|Go+U4UWoDd}m(dFqdCK zr;kP70IOLR!mB=~d}Y7V*^?0)20t2FLS4Rs>LQzTR%TbM0nf|7x1C_Mb}M_?HCGN$ z-V2$+r;vnS;uNE8$&Ve%4atnANXB?PE_O{tehCTUL*vx0-;D~V3Oed?V_Rwzh4w6( z@OUaF@AHqoLrpuI4(M}Zm2J98a0ceg{Uhm)1t?^Nxt*M=lH9-kk)rlMwc}m;xqG-0 z=wuJrDZaR|78s>_RCIY3O?ihB3*xIf#U%%C+AMTN@sD4AGomBFvuw`LUS#@tazQT$78Zh2-WYW z4aY*b{E3aQ>`S9X50*ZD2pf-6LaBL|^y_rz${b4RxDWFs%j@%hJvY*cZO!Q2N=nLxSNyrha;!GbkIxf? zZsg%zbfXcC$8>VKDwT*EZ6)Q2QK!jY4(m=;)myc0jRxA_K#Zv-n*@vpcVy_@InC&f>s=5*c7tJq;rFxvj@!J}ET5rnz9i8Wy zMxKJXMPsidQJrt)JDBeGN`86LrtENY_EWC5FK+an(8fW4VF!Z&!8=?dCikVs34Z17 zlUsbNWj78e#-+DR>0>zvRJ!_`uw0%l8;r$_va1d5iR>Z@NV~hl%qZ42<&?rRjSY(N z{65cGT$}Z$!BV9Co6skR>XeCETSoB1;~}htDk z|8%v-W3#fSgpCH7<%{3UVayqG=Ow{fqv;t$3Mh1Kv#mZyw-G!!6&lE?)@Ow&+wpTx z5b@n;z3wZaK`ZbrXSOeopL0)?0ZMI zK!1#Wh=qz_Or}VGZiBN%CNLr^(Nv@nNEOI}cp>;c*D9?I9 zqy8;Su<3LgYC&N9#eBYkV`Mk$YjOSg`D6*g(=OarS0p*l)$`U51$KDoEU|;%){XL% zYD$$E1V4DQ_@Yxh2;)g;j^$KCHl~mO5|JRk&)Zh3_v7JGLWXEwAT9utcr$8b_kl*Mal7Pi-lji?t#Q zx!5Gdf~E3e0@{m}gQbGfG)$FvjI1B<(qnx128Xg-c7V&d9|~ESnaHTsfuKq@Li*a| z`+auzqvK+sNq48S-C8bIhM@!};^Kf1Bv7ZI!BJU@eQ62I6l+w3F{Rb?YTy8Dr>}!% zKbmWaUC;HMb!>lF$yr(&9dL=yYf&XUWE&fnz5i5byzKhJmp= zaD2dT$V548*9Z*8$@KXkR)zLf7sHyeXnw^vb|x|*BBlSS3$gMzU<6(GS)#$?3P&uA zYy_!H$r6_ltHHFo_}8(O*UTp0)1*Y9U^S-g)!D^~_?Ir@B`_eB-?J>k+%$m`DgBkc zTTN|_e3s~Z&1Kc>Z(eWFC$(H17YP@W{L020;)dlD*v=4H%0wHF`&P!g4?jl>f?hMN z-FlyCAfvR~p#beFl70RCvfEMoP{%=t8N8kz#2Dm5;1U8p#Zdq_dSe`!Mw% zId5r#`a(IA&RXZ6$u93^BC}_B^M(6I&FZCd-Uc?svBfi{nW6rvmcw{P9aow(uGMmo z#c1tPo7gwkc*5s?YYR>{et85!Xy~*R?;dxI%P+CeoG6@a@XX-UU=79^HBQ+~$8nQ< zqt};f_nC-5Ik+}_u2%b_lZmk0Ue>ebNtu(%jTbCdzxX=B`V~@u++3_?0og=mn;m7E zy=)%8yiw2F3@57+B8DobQtX{Bc#u}E?RLmHE5qAmuoJR8Z7&MgrM_d(#*7v>S01Y` z&ctg>GYTwNOx0#u_*P}F*m~whPN~f`S=ttbg8@Z)woBTnM&Wx(Jk{wMT35+WbZU2lnx!Ul!Pa<>+o(z40~2qx6<}U(w9w5Iz)IKaa-pfwp+Rd|;=9Ql z{p)0gw&{j7WSV9ll`ziU2z>~Chx*|w?Xs-Fvix#GT=Ug-Awfh8CYn=LQCDC)GZuIc z{b{EeI%PDmAf>P~7K09P_t&-7rNge+uV&#OM>!a9NuWB5JvS0A|NJw5{B{!2(P*8wE z!%eRkbz1&ni(T`2KHr$Cn1NX+DTc)d5|0Rel7orz5k7AVdmDR~XZsc1Z-bTQ3V(^6 zD^3uFdsBL%^!b||<6*g?9rAW;sWT1(5io@7Nuw#W-u=k)BSO0_U*E3C{BmJnCdN3r zKdFCsN(DU{;P!y3&fuF^EMCrQQ-5ye|{)~gn zzfw;t`}o-TDSLayZ9bK2L#7$?v57^Q)cN@+$>cilQn}a0!|kcCQtt!pW44vXm6msK z&#ean(&_Pod;5a?X*B}EU^4jO78h$wVE#SJWmXRL9`(ml7}y|~O@l5$Kn}s<{w~9T z4tPU8UHA`9j06-bWGBC#grblIBN6F&x?ewZN!t~&m6JbB4sQ$_XW&;bMWPbClkn#Y zfCtlLDPch5(t12@(BQOKe~!6W=H20AsNe!cZkvmi%Zq_23XgvWv-8rkA0h<$p_ueKCf_Em%PBGj_;_&&G0qWrKc+FiT6 z=l{>#DDLcYu60D8n$@ylSjL?b+jF}pA|<6I!((%%$(AuWIW9|>Iniv98%FFPIC9A% zXm)JD&`!n79;2clWtLK_(U~C>L585d{Qx0oS6iIU3|&|pc$kdAQV9mrgv;GTE?2=D z?YVMzsZ3zv(GYTzMN?ZEqf@~NR6Bo3++HyOAql7=g^9(ov@LfSlUah)UMEXNYW0 z;*F>NOReLa;=<_XqAeG4IiNl1t?cdwYC zD2jG`3hlYm=4+QkhBOG9!`fWR_;7I{-}rS=nxY7%ExawiQD2!#KMYaI(8mRDm60k z`}Gm@-M>2sHMM^?0gYBWgK*{>xS$^*5p7QqU~|=ovx5sG??cUQ(=G`ILWT_*m6-3w z(vn_BJ_3(Ddm$D2#oBj|q%!*aZC%8q@feLhFrM#g|3Xs<0atO$V^s_2DpmEE5@T_- zvYU(X&TJ9sT2VT~|H(3h=e{wQcESDKXxloLBcOo)9spfwD z{ovU#>968yAk@EY;gt|n(*tFdIc2nj{~T3R{Nv(&4_mF9RY=9Fs}4v@8x0Sqbfco0 z2L&Z%%Oobjt#82bIDIqU(yORK1Y*-*($cm#us{`NXgqK0v5+8yPm6B~t{1uv3Ec^t zBU$=d1_t^XrruxoJ2r_tFEQr^iBIOw+No=tsN*6yGmWP~qaWNew=By>_XOsdahO>W;p9V&#z&u^EqMNn6+@p$7{dNx| z9kDPm7w0vFko|10;bu_p&Y%Dx#-W0uYL@=cgVwpAI+Qnui{4(aHs}0CoAR)| zsFxp7QLA5R2uC=n&|%XiJN}T)B5&;{i{{@A)iw|~cs!&>i{!(?9m$tep1YB1(slihcXW1&DY;MkZ zzxQ@js?F()tHtUE)i=|m7B(L0)CAI>vg)$^-%)yi*r#E+|C48UzDuPV!xfy;X`whJ zNTUJYVlg8#^A8UkNO}VH{#Fq*SZRDz|A4>R>i@%Oih&dw5!k>cDIdJQKQsmef>BZ$ z{DeeA+};Kr9t@1Zot(5JkPCwPA-)JNeA=$JT+0!%!*w}6EQd0`uP3E3Ku%A6uL_&W z;Qs_!j4(h4{|3GmFP(?5944|nqPjmC{pagxED?J4^z`H;I~yB>pPwI~ufH`G)1{^) z8k;>gSFA82cLqr;H8TF6ZpgjAagu>c%Lo%cy`jR6Z-t8X7yuDp=`fkn4s6HttU1iB z0;?E~PrN_Mix&4;4OHn-OWcT~z#1(YnDp)QO6=*OqUMXhfM5KLOM2&|L;lan7GXLJq6JL6RTQ>J z{647YjPA2-yUWG;#s-F14D1if6ZV$qJL9X&X1tcX7g%Km20hI48j}r0G<->6>HSyI zA{xA#EnPu-fkm&eBKv{fG|vbqTdnQNU@++KE)!he2s%y0sZNX2NvPUu%K5)ZlV@nx zuuPbqr1uUvsAQe@4UHs5M5OS~)C#+WW0Dv@`Zj2$ec42;j8pzp{>!vf;u1svtuNp$1Alfr(`K9~M)9Z&I zyDak4u0_$538x4Gf=>QVNerSu%PkSjq6((=*zIr9nuEiB()$TwD}9Sogu2$$K;~Ut zmVC=Ki(_)g!QNzX|4M%h1HPFQIPtB+7Y-eiSx|d32I+z{{z86xCD%Bh;XRY&av&5? zY};|MC&!YfWo79(!w4fc1}32#Qr2C20VDEKFrCiBo8!X`*^B@rfB~*z;n(H~E{r=`nd#U)Ts60tt}o$70?JlN&m6 zMcUS7$5ARZPDK(!-=L9vT?v!Ic_yWR^E57`B&5Q9<~df!xl#G|_*iZH%d<2Qpcdr4 z?oaRou(GpWiXibhrVRJ+5rg`R?3Ps#L$uQW;JWbVoH6