diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0198d133..93b57c80 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,15 +11,13 @@ on: jobs: build: runs-on: ubuntu-latest - strategy: - matrix: - java: [ '8', '11' ] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up JDK - uses: actions/setup-java@v1 + uses: actions/setup-java@v4 with: - java-version: ${{ matrix.java }} + java-version: 21 + distribution: adopt - name: print Java version run: java -version - name: Build with Gradle diff --git a/api/build.gradle b/api/build.gradle index c953a381..f043b8d7 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -1,32 +1,85 @@ description = "reactive-streams" -def jdkFlow = false -try { - Class.forName("java.util.concurrent.Flow") - jdkFlow = true -} catch (ClassNotFoundException cnfe) { - -} sourceSets { main { java { - if (jdkFlow) - srcDirs = ['src/main/java', 'src/main/java9'] - else - srcDirs = ['src/main/java'] + srcDirs = ['src/main/java'] } } + java9 { + java { + srcDirs = ['src/main/java', 'src/main/java9'] + } + } +} + +def jpmsMinimumTarget = 9 +def javaMaximumTarget = 21 +def javaTestTargets = [11, 17, javaMaximumTarget] + +configurations { + mrjarArtifact } jar { - bnd ('Bundle-Name': 'reactive-streams-jvm', + into('META-INF/versions/9') { + from(sourceSets.java9.output) { + include '**/FlowAdapters*' + include '**/module-info.class' + } + } + + bundle { + bnd('Bundle-Name': 'reactive-streams-jvm', 'Bundle-Vendor': 'Reactive Streams SIG', 'Bundle-Description': 'Reactive Streams API', 'Bundle-DocURL': 'http://reactive-streams.org', 'Bundle-Version': project.version, - 'Export-Package': 'org.reactivestreams.*', - 'Automatic-Module-Name': 'org.reactivestreams', - 'Bundle-SymbolicName': 'org.reactivestreams.reactive-streams' - ) + 'Export-Package': 'org.reactivestreams.*,!META-INF.*', + 'Multi-Release': true, + 'Bundle-SymbolicName': 'org.reactivestreams.reactive-streams', + '-fixupmessages': '^Classes found in the wrong directory: .*' + ) + } } +artifacts { mrjarArtifact jar } + +compileJava9Java { + group = "build" + description = "Compile Java 9 classes for MR JAR" + + sourceCompatibility = jpmsMinimumTarget + targetCompatibility = jpmsMinimumTarget +} + +tasks.register('validateModularJar', Exec) { + dependsOn jar + inputs.file jar.outputs.files.asPath + + executable = "jar" + args = ['--describe-module', '--file', jar.outputs.files.asPath] +} + +javaTestTargets.each { majorVersion -> + def validateModularJar = tasks.register("validateModularJarJdk$majorVersion", Exec) { + description = "Validates the modular JAR on JDK $majorVersion" + group = LifecycleBasePlugin.VERIFICATION_GROUP + + def javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(majorVersion) + } + + dependsOn jar + inputs.file jar.outputs.files.asPath + + // ugly, but it accesses the `jar` executable which is peer to the resolved `java` launcher + executable = javaLauncher.get().executablePath.asFile.parentFile.toPath().resolve("jar").toFile() + args = ['--describe-module', '--file', jar.outputs.files.asPath, "--release", "$majorVersion"] + } + tasks.named("check").configure { dependsOn(validateModularJar) } +} + +tasks.check { + finalizedBy validateModularJar +} diff --git a/api/gradle.lockfile b/api/gradle.lockfile new file mode 100644 index 00000000..802de85f --- /dev/null +++ b/api/gradle.lockfile @@ -0,0 +1,4 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +empty=annotationProcessor,baseline,compileClasspath,java9AnnotationProcessor,java9CompileClasspath,java9RuntimeClasspath,mrjarArtifact,runtimeClasspath,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath diff --git a/api/src/main/java9/module-info.java b/api/src/main/java9/module-info.java new file mode 100644 index 00000000..9cafd456 --- /dev/null +++ b/api/src/main/java9/module-info.java @@ -0,0 +1,10 @@ +/*************************************************** + * Licensed under MIT No Attribution (SPDX: MIT-0) * + ***************************************************/ + +/** + * Reactive Streams + */ +module org.reactivestreams { + exports org.reactivestreams; +} diff --git a/build.gradle b/build.gradle index 5930f1b5..50498b6f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,25 +1,38 @@ -buildscript { - repositories { - jcenter() - mavenCentral() - maven { - url "https://plugins.gradle.org/m2/" - } - } - dependencies { - classpath "biz.aQute.bnd:biz.aQute.bnd.gradle:4.3.1" - } +plugins { + alias(libs.plugins.bnd) apply false + alias(libs.plugins.testlogger) apply false } +def projectVersion = properties["releaseVersion"] ?: "1.0.4" +def sonatypeRepo = 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' +def sonatypeSnapshots = 'https://oss.sonatype.org/content/repositories/snapshots/' + +def distributionRepository = properties["distributionRepository"] ?: sonatypeRepo +def snapshotsRepository = properties["snapshotsRepository"] ?: sonatypeSnapshots + +def baselineToolchain = properties["javaBaseline"] ?: libs.versions.java.baseline.get() + subprojects { apply plugin: "java-library" - apply plugin: 'biz.aQute.bnd.builder' + apply plugin: libs.plugins.bnd.get().pluginId + apply plugin: libs.plugins.testlogger.get().pluginId group = "org.reactivestreams" - version = "1.0.4" + version = projectVersion - sourceCompatibility = 1.6 - targetCompatibility = 1.6 + dependencyLocking { + lockAllConfigurations() + } + + tasks.compileJava { + group = "build" + description = "Compile Java 1.6 classes" + sourceCompatibility = 1.6 + targetCompatibility = 1.6 + javaCompiler = javaToolchains.compilerFor { + languageVersion = JavaLanguageVersion.of(baselineToolchain) + } + } tasks.withType(JavaCompile) { configure(options) { @@ -38,11 +51,14 @@ subprojects { } } - tasks.withType(Test) { - testLogging { - exceptionFormat "full" - events "failed", "started", "standard_out", "standard_error" - } + testlogger { + theme 'mocha-parallel' + showExceptions true + showStackTraces true + showPassed true + showSkipped false + showFailed true + showStandardStreams false } repositories { @@ -53,21 +69,22 @@ subprojects { "reactive-streams-tck", "reactive-streams-tck-flow", "reactive-streams-examples"]) { - apply plugin: "maven" apply plugin: "signing" + apply plugin: "publishing" apply plugin: "maven-publish" signing { sign configurations.archives - required { gradle.taskGraph.hasTask(uploadArchives) } + required { gradle.taskGraph.hasTask("publish") } } + task sourcesJar(type: Jar) { - classifier "sources" + archiveClassifier = "sources" from sourceSets.main.allSource } task javadocJar(type: Jar) { - classifier "javadoc" + archiveClassifier = "javadoc" from javadoc } @@ -75,78 +92,70 @@ subprojects { publications { mavenJava(MavenPublication) { from components.java + + pom { + url = "https://www.reactive-streams.org/" + name = "reactive-streams" + description = "A Protocol for Asynchronous Non-Blocking Data Sequence" + inceptionYear = "2014" + + scm { + url = "git@github.com:reactive-streams/reactive-streams.git" + connection = "scm:git:git@github.com:reactive-streams/reactive-streams.git" + } + + licenses { + license { + name = "MIT-0" + url = "https://spdx.org/licenses/MIT-0.html" + distribution = "repo" + } + } + + developers { + developer { + id = "reactive-streams-sig" + name = "Reactive Streams SIG" + url = "https://www.reactive-streams.org/" + } + } + } } } repositories { mavenLocal() + + gradle.taskGraph.whenReady { taskGraph -> + if (taskGraph.hasTask("publish")) { + def userProp = "sonatypeOssUsername" + def passwordProp = "sonatypeOssPassword" + def user = project.properties[userProp] + def password = project.properties[passwordProp] + + if ((user == null || password == null) && distributionRepository == sonatypeRepo) { + throw new InvalidUserDataException( + "Cannot perform $uploadArchives.path due to missing credentials.\n" + + "Run with command line args `-P$userProp=«username» -P$passwordProp=«password»` or add these properties to $gradle.gradleUserHomeDir/gradle.properties.\n") + } + + repository(url: distributionRepository) { + authentication(userName: user, password: password) + } + if (sonatypeSnapshots != "") { + snapshotRepository(url: snapshotsRepository) { + authentication(userName: user, password: password) + } + } + } + } } } artifacts { archives sourcesJar, javadocJar } + signing { - uploadArchives { - repositories { - mavenDeployer { - gradle.taskGraph.whenReady { taskGraph -> - if (taskGraph.hasTask(uploadArchives)) { - def userProp = "sonatypeOssUsername" - def passwordProp = "sonatypeOssPassword" - def user = project.properties[userProp] - def password = project.properties[passwordProp] - - if (user == null || password == null) { - throw new InvalidUserDataException( - "Cannot perform $uploadArchives.path due to missing credentials.\n" + - "Run with command line args `-P$userProp=«username» -P$passwordProp=«password»` or add these properties to $gradle.gradleUserHomeDir/gradle.properties.\n") - } - - repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/") { - authentication(userName: user, password: password) - } - snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/") { - authentication(userName: user, password: password) - } - } - } - } - } - } - - tasks.withType(Upload) { - repositories.withType(MavenResolver) { - it.beforeDeployment { signing.signPom(it) } - it.pom.whenConfigured { pom -> - pom.project { - url "http://www.reactive-streams.org/" - name "reactive-streams" - description "A Protocol for Asynchronous Non-Blocking Data Sequence" - inceptionYear "2014" - - scm { - url "git@github.com:reactive-streams/reactive-streams.git" - connection "scm:git:git@github.com:reactive-streams/reactive-streams.git" - } - - licenses { - license { - name "MIT-0" - url "https://spdx.org/licenses/MIT-0.html" - distribution "repo" - } - } - - developers { - developer { - id "reactive-streams-sig" - name "Reactive Streams SIG" - url "http://www.reactive-streams.org/" - } - } - } - } - } } } else { uploadArchives.enabled = false diff --git a/examples/build.gradle b/examples/build.gradle index ec4ee871..5b04b5b2 100644 --- a/examples/build.gradle +++ b/examples/build.gradle @@ -5,7 +5,8 @@ dependencies { } jar { - bnd ('Bundle-Name': 'reactive-streams-jvm', + bundle { + bnd('Bundle-Name': 'reactive-streams-jvm', 'Bundle-Vendor': 'Reactive Streams SIG', 'Bundle-Description': 'Reactive Streams Examples', 'Bundle-DocURL': 'http://reactive-streams.org', @@ -13,7 +14,8 @@ jar { 'Export-Package': 'org.reactivestreams.example.*', 'Automatic-Module-Name': 'org.reactivestreams.examples', 'Bundle-SymbolicName': 'org.reactivestreams.examples' - ) + ) + } } test.useTestNG() diff --git a/examples/gradle.lockfile b/examples/gradle.lockfile new file mode 100644 index 00000000..5bd8afe0 --- /dev/null +++ b/examples/gradle.lockfile @@ -0,0 +1,20 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +aopalliance:aopalliance:1.0=testCompileClasspath,testRuntimeClasspath +com.beust:jcommander:1.78=testCompileClasspath,testRuntimeClasspath +com.google.code.findbugs:jsr305:3.0.2=testCompileClasspath,testRuntimeClasspath +com.google.errorprone:error_prone_annotations:2.1.3=testCompileClasspath,testRuntimeClasspath +com.google.guava:guava:25.1-android=testCompileClasspath,testRuntimeClasspath +com.google.inject:guice:4.2.2=testCompileClasspath,testRuntimeClasspath +com.google.j2objc:j2objc-annotations:1.1=testCompileClasspath,testRuntimeClasspath +javax.inject:javax.inject:1=testCompileClasspath,testRuntimeClasspath +junit:junit:4.12=testCompileClasspath,testRuntimeClasspath +org.apache.ant:ant-launcher:1.10.3=testCompileClasspath,testRuntimeClasspath +org.apache.ant:ant:1.10.3=testCompileClasspath,testRuntimeClasspath +org.checkerframework:checker-compat-qual:2.0.0=testCompileClasspath,testRuntimeClasspath +org.codehaus.mojo:animal-sniffer-annotations:1.14=testCompileClasspath,testRuntimeClasspath +org.hamcrest:hamcrest-core:1.3=testCompileClasspath,testRuntimeClasspath +org.testng:testng:7.3.0=testCompileClasspath,testRuntimeClasspath +org.yaml:snakeyaml:1.21=testCompileClasspath,testRuntimeClasspath +empty=annotationProcessor,baseline,compileClasspath,runtimeClasspath,testAnnotationProcessor diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..ba2e8733 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,12 @@ +[versions] +java-baseline = "11" +bnd-tools = "7.0.0" +testlogger = "4.0.0" +testng = "7.3.0" + +[plugins] +bnd = { id = "biz.aQute.bnd.builder", version.ref = "bnd-tools" } +testlogger = { id = "com.adarshr.test-logger", version.ref = "testlogger" } + +[libraries] +testng = { module = "org.testng:testng", version.ref = "testng" } diff --git a/gradle/verification-keyring.gpg b/gradle/verification-keyring.gpg new file mode 100644 index 00000000..1c6e9375 Binary files /dev/null and b/gradle/verification-keyring.gpg differ diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys new file mode 100644 index 00000000..8ebaff2e --- /dev/null +++ b/gradle/verification-keyring.keys @@ -0,0 +1,801 @@ +pub A2115AE15F6B8B72 +sub 6366592024774157 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBDsSIk4RBADSCj6rUjV64tYCGT1DYKYR7GthyWpNdGHSYLbETBcDatAe1dzQ +5NsCgfrlybfyeY+y1lxr3T9bqf6zJWDw/718wff96qmmv1qzexSYtmIrj+h53V82 +EXwWOFuYMJisuxdT940iQzosm3GOv4MJdEg3oI2SgfEyRQQ6vO4Ob5rHDwCg5taZ +nrHOrXx2dIGHxpxRZ0SUl30D/jmtttFjYOQ3LBMriikz5mh2sK3ZnoSRF4o5O0zW +Ve6e2SFXOEjVjImKsH6KCbdQNelrAdgiyOoXClyQKsQ27pncbdWo6bO0E3POJZVm +XaeW7iudHVr63rU5PViXObIQrdQl0D59j5brKj4vdlTyUw8kaHPvbKPDEOwvZq4Y +LJQ5BACA1YilTeXRJqwFsNlpcxCHwlULD4QUVP496prQWf1B7Z6g0KvLGrQsO0Vn +Jcn+fEqukysTJixSXCPebosltd4RalJIupVYkp4w6MJ7biaDAlLuNhDcI/AiXTmV +dXUedVXIaM8I3Ne23gucwbAyc0Hvb+3cSAKRhl/azFQhuHBvlrkBDQQ7EiJUEAQA +zVKWS8QrkysydbTJu2/14wIbz2Coi93aAGelwCwXSxf50JpYdY3Lkcvd0FqT8bcE +nz43MCSx8vlKubQtUpx9WMGIb4ixtShLJ4lAa6FJldhychz/dnxSNyz5N8W6sby4 +dTVxac0rloxjAOurGanhG7TMtgfDi0cEEoXRyAVoKyMAAwUD/j1pJm4Npq2mlJoE +7MK3vAhgKwYHFflmJusmqvSAtRuFdT15pbMJrA5bAK+lA3SVOOhhWTCItlphSR2q +xJCAcBTeOMqUi5ohFcCkSRNvwmDtH+80B3BehlEsEKNk8Z3moa2ch7Oxnb6XEXH5 +tGJ5Qvx9Qid6ZfBaXx7bc8yKyCb4iGUEGBECAAYFAjsSIlQAKQkQohFa4V9ri3IW +IQTOgHWiUVR77iSbwVGiEVrhX2uLcgdlR1BHAAEBDTIAoJ3NtpI/E345LVOruElF +KrnduWWXAJ9Adm9Mz4yoxrosHSkp5BWzXBUt4A== +=AtDT +-----END PGP PUBLIC KEY BLOCK----- + +pub A6ADFC93EF34893E +uid Tom Denley (scarytom) + +sub 9C4C23E6FFE405BD +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBE+xZxIBCACzKctn4ez8xOC0pGThhAwjYWGkzcwK4HNaC1usHThBFz3/t8JN +OqUXRixLyi5wELN6GHlsGVUQS3IfB4JtuhScsieSB8PTree68/knMq6JI08mJqZr +9nFrAB4eDW0UMbSL9kPmclUm/yN+qcCZBrsVn0q6CWb/Kcd8EEXEu6sGILzOGqGe +d433t5O+tGXWL2TjAz+Scsk2Hf4zcuDeQcxELAMnVaVgKuGuEZvibrjsdIvJDGI+ +0BzWIu8ZP8ldBl4SVtzGpEVzLvDUo3mOqBeTkj3rP7xLtFDN/3AFtowbLfL7L2Pg +SMcTnKK+jfFHRfbHP1Ih3rQ4ilLzhCnY/QIZABEBAAG0K1RvbSBEZW5sZXkgKHNj +YXJ5dG9tKSA8dC5kZW5sZXlAY2FudGFiLm5ldD65AQ0ET7FnEgEIAM3i3e1sjwrx +2PN8XYMPQWG+/YTtw1BYDl2+iYE+LaZvtq1hpbgeCLgEVwXrCJ4spLP1rFXogWqK +rkJ0LRjlpdKhKBvyH1ex4grh3cWN/bIDJcJ7JA4I/Bhqhlh8hYycS9pGFeS+MR3a +FIsii+vadrwYYvuVYGeWvdZhB7mJKYevj5Ms0OpYTfZd95Pzo4o//lNpDnrG7Xd3 +tgTNU/fkpw6rFB/2Ib1Qlk+Kz1z6JNsp+tOPGGCBrzwfwglcikTuqS+xyRgC9cHh +5eCol11uSoWPKcQR2Ar8Eo56nxv/UApdu15iJ7R8cA5guKeeS4jt0CGCPs2Phugg +DxI73Xvl4zsAEQEAAYkBHwQYAQIACQUCT7FnEgIbDAAKCRCmrfyT7zSJPuylB/9i +wtIQeexMWBmQNdDe0md8HLulDfcujPtklrvYHtXMJQFaGA0Vafq0oT9MhBfb1YCP +79uF0qgswSxINYCOJx4nTPIP9BOdTwqfGo7ul27REgNq4lIUW0GkMgZAUA2ft/vc +0u/I0PqnhKCi4Pq79hLIx7eiX2ySfXfYfLXRVzbMWKMoi7lWXseQqbM0RvCA54J1 +qAi6Ew+JyoYGQ7OvXdL5Eh5Tkm2cpIADyqCkp/aFDe5lqZiU1zS2fU6mpOf/o0co ++GoYkieIxxibDCmt3BioLgmyzpGUsMNwh4pAIQUGkcxd4spC0KIWdDEvq/QJEEIh +ZlI/ojefaZkRseFrtl3X +=qnqR +-----END PGP PUBLIC KEY BLOCK----- + +pub AC5EC74981F9CDA6 +sub 5D9FFE7B8E3DEA8B +sub 501B5ADEF57CE6A3 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=BVIu +-----END PGP PUBLIC KEY BLOCK----- + +pub B0F3710FA64900E7 +uid ?amonn McManus + +sub 7892707E9657EBD4 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFdbSfIBCACrFI0ai/abnV2U2Wa9QQZwGk3Fegc8laiuTKc0GoYdyptd83/H +hD5S61ppdkOugBjVTHdgda3xJ7zBZdnwjZvV/TyayQltbh6hU+BMlEolzXLgyvY7 +cAzKE+iKWbLLwfhRn1iuC7s5l1NLPsh44IUt3xDaFXNQrPO5OnRz8bqsGFVawxmu +2bPqIjkhxEiYpxwaZZbDkgBR6rbBth6A7QOadQcj/9wNdekoM9dyg+olOUmnLrtA +nMBhrvvbm2fZxTps3SZHlLV7+iSu71B5SqU/kT54/49n8vxrQiGvzp9K+t7c7EP2 +w4Ax1nYpRkCxYdHOX3YBdayUiP9ZaYH/YHtLABEBAAG0Je+/vWFtb25uIE1jTWFu +dXMgPGVhbW9ubkBtY21hbnVzLm5ldD65AQ0EV1tJ8gEIAJVavNan4WxxlwLwvnBj +3/wcEWqN+kfMHENMSjmRWOYSmC332hhGLmTDi++BPWt2OOvHUusJV8dZP5D9yUBR +FsKozIpyXyS76C5VYGMY8WZ6kyqn/mLCiwmnkOJ24kXLaaHPsQjv6i5f2KliDVhA +GUHmNMJgH8o/GL7zZ03Mb8ZlKFZobp0dn+/lxoOtQSzR+cBz8NvMBkOKD8r4PJA6 +BxCR1HVEHsq4xSnjr/UZOYvh+Kaxfnop7Rn9in5MoY2rCY+PV59Xbx4grqNpjupy +HEf1MHodJRj85JiClnLZk7dNJ/kr+zggwbsd12/GHkBt/pxuWhe0eFcAOJmvqC3c +4pUAEQEAAYkBHwQYAQoACQUCV1tJ8gIbDAAKCRCw83EPpkkA54FACACFZB2Tk96F +Qkr8+WHOz93CJs4UD88PosLaKmiXKP68arjH3y5jhNLBzqteZo0Crfw75DYWIZCh +df5uLGKCWXBEytF4uoHOy9Lv/3emoSeenluFVcNjL7CIOQDRmqw1t/LjnsLbgvlw +Hix5f7I6Txu/J0HKJbq0XpoTqCzFK6sxEPHH3gZto+XfHk85haKd73SOM4edkmJx ++jDXES1wb3K3SpYibt+uPVfLYXWxK7xAaztESTIqZ9RnYHzd/7z6DO4z//lfB7IV +AqvM8ga7Qj58ObeqZxx2iVit5WUZ4cE30crNGyXH/HKlAp+B9EvENnwr++TI1CGY +thPLFHFc831L +=obUO +-----END PGP PUBLIC KEY BLOCK----- + +pub B16698A4ADF4D638 +sub 32784D4F004B405B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFM1v9ABCADD0KoXq2ZKlUHeIVovQy3gFmW9oFAaraV48ouv8cYvqdf+s91H +NyqeyNPT/ihFeNqZJUAMyPdwN5xrWD6gxMrOCR7BFhA5kLmAKz4HfFCQ05ViyQdI +/HVNFvTdF8LNnuF+a5aNgg+jjLvFwzkyMFkuiPGuUDFnqEGxC+z9J8t40tpOTOIw +tPjSzkDN41AJDpUK/simKC5F0Im78nUbwMalE5z2IsZRWpYZyIhN1HhEdDvaDIh7 +3vENjH7enAjWh0iGRu+GTP/fayZnX0uhmausCCwMMhsr489e63ZOaJrqeC//wWrX +dtEJjcmvRmJ2hwLmgwMP4zSNKsnLGzP0sh69ABEBAAG5AQ0EUzW/0AEIAO62SMbq +gIzEFQEHlxNN5pZHd7msqDESILFYFkI1mxlkD0twFWMbk4nMH2VXhiuT3ulqKBOU +UUNQrO7egtfbGsgVv4bWbUHfeZkfvoWDlmbrvi1YLlR/ZxzGpCNc8e3aOcN3XKHl +BwfUaco6pcTBvLpKPA/TAjkTOtK4A5Azv1CSwpzSJf2bVVbrn7mi/rw78SmZAV2/ +rtiOU5a9S+3fzswLk1PO/z//d4VoCcL2s2WueVO1Q99kejkE55l3lYwEiBzVuAA9 +8Q0a5wg84vRGFZQWLIw8c20On2+dZcTLZc61ZjnsI1LSnLUUyQ/fzHQ+BynQF9l4 +3ZCPKFIl125MGikAEQEAAYkBHwQYAQIACQUCUzW/0AIbDAAKCRCxZpikrfTWOJel +B/9vDc3G/mrIHB1P/zl0Fdl5wQzaSVc9JB/ce0018ptplL711af0ZDvWqmZkJNkY +u0lHgnniaXB0l3GGUPIa/TZzVgFSRPj65FWTMkBbNnhGIwV5IVOPcSKSyDYn9/nQ +PpmWl5fDj8xiv6kKYxA4hjjRbRGuUXiI2dnyFHuFpacf/Af/Mc0U/CDDuz5a1jS4 +SYuYM/HFVL93POZzwLUR/+GDuVJFnm12rmjGnJVgR0rWcJKJt6vCsBPVfIamfl6v +G+N4TWQ9euj8Rd4hjsYPOwDfgVIUGIhpTUJ+fz046fkz9MWnX7RJh6hqLAXT7Hbc +0FTFsKYAbLJbm3Q+rU9jTdM8 +=mDDW +-----END PGP PUBLIC KEY BLOCK----- + +pub BF935C771A8474F8 +uid Nick Glorioso + +sub 5A3D35A6757384DA +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +ayGJOWGwjg== +=+sIy +-----END PGP PUBLIC KEY BLOCK----- + +pub C92C5FEC70161C62 +uid Herve Boutemy + +sub 64863FF4D1BF1809 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBEdUhrIRBADCU9cuKc92CWQlZxwtRuSIV/36Qmj264YD+Lix+r1Qe1PqRr1I +/MObOo83ulorWigSkx1k81Mnr56NwmIeo2bMhjmgRgf7EG6XEbKdRKfJcJRR1lDV +Ml4ru40W958M3PX5fsi0m0g2TuVrAKIS4vscUt4L/Cf4IT2/0OhaT6bWswCgsNws +Qq6NtCkLkpWSBNYGT4zb6yUEALlhHMnfzPSDerKjDOaYHTz3PRc/GGUDSBTSVj6W +hQIDrgTqrPxoB5JMnfUz8BLSayk0d6HiwspJ4Wnxe2/jdIT+6xhX9xBYXVHZVs4R +cr8zbBNcW2kwFg5Mqy7TiAPzakzCslKAAX+cjAKSOWyRbmkEYnNgMlctdyENOR9+ +BpP+A/9anoVEfULqoETShmgWdi94gx713qymhNBpFZnPpm4j4JuxKopl/unQmw5i +Jwtu93cg38UfaOMJjTi6tJ6F6SE8xXv43nKs3Xb+Ll1MpTgaGUXEhCOeTZl223Qe +NBUp8kvfcys6aVX6GT93dmWxtMewlc6gc7HVQnUnyCFsVeoy/7QjSGVydmUgQm91 +dGVteSA8aGJvdXRlbXlAYXBhY2hlLm9yZz65Ag0ER1SGshAIAPzs1unq2BMWlk4y +O8D5w9br9S3qtlkYRtSOWH7ilOyvdUzIpQZvC/qgphdUBIO8hepmLXcF4zogNGKB +jlRHjSRC4SRSmTqHmaG/kdwwtOblLAZe8YtzYAfDLGoLOTeKvp6mUjGWhA5eSUeG +QIWAmQcucQZp75kT1C+dAgzdiASsR1TmlJZQSGQ7XbVR9+xsGlc17oT8bC4gDnid +vVtbfEayD/U40JT4c8Luz/Rat/yXApoRfMTpnJ98Hwmf1TLXhVafGk6+GjuLqNDv +x2IrG0rVMNmAxnv0Zl4jTg/AlxxToNP3OLXrbUYbZ5fDjt4UOLK2OXspgRuLZ1dN +pd/2NgsAAwYIANouVBiqlgyeOi74ktazcwSyxz7+xgEhYnEGOB8TE70RHQSHW/qd +vO2s6dJdIsWi0Dquh4EjGW3sURvw3Q0mpMZTq/pIpeTSZx5mfbV8xppyz9VqMUBH +NhVXRv4yk4OoM9sfQs9aUTMcQBzejrPnO4cWCmw+uPXwWxj4GTz9Dgo8Kx1X7t1m +jGnpONUMZxX5ObPmDRDZcvl33l9j7mC8CsLlZGCX7aqIVPW0cdKYXQ4EFmyGTFc4 +oca+ck8X5Ar5h5ayx5/pQDs9zd8YdEIfw6H1hAwHnvLpPqW8wl0jjdr+IjvZbB4P +sF2C0RAR8XRNBK3mbtlcwRWvYjdp4bSZ7kyISQQYEQIACQUCR1SGsgIbDAAKCRDJ +LF/scBYcYnKDAJ9NS1MPppAX0CRbDC3QqcfjjkWDzgCfWEb3wKP15906jEy3qUAQ +dfV4cuo= +=PKNA +-----END PGP PUBLIC KEY BLOCK----- + +pub DDDAFA7674E54418 +uid Cedric Beust + +sub 50C6CC55C6F24FB1 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBF8tnmMBCADROe7j1ZvgiMgfsQKqCSuSqgMkfMT2DEXwZKdHqkj0gfx8MPQg +OP1pmMgpIwIXKr5kZ9KMGiGULNnS+WU2SNqjyKeq3MlnSYW5Di52MoAD7W4cHmry +8ekaasF/x0AS5Q3M/6X/EBOD8YLWaFkk+h5x8D4IOSqiOiWH8olGjY4ZmGblaldX +PLr7BWSrPKQ1QDsoICn583Mnjz3YLlc4p5IKnY2wss1zm7/gQk6KkdL5bRuASxLh +to2adZ1LEE8MQfHweauHCK915RmMg7W3KW66/EsuCyEwZKBwq6rIpAciym2FngJt +CPnY0o4IMFSasV7d1xSH5N4jeHL3Hh2Yd9tHABEBAAG0H0NlZHJpYyBCZXVzdCA8 +Y2VkcmljQGJldXN0LmNvbT65AQ0EXy2eYwEIANZAQd63jnuXS/btvoRXGM1kwaU0 +j3f2jeTg12sIGCUiiM4NcD2OnxWSKwvv6SWuk4/W+ahV3zQuTR8ZI51kNwgxvNZY +KFExUyRjS+B4Oo6ArDSPp76Kyo3+82KmPaeHxxibir4sHoZUTSl8UKyszxEUV7BE +756wS7DRHWpeE1gsjClFXc6/hnEOnXIzsoAdIFzzockfLW3guouh+MD5EE/x//rY +yZJEotsPCu4vP/TanR9H6WnYOIn8g3jSUarV9LFGNcxNCcj5sh2x3tOVjQBtPpE2 +SUEveLj3aHFTXzx29rU9kzSzEAxlFdK3pwUK/P+MO+V/qMHoOY3XwTZp3nkAEQEA +AYkBNgQYAQgAIBYhBHzVK1qClRN8iPtXSN3a+nZ05UQYBQJfLZ5jAhsMAAoJEN3a ++nZ05UQYDBsH+wW9ifWjlDSv6eB0wksKNBhPxrq7LxIfw3eTxGxMn5p3RN186gbC +/GX9IUHUwSMRWleBuiOO/TWBUOiVrY5shhJf4ZZy+Ul19crPyhnl/z8p1GsBzeHP +uB/yG5RV6uLAegQQDvGLXiQlmnAI+Hw+IwyXkpAVa4bgPV5CfA6bnhwjD/2FgHdH +uhUj7ZMeWbcICUVqWxfNnU3+X8lAbot8+Qqau5uv74W95fHqLONmyx0WJouDh2QB +B0DCCmYWYJAdvrcEIrOo/APGlrOmTXA/pjmiucu78hJo6j1UL3KVf69Qr3d6rgoA +W5SOf8mTnm2l1QQfyZbXZbpSSO30XFVvxlc= +=hvNT +-----END PGP PUBLIC KEY BLOCK----- + +pub E0130A3ED5A2079E +uid James Ward + +sub 0AE7BBD7FEE66E0C +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFlMSXMBCADcgN0/57D/gU5cDobPiRuDT6qAxb/NWhQiqwAocKd274r4gPJm +RbffUEZEgKhjH6l0CQfilC4R4x2QtU9sNC9kB/D6zumoS1uI0Hmx1pC4UseUy55r +20WDxujUQ7OcJbpe2cDcQVKmMok2top7ZJqt4KVosQEeT9jjsgBBbEtg4cWb5ddR +5rf+aJw0v/6dMLef1r9YAo0ZtLc+g2dyacqw73tcWEd3oCH++SgE26NntN+GibZu +VXSE5u6xI4KwfT2vUT3jt5Fb29myX4sxsfB7n/xageuJYy5ms1ABS+WDO5ssEZC4 +eQEVL7eyIb9YhNAW/WtjeAuOfOKNonoqKFGXABEBAAG0IEphbWVzIFdhcmQgPGph +bWVzQGphbWVzd2FyZC5jb20+uQENBFlMSXMBCADIKz91Pu2Aom8UkCjma6et0Wkl +JL+5gr0Ny8eD+GQ/7AxLCzoipAHPmVOxE0yEJBKR2om7wmTawPkdKXwI9C2AS7LR +CJFMbQGlTOAwUBjdd2XbqeOnyPKz2RMmVW9l6Wf6kuEWIkrRcic1HWswSbPyAewk +9MaeA1BVDq7MpFctGls1reM9EAXtcdwJqQDvw3awzeYL7Zls1m1d3+/Nz7it4ONY +7uxfV1+Z7rmrTUjRzh7euVy+L5oZkn17j+lBYyujCs6vc6W2Q+IqVD6ChCHeTjQ0 +rnF+AvDsnaQvPqxViQgww76HKMd/5ek84oUF3/DAw3AdLtU4Az8+DP0trwYfABEB +AAGJAR8EGAEIAAkFAllMSXMCGwwACgkQ4BMKPtWiB57ZNgf+NqQZJ1EAdmI5D68i +dQdQK3MWizu4FaP5YE/6yxi+wbk2LBSJfZCVA9eehH5JkgJH7MT88FDYfxsn1ULd +PResIXqa8dXyzSQhSGAPWQNFlWRksGxNzXYrsBGid/x2e+yLXkIeSypZahbkpWd7 +tMXbRiY5wFFPcB8Vh/tFt0T5utqYkiXFlMOwkqhMrl/vGfnquB2NL++M538uhsgo +ope0tU/X3Wp9toT98YiR4FSrchZoYa8+mMXGS2tH2Jfkd5gkL7dhbomiy93f7h9M ++hM1rPl2TW40QUxiPVZju7IiMuq42rXbpbd0sdargQosQuDLNgFhAO2zKr1JgqAd +jP9MfA== +=MUfS +-----END PGP PUBLIC KEY BLOCK----- + +pub E2F38302C8075E3D +uid Gradle Inc. + +sub 1B80C80E07BC7190 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=Rl7p +-----END PGP PUBLIC KEY BLOCK----- + +pub ED2378CD09A08CDE +uid Guillaume Nodet (CODE SIGNING KEY) + +sub 937F1470B7330556 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=nw+1 +-----END PGP PUBLIC KEY BLOCK----- + +pub F0DF21D1D0A3C384 +uid Sam Berlin + +sub 029451DBE23057D6 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFYqhSkBCADtcR9B9QdIkPwTTpBOPXKI7iyjXqubQLTUOVMXWbBkQutCA/mX ++7SFGuJOPSvOMqc+MDs2qv21lW/BCB5h2jl8fYbiW87HoxJzveEpGY6pg2KFqt5u +88CK8MzWldy5aVi/xrlTKvKjHt9VZ3BSqraSU1AD5wi6wIPK+sr2x5mgJvp+Ayl1 +8BpmbsLLM8IajBPOdVOnRMLqaTYkuqd/4rIrWzlyP3oy8+xdUcODjJRaIbzMTP4e +tmqteEem6j4Mwy3smN+UJ4/s2GJ7mYquQSdrHtkzfGiSTcIsqXmpY87T0CsT6F0f +KtJBel7qCKflltmfuRJBh4oym9v3ag9V+oOPABEBAAG0HVNhbSBCZXJsaW4gPHNh +bWViQGdvb2dsZS5jb20+uQENBFYqhSkBCADFzmSrmnqV2PRIUE4iWrkigVivGXmz +rJwbpvf8huSs6LkyClIW78JhFchMtTdAs3oAKfFhjI1xDNur9afbB9ULip7K2bOX +1dJ4chi2Fz7eEnPIypfckaMa+BrFx0v+ssXDip+VSmpvdDGBpgkGnfrlpOF1YmNT +zhV9QLm/0B0wgjwmUr+/c+uSqbsrfTVUSOQFCzhSSDOdcpACe2bFpzYJ6/XVTjFQ +Dji9XVI8zsxSXVT6BLx53fZjkWsjAMEygldsZa+Ohu9r7k7sZf6XoML1aO0Ojnv6 +Kk+S5zFMrrSjEf9DBnWL1fWDJT6jtrR0QO81GNQBPsvo5WLOTdpEegG1ABEBAAGJ +AR8EGAECAAkFAlYqhSkCGwwACgkQ8N8h0dCjw4TFnwf/aKk6r9sJrnOIrAt0MXFC +lSrkaN9xPZwKZDYIObiwespv7Jzj2+F9xY0r+OjUpZga7F74fcydM3EGiKLOHPme +vqh2teJXv0UnhXy/WhiqZH2eoe0pQ01WbF0sh5AXZijye7yIeoT8jl1yaB2tW0tv +rmzPPhY4aNr3Bl90X9futRoVbl4d59i6MpxI3AhJKcmOgq9OPCZm472aWC/rfe+S +ozBx7nYZ1jJfuFe6x2Idj3LaXYuesFvkAj5J85s7tHWqJP5luhD++s7tVwk8L41u +HO0w9sQrSysk6HmXDzwB9/eDDMKGoTB3Uw4tBd2xwDxR9p4Bks7+leXL5ogr7RL8 +tQ== +=AdKS +-----END PGP PUBLIC KEY BLOCK----- + +pub 0374CF2E8DD1BDFD +uid Sonatype, Inc. (Sonatype release key) + +sub F2E4DE8FA750E060 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBEmoKU8RBADEN0Q6AuEWEeddjARAzNXcjEx1WfTbLxW5abiiy7zLEht63mhF +kBlbyxEIRnHCSrPLUqY5ROWdyey8MJw+bsQn005RZmSvq2rniXz3MpcyAcYPVPWx +zgoqKUiu+pn3R7eldoDpMcQRsdNbK4TOFWNUomII70Lkj4u/DP9eko6xowCgvK/R +oRhshwRoxJl1LauUFuTeVHUD/i5DryK5j/P9tv9BWSb/2Jji6gbg6Q3MThZ+jCTi +leOHR6PSqajYphOFaA8xVWQAkvbqfSps9HnmdFJ37zxOn2ps9d1L8NLoX1GMu7dv +UZkCY5hR4gwaAk5YpyKa93NpaS5nX6beKiCes7lDy7DezjQLZVbKI3Vsd5t70eTW +tD7JA/4lGUSkole28jxo4ZKKkGMFnAXkV5mWeOTz14BibW7JqhkiIpckDfyq4NjK +ts1EzMmnXmPkB/u5QHHe6fJP+Laoe//gP3Y5+xlnAsyI4iEfEjydJWiSNx48c/2l +qCQ/wdOb28xoFavdCCBavqSKXKJREHXul1UGMICpu3rq9EOk47Q4U29uYXR5cGUs +IEluYy4gKFNvbmF0eXBlIHJlbGVhc2Uga2V5KSA8ZGV2QHNvbmF0eXBlLmNvbT65 +Ag0ESagpTxAIANEHh8lujiAJyotn/aMY57BpYtWH3ia5xAA9CsYcMwHzvXgeK5OY +Ao9gydiENr0IZxa43AnZ4WoJ96AHLX3OtXJhr8jdvfEHrrHpH7sHgEgrlv3VYw2H +ZSU9cmfv+yviC7BSrQqa6LfOwSaWizg5ZOrCG7J2FAKhCnRdwa8ZOs2P0/Pu6asB +4G03mnVaR62ZShntFx4iSWlO78caKUQbB5OgK8oYA1k9YA4EReSwZMlKWpfGOqgw +HGw+xuRkXUObzlhaTWvfXgPr5RsxZzIviKH4EXSfdiIp2QzqZjM/drmfIx9r6Ai2 ++c5WKOIyt0WaX0HWOGsh1t9bBPs2FrrO1H8AAwUH/RxVVWYuO20H8oR1bp5zkjof +wgWk7t6NSXZu7mZMZwqaRgx7gXB89Dq4jALw4xXsAWebgYadReWef1ZSUlx8Lz1M +KOikCAld18lvqf/lfvrHi+ZHInNzqYcAdamT2BKoXHhIIR5jf6/8Flf/FsZGe0sN +QJw8Kl0yYiGYWhI0VV1CIzeVqSDSLLM/g4xZ07u+kt7/VUjo05lFO6jyCNxIO3SR +IBNML9xNXfZSDz21GtKW2ve9+bjC6qEDa0/O5FykoyoUFA9LuW7t05i3T26B81AV +mB/9NMxKHcJI1itU8We7L+IAvKC106chw4SxhXYxa/G6fxTNlkPSKdcPGsdFALaI +SQQYEQIACQUCSagpTwIbDAAKCRADdM8ujdG9/auQAKCCtFUmslioIPSjZkWVLJpo +77IquQCfcgYbAHsCuMFkHkZ1oZQA/f/ku6Q= +=YmFm +-----END PGP PUBLIC KEY BLOCK----- + +pub 164BD2247B936711 +sub EFE8086F9E93774E +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFPU8TIBCADGNvExYTJpVuNGCF9NuWw+IkitjAD7WzF7QkvFCSw9VftzgTUZ +3PYrThRiaDdmHQAke4Sp+nYyAJ7iUcQqg/5/ONiMdzXEv5Kwy5WJN8+o2aXSunIT +PALIw29DemZdVerw8Xc9jcdNYGxbPgtfSjr/DBCBs5Guq+RuuwsBvyTGLiHpc6hb +91D/wX6Y0NQB4UlY9f3k6AgqiR5OGq602hXYvL10pH6eT3gSmCvxp1WvNJDBmaRi +ZdgW76Y+bGQkmygWdAb3Q2DUEQHVH30YTBx5VFoiCfx1Jud4mD90Tv1hhPn0fS50 +oLGqI6f+VB14iJ4XLaSfyk/UMl343iF9PAg9ABEBAAG5AQ0EU9TxMgEIANAOURt9 +TLIRxc4lZLnve9LNSjTe3g88MOSoCI/EsyOR4ttMmc7NqNgCwYXyuNlak+jSGupL +biUCaFq+ioYWPpDGmZZLfiNFPi5Zm8uJdo5RupRTzWWCGryzhb1PHlr1Pd+H4C7r +SuB4pgTaPB06p/o7H6DU3/HKb3AEkJ40FThJX+cU2EOkVs999WQ6Xyabj8j1ivfx +jB0K7q4SuEGEpWvbGHWCGTNuzpjcXYvYWjy0pGgJnmBfaZ4NAqD6mpyNx3yDfVvV +Lu5D3M1t2a9Q4F6uKbaO65SuvTNNRnsCjFbk0tjCas1s2j/QQjI9IyPonKUkVdOv +egP9XmQke1Wm/TcAEQEAAYkCPgQYAQIACQUCU9TxMgIbLgEpCRAWS9Ike5NnEcBd +IAQZAQIABgUCU9TxMgAKCRDv6AhvnpN3Tnp6B/9b03x083+GdaHSBO5QvfJNMxe4 +7bzx53bFMrCqd8zDra7hG/AhNHLsPWdK2MyAc1U8zZt9OUqOxtcb9x1Tneq1XDLa +bGaaNnQMhRGwU8jqmwyn1qxseE/XutZu7MjQgo2nRpUwBK+1y5CcC4I4RxsEzff1 +RFs9tOyXy+rtV3X2hhksT4GUag8O3PpCmsdX1NdMFfcL+W7Orf35z6iaaWUketOw +YhzVALfAqZ+5BAt0ZvJktrn6oOS1/qri5YJeCuy/hGHnKuTsf1BuJUQjRmuntUzP +y8qDPBqTAtDjitO/RnHjY0fq9SceX8Q/EItOKyqPFOC2XfCooP/zTxowcdsraXEH +/idJYp8nHncdzsoRonzNY+0n61qXkE/0yWRtPKlcO5q+3i82ILT38+2M7MQgHBqP +iL8UmsVRfHNwTHtJYsMHEgy90heV1mLft19OHvWEzgyopg+G6oWbaPw7CR0djHfJ +vEPGWvldW0vHJaIA9X+lm6N2nc8tsPm62i/ig8o5tjULAUrizQanCv87VxqsSt24 +Vh9sE+eNXY3ffMv4wedl/nlaHghBD2YttcFulAwoB6nwtV8YbKu9AWx+UQsCDMdo +slVaChMsTYWjoAKUn6vZpKNDQJaQLk/R205uhj1YKBM0wBwYQ9+0fj7FH0hD3qfq +ZsgZV9p6yscaETbJeSljYkM= +=FjWo +-----END PGP PUBLIC KEY BLOCK----- + +pub 22E44AC0622B91C3 +uid Cedric Beust + +sub BFE9E301CD277BAF +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFpqN94BCACaAb8Afmng1QPu5k5uzLoA1FJnF6Wf31ZU1FzDxHFHLNUYSWN2 +Bg6k95QH5ruZ+Z/QOJSoIB+b3htDklyxd8m+G2KsMIqnQs0BaTN18hb3PFyMIknM +YWkkTPF3nVV9APk73AebTAcd2V1GB7xOP+L3T7tyUcB9/7bDeM3od6qPksdVGNMA +0S32U8SNhe4jw8uXKdFL6PSxgyg9yeu0V7DyR92V9jF+ZicZWxaLeKpf/Vn3MBX8 +JdePR9SCJc8CNj0n/tsvg/aSmGZ3OMZTUYYvrtfgpXUw0WVkyma+T0ANcdDN91uZ +P8lV3o+Ic8f15xwsTePDhMhmtOapIz/85ukFABEBAAG0H0NlZHJpYyBCZXVzdCA8 +Y2VkcmljQGJldXN0LmNvbT65AQ0EWmo33gEIAMB9fJ0TVVhqKzqj/gmlVDCT0kve +vaGSDB83rwHatG/D2h9dmipoEIWBvD42/PXkYuY42iIO8/itvVOxpPZOL+FNRvei +/ZbVEno4VGaJKQ646NkeVWyVgXZ8+VkRdZ0n09a+goz/e1pogJfL8BVKbU0F6trW +XYywnV4+vp2kwwMGNRTXmvNabdY6rAE0TfjCGE6O9T28OXy7iHXFX3oTkHjtltUH +WlHrLe9JhCDCPoFiSndTPYyDcZD+cEWg27BX8XsuJRvlbrzA57xD3w25ESHWJyj8 +4z6K52M/Ys7S/PawZ7pflRkbAJ9smeWr9+qg+GLJboc9vX4kdTTyQp5jkEkAEQEA +AYkBNgQYAQgAIBYhBMcLhE8ALyH20rnIdSLkSsBiK5HDBQJaajfeAhsMAAoJECLk +SsBiK5HD5coH/ROhc7Z1pjr9mWR8rr07yNEHNuGf3T/Z148z+ovLkV7dRobayB64 +VhtMwZtE+8Kmf0Tltx5zN2GQkqoSPl08dWFRTr6N7If8N0OCtw/XZJBHa8eD2FF7 +SnNWi6IwNfhCdRtbT0LCmaHKaUineldvmM1riI3GNggGa4cMSYw/65blR757aWAg +AVZEWi9n0LUMKDRhjIaS1zjtxqSrcQ0o1TYsW9FxuCjJ+MzQSmtJQKiVRQ03fLJQ +1z4j5u8YvmzCEqp2dEdqBuDuR6Wyf/TmgMUY9AeLT9U6VZTvAGH69TDqVvdmLsKh +tQidSFbes+7ku5tM61P6ggfv5FJQgQk7WEQ= +=iA+h +-----END PGP PUBLIC KEY BLOCK----- + +pub 29579F18FA8FD93B +uid Tom Ball + +sub 9DF7F2349731D55B +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFYFiMABCADYpblWssqGxbjTwsyroPh48BwdSKl59zbFKoEHDw87NeWq7fik +h95RkbdeWsQSvduXWgQZsUDq9cLOkuS/ChAMkAAd3MPp1NMdFmAqS7BX5wU5s5I7 +XD+/p51SWLMvgrLxoenmoE04EuQqQiXd4DbU+HGPseiNx+mN0cxPssaZMBBsmi2r +RjwcQrFTaC1iffzh8FKLQvoTDzci//b5bWcxCLbsY9dYcUaDCbBAkL8HzyZUKNE9 +XwXh/Rq8wDakI/VEg/905a9c4xq6Rss6Yn5E4V2SAo2+B3hYmvHFsefaM9kkqvXk +MQ6zjx83LAtzavOzmthjhhPIgCAfoQ5Q5oDzABEBAAG0HVRvbSBCYWxsIDx0YmFs +bDcyNEBnbWFpbC5jb20+uQENBFYFiMABCACdvSlhh2hLe4F1fBMHiZK2HdNp8I3N +S8o1E9k0cBM2fTfalIlan6ZIJ2Z+JqRwk6MRaKpB2or/0A34+3KfI22SWtsI2lJA +2x9qWaiwRidLFFAWdSjTzNroYVkcwJ5hf2yKN/mH5YRiDSzaqHr5GKKPXHXpT94X +qXn+Pj1Lj5ipnqPOerpJ5mlkPPSz8C5Ve6I+sIqjGKdtrB6kxgIF3kf30izCu3dL +0j5vuey2XneRAqETHqmBVMEjFeuEY0zJCj7LxQRr0YaaSfrlkIjIxRbhatgxXjQV +bbnh0nYAh8dUz/YvsfuyZmLJhRZkcJxHW8Tt0xxV2oBUBq+IpmvqDoy3ABEBAAGJ +AR8EGAECAAkFAlYFiMACGwwACgkQKVefGPqP2TvmWQgAi9Q5WlckTYzccwvt9F+s +RspD8AncDERdwkY6HiInLLNqQSUWiHU2BaYN2wmSiSeSgwurPtN85nd3XZyhKtXx +H0XKC2fTzQWBdyBEh5zT5UevES9nIzIKurHoG4TsWr9d2XDiDp8q1s4G1cNGYDfD +97wpZRbYn8L7hedL07ISEWNdRvBpbrvhme7X0pD8MBKPqUXfLHHaJetmlFKOmu9a +wzjINlz1C89JdocSln3lLJLE+RGNN7HmXdwmKjmnC0fo2h8jnOTYekdTM3Ec+uWE +8M1WyqZV7WYzoITIfq0uHgyIxCpaOOejOLKShQW031G/kEvZApAVPHLFM8BdJ5P6 +Dw== +=INDk +-----END PGP PUBLIC KEY BLOCK----- + +pub 2C7B12F2A511E325 +uid Ceki Gulcu + +sub 10DA72CD7FBFA159 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBE+ZO+EBCAC3fZOOuYKthr0GcUge0PH2bh18sbM9XUmPKQz/W15l1NA/2ARS +2gUXM0R+SunMlun9KsqjnojJ2ObVPvbm1Hg/66JSRgR3JWfIpSlJxLicpfu8rCfN +bOjh4v9ZipD+px8w3o/RNrnZH/KRsoJg9yER6pf+pUZqTJfdg5lXezc1WF+/1qVo +ypldMGfrkfLsPrUZTT689ubbig978e7eYmJEqldtaIwaAzHQnB70wIJyg/rEwFUM +ldsvs6t6czSuJ4zPMvmh8TMpTg9e6+DMktPl1CWRONl8RPpgYMIC96gb4OnfDDjk +Ex6clSCwgbDwdeAyOjjR6pVq+pCNTo1Pcj5jABEBAAG0GENla2kgR3VsY3UgPGNl +a2lAcW9zLmNoPrkBDQRPmTvhAQgAtrGiCYnW3tqvDzaStXsguVw67pou65dO7LTc +rX+NTvejJZ9SrC89JsfiKBwtvyS3X/qiB+S7RP21PH7SYOy+orwDw1nacNNeiTdP +nxQCDQVNeWpSpmbLlA+0b6K3aPf/EaCKndXmnQyXVOoSXZJ9bqAe0um0NRbO7M+L +1KArVkWW56ms+DvHAeZaGnSDDHQpJI5haUqgSWWP/VoPEU1x0qiBZwY3lokSwRMI +SC4E/uiUvvm7rvfbBzfOiVrjNPLlsVPiQRgOTfQO7dUZAmt2yqWJt1Clliby4fgB +VcOYUx0QCMiz8MZGtSB17+hSrC2Cb1T6n0ypxuYyh4sV2LtqMQARAQABiQEfBBgB +AgAJBQJPmTvhAhsMAAoJECx7EvKlEeMlX0UIAKS+4ZAKrGG9jbWfzTTDbu9zzkXg +V13suMD+XcGz10DkdluTUBXj8wWlp289fXNm4E49ipsNK+dcZ+gOATjUvb1Llh6D +6bHz1QM7olxBCeU2feTmYYKBH8GYY9JZzfAXNMQhcNiiPj+ntZqePy/EFA4uZHM7 +We7vl2c7CBcDAq1NNeEczo0KvG7AWt6QoaMVmbvA14EKadNzrmEy9apkag1BKvwz +XInYCvIHMa9ZqicOSUcI5QCYu5TufvIE7Eq3Khh2Ex1FiOaEA+57LMrt6NsSKXrB +8JNYbI5pqE1rxJXZnYtx3ZpPAAEfLjPdi1AOkWhvhsoPmiGFC6ebYQ5eVbI= +=xA7Z +-----END PGP PUBLIC KEY BLOCK----- + +pub 43203BE58F49479D +uid Viktor Klang + +sub 1364C5E2DF3E99C5 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +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 +=JZti +-----END PGP PUBLIC KEY BLOCK----- + +pub 55C7E5E701832382 +uid Andrey Somov (SnakeYAML) + +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mI0EVdDLQQEEAJMtYCaTA56YsP5RzQzPvqVTaR2nZ27qRk36blHB9WmXK+NHpGeH +PHgq59mLPVueo2/M5k/fFrCe36jHePP31gYpFtueeYDfsofHwod0WhsHyC7JfG8d +jEnSczTCmOHRZ3ed9ef6SeWUozYCQAX/tAbpoCthe0lTDYhFhkzVCe/FABEBAAG0 +MUFuZHJleSBTb21vdiAoU25ha2VZQU1MKSA8cHVibGljLnNvbW92QGdtYWlsLmNv +bT4= +=MKAK +-----END PGP PUBLIC KEY BLOCK----- + +pub 586654072EAD6677 +uid Joel Orlina (Sonatype, Inc.) + +sub 2E74CACB6918A897 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBE1VSkkRBACkCgvt26sMi+0X+EOJDMqdK0Sziy06k47LJf1jOg4tTZ2T9QtP +OZ8fD+va/O5+q8Kna993jzcO5n0Nv+R/K3+MvUqSmdITshCIjBt3cC0n6FWndGyl +jY7rOmzdNnvSkMGE3V2fQ18stkJRleqk3EuWwv+EwpxcYeVfCO+UCJGz5wCgtqnZ +JYdRHcDkDYaIZ4eizpbV4d0D/3cgBdpcbSrwIGtft+lDxacaJrWpT5Jh5P0gLlYu ++6PFz8ZIC4+/aOSi4S4mgZxk8dBL8ZBqLqcW9rc//CYKNtPq33sdf9vxcusMIXvS +PBODjDpoOsTJwy51fgCEL14qnp0v14y9p7ejjN5+GipiNY/JHo9S9kTdVhMYqt6x +6a6MA/40vMejIbZ4q3Ia63jbHPi348fLDq3Gp8Wos7Sh2HnLC+pRdC46qX/5wL4t +Vzj78yW9FdH5yeeE6nQLOBWh7PnSfMt2wYHoarEnkkkycP7WLpRME7qsBYqkNUNa +2EQZSy8DnGiayYDij1YPNUHI9kpK6H/e3puhmgNkzrZj26T85LQzSm9lbCBPcmxp +bmEgKFNvbmF0eXBlLCBJbmMuKSA8am9ybGluYUBzb25hdHlwZS5jb20+uQINBE1V +SlkQCADrG964NxqHiAULSXYEVH1CwlTRILkiTBEkL/cZyoBBnkF/SLVX3TC67y23 ++MksiCdUoQUfJPNF5PDOgtlwPnNeAFVK7T1B5rHjud02NJ9lY2Q+ZrO0zmP3Kvg4 +XkwS85cTbCvOatI2VzitvkpYr/WkQSJf/N3NYkuZATO+n8y1marIrqkLC1LxL6Ap +lCNlks4Sd7OLN5whx7avrEJHGi2qdxTB9SD6MxRSVkpSUrCHhOtgMUeF63xrNcum +MQPQBIbv+kFgNtE+eZaFfU0+IHgy8sMROvHrtqzPOuwZdnH1OvrVuEVtErINjmJr +//nTXtWBK0YCpuSQI1kcadCc3OO7AAMFCADoDnwynvulS0K1WF8FGfOIqQRoKfyc +Kmoz88WvGKHTx9AnfG38Nt+kHHfUeTLsozW4uDNkSd6S5TRmrCArdqpaDzSagpok +3FRl13mit4Whuw7um16O3miZfqTF0aM9yU63UzyxzoT4DexHlrZAL/0G2zjabJzX +Morr7p3dSl9SWqBo+9dsZOyKwzuO3gO1XPqZctPKMCJZ47Tt1xtKOBm5GcexIImh +vNOY20VM/UOBR5yBNw4rZqOAay7MuqRtpCcr9GJEjOqQUhaXPyvOVg1eHxMD3QEt +4ZdK5U4RbsYEhzx9WezqjXQ52wCqfMRCpwJm/94cdeO31PlaBXd6nLnXiEkEGBEC +AAkFAk1VSlkCGwwACgkQWGZUBy6tZndAQwCgs/qSu+5vFRvBeGVsg7YSIxOHf8wA +oLIHbQ4IMkRivPgSpuxw53Hofe7A +=9YZ+ +-----END PGP PUBLIC KEY BLOCK----- + +pub 59A252FB1199D873 +sub 92BD2D0B5B21ABA2 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFUBG7QBCADRWXf0Fw05qRhM4cRnGKlOW1ecue1DCxHAtFwoqmAXyTCO+tI0 +MEW5SyXUkX6FsWLl6A2y+KgOs669ogzfQ0rnZMEt4HisRp8wpgk3GWR1/9aKYz/c +ymy2N3BP9cz2fJ9+3PpBccUPL+ydFKpcnEnIwiQK+p9JjEWzJBlrdUc/UEJ0R+n/ +5r/+0+BHiTEMvjAF6/SwyntpTWpu7iEzLv/pfdCuhFKa4yn+9Ciwe3wGtSiue+dh +tqKcd4YxED3oAswObBca3CC2HWWsUEH6EmfT1jUdfy1cq4X5x7AZ26oFYfG+odqW +W5dcB+13VkJtJRzQTO/2HKtITJYC65a1jKt3ABEBAAG5AQ0EVQEbtAEIANsILuU9 +cH/EIEL+OpwIacr/y3/6LG+ok8SKDHIlF6cSpusSsWM6L+RGcZgvCDR0S0EEid44 +yy8wFMvoYSlsXHLN4SqH/rpLIc4CD8DdCLWraKaRZrhtqzNWSsYxEgqo7n1xO6+c +sU17VJArnpkGPHoA7ooZlaGrc0y/rlkTXH++LKqh8niO9Dap46pLFrdgvuyKbq1B +6faAf2JMRyvqy2+fuwfVGTc7DEUUFtwGg7FniDF0zl+3rFG1ud9kH8UWz+GwCwFT +6qhVglgOmtJgw1CSYNeDsQvDB4YTJNnMneMSdM6CkEcRhLp2+lz90+wR0K/a9QBE +1NPubAaRB2uQR4UAEQEAAYkBHwQYAQIACQUCVQEbtAIbDAAKCRBZolL7EZnYc2uJ +CADHHB/Bmc48Ye1xl6T6nbNEiMCdmpIba+JNFnEWcueq4xk0xoXXUSpBnjLaWPQr +VZKHXdMxmmR3BjhtFvsLgeajypLUkVDlKMkdGQtsWXL0abr4cNoMDiXURxlbXgxZ +8+hIs/rKSWKturrCD2V4MXLsQV4xArh1ezkJFEDA3tRGzjjgzg5MwmrmL7H5Pcd6 +vV1Ke60BmvFYvvjRwT4Uw1OD0XluuPOaaiTibhPECc5zLxBz9+eRSsRbxccNEzPY +JS8Xl9+hIw7Y7Od184cOoexxdoI/K52kH7A5yfEj2kXCZm5tYylyKvgGpczWdZuo +V3u1xg+t7/QlghTMoJAA0H5G +=hS0U +-----END PGP PUBLIC KEY BLOCK----- + +pub 6525FD70CC303655 +sub DCF4B49B4D5845D2 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQGiBEmhev8RBACz56FVQ9l701+PE7Nr6+6Lsoy5tK6wmV89pEvUDgDjT0VTs4EI +dupAk4a0dLn8Lu87AloEYuSzbCxv5cH5vyDcvLDK6g3/sRC1LPQPydD+UlCvG8LI +jCmzJYSJj8joVqTBLL2RBdR7xUie34e1RTvAM5b0UHnnvmsvEwwFRsb6CwCg7VFi +5CrOZlhNeWcWqSpPZCTV4ikD/2xEBh5fUlpfo6qoWeYx2pLg7X7TIriD6IVSREmT +ewrVXK/C5N9jcJ1zCERjkPOinyZh11MX9dau6M7I+72bapVj7Za49VHiPutDCb8t +3OPS+ksddfTccQw0iHGDjSusJM+hX6wmHDBgY++WBCYX9TkZxz/cFutqOZ+HBYUW +QiEjA/9p5vk/gpSB2UtmUn0StfAnwsqpiiwV4weS3sbn66qRYq3jbbAjS5v+jGwf +KZjPpUyBitKW2Jx+BgPnFy6yk+u19gv7MOiKwikqeDqyF6M0fAjJflproQFLyHZQ +7YFfIvhB0k76t7qSeCU9MA2wbU/DvDS/TmsMiMFqBuhjB6T8wbkCDQRJoXr/EAgA +oJmSrlu4uHo9RhCtUmSNOczGf922j95Ldou20NKmRKd6Mki9dGdCt/TJSCaWFULf +oQ7rKDQy8IRrP18xaJ/KzhG6fjh9uuA0v9x9ORsEHB5Xih3s9gt/TqC6NWeOSd8R +ZeG6Y6SgtFcA+5a3UP9yFSXo0xS2It48f/ClB1/I1V+iQjVXC3pbs3LwGJlaclNE +V8ROkXDhyYPwW6LQkWEDa043dSKCOFe6FnytD/9vv92weOFe7pSltEJiHjz9qpZl +Aq3CANsjqsqqZJU36+8rpyiJfSiHXcdjgCiDQyzdQm5HQl0cU1e1+CabMrL/8+9X +6C1a4dSXu++NDXgbVB5hnwAEDQf/Z3kUqSvprtKZjh2orialskkQ6jQlGTSCoX/o +UAsBvnsVSdP0CHUnI0mYfIh4WhuiJwHgmvTfjrAzU2Jfwww9glw6OlhXP4mgvM23 +rF/Rk/gpAaUfweSy6TYlynfzFHQ6HPIYEZqGmLPJ/n8a4rsIGSWcW2+TC+OEI7Rg +YvC+LJuoXToqn2tPQ3Av3JeEbO8nenk3SJtrR70cu5F76ANJwgCuwug/ylzvM774 +DuXQd4vPFd4jFxvj/AvKs5itQAGRaInfCxn4uHcUZc2WiGy7T28CpD1Q3ptUybs/ +ogyDCKa/xVHKXu9wRF4osf8U1DdDpjfabdKWG1+RMbx08zH7dYhJBBgRAgAJBQJJ +oXr/AhsMAAoJEGUl/XDMMDZVr0oAoLmZHTCR39fwJJTr3cABz/njjNQvAKDSCgB4 +qq6hm4Gb0pdRaUN4u4e7pA== +=plMF +-----END PGP PUBLIC KEY BLOCK----- + +pub 6CCC36CC6C69FC17 +uid Gregory Kick + +sub C694465FAACEE66F +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBEtrDFABCADLXGAhjPxdh+naC6XU5kficZYEVAURNRa8MTnaMKr+31v2zcAk +nyqyjihcXGQBCeaNsz2mQkc/MrKdnFNVSwp715JcmcqDJGfR9aIDMUs9PvoNkkqv +IDtx9Tn73piqbplT2xQxd7HjFvaVuy7oXI68gwcyAGDvQZeiFUodcbAsKrVwFT+R +94JU6UODFqE/Ihq15Za8Sc8WhWitm8XTQsCsLeh8abGhkvNEmRLi56fh8/Bz8LHv +8T7r8zkROoQFlUEYaOR2wH5bbipww9+HEg64hrcak2w5smNt0NJUXZ2O1l00u3sF +Qdu54hM9nZ51xxcqvo+tGft9kIr2AfTrJ28ZABEBAAG0HUdyZWdvcnkgS2ljayA8 +Z2FrQGdvb2dsZS5jb20+uQENBEtrDFABCADqp4wT0RY1+OwMZRfTSYczlBAidkGq +HszDnCkO0U5w4Tog4v085dDFyaKO5LZHkgDJTyF5WyvwtqqzNoU+tjv+RkkctXTx +K02ced5jSFk7E9MI0AoMXogLP/uW6nHmoUTuDxEtCye1UfsIglD99wiCvxGtnOjg +wfezkpctP0WPe41mzNccCrs3hx+R9ECkyZMtQiHYPmr3X3nhwQxKQotwWQOeSYgC +jLhTWJfkOMn/xaGCNGaihYSMCtDkC2PrpyD5V/qj8gek5DyI/bXCv3Hm6Td1XBbz +c1ZHKmF3ccFFPRtBsswtwXuN+6Ms5t0iVsNQ0XdhY8BXoi9H1jo8HH75ABEBAAGJ +AR8EGAECAAkFAktrDFACGwwACgkQbMw2zGxp/BdCxAf/TvMMBA7kY4nbH5WU6KTL +Nnaykv0zfxAf5XgRbDqrcO9dvnWEjYTPyyVWXIVkvMtESx0DAHeml/PaKCab5pIo +ybyYQfWLbh8Jhn0+NLnKOwE6m6OrWFv2gNa3zrPRwIy29VFkLxLC/velrIkES8CK +F+gGinmxupi2IpIiio4uCyUaeR1XV6U8UWl/50j0i2mrutle1yiV2lYBb0k8uMZ9 +nqYeHkVQAispv6bDZF20co9Zmn+GtbHat1jHYg0R0p960SrFBlb+x8ROOb0e1u4a +jdAZ2uFczoDRKHEQijvaQxIjpl7Cl1LwyQTq703XSVR19/5ufOR2XWtXa7UoBL90 +bA== +=d1Fs +-----END PGP PUBLIC KEY BLOCK----- + +pub 734AEF3D43509290 +uid BJ Hargrave (bintray.com osgi organization) + +sub 49D2ED97DAA8B33F +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFRZXAUBCACqPBEjQ7si90PYbccyR/K2tg78HzJfmECvmtE9mKaUpAWGkid8 +xvSWNIunJMqMEyAM6lbyGUE/lQX8k0Ap4qk/UIf9vxdFirmlzD1lhfxDls33Y6et +TxpsRP2Rm0f6fW01R3L275FAvHLkQcOUQVoD407Eb3al41sYy6vdRZpdTJ923w9X +ol0a/6G7wueIMNO4TtxLNGSe+WPjtAWmLOl1H2pg2eOcKR2+finbeWpPZPCjR4I1 +CaMcGfdwv/4goI1b/931t0TlKAyGVhCgTa/1DKtRsJazwtw6MQZkE+/8t4JIuSVx +GlOWUrlU2HCbN+eAHj/5/G0suIw0OZpdtNPBABEBAAG0QUJKIEhhcmdyYXZlIChi +aW50cmF5LmNvbSBvc2dpIG9yZ2FuaXphdGlvbikgPGhhcmdyYXZlQHVzLmlibS5j +b20+uQENBFRZXAUBCAC+ddgLBX0/BBS+EH6JiIqbFhclAnMEGwIAGyfk7rpvlwwW +CFQDYDSRW4AjWwcDV07ckKI+3HQQ+iLD9xwiMWRSyo8RRbuq2xypbPKd4ET4XtMU +uNweMpuyCgOMceMVUd4LbzilopWzOKCo2NBAExRjMoBGKdTyaCrQ/lEouEGATlzw +oOcrewUpWKfG0qb+D3XTZ5Dwqo/ylCtE1QlZASJGF8jGEMc9UXkMH2e4cg6GUBbg +iC0iKA4zwgLKCBaSWNUHt4fhO1pt3pVPrMaFL/3foLpa63xi9DdpL+LXDhIo165T +KOpXwDaeaZoRNC1qRggeLasxeMfL0Vm9P1DrZteTABEBAAGJAR8EGAECAAkFAlRZ +XAUCGwwACgkQc0rvPUNQkpCN5gf/THiGnRy7LT03PnA4J6AWtL19HLtRm4FXQQC+ +X5um8abd74HPzAgz0Z2o0rt2gq40xHxzyMWmtdpylSrRdfuwlVuVpf8cZDMiXNVX +TK/wnByEmqzfwNC5+21s/FHi0bQdbm5DjHz1jz6RwGUHdTZ0rRWV44VPxtYCZr/f +iu++Ra/ysUCCMrNh42UhMfH5yw9pQZxM5NTPeEXytraMhyldxRYsJNjO7ORKl3jM +FivAcnrZFlmiw24KDYEU3QNZZkNxpr7g2l9VLiFhkM2QIRGVPbVLHzG5wD2L5c9p +zhmFbXO1ZWoQMA83C4OFV0+ecnga/egW1kdpB50keEhf+cLDjw== +=ExEi +-----END PGP PUBLIC KEY BLOCK----- + +pub 7457CA33C3CE9E15 +uid Colin Decker + +sub ABE9F3126BB741C1 +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: BCPG v1.68 + +mQENBFIXyRQBCADe285y3Pu7KzoKyP6wqeNXtvvuwMatAmPm5x/i+S8MlryqzsYa +x6twUmXV1yKjjtGrO+9fHvTOWBfSSP+fP9KTaTQYSasoJq2Mw4cQDy1i0zrxNZUw +N4/BiyjQA25sdfaOolhO0sFlZuTZpYy5wG72KkA1ygNq0L+8aBKhEF6zDU61YzCC +AxjcgTftgTeeoqkJtYa06lNz3jmJDN+zUQignfRa3ymoGtFHTzoXR9maE8RWDty4 +y+DY+8ibdGgSgKPZ0byTCDyNojgU1YTlADa/1/NY1ShYg617O1xicLNo0JEJlf2U +Tu4Ymql36+xSkYSISU97Q6Utgq27XMuZvDUDABEBAAG0IkNvbGluIERlY2tlciA8 +Y2dkZWNrZXJAZ29vZ2xlLmNvbT65AQ0EUhfJFAEIAN9NHRd2bYP/3CDi+n1ilSCh +ld0NR3DUBgS/AdqQ7IoAUfj7skyI/WyaMdV4uy6vRh5YgNg2g01nd0LLZR8Gf2Ck ++D6F88CdZaTxlkcxHV/dXMZ8yBO+0D6yFRZEL7Imsv8Ig4QXOVwfuiXEPk/Ef5Dy +9SdAVhcoErTGGR6BOGVVvexGtBwefsjMaOG0khkRbWIQ32WxfUFuAv5XBQ0ckLrl +KvYWUYhOlXg27GtFKH2EBBF0Z5ZWu7gaBFwSV0oLp9EWcD+C+WEwUSfBdqfRJtyX +vgf4kZdwdQ5caM8P2/Sdncl2l/LU1At2Smc+plr6zhIhDlLhlrzKGa16oARSBdUA +EQEAAYkCPgQYAQoACQUCUhfJFAIbLgEpCRB0V8ozw86eFcBdIAQZAQoABgUCUhfJ +FAAKCRCr6fMSa7dBwURMCADHrqwRNHkbG1QsXJr9oUK6KVkLsPhcngIhxRLlqe89 +omg9G7eGNauzs2PKsB3txotCFc7ROVNv/TAuSDYzkPos8G46p3bGesjfJb24zc6G +MT4RGIJoh1oNG1IciafIIHjp2ZJHRmEDwmvZG24OHJ+mlHLjaedtqlWu+zwwhH2V +ZrI/U3gW/x4imbk9UyyzciEIxrAc+fc19xl5PkUVcSDVC0cAqGpeZz8+SxFaf3Rr +0aGnSbeuHRjNupmoxkQOAey1ztmdWiCPf5RFfmFD+fENh+/xqYiGorYpcIN7UAsM +kvD5UHc5ZG2tTD41jM99w9Lm/xHJ9ks8gNwZESwIzr6ABKIH/1ulsflI216qPz5o +7uUxlTm8NfTyATfCUuZEDMYGOjDQPqQa8hFebqjWWYBUq2SlaKD2xMeEuEXV+M5k +88Cx6T2nvaZWMsrD7uGj+tTsFaKBGxP5p2OSEWOTETKKv6Cx7vcMTQmrqSFo47bF +KlNSs+aVM48UnQeFtTDyOhwa5jvtqtst4eQHwHWQ99BK0TEymNx0vF0nPjWA76CR +rfopOwXKdxJgoKq4MrxE92ot5I82AZBPeiWVJ+6wECeK/GoBIXZ5jEUqrQmmzIbo +WA5G5PMJ8egzLJNRJjTWHjCWrUTnwNcqaD4/qZxIlW4Lt0uvGlx6pKOJQ05u+9X/ +BzoVWrw= +=fJQM +-----END PGP PUBLIC KEY BLOCK----- diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml new file mode 100644 index 00000000..b3c2cee5 --- /dev/null +++ b/gradle/verification-metadata.xml @@ -0,0 +1,178 @@ + + + + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 94336fca..d64cd491 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 94920145..a80b22ce 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index cccdd3d5..1aa94a42 100755 --- a/gradlew +++ b/gradlew @@ -1,78 +1,127 @@ -#!/usr/bin/env sh +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -81,92 +130,120 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" fi +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index e95643d6..7101f8e4 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,4 +1,20 @@ -@if "%DEBUG%" == "" @echo off +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -9,25 +25,29 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -35,48 +55,36 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/reactive-streams-tck-flow/gradle.lockfile b/reactive-streams-tck-flow/gradle.lockfile new file mode 100644 index 00000000..e02380ea --- /dev/null +++ b/reactive-streams-tck-flow/gradle.lockfile @@ -0,0 +1,4 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +empty=annotationProcessor,baseline,compileClasspath,runtimeClasspath,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath diff --git a/settings-gradle.lockfile b/settings-gradle.lockfile new file mode 100644 index 00000000..709a43f7 --- /dev/null +++ b/settings-gradle.lockfile @@ -0,0 +1,4 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +empty=incomingCatalogForLibs0 diff --git a/settings.gradle b/settings.gradle index 866ecf93..b6cefcd7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,33 +1,21 @@ -rootProject.name = 'reactive-streams' +pluginManagement { + repositories { + gradlePluginPortal() + } +} -def jdkFlow = false +plugins { + id "org.gradle.toolchains.foojay-resolver-convention" version "0.8.0" +} -final def ANSI_RESET = "\u001B[0m" -final def ANSI_RED = "\u001B[31m" -final def ANSI_GREEN = "\u001B[32m" -final def ANSI_YELLOW = "\u001B[33m" +rootProject.name = 'reactive-streams' -try { - Class.forName("java.util.concurrent.Flow") - jdkFlow = true - println(ANSI_GREEN + " INFO: ------------------ JDK9 classes detected ---------------------------------" + ANSI_RESET) - println(ANSI_GREEN + " INFO: Java 9 Flow API found; Including [tck-flow] & FlowAdapters in build. " + ANSI_RESET) - println(ANSI_GREEN + " INFO: --------------------------------------------------------------------------" + ANSI_RESET) -} catch (Throwable ex) { - // Flow API not available - println(ANSI_RED + "WARNING: -------------------- JDK9 classes NOT detected -----------------------------" + ANSI_RESET) - println(ANSI_RED + "WARNING: Java 9 Flow API not found; Not including [tck-flow] & FlowAdapters in build." + ANSI_RESET) - println(ANSI_RED + "WARNING: In order to execute the complete test-suite run the build using JDK9+. " + ANSI_RESET) - println(ANSI_RED + "WARNING: ----------------------------------------------------------------------------" + ANSI_RESET) -} +def jdkFlow = false include ':reactive-streams' include ':reactive-streams-tck' include ':reactive-streams-examples' - -if (jdkFlow) { - include ':reactive-streams-tck-flow' -} +include ':reactive-streams-tck-flow' project(':reactive-streams').projectDir = "$rootDir/api" as File project(':reactive-streams-tck').projectDir = "$rootDir/tck" as File diff --git a/tck-flow/build.gradle b/tck-flow/build.gradle index 2dd1d409..e8a13b03 100644 --- a/tck-flow/build.gradle +++ b/tck-flow/build.gradle @@ -1,19 +1,79 @@ description = 'reactive-streams-tck-flow' + dependencies { + api project(path: ':reactive-streams', configuration: 'mrjarArtifact') api project(':reactive-streams-tck') implementation project(':reactive-streams-examples') } jar { - bnd ('Bundle-Name': 'reactive-streams-jvm', - 'Bundle-Vendor': 'Reactive Streams SIG', - 'Bundle-Description': 'Reactive Streams TCK Flow', - 'Bundle-DocURL': 'http://reactive-streams.org', - 'Bundle-Version': project.version, - 'Export-Package': 'org.reactivestreams.tck.flow.*', - 'Automatic-Module-Name': 'org.reactivestreams.tckflow', - 'Bundle-SymbolicName': 'org.reactivestreams.tckflow' - ) + bundle { + bnd ('Bundle-Name': 'reactive-streams-jvm', + 'Bundle-Vendor': 'Reactive Streams SIG', + 'Bundle-Description': 'Reactive Streams TCK Flow', + 'Bundle-DocURL': 'http://reactive-streams.org', + 'Bundle-Version': project.version, + 'Export-Package': 'org.reactivestreams.tck.flow.*', + 'Automatic-Module-Name': 'org.reactivestreams.tckflow', + 'Bundle-SymbolicName': 'org.reactivestreams.tckflow' + ) + } +} + +// Run the TCK Flow tests on JDK 11. +def baselineToolchain = properties["javaBaseline"] ?: '11' + +// Run the TCK flow tests on LTS releases, JDK 11 and above. +def javaMinimumTarget = 11 +def javaMaximumTarget = 21 +def javaTestTargets = [javaMinimumTarget, 17, javaMaximumTarget] +def jdk8Toolchain = JavaLanguageVersion.of(javaMinimumTarget) + +compileJava { + options.release = 9 + + javaCompiler = javaToolchains.compilerFor { + languageVersion = JavaLanguageVersion.of(baselineToolchain) + } +} + +compileTestJava { + options.release = 9 + + javaCompiler = javaToolchains.compilerFor { + languageVersion = JavaLanguageVersion.of(baselineToolchain) + } +} + +test { + useTestNG() + + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(baselineToolchain) + } } -test.useTestNG() +javaTestTargets.each { majorVersion -> + def jdkTest = tasks.register("testJdk$majorVersion", Test) { + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(majorVersion) + } + + description = "Runs the test suite on JDK $majorVersion" + group = LifecycleBasePlugin.VERIFICATION_GROUP + + // Copy inputs from normal Test task. + def testTask = tasks.getByName("test") + + useTestNG() + if (majorVersion >= 9) { + // tbd + classpath = testTask.classpath + testClassesDirs = testTask.testClassesDirs + } else { + classpath = testTask.classpath + testClassesDirs = testTask.testClassesDirs + } + } + tasks.named("check").configure { dependsOn(jdkTest) } +} diff --git a/tck/build.gradle b/tck/build.gradle index b5424c9f..aa354da2 100644 --- a/tck/build.gradle +++ b/tck/build.gradle @@ -1,20 +1,69 @@ description = 'reactive-streams-tck' + dependencies { api group: 'org.testng', name: 'testng', version:'7.3.0' - api project(':reactive-streams') + api project(path: ':reactive-streams', configuration: 'mrjarArtifact') implementation project(':reactive-streams-examples') } jar { - bnd ('Bundle-Name': 'reactive-streams-jvm', - 'Bundle-Vendor': 'Reactive Streams SIG', - 'Bundle-Description': 'Reactive Streams TCK', - 'Bundle-DocURL': 'http://reactive-streams.org', - 'Bundle-Version': project.version, - 'Export-Package': 'org.reactivestreams.tck.*', - 'Automatic-Module-Name': 'org.reactivestreams.tck', - 'Bundle-SymbolicName': 'org.reactivestreams.tck' - ) + bundle { + bnd ('Bundle-Name': 'reactive-streams-jvm', + 'Bundle-Vendor': 'Reactive Streams SIG', + 'Bundle-Description': 'Reactive Streams TCK', + 'Bundle-DocURL': 'http://reactive-streams.org', + 'Bundle-Version': project.version, + 'Export-Package': 'org.reactivestreams.tck.*', + 'Automatic-Module-Name': 'org.reactivestreams.tck', + 'Bundle-SymbolicName': 'org.reactivestreams.tck' + ) + } +} + +// Run the TCK baseline tests on LTS releases, JDK 8 and above. +def javaMinimumTarget = 8 +def javaMaximumTarget = 21 +def javaTestTargets = [javaMinimumTarget, 11, 17, javaMaximumTarget] +def jdk8Toolchain = JavaLanguageVersion.of(javaMinimumTarget) + +compileTestJava { + sourceCompatibility = 6 + targetCompatibility = 6 + + javaCompiler = javaToolchains.compilerFor { + languageVersion = jdk8Toolchain + } +} + +test { + useTestNG() + + javaLauncher = javaToolchains.launcherFor { + languageVersion = jdk8Toolchain + } } -test.useTestNG() +javaTestTargets.each { majorVersion -> + def jdkTest = tasks.register("testJdk$majorVersion", Test) { + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(majorVersion) + } + + description = "Runs the test suite on JDK $majorVersion" + group = LifecycleBasePlugin.VERIFICATION_GROUP + + // Copy inputs from normal Test task. + def testTask = tasks.getByName("test") + + useTestNG() + if (majorVersion >= 9) { + // tbd + classpath = testTask.classpath + testClassesDirs = testTask.testClassesDirs + } else { + classpath = testTask.classpath + testClassesDirs = testTask.testClassesDirs + } + } + tasks.named("check").configure { dependsOn(jdkTest) } +} diff --git a/tck/gradle.lockfile b/tck/gradle.lockfile new file mode 100644 index 00000000..2b1a5702 --- /dev/null +++ b/tck/gradle.lockfile @@ -0,0 +1,20 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +aopalliance:aopalliance:1.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.beust:jcommander:1.78=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.code.findbugs:jsr305:3.0.2=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.errorprone:error_prone_annotations:2.1.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.guava:guava:25.1-android=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.inject:guice:4.2.2=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.j2objc:j2objc-annotations:1.1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +javax.inject:javax.inject:1=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +junit:junit:4.12=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.apache.ant:ant-launcher:1.10.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.apache.ant:ant:1.10.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.checkerframework:checker-compat-qual:2.0.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.mojo:animal-sniffer-annotations:1.14=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.hamcrest:hamcrest-core:1.3=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.testng:testng:7.3.0=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +org.yaml:snakeyaml:1.21=compileClasspath,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +empty=annotationProcessor,baseline,testAnnotationProcessor