diff --git a/.drone.yml b/.drone.yml index 569a7ae7724d..9347864809c2 100644 --- a/.drone.yml +++ b/.drone.yml @@ -148,7 +148,7 @@ steps: commands: - emulator -avd android -no-snapshot -gpu swiftshader_indirect -no-window -no-audio -skin 500x833 & - sed -i s'#false#true#'g app/src/main/res/values/setup.xml - - sed -i s'#showOnlyFailingTestsInReports = ciBuild#showOnlyFailingTestsInReports = false#' build.gradle + - sed -i s'#showOnlyFailingTestsInReports = ciBuild#showOnlyFailingTestsInReports = false#' build.gradle.kts - scripts/wait_for_emulator.sh - scripts/runAllScreenshotCombinations noCI false - scripts/screenshotSummary.sh diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 1b7b9f97e8cc..000000000000 --- a/app/build.gradle +++ /dev/null @@ -1,591 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2024 Alper Ozturk - * SPDX-FileCopyrightText: 2024 Tobias Kaminsky - * SPDX-FileCopyrightText: 2024 Andy Scherzinger - * SPDX-FileCopyrightText: 2022 Álvaro Brey Vilas - * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only - */ -import com.github.spotbugs.snom.Confidence -import com.github.spotbugs.snom.Effort -import com.github.spotbugs.snom.SpotBugsTask -import org.gradle.internal.jvm.Jvm - -buildscript { - dependencies { - classpath "com.android.tools.build:gradle:$androidPluginVersion" - classpath libs.spotbugs.gradle.plugin - classpath libs.kotlin.gradle.plugin - classpath libs.detekt.gradle.plugin - classpath libs.commons.httpclient.commons.httpclient // remove after entire switch to lib v2 - classpath libs.shot - classpath "org.jacoco:org.jacoco.core:$jacoco_version" - classpath "org.jacoco:org.jacoco.report:$jacoco_version" - classpath "org.jacoco:org.jacoco.agent:$jacoco_version" - } -} - -plugins { - alias(libs.plugins.kotlin.compose) - alias(libs.plugins.spotless) - alias(libs.plugins.kapt) - alias(libs.plugins.ksp) apply false - alias(libs.plugins.kotlin.serialization) -} - -apply plugin: "com.android.application" - -apply plugin: "kotlin-android" -apply plugin: "kotlin-parcelize" -apply plugin: "checkstyle" -apply plugin: "pmd" -apply from: "$rootProject.projectDir/jacoco.gradle" -apply plugin: "com.github.spotbugs" -apply plugin: "io.gitlab.arturbosch.detekt" - -// needed to make renovate run without shot, as shot requires Android SDK -// https://github.com/pedrovgs/Shot/issues/300 -if (shotTest) { - apply plugin: "shot" -} -apply plugin: "com.google.devtools.ksp" - - -println "Gradle uses Java ${Jvm.current()}" - -configurations { - configureEach { - exclude group: "org.jetbrains", module: "annotations-java5" // via prism4j, already using annotations explicitly - } -} - - -configurations.configureEach { - resolutionStrategy.eachDependency { - if (requested.group == "org.checkerframework" && requested.name != "checker-compat-qual") { - useVersion(checkerVersion) - because("https://github.com/google/ExoPlayer/issues/10007") - } - - if (requested.group == "commons-logging" && requested.name == "commons-logging") { - useTarget("org.slf4j:jcl-over-slf4j:1.7.36") - } - } -} - -// semantic versioning for version code -def versionMajor = 3 -def versionMinor = 35 -def versionPatch = 0 -def versionBuild = 0 // 0-50=Alpha / 51-98=RC / 90-99=stable - - -def ndkEnv = new HashMap() -file("$project.rootDir/ndk.env").readLines().each() { - def (key, value) = it.tokenize("=") - ndkEnv.put(key, value) -} - -def perfAnalysis = project.hasProperty("perfAnalysis") - -def getConfigProperties() { - def props = new Properties() - def file = rootProject.file(".gradle/config.properties") - if (file.exists()) { - props.load(new FileInputStream(file)) - } - return props -} - -def configProps = getConfigProperties() - -android { - // install this NDK version and Cmake to produce smaller APKs. Build will still work if not installed - ndkVersion = "${ndkEnv.get("NDK_VERSION")}" - - - namespace = "com.owncloud.android" - testNamespace = "${namespace}.test" - - androidResources { - generateLocaleConfig = true - } - - defaultConfig { - applicationId = "com.nextcloud.client" - minSdk = 27 - targetSdk = 35 - compileSdk = 35 - - buildConfigField "boolean", "CI", ciBuild.toString() - buildConfigField "boolean", "RUNTIME_PERF_ANALYSIS", perfAnalysis.toString() - - javaCompileOptions { - annotationProcessorOptions { - arguments += ["room.schemaLocation": "$projectDir/schemas".toString()] - } - } - - // arguments to be passed to functional tests - if (shotTest) { - testInstrumentationRunner "com.karumi.shot.ShotTestRunner" - } else { - testInstrumentationRunner "com.nextcloud.client.TestRunner" - } - testInstrumentationRunnerArgument "TEST_SERVER_URL", "${NC_TEST_SERVER_BASEURL}" - testInstrumentationRunnerArgument "TEST_SERVER_USERNAME", "${NC_TEST_SERVER_USERNAME}" - testInstrumentationRunnerArgument "TEST_SERVER_PASSWORD", "${NC_TEST_SERVER_PASSWORD}" - testInstrumentationRunnerArguments disableAnalytics: "true" - - versionCode versionMajor * 10000000 + versionMinor * 10000 + versionPatch * 100 + versionBuild - - if (versionBuild > 89) { - versionName "${versionMajor}.${versionMinor}.${versionPatch}" - } else if (versionBuild > 50) { - versionName "${versionMajor}.${versionMinor}.${versionPatch} RC" + (versionBuild - 50) - } else { - versionName "${versionMajor}.${versionMinor}.${versionPatch} Alpha" + (versionBuild + 1) - } - - // adapt structure from Eclipse to Gradle/Android Studio expectations; - // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure - - flavorDimensions += "default" - - buildTypes { - release { - buildConfigField "String", "NC_TEST_SERVER_DATA_STRING", "\"\"" - } - - debug { - testCoverageEnabled = project.hasProperty("coverage") - resConfigs "xxxhdpi" - - buildConfigField "String", "NC_TEST_SERVER_DATA_STRING", "\"nc://login/user:${configProps['NC_TEST_SERVER_USERNAME']}&password:${configProps['NC_TEST_SERVER_PASSWORD']}&server:${configProps['NC_TEST_SERVER_BASEURL']}\"" - } - } - - buildFeatures { - buildConfig = true - } - - productFlavors { - // used for f-droid - generic { - applicationId "com.nextcloud.client" - dimension "default" - } - - gplay { - applicationId "com.nextcloud.client" - dimension "default" - } - - huawei { - applicationId "com.nextcloud.client" - dimension "default" - } - - versionDev { - applicationId "com.nextcloud.android.beta" - dimension "default" - versionCode 20220322 - versionName "20220322" - } - - qa { - applicationId "com.nextcloud.android.qa" - dimension "default" - versionCode 1 - versionName "1" - } - } - - testOptions { - unitTests.returnDefaultValues = true - animationsDisabled = true - } - } - - // adapt structure from Eclipse to Gradle/Android Studio expectations; - // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure - packagingOptions { - resources { - excludes += "META-INF/LICENSE*" - excludes += "META-INF/versions/9/OSGI-INF/MANIFEST*" - pickFirst "MANIFEST.MF" // workaround for duplicated manifest on some dependencies - } - } - - tasks.register("checkstyle", Checkstyle) { - configFile = file("${rootProject.projectDir}/checkstyle.xml") - configProperties.checkstyleSuppressionsPath = file("${project.rootDir}/config/quality/checkstyle/suppressions.xml").absolutePath - source "src" - include "**/*.java" - exclude "**/gen/**" - classpath = files() - } - - tasks.register("pmd", Pmd) { - ruleSetFiles = files("${project.rootDir}/ruleset.xml") - ignoreFailures = true // should continue checking - ruleSets = [] - - source "src" - include "**/*.java" - exclude "**/gen/**" - - reports { - xml { - destination = layout.buildDirectory.file("reports/pmd/pmd.xml").get().asFile - } - html { - destination = layout.buildDirectory.file("reports/pmd/pmd.html").get().asFile - } - } - } - - check.dependsOn "checkstyle", "spotbugsGplayDebug", "pmd", "lint", "spotlessKotlinCheck", "detekt" - - buildFeatures { - dataBinding = true - viewBinding = true - aidl = true - compose = true - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } - - kotlinOptions { - jvmTarget = "17" - } - - lint { - abortOnError = false - checkGeneratedSources = true - disable "MissingTranslation", "GradleDependency", "VectorPath", "IconMissingDensityFolder", "IconDensities", "GoogleAppIndexingWarning", "MissingDefaultResource", "InvalidPeriodicWorkRequestInterval", "StringFormatInvalid", "MissingQuantity" - htmlOutput = layout.buildDirectory.file("reports/lint/lint.html").get().asFile - htmlReport = true - } - - sourceSets { - // Adds exported schema location as test app assets. - androidTest.assets.srcDirs += files("$projectDir/schemas".toString()) - } - - kapt { - useBuildCache = true - } -} - -dependencies { - // region Nextcloud library - implementation("com.github.nextcloud:android-library:$androidLibraryVersion") { - exclude group: "org.ogce", module: "xpp3" // unused in Android and brings wrong Junit version - } - // endregion - - // region Splash Screen - implementation libs.splashscreen - // endregion - - // region Jetpack Compose - implementation(platform(libs.compose.bom)) - implementation(libs.compose.ui) - implementation(libs.compose.ui.graphics) - implementation(libs.compose.material3) - debugImplementation(libs.compose.ui.tooling) - implementation(libs.compose.ui.tooling.preview) - // endregion - - // region Media3 - implementation libs.media3.ui - implementation libs.media3.session - implementation libs.media3.exoplayer - implementation libs.media3.datasource - // endregion - - // region Room - implementation libs.room.runtime - ksp "androidx.room:room-compiler:$roomVersion" - androidTestImplementation libs.room.testing - // endregion - - // region Espresso - androidTestImplementation libs.espresso.core - androidTestImplementation libs.espresso.contrib - androidTestImplementation libs.espresso.web - androidTestImplementation libs.espresso.accessibility - androidTestImplementation libs.espresso.intents - androidTestImplementation libs.espresso.idling.resource - // endregion - - // region Glide - implementation libs.glide - ksp libs.ksp - // endregion - - // region UI - implementation libs.appcompat - implementation libs.webkit - implementation libs.cardview - implementation libs.exifinterface - implementation libs.fragment.ktx - // endregion - - // region Worker - implementation libs.work.runtime - implementation libs.work.runtime.ktx - // endregion - - // region Lifecycle - implementation libs.lifecycle.viewmodel.ktx - implementation libs.lifecycle.service - implementation(libs.lifecycle.runtime.ktx) - // endregion - - // region JUnit - androidTestImplementation libs.junit - androidTestImplementation libs.rules - androidTestImplementation libs.runner - androidTestUtil libs.orchestrator - androidTestImplementation libs.core.ktx - androidTestImplementation libs.core.testing - // endregion - - // region other libraries - compileOnly libs.org.jbundle.util.osgi.wrapped.org.apache.http.client - implementation libs.commons.httpclient.commons.httpclient // remove after entire switch to lib v2 - implementation libs.jackrabbit.webdav // remove after entire switch to lib v2 - implementation libs.constraintlayout - implementation libs.legacy.support.v4 - implementation libs.material - implementation libs.disklrucache - implementation libs.juniversalchardet // need this version for Android <7 - compileOnly libs.annotations - implementation libs.commons.io - implementation libs.eventbus - implementation libs.ez.vcard - implementation libs.nnio - implementation libs.bcpkix.jdk18on - implementation libs.gson - implementation libs.sectioned.recyclerview - implementation libs.photoview - implementation libs.android.gif.drawable - implementation libs.qrcodescanner // "com.github.blikoon:QRCodeScanner:0.1.2" - implementation libs.flexbox - implementation libs.androidsvg - implementation libs.annotation - implementation libs.emoji.google - // endregion - - // region AppScan, document scanner not available on FDroid (generic) due to OpenCV binaries - gplayImplementation project(":appscan") - huaweiImplementation project(":appscan") - qaImplementation project(":appscan") - // endregion - - // region SpotBugs - spotbugsPlugins libs.findsecbugs.plugin - spotbugsPlugins libs.fb.contrib - // endregion - - // region Dagger - implementation libs.dagger - implementation libs.dagger.android - implementation libs.dagger.android.support - kapt "com.google.dagger:dagger-compiler:$daggerVersion" - kapt "com.google.dagger:dagger-android-processor:$daggerVersion" - // endregion - - // region Crypto - implementation libs.conscrypt.android - // endregion - - // region Library - implementation libs.library - // endregion - - // region Shimmer - implementation libs.loaderviewlibrary - // endregion - - // region Markdown rendering - implementation libs.core - implementation libs.ext.strikethrough - implementation libs.ext.tables - implementation libs.ext.tasklist - implementation libs.html - implementation libs.syntax.highlight - implementation libs.prism4j - kapt "io.noties:prism4j-bundler:$prismVersion" - // endregion - - // region Image cropping / rotation - implementation libs.android.image.cropper - // endregion - - // region Maps - implementation libs.osmdroid.android - // endregion - - // region iCal4j - implementation(libs.ical4j) { - ["org.apache.commons", "commons-logging"].each { - exclude group: "$it" - } - } - // endregion - - // region LeakCanary - if (perfAnalysis) { - debugImplementation "com.squareup.leakcanary:leakcanary-android:2.14" - } - // endregion - - // region Local Unit Test - testImplementation libs.junit.junit - testImplementation libs.mockito.core - testImplementation libs.test.core - testImplementation libs.json - testImplementation libs.mockito.kotlin - testImplementation libs.core.testing - testImplementation "io.mockk:mockk:$mockkVersion" - testImplementation libs.mockk.android - // endregion - - // region Mocking support - androidTestImplementation libs.dexopener // required to allow mocking on API 27 and older - androidTestImplementation libs.mockito.kotlin - androidTestImplementation libs.mockito.core - androidTestImplementation(libs.mockito.android) - androidTestImplementation libs.mockk.android - androidTestImplementation libs.screenshot.core - // endregion - - // region UIAutomator - // UIAutomator - for cross-app UI tests, and to grant screen is turned on in Espresso tests - // androidTestImplementation "androidx.test.uiautomator:uiautomator:2.2.0" - // fix conflict in dependencies; see http://g.co/androidstudio/app-test-app-conflict for details - // androidTestImplementation "com.android.support:support-annotations:${supportLibraryVersion}" - androidTestImplementation libs.screengrab - // endregion - - // region Kotlin - implementation libs.kotlin.stdlib - // endregion - - // region Stateless - implementation libs.stateless4j - // endregion - - // region Google Play dependencies, upon each update first test: new registration, receive push - gplayImplementation libs.firebase.messaging - gplayImplementation libs.play.services.base - gplayImplementation libs.review.ktx - // endregion - - // region UI - implementation libs.ui - // endregion - - // region Image loading - implementation libs.coil - // endregion - - // kotlinx.serialization - implementation(libs.kotlinx.serialization.json) -} - - -configurations.configureEach { - resolutionStrategy { - force "org.objenesis:objenesis:3.4" - eachDependency { details -> - if ("org.jacoco" == details.requested.group) { - details.useVersion "$jacoco_version" - } - } - } -} - -// Run the compiler as a separate process -tasks.withType(JavaCompile).configureEach { - options.fork = true - - // Enable Incremental Compilation - options.incremental = true -} - -tasks.withType(Test).configureEach { - // Run tests in parallel - maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1 - - // increased logging for tests - testLogging { - events "passed", "skipped", "failed" - } -} - -android.applicationVariants.configureEach { variant -> - variant.outputs.configureEach { output -> outputFileName = "${output.baseName}-${variant.versionCode}.apk" - } -} - -spotless { - kotlin { - target "**/*.kt" - ktlint() - } -} - -detekt { - config.setFrom("detekt.yml") -} - -if (shotTest) { - shot { - showOnlyFailingTestsInReports = ciBuild - // CI environment renders some shadows slightly different from local VMs - // Add a 0.5% tolerance to account for that - tolerance = ciBuild ? 0.1 : 0 - } -} - -jacoco { - toolVersion = "$jacoco_version" -} - -spotbugs { - ignoreFailures = true // should continue checking - effort = Effort.MAX - reportLevel = Confidence.valueOf("MEDIUM") -} - -tasks.withType(SpotBugsTask){task -> - String variantNameCap = task.name.replace("spotbugs", "") - String variantName = variantNameCap.substring(0, 1).toLowerCase() + variantNameCap.substring(1) - dependsOn "compile${variantNameCap}Sources" - - classes = fileTree(layout.buildDirectory.get().asFile.toString()+"/intermediates/javac/${variantName}/compile${variantNameCap}JavaWithJavac/classes/") - excludeFilter = file("${project.rootDir}/scripts/analysis/spotbugs-filter.xml") - reports { - xml { - required = true - } - html { - required = true - outputLocation = layout.buildDirectory.file("reports/spotbugs/spotbugs.html").get().asFile - stylesheet = "fancy.xsl" - } - } -} - -ksp { - arg("room.schemaLocation", "$projectDir/schemas") -} diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 000000000000..167a4295244f --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,520 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-FileCopyrightText: 2024 Tobias Kaminsky + * SPDX-FileCopyrightText: 2024 Andy Scherzinger + * SPDX-FileCopyrightText: 2022 Álvaro Brey Vilas + * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only + */ +@file:Suppress("UnstableApiUsage", "DEPRECATION") + +import com.android.build.gradle.internal.api.ApkVariantOutputImpl +import com.github.spotbugs.snom.Confidence +import com.github.spotbugs.snom.Effort +import com.github.spotbugs.snom.SpotBugsTask +import com.karumi.shot.ShotExtension +import org.gradle.internal.jvm.Jvm +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import java.io.FileInputStream +import java.util.Properties + +val shotTest = System.getenv("SHOT_TEST") == "true" +val ciBuild = System.getenv("CI") == "true" +val perfAnalysis = project.hasProperty("perfAnalysis") + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.compose) + alias(libs.plugins.spotless) + alias(libs.plugins.kapt) + alias(libs.plugins.ksp) + alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.kotlin.parcelize) + alias(libs.plugins.jetbrains.kotlin.android) + alias(libs.plugins.spotbugs) + alias(libs.plugins.detekt) + // needed to make renovate run without shot, as shot requires Android SDK + // https://github.com/pedrovgs/Shot/issues/300 + if (System.getenv("SHOT_TEST") == "true") alias(libs.plugins.shot) + id("checkstyle") + id("pmd") +} +apply(from = "${rootProject.projectDir}/jacoco.gradle.kts") + +println("Gradle uses Java ${Jvm.current()}") + +configurations.configureEach { + // via prism4j, already using annotations explicitly + exclude(group = "org.jetbrains", module = "annotations-java5") + + resolutionStrategy { + force(libs.objenesis) + + eachDependency { + if (requested.group == "org.checkerframework" && requested.name != "checker-compat-qual") { + useVersion(libs.versions.checker.get()) + because("https://github.com/google/ExoPlayer/issues/10007") + } else if (requested.group == "org.jacoco") { + useVersion(libs.versions.jacoco.get()) + } else if (requested.group == "commons-logging" && requested.name == "commons-logging") { + useTarget(libs.slfj) + } + } + } +} + +// semantic versioning for version code +val versionMajor = 3 +val versionMinor = 35 +val versionPatch = 0 +val versionBuild = 0 // 0-50=Alpha / 51-98=RC / 90-99=stable + +val ndkEnv = buildMap { + file("${project.rootDir}/ndk.env").readLines().forEach { + val (key, value) = it.split("=") + put(key, value) + } +} + +val configProps = Properties().apply { + val file = rootProject.file(".gradle/config.properties") + if (file.exists()) load(FileInputStream(file)) +} + +val ncTestServerUsername = configProps["NC_TEST_SERVER_USERNAME"] +val ncTestServerPassword = configProps["NC_TEST_SERVER_PASSWORD"] +val ncTestServerBaseUrl = configProps["NC_TEST_SERVER_BASEURL"] + +android { + // install this NDK version and Cmake to produce smaller APKs. Build will still work if not installed + ndkVersion = "${ndkEnv["NDK_VERSION"]}" + + namespace = "com.owncloud.android" + testNamespace = "${namespace}.test" + + androidResources.generateLocaleConfig = true + + defaultConfig { + applicationId = "com.nextcloud.client" + minSdk = 27 + targetSdk = 36 + compileSdk = 36 + + buildConfigField("boolean", "CI", ciBuild.toString()) + buildConfigField("boolean", "RUNTIME_PERF_ANALYSIS", perfAnalysis.toString()) + + javaCompileOptions.annotationProcessorOptions { + arguments += mapOf("room.schemaLocation" to "$projectDir/schemas") + } + + // arguments to be passed to functional tests + testInstrumentationRunner = if (shotTest) "com.karumi.shot.ShotTestRunner" + else "com.nextcloud.client.TestRunner" + + testInstrumentationRunnerArguments += mapOf( + "TEST_SERVER_URL" to ncTestServerBaseUrl.toString(), + "TEST_SERVER_USERNAME" to ncTestServerUsername.toString(), + "TEST_SERVER_PASSWORD" to ncTestServerPassword.toString() + ) + testInstrumentationRunnerArguments["disableAnalytics"] = "true" + + versionCode = versionMajor * 10000000 + versionMinor * 10000 + versionPatch * 100 + versionBuild + versionName = when { + versionBuild > 89 -> "${versionMajor}.${versionMinor}.${versionPatch}" + versionBuild > 50 -> "${versionMajor}.${versionMinor}.${versionPatch} RC" + (versionBuild - 50) + else -> "${versionMajor}.${versionMinor}.${versionPatch} Alpha" + (versionBuild + 1) + } + + // adapt structure from Eclipse to Gradle/Android Studio expectations; + // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure + + flavorDimensions += "default" + + buildTypes { + release { + buildConfigField("String", "NC_TEST_SERVER_DATA_STRING", "\"\"") + } + + debug { + enableUnitTestCoverage = project.hasProperty("coverage") + resConfigs("xxxhdpi") + + buildConfigField( + "String", + "NC_TEST_SERVER_DATA_STRING", + "\"nc://login/user:${ncTestServerUsername}&password:${ncTestServerPassword}&server:${ncTestServerBaseUrl}\"" + ) + } + } + + productFlavors { + // used for f-droid + register("generic") { + applicationId = "com.nextcloud.client" + dimension = "default" + } + + register("gplay") { + applicationId = "com.nextcloud.client" + dimension = "default" + } + + register("huawei") { + applicationId = "com.nextcloud.client" + dimension = "default" + } + + register("versionDev") { + applicationId = "com.nextcloud.android.beta" + dimension = "default" + versionCode = 20220322 + versionName = "20220322" + } + + register("qa") { + applicationId = "com.nextcloud.android.qa" + dimension = "default" + versionCode = 1 + versionName = "1" + } + } + } + + applicationVariants.configureEach { + outputs.configureEach { + if (this is ApkVariantOutputImpl) this.outputFileName = "${this.baseName}-${this.versionCode}.apk" + } + } + + testOptions { + unitTests.isReturnDefaultValues = true + animationsDisabled = true + } + + // adapt structure from Eclipse to Gradle/Android Studio expectations; + // see http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Configuring-the-Structure + packaging.resources { + excludes.addAll(listOf("META-INF/LICENSE*", "META-INF/versions/9/OSGI-INF/MANIFEST*")) + pickFirsts.add("MANIFEST.MF") // workaround for duplicated manifest on some dependencies + } + + buildFeatures { + buildConfig = true + dataBinding = true + viewBinding = true + aidl = true + compose = true + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + lint { + abortOnError = false + checkGeneratedSources = true + disable.addAll( + listOf( + "MissingTranslation", + "GradleDependency", + "VectorPath", + "IconMissingDensityFolder", + "IconDensities", + "GoogleAppIndexingWarning", + "MissingDefaultResource", + "InvalidPeriodicWorkRequestInterval", + "StringFormatInvalid", + "MissingQuantity" + ) + ) + htmlOutput = layout.buildDirectory.file("reports/lint/lint.html").get().asFile + htmlReport = true + } + + sourceSets { + // Adds exported schema location as test app assets. + getByName("androidTest") { + assets.srcDirs(files("$projectDir/schemas")) + } + } + +} + +kapt.useBuildCache = true + +ksp.arg("room.schemaLocation", "$projectDir/schemas") + +kotlin.compilerOptions.jvmTarget.set(JvmTarget.JVM_17) + +spotless.kotlin { + target("**/*.kt") + ktlint() +} + +detekt.config.setFrom("detekt.yml") + +if (shotTest) configure { + showOnlyFailingTestsInReports = ciBuild + // CI environment renders some shadows slightly different from local VMs + // Add a 0.5% tolerance to account for that + tolerance = if (ciBuild) 0.1 else 0.0 +} + + +spotbugs { + ignoreFailures = true // should continue checking + effort = Effort.MAX + reportLevel = Confidence.valueOf("MEDIUM") +} + +tasks.register("checkstyle") { + configFile = file("${rootProject.projectDir}/checkstyle.xml") + setConfigProperties( + "checkstyleSuppressionsPath" to file("${rootProject.rootDir}/suppressions.xml").absolutePath + ) + source("src") + include("**/*.java") + exclude("**/gen/**") + classpath = files() +} + +tasks.register("pmd") { + ruleSetFiles = files("${rootProject.rootDir}/ruleset.xml") + ignoreFailures = true // should continue checking + ruleSets = emptyList() + + source("src") + include("**/*.java") + exclude("**/gen/**") + + reports { + xml.outputLocation.set(layout.buildDirectory.file("reports/pmd/pmd.xml").get().asFile) + html.outputLocation.set(layout.buildDirectory.file("reports/pmd/pmd.html").get().asFile) + } +} + +tasks.withType().configureEach { + val variantNameCap = name.replace("spotbugs", "") + val variantName = variantNameCap.substring(0, 1).lowercase() + variantNameCap.substring(1) + dependsOn("compile${variantNameCap}Sources") + + classes = + fileTree(layout.buildDirectory.get().asFile.toString() + "/intermediates/javac/${variantName}/compile${variantNameCap}JavaWithJavac/classes/") + excludeFilter = file("${project.rootDir}/scripts/analysis/spotbugs-filter.xml") + reports { + register("xml") { + required = true + } + register("html") { + required = true + outputLocation = layout.buildDirectory.file("reports/spotbugs/spotbugs.html").get().asFile + setStylesheet("fancy.xsl") + } + } +} + +// Run the compiler as a separate process +tasks.withType().configureEach { + options.isFork = true + + // Enable Incremental Compilation + options.isIncremental = true +} + +tasks.withType().configureEach { + // Run tests in parallel + maxParallelForks = Runtime.getRuntime().availableProcessors().div(2) + + // increased logging for tests + testLogging.events("passed", "skipped", "failed") +} + +tasks.named("check").configure { + dependsOn("checkstyle", "spotbugsGplayDebug", "pmd", "lint", "spotlessKotlinCheck", "detekt") +} + +dependencies { + // region Nextcloud library + implementation(libs.android.library) { + exclude(group = "org.ogce", module = "xpp3") // unused in Android and brings wrong Junit version + } + // endregion + + // region Splash Screen + implementation(libs.splashscreen) + // endregion + + // region Jetpack Compose + implementation(platform(libs.compose.bom)) + implementation(libs.compose.ui) + implementation(libs.compose.ui.graphics) + implementation(libs.compose.material3) + implementation(libs.compose.ui.tooling.preview) + debugImplementation(libs.compose.ui.tooling) + // endregion + + // region Media3 + implementation(libs.bundles.media3) + // endregion + + // region Room + implementation(libs.room.runtime) + ksp(libs.room.compiler) + androidTestImplementation(libs.room.testing) + // endregion + + // region Espresso + androidTestImplementation(libs.bundles.espresso) + // endregion + + // region Glide + implementation(libs.glide) + ksp(libs.ksp) + // endregion + + // region UI + implementation(libs.bundles.ui) + // endregion + + // region Worker + implementation(libs.work.runtime) + implementation(libs.work.runtime.ktx) + // endregion + + // region Lifecycle + implementation(libs.lifecycle.viewmodel.ktx) + implementation(libs.lifecycle.service) + implementation(libs.lifecycle.runtime.ktx) + // endregion + + // region JUnit + androidTestImplementation(libs.junit) + androidTestImplementation(libs.rules) + androidTestImplementation(libs.runner) + androidTestUtil(libs.orchestrator) + androidTestImplementation(libs.core.ktx) + androidTestImplementation(libs.core.testing) + // endregion + + // region other libraries + compileOnly(libs.org.jbundle.util.osgi.wrapped.org.apache.http.client) + implementation(libs.commons.httpclient.commons.httpclient) // remove after entire switch to lib v2 + implementation(libs.jackrabbit.webdav) // remove after entire switch to lib v2 + implementation(libs.constraintlayout) + implementation(libs.legacy.support.v4) + implementation(libs.material) + implementation(libs.disklrucache) + implementation(libs.juniversalchardet) // need this version for Android <7 + compileOnly(libs.annotations) + implementation(libs.commons.io) + implementation(libs.eventbus) + implementation(libs.ez.vcard) + implementation(libs.nnio) + implementation(libs.bcpkix.jdk18on) + implementation(libs.gson) + implementation(libs.sectioned.recyclerview) + implementation(libs.photoview) + implementation(libs.android.gif.drawable) + implementation(libs.qrcodescanner) // "com.github.blikoon:QRCodeScanner:0.1.2" + implementation(libs.flexbox) + implementation(libs.androidsvg) + implementation(libs.annotation) + implementation(libs.emoji.google) + // endregion + + // region AppScan, document scanner not available on FDroid (generic) due to OpenCV binaries + "gplayImplementation"(project(":appscan")) + "huaweiImplementation"(project(":appscan")) + "qaImplementation"(project(":appscan")) + // endregion + + // region SpotBugs + spotbugsPlugins(libs.findsecbugs.plugin) + spotbugsPlugins(libs.fb.contrib) + // endregion + + // region Dagger + implementation(libs.dagger) + implementation(libs.dagger.android) + implementation(libs.dagger.android.support) + ksp(libs.dagger.compiler) + ksp(libs.dagger.processor) + // endregion + + // region Crypto + implementation(libs.conscrypt.android) + // endregion + + // region Library + implementation(libs.library) + // endregion + + // region Shimmer + implementation(libs.loaderviewlibrary) + // endregion + + // region Markdown rendering + implementation(libs.bundles.markdown.rendering) + kapt(libs.prism4j.bundler) + // endregion + + // region Image cropping / rotation + implementation(libs.android.image.cropper) + // endregion + + // region Maps + implementation(libs.osmdroid.android) + // endregion + + // region iCal4j + implementation(libs.ical4j) { + listOf("org.apache.commons", "commons-logging").forEach { groupName -> exclude(group = groupName) } + } + // endregion + + // region LeakCanary + if (perfAnalysis) debugImplementation(libs.leakcanary) + // endregion + + // region Local Unit Test + testImplementation(libs.bundles.unit.test) + // endregion + + // region Mocking support + androidTestImplementation(libs.bundles.mocking) + // endregion + + // region UIAutomator + // UIAutomator - for cross-app UI tests, and to grant screen is turned on in Espresso tests + // androidTestImplementation("androidx.test.uiautomator:uiautomator:2.2.0" + // fix conflict in dependencies; see http://g.co/androidstudio/app-test-app-conflict for details + // androidTestImplementation("com.android.support:support-annotations:${supportLibraryVersion}" + androidTestImplementation(libs.screengrab) + // endregion + + // region Kotlin + implementation(libs.kotlin.stdlib) + // endregion + + // region Stateless + implementation(libs.stateless4j) + // endregion + + // region Google Play dependencies, upon each update first test: new registration, receive push + "gplayImplementation"(libs.bundles.gplay) + // endregion + + // region UI + implementation(libs.ui) + // endregion + + // region Image loading + implementation(libs.coil) + // endregion + + // kotlinx.serialization + implementation(libs.kotlinx.serialization.json) +} diff --git a/app/src/androidTest/java/com/nextcloud/utils/FileHelperTest.kt b/app/src/androidTest/java/com/nextcloud/utils/FileHelperTest.kt new file mode 100644 index 000000000000..8f013158cc9b --- /dev/null +++ b/app/src/androidTest/java/com/nextcloud/utils/FileHelperTest.kt @@ -0,0 +1,204 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2025 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +package com.nextcloud.utils + +import junit.framework.TestCase.assertEquals +import junit.framework.TestCase.assertTrue +import org.junit.After +import org.junit.Before +import org.junit.Test +import java.io.File +import java.nio.file.Files + +@Suppress("TooManyFunctions") +class FileHelperTest { + + private lateinit var testDirectory: File + + @Before + fun setup() { + testDirectory = Files.createTempDirectory("test").toFile() + } + + @After + fun tearDown() { + testDirectory.deleteRecursively() + } + + @Test + fun testListDirectoryEntriesWhenGivenNullDirectoryShouldReturnEmptyList() { + val result = FileHelper.listDirectoryEntries(null, 0, 10, false) + assertTrue(result.isEmpty()) + } + + @Test + fun testListDirectoryEntriesWhenGivenNonExistentDirectoryShouldReturnEmptyList() { + val nonExistent = File(testDirectory, "does_not_exist") + val result = FileHelper.listDirectoryEntries(nonExistent, 0, 10, false) + assertTrue(result.isEmpty()) + } + + @Test + fun testListDirectoryEntriesWhenGivenFileInsteadOfDirectoryShouldReturnEmptyList() { + val file = File(testDirectory, "test.txt") + file.createNewFile() + val result = FileHelper.listDirectoryEntries(file, 0, 10, false) + assertTrue(result.isEmpty()) + } + + @Test + fun testListDirectoryEntriesWhenGivenEmptyDirectoryShouldReturnEmptyList() { + val result = FileHelper.listDirectoryEntries(testDirectory, 0, 10, false) + assertTrue(result.isEmpty()) + } + + @Test + fun testListDirectoryEntriesWhenFetchingFoldersShouldReturnOnlyFolders() { + File(testDirectory, "folder1").mkdir() + File(testDirectory, "folder2").mkdir() + File(testDirectory, "file1.txt").createNewFile() + File(testDirectory, "file2.txt").createNewFile() + + val result = FileHelper.listDirectoryEntries(testDirectory, 0, 10, true) + + assertEquals(2, result.size) + assertTrue(result.all { it.isDirectory }) + } + + @Test + fun testListDirectoryEntriesWhenFetchingFilesShouldReturnOnlyFiles() { + File(testDirectory, "folder1").mkdir() + File(testDirectory, "folder2").mkdir() + File(testDirectory, "file1.txt").createNewFile() + File(testDirectory, "file2.txt").createNewFile() + + val result = FileHelper.listDirectoryEntries(testDirectory, 0, 10, false) + + assertEquals(2, result.size) + assertTrue(result.all { it.isFile }) + } + + @Test + fun testListDirectoryEntriesWhenStartIndexProvidedShouldSkipCorrectNumberOfItems() { + for (i in 1..5) File(testDirectory, "file$i.txt").createNewFile() + val result = FileHelper.listDirectoryEntries(testDirectory, 2, 10, false) + assertEquals(3, result.size) + } + + @Test + fun testListDirectoryEntriesWhenMaxItemsProvidedShouldLimitResults() { + for (i in 1..10) File(testDirectory, "file$i.txt").createNewFile() + val result = FileHelper.listDirectoryEntries(testDirectory, 0, 5, false) + assertEquals(5, result.size) + } + + @Test + fun testListDirectoryEntriesWhenGivenStartIndexAndMaxItemsShouldReturnCorrectSubset() { + for (i in 1..10) File(testDirectory, "file$i.txt").createNewFile() + val result = FileHelper.listDirectoryEntries(testDirectory, 3, 4, false) + assertEquals(4, result.size) + } + + @Test + fun testListDirectoryEntriesWhenStartIndexBeyondAvailableShouldReturnEmptyList() { + for (i in 1..3) File(testDirectory, "file$i.txt").createNewFile() + val result = FileHelper.listDirectoryEntries(testDirectory, 10, 5, false) + assertTrue(result.isEmpty()) + } + + @Test + fun testListDirectoryEntriesWhenMaxItemsBeyondAvailableShouldReturnAllItems() { + for (i in 1..3) File(testDirectory, "file$i.txt").createNewFile() + val result = FileHelper.listDirectoryEntries(testDirectory, 0, 100, false) + assertEquals(3, result.size) + } + + @Test + fun testListDirectoryEntriesWhenFetchingFoldersWithOffsetShouldSkipCorrectly() { + for (i in 1..5) File(testDirectory, "folder$i").mkdir() + for (i in 1..3) File(testDirectory, "file$i.txt").createNewFile() + + val result = FileHelper.listDirectoryEntries(testDirectory, 2, 10, true) + + assertEquals(3, result.size) + assertTrue(result.all { it.isDirectory }) + } + + @Test + fun testListDirectoryEntriesWhenFetchingFilesWithOffsetShouldSkipCorrectly() { + for (i in 1..3) File(testDirectory, "folder$i").mkdir() + for (i in 1..5) File(testDirectory, "file$i.txt").createNewFile() + + val result = FileHelper.listDirectoryEntries(testDirectory, 2, 10, false) + + assertEquals(3, result.size) + assertTrue(result.all { it.isFile }) + } + + @Test + fun testListDirectoryEntriesWhenGivenOnlyFoldersAndFetchingFilesShouldReturnEmptyList() { + for (i in 1..5) File(testDirectory, "folder$i").mkdir() + val result = FileHelper.listDirectoryEntries(testDirectory, 0, 10, false) + assertTrue(result.isEmpty()) + } + + @Test + fun testListDirectoryEntriesWhenGivenOnlyFilesAndFetchingFoldersShouldReturnEmptyList() { + for (i in 1..5) File(testDirectory, "file$i.txt").createNewFile() + val result = FileHelper.listDirectoryEntries(testDirectory, 0, 10, true) + assertTrue(result.isEmpty()) + } + + @Test + fun testListDirectoryEntriesWhenMaxItemsIsZeroShouldReturnEmptyList() { + for (i in 1..5) File(testDirectory, "file$i.txt").createNewFile() + val result = FileHelper.listDirectoryEntries(testDirectory, 0, 0, false) + assertTrue(result.isEmpty()) + } + + @Test + fun testListDirectoryEntriesWhenGivenMixedContentShouldFilterCorrectly() { + for (i in 1..3) File(testDirectory, "folder$i").mkdir() + for (i in 1..7) File(testDirectory, "file$i.txt").createNewFile() + + val folders = FileHelper.listDirectoryEntries(testDirectory, 0, 10, true) + val files = FileHelper.listDirectoryEntries(testDirectory, 0, 10, false) + + assertEquals(3, folders.size) + assertEquals(7, files.size) + assertTrue(folders.all { it.isDirectory }) + assertTrue(files.all { it.isFile }) + } + + @Test + fun testListDirectoryEntriesWhenPaginatingFoldersShouldWorkCorrectly() { + for (i in 1..10) File(testDirectory, "folder$i").mkdir() + + val page1 = FileHelper.listDirectoryEntries(testDirectory, 0, 3, true) + val page2 = FileHelper.listDirectoryEntries(testDirectory, 3, 3, true) + val page3 = FileHelper.listDirectoryEntries(testDirectory, 6, 3, true) + val page4 = FileHelper.listDirectoryEntries(testDirectory, 9, 3, true) + + assertEquals(3, page1.size) + assertEquals(3, page2.size) + assertEquals(3, page3.size) + assertEquals(1, page4.size) + } + + @Test + fun testListDirectoryEntriesWhenPaginatingFilesShouldWorkCorrectly() { + for (i in 1..10) File(testDirectory, "file$i.txt").createNewFile() + + val page1 = FileHelper.listDirectoryEntries(testDirectory, 0, 4, false) + val page2 = FileHelper.listDirectoryEntries(testDirectory, 4, 4, false) + val page3 = FileHelper.listDirectoryEntries(testDirectory, 8, 4, false) + + assertEquals(4, page1.size) + assertEquals(4, page2.size) + assertEquals(2, page3.size) + } +} diff --git a/app/src/androidTest/java/com/owncloud/android/ui/activity/FileDisplayActivityTest.java b/app/src/androidTest/java/com/owncloud/android/ui/activity/FileDisplayActivityTest.java index c9ec5e04ad73..8f65ddcd8517 100644 --- a/app/src/androidTest/java/com/owncloud/android/ui/activity/FileDisplayActivityTest.java +++ b/app/src/androidTest/java/com/owncloud/android/ui/activity/FileDisplayActivityTest.java @@ -27,8 +27,8 @@ public void testSetupToolbar() { InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> { Activity activity = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(RESUMED).iterator().next(); - if (activity instanceof WhatsNewActivity) { - activity.onBackPressed(); + if (activity instanceof WhatsNewActivity whatsNewActivity) { + whatsNewActivity.getOnBackPressedDispatcher().onBackPressed(); } }); scenario.recreate(); diff --git a/app/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailSharingFragmentIT.kt b/app/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailSharingFragmentIT.kt index 7fa76a889add..77c204eb31c0 100644 --- a/app/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailSharingFragmentIT.kt +++ b/app/src/androidTest/java/com/owncloud/android/ui/fragment/FileDetailSharingFragmentIT.kt @@ -822,7 +822,7 @@ class FileDetailSharingFragmentIT : AbstractIT() { val processFragment = activity.supportFragmentManager.findFragmentByTag(FileDetailsSharingProcessFragment.TAG) as FileDetailsSharingProcessFragment - processFragment.onBackPressed() + processFragment.activity?.onBackPressedDispatcher?.onBackPressed() } } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7d0bf6464568..1ca3e4966c69 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -121,7 +121,7 @@ android:requestLegacyExternalStorage="true" android:roundIcon="@mipmap/ic_launcher" android:supportsRtl="true" - android:enableOnBackInvokedCallback="false" + android:enableOnBackInvokedCallback="true" android:theme="@style/Theme.ownCloud.Toolbar" android:usesCleartextTraffic="true" tools:ignore="UnusedAttribute" @@ -353,6 +353,7 @@ + + https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#2xx_Success + // handle “Not Modified” responses + if (status == 304) { + Log_OC.i(TAG, "Received status " + status + " not modified"); + method.releaseConnection(); + return new Response(); + } + if (status >= HTTP_STATUS_CODE_OK && status < HTTP_STATUS_CODE_MULTIPLE_CHOICES) { return new Response(method); - } else { - InputStream inputStream = method.getResponseBodyAsStream(); - String total = "No response body"; + } - // If response body is available - if (inputStream != null) { - total = inputStreamToString(inputStream); - Log_OC.e(TAG, total); - } + InputStream inputStream = method.getResponseBodyAsStream(); + String total = "No response body"; - method.releaseConnection(); - throw new IllegalStateException(EXCEPTION_HTTP_REQUEST_FAILED, - new IllegalStateException(String.valueOf(status), - new IllegalStateException(total))); + if (inputStream != null) { + total = inputStreamToString(inputStream); + Log_OC.e(TAG, total); } + + method.releaseConnection(); + throw new IllegalStateException(EXCEPTION_HTTP_REQUEST_FAILED, + new IllegalStateException(String.valueOf(status), + new IllegalStateException(total))); } private boolean isValid(NextcloudRequest request) { diff --git a/app/src/main/java/com/nextcloud/client/database/dao/FileDao.kt b/app/src/main/java/com/nextcloud/client/database/dao/FileDao.kt index d31550175238..3356d69d0be5 100644 --- a/app/src/main/java/com/nextcloud/client/database/dao/FileDao.kt +++ b/app/src/main/java/com/nextcloud/client/database/dao/FileDao.kt @@ -17,15 +17,6 @@ import com.owncloud.android.utils.MimeType @Suppress("TooManyFunctions") @Dao interface FileDao { - @Query( - """ - SELECT DISTINCT parent - FROM filelist - WHERE path IN (:subfilePaths) - """ - ) - fun getParentIdsOfSubfiles(subfilePaths: List): List - @Update fun update(entity: FileEntity) diff --git a/app/src/main/java/com/nextcloud/client/database/dao/UploadDao.kt b/app/src/main/java/com/nextcloud/client/database/dao/UploadDao.kt index aac3d1d377bc..6fecbf664438 100644 --- a/app/src/main/java/com/nextcloud/client/database/dao/UploadDao.kt +++ b/app/src/main/java/com/nextcloud/client/database/dao/UploadDao.kt @@ -8,6 +8,8 @@ package com.nextcloud.client.database.dao import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy import androidx.room.Query import com.nextcloud.client.database.entity.UploadEntity import com.owncloud.android.db.ProviderMeta.ProviderTableMeta @@ -27,4 +29,20 @@ interface UploadDao { ProviderTableMeta.UPLOADS_ACCOUNT_NAME + " = :accountName" ) fun getUploadsByIds(ids: LongArray, accountName: String): List + + @Query( + "SELECT * FROM ${ProviderTableMeta.UPLOADS_TABLE_NAME} " + + "WHERE ${ProviderTableMeta.UPLOADS_REMOTE_PATH} = :remotePath LIMIT 1" + ) + fun getByRemotePath(remotePath: String): UploadEntity? + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun update(upload: UploadEntity) + + @Query( + "DELETE FROM ${ProviderTableMeta.UPLOADS_TABLE_NAME} " + + "WHERE ${ProviderTableMeta.UPLOADS_ACCOUNT_NAME} = :accountName " + + "AND ${ProviderTableMeta.UPLOADS_REMOTE_PATH} = :remotePath" + ) + fun deleteByAccountAndRemotePath(accountName: String, remotePath: String) } diff --git a/app/src/main/java/com/nextcloud/client/database/entity/UploadEntity.kt b/app/src/main/java/com/nextcloud/client/database/entity/UploadEntity.kt index 14177201ff73..13226cc1cc8a 100644 --- a/app/src/main/java/com/nextcloud/client/database/entity/UploadEntity.kt +++ b/app/src/main/java/com/nextcloud/client/database/entity/UploadEntity.kt @@ -32,7 +32,7 @@ data class UploadEntity( @ColumnInfo(name = ProviderTableMeta.UPLOADS_FILE_SIZE) val fileSize: Long?, @ColumnInfo(name = ProviderTableMeta.UPLOADS_STATUS) - val status: Int?, + var status: Int?, @ColumnInfo(name = ProviderTableMeta.UPLOADS_LOCAL_BEHAVIOUR) val localBehaviour: Int?, @ColumnInfo(name = ProviderTableMeta.UPLOADS_UPLOAD_TIME) diff --git a/app/src/main/java/com/nextcloud/client/di/AppComponent.java b/app/src/main/java/com/nextcloud/client/di/AppComponent.java index 462e257c8d53..8e1f599e5723 100644 --- a/app/src/main/java/com/nextcloud/client/di/AppComponent.java +++ b/app/src/main/java/com/nextcloud/client/di/AppComponent.java @@ -17,6 +17,7 @@ import com.nextcloud.client.jobs.JobsModule; import com.nextcloud.client.jobs.download.FileDownloadHelper; import com.nextcloud.client.jobs.offlineOperations.receiver.OfflineOperationReceiver; +import com.nextcloud.client.jobs.folderDownload.FolderDownloadWorkerReceiver; import com.nextcloud.client.jobs.upload.FileUploadBroadcastReceiver; import com.nextcloud.client.jobs.upload.FileUploadHelper; import com.nextcloud.client.media.BackgroundPlayerService; @@ -75,6 +76,8 @@ public interface AppComponent { void inject(OfflineOperationReceiver offlineOperationReceiver); + void inject(FolderDownloadWorkerReceiver folderDownloadWorkerReceiver); + @Component.Builder interface Builder { @BindsInstance diff --git a/app/src/main/java/com/nextcloud/client/documentscan/DocumentScanActivity.kt b/app/src/main/java/com/nextcloud/client/documentscan/DocumentScanActivity.kt index 241b0db6685f..daf9487bd8a0 100644 --- a/app/src/main/java/com/nextcloud/client/documentscan/DocumentScanActivity.kt +++ b/app/src/main/java/com/nextcloud/client/documentscan/DocumentScanActivity.kt @@ -104,7 +104,7 @@ class DocumentScanActivity : true } android.R.id.home -> { - onBackPressed() + onBackPressedDispatcher.onBackPressed() true } else -> false diff --git a/app/src/main/java/com/nextcloud/client/etm/EtmActivity.kt b/app/src/main/java/com/nextcloud/client/etm/EtmActivity.kt index 9d5b72a43f7c..61fbe2736e2a 100644 --- a/app/src/main/java/com/nextcloud/client/etm/EtmActivity.kt +++ b/app/src/main/java/com/nextcloud/client/etm/EtmActivity.kt @@ -10,6 +10,7 @@ import android.content.Context import android.content.Intent import android.os.Bundle import android.view.MenuItem +import androidx.activity.OnBackPressedCallback import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import com.nextcloud.client.di.Injectable @@ -46,6 +47,7 @@ class EtmActivity : onPageChanged(it) } ) + handleOnBackPressed() } override fun onOptionsItemSelected(item: MenuItem): Boolean = when (item.itemId) { @@ -58,11 +60,17 @@ class EtmActivity : else -> super.onOptionsItemSelected(item) } - @Deprecated("Deprecated in Java") - override fun onBackPressed() { - if (!vm.onBackPressed()) { - super.onBackPressed() - } + private fun handleOnBackPressed() { + onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + val handledByVm = vm.onBackPressed() + + if (!handledByVm) { + isEnabled = false + onBackPressedDispatcher.onBackPressed() + } + } + }) } private fun onPageChanged(page: EtmMenuEntry?) { diff --git a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt index 0102d90bbe70..401fee165ac3 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt @@ -27,6 +27,7 @@ import com.nextcloud.client.jobs.autoUpload.FileSystemRepository import com.nextcloud.client.jobs.download.FileDownloadWorker import com.nextcloud.client.jobs.metadata.MetadataWorker import com.nextcloud.client.jobs.offlineOperations.OfflineOperationsWorker +import com.nextcloud.client.jobs.folderDownload.FolderDownloadWorker import com.nextcloud.client.jobs.upload.FileUploadWorker import com.nextcloud.client.logger.Logger import com.nextcloud.client.network.ConnectivityService @@ -102,6 +103,7 @@ class BackgroundJobFactory @Inject constructor( OfflineOperationsWorker::class -> createOfflineOperationsWorker(context, workerParameters) InternalTwoWaySyncWork::class -> createInternalTwoWaySyncWork(context, workerParameters) MetadataWorker::class -> createMetadataWorker(context, workerParameters) + FolderDownloadWorker::class -> createFolderDownloadWorker(context, workerParameters) else -> null // caller falls back to default factory } } @@ -287,4 +289,12 @@ class BackgroundJobFactory @Inject constructor( params, accountManager.user ) + + private fun createFolderDownloadWorker(context: Context, params: WorkerParameters): FolderDownloadWorker = + FolderDownloadWorker( + accountManager, + context, + viewThemeUtils.get(), + params + ) } diff --git a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt index 52a37d15c100..219de803ecda 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt @@ -140,12 +140,10 @@ interface BackgroundJobManager { fun startFilesUploadJob(user: User, uploadIds: LongArray, showSameFileAlreadyExistsNotification: Boolean) fun getFileUploads(user: User): LiveData> fun cancelFilesUploadJob(user: User) - fun isStartFileUploadJobScheduled(user: User): Boolean + fun isStartFileUploadJobScheduled(accountName: String): Boolean fun cancelFilesDownloadJob(user: User, fileId: Long) - fun isStartFileDownloadJobScheduled(user: User, fileId: Long): Boolean - @Suppress("LongParameterList") fun startFileDownloadJob( user: User, @@ -173,4 +171,6 @@ interface BackgroundJobManager { fun scheduleInternal2WaySync(intervalMinutes: Long) fun cancelAllFilesDownloadJobs() fun startMetadataSyncJob(currentDirPath: String) + fun downloadFolder(folder: OCFile, accountName: String) + fun cancelFolderDownload() } diff --git a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt index 1db570d4b064..d476a92b16cb 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt @@ -28,6 +28,7 @@ import com.nextcloud.client.di.Injectable import com.nextcloud.client.documentscan.GeneratePdfFromImagesWork import com.nextcloud.client.jobs.autoUpload.AutoUploadWorker import com.nextcloud.client.jobs.download.FileDownloadWorker +import com.nextcloud.client.jobs.folderDownload.FolderDownloadWorker import com.nextcloud.client.jobs.metadata.MetadataWorker import com.nextcloud.client.jobs.offlineOperations.OfflineOperationsWorker import com.nextcloud.client.jobs.upload.FileUploadHelper @@ -93,6 +94,7 @@ internal class BackgroundJobManagerImpl( const val JOB_PERIODIC_OFFLINE_OPERATIONS = "periodic_offline_operations" const val JOB_PERIODIC_HEALTH_STATUS = "periodic_health_status" const val JOB_IMMEDIATE_HEALTH_STATUS = "immediate_health_status" + const val JOB_DOWNLOAD_FOLDER = "download_folder" const val JOB_METADATA_SYNC = "metadata_sync" const val JOB_INTERNAL_TWO_WAY_SYNC = "internal_two_way_sync" @@ -635,10 +637,10 @@ internal class BackgroundJobManagerImpl( workManager.enqueue(request) } - private fun startFileUploadJobTag(user: User): String = JOB_FILES_UPLOAD + user.accountName + private fun startFileUploadJobTag(accountName: String): String = JOB_FILES_UPLOAD + accountName - override fun isStartFileUploadJobScheduled(user: User): Boolean = - workManager.isWorkScheduled(startFileUploadJobTag(user)) + override fun isStartFileUploadJobScheduled(accountName: String): Boolean = + workManager.isWorkScheduled(startFileUploadJobTag(accountName)) /** * This method supports initiating uploads for various scenarios, including: @@ -656,7 +658,7 @@ internal class BackgroundJobManagerImpl( defaultDispatcherScope.launch { val batchSize = FileUploadHelper.MAX_FILE_COUNT val batches = uploadIds.toList().chunked(batchSize) - val tag = startFileUploadJobTag(user) + val tag = startFileUploadJobTag(user.accountName) val constraints = Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) @@ -702,9 +704,6 @@ internal class BackgroundJobManagerImpl( private fun startFileDownloadJobTag(user: User, fileId: Long): String = JOB_FOLDER_DOWNLOAD + user.accountName + fileId - override fun isStartFileDownloadJobScheduled(user: User, fileId: Long): Boolean = - workManager.isWorkScheduled(startFileDownloadJobTag(user, fileId)) - override fun startFileDownloadJob( user: User, file: OCFile, @@ -824,4 +823,28 @@ internal class BackgroundJobManagerImpl( workManager.enqueueUniquePeriodicWork(JOB_INTERNAL_TWO_WAY_SYNC, ExistingPeriodicWorkPolicy.UPDATE, request) } + + override fun downloadFolder(folder: OCFile, accountName: String) { + val constraints = Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .setRequiresStorageNotLow(true) + .build() + + val data = Data.Builder() + .putLong(FolderDownloadWorker.FOLDER_ID, folder.fileId) + .putString(FolderDownloadWorker.ACCOUNT_NAME, accountName) + .build() + + val request = oneTimeRequestBuilder(FolderDownloadWorker::class, JOB_DOWNLOAD_FOLDER) + .addTag(JOB_DOWNLOAD_FOLDER) + .setInputData(data) + .setConstraints(constraints) + .build() + + workManager.enqueueUniqueWork(JOB_DOWNLOAD_FOLDER, ExistingWorkPolicy.APPEND_OR_REPLACE, request) + } + + override fun cancelFolderDownload() { + workManager.cancelAllWorkByTag(JOB_DOWNLOAD_FOLDER) + } } diff --git a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadHelper.kt b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadHelper.kt index 6f1f96cbf5b8..76f4b99ae7b3 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadHelper.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadHelper.kt @@ -9,10 +9,12 @@ package com.nextcloud.client.jobs.download import com.nextcloud.client.account.User import com.nextcloud.client.jobs.BackgroundJobManager +import com.nextcloud.client.jobs.folderDownload.FolderDownloadWorker import com.owncloud.android.MainApp import com.owncloud.android.datamodel.FileDataStorageManager import com.owncloud.android.datamodel.OCFile import com.owncloud.android.datamodel.UploadsStorageManager +import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.operations.DownloadFileOperation import com.owncloud.android.operations.DownloadType import com.owncloud.android.utils.MimeTypeUtil @@ -29,6 +31,7 @@ class FileDownloadHelper { companion object { private var instance: FileDownloadHelper? = null + private const val TAG = "FileDownloadHelper" fun instance(): FileDownloadHelper = instance ?: synchronized(this) { instance ?: FileDownloadHelper().also { instance = it } @@ -44,17 +47,11 @@ class FileDownloadHelper { return false } - val fileStorageManager = FileDataStorageManager(user, MainApp.getAppContext().contentResolver) - val topParentId = fileStorageManager.getTopParentId(file) - - val isJobScheduled = backgroundJobManager.isStartFileDownloadJobScheduled(user, file.fileId) - return isJobScheduled || - if (file.isFolder) { - FileDownloadWorker.isDownloadingFolder(file.fileId) && - backgroundJobManager.isStartFileDownloadJobScheduled(user, topParentId) - } else { - FileDownloadWorker.isDownloading(user.accountName, file.fileId) - } + return if (file.isFolder) { + FolderDownloadWorker.isDownloading(file.fileId) + } else { + FileDownloadWorker.isDownloading(user.accountName, file.fileId) + } } fun cancelPendingOrCurrentDownloads(user: User?, files: List?) { @@ -141,4 +138,14 @@ class FileDownloadHelper { conflictUploadId ) } + + fun downloadFolder(folder: OCFile?, accountName: String) { + if (folder == null) { + Log_OC.e(TAG, "folder cannot be null, cant sync") + return + } + backgroundJobManager.downloadFolder(folder, accountName) + } + + fun cancelFolderDownload() = backgroundJobManager.cancelFolderDownload() } diff --git a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadWorker.kt index b03db62568e6..e160e1dd4558 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/download/FileDownloadWorker.kt @@ -24,7 +24,6 @@ import com.nextcloud.client.account.UserAccountManager import com.nextcloud.model.WorkerState import com.nextcloud.model.WorkerStateLiveData import com.nextcloud.utils.ForegroundServiceHelper -import com.nextcloud.utils.extensions.getParentIdsOfSubfiles import com.nextcloud.utils.extensions.getPercent import com.owncloud.android.R import com.owncloud.android.datamodel.FileDataStorageManager @@ -45,7 +44,6 @@ import com.owncloud.android.utils.theme.ViewThemeUtils import java.util.AbstractList import java.util.Optional import java.util.Vector -import java.util.concurrent.ConcurrentHashMap import kotlin.random.Random @Suppress("LongParameterList", "TooManyFunctions") @@ -63,7 +61,6 @@ class FileDownloadWorker( private val TAG = FileDownloadWorker::class.java.simpleName private val pendingDownloads = IndexedForest() - private val pendingFolderDownloads: MutableSet = ConcurrentHashMap.newKeySet() fun cancelOperation(accountName: String, fileId: Long) { pendingDownloads.all.forEach { @@ -75,8 +72,6 @@ class FileDownloadWorker( it.value?.payload?.isMatching(accountName, fileId) == true } - fun isDownloadingFolder(id: Long): Boolean = pendingFolderDownloads.contains(id) - const val FILE_REMOTE_PATH = "FILE_REMOTE_PATH" const val ACCOUNT_NAME = "ACCOUNT_NAME" const val BEHAVIOUR = "BEHAVIOUR" @@ -170,10 +165,6 @@ class FileDownloadWorker( private fun getRequestDownloads(ocFile: OCFile): AbstractList { val files = getFiles(ocFile) - val filesPaths = files.map { it.remotePath } - val parentIdsOfSubFiles = fileDataStorageManager?.getParentIdsOfSubfiles(filesPaths) ?: listOf() - pendingFolderDownloads.addAll(parentIdsOfSubFiles) - val downloadType = getDownloadType() conflictUploadId = inputData.keyValueMap[CONFLICT_UPLOAD_ID] as Long? @@ -328,7 +319,6 @@ class FileDownloadWorker( currentDownload?.user?.accountName, currentDownload?.remotePath ) - pendingFolderDownloads.remove(currentDownload?.file?.parentId) val downloadResult = result ?: RemoteOperationResult(RuntimeException("Error downloading…")) diff --git a/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorker.kt new file mode 100644 index 000000000000..1ef24562c165 --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorker.kt @@ -0,0 +1,167 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.nextcloud.client.jobs.folderDownload + +import android.content.Context +import androidx.work.CoroutineWorker +import androidx.work.WorkerParameters +import com.nextcloud.client.account.UserAccountManager +import com.nextcloud.client.jobs.download.FileDownloadHelper +import com.owncloud.android.datamodel.FileDataStorageManager +import com.owncloud.android.datamodel.OCFile +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory +import com.owncloud.android.lib.common.utils.Log_OC +import com.owncloud.android.operations.DownloadFileOperation +import com.owncloud.android.operations.DownloadType +import com.owncloud.android.ui.helpers.FileOperationsHelper +import com.owncloud.android.utils.theme.ViewThemeUtils +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.util.concurrent.ConcurrentHashMap + +@Suppress("LongMethod") +class FolderDownloadWorker( + private val accountManager: UserAccountManager, + private val context: Context, + private val viewThemeUtils: ViewThemeUtils, + params: WorkerParameters +) : CoroutineWorker(context, params) { + + companion object { + private const val TAG = "📂" + "FolderDownloadWorker" + const val FOLDER_ID = "FOLDER_ID" + const val ACCOUNT_NAME = "ACCOUNT_NAME" + + private val pendingDownloads: MutableSet = ConcurrentHashMap.newKeySet() + + fun isDownloading(id: Long): Boolean = pendingDownloads.contains(id) + } + + private var notificationManager: FolderDownloadWorkerNotificationManager? = null + private lateinit var storageManager: FileDataStorageManager + + @Suppress("TooGenericExceptionCaught", "ReturnCount", "DEPRECATION") + override suspend fun doWork(): Result { + val folderID = inputData.getLong(FOLDER_ID, -1) + if (folderID == -1L) { + return Result.failure() + } + + val accountName = inputData.getString(ACCOUNT_NAME) + if (accountName == null) { + Log_OC.e(TAG, "failed accountName cannot be null") + return Result.failure() + } + + val optionalUser = accountManager.getUser(accountName) + if (optionalUser.isEmpty) { + Log_OC.e(TAG, "failed user is not present") + return Result.failure() + } + + val user = optionalUser.get() + storageManager = FileDataStorageManager(user, context.contentResolver) + val folder = storageManager.getFileById(folderID) + if (folder == null) { + Log_OC.e(TAG, "failed folder cannot be nul") + return Result.failure() + } + + notificationManager = FolderDownloadWorkerNotificationManager(context, viewThemeUtils) + + Log_OC.d(TAG, "🕒 started for ${user.accountName} downloading ${folder.fileName}") + + val foregroundInfo = notificationManager?.getForegroundInfo(folder) ?: return Result.failure() + setForeground(foregroundInfo) + + pendingDownloads.add(folder.fileId) + + val downloadHelper = FileDownloadHelper.instance() + + return withContext(Dispatchers.IO) { + try { + val files = getFiles(folder, storageManager) + val account = user.toOwnCloudAccount() + val client = OwnCloudClientManagerFactory.getDefaultSingleton().getClientFor(account, context) + + var result = true + files.forEachIndexed { index, file -> + if (!checkDiskSize(file)) { + return@withContext Result.failure() + } + + withContext(Dispatchers.Main) { + notificationManager?.showProgressNotification( + folder.fileName, + file.fileName, + index, + files.size + ) + } + + val operation = DownloadFileOperation(user, file, context) + val operationResult = operation.execute(client) + if (operationResult?.isSuccess == true && operation.downloadType === DownloadType.DOWNLOAD) { + getOCFile(operation)?.let { ocFile -> + downloadHelper.saveFile(ocFile, operation, storageManager) + } + } + + if (!operationResult.isSuccess) { + result = false + } + } + + withContext(Dispatchers.Main) { + notificationManager?.showCompletionMessage(folder.fileName, result) + } + + if (result) { + Log_OC.d(TAG, "✅ completed") + Result.success() + } else { + Log_OC.d(TAG, "❌ failed") + Result.failure() + } + } catch (e: Exception) { + Log_OC.d(TAG, "❌ failed reason: $e") + Result.failure() + } finally { + pendingDownloads.remove(folder.fileId) + notificationManager?.dismiss() + } + } + } + + private fun getOCFile(operation: DownloadFileOperation): OCFile? { + val file = operation.file?.fileId?.let { storageManager.getFileById(it) } + ?: storageManager.getFileByDecryptedRemotePath(operation.file?.remotePath) + ?: run { + Log_OC.e(TAG, "could not save ${operation.file?.remotePath}") + return null + } + + return file + } + + private fun getFiles(folder: OCFile, storageManager: FileDataStorageManager): List = + storageManager.getFolderContent(folder, false) + .filter { !it.isFolder && !it.isDown } + + private suspend fun checkDiskSize(file: OCFile): Boolean { + val fileSizeInByte = file.fileLength + val availableDiskSpace = FileOperationsHelper.getAvailableSpaceOnDevice() + + return if (availableDiskSpace < fileSizeInByte) { + notificationManager?.showNotAvailableDiskSpace() + false + } else { + true + } + } +} diff --git a/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorkerNotificationManager.kt b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorkerNotificationManager.kt new file mode 100644 index 000000000000..6b2a1f4bb361 --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorkerNotificationManager.kt @@ -0,0 +1,113 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.nextcloud.client.jobs.folderDownload + +import android.app.Notification +import android.app.PendingIntent +import android.content.Context +import android.content.Intent +import androidx.work.ForegroundInfo +import com.nextcloud.client.jobs.notification.WorkerNotificationManager +import com.nextcloud.utils.ForegroundServiceHelper +import com.owncloud.android.R +import com.owncloud.android.datamodel.ForegroundServiceType +import com.owncloud.android.datamodel.OCFile +import com.owncloud.android.ui.notifications.NotificationUtils +import com.owncloud.android.utils.theme.ViewThemeUtils +import kotlinx.coroutines.delay +import kotlin.random.Random + +class FolderDownloadWorkerNotificationManager(private val context: Context, viewThemeUtils: ViewThemeUtils) : + WorkerNotificationManager( + id = NOTIFICATION_ID, + context, + viewThemeUtils, + tickerId = R.string.folder_download_worker_ticker_id, + channelId = NotificationUtils.NOTIFICATION_CHANNEL_DOWNLOAD + ) { + + companion object { + private const val NOTIFICATION_ID = 391 + private const val MAX_PROGRESS = 100 + private const val DELAY = 1000L + } + + private fun getNotification(title: String, description: String? = null, progress: Int? = null): Notification = + notificationBuilder.apply { + setSmallIcon(R.drawable.ic_sync) + setContentTitle(title) + clearActions() + + description?.let { + setContentText(description) + } + + progress?.let { + setProgress(MAX_PROGRESS, progress, false) + addAction( + android.R.drawable.ic_menu_close_clear_cancel, + context.getString(R.string.common_cancel), + getCancelPendingIntent() + ) + } + + setAutoCancel(true) + }.build() + + private fun getCancelPendingIntent(): PendingIntent { + val intent = Intent(context, FolderDownloadWorkerReceiver::class.java) + + return PendingIntent.getBroadcast( + context, + Random.nextInt(), + intent, + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + } + + fun showProgressNotification(folderName: String, filename: String, currentIndex: Int, totalFileSize: Int) { + val currentFileIndex = (currentIndex + 1) + val description = context.getString(R.string.folder_download_counter, currentFileIndex, totalFileSize, filename) + val progress = (currentFileIndex * MAX_PROGRESS) / totalFileSize + val notification = getNotification(title = folderName, description = description, progress = progress) + notificationManager.notify(NOTIFICATION_ID, notification) + } + + suspend fun showCompletionMessage(folderName: String, success: Boolean) { + val title = if (success) { + context.getString(R.string.folder_download_success_notification_title, folderName) + } else { + context.getString(R.string.folder_download_error_notification_title, folderName) + } + + val notification = getNotification(title = title) + notificationManager.notify(NOTIFICATION_ID, notification) + + delay(DELAY) + dismiss() + } + + fun getForegroundInfo(folder: OCFile): ForegroundInfo = ForegroundServiceHelper.createWorkerForegroundInfo( + NOTIFICATION_ID, + getNotification(folder.fileName, progress = 0), + ForegroundServiceType.DataSync + ) + + suspend fun showNotAvailableDiskSpace() { + val title = context.getString(R.string.folder_download_insufficient_disk_space_notification_title) + val notification = getNotification(title) + notificationManager.notify(NOTIFICATION_ID, notification) + + delay(DELAY) + dismiss() + } + + fun dismiss() { + notificationManager.cancel(NOTIFICATION_ID) + } +} diff --git a/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorkerReceiver.kt b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorkerReceiver.kt new file mode 100644 index 000000000000..399c1ccb868e --- /dev/null +++ b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorkerReceiver.kt @@ -0,0 +1,25 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.nextcloud.client.jobs.folderDownload + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.nextcloud.client.jobs.BackgroundJobManager +import com.owncloud.android.MainApp +import javax.inject.Inject + +class FolderDownloadWorkerReceiver : BroadcastReceiver() { + @Inject + lateinit var backgroundJobManager: BackgroundJobManager + + override fun onReceive(context: Context, intent: Intent) { + MainApp.getAppComponent().inject(this) + backgroundJobManager.cancelFolderDownload() + } +} diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt index 03110f0f6309..e7df3abcf3c5 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt @@ -40,8 +40,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.io.File -import java.util.concurrent.CompletableFuture -import java.util.concurrent.ExecutionException import java.util.concurrent.Semaphore import javax.inject.Inject @@ -220,44 +218,20 @@ class FileUploadHelper { } fun removeFileUpload(remotePath: String, accountName: String) { - try { - val user = accountManager.getUser(accountName).get() - - // need to update now table in mUploadsStorageManager, - // since the operation will not get to be run by FileUploader#uploadFile - uploadsStorageManager.removeUpload(accountName, remotePath) - val uploadIds = uploadsStorageManager.getCurrentUploadIds(user.accountName) - cancelAndRestartUploadJob(user, uploadIds) - } catch (e: NoSuchElementException) { - Log_OC.e(TAG, "Error cancelling current upload because user does not exist!: " + e.message) - } + uploadsStorageManager.uploadDao.deleteByAccountAndRemotePath(accountName, remotePath) } - fun cancelFileUpload(remotePath: String, accountName: String) { + fun setStatusOfUploadToCancel(remotePath: String) { ioScope.launch { - val upload = uploadsStorageManager.getUploadByRemotePath(remotePath) - if (upload != null) { - cancelFileUploads(listOf(upload), accountName) - } else { - Log_OC.e(TAG, "Error cancelling current upload because upload does not exist!") + uploadsStorageManager.run { + uploadDao.getByRemotePath(remotePath)?.let { entity -> + entity.status = UploadStatus.UPLOAD_CANCELLED.value + uploadDao.update(entity) + } } } } - fun cancelFileUploads(uploads: List, accountName: String) { - for (upload in uploads) { - upload.uploadStatus = UploadStatus.UPLOAD_CANCELLED - uploadsStorageManager.updateUpload(upload) - } - - try { - val user = accountManager.getUser(accountName).get() - cancelAndRestartUploadJob(user, uploads.getUploadIds()) - } catch (e: NoSuchElementException) { - Log_OC.e(TAG, "Error restarting upload job because user does not exist!: " + e.message) - } - } - fun cancelAndRestartUploadJob(user: User, uploadIds: LongArray) { backgroundJobManager.run { cancelFilesUploadJob(user) @@ -266,26 +240,16 @@ class FileUploadHelper { } @Suppress("ReturnCount") - fun isUploading(user: User?, file: OCFile?): Boolean { - if (user == null || file == null || !backgroundJobManager.isStartFileUploadJobScheduled(user)) { + fun isUploading(remotePath: String?, accountName: String?): Boolean { + accountName ?: return false + if (!backgroundJobManager.isStartFileUploadJobScheduled(accountName)) { return false } - val uploadCompletableFuture = CompletableFuture.supplyAsync { - uploadsStorageManager.getUploadByRemotePath(file.remotePath) - } - return try { - val upload = uploadCompletableFuture.get() - if (upload != null) { - upload.uploadStatus == UploadStatus.UPLOAD_IN_PROGRESS - } else { - false - } - } catch (e: ExecutionException) { - false - } catch (e: InterruptedException) { - false - } + remotePath ?: return false + val upload = uploadsStorageManager.uploadDao.getByRemotePath(remotePath) + return upload?.status == UploadStatus.UPLOAD_IN_PROGRESS.value || + FileUploadWorker.isUploading(remotePath, accountName) } private fun checkConnectivity(connectivityService: ConnectivityService): Boolean { @@ -474,7 +438,9 @@ class FileUploadHelper { return } - instance().cancelFileUpload(remotePath, accountName) + FileUploadWorker.cancelCurrentUpload(remotePath, accountName, onCompleted = { + instance().setStatusOfUploadToCancel(remotePath) + }) } } } diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt index 37dd12fdd601..5f5b1c73efc9 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt @@ -7,10 +7,12 @@ */ package com.nextcloud.client.jobs.upload +import android.app.Notification import android.app.PendingIntent import android.content.Context +import androidx.core.app.NotificationCompat import androidx.localbroadcastmanager.content.LocalBroadcastManager -import androidx.work.Worker +import androidx.work.CoroutineWorker import androidx.work.WorkerParameters import com.nextcloud.client.account.User import com.nextcloud.client.account.UserAccountManager @@ -21,8 +23,11 @@ import com.nextcloud.client.network.ConnectivityService import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.model.WorkerState import com.nextcloud.model.WorkerStateLiveData +import com.nextcloud.utils.ForegroundServiceHelper import com.nextcloud.utils.extensions.getPercent +import com.owncloud.android.R import com.owncloud.android.datamodel.FileDataStorageManager +import com.owncloud.android.datamodel.ForegroundServiceType import com.owncloud.android.datamodel.ThumbnailsCacheManager import com.owncloud.android.datamodel.UploadsStorageManager import com.owncloud.android.db.OCUpload @@ -34,8 +39,12 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.operations.UploadFileOperation +import com.owncloud.android.ui.notifications.NotificationUtils import com.owncloud.android.utils.ErrorMessageAdapter import com.owncloud.android.utils.theme.ViewThemeUtils +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ensureActive +import kotlinx.coroutines.withContext import java.io.File import kotlin.random.Random @@ -51,7 +60,7 @@ class FileUploadWorker( val preferences: AppPreferences, val context: Context, params: WorkerParameters -) : Worker(context, params), +) : CoroutineWorker(context, params), OnDatatransferProgressListener { companion object { @@ -91,19 +100,44 @@ class FileUploadWorker( fun getUploadStartMessage(): String = FileUploadWorker::class.java.name + UPLOAD_START_MESSAGE fun getUploadFinishMessage(): String = FileUploadWorker::class.java.name + UPLOAD_FINISH_MESSAGE + + fun cancelCurrentUpload(remotePath: String, accountName: String, onCompleted: () -> Unit) { + currentUploadFileOperation?.let { + if (it.remotePath == remotePath && it.user.accountName == accountName) { + it.cancel(ResultCode.USER_CANCELLED) + onCompleted() + } + } + } + + fun isUploading(remotePath: String?, accountName: String?): Boolean { + currentUploadFileOperation?.let { + return it.remotePath == remotePath && it.user.accountName == accountName + } + + return false + } } private var lastPercent = 0 - private val notificationManager = UploadNotificationManager(context, viewThemeUtils, Random.nextInt()) + private val notificationId = Random.nextInt() + private val notificationManager = UploadNotificationManager(context, viewThemeUtils, notificationId) private val intents = FileUploaderIntents(context) private val fileUploaderDelegate = FileUploaderDelegate() @Suppress("TooGenericExceptionCaught") - override fun doWork(): Result = try { + override suspend fun doWork(): Result = try { Log_OC.d(TAG, "FileUploadWorker started") - backgroundJobManager.logStartOfWorker(BackgroundJobManagerImpl.formatClassTag(this::class)) + val workerName = BackgroundJobManagerImpl.formatClassTag(this::class) + backgroundJobManager.logStartOfWorker(workerName) + + val notificationTitle = notificationManager.currentOperationTitle + ?: context.getString(R.string.foreground_service_upload) + val notification = createNotification(notificationTitle) + updateForegroundInfo(notification) + val result = uploadFiles() - backgroundJobManager.logEndOfWorker(BackgroundJobManagerImpl.formatClassTag(this::class), result) + backgroundJobManager.logEndOfWorker(workerName, result) notificationManager.dismissNotification() if (result == Result.success()) { setIdleWorkerState() @@ -111,17 +145,37 @@ class FileUploadWorker( result } catch (t: Throwable) { Log_OC.e(TAG, "Error caught at FileUploadWorker $t") + cleanup() Result.failure() } - override fun onStopped() { + private suspend fun updateForegroundInfo(notification: Notification) { + val foregroundInfo = ForegroundServiceHelper.createWorkerForegroundInfo( + notificationId, + notification, + ForegroundServiceType.DataSync + ) + setForeground(foregroundInfo) + } + + private fun createNotification(title: String): Notification = + NotificationCompat.Builder(context, NotificationUtils.NOTIFICATION_CHANNEL_UPLOAD) + .setContentTitle(title) + .setSmallIcon(R.drawable.uploads) + .setOngoing(true) + .setSound(null) + .setVibrate(null) + .setOnlyAlertOnce(true) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setSilent(true) + .build() + + private fun cleanup() { Log_OC.e(TAG, "FileUploadWorker stopped") setIdleWorkerState() currentUploadFileOperation?.cancel(null) notificationManager.dismissNotification() - - super.onStopped() } private fun setWorkerState(user: User?) { @@ -133,36 +187,36 @@ class FileUploadWorker( } @Suppress("ReturnCount", "LongMethod") - private fun uploadFiles(): Result { + private suspend fun uploadFiles(): Result = withContext(Dispatchers.IO) { val accountName = inputData.getString(ACCOUNT) if (accountName == null) { Log_OC.e(TAG, "accountName is null") - return Result.failure() + return@withContext Result.failure() } val uploadIds = inputData.getLongArray(UPLOAD_IDS) if (uploadIds == null) { Log_OC.e(TAG, "uploadIds is null") - return Result.failure() + return@withContext Result.failure() } val currentBatchIndex = inputData.getInt(CURRENT_BATCH_INDEX, -1) if (currentBatchIndex == -1) { Log_OC.e(TAG, "currentBatchIndex is -1, cancelling") - return Result.failure() + return@withContext Result.failure() } val totalUploadSize = inputData.getInt(TOTAL_UPLOAD_SIZE, -1) if (totalUploadSize == -1) { Log_OC.e(TAG, "totalUploadSize is -1, cancelling") - return Result.failure() + return@withContext Result.failure() } // since worker's policy is append or replace and account name comes from there no need check in the loop val optionalUser = userAccountManager.getUser(accountName) if (!optionalUser.isPresent) { Log_OC.e(TAG, "User not found for account: $accountName") - return Result.failure() + return@withContext Result.failure() } val user = optionalUser.get() @@ -172,21 +226,19 @@ class FileUploadWorker( val client = OwnCloudClientManagerFactory.getDefaultSingleton().getClientFor(ocAccount, context) for ((index, upload) in uploads.withIndex()) { + ensureActive() + if (preferences.isGlobalUploadPaused) { Log_OC.d(TAG, "Upload is paused, skip uploading files!") notificationManager.notifyPaused( intents.notificationStartIntent(null) ) - return Result.success() + return@withContext Result.success() } if (canExitEarly()) { notificationManager.showConnectionErrorNotification() - return Result.failure() - } - - if (isStopped) { - continue + return@withContext Result.failure() } setWorkerState(user) @@ -203,12 +255,14 @@ class FileUploadWorker( totalUploadSize = totalUploadSize ) - val result = upload(operation, user, client) + val result = withContext(Dispatchers.IO) { + upload(operation, user, client) + } currentUploadFileOperation = null sendUploadFinishEvent(totalUploadSize, currentUploadIndex, operation, result) } - return Result.success() + return@withContext Result.success() } private fun sendUploadFinishEvent( @@ -346,6 +400,10 @@ class FileUploadWorker( return } + if (uploadResult.code == ResultCode.USER_CANCELLED) { + return + } + notificationManager.run { val errorMessage = ErrorMessageAdapter.getErrorCauseMessage( uploadResult, diff --git a/app/src/main/java/com/nextcloud/client/onboarding/WhatsNewActivity.kt b/app/src/main/java/com/nextcloud/client/onboarding/WhatsNewActivity.kt index a824c7ca41b1..dd51319fc54f 100644 --- a/app/src/main/java/com/nextcloud/client/onboarding/WhatsNewActivity.kt +++ b/app/src/main/java/com/nextcloud/client/onboarding/WhatsNewActivity.kt @@ -132,6 +132,7 @@ class WhatsNewActivity : object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { onFinish() + isEnabled = false onBackPressedDispatcher.onBackPressed() } } diff --git a/app/src/main/java/com/nextcloud/ui/fileactions/FileAction.kt b/app/src/main/java/com/nextcloud/ui/fileactions/FileAction.kt index f66521e5a407..6e265a2a7cd8 100644 --- a/app/src/main/java/com/nextcloud/ui/fileactions/FileAction.kt +++ b/app/src/main/java/com/nextcloud/ui/fileactions/FileAction.kt @@ -39,8 +39,8 @@ enum class FileAction( // Uploads and downloads DOWNLOAD_FILE(R.id.action_download_file, R.string.filedetails_download, R.drawable.ic_cloud_download), - SYNC_FILE(R.id.action_sync_file, R.string.filedetails_sync_file, R.drawable.ic_cloud_sync_on), - CANCEL_SYNC(R.id.action_cancel_sync, R.string.common_cancel_sync, R.drawable.ic_cloud_sync_off), + DOWNLOAD_FOLDER(R.id.action_sync_file, R.string.filedetails_sync_file, R.drawable.ic_sync), + CANCEL_SYNC(R.id.action_cancel_sync, R.string.common_cancel_sync, R.drawable.ic_sync_off), // File sharing EXPORT_FILE(R.id.action_export_file, R.string.filedetails_export, R.drawable.ic_export), @@ -84,7 +84,7 @@ enum class FileAction( SEND_SHARE_FILE, SEND_FILE, OPEN_FILE_WITH, - SYNC_FILE, + DOWNLOAD_FOLDER, CANCEL_SYNC, SELECT_ALL, SELECT_NONE, diff --git a/app/src/main/java/com/nextcloud/utils/FileHelper.kt b/app/src/main/java/com/nextcloud/utils/FileHelper.kt new file mode 100644 index 000000000000..e417f88bb00e --- /dev/null +++ b/app/src/main/java/com/nextcloud/utils/FileHelper.kt @@ -0,0 +1,67 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2025 Alper Ozturk + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +package com.nextcloud.utils + +import com.owncloud.android.lib.common.utils.Log_OC +import java.io.File +import java.io.IOException +import java.nio.file.Files +import java.nio.file.Path +import java.util.stream.Collectors +import kotlin.io.path.pathString + +@Suppress("NestedBlockDepth") +object FileHelper { + private const val TAG = "FileHelper" + + fun listDirectoryEntries(directory: File?, startIndex: Int, maxItems: Int, fetchFolders: Boolean): List { + if (directory == null || !directory.exists() || !directory.isDirectory) return emptyList() + + return try { + Files.list(directory.toPath()) + .map { it.toFile() } + .filter { file -> if (fetchFolders) file.isDirectory else !file.isDirectory } + .skip(startIndex.toLong()) + .limit(maxItems.toLong()) + .collect(Collectors.toList()) + } catch (e: IOException) { + Log_OC.d(TAG, "listDirectoryEntries: $e") + emptyList() + } + } + + fun listFilesRecursive(files: Collection): List { + val result = mutableListOf() + + for (file in files) { + try { + collectFilesRecursively(file.toPath(), result) + } catch (e: IOException) { + Log_OC.e(TAG, "Error collecting files recursively from: ${file.absolutePath}", e) + } + } + + return result + } + + private fun collectFilesRecursively(path: Path, result: MutableList) { + if (Files.isDirectory(path)) { + try { + Files.newDirectoryStream(path).use { stream -> + for (entry in stream) { + collectFilesRecursively(entry, result) + } + } + } catch (e: IOException) { + Log_OC.e(TAG, "Error reading directory: ${path.pathString}", e) + } + } else { + result.add(path.pathString) + } + } +} diff --git a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt index d09660301611..899d9ed5a241 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/DrawerActivityExtensions.kt @@ -1,7 +1,7 @@ /* * Nextcloud - Android Client * - * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-FileCopyrightText: 2025 Alper Ozturk * SPDX-License-Identifier: AGPL-3.0-or-later */ @@ -10,22 +10,10 @@ package com.nextcloud.utils.extensions import android.content.Intent import com.owncloud.android.MainApp import com.owncloud.android.R -import com.owncloud.android.datamodel.OCFile import com.owncloud.android.ui.activity.DrawerActivity import com.owncloud.android.ui.activity.FileDisplayActivity -@Suppress("ReturnCount") -fun DrawerActivity.handleBackButtonEvent(currentDir: OCFile): Boolean { - if (DrawerActivity.menuItemId == R.id.nav_all_files && currentDir.isRootDirectory) { - moveTaskToBack(true) - return true - } - - val isParentDirExists = (storageManager.getFileById(currentDir.parentId) != null) - if (isParentDirExists) { - return false - } - +fun DrawerActivity.navigateToAllFiles() { DrawerActivity.menuItemId = R.id.nav_all_files setNavigationViewItemChecked() @@ -38,6 +26,4 @@ fun DrawerActivity.handleBackButtonEvent(currentDir: OCFile): Boolean { }.run { startActivity(this) } - - return true } diff --git a/app/src/main/java/com/nextcloud/utils/extensions/FileDataStorageManagerExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/FileDataStorageManagerExtensions.kt index bdb12354047e..2fec3fcc12d8 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/FileDataStorageManagerExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/FileDataStorageManagerExtensions.kt @@ -15,9 +15,6 @@ fun FileDataStorageManager.searchFilesByName(file: OCFile, accountName: String, createFileInstance(it) } -fun FileDataStorageManager.getParentIdsOfSubfiles(paths: List): List = - fileDao.getParentIdsOfSubfiles(paths) - fun FileDataStorageManager.getDecryptedPath(file: OCFile): String { val paths = mutableListOf() var entity = fileDao.getFileByEncryptedRemotePath(file.remotePath, user.accountName) diff --git a/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java b/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java index d7b2982b1940..9978005ef2a0 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java @@ -414,6 +414,7 @@ public OCUpload getPendingCurrentOrFailedUpload(OCUpload upload) { return null; } + @Nullable public OCUpload getUploadByRemotePath(String remotePath) { OCUpload result = null; try (Cursor cursor = getDB().query( @@ -797,7 +798,7 @@ public void updateDatabaseUploadResult(RemoteOperationResult uploadResult, Uploa upload.getRemotePath(), localPath ); - } else { + } else if (uploadResult.getCode() != RemoteOperationResult.ResultCode.USER_CANCELLED){ updateUploadStatus( upload.getOCUploadId(), UploadStatus.UPLOAD_FAILED, diff --git a/app/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/app/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 3b9199e95be5..6665598c0a4b 100644 --- a/app/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/app/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -434,7 +434,7 @@ private boolean anyFileDownloading() { private boolean anyFileUploading() { for (OCFile file : files) { - if (FileUploadHelper.Companion.instance().isUploading(user, file)) { + if (FileUploadHelper.Companion.instance().isUploading(file.getRemotePath(), user.getAccountName())) { return true; } } diff --git a/app/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java b/app/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java index 20a75f51cf48..2b5829675385 100644 --- a/app/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java +++ b/app/src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java @@ -28,7 +28,6 @@ import com.owncloud.android.lib.resources.files.ReadFileRemoteOperation; import com.owncloud.android.lib.resources.files.ReadFolderRemoteOperation; import com.owncloud.android.lib.resources.files.model.RemoteFile; -import com.owncloud.android.lib.resources.status.E2EVersion; import com.owncloud.android.operations.common.SyncOperation; import com.owncloud.android.services.OperationsService; import com.owncloud.android.utils.FileStorageUtils; @@ -485,7 +484,7 @@ private void startDirectDownloads() { Log_OC.d(TAG, "Exception caught at startDirectDownloads" + e); } } else { - mFilesForDirectDownload.forEach(file -> fileDownloadHelper.downloadFile(user, file)); + fileDownloadHelper.downloadFolder(mLocalFolder, user.getAccountName()); } } diff --git a/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java b/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java index ed422d506309..65a32ff8cab1 100644 --- a/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java +++ b/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java @@ -79,12 +79,11 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.RandomAccessFile; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.nio.channels.OverlappingFileLockException; +import java.nio.file.Files; +import java.nio.file.Paths; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; @@ -1435,21 +1434,37 @@ private static boolean existsFile(OwnCloudClient client, } /** - * Allows to cancel the actual upload operation. If actual upload operating is in progress it is cancelled, if - * upload preparation is being performed upload will not take place. + * Cancels the current upload process. + * + *

+ * Behavior depends on the current state of the upload: + *

    + *
  • Upload in preparation: Upload will not start and a cancellation flag is set.
  • + *
  • Upload in progress: The ongoing upload operation is cancelled via + * {@link UploadFileRemoteOperation#cancel(ResultCode)}.
  • + *
  • No upload operation: A cancellation flag is still set, but this situation is unexpected + * and logged as an error.
  • + *
+ * + *

+ * Once cancelled, the database will be updated through + * {@link UploadsStorageManager#updateDatabaseUploadResult(RemoteOperationResult, UploadFileOperation)}. + * + * @param cancellationReason the reason for cancellation */ public void cancel(ResultCode cancellationReason) { - if (mUploadOperation == null) { + if (mUploadOperation != null) { + // Cancel an active upload + Log_OC.d(TAG, "Cancelling upload during actual upload operation."); + mUploadOperation.cancel(cancellationReason); + } else { + // Cancel while preparing or when no upload exists + mCancellationRequested.set(true); if (mUploadStarted.get()) { - Log_OC.d(TAG, "Cancelling upload during upload preparations."); - mCancellationRequested.set(true); + Log_OC.d(TAG, "Cancelling upload during preparation."); } else { - mCancellationRequested.set(true); Log_OC.e(TAG, "No upload in progress. This should not happen."); } - } else { - Log_OC.d(TAG, "Cancelling upload during actual upload operation."); - mUploadOperation.cancel(cancellationReason); } } diff --git a/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java b/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java index 6c1037324b92..f61121e8721e 100644 --- a/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java @@ -189,7 +189,7 @@ public void showActivitiesLoadError(String error) { } else { showEmptyContent(getString(R.string.server_not_reachable), getString(R.string.server_not_reachable_content)); - binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_cloud_sync_off); + binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_sync_off); } }); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 29aa804614f2..2b0d1c0d2c2e 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -31,6 +31,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; +import android.os.PersistableBundle; import android.os.SystemClock; import android.text.TextUtils; import android.view.Menu; @@ -115,6 +116,7 @@ import javax.inject.Inject; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.IdRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -206,6 +208,12 @@ public abstract class DrawerActivity extends ToolbarActivity @Inject ClientFactory clientFactory; + @Override + public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) { + super.onCreate(savedInstanceState, persistentState); + addOnBackPressedCallback(); + } + /** * Initializes the drawer and its content. This method needs to be called after the content view has been set. */ @@ -1153,19 +1161,24 @@ public void onConfigurationChanged(@NonNull Configuration newConfig) { } } - @Override - public void onBackPressed() { - if (isDrawerOpen()) { - closeDrawer(); - return; - } - Fragment fileDetailsSharingProcessFragment = - getSupportFragmentManager().findFragmentByTag(FileDetailsSharingProcessFragment.TAG); - if (fileDetailsSharingProcessFragment != null) { - ((FileDetailsSharingProcessFragment) fileDetailsSharingProcessFragment).onBackPressed(); - } else { - super.onBackPressed(); - } + public void addOnBackPressedCallback() { + getOnBackPressedDispatcher().addCallback(new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (isDrawerOpen()) { + closeDrawer(); + return; + } + + final var fragment = getSupportFragmentManager().findFragmentByTag(FileDetailsSharingProcessFragment.TAG); + if (fragment instanceof FileDetailsSharingProcessFragment fileDetailsSharingProcessFragment) { + fileDetailsSharingProcessFragment.onBackPressed(); + } else { + setEnabled(false); + getOnBackPressedDispatcher().onBackPressed(); + } + } + }); } @Override diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 301c4e6d67a2..88807ba9fc82 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -40,6 +40,7 @@ import android.view.MenuItem import android.view.View import android.view.ViewTreeObserver.OnGlobalLayoutListener import android.view.WindowManager.BadTokenException +import androidx.activity.OnBackPressedCallback import androidx.annotation.VisibleForTesting import androidx.appcompat.widget.SearchView import androidx.core.view.MenuItemCompat @@ -82,6 +83,7 @@ import com.nextcloud.utils.extensions.getParcelableArgument import com.nextcloud.utils.extensions.isActive import com.nextcloud.utils.extensions.lastFragment import com.nextcloud.utils.extensions.logFileSize +import com.nextcloud.utils.extensions.navigateToAllFiles import com.nextcloud.utils.fileNameValidator.FileNameValidator.checkFolderPath import com.nextcloud.utils.view.FastScrollUtils import com.owncloud.android.MainApp @@ -155,7 +157,6 @@ import com.owncloud.android.utils.PermissionUtil.requestNotificationPermission import com.owncloud.android.utils.PushUtils import com.owncloud.android.utils.StringUtils import com.owncloud.android.utils.theme.CapabilityUtils -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -278,6 +279,7 @@ class FileDisplayActivity : initSyncBroadcastReceiver() observeWorkerState() startMetadataSyncForRoot() + handleBackPress() } private fun loadSavedInstanceState(savedInstanceState: Bundle?) { @@ -935,7 +937,7 @@ class FileDisplayActivity : ) { openDrawer() } else { - onBackPressed() + onBackPressedDispatcher.onBackPressed() } } else if (itemId == R.id.action_select_all) { val fragment = this.listOfFilesFragment @@ -1136,40 +1138,59 @@ class FileDisplayActivity : } } - private val isRootDirectory: Boolean - get() { - val currentDir = getCurrentDir() - return (currentDir == null || currentDir.parentId == FileDataStorageManager.ROOT_PARENT_ID.toLong()) - } - - /* - * BackPressed priority/hierarchy: - * 1. close search view if opened - * 2. close drawer if opened - * 3. if it is OCFileListFragment and it's in Root -> (finish Activity) or it's not Root -> (browse up) - * 4. otherwise pop up the fragment and sortGroup view visibility and call super.onBackPressed() + /** + * Sets up a custom back-press handler for this activity. + * + * This callback determines how the back button behaves based on the current UI state: + * - If the search view is open, it closes it. + * - If the navigation drawer is open, it closes it. + * - If the left fragment is an [OCFileListFragment]: + * - If in the root directory, it either navigates to "All Files" or finishes the activity. + * - Otherwise, it navigates one level up. + * - Otherwise, it pops the current fragment from the back stack. + * + * ### About `isEnabled` + * `isEnabled` is a property of [OnBackPressedCallback]. + * When `isEnabled = false`, this callback is **temporarily disabled**, + * allowing the system or other callbacks to handle the back press instead. */ - @SuppressFBWarnings("ITC_INHERITANCE_TYPE_CHECKING") // TODO Apply fail fast principle - override fun onBackPressed() { - if (isSearchOpen()) { - resetSearchAction() - return - } + private fun handleBackPress() { + onBackPressedDispatcher.addCallback( + this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + when { + isSearchOpen() -> { + isEnabled = false + resetSearchAction() + } - if (isDrawerOpen) { - super.onBackPressed() - return - } + isDrawerOpen -> { + isEnabled = false + onBackPressedDispatcher.onBackPressed() + } - if (this.leftFragment is OCFileListFragment) { - if (isRoot(getCurrentDir())) { - finish() - } else { - browseUp(leftFragment as OCFileListFragment) + leftFragment is OCFileListFragment -> { + val fragment = leftFragment as OCFileListFragment + if (isRoot(getCurrentDir())) { + if (fragment.shouldNavigateBackToAllFiles()) { + navigateToAllFiles() + } else { + finish() + } + } else { + browseUp(fragment) + } + } + + else -> { + isEnabled = false + popBack() + } + } + } } - } else { - popBack() - } + ) } private fun browseUp(listOfFiles: OCFileListFragment) { @@ -1210,20 +1231,20 @@ class FileDisplayActivity : if (leftFragment is UnifiedSearchFragment) { showSortListGroup(false) - super.onBackPressed() + onBackPressedDispatcher.onBackPressed() } } /** * Use this method when want to pop the fragment on back press. It resets Scrolling (See * [with true][.resetScrolling] and pop the visibility for sortListGroup (See - * [with false][.showSortListGroup]. At last call to super.onBackPressed() + * [with false][.showSortListGroup]. At last call to onBackPressedDispatcher.onBackPressed() */ private fun popBack() { binding.fabMain.setImageResource(R.drawable.ic_plus) resetScrolling(true) showSortListGroup(false) - super.onBackPressed() + onBackPressedDispatcher.onBackPressed() } override fun onSaveInstanceState(outState: Bundle) { @@ -1645,7 +1666,7 @@ class FileDisplayActivity : if (uploadWasFine || file != null && file.fileExists()) { fileDetailFragment.updateFileDetails(false, true) } else { - onBackPressed() + onBackPressedDispatcher.onBackPressed() } // Force the preview if the file is an image or text file diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt index 85ead7b2c9b8..a9a2a2adfb13 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt @@ -106,7 +106,7 @@ open class FolderPickerActivity : updateActionBarTitleAndHomeButtonByString(captionText) setBackgroundText() - handleOnBackPressed() + handleBackPress() } override fun onDestroy() { @@ -151,7 +151,7 @@ open class FolderPickerActivity : } } - private fun handleOnBackPressed() { + private fun handleBackPress() { onBackPressedDispatcher.addCallback( this, object : OnBackPressedCallback(true) { @@ -327,7 +327,7 @@ open class FolderPickerActivity : } else if (itemId == android.R.id.home) { val currentDir = currentFolder if (currentDir != null && currentDir.parentId != 0L) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() } } else { retval = super.onOptionsItemSelected(item) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt index 8ae77e6986bf..89d37b84da4d 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/InternalTwoWaySyncActivity.kt @@ -201,7 +201,7 @@ class InternalTwoWaySyncActivity : override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { android.R.id.home -> { - onBackPressed() + onBackPressedDispatcher.onBackPressed() } R.id.action_dismiss_two_way_sync -> { disableTwoWaySyncAndWorkers() diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt index 65c4d0715bb1..ef3526ecdcfd 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.kt @@ -91,7 +91,7 @@ class ManageAccountsActivity : multipleAccountsSupported = multiAccountSupport(this) setupUserList() - handleOnBackPressed() + handleBackPress() } private fun setupUsers() { @@ -149,7 +149,7 @@ class ManageAccountsActivity : performAccountRemoval(user) } - private fun handleOnBackPressed() { + private fun handleBackPress() { onBackPressedDispatcher.addCallback( this, onBackPressedCallback @@ -160,13 +160,13 @@ class ManageAccountsActivity : override fun handleOnBackPressed() { val resultIntent = Intent() - if (accountManager.allUsers.size > 0) { + if (accountManager.allUsers.isNotEmpty()) { resultIntent.putExtra(KEY_ACCOUNT_LIST_CHANGED, hasAccountListChanged()) resultIntent.putExtra(KEY_CURRENT_ACCOUNT_CHANGED, hasCurrentAccountChanged()) setResult(RESULT_OK, resultIntent) } else { val intent = Intent(this@ManageAccountsActivity, AuthenticatorActivity::class.java) - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP startActivity(intent) } @@ -229,7 +229,7 @@ class ManageAccountsActivity : var result = true if (item.itemId == android.R.id.home) { - onBackPressed() + onBackPressedDispatcher.onBackPressed() } else { result = super.onOptionsItemSelected(item) } @@ -331,7 +331,7 @@ class ManageAccountsActivity : ) recyclerView?.adapter = userListAdapter } else { - onBackPressed() + onBackPressedDispatcher.onBackPressed() } } @@ -393,8 +393,7 @@ class ManageAccountsActivity : resultIntent.putExtra(KEY_ACCOUNT_LIST_CHANGED, true) resultIntent.putExtra(KEY_CURRENT_ACCOUNT_CHANGED, true) setResult(RESULT_OK, resultIntent) - - super.onBackPressed() + onBackPressedDispatcher.onBackPressed() } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java index c9b4be929b4d..5148c10f52ec 100755 --- a/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java @@ -103,6 +103,7 @@ import javax.inject.Inject; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -203,6 +204,8 @@ protected void onCreate(Bundle savedInstanceState) { fm.beginTransaction() .add(taskRetainerFragment, TaskRetainerFragment.FTAG_TASK_RETAINER_FRAGMENT).commit(); } // else, Fragment already created and retained across configuration change + + handleBackPress(); } @Override @@ -656,14 +659,19 @@ private File createTempFile(String text) { } } - @Override - public void onBackPressed() { - if (mParents.size() <= SINGLE_PARENT) { - super.onBackPressed(); - } else { - mParents.pop(); - browseToFolderIfItExists(); - } + private void handleBackPress() { + getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { + @Override + public void handleOnBackPressed() { + if (mParents.size() <= SINGLE_PARENT) { + setEnabled(false); + getOnBackPressedDispatcher().onBackPressed(); + } else { + mParents.pop(); + browseToFolderIfItExists(); + } + } + }); } @Override @@ -1097,7 +1105,7 @@ public boolean onOptionsItemSelected(MenuItem item) { dialog.show(getSupportFragmentManager(), CreateFolderDialogFragment.CREATE_FOLDER_FRAGMENT); } else if (itemId == android.R.id.home) { if (mParents.size() > SINGLE_PARENT) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); } } else if (itemId == R.id.action_switch_account) { showAccountChooserDialog(); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java index bcbed6b84d77..0790160d7edb 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java @@ -15,6 +15,7 @@ */ package com.owncloud.android.ui.activity; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; @@ -354,6 +355,7 @@ private void setupAboutCategory(String appVersion) { } } + @SuppressLint("GestureBackNavigation") @Override public void onBackPressed() { DrawerActivity.menuItemId = R.id.nav_all_files; diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java index 226bb6d294b2..375458b4bbe4 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java @@ -238,7 +238,7 @@ public void onCreate(Bundle savedInstanceState) { public void onItemSelected(AdapterView parent, View view, int position, long id) { int i = position; while (i-- != 0) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); } // the next operation triggers a new call to this method, but it's necessary to // ensure that the name exposed in the action bar is the current directory when the @@ -311,7 +311,7 @@ public boolean onOptionsItemSelected(MenuItem item) { if (itemId == android.R.id.home) { if (mCurrentDir != null && mCurrentDir.getParentFile() != null) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); } } else if (itemId == R.id.action_select_all) { mSelectAll = !item.isChecked(); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java index 613437a25133..44bdca6655b7 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java @@ -158,7 +158,7 @@ public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); if (itemId == android.R.id.home) { - onBackPressed(); + getOnBackPressedDispatcher().onBackPressed(); } else if (itemId == R.id.action_open_account) { accountClicked(user.hashCode()); } else if (itemId == R.id.action_delete_account) { diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java index 5740936c2977..867c8a351f32 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java @@ -9,6 +9,7 @@ */ package com.owncloud.android.ui.adapter; +import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; @@ -23,6 +24,7 @@ import com.nextcloud.android.common.ui.theme.utils.ColorRole; import com.nextcloud.client.preferences.AppPreferences; +import com.nextcloud.utils.FileHelper; import com.owncloud.android.R; import com.owncloud.android.datamodel.ThumbnailsCacheManager; import com.owncloud.android.lib.common.utils.Log_OC; @@ -34,8 +36,6 @@ import java.io.File; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Locale; @@ -69,8 +69,10 @@ public class LocalFileListAdapter extends RecyclerView.Adapter(); this.viewThemeUtils = viewThemeUtils; this.isWithinEncryptedFolder = isWithinEncryptedFolder; - - swapDirectory(directory); + setHasStableIds(true); } - @Override - public int getItemCount() { - return mFiles.size() + 1; - } - public int getFilesCount() { return mFiles.size(); } @@ -129,30 +125,39 @@ public int getItemPosition(File file) { } public String[] getCheckedFilesPath() { - List result = listFilesRecursive(checkedFiles); + List result = FileHelper.INSTANCE.listFilesRecursive(checkedFiles); Log_OC.d(TAG, "Returning " + result.size() + " selected files"); return result.toArray(new String[0]); } - public List listFilesRecursive(Collection files) { - List result = new ArrayList<>(); + @Override + public int getItemCount() { + return mFiles.size() + 1; + } - for (File file : files) { - if (file.isDirectory()) { - result.addAll(listFilesRecursive(getFiles(file))); - } else { - result.add(file.getAbsolutePath()); - } + @Override + public long getItemId(int position) { + if (position >= mFiles.size()) { + return RecyclerView.NO_ID; } - return result; + File file = mFiles.get(position); + return file.getAbsolutePath().hashCode(); } @Override - public long getItemId(int position) { - return mFiles.size() <= position ? position : -1; + public int getItemViewType(int position) { + if (position == mFiles.size()) { + return VIEWTYPE_FOOTER; + } else { + if (MimeTypeUtil.isImageOrVideo(getItem(position))) { + return VIEWTYPE_IMAGE; + } else { + return VIEWTYPE_ITEM; + } + } } @Override @@ -271,19 +276,6 @@ public static void setThumbnail(File file, } } - @Override - public int getItemViewType(int position) { - if (position == mFiles.size()) { - return VIEWTYPE_FOOTER; - } else { - if (MimeTypeUtil.isImageOrVideo(getItem(position))) { - return VIEWTYPE_IMAGE; - } else { - return VIEWTYPE_ITEM; - } - } - } - private File getItem(int position) { return mFiles.get(position); } @@ -317,43 +309,81 @@ public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int */ public void swapDirectory(final File directory) { localFileListFragmentInterface.setLoading(true); - final Handler uiHandler = new Handler(Looper.getMainLooper()); + currentOffset = 0; + mFiles.clear(); + mFilesAll.clear(); + Executors.newSingleThreadExecutor().execute(() -> { - List fileList; - if (directory == null) { - fileList = new ArrayList<>(); - } else { - if (mLocalFolderPicker) { - fileList = getFolders(directory); - } else { - fileList = getFiles(directory); - } + // Load first page of folders + List firstPage = FileHelper.INSTANCE.listDirectoryEntries(directory, currentOffset, PAGE_SIZE, true); + + if (!firstPage.isEmpty()) { + firstPage = sortAndFilterHiddenEntries(firstPage); } - if (!fileList.isEmpty()) { - FileSortOrder sortOrder = preferences.getSortOrderByType(FileSortOrder.Type.localFileListView); - fileList = sortOrder.sortLocalFiles(fileList); + currentOffset += PAGE_SIZE; + updateUIForFirstPage(firstPage); - // Fetch preferences for showing hidden files - boolean showHiddenFiles = preferences.isShowHiddenFilesEnabled(); - if (!showHiddenFiles) { - fileList = filterHiddenFiles(fileList); - } - } - final List newFiles = fileList; + // Load remaining folders, then all files + loadRemainingEntries(directory, true); - uiHandler.post(() -> { - mFiles = newFiles; - mFilesAll = new ArrayList<>(); - mFilesAll.addAll(mFiles); + // Reset for files + currentOffset = 0; - notifyDataSetChanged(); - localFileListFragmentInterface.setLoading(false); - }); + loadRemainingEntries(directory, false); }); + } + + @SuppressLint("NotifyDataSetChanged") + private void updateUIForFirstPage(List firstPage) { + new Handler(Looper.getMainLooper()).post(() -> { + mFiles = new ArrayList<>(firstPage); + mFilesAll = new ArrayList<>(firstPage); + notifyDataSetChanged(); + localFileListFragmentInterface.setLoading(false); + }); + } + + private List sortAndFilterHiddenEntries(List nextPage) { + boolean showHiddenFiles = preferences.isShowHiddenFilesEnabled(); + FileSortOrder sortOrder = preferences.getSortOrderByType(FileSortOrder.Type.localFileListView); + + if (!showHiddenFiles) { + nextPage = filterHiddenFiles(nextPage); + } + + return sortOrder.sortLocalFiles(nextPage); + } + + private void loadRemainingEntries(File directory, boolean fetchFolders) { + while (true) { + List nextPage = FileHelper.INSTANCE.listDirectoryEntries(directory, currentOffset, PAGE_SIZE, fetchFolders); + if (nextPage.isEmpty()) { + break; + } + + nextPage = sortAndFilterHiddenEntries(nextPage); + currentOffset += PAGE_SIZE; + notifyItemRange(nextPage); + } } + private void notifyItemRange(List updatedList) { + new Handler(Looper.getMainLooper()).post(() -> { + int from = mFiles.size(); + int to = updatedList.size(); + + mFiles.addAll(updatedList); + mFilesAll.addAll(updatedList); + + Log_OC.d(TAG, "notifyItemRange, item size: " + mFilesAll.size()); + + notifyItemRangeInserted(from, to); + }); + } + + @SuppressLint("NotifyDataSetChanged") public void setSortOrder(FileSortOrder sortOrder) { localFileListFragmentInterface.setLoading(true); final Handler uiHandler = new Handler(Looper.getMainLooper()); @@ -366,30 +396,9 @@ public void setSortOrder(FileSortOrder sortOrder) { localFileListFragmentInterface.setLoading(false); }); }); - - - } - - private List getFolders(final File directory) { - File[] folders = directory.listFiles(File::isDirectory); - - if (folders != null && folders.length > 0) { - return new ArrayList<>(Arrays.asList(folders)); - } else { - return new ArrayList<>(); - } - } - - private List getFiles(File directory) { - File[] files = directory.listFiles(); - - if (files != null && files.length > 0) { - return new ArrayList<>(Arrays.asList(files)); - } else { - return new ArrayList<>(); - } } + @SuppressLint("NotifyDataSetChanged") public void filter(String text) { if (text.isEmpty()) { mFiles = mFilesAll; @@ -514,11 +523,11 @@ private LocalFileListFooterViewHolder(View itemView) { } } + @SuppressLint("NotifyDataSetChanged") @VisibleForTesting public void setFiles(List newFiles) { mFiles = newFiles; - mFilesAll = new ArrayList<>(); - mFilesAll.addAll(mFiles); + mFilesAll = new ArrayList<>(mFiles); notifyDataSetChanged(); localFileListFragmentInterface.setLoading(false); diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt index 1a11fe7a3251..c2e2c435ebbe 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt @@ -380,7 +380,7 @@ class OCFileListDelegate( return operationsServiceBinder?.isSynchronizing(user, file) == true || fileDownloadHelper.isDownloading(user, file) || - fileUploadHelper.isUploading(user, file) + fileUploadHelper.isUploading(file.remotePath, user.accountName) } private fun showLocalFileIndicator(file: OCFile, holder: ListViewHolder) { diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java index 9872deb38d47..b06a2b0a5d2d 100755 --- a/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java @@ -67,6 +67,8 @@ import java.util.concurrent.TimeUnit; import androidx.annotation.NonNull; +import kotlin.Unit; +import kotlin.jvm.functions.Function0; /** * This Adapter populates a ListView with following types of uploads: pending, active, completed. Filtering possible. @@ -144,7 +146,10 @@ public void onBindHeaderViewHolder(SectionedViewHolder holder, int section, bool return; } - uploadHelper.cancelFileUploads(Arrays.asList(group.items), accountName); + for (OCUpload upload: group.items) { + uploadHelper.setStatusOfUploadToCancel(upload.getRemotePath()); + FileUploadWorker.Companion.cancelCurrentUpload(upload.getRemotePath(), accountName, () -> Unit.INSTANCE); + } loadUploadItemsFromDb(); }).start(); case FINISHED -> { @@ -427,7 +432,8 @@ public void onBindViewHolder(SectionedViewHolder holder, int section, int relati itemViewHolder.binding.uploadRightButton.setImageResource(R.drawable.ic_action_cancel_grey); itemViewHolder.binding.uploadRightButton.setVisibility(View.VISIBLE); itemViewHolder.binding.uploadRightButton.setOnClickListener(v -> { - uploadHelper.cancelFileUpload(item.getRemotePath(), item.getAccountName()); + uploadHelper.setStatusOfUploadToCancel(item.getRemotePath()); + FileUploadWorker.Companion.cancelCurrentUpload(item.getRemotePath(), item.getAccountName(), () -> Unit.INSTANCE); loadUploadItemsFromDb(); }); diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt index a88da8904661..6224420f5256 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt @@ -25,7 +25,6 @@ import android.os.Handler import android.os.Looper import android.os.Parcelable import android.util.DisplayMetrics -import android.view.KeyEvent import android.view.LayoutInflater import android.view.Menu import android.view.MenuInflater @@ -57,7 +56,6 @@ import com.nextcloud.client.di.Injectable import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.client.preferences.AppPreferencesImpl import com.nextcloud.utils.extensions.getTypedActivity -import com.nextcloud.utils.extensions.handleBackButtonEvent import com.owncloud.android.MainApp import com.owncloud.android.R import com.owncloud.android.databinding.ListFragmentBinding @@ -65,7 +63,6 @@ import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.files.SearchRemoteOperation import com.owncloud.android.lib.resources.status.OwnCloudVersion import com.owncloud.android.ui.EmptyRecyclerView -import com.owncloud.android.ui.activity.FileActivity import com.owncloud.android.ui.activity.FileDisplayActivity import com.owncloud.android.ui.activity.FolderPickerActivity import com.owncloud.android.ui.activity.OnEnforceableRefreshListener @@ -767,19 +764,6 @@ open class ExtendedListFragment : } } - protected fun setupBackButtonRedirectToAllFiles() { - view?.isFocusableInTouchMode = true - view?.requestFocus() - view?.setOnKeyListener { _: View, keyCode: Int, event: KeyEvent -> - if (event.action == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) { - val fda = getTypedActivity(FileActivity::class.java) - val currentDir = fda?.currentDir ?: return@setOnKeyListener false - return@setOnKeyListener fda.handleBackButtonEvent(currentDir) - } - false - } - } - private data class EmptyListData(val headline: Int, val message: Int, val icon: Int?, val tintIcon: Boolean) companion object { diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java index 858c02ec128a..2aaa0b4f9139 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java @@ -197,7 +197,7 @@ public FileDetailActivitiesFragment getFileDetailActivitiesFragment() { } public void goBackToOCFileListFragment() { - requireActivity().onBackPressed(); + requireActivity().getOnBackPressedDispatcher().onBackPressed(); } @Override @@ -574,7 +574,7 @@ public void updateFileDetails(boolean transferring, boolean refresh) { // configure UI for depending upon local state of the file if (transferring || (FileDownloadHelper.Companion.instance().isDownloading(user, file)) - || (FileUploadHelper.Companion.instance().isUploading(user, file))) { + || (FileUploadHelper.Companion.instance().isUploading(file.getRemotePath(), user.getAccountName()))) { setButtonsForTransferring(); } else if (file.isDown()) { @@ -736,7 +736,7 @@ private void setButtonsForTransferring() { if (FileDownloadHelper.Companion.instance().isDownloading(user, getFile())) { binding.progressText.setText(R.string.downloader_download_in_progress_ticker); } else { - if (FileUploadHelper.Companion.instance().isUploading(user, getFile())) { + if (FileUploadHelper.Companion.instance().isUploading(getFile().getRemotePath(), user.getAccountName())) { binding.progressText.setText(R.string.uploader_upload_in_progress_ticker); } } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java index 672ca0f2ae64..c44c12168a2a 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java @@ -234,12 +234,6 @@ public void onResume() { } } - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - setupBackButtonRedirectToAllFiles(); - } - @Override public void onMessageEvent(ChangeMenuEvent changeMenuEvent) { super.onMessageEvent(changeMenuEvent); diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java index 25fa7842fc1c..87ce628db242 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java @@ -112,7 +112,6 @@ public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mAdapter = new LocalFileListAdapter(mContainerActivity.isFolderPickerMode(), - mContainerActivity.getInitialDirectory(), this, preferences, getActivity(), @@ -256,28 +255,21 @@ public void listDirectory() { * @param directory Directory to be listed */ public void listDirectory(File directory) { - - // Check input parameters for null if (directory == null) { - if (mDirectory != null) { - directory = mDirectory; - } else { - directory = Environment.getExternalStorageDirectory(); - // TODO be careful with the state of the storage; could not be available - if (directory == null) { - return; // no files to show - } - } + directory = (mDirectory != null) ? mDirectory : Environment.getExternalStorageDirectory(); + if (directory == null) return; } - - // if that's not a directory -> List its parent + // If input is not a directory, list its parent if (!directory.isDirectory()) { Log_OC.w(TAG, "You see, that is not a directory -> " + directory); directory = directory.getParentFile(); + if (directory == null) { + Log_OC.w(TAG, "parent directory is null, cannot swap directory"); + return; + } } - // by now, only files in the same directory will be kept as selected mAdapter.removeAllFilesFromCheckedFiles(); mAdapter.swapDirectory(directory); diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index 8961b2fdbbcf..8623c5420cb4 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -277,12 +277,6 @@ public void onResume() { super.onResume(); } - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - setupBackButtonRedirectToAllFiles(); - } - @Override public void onDestroyView() { super.onDestroyView(); @@ -2325,4 +2319,15 @@ public boolean isEmpty() { public SearchEvent getSearchEvent() { return searchEvent; } + + public boolean isSearchEventFavorite() { + if (searchEvent == null) { + return false; + } + return searchEvent.getSearchType() == SearchRemoteOperation.SearchType.FAVORITE_SEARCH; + } + + public boolean shouldNavigateBackToAllFiles() { + return ((this instanceof GalleryFragment) || isSearchEventFavorite() || DrawerActivity.menuItemId == R.id.nav_favorites); + } } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListFragment.java index 03c8f0e52786..99ff53f53368 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/contactsbackup/BackupListFragment.java @@ -404,7 +404,7 @@ private void importCalendar() { private void closeFragment() { ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity(); if (contactsPreferenceActivity != null) { - contactsPreferenceActivity.onBackPressed(); + contactsPreferenceActivity.getOnBackPressedDispatcher().onBackPressed(); } } diff --git a/app/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/app/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 283e191e60c5..268abd74aefa 100755 --- a/app/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/app/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -34,6 +34,7 @@ import com.nextcloud.client.jobs.BackgroundJobManager; import com.nextcloud.client.jobs.download.FileDownloadHelper; import com.nextcloud.client.jobs.upload.FileUploadHelper; +import com.nextcloud.client.jobs.upload.FileUploadWorker; import com.nextcloud.client.network.ConnectivityService; import com.nextcloud.utils.EditorUtils; import com.owncloud.android.MainApp; @@ -86,7 +87,6 @@ import java.util.Date; import java.util.List; import java.util.Locale; -import java.util.NoSuchElementException; import java.util.Optional; import java.util.Set; import java.util.regex.Matcher; @@ -97,6 +97,7 @@ import androidx.core.content.FileProvider; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; +import kotlin.Unit; /** * Helper implementation for file operations locally and remote. @@ -1006,17 +1007,22 @@ public void cancelTransference(OCFile file) { } } - if (FileDownloadHelper.Companion.instance().isDownloading(currentUser, file)) { + final var fileDownloadHelper = FileDownloadHelper.Companion.instance(); + if (fileDownloadHelper.isDownloading(currentUser, file)) { List files = fileActivity.getStorageManager().getAllFilesRecursivelyInsideFolder(file); - FileDownloadHelper.Companion.instance().cancelPendingOrCurrentDownloads(currentUser, files); + fileDownloadHelper.cancelPendingOrCurrentDownloads(currentUser, files); } - if (FileUploadHelper.Companion.instance().isUploading(currentUser, file)) { - try { - FileUploadHelper.Companion.instance().cancelFileUpload(file.getRemotePath(), currentUser.getAccountName()); - } catch (NoSuchElementException e) { - Log_OC.e(TAG, "Error cancelling current upload because user does not exist!"); - } + if (file.isFolder()) { + fileDownloadHelper.cancelFolderDownload(); + } + + final var fileUploadHelper = FileUploadHelper.Companion.instance(); + if (fileUploadHelper.isUploading(file.getRemotePath(), currentUser.getAccountName())) { + FileUploadWorker.Companion.cancelCurrentUpload(file.getRemotePath(), currentUser.getAccountName(), () -> { + fileUploadHelper.setStatusOfUploadToCancel(file.getRemotePath()); + return Unit.INSTANCE; + }); } } diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewBitmapActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewBitmapActivity.kt index c5265015bb21..b6c9e86c2d16 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewBitmapActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewBitmapActivity.kt @@ -54,7 +54,7 @@ class PreviewBitmapActivity : } override fun onSupportNavigateUp(): Boolean { - onBackPressed() + onBackPressedDispatcher.onBackPressed() return true } } diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt index c71c86bd2930..1d575dd32f5a 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt @@ -14,6 +14,7 @@ import android.os.Build import android.os.Bundle import android.view.MenuItem import android.view.View +import androidx.activity.OnBackPressedCallback import androidx.appcompat.app.ActionBar import androidx.core.content.ContextCompat import androidx.drawerlayout.widget.DrawerLayout @@ -123,6 +124,7 @@ class PreviewImageActivity : observeWorkerState() applyDisplayCutOutTopPadding() + handleBackPress() } private fun applyDisplayCutOutTopPadding() { @@ -214,9 +216,14 @@ class PreviewImageActivity : } } - override fun onBackPressed() { - sendRefreshSearchEventBroadcast() - super.onBackPressed() + private fun handleBackPress() { + onBackPressedDispatcher.addCallback(object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + sendRefreshSearchEventBroadcast() + isEnabled = false + onBackPressedDispatcher.onBackPressed() + } + }) } override fun onOptionsItemSelected(item: MenuItem): Boolean { diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt index a3aec178ad48..99b0bffc4bf3 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewTextFragment.kt @@ -165,7 +165,7 @@ abstract class PreviewTextFragment : * Finishes the preview */ protected fun finish() { - requireActivity().runOnUiThread { requireActivity().onBackPressed() } + requireActivity().runOnUiThread { requireActivity().onBackPressedDispatcher.onBackPressed() } } companion object { diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFullscreenDialog.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFullscreenDialog.kt index 30b9da6a53cb..dd1e6814eccc 100644 --- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFullscreenDialog.kt +++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewVideoFullscreenDialog.kt @@ -7,15 +7,16 @@ */ package com.owncloud.android.ui.preview -import android.app.Activity import android.app.Dialog import android.os.Build import android.view.ViewGroup import android.view.Window +import androidx.activity.addCallback import androidx.annotation.OptIn import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat +import androidx.fragment.app.FragmentActivity import androidx.media3.common.util.UnstableApi import androidx.media3.exoplayer.ExoPlayer import androidx.media3.ui.PlayerView @@ -35,7 +36,7 @@ import com.owncloud.android.lib.common.utils.Log_OC */ @OptIn(UnstableApi::class) class PreviewVideoFullscreenDialog( - private val activity: Activity, + private val activity: FragmentActivity, nextcloudClient: NextcloudClient, private val sourceExoPlayer: ExoPlayer, private val sourceView: PlayerView @@ -69,6 +70,7 @@ class PreviewVideoFullscreenDialog( binding.videoPlayer.player = mExoPlayer mExoPlayer.prepare() } + handleOnBackPressed() } private fun isRotatedVideo(): Boolean { @@ -95,7 +97,7 @@ class PreviewVideoFullscreenDialog( setOnShowListener { enableImmersiveMode() switchTargetViewFromSource() - binding.videoPlayer.setFullscreenButtonClickListener { onBackPressed() } + binding.videoPlayer.setFullscreenButtonClickListener { activity.onBackPressedDispatcher.onBackPressed() } if (isPlaying) { mExoPlayer.play() } @@ -111,23 +113,25 @@ class PreviewVideoFullscreenDialog( } } - override fun onBackPressed() { - val isPlaying = mExoPlayer.isPlaying - if (isPlaying) { - mExoPlayer.pause() - } - setOnDismissListener { - disableImmersiveMode() - playingStateListener?.let { - mExoPlayer.removeListener(it) - } - switchTargetViewToSource() + private fun handleOnBackPressed() { + activity.onBackPressedDispatcher.addCallback(activity) { + val isPlaying = mExoPlayer.isPlaying if (isPlaying) { - sourceExoPlayer.play() + mExoPlayer.pause() + } + setOnDismissListener { + disableImmersiveMode() + playingStateListener?.let { + mExoPlayer.removeListener(it) + } + switchTargetViewToSource() + if (isPlaying) { + sourceExoPlayer.play() + } + sourceView.showController() } - sourceView.showController() + dismiss() } - dismiss() } private fun switchTargetViewToSource() { diff --git a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt index 64a103bce539..2ceef02b13e3 100644 --- a/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.kt @@ -128,6 +128,7 @@ class TrashbinActivity : updateActionBarTitleAndHomeButtonByString(getString(R.string.trashbin_activity_title)) setupDrawer() + handleBackPress() } override fun onStart() { @@ -179,8 +180,6 @@ class TrashbinActivity : loadFolder() - handleOnBackPressed() - mMultiChoiceModeListener = MultiChoiceModeListener( this, trashbinListAdapter, @@ -189,7 +188,7 @@ class TrashbinActivity : addDrawerListener(mMultiChoiceModeListener) } - private fun handleOnBackPressed() { + private fun handleBackPress() { onBackPressedDispatcher.addCallback( this, onBackPressedCallback @@ -390,7 +389,7 @@ class TrashbinActivity : binding.emptyList.emptyListViewHeadline.visibility = View.VISIBLE binding.emptyList.emptyListViewText.visibility = View.VISIBLE binding.emptyList.emptyListView.visibility = View.VISIBLE - binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_cloud_sync_off) + binding.emptyList.emptyListIcon.setImageResource(R.drawable.ic_sync_off) } private fun openActionsMenu(filesCount: Int, checkedFiles: Set) { diff --git a/app/src/main/res/drawable/ic_sync_off.xml b/app/src/main/res/drawable/ic_sync_off.xml new file mode 100644 index 000000000000..2f3d628373db --- /dev/null +++ b/app/src/main/res/drawable/ic_sync_off.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 0749208326e4..b8bae67252a7 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -15,7 +15,7 @@ List visning Gendan kontakter og kalender Ny mappe - Flyt eller kopier + Flyt eller kopiér Åbn med Søg Detaljer @@ -211,7 +211,7 @@ Det er ikke muligt at kopiere en mappe til en af dens egne undermapper Filen findes allerede i destinationsmappen Ikke muligt at kopiere. Undersøg venligst om filen eksisterer. - Kopier link + Kopiér link Kopier/flyt til krypteret mappe endnu ikke understøttet. Kunne ikke hente hele billedet Kunne ikke hente delte drev @@ -460,9 +460,9 @@ Succes ved genskabning af fil version! Detaljer Download - Eksporter + Eksportér File omdøbt %1$sunder overførelse - Synkroniser + Synkronisér Ingen fil valgt Filnavnet kan ikke stå tomt. Ugyldige tegn: / \\ < > : \" | ? * @@ -479,7 +479,7 @@ Mappenavnet må ikke være tomt Vælg Vælg destinationsmappe - Kopier + Kopiér Flyt Du har ikke tilladelse %s til at kopiere denne fil @@ -819,7 +819,7 @@ Del Tillad download og synkronisering Vi kunne ikke opdatere delingen. Tilføj en note og prøv igen. - Del og kopier link + Del og kopiér link Opret Brugerdefinerede rettigheder Slet diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 86a6fec218cd..67ce59cf0322 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -209,6 +209,7 @@ Der Import konnte nicht gestartet werden. Bitte erneut versuchen Keine Datei gefunden Wir können Ihr letztes Backup nicht finden! + Erkennen von Inhaltsänderungen In die Zwischenablage kopiert Es ist ein Fehler beim Kopieren der Datei oder des Ordners aufgetreten. Es ist nicht möglich, einen Ordner in einen seiner Unterordner zu kopieren @@ -614,6 +615,8 @@ Aktion konnte nicht ausgeführt werden Benachrichtigungen anzeigen, um auf die Ergebnisse von Hintergrundoperationen zu reagieren Hintergrundvorgänge + Erkennt lokale Dateiänderungen + Inhaltsmonitor Zeigt den Herunterlade-Fortschritt an Downloads Zeigt den Fortschritt der Dateisynchronisierung und die Ergebnisse an diff --git a/app/src/main/res/values-et-rEE/strings.xml b/app/src/main/res/values-et-rEE/strings.xml index 9d421214aee7..857351ea9d63 100644 --- a/app/src/main/res/values-et-rEE/strings.xml +++ b/app/src/main/res/values-et-rEE/strings.xml @@ -100,9 +100,11 @@ Palun lõpeta sisselogimisprotsess oma veebibrauseris Kuna akukasutuse optimeerimine on lülitatud sisse, siis automaatne üleslaadimine pole töös. säilitatud lugemisõigustega algkaustas + Aku on üsna tühi, üleslaadimine võib kesta kauem Laadi üles ainult mahupiiranguta WiFi võrgus /AutoUpload Kuna ülalpool asuv kaust kuulub sünkroonimisele, siis see kaust on juba kaasatud ning nii võivad tekkida topelt üleslaadimised + Ootan sünkroonimiseks WiFi ühenduse loomist Laadin faile üles: %s kuni %s Seadista Loo uus kohandatud kausta seadistus @@ -207,6 +209,7 @@ Ei õnnestunud käivitada importimist. Palun proovi uuesti Faili ei leitud Sinu viimast varukoopiat ei leidu! + Tuvastan sisu muudatusi Kopeeritud lõikepuhvrisse Selle faili või kausta kopeerimisel tekkis tõrge Kausta ei saa kopeerida tema enda alamkausta @@ -612,6 +615,8 @@ Ei õnnestunud käivitada tegevust. Näita teavitusi, mis võimaldavad suhelda taustal tehtud toimingutega Toimingud taustal + Tuvastab kohalike failide muudatused + Sisuvaatleja Näitab allalaadimise edenemist Allalaadimised Näitab failide sünkroniseerimise edenemist ja tulemusi diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 2e0bf14468b8..74435ca16f57 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -209,6 +209,7 @@ Importación fallou ao iniciar. Ténteo de novo Non se atopou ningún ficheiro Non foi posíbel atopar a súa última copia de seguranza! + Detección de cambios no contido Copiado no portapapeis Produciuse un erro ao tentar copiar este ficheiro ou cartafol. Non é posíbel copiar un cartafol nun dos seus propios subcartafoles @@ -614,6 +615,8 @@ Produciuse un fallo ao executar a acción. Amosar notificacións para interactuar co resultado das operacións en segundo plano Operacións en segundo plano + Detecta os cambios nos ficheiros locais + Observador do contido Amosa o progreso da descarga Descargas Amosa o progreso e os resultados da sincronización de ficheiros diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index ffea016f1285..dd62d2034b94 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -98,10 +98,13 @@ Houve um problema ao processar sua solicitação de login. Tente novamente mais tarde. Não há nenhum navegador disponível para abrir este link. Por favor, conclua o processo de login no seu navegador + O upload automático está pausado porque o Economizador de Bateria está ativado. mantido na pasta original, já que é somente leitura + Bateria fraca, o upload pode demorar mais tempo Enviar só por WiFi não medida /UploadAutomático Esta pasta já está incluída na sincronização da pasta pai, o que pode causar uploads duplicados + Aguardando o Wi-Fi para iniciar o upload Fazendo upload de arquivos de %s a %s Configurar Criar nova configuração de pasta personalizada @@ -206,6 +209,7 @@ Falha ao iniciar a importação. Por favor, tente novamente. Nenhum arquivo encontrado Não foi possível encontrar seu último backup! + Detectando alterações no conteúdo Copiado para a área de transferência Ocorreu um erro ao tentar copiar este arquivo ou pasta Não é possível copiar uma pasta para uma das suas próprias pastas subjacentes @@ -611,6 +615,8 @@ Erro ao executar a ação. Mostrar notificações para interagir com o resultado de operações em segundo plano Operações em segundo plano + Detecta alterações em arquivos locais + Observador de conteúdo Mostra o progresso de download Downloads Mostra o progresso sincronização de arquivo e resultados @@ -988,6 +994,7 @@ Evento não encontrado, você sempre pode sincronizar para atualizar. Redirecionando para a web… Contato não encontrado, você sempre pode sincronizar para atualizar. Redirecionando para web… São necessárias permissões para abrir o resultado da pesquisa, caso contrário, ele será redirecionado para a web… + Nesta pasta Desconhecido Destrancar arquivo Existem comentários não lidos diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index ba9dbc63569a..bd81d09b23a0 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -209,6 +209,7 @@ Importen kunde inte startas. Försök igen Ingen fil funnen Vi kunde inte hitta din senaste backup! + Upptäcker innehållsförändringar Kopierat till urklipp Ett fel uppstod, kunde inte kopiera filen eller mappen Det är inte möjligt att kopiera mappen till en av dess undermappar @@ -614,6 +615,8 @@ Misslyckades utföra åtgärd. Visa aviseringar för att interagera resultatet av bakgrundsoperationer Bakgrundsoperationer + Upptäcker lokala filändringar + Innehållsövervakare Visar hämtningsförloppet Nerladdningar Visar filsynkroniserings förlopp och resultat diff --git a/app/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml index 8b039fea458b..744b01361288 100644 --- a/app/src/main/res/values-sw/strings.xml +++ b/app/src/main/res/values-sw/strings.xml @@ -100,9 +100,11 @@ Tafadhali kamilisha mchakato wa kuingia katika kivinjari chako Upakiaji otomatiki umesitishwa kwa sababu Kiokoa Betri kimewashwa. iliyohifadhiwa kwenye folda asili, kwani inasomwa tu + Betri iko chini, upakiaji unaweza kuchukua muda mrefu Pakia kwenye Wi-Fi isiyopimwa pekee /Pakia Kiotomatiki Folda hii tayari imejumuishwa katika usawazishaji wa folda kuu, ambayo inaweza kusababisha upakiaji unaorudiwa + Inasubiri Wi-Fi kuanza kupakia Inapakia faili kutoka %s hadi %s Sanidi Unda usanidi mpya wa folda maalum @@ -207,6 +209,7 @@ Imeshindwa kuanza kuleta. Tafadhali jaribu tena Hakuna faili iliyopatikana Haikuweza kupata nakala yako ya mwisho! + Inagundua mabadiliko ya maudhui Nakili katika ubao wa kunakili Hitilafu ilitokea wakati wa kujaribu kunakili faili au folda hii Haiwezekani kunakili folda kwenye mojawapo ya folda zake za msingi @@ -612,6 +615,8 @@ Imeshindwa kutekeleza kitendo. Onyesha arifa ili kuingiliana na matokeo ya shughuli za usuli Shughuli za usuli + Hutambua mabadiliko ya faili za ndani + Mtazamaji wa maudhui Inaonyesha maendeleo ya upakuaji Vipakuliwa Inaonyesha maendeleo ya usawazishaji wa faili na matokeo diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 49a800a774f9..e0717900a1bb 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -209,6 +209,7 @@ İçe aktarım başlatılamadı. Lütfen yeniden deneyin Herhangi bir dosya bulunamadı Son yedeğiniz bulunamadı! + İçerik değişiklikleri denetleniyor Panoya kopyalandı Bu dosya ya da klasör kopyalanmaya çalışılırken bir sorun çıktı Bir klasör kendi alt klasörü olarak kopyalanamaz @@ -614,6 +615,8 @@ İşlem yapılamadı. Arka plan işlemlerinin sonucuyla etkileşim kurmak için bildirimleri görüntüle Arka plan işlemleri + Yerel dosya değişikliklerini algılar + İçerik izleyici İndirme ilerlemesini görüntüler İndirmeler Dosya eşitleme ilerlemesi ve sonuçlarını görüntüler diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e079082c2a6f..8d16575542a0 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -209,6 +209,7 @@ 匯入無法開始。請再試一次 找不到檔案 找不到您最新的備份! + 偵測內容變更 已複製到剪貼簿 嘗試複製此檔案或資料夾時發生錯誤 無法將資料夾複製到自己的子資料夾中 @@ -614,6 +615,8 @@ 執行動作失敗。 顯示通知以與背景操作的結果互動 背景操作 + 偵測本機檔案變更 + 內容觀察器 顯示下載進度 下載 顯示檔案同步進度和結果 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 768ffc8ab538..7b1e111f2361 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -237,6 +237,12 @@ %1$d / %2$d - %3$s + Syncing… + %s folder successfully synchronized + An error occurred during synchronization of the %s folder + %1$d of %2$d · %3$s + Insufficient disk space, synchronization canceled + Uploading… %1$d%% Uploading %2$s %1$s uploaded diff --git a/appscan/build.gradle b/appscan/build.gradle deleted file mode 100644 index 2dd65e4eabb9..000000000000 --- a/appscan/build.gradle +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2024 Alper Ozturk - * SPDX-FileCopyrightText: 2023 Álvaro Brey - * SPDX-FileCopyrightText: 2023 Andy Scherzinger - * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only - */ -buildscript { - dependencies { - classpath "com.android.tools.build:gradle:$androidPluginVersion" - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -apply plugin: "com.android.library" -apply plugin: "kotlin-android" - -android { - namespace = "com.nextcloud.appscan" - - defaultConfig { - minSdk = 27 - targetSdk = 35 - compileSdk = 35 - - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - minifyEnabled = false - } - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - kotlinOptions { - jvmTarget = "17" - } -} - -dependencies { - implementation "androidx.appcompat:appcompat:$appCompatVersion" - implementation "com.github.Hazzatur:Document-Scanning-Android-SDK:$documentScannerVersion" - implementation "com.github.nextcloud.android-common:ui:$androidCommonLibraryVersion" -} diff --git a/appscan/build.gradle.kts b/appscan/build.gradle.kts new file mode 100644 index 000000000000..9f2471cdc4b8 --- /dev/null +++ b/appscan/build.gradle.kts @@ -0,0 +1,50 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-FileCopyrightText: 2023 Álvaro Brey + * SPDX-FileCopyrightText: 2023 Andy Scherzinger + * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only + */ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +plugins { + alias(libs.plugins.android.library) + alias(libs.plugins.jetbrains.kotlin.android) +} + +android { + namespace = "com.nextcloud.appscan" + + defaultConfig { + minSdk = 27 + compileSdk = 36 + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + lint.targetSdk = 35 + testOptions.targetSdk = 35 +} + +kotlin.compilerOptions { + jvmTarget.set(JvmTarget.JVM_17) + freeCompilerArgs.add("-opt-in=kotlin.RequiresOptIn") +} + +dependencies { + implementation(libs.appcompat) + implementation(libs.document.scanning.android.sdk) + implementation(libs.ui) +} \ No newline at end of file diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 14482f6f01d7..000000000000 --- a/build.gradle +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-FileCopyrightText: 2024 Alper Ozturk - * SPDX-FileCopyrightText: 2023 Tobias Kaminsky - * SPDX-FileCopyrightText: 2022 Álvaro Brey Vilas - * SPDX-FileCopyrightText: 2016 Andy Scherzinger - * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only - */ -buildscript { - ext { - androidLibraryVersion ="5da34c70da4068ff976cf931b7716fc7a337f32d" - androidCommonLibraryVersion = "0.28.0" - androidPluginVersion = '8.13.0' - androidxMediaVersion = "1.5.1" - androidxTestVersion = "1.7.0" - appCompatVersion = "1.7.1" - checkerVersion = "3.21.2" - daggerVersion = "2.57.1" - documentScannerVersion = "1.2.3" - espressoVersion = "3.6.1" - jacoco_version = "0.8.13" - kotlin_version = "2.2.20" - markwonVersion = "4.6.2" - mockitoVersion = "4.11.0" - mockitoKotlinVersion = "4.1.0" - mockkVersion = "1.14.5" - prismVersion = "2.0.0" - roomVersion = "2.8.0" - workRuntime = "2.10.3" - - ciBuild = System.getenv("CI") == "true" - shotTest = System.getenv("SHOT_TEST") == "true" - } -} - -subprojects { - buildscript { - repositories { - google() - mavenCentral() - gradlePluginPortal() - } - } - repositories { - google() - mavenCentral() - maven { url = "https://jitpack.io" } - } -} - -tasks.register("clean", Delete) { - delete rootProject.layout.buildDirectory -} - -tasks.register("installGitHooks", Copy) { - def sourceFolder = "${rootProject.projectDir}/scripts/hooks" - def destFolder = "${rootProject.projectDir}/.git/hooks" - - description = "Install git hooks" - - from(sourceFolder) { - include "*" - } - into destFolder - - eachFile { file -> - println "${sourceFolder}/${file.relativeSourcePath} -> ${destFolder}/${file.path}" - } -} diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 000000000000..f60e76ea9386 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,41 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2024 Alper Ozturk + * SPDX-FileCopyrightText: 2023 Tobias Kaminsky + * SPDX-FileCopyrightText: 2022 Álvaro Brey Vilas + * SPDX-FileCopyrightText: 2016 Andy Scherzinger + * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only + */ +plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.jetbrains.kotlin.android) apply false + alias(libs.plugins.kotlin.compose) apply false + alias(libs.plugins.spotless) apply false + alias(libs.plugins.kapt) apply false + alias(libs.plugins.ksp) apply false + alias(libs.plugins.kotlin.serialization) apply false + alias(libs.plugins.kotlin.parcelize) apply false + alias(libs.plugins.spotbugs) apply false + alias(libs.plugins.detekt) apply false + // needed to make renovate run without shot, as shot requires Android SDK + // https://github.com/pedrovgs/Shot/issues/300 + alias(libs.plugins.shot) apply false +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} + +tasks.register("installGitHooks") { + description = "Install git hooks" + + val sourceFolder = "${rootProject.projectDir}/scripts/hooks" + val destFolder = "${rootProject.projectDir}/.git/hooks" + + from(sourceFolder) { include("*") } + into(destFolder) + eachFile { println("${sourceFolder}/${file.path} -> ${destFolder}/${file.path}") } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a7ff115f83ba..622531d0a9b5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,23 +5,30 @@ androidCommonLibraryVersion = "0.28.0" androidGifDrawableVersion = "1.2.29" androidImageCropperVersion = "4.6.0" +androidLibraryVersion = "3546bd82fc" +androidPluginVersion = '8.13.0' androidsvgVersion = "1.4" +androidxMediaVersion = "1.5.1" androidxTestVersion = "1.7.0" -annotationsVersion = "3.0.1u2" annotationVersion = "1.9.1" +annotationsVersion = "3.0.1u2" appCompatVersion = "1.7.1" bcpkixJdk18onVersion = "1.81" cardviewVersion = "1.0.0" +checker = "3.21.2" coilVersion = "2.7.0" commonsHttpclient = "3.1" commonsIoVersion = "2.20.0" +composeBom = "2025.09.00" conscryptAndroidVersion = "2.5.3" constraintlayoutVersion = "2.2.1" coreTestingVersion = "2.2.0" coreVersion = "0.15.0" daggerVersion = "2.57.1" +detektGradlePlugin = "1.23.8" dexopenerVersion = "2.0.5" disklrucacheVersion = "2.0.2" +documentScannerVersion = "1.2.3" emojiGoogleVersion = "0.21.0" espressoVersion = "3.7.0" eventbusVersion = "3.3.1" @@ -36,10 +43,13 @@ glide = "5.0.5" gsonVersion = "2.13.2" ical4jVersion = "3.2.19" jackrabbitWebdavVersion = "2.13.5" +jacoco = "0.8.13" jsonVersion = "20250517" junit = "4.13.2" junitVersion = "1.3.0" juniversalchardetVersion = "2.5.0" +kotlinxSerializationJson = "1.9.0" +leakcanary = "2.14" legacySupportV4Version = "1.0.0" libraryVersion = "1.3.0" lifecycleViewmodelKtxVersion = "2.9.4" @@ -64,14 +74,13 @@ screengrabVersion = "2.1.1" sectionedRecyclerviewVersion = "0.6.1" shotVersion = "6.1.0" splash-screen = "1.0.1" -composeBom = "2025.09.00" spotbugsGradlePlugin = "6.4.2" -detektGradlePlugin = "1.23.8" spotless = "7.2.1" stateless4jVersion = "2.6.0" webkitVersion = "1.14.0" workRuntime = "2.10.4" -kotlinxSerializationJson = "1.9.0" +objenesis = "3.4" +slfj = "1.7.36" kotlin = "2.2.20" ksp = "2.2.20-2.0.3" @@ -79,6 +88,7 @@ ksp = "2.2.20-2.0.3" [libraries] # Crypto +android-library = { module = "com.github.nextcloud:android-library", version.ref = "androidLibraryVersion" } conscrypt-android = { module = "org.conscrypt:conscrypt-android", version.ref = "conscryptAndroidVersion" } bcpkix-jdk18on = { module = "org.bouncycastle:bcpkix-jdk18on", version.ref = "bcpkixJdk18onVersion" } @@ -86,6 +96,7 @@ bcpkix-jdk18on = { module = "org.bouncycastle:bcpkix-jdk18on", version.ref = "bc appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appCompatVersion" } cardview = { module = "androidx.cardview:cardview", version.ref = "cardviewVersion" } core-ktx = { module = "androidx.test:core-ktx", version.ref = "androidxTestVersion" } +document-scanning-android-sdk = { module = "com.github.Hazzatur:Document-Scanning-Android-SDK", version.ref = "documentScannerVersion" } fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref = "fragmentKtxVersion" } exifinterface = { module = "androidx.exifinterface:exifinterface", version.ref = "exifinterfaceVersion" } webkit = { module = "androidx.webkit:webkit", version.ref = "webkitVersion" } @@ -129,20 +140,26 @@ jackrabbit-webdav = { module = "org.apache.jackrabbit:jackrabbit-webdav", versio json = { module = "org.json:json", version.ref = "jsonVersion" } juniversalchardet = { module = "com.github.albfernandez:juniversalchardet", version.ref = "juniversalchardetVersion" } kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } +leakcanary = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanary" } nnio = { module = "org.lukhnos:nnio", version.ref = "nnioVersion" } org-jbundle-util-osgi-wrapped-org-apache-http-client = { module = "org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client", version.ref = "orgJbundleUtilOsgiWrappedOrgApacheHttpClientVersion" } osmdroid-android = { module = "org.osmdroid:osmdroid-android", version.ref = "osmdroidAndroidVersion" } +objenesis = { module = "org.objenesis:objenesis", version.ref = "objenesis" } play-services-base = { module = "com.google.android.gms:play-services-base", version.ref = "playServicesBaseVersion" } review-ktx = { module = "com.google.android.play:review-ktx", version.ref = "reviewKtxVersion" } +slfj = { module = "org.slf4j:jcl-over-slf4j", version.ref = "slfj" } # Mockito mockito-android = { module = "org.mockito:mockito-android", version.ref = "mockitoVersion" } mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockitoVersion" } mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockitoKotlinVersion" } mockk-android = { module = "io.mockk:mockk-android", version.ref = "mockkVersion" } +mockk = { module = "io.mockk:mockk", version.ref = "mockkVersion" } # Dagger dagger = { module = "com.google.dagger:dagger", version.ref = "daggerVersion" } +dagger-compiler = { module = "com.google.dagger:dagger-compiler", version.ref = "daggerVersion" } +dagger-processor = { module = "com.google.dagger:dagger-android-processor", version.ref = "daggerVersion" } dagger-android = { module = "com.google.dagger:dagger-android", version.ref = "daggerVersion" } dagger-android-support = { module = "com.google.dagger:dagger-android-support", version.ref = "daggerVersion" } @@ -173,6 +190,7 @@ media3-ui = { module = "androidx.media3:media3-ui", version.ref = "media3" } # Room room-runtime = { module = "androidx.room:room-runtime", version.ref = "roomVersion" } +room-compiler = { module = "androidx.room:room-compiler", version.ref = "roomVersion" } room-testing = { module = "androidx.room:room-testing", version.ref = "roomVersion" } # Espresso @@ -185,6 +203,7 @@ espresso-web = { module = "androidx.test.espresso:espresso-web", version.ref = " # Test junit = { module = "androidx.test.ext:junit", version.ref = "junitVersion" } + core-testing = { module = "androidx.arch.core:core-testing", version.ref = "coreTestingVersion" } orchestrator = { module = "androidx.test:orchestrator", version.ref = "orchestratorVersion" } rules = { module = "androidx.test:rules", version.ref = "androidxTestVersion" } @@ -208,6 +227,7 @@ stateless4j = { module = "com.github.stateless4j:stateless4j", version.ref = "st syntax-highlight = { module = "io.noties.markwon:syntax-highlight", version.ref = "markwonVersion" } core = { module = "io.noties.markwon:core", version.ref = "markwonVersion" } prism4j = { module = "io.noties:prism4j", version.ref = "prismVersion" } +prism4j-bundler = { module = "io.noties:prism4j-bundler", version.ref = "prismVersion" } # Nextcloud libraries ui = { module = "com.github.nextcloud.android-common:ui", version.ref = "androidCommonLibraryVersion" } @@ -217,9 +237,55 @@ qrcodescanner = { module = "com.github.nextcloud-deps:qrcodescanner", version.re work-runtime = { module = "androidx.work:work-runtime", version.ref = "workRuntime" } work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "workRuntime" } +[bundles] +media3 = ["media3-ui", "media3-session", "media3-exoplayer", "media3-datasource"] +espresso = ["espresso-core", "espresso-contrib", "espresso-web", "espresso-accessibility", "espresso-intents", "espresso-idling-resource"] +ui = ["appcompat", "webkit", "cardview", "exifinterface", "fragment-ktx"] +markdown-rendering = [ + "core", + "ext-strikethrough", + "ext-tables", + "ext-tasklist", + "html", + "syntax-highlight", + "prism4j" +] +unit-test = [ + "junit-junit", + "test-core", + "json", + "mockito-kotlin", + "mockk", + "mockk-android", + "mockito-core", + "mockito-android", + "core-testing" +] +mocking = [ + "dexopener", # required to allow mocking on API 27 and older + "mockito-kotlin", + "mockk", + "mockk-android", + "mockito-core", + "mockito-android", + "screenshot-core" +] +gplay = [ + "firebase-messaging", + "play-services-base", + "review-ktx" +] + [plugins] +android-application = { id = "com.android.application", version.ref = "androidPluginVersion" } +android-library = { id = "com.android.library", version.ref = "androidPluginVersion" } +kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } +spotbugs = { id = "com.github.spotbugs", version.ref = "spotbugsGradlePlugin" } +jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } +detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detektGradlePlugin" } +shot = { id = "shot", version.ref = "shotVersion" } kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } \ No newline at end of file diff --git a/gradle/verification-keyring.keys b/gradle/verification-keyring.keys index 56a931fe87be..e89a6eafc0e4 100644 --- a/gradle/verification-keyring.keys +++ b/gradle/verification-keyring.keys @@ -4305,12 +4305,12 @@ LvP3QTunylbyi7d08StavF/ke859RDaPfzxjyFabx8IX/tHw0L7rPz2B+TA= pub 0729A0AFF8999A87 uid Kotlin Release -sub 6005789E24E5AD1E -sub 6A0975F8B1127B83 sub 3FF44D37464BBB7E +sub 6A0975F8B1127B83 +sub 6005789E24E5AD1E -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGNBFzy4ngBDAC4mz6ELMWjfJ8GZtolq3E96T7qjfp4J9FxGVxdbJxkEDnn6MTg +xsDNBFzy4ngBDAC4mz6ELMWjfJ8GZtolq3E96T7qjfp4J9FxGVxdbJxkEDnn6MTg V8zhD7yeSZcUSvwzPiDlB/b4RYnh+5LjzKHTsrtr9ja0SupuCkVGkMGWeHhpIGV9 BekEY50RClpOvZktu/sSao6cGe9n/TQ9MrWwDDDwdUdZyain1xLoWVvLRxqk36+O kbND5RvwfHLquyxbbmQPNbXZTDmhBq38dfnH6QPogVZHR3XaEg/izbRdT2Z0mk/W @@ -4319,181 +4319,218 @@ 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 -YRZkBBq4sx89ZzMKWyalsQ8= -=CSQc +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 +KzsH9fpdPeIAPxCxefNNz4CkoQ== +=rF7i -----END PGP PUBLIC KEY BLOCK----- pub 07AB29E5E5EE5FCF @@ -4502,7 +4539,7 @@ uid Zhang Hai sub 81BBB32F3472C748 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBFV5A8gBEADau5RoDVKJOtRj/Ww/4Whdjwn+GMPfFOD4KaHfco5vPtxkgCDm +xsFNBFV5A8gBEADau5RoDVKJOtRj/Ww/4Whdjwn+GMPfFOD4KaHfco5vPtxkgCDm jHqC9FvLElNSPYqnrw2xfRPGYUAtVHSkBWOtZTknEm+S/HKuXwkAlKzEvR/drplR RRSdNOVhYVy97Fzay/MEFAmaqrr5xwas/3YGeeEwkFPsPCOToSTTP/qtjyvQZCw4 mrpXB8dlcise00dD/pxlpPIu/2rSBqjUVWlKgT7AdCBYIKtdOM/cgCcHIZ+pzuU+ @@ -4513,7 +4550,7 @@ dm6x7vA+ksbhOOkQL138zUY1cHoDTUeVn+MxQC1Ve/oJc+anmUkBuw8Y2jL6wOp6 JdKUElRx4hM0rFIpPePSufHFHm/UsGadHE+qkp35fWYfoA298m2MRwsB9yX80F4T 0OvFd3mJbIfv9uraVxxaiK9dCn6bbUJV4j5YJV/UGyZyjEUG1gqSoCIb6B3O79a7 xO5S/L7Aiu1vuDn/j7R7ZOvvfJMJKkBEoO0yeAyHKhgu+7ucYi4O9i5t7QARAQAB -tClaaGFuZyBIYWkgPGRyZWFtaW5nLmluLmNvZGUuemhAZ21haWwuY29tPrkCDQRV +tClaaGFuZyBIYWkgPGRyZWFtaW5nLmluLmNvZGUuemhAZ21haWwuY29tPs7BTQRV eQPIARAAu5WVS3iKj/RM37TFK2Zgy3b42c6xsoiFdDWhRUAdXCmgkgNYt5kMf/PQ y5xOmaDzDcTqNlGh6Gj4iFbqghYrrDHazN37SBhL7D9ALLd3QYExAq9mpIWBTtQe aTjXxqF6UP65Sxl/ZmrdyJsAKv7/df7/SRYpMbcoHMMtUUIw95j7nNNeF0PhM9nE @@ -4524,7 +4561,7 @@ er6DO2TfGn3rl3OulAf84TfzmJMkspm+PX/Uxqsf2LeXkaOjJlYoLyJ0fuHDQuo6 aWx6mJziaYuidf93uBznwMTfhEB1KemAhkbhk6DAKaBylLhrkERTE6O2nu3R+eaR laLCCYj4iRm1REppbM1F3TtLv4YRToBD0QYtzbxE/g6hsWSRUzGJrF8BaDp3fz9M u+CkwbfFPqE/CKw1Oqj5wxnraz4DEDm0CNeQGykV1ofMPuXWTi9BCk5iSZ7PINi+ -RrLwJOTtJrOsYMB5+X1trRYG7ypkQ7og+UUdN1cPoY+3tRlFvx0AEQEAAYkCHwQY +RrLwJOTtJrOsYMB5+X1trRYG7ypkQ7og+UUdN1cPoY+3tRlFvx0AEQEAAcLBXwQY AQgACQUCVXkDyAIbDAAKCRAHqynl5e5fz0tGEADWUd7b5UP9t5/PfLaHJEijuNs+ JO3VuugvTACtkjaeS9F4VDh+PslIMsWRg+c7pvUG8m8T7UQ3gjaTYj1iDsitxxmh e4QL+gDw+I7cV33CV/3C0b0gm5vO69ivPPQoLajwGUI8Pmy3U6u6BDy2jpt3fO2d @@ -4537,7 +4574,7 @@ GvsRXgfotWcFGT7o72y9hCVRoBUz7cxWzEGjy1iN+PbZm+CCFtqLafomxzDZo3GV iJIxnTtD9q8i15hXLGdPNAztO5s5+/YgUCNneqTSWfjRhgpCATl0UPXXkGwUqv+G T5e1yHzx28h4PeqqIjmHMugTvR4oXvAeVPNqPDZL6yrlcAXA3GtHjxSinMARFFR+ nRKcOypIrvfzqeXhsQ== -=5MLd +=pAix -----END PGP PUBLIC KEY BLOCK----- pub 07D3516820BCF6B1 @@ -4568,66 +4605,13 @@ i6QmtRdrToqqt1n1jGq9Ka7lRjq0xJHAZak= =7mDz -----END PGP PUBLIC KEY BLOCK----- -pub 083891AD4774845A -sub 8118B3BCDB1A5000 ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -=T2aE ------END PGP PUBLIC KEY BLOCK----- - pub 08A4A4958D61FC3D uid sksamuel sub 54EB00732104EF7A -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBF7ByYMBEADHxAxXj4u914xQb5fJ+sBvk0rKpqOZPFMIiuyNMD72Dk2jZbvW +xsFNBF7ByYMBEADHxAxXj4u914xQb5fJ+sBvk0rKpqOZPFMIiuyNMD72Dk2jZbvW ESuRlzp9MObyylGTsxeX+f+Fq+piqqgAAFWyXx+JNV4UkDLSt8g6n0phW97Wj89b ybWFDUnvgr+IeNZ0pBX2MPRPXrtZhayk8ahY84fps8CFJN/NMi0HExYP9Ttt59/b njWFDy9NI5/CzgRB9e4sv/mHPNwZOA8fonG3xQ0eBHbnl+Wv7wnnUixbtZt92ZEf @@ -4638,7 +4622,7 @@ eu2w4eTCIRCYtEr/LzVQVo/HYJDmRwoUI30A/IfrgNIDWjHkrG7uVpynt6dAddSh JfEWUFsjw4Oi+yHWWxeSjlLc/Uf9vt2GNjjpMXpp8r+VQsKqDbzKWOA9yrpIwhs9 Mu+qBOsBgCy6sPsJpZ7Qqr4gnh5vrBGZaRA5WRjdSlP5yzsYyCYnSCquKMy+Uk8n 54sRGRxcNjDVJVVlZuiFVbbX2f1OEgVNbnp0PMUym+QbJdPI//xjKYU2wQARAQAB -tBtza3NhbXVlbCA8c2FtQHNrc2FtdWVsLmNvbT65Ag0EXsHJgwEQANU52hl+lBeg +tBtza3NhbXVlbCA8c2FtQHNrc2FtdWVsLmNvbT7OwU0EXsHJgwEQANU52hl+lBeg +Z90jcTYOs8wU9beW+4jJ1WsbxpE+XOj6Nx5GhahpgVsZGt7fSgParuu/cEj6Vaf 6UL+dsu/jeSLgzQfEQ+W94MRgA6OMsl/g57T0Zj/Rgd8yhNOLBOUgVD/OVr56lEG /xPZGX0tJvBXaoJVoPDzS/sviYMEZurfA7yraa1NZw/n4GtKR2Gzl1Vejgpmpx5Q @@ -4649,7 +4633,7 @@ RDDY9LH3yRg5BcoQOr8JVmKJu+CoPwOfeadzOwzYtfTzBdvPyJkNaH+JsJc8hTYf M3rVE+F1rFSNxLfbjRpGOK1x9QW+/VY3gvywoMK/69JgiKkeFKO9EZGULmE02+KD jq+VC5bP/YblNdX12H8LV6sSV2QEcgpdIVevWv5Pro9b4yfhq5DmuKVU/HvNzkSY Q3fiOhhm2MSoqhNSOP+Gjt7w8YOUjmACR86yQ0982PIlBG4WGCO5vkSpfA8QMcYx -qicQ7wWelSY+gzPvUxJmeNiMJwhisd7TABEBAAGJAjYEGAEKACAWIQRcuhnlYUHn +qicQ7wWelSY+gzPvUxJmeNiMJwhisd7TABEBAAHCwXYEGAEKACAWIQRcuhnlYUHn jVS/cW8IpKSVjWH8PQUCXsHJgwIbDAAKCRAIpKSVjWH8PVfbD/4hpPgOe4RdC1cW hgcxXn7Ht2HOIFUbU5lDpucURdJWqarWVzUknfqwMzJpeQdRfgkckT0EB8nfgwkd wNbo9YPuWJ/hezYrCTVFDVk8ZAXIdy7b1A3l1NF+7y47b9p3PqfHg42EY2GU3tsZ @@ -4662,7 +4646,7 @@ RJxZc6/OpkguTbrCKrCpqIeoSfc7/HDUNnjUMj7CI/TQP0G0gcNJCnuWLfwbvM+y brNrUHgnWk7a0SwBYLSu3I74gPMEJ+4t12Eh7vlyMZ7i5E8+rcNkR4Fq/8XM6YvR HcnooxOWfd3bDjFBb6R5JpOPFPt2tBBvqTlxQFTz59eQmCu71EBYg/a4TKESlm7Y tE3KtJP0/IOVuzK22tPjBdeoI9FptQ== -=c4O7 +=9Eua -----END PGP PUBLIC KEY BLOCK----- pub 0B45DDD344B5FFD1 @@ -4701,45 +4685,13 @@ mZ1K7PFMlihijolHjIzECuaX2q+fJdK4RjxauGYUy0rQuklJxN14BWsjfoNxPzz2 =Gu6j -----END PGP PUBLIC KEY BLOCK----- -pub 0C907617691418AE -uid Markus Junginger (artifact signing) - -sub 0BD96E9C45AFAF0E ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQGiBFEhRX0RBAC9Fi/D2LPh2K3BAqLQLf2T9uQDimZFWSj0SzRN36ha6yRjCKO/ -yRQ5RgtY0E+ZMHl56sfvSSO9Kvkd+IWYAn4MJeMA2aAoXGwJ44JQNgvAizY9eZO1 -BKcCW2lvSFhzljp9ltzCx+pevbzZLJb/AlEV5kddwZHO4LyDIzVSYrK84wCgp3df -UycGM2uwq3VzeNMOd7IKS1kD/1IxPw+wTmcNLDEv5xXbWO3aIAek7UP9cMJzWSHH -j7PuVs8Vxh2vLSzOJp7yM5e0kcjlTK3jtCrdazbQCIN7M5AWN6stWN3zUy+/QypY -Bpn3aatNN+N68V2g/JAa3V0lbW7R+KuvYRW0Kjf1WrmARI6PDgHH8WIrcjr8TNzN -7xl4BACpRNrAFEp/sBeJ/Ofz7H4MDgy9Q7a8pubWy+G2tJHw+lCyybhi9U43RQxT -gNwnwHmq2SNr4ZQF6ZWcijf8GNqvchIpehv1/dlCnOysDKdFPtKNLsBygCrSNvs+ -mh/nacEz0VivrGExIAJpA+FQxYEUfsuEuz/QjM+kDoOdGEtlYrQ6TWFya3VzIEp1 -bmdpbmdlciAoYXJ0aWZhY3Qgc2lnbmluZykgPG1hcmt1c0BncmVlbnJvYm90LmRl -PrkCDQRRIUV9EAgAkPHfvOSxVHeBUrm6rn4hJ+r5MgYJRASH/tFZqjENR3b+470R -62s+y1NkiCrL5JJSbdnX43gt9s6gtGdX355xRyKfkSESWDc5rfTRRb18xmMiWV6D -MzNMXIyhTpZwDyuh9meN/MhXfKgJLTQqwgGESBhwrqfBrGffTnCyP3bpCFgJZs51 -CLYxDVAHtnNYUtsWBqbgxJ1Ay3SOi9zzI6BwvLzQ98Ikh8VSv6lNrqVVL/0Usv7Q -CMeahhdpHu0ZRAO/ZM1UAkjBpXtxkcwAK1zmNyovzQL/M+MPvUCQdBHYZbkTSuH9 -cxrLk9qFobMHHQSYpfXZ5PGs42plMkAsFP23BwADBQf/SdSJiEhQsZXle1dBvap4 -IvezcMfeqb+gh/K7UZmSFZu4dBAUi0apDpr/Y1Z2Meo2lgQo/oFQ12eedRgwpJZh -j3EY6a50XcvWkT3zFJLq92eEEQrtBHG/0BSAq3jNGPgj8sM/+cbw2eCqH4FQ+q3o -WBBDELzFKRTWs3Wl6sRw1xTIt7OBAHSDIApIVzlAkfL9aPrSlvB7LLGulqAFXsT+ -auoaeEMAmKNkg4AcJRv13hBBwLGTMoQ/R/sPFxyEh/mQCy3baZcbL30WeRp+1lA0 -F5gBPq1J3vk5/KlwXpMuZQBbao2SGTSQLeWhgzBcCpwYeQGMyJIt/N7tKO5Npqc4 -54hJBBgRAgAJBQJRIUV9AhsMAAoJEAyQdhdpFBiuk7wAnRGeGULQ52vSlNDhwZHh -9dVbfql5AJ0bDDsu84BtR8KT0LLx2TA4UpHuSg== -=dGO/ ------END PGP PUBLIC KEY BLOCK----- - pub 0DA8A5EC02D11EAD uid Paul Holser sub 71499A87DC1FF84B -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGiBE3LMfMRBAD90h69D8yyPWaSoAyh2mOOOZ/XH0isuBpDZCWptemlMHgImqdQ +xsDiBE3LMfMRBAD90h69D8yyPWaSoAyh2mOOOZ/XH0isuBpDZCWptemlMHgImqdQ 2sXLXYT1bJKmSaMw+yKjp8J/NYk69EbmSK1C2nypLQtWhUmXXd3XVYw6hrG/dGvi gjkS5eq8L04f5CSuXO7r1eLTOch9iDl/ESaI5Nhq9A3mRQIhQalum+FjzwCgx0PK hoC4MVPVGXzOQPc5sG4jzAUD/0OX9c/yKQqjHUs38HTCgrjseM40iPhp8NfbWenP @@ -4748,7 +4700,7 @@ IwUMSWXE3lz0MMeKrGcEOcZOGWsjyepkLHXwj8DDOeGxhfh9bhFRJssdfzOCKBpf Aq6eBACyywfwuVoY6lfNz70ZZqYjYuUkbKnKqpG0XmI+m5LYrUW7QuKJqaNdg+ZL vVgX/TdkWVSIoSRS5+eYm3fRD++cg3ZgoR6ZY4WEa7SRSp2zoidtQijWOzp8WeHs 30rIaXBrb5wHR4GQ4FYsBGRuWkmIaferusllUmHCHFJI4ldvgbQlUGF1bCBIb2xz -ZXIgPHBob2xzZXJAYWx1bW5pLnJpY2UuZWR1PrkCDQRNyzHzEAgA1rD70DvCcy91 +ZXIgPHBob2xzZXJAYWx1bW5pLnJpY2UuZWR1Ps7BTQRNyzHzEAgA1rD70DvCcy91 ShQKP2snZ4cLJnFwKArulDUcxoBZ0AG0qMbaE8jiiJTHIwgVrqsKaS1JENv6tVdU S8xHswu30zvd0obaj+4IGXlMVdc6052Y4SLAGNbGVw99Ah1OkQ7ov92gmYAYfqpp OtRt1tylz7Jf+F6er0umdVBZm8fJ+QjzTw36AwERj2bjVbc6ogM7OsTyru5oZGOJ @@ -4759,38 +4711,10 @@ k0kGDmZWcbinZWnybypili9ihYSHlp3EYzCNTbUMWlbhc/ffYHuvrZsIT2DxMPb2 iCnjPu5HMGegTM8iTTotW4xYmJUsEDIvgQUz0/UNsPHTX5XU09SocL3YOP5MxcEb gO0Fpjny3X76rc+ETAd9TmDJi7HOm24grKdOQXHQJr65j7nTc9M3zWnTxOP3fL9j cVnGTnLGRVoR7kedDpa5FsoFqtY8YMaFvNPVvI4+m+jozjNwTg2dGG6nU2dEC0qg -DEeKMSJwF1wgO3Fe6mXHvxratgNrqfdY/rtEGYhJBBgRAgAJBQJNyzHzAhsMAAoJ +DEeKMSJwF1wgO3Fe6mXHvxratgNrqfdY/rtEGcJJBBgRAgAJBQJNyzHzAhsMAAoJ EA2opewC0R6tNKgAnigkHDCNu7Owm8x01E9+aL73JmDXAKCj7ROh7Wu1iZQbjeJf ypM6CQ+fdw== -=5ywb ------END PGP PUBLIC KEY BLOCK----- - -pub 0E91C2DE43B72BB1 -uid Peter Palaga - -sub 83552A552A0D431C ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQENBFBIm/wBCACgqvegptBhfKbyBXZiW+7XchIJCOpwq0/9QgSehKMwELbUKqNM -sIVrywANqYn32S9hNRvBiKGm/KY7VwN9p1Cr6Ey3XuGSbRo/xN6tqfV/rV5YClL5 -6sMc67BlnEaCZRNuB9ATeUE/4wCO7fWg79jJuNl8tKQ8EYIrVGizzjmZHt76OwAi -hQtD6A19+qjQ02SyPUJS6a2lKx+gwaHNxv4L2FqImCFGOOEToyRb12GD18Mgbf5o -OtQVVtr3qbT07odFQt8Iyy1DiNUJbOfC+YO2wO7eMTr5xaFr1HejsTvKZiTDC0Nr -EjtctqGxrjxPmoUPNwtxwEDTEh1lyKMhnqgJABEBAAG0H1BldGVyIFBhbGFnYSA8 -cGV0ZXJAcGFsYWdhLm9yZz65AQ0EUEib/AEIAMDUgjnPKBeHIN0KNmXTS/uXXC4L -TGltnQJ57OG2kmPz/JjAjYLoLvINY+xtghehMhRY3DmQDy/ufZsgO9oH8PztcC8Q -L5/dV6VTYf4U3FndbiSKgikaBX7yu5Qcrtkv8XgkJ+awIEUgTGDXn2VT1hH6yEG1 -tA97iT/d7ZUxLEBsVgbxz9VtPellTNK5x/8NGY4NW+fM6+yGFpjr5juZVYRLa8u5 -65vGBQO5FU7bg/69DftmL7vO4KRLs154VpsfAsTeo1rmU/8kIjgCVeKFClJG+Sg+ -m9rsJNYgiKy9dGfD/qDmVlEeWBuhtlAfqM7pHTv1Mu8mv5/DheBwvlwheg8AEQEA -AYkBHwQYAQIACQUCUEib/AIbDAAKCRAOkcLeQ7crsaE0B/4/+ZcjdUfLPlKk/8BH -0tMafEWOGvqY8bG4YpxGoJZHT/Lb/cnWDLvZzs98FVaQ3DKHZwQhhtnQIhnupvxS -HX5wLeBZMtAANGQLauGp+A3S1WBVRHs0mzOdlVDbzJu7RW72mnkRMSoVd018fh4e -Q0+VpZh0Pf9KfKJDwpEuESP1+6JcLLBvQXlEJYHOk7Up5eRkhljdIwz3TlSuJ9sC -scTgM0PI7/L1eFP/iCgZIBHhpllVV6v5IGXx3P5Q7YQUy32zCrht4t9fdtdLct1j -6eNaAQdPAU91auSbYhuVCpjgKNpwOv1ULoSWLUUPMNW5Qc4ZDKq+ywOElvONMnX4 -oaQ1 -=bkWq +=uZwU -----END PGP PUBLIC KEY BLOCK----- pub 0F9FE62F88E938D8 @@ -4799,7 +4723,7 @@ uid Brad Corso sub BF6D15D3F1BF7BCF -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGNBGGNmd8BDADSpbdIfqzkUNAeYlP0nUw/HFU/v+/aydtjUioAi/KxYt2FOMi6 +xsDNBGGNmd8BDADSpbdIfqzkUNAeYlP0nUw/HFU/v+/aydtjUioAi/KxYt2FOMi6 gk1LOJzHBubv8bF79mlN6sXrnq2lV/MuqvN9DrTAQ4u4Dh0pgbLK6jbxDWPGrYIo ov24dU+1SXCInq/7X71M3RT3/1L1kTL5WNCqKkhxLNi0bwjyAHR+xOdhPqkeTrZK xZB4KvIzI3cIYoSw2tFn/iAlzzaUyQY+JkqBbcObbzyMt8ai7TdXKHM5mAiuMt8k @@ -4808,7 +4732,7 @@ Iw4/UrnJi4qzEN8vrEJpnDgfS5Ey+io9xcqd9P66dFbVHvMl4uTo4hLZVz8dkWSt CkCtAfntHAp4Zf+1vIZzbAgseO52D1mP7wO0QccgqdX0w5Jboc2kkM67VsWskRXL FO+c25gXdtZk26d0P3f1j3XuDm3pPWbgAk17HMyMpqla3xBQiLA7J2l41YwblV21 uzJnqAoChPJhP6cAEQEAAbQeQnJhZCBDb3JzbyA8YmNvcnNvQGdvb2dsZS5jb20+ -uQGNBGGNmd8BDADVtB8O1uCVcw6DOKpJ1YBDmOw1a4hxMApwnoGDV3dr8HqybYi8 +zsDNBGGNmd8BDADVtB8O1uCVcw6DOKpJ1YBDmOw1a4hxMApwnoGDV3dr8HqybYi8 InNp7TTuGcZ/rpGCSIMEqmqwyNvnJfIZUv2Wr4oeA/DcfxMxGJUrFeqv5Daz1jTQ 9Hk+Cpxxktm5StsEnArve7f69+Ebi6C5tA+dF3yw/BNf849e66rbkW5lvlPjRiH5 mM2y2cE4SlZnpuryHaQxabrvOtjAp0E6gdFTo2e7Z87wK4vjaVCaS+lMi7i22Nsv @@ -4816,7 +4740,7 @@ JhkxiMec746krTXgf0HcOxG+ABBPtCfmmDLHAX4C6IKp1E/68XM7vyC8NGlQRCnT dmwErcslVepBjw2T3MI8PPRPT/XMvlkcVd3OnFU/Ewj1ym6ATRCvjmqHmGS3P5yM Tr8Nhsa7xb9uoNHNePHP0VQDkD+y/+Gz49nRBVEUBFFyih79qvOK3HERzVfn0gEJ CJ4f3FXMLqAR4jqM+CJaj6AQEi1C3/VR/gJc6BK1NunMz8YIl0HhVJBd6Ew0ojTM -EKwS0FaAM+ACXBUAEQEAAYkBvAQYAQoAJgIbDBYhBJURUZfFInwIhymdAA+f5i+I +EKwS0FaAM+ACXBUAEQEAAcLA/AQYAQoAJgIbDBYhBJURUZfFInwIhymdAA+f5i+I 6TjYBQJlaOQXBQkJfuS4AAoJEA+f5i+I6TjYLPUMAKhSDd9V7A3901gv20/izs+v DA2ysg+eZ5O68FgGss95+0hgWhZOGsa/9yMwU9KqRRHo6V+ZhQmwvh3bpfOZXpza +OE1f0JgKpPlVgfbH51DrvwYRwRyPDkG1+72vGzaBlE4gUEaGgjxPVuOrqVcNZtV @@ -4825,7 +4749,7 @@ D0dy+8EoeHgPIQAHLA17ZwvO9ZYwA8uW/r8soWWfhy6M5ojN9T+hYwUbr2P3wzba E62iUqpt/eAC3cIOCU9BXeGhiH9uOyE/GqKJwUuDCYtWrgss39EqfoI9lLqFg+iv rZzxcrnDRhqFNbpaE105ggYtrTWIJnT/GidvrNOmOSkBxfphfR9H82KQa7PvplOb /qh3zzJIozFjdILPRPyUcw6pfvOcFtVkJO0TkSuKdx0MiGS74bULHf+FSfWKg2Xa -ZHkCkcFy2UVGc1k3Vd/5GHsKf7Kx2BYlQVm8vlkwEokBvAQYAQoAJhYhBJURUZfF +ZHkCkcFy2UVGc1k3Vd/5GHsKf7Kx2BYlQVm8vlkwEsLA/AQYAQoAJhYhBJURUZfF InwIhymdAA+f5i+I6TjYBQJhjZnfAhsMBQkDwmcAAAoJEA+f5i+I6TjY0AMMAK0E esMWOG59+JziAGgySBIeYbbF9atKj+OjnryEl1S/BQqUuLH2jeKqY8bLSMuRoZnj D+3d4WtMZ00+4l3rNDV8M2btqUKfJRjOjFy3jI67uaYjXTsc+7EA0a+ZX2F/If5R @@ -4835,44 +4759,39 @@ McRMj06zxZBUZtT2xLVvhh05dkQ5LhZLw1ApHMt6ajZiJQ0h0jpBpFYK8nJkJ8R5 ZagQmg8wpmV1IiFTlQy1Nozt/afXywKf2tcGxxLN47oyVzJpRCcwj0pqLgLr635O siFmtIlBAytH2UX7M/9gkq9bbAkHDyOEmvTh2Be3gbtWuaFLj8du2YuNCyXptvvL xV+8+asS+ID6jUp5FJ4izH6U90j4iiBfqIu+UEw+0gvD+TVqpqcj5pNlgU45HA== -=Cl60 +=GCk6 -----END PGP PUBLIC KEY BLOCK----- pub 1063FE98BCECB758 -uid Roman Ivanov - sub 25A93B1970C22A7F -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBFOpAXABCACsTEEMlNJ65WN4hGR+y3Dy80YQoI6oFivmf2kjOz5JqsBkoDaA +xsBNBFOpAXABCACsTEEMlNJ65WN4hGR+y3Dy80YQoI6oFivmf2kjOz5JqsBkoDaA vKl+OqLNIeYu4YXBFBe6t9YZvcBKAU660bTVuiiC50PNL2z9ZU6GrLNP34uKvyhP tQnZdiS+qPBn8X5Cl7XtPqlwUNRFrtqHiBgymwGGTLfhVZKJXXB0xU/UsShSHYyS YESrH89xe7LfdW5QAKv+4MxMDDZi/kBWSGGfdgWBvYYlsVmRv4JbKahBMmpM7qH5 RbTw6km6AO7kOxcM2BfdwmVncUhj532zXgwS6q8ipv9jzuHCeALEzKNHr68dTq5D -WAnJT764ovyOJ9yQ80wGmzYRyfp7Wctq80KnABEBAAG0IFJvbWFuIEl2YW5vdiA8 -aXZhbm92LWpyQG1haWwucnU+uQENBFOpAXABCACy+tNhlC1NHpAKihGKn21/Ytdu -Syfdbf7E4dzBQf0gan09/6tIw4rhOAPPXkbXRf6MfUmFet2AIO9cBce+p1ipv4gC -vCPWT4iklhdfswRhcF7SoPHppOqG0/SmWHps0q716c14syNNwnxOHzKpOoiRk4iS -g4q0Nt9XwfNM4Bv1YR3SC7uKpz/s1jw3yoWwTA9MxQ2y2ouOmvuSc9yJPJj8Z1N5 -vSGIHEfDvq12rCUBUCHsF0SdQoRgJyxIsmRpmk0NY1Nj9nkI5W6koghUhECEFdZi -XjMaUGrzH2ELEFUTWtOZo0ooubbVkSgtMVNIExWCYzCJ3JeohYp0itzi+XANABEB -AAGJAR4EGAECAAkFAlOpAXACGwwACgkQEGP+mLzst1g2VQf43jMRonbGeUUtYW2r -dGmdlyOuLgSfdRhGck8mMAq5wjMWFVRrXLUlfkZQRtvQEzHDBwyipIDcE6O2+dpf -Yr7A0BW5U4MsluMJMlsXCxwOe/wD5vOBVcDIftSQnPAtT+Tby1McSzKd7orN/MAn -pvwK1/YJqH/1LL+1MM/os1srb6BzZRjMGC6VDOY9h0PcasAhE1sepKzF0pCeQ9MD -e2bCKMw8eGMNmsG9yxvsuftUGTJU0C/FPd1tp0bAird11+bfmN9qBvZDGgauCGBo -YUJua1yjrc9c2VBhq64V0ocrOfvZf6IAlCCJW2Ue3nHGbwOcK3xEZ0r2iG4EKYTj -GSJf -=L+Xu +WAnJT764ovyOJ9yQ80wGmzYRyfp7Wctq80KnABEBAAHOwE0EU6kBcAEIALL602GU +LU0ekAqKEYqfbX9i125LJ91t/sTh3MFB/SBqfT3/q0jDiuE4A89eRtdF/ox9SYV6 +3YAg71wFx76nWKm/iAK8I9ZPiKSWF1+zBGFwXtKg8emk6obT9KZYemzSrvXpzXiz +I03CfE4fMqk6iJGTiJKDirQ231fB80zgG/VhHdILu4qnP+zWPDfKhbBMD0zFDbLa +i46a+5Jz3Ik8mPxnU3m9IYgcR8O+rXasJQFQIewXRJ1ChGAnLEiyZGmaTQ1jU2P2 +eQjlbqSiCFSEQIQV1mJeMxpQavMfYQsQVRNa05mjSii5ttWRKC0xU0gTFYJjMInc +l6iFinSK3OL5cA0AEQEAAcLAdQQYAQIACQUCU6kBcAIbDAAhCRAQY/6YvOy3WBYh +BAbTTtb/c942incqeBBj/pi87LdYNlUH+N4zEaJ2xnlFLWFtq3RpnZcjri4En3UY +RnJPJjAKucIzFhVUa1y1JX5GUEbb0BMxwwcMoqSA3BOjtvnaX2K+wNAVuVODLJbj +CTJbFwscDnv8A+bzgVXAyH7UkJzwLU/k28tTHEsyne6KzfzAJ6b8Ctf2Cah/9Sy/ +tTDP6LNbK2+gc2UYzBgulQzmPYdD3GrAIRNbHqSsxdKQnkPTA3tmwijMPHhjDZrB +vcsb7Ln7VBkyVNAvxT3dbadGwIq3ddfm35jfagb2QxoGrghgaGFCbmtco63PXNlQ +YauuFdKHKzn72X+iAJQgiVtlHt5xxm8DnCt8RGdK9ohuBCmE4xkiXw== +=cyV9 -----END PGP PUBLIC KEY BLOCK----- pub 15C71C0A4E0B8EDD -uid Matthias Bl?sing - sub 891E4C2D471515FE -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBFcyNOoBEACj0zTN3GkRNAY3jihHZdGvi70i4R8mUfcQUwWGRsGGlzSwyJfe +xsFNBFcyNOoBEACj0zTN3GkRNAY3jihHZdGvi70i4R8mUfcQUwWGRsGGlzSwyJfe 20qNOHqwHaxVCAIp4e5paNf9cEKepOv5IqMkmaRdiC2W+BHDxcJgBot/IrC81ube y5M9gIc0yCynC4Cnmg2DmRWuafVvqogz0vDKUG3ADvPgRyaItzh0xO/PsWPZvIHD SlCX9Ny/RT1vZ741tBUm1flGUzxs0zAPt0I+ievjwOeKw8OeUb59sc98U3XpVOVQ @@ -4883,110 +4802,30 @@ yLjz38gwLCIuVrSFeHtHJKdPPsnWVsA65o3iCQyEO5lp38cjDE1hkHzXGO34LiPX AlDHU2YzoWvAHPqSppppjPJmz1tgHqx146tukezuzoRXuEUTmDAjbpLEHxvKQuBr DcSfWqe4zfKKqH/CfhxlPGilUcVyLmhaHjs1ti1Bnj4YmQuWo9BR3rPdLi1gQFlp wZfzytmmK6Zy4Ek89la7cgt6AF3eXjNmpVtGZlAb7lr3xne9DTp98IW3iwARAQAB -tC1NYXR0aGlhcyBCbMOkc2luZyA8bWJsYWVzaW5nQGRvcHBlbC1oZWxpeC5ldT65 -Ag0EVzI06gEQAMfgdIiOy73j97TMYElvKsUUITwhIZMjscA19RB4vQKmXsRulA2M -gYVsS290+F55rPmEnmyDd23+iDd9D2gEBeSTHrleZGewvBi53m4jhtLbjRRX4dcM -EEBVMT+W5B8inoJYiZJjd2l9JFlZqteRTe8O1mCPd2tKtjwNssE9ToH17tCpOjLe -qZlD39U3tARdH4DI0NHZqMRsLOGRbK9cP7tUmD6XOEOfN6kjGYOaluLCaxP0nWL4 -GgbwWs375lFVdo4SyUBE/T6u+kgrpFkb3B0G1vT1Ek4MGe5/Kmtg/T/8aZxnI5kJ -vIsF8mo4ju9Ri7vzHIFxvBCBu6XAyinew38iDEJMYVjhHjBoeaB8x1qAE2hsK/lu -M4N96AB4qYj9OaDiyml8ffX5hqGe1hn4xkLGBsJZGk4O63omVn8pbTXkj8ECOvFy -P9aigMzEaCrztIBgXr4qX9mbh42nx6Z24h8tCC5nKYCvLNZCLFbBkV+SKz8NVgA6 -FlZi+VdqjVE8AwwcWGG37nvxq0qkljMxxrpbMZflO4tKKna1dFHljyTu9YxURBpO -VDIdACXePDrZJzhYju7u8Dd51tb77XAfyRC+gdMiN1QekYSQaI0O5WLZ2WvQsfXI -ShXKhli76xJ5GEEp7Me0+w53TaJUF68khemdUD3P8WVMQ4F9zPigUrKJABEBAAGJ -Ah8EGAEIAAkFAlcyNOoCGwwACgkQFcccCk4Ljt3t8hAAmfRLEBwnmJIp6cgcLOJ6 -kM/1nreGOq6ECCYOhXFzWynhjgwxSteq6dK43mLZFc1gfY508IK/I6O3++OMjSk+ -sDGL4PqccTr68UBowLTN4oV0rIfJtp+D3LN3R7rS/j+9c6Sy0GrzX5ebxrAPbQnD -j2sEAW76myDENpKjyMp5nnfqeL16tNNnUVP55EbygguWFFtdfo8pIl9hu/EzrwtY -l4/Ifx+N4vgN9l94CpsPkzK38rBTmIXMTGd8iUbQV7XYl078ZiDKqT2XYehu6BF3 -nhIFb6CzI0IbmDbZoGTdJ51pZ8u2swZt//bDRRd1pFPhBkCRC+EbnH/oBadgVTx4 -3F7p/jixoWXqX+ZvTZCnoWA1MC1QVLzfvf7D6Rw5vNtA8mtlEqMKzx5Kf3YeUN2F -IvkDbCfX51QlJC4Oe9J5vdFjnooWVKgiBPAar689Y4C7tzpGM2KOcl0+io/g9ANk -Sm6cpRCTZKwgOXl0DVebeWjsdt6/bqHKOPLhLn0UNbUmMzzrPo71y7qiMDmv5D8K -/aVgxiX7roDSv9PSqwsZ3mw+EV4LQr12Aw2WG2uNijO99r02xqNU6vvHEglWH/f5 -gT4eYNEtGTqyp5PNTuYkI7GKybBgEPtLjZykvvWJNn/P6KdmcsxQthX3XnbCIRq2 -LDL7A4GNor2DcqTyOw3cjy0= -=pzVO ------END PGP PUBLIC KEY BLOCK----- - -pub 164779204E106A76 -uid Shigeru Chiba (Javassist Developer) - -sub 0E26A79FFE07A3A7 ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -YM0/Z4ojbX/WFQ== -=AKY2 ------END PGP PUBLIC KEY BLOCK----- - -pub 164BD2247B936711 -uid Marc Philipp (JUnit Development, 2014) - -sub EFE8086F9E93774E ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQENBFPU8TIBCADGNvExYTJpVuNGCF9NuWw+IkitjAD7WzF7QkvFCSw9VftzgTUZ -3PYrThRiaDdmHQAke4Sp+nYyAJ7iUcQqg/5/ONiMdzXEv5Kwy5WJN8+o2aXSunIT -PALIw29DemZdVerw8Xc9jcdNYGxbPgtfSjr/DBCBs5Guq+RuuwsBvyTGLiHpc6hb -91D/wX6Y0NQB4UlY9f3k6AgqiR5OGq602hXYvL10pH6eT3gSmCvxp1WvNJDBmaRi -ZdgW76Y+bGQkmygWdAb3Q2DUEQHVH30YTBx5VFoiCfx1Jud4mD90Tv1hhPn0fS50 -oLGqI6f+VB14iJ4XLaSfyk/UMl343iF9PAg9ABEBAAG0PE1hcmMgUGhpbGlwcCAo -SlVuaXQgRGV2ZWxvcG1lbnQsIDIwMTQpIDxtYWlsQG1hcmNwaGlsaXBwLmRlPrkB -DQRT1PEyAQgA0A5RG31MshHFziVkue970s1KNN7eDzww5KgIj8SzI5Hi20yZzs2o -2ALBhfK42VqT6NIa6ktuJQJoWr6KhhY+kMaZlkt+I0U+Llmby4l2jlG6lFPNZYIa -vLOFvU8eWvU934fgLutK4HimBNo8HTqn+jsfoNTf8cpvcASQnjQVOElf5xTYQ6RW -z331ZDpfJpuPyPWK9/GMHQrurhK4QYSla9sYdYIZM27OmNxdi9haPLSkaAmeYF9p -ng0CoPqanI3HfIN9W9Uu7kPczW3Zr1DgXq4pto7rlK69M01GewKMVuTS2MJqzWza -P9BCMj0jI+icpSRV0696A/1eZCR7Vab9NwARAQABiQI+BBgBAgAJBQJT1PEyAhsu -ASkJEBZL0iR7k2cRwF0gBBkBAgAGBQJT1PEyAAoJEO/oCG+ek3dOenoH/1vTfHTz -f4Z1odIE7lC98k0zF7jtvPHndsUysKp3zMOtruEb8CE0cuw9Z0rYzIBzVTzNm305 -So7G1xv3HVOd6rVcMtpsZpo2dAyFEbBTyOqbDKfWrGx4T9e61m7syNCCjadGlTAE -r7XLkJwLgjhHGwTN9/VEWz207JfL6u1XdfaGGSxPgZRqDw7c+kKax1fU10wV9wv5 -bs6t/fnPqJppZSR607BiHNUAt8Cpn7kEC3Rm8mS2ufqg5LX+quLlgl4K7L+EYecq -5Ox/UG4lRCNGa6e1TM/LyoM8GpMC0OOK079GceNjR+r1Jx5fxD8Qi04rKo8U4LZd -8Kig//NPGjBx2ytpcQf+J0linycedx3OyhGifM1j7SfrWpeQT/TJZG08qVw7mr7e -LzYgtPfz7YzsxCAcGo+IvxSaxVF8c3BMe0liwwcSDL3SF5XWYt+3X04e9YTODKim -D4bqhZto/DsJHR2Md8m8Q8Za+V1bS8clogD1f6Wbo3adzy2w+braL+KDyjm2NQsB -SuLNBqcK/ztXGqxK3bhWH2wT541djd98y/jB52X+eVoeCEEPZi21wW6UDCgHqfC1 -Xxhsq70BbH5RCwIMx2iyVVoKEyxNhaOgApSfq9mko0NAlpAuT9HbTm6GPVgoEzTA -HBhD37R+PsUfSEPep+pmyBlX2nrKxxoRNsl5KWNiQw== -=Phg6 +zsFNBFcyNOoBEADH4HSIjsu94/e0zGBJbyrFFCE8ISGTI7HANfUQeL0Cpl7EbpQN +jIGFbEtvdPheeaz5hJ5sg3dt/og3fQ9oBAXkkx65XmRnsLwYud5uI4bS240UV+HX +DBBAVTE/luQfIp6CWImSY3dpfSRZWarXkU3vDtZgj3drSrY8DbLBPU6B9e7QqToy +3qmZQ9/VN7QEXR+AyNDR2ajEbCzhkWyvXD+7VJg+lzhDnzepIxmDmpbiwmsT9J1i ++BoG8FrN++ZRVXaOEslARP0+rvpIK6RZG9wdBtb09RJODBnufyprYP0//GmcZyOZ +CbyLBfJqOI7vUYu78xyBcbwQgbulwMop3sN/IgxCTGFY4R4waHmgfMdagBNobCv5 +bjODfegAeKmI/Tmg4sppfH31+YahntYZ+MZCxgbCWRpODut6JlZ/KW015I/BAjrx +cj/WooDMxGgq87SAYF6+Kl/Zm4eNp8emduIfLQguZymAryzWQixWwZFfkis/DVYA +OhZWYvlXao1RPAMMHFhht+578atKpJYzMca6WzGX5TuLSip2tXRR5Y8k7vWMVEQa +TlQyHQAl3jw62Sc4WI7u7vA3edbW++1wH8kQvoHTIjdUHpGEkGiNDuVi2dlr0LH1 +yEoVyoZYu+sSeRhBKezHtPsOd02iVBevJIXpnVA9z/FlTEOBfcz4oFKyiQARAQAB +wsF2BBgBCAAJBQJXMjTqAhsMACEJEBXHHApOC47dFiEE+nkp+DrUTEWQ9sxoFccc +Ck4Ljt3t8hAAmfRLEBwnmJIp6cgcLOJ6kM/1nreGOq6ECCYOhXFzWynhjgwxSteq +6dK43mLZFc1gfY508IK/I6O3++OMjSk+sDGL4PqccTr68UBowLTN4oV0rIfJtp+D +3LN3R7rS/j+9c6Sy0GrzX5ebxrAPbQnDj2sEAW76myDENpKjyMp5nnfqeL16tNNn +UVP55EbygguWFFtdfo8pIl9hu/EzrwtYl4/Ifx+N4vgN9l94CpsPkzK38rBTmIXM +TGd8iUbQV7XYl078ZiDKqT2XYehu6BF3nhIFb6CzI0IbmDbZoGTdJ51pZ8u2swZt +//bDRRd1pFPhBkCRC+EbnH/oBadgVTx43F7p/jixoWXqX+ZvTZCnoWA1MC1QVLzf +vf7D6Rw5vNtA8mtlEqMKzx5Kf3YeUN2FIvkDbCfX51QlJC4Oe9J5vdFjnooWVKgi +BPAar689Y4C7tzpGM2KOcl0+io/g9ANkSm6cpRCTZKwgOXl0DVebeWjsdt6/bqHK +OPLhLn0UNbUmMzzrPo71y7qiMDmv5D8K/aVgxiX7roDSv9PSqwsZ3mw+EV4LQr12 +Aw2WG2uNijO99r02xqNU6vvHEglWH/f5gT4eYNEtGTqyp5PNTuYkI7GKybBgEPtL +jZykvvWJNn/P6KdmcsxQthX3XnbCIRq2LDL7A4GNor2DcqTyOw3cjy0= +=LjnX -----END PGP PUBLIC KEY BLOCK----- pub 1669C4BB543E0445 @@ -4995,7 +4834,7 @@ uid Emily Johnston sub 5F6BA89D4B0869B9 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGNBF3TQCcBDAD177B+Btl8XBEkBQ5jFSezFrpEl4arwCEa7htCp6T3h55HvYwz +xsDNBF3TQCcBDAD177B+Btl8XBEkBQ5jFSezFrpEl4arwCEa7htCp6T3h55HvYwz P7Y9zWYXfhAC8XJlPQJYpqaQiiYtdlmOrOS4wbp5Lr+z/0XpFlJFzdKglxKYcdfP ntnGyoj7Dz03v+SitL9Ct1YZmOGz6onlifXsCTkWraSJTqR6/y2dL0Beu7dLZp94 fgf+FAfr77bwGhUhOh0pPI6ZK2VwNMiQN92jS/RYb6i7QjzO654ALTBR6R2sqx26 @@ -5004,7 +4843,7 @@ itFIh6efV75W9nDqp9QB/1G808oYx1rglUstOCI0axSgSNyazbInW9qOI58rLQ4v wnCSTWvesVNq+uO6aVrfpXIO3uUTI3t4mpBZgVYZ+g30BlCPRx52YofvQzYbbk9d wCMUDQAzKGJi+mazkgBhcz+neEuNUlR/0fBMObzb7cAT4gGo/sSzYVNN5oT3u/Mi J4hfzYUTFMsJBp0AEQEAAbQnRW1pbHkgSm9obnN0b24gPGVwbWpvaG5zdG9uQGdv -b2dsZS5jb20+uQGNBF3TQCcBDADJ17PQ4z5UVGBVUefEkTXeVlGX4oc+vUOVn8Z9 +b2dsZS5jb20+zsDNBF3TQCcBDADJ17PQ4z5UVGBVUefEkTXeVlGX4oc+vUOVn8Z9 B34sQkFmgsORuwm+/1rGthrMatro1Jka4UXSxYFMCt6XBz4/OdJbquxs6D85iuda Id9aozCOJypkfprp+ez2PK7pWeOq6DQ/lqqNGyoHxA703wshI38sNcKRcypn/vf1 VJlO3ZjfLCVDQw4+yNrdWiwklb4QS0xwjK9Bw9m8g6HiQGil8V/kL9Avpa76rGqa @@ -5012,7 +4851,7 @@ P9YnkTo7NQG0cwEbpcxNUrkO7fFKjTOMTmfPkh5pHAHVS+FsrCsxhRs6Eb6u/qes tHjpYj6qtMJ5V7oXeUI3OZ9nAPctSxoNVn6f0otsaatoBwcJNNhO/6ZIFH7NlgYQ NN3a5Pz6NrU13+zMGbsxYzlL4/nVwhdn/kHPQ2tl4e2R79da7ModAjeafimikA3n GZj1Zvo1iXKLfguM+U90kTrPKSxcJqwgV4QvrO9Z9llRTzhdBmrFePFhlxN3JdpS -KYXFInq6JwncmOAeIDhNYYcVXhcAEQEAAYkBvAQYAQoAJhYhBHYVrVYUTfI3b0nZ +KYXFInq6JwncmOAeIDhNYYcVXhcAEQEAAcLA/AQYAQoAJhYhBHYVrVYUTfI3b0nZ ixZpxLtUPgRFBQJd00AnAhsMBQkDwmcAAAoJEBZpxLtUPgRF32gMAJoI+6dvnT7G OJB4S0HAB2qhizmQ5MWiO7QE1HKQ6ShylihJfAIMnAMlLPhorr1ITZXaNMFO+rWN O76BdsBxAkd0rKIIjMTU5r1HuS+XCGFzitffkJ2TgQ2K4vKnSgEpCsBilgCJzdJe @@ -5022,7 +4861,7 @@ x/p+ePpIj6J05TM0BR9KLrk3avMIK+eKwcvm+nCyYA1jKr7c9E4bg+6sRbc6igvV L4QeKzjeGll3vjifmghVXVKVBOW1fk10cMNKaTEkGng8OfLhJDQDXuNz4m8/pMA/ wyGfH3HBGSx+F3GZUb00kU0HbxV2Vt0QlyjwT9vJfVGQ4Y+GhnMF6qErtdX8cBIW FJXLEW77wWHN+QpRD6BShYZDvUA2mtO0zlB8reU+VCxgnFfm66DkUg== -=jYDe +=9BE2 -----END PGP PUBLIC KEY BLOCK----- pub 16F71868F1D3A389 @@ -5031,19 +4870,19 @@ uid Lukhnos Liu sub 0433AFA915028B02 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBFAE85IBCAC5mX3pJvQPtKbrbBwZ0H8HUyjJfEYWORWVHXQR071eD9Qf8ZCH +xsBNBFAE85IBCAC5mX3pJvQPtKbrbBwZ0H8HUyjJfEYWORWVHXQR071eD9Qf8ZCH 3i6k0HnVBrYUl5XiBQmyolemnigGTpdMWZyirDPQmyzkPZcrdBrzcfU12QrJJtiZ b7ck6IN66YVdKByAB5qtdEVzoA//oWTRiBaEa+HmaNyuF9A9NLH/ZNz/A0bF8BuR aXAXzBAcXEA8cvhKrk5X8SHsJTqdrCfzdaUinRUqTF+Ya2rKvd0iB8knWaJFJqx4 x4vq+6oVt9R0dhRAGy+vpaQqdCHnI0P7OzySgBSgChttP0//6kl2DCJSUIt0rJbO 4trnj0MUyX3c93DFNH9CElW4wACPoTFTbQrDABEBAAG0IUx1a2hub3MgTGl1IDxs -dWtobm9zQGx1a2hub3Mub3JnPrkBDQRQBPOSAQgA3Y+SC/bRHaFZGBMQYbYNJHC5 +dWtobm9zQGx1a2hub3Mub3JnPs7ATQRQBPOSAQgA3Y+SC/bRHaFZGBMQYbYNJHC5 37xOtusvJSXdrQ2Bg8u6C4vJvhhy9oEy8TQKiiCewXGv/xkTrLYz8wiTR5ovT7tt 5blRT2uvIGmChz7VgUCyyx+jyRzFfBUZvZIaBJphJk2uTHMFNkfJ/zhNXtHYH7HQ I/YRxcMY5YoRnlQiGyg0zzPvgyMXcSmIw3kS9TINzYlRUgVv6dfO6NTmXD7bqO2E XHPo7xGYJYYR0y4hl5meHqIu1YnCKFaIxuRDq3Pap82a3b7ZPcKqHwA5GvTKnDmF TUFjPPw24cPbfDiAf1/3erHXLx4DdBpjkPL70oWurZjX52XS0TgEvug0VrUnYwAR -AQABiQJEBBgBAgAPAhsuBQJWlgVPBQkIjKMMASnAXSAEGQECAAYFAlAE85IACgkQ +AQABwsGEBBgBAgAPAhsuBQJWlgVPBQkIjKMMASnAXSAEGQECAAYFAlAE85IACgkQ BDOvqRUCiwIZZAgAiYbQVGPLexnh1txfAQlH2kBE5MTFHQfhB4xu2PHlzIaBg6QW 25B2M3AusRnR5Wftrw5Nql66Jz0kuAIOW+5znHbToWXaV8IzSY8lTcpbv/jmysoL dvPCaSqsriaEmUkpZ6fA/3pqmqfhmzVzSYyQh08R6fArqFRW5Pm3o0oNpKXcj+Yy @@ -5055,7 +4894,7 @@ e+Mwl5YnQdo2EwWo/tTvfZaeTpENGk3hOuO+PTft6KLwslhuPYIct0hzla38GbcO nv/XV/3tMb71WdoY9OmqNU2qQFbOLAmh5SnJTeZ4/fkfqugKItga+4StRM9nUjO3 SL8RLgzis15xLTcptqwApXUn1KC8BlJS917731R3vaP3D5aoeBNwTDPrek79BlDh 1Dk89gomYQq37Lfg1ZIhRqtbsB+rCbKTUUQfZQBxjLEIdRa5ajsSJwZqDaWrjEID -nakOSaWG89IlkYkCRAQYAQIADwIbLgUCUjSVIAUJBfIIjgEpwF0gBBkBAgAGBQJQ +nakOSaWG89IlkcLBhAQYAQIADwIbLgUCUjSVIAUJBfIIjgEpwF0gBBkBAgAGBQJQ BPOSAAoJEAQzr6kVAosCGWQIAImG0FRjy3sZ4dbcXwEJR9pAROTExR0H4QeMbtjx 5cyGgYOkFtuQdjNwLrEZ0eVn7a8OTapeuic9JLgCDlvuc5x206Fl2lfCM0mPJU3K W7/45srKC3bzwmkqrK4mhJlJKWenwP96apqn4Zs1c0mMkIdPEenwK6hUVuT5t6NK @@ -5067,7 +4906,7 @@ dlgMbYUEHbFDZn8qAmAIbL28Ro8u1iCbXl+75GvXacrRrJ76xVPV5GrV4Mx2ooI/ pPwHPBcn5li3bpXat0oHBHVS/Txcpo/K4gTPxq2FVzICqTlb4vIdx5dQDnhkF3cC ZW5ixtis/BdVZ52gvmJeLV+mVZRgl+dsvZZWarbYISbgMFYQqWwr/q1Zlcirgvis eOQZVdQXk3YgiFsb1TrlKCgwZl/t++z04xfuhDdXNVgQfPncVvMldP4uqWv+M0HT -VggI3jyRs5L/MBwU9dP5hbuJAkQEGAECAA8FAlAE85ICGy4FCQPCZwABKQkQFvcY +VggI3jyRs5L/MBwU9dP5hbvCwYQEGAECAA8FAlAE85ICGy4FCQPCZwABKQkQFvcY aPHTo4nAXSAEGQECAAYFAlAE85IACgkQBDOvqRUCiwIZZAgAiYbQVGPLexnh1txf AQlH2kBE5MTFHQfhB4xu2PHlzIaBg6QW25B2M3AusRnR5Wftrw5Nql66Jz0kuAIO W+5znHbToWXaV8IzSY8lTcpbv/jmysoLdvPCaSqsriaEmUkpZ6fA/3pqmqfhmzVz @@ -5080,7 +4919,7 @@ bd4W5m+SH8ZAc4mi21DMblDkLb5Sj1qxr2BkGLH7zokb7ywCtrx7V//iHPKQP8sQ demaU3xynpU5pcT4Y+b/uWyuVYpUq453qN/520JDQ8xHeS5qkWqLqexBOD+sR2kT U9hmnwFl8myOhgt1LEYmH32K14fXhzFxml8EOJ7lHjKENtdfVZE+VqCrcTAlUS9A M7vHSATfq9HEjBWfuYYdvlqj8VLoAVOk -=9IhP +=6POl -----END PGP PUBLIC KEY BLOCK----- pub 17A27CE7A60FF5F0 @@ -5114,82 +4953,116 @@ uid Daniel Dekany sub D068F0D7B6A63980 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBFHNxM8BCADYmt+HKkEwu89KQbwV7XIbgwZSfWc7y1HvA2YJpJRXJQsU/Pzv +xsBNBFHNxM8BCADYmt+HKkEwu89KQbwV7XIbgwZSfWc7y1HvA2YJpJRXJQsU/Pzv BhsHnm9ZIScBLIlgE5OUnMNz8ktPDdsFg3j/L0HREXOAqkOFxWx2kANsRo2HmkM3 67RAu42fJqJcjD2Rs37wMxlSRRGQ+/bp+Bw2HNO1pw7GwrSgmZwzwT4+1pE/TvXQ Wl+Nhdf3swLyBaSuWHJZT3+JOR0kEGSQuurR+57r6fKDmouWSwAKn1z97JelHuXj HKZeueCkQvX7dayPP4a1zpoXPcoZhYekFarLWJl411EA3aHIIV8whknsZx/lGGC5 yF9AVIzHHnhqFC/Fr+GJbwa9oMFXj0pY06ZNABEBAAG0IkRhbmllbCBEZWthbnkg -PGRkZWthbnlAYXBhY2hlLm9yZz65AQ0EUc3EzwEIAK6rZ7kRp3uj0CrhvuTnLHU7 +PGRkZWthbnlAYXBhY2hlLm9yZz7OwE0EUc3EzwEIAK6rZ7kRp3uj0CrhvuTnLHU7 nEs+KvoUZKLyhcIys76sJQ7cnhEygcG7tng/EtK8bI6skLwUaF4fnPliDj/yIigY 08p7TvFL/6HL4cLrIXR9uZe5IdvBKYhy23Ie2JXdLk6zH6jq5+vBE0IA7ljJUQj0 PgiIL92kB73Bn6dPayvtApzctajXvGajYNfOLTYc3n1L/Kqay+/UwjB5MJVlmFtZ 1a/EAxyb5yHld/s3RKEaeEIpjaoPSJwXKOWNAcLdtgcPcsyfrV4bkgjx7ABzPvf8 2gYucthyIx4zPZ29hZfktSV61h7cbJL5HGrk39UcSgfstHbfBQiTY/1kVN9tuHkA -EQEAAYkBHwQYAQIACQUCUc3EzwIbDAAKCRAZOaJSC6sdkEFjCADEzcJtTbykHeSP +EQEAAcLAXwQYAQIACQUCUc3EzwIbDAAKCRAZOaJSC6sdkEFjCADEzcJtTbykHeSP GykEtUnApHYM8oZixHWFvDdjkGhePMTvBRJpByS/hdS4Mnb2AfBoV696eCFAtm+D 6iuOA1OYgc1CnGhilxRVpzjgbD0S6bG0tyiKz1dk0HKkGh36wumST1bU2qdA/UN0 CoRIA9Csb+mg+h8c+y3QixjbpTSS4shhXpzfj8QsZmPn38S1amaSTEv8zqF8pArP U93184TQfJBPrjAShTEitAmX3FQlSL5v5sZms7T5S/kOHkcHm4zNlwXRJ9avqb8k q2rcDJX4sCe7PjoMX3y2mTk2YezY4LrYbhEeOGcMNg7XOXlhtBBJ4OuqQtXo65Lc T7dK1Uyb -=9sp3 +=/U6G -----END PGP PUBLIC KEY BLOCK----- pub 1A2A1C94BDE89688 +uid Michael Osipov + sub A3F393B5D034A0A3 -----BEGIN PGP PUBLIC KEY BLOCK----- -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 -zTU22/559YQ9Bb9kRR9Rqg== -=GVBF +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 +=t0Nx -----END PGP PUBLIC KEY BLOCK----- pub 1AAAA7AB37293D3E @@ -5198,7 +5071,7 @@ uid DiffPlug LLC (release signing key) sub 2C7F998F4272C851 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBGg1XNwBEADEE1ZUVTNJjPwE793zDJp579cWfPiWO99z8f5RE6776NQvmCcJ +xsFNBGg1XNwBEADEE1ZUVTNJjPwE793zDJp579cWfPiWO99z8f5RE6776NQvmCcJ Dgag0HP9abPxjPzBLQCMJGJVbKbto8O7Hh1jlwOK6IjM6O38AFobL+3RSBMcYAq6 NEY1xveL7wPoBKHeVbfe6VlKQwY0cORM/0dxvtcSxdR5qvw0X2JJhql+mxzv32GR NLvav8a5vNsJcSJfWW/rmqFkOjRpuG5xzxsoXFFghwnSagiqANFOdw71mU0/rC9r @@ -5210,7 +5083,7 @@ qSiXfBfKEqTfJC0KD7Li2xx9WfZRfOEd3lpAcY3nLXXAzGEYJrFlGlPsoh0P+LbQ M85CFCpuIthYSj2lLdS2QdD2iVrUXbXyIs/kTeDFzoQX1qRA6LTCP/53BiV3axfl jeOCHU05W8yUxq6zoP1uVJL2BYlse14efwthfKt52cDji1fKoLEZY75Y2QARAQAB tDpEaWZmUGx1ZyBMTEMgKHJlbGVhc2Ugc2lnbmluZyBrZXkpIDxzZWN1cml0eUBk -aWZmcGx1Zy5jb20+uQINBGg1XcgBEACzj+5ge89B05BqRUofQAvbjQWXHU1w74EU +aWZmcGx1Zy5jb20+zsFNBGg1XcgBEACzj+5ge89B05BqRUofQAvbjQWXHU1w74EU TrUxd3GAnvEMSjWPXDJWGDTAnsTcM/BxqnXBCTONGvWeyaodL9QlnPoG9E5fUjhV 5KX2wpGqZUznfvmDkrEwrde1yR81pStAdY2ZEtA69U1jCp3VJt24FHQxz71hMQqY Npos2crklGOuluLir1It83JKjlXrF6VqDfpqJSjr80H/JzYDJ91fgY8KISyESeZT @@ -5221,7 +5094,7 @@ N2MHTfF8pdMbuHh4ZSldS0lG83sLtawYqrykeAD/Oca8sML39BtuYsLYXDKtj05I yN3Bf6jEg8PliJg9gwQrd4IND1vInD8yCAXtcKFaSDiwz/WUs3NKZEvSoZhSrl8/ mMdCXB/ILL3dLdYtEjvk9AlmGdVSdA7I4pkLDDS6nH+eZqCpXHyS3zf5IVUOUrX7 H/U6S6aZDHNKjOEXJGMtat7Xe4wtYQxvUQ+0rI3Za7pxM1NS3eKDFrg00025F5fl -8x/SbZnI1QARAQABiQRyBBgBCAAmFiEEJylEgvLS+aMYygQbGqqnqzcpPT4FAmg1 +8x/SbZnI1QARAQABwsOyBBgBCAAmFiEEJylEgvLS+aMYygQbGqqnqzcpPT4FAmg1 XcgCGwIFCQlmAYACQAkQGqqnqzcpPT7BdCAEGQEIAB0WIQSjHd6IHD48TJhb0NAs f5mPQnLIUQUCaDVdyAAKCRAsf5mPQnLIUfcnD/4rxWsH1UMZq90AekxOjcg0ZXlk 2Ei/ufGVAGWdIt3rKoXuwpVFFIQYIjmcHP2EFpjWkOuaG1+iyAKr+S2bEN/StjdW @@ -5246,10 +5119,12 @@ GLViJ2LzBrmdJyAlzPwktHbh+0n6kbq8ysVnxUV+aLSEVjHsQRQxD+nSV71A4WNq g2jRvph10jbVWvoy4pOSmpTH5jG9TO2SlVBETjrHMVVY5GiRliFDzvPLRV9HoVye TnPH0XeWTNKTUK9MUC3NOZHlc0HzbD/hU4oLRJILcKt7YOEmzt/p6ZGH6J7jb/NB Eg== -=k22w +=PrQD -----END PGP PUBLIC KEY BLOCK----- pub 1AE999FF489B55CB +uid Alberto Fern?ndez Mart?nez + sub 8905EB7D0913BFB2 -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -5264,30 +5139,31 @@ isefDPQPN/AyIwsG2BqqXeag70yRGCjWYnWvLU43mSc8p3Lex211jWd9EBomP2TP ArFbeaXv9H/ypPeL2hasdUh2qBd3O+G/IR7gvsfTySZ//E/7tu6MBMzd1AIDCqEA Jctrg1mFlDXgQRugvQ3DmDmTphTODwnl+ECfP7hvAMr+4zUKf3RHK3LZzqQtqxK0 0uCYToh4WiVFmrPC50pXAhF/xmZcU+REdDofT0TGW2JQP+rfLooGZnChJwARAQAB -uQINBEzPUuABEAD5aYN1pi5qgdBrQZcCn0KAZqlLuod7qQXyWBkstj7MMJNA4TBy -MvYRNqIFhs8SoARtVYJw8K7dHiP8Kr58Sy7U21LYYtF7GAVHKoMY8vyy66ii98/b -//VdMkhU1xpB8HtjEkcvMfizsphplQTvYdjSVcg7OntcJlpOFrIdWmsJ805+H4bx -sm0hAboEJgH96WSU/tcvBYGyt5kForJGl7ZP1S+gNI6VTMhWb2OHwQPgUBlLGE/k -6xoUbc7pJf7ZzJwwJfcdvVmt4qZyGd1QbDU+wfxiMtZpiL20IlfUlAfejF/LTuXy -U8i0TGC7QT+FVGvt961soghNh+E1kMa1GgbeoDnnqHQ+k/3Z1dY26jw8qKIpjAN4 -qdzYQl48Bn8CDzw1Z3gACt0oj15MvK3u5ylzyuxWdPsOsBCuew8eKkgKStFgQMxg -zss4vqOGZEetvWhluVZZPbOIX9cp1UtPSdxbJ5Wf2z5DbYN0ENTjA6saLJDFp/iG -H8B64qzNzXu/fvvVFqId2TkRBUaqoEdJ7oWxh2cZAG9Vwj8bRLI8wwYCTOq8+/EB -2gbTlMyDPhHvbd9eo7zRP7FpjgKvKZx0c8QVEp9VOs7VU/L1Ims2H3+quFdZltCV -Es294wGVN7G8cWfLuZuy85F0zbZU+8grd+eLS0XY3/sKrPtcbLnqlq39cwARAQAB -iQIfBBgBCAAJBQJMz1LgAhsMAAoJEBrpmf9Im1XLvc0QAIY4jb5sFRkht6PkMH5I -pai/rsWvnWJE+UV4Kr/RM8ML81XZ/5/Z5iwM0HyjNZu7/O6LP+bez/BoVu3z3cR2 -PcLZzw4FyOHvQTyimt+UwGQmf3Mq/Kz7J+L6mWP55jT8Kjd4RNDLMvLj5z9v9kle -yNFbS/RLL0ES17jZT7UW9Bkj7+xuyU5Mydg4APkiqisqDkcUct9SO+BdNisFjf1X -Cl5irS2d1M2cSpZ74NWTQYUIVKOliukEhLvLY2HITjGfaeRui6V+dQiuvTpV30IC -m1jIZfARC2sl9KIHCGKHtxzibsWv0Kk3KggzcpEC4YoAD+8ts/HbYw1uzWzM11Q7 -VamK8hpNl3hK8I0hu2vfUT1CT/EeIEBPwhelP+4pa6fDwGs5LW7ugs/FBdNqEV3Z -61mX12Kf4pywCd6yUiPVqeaif7H/z7W5t32x6erIqM3xoW/SIU9ff3XuiFIkQ2Gu -ZmkvSBs6gRDrH6wQi4K8eJKxyMb3MRgy1CaeVvyj3FU5Cb2XBXn80Q7mzeXOg0Q+ -iqjl/OuM6ezpsOXYAJrvgnkW6btYxxdOf5vqeDqbwRo42jOhI7leKQq0sG90Bbho -0JttbnQiJxOq+jwKNXOwGIHQww7E9djGnHzfRrM7hKJ98WtHBljLb5/sKz45kb2Z -j3w6SC+J+9ry69YcV2UWc5Rr -=A1S9 +tC9BbGJlcnRvIEZlcm7DoW5kZXogTWFydMOtbmV6IDxpbmZqYWZAZ21haWwuY29t +PrkCDQRMz1LgARAA+WmDdaYuaoHQa0GXAp9CgGapS7qHe6kF8lgZLLY+zDCTQOEw +cjL2ETaiBYbPEqAEbVWCcPCu3R4j/Cq+fEsu1NtS2GLRexgFRyqDGPL8suuoovfP +2//1XTJIVNcaQfB7YxJHLzH4s7KYaZUE72HY0lXIOzp7XCZaThayHVprCfNOfh+G +8bJtIQG6BCYB/elklP7XLwWBsreZBaKyRpe2T9UvoDSOlUzIVm9jh8ED4FAZSxhP +5OsaFG3O6SX+2cycMCX3Hb1ZreKmchndUGw1PsH8YjLWaYi9tCJX1JQH3oxfy07l +8lPItExgu0E/hVRr7fetbKIITYfhNZDGtRoG3qA556h0PpP92dXWNuo8PKiiKYwD +eKnc2EJePAZ/Ag88NWd4AArdKI9eTLyt7ucpc8rsVnT7DrAQrnsPHipICkrRYEDM +YM7LOL6jhmRHrb1oZblWWT2ziF/XKdVLT0ncWyeVn9s+Q22DdBDU4wOrGiyQxaf4 +hh/AeuKszc17v3771RaiHdk5EQVGqqBHSe6FsYdnGQBvVcI/G0SyPMMGAkzqvPvx +AdoG05TMgz4R723fXqO80T+xaY4CrymcdHPEFRKfVTrO1VPy9SJrNh9/qrhXWZbQ +lRLNveMBlTexvHFny7mbsvORdM22VPvIK3fni0tF2N/7Cqz7XGy56pat/XMAEQEA +AYkCHwQYAQgACQUCTM9S4AIbDAAKCRAa6Zn/SJtVy73NEACGOI2+bBUZIbej5DB+ +SKWov67Fr51iRPlFeCq/0TPDC/NV2f+f2eYsDNB8ozWbu/zuiz/m3s/waFbt893E +dj3C2c8OBcjh70E8oprflMBkJn9zKvys+yfi+plj+eY0/Co3eETQyzLy4+c/b/ZJ +XsjRW0v0Sy9BEte42U+1FvQZI+/sbslOTMnYOAD5IqorKg5HFHLfUjvgXTYrBY39 +VwpeYq0tndTNnEqWe+DVk0GFCFSjpYrpBIS7y2NhyE4xn2nkboulfnUIrr06Vd9C +AptYyGXwEQtrJfSiBwhih7cc4m7Fr9CpNyoIM3KRAuGKAA/vLbPx22MNbs1szNdU +O1WpivIaTZd4SvCNIbtr31E9Qk/xHiBAT8IXpT/uKWunw8BrOS1u7oLPxQXTahFd +2etZl9din+KcsAneslIj1anmon+x/8+1ubd9senqyKjN8aFv0iFPX3917ohSJENh +rmZpL0gbOoEQ6x+sEIuCvHiSscjG9zEYMtQmnlb8o9xVOQm9lwV5/NEO5s3lzoNE +Poqo5fzrjOns6bDl2ACa74J5Fum7WMcXTn+b6ng6m8EaONozoSO5XikKtLBvdAW4 +aNCbbW50IicTqvo8CjVzsBiB0MMOxPXYxpx830azO4SiffFrRwZYy2+f7Cs+OZG9 +mY98Okgvifva8uvWHFdlFnOUaw== +=NVFM -----END PGP PUBLIC KEY BLOCK----- pub 1DA784CCB5C46DD5 @@ -5297,7 +5173,7 @@ sub 7999BEFBA1039E8B sub A7E989B0634097AC -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBF3Ep5QBEADZfs6o1IpZbZ1qlBkoJ7oWL0vFCcdPUgF/PRFXWKlsuFHVVV/N +xsFNBF3Ep5QBEADZfs6o1IpZbZ1qlBkoJ7oWL0vFCcdPUgF/PRFXWKlsuFHVVV/N oZF9SDiCJxfvsVXmI+IHTVMR2SszU2xDF2SlScRfZQwrLhBsDP9nv9N1eGIoA5Ny e3WOxOwAvMuPowP+jdGMP7sC5PhdLRYfqalHQWjdqE/pvAEozIgLe3Bc/CoEee1/ TGCaclFrYTPJz09tdD2knvuY95F6WAKpJ8M7Msf0sdQkAf4yStZ3IWPeL9WVgp9w @@ -5308,7 +5184,7 @@ wZRdGMvEt7nRCtEMb75RiMmrwWtCqz2DWLRByNvaEmw6J1W94HLoh3C9Pw0pqoKN ZafLc4+NONHm8bQIzn6BhoN0ZjMmEBvLM6apA8AkV06noo5ET26VxoJze5MerO2Z lrSLUBHIdgUmwztCep8AdqE38v9G3ie8qMgRLq8gePIdQdegva/urmb6Y5A16gFE 3/vTI3M9UbAaRy7oXwO6Qw7O+AD4etiuODW4NP9vDnRHV4ihlvDdwadY8wARAQAB -tCpSYWZhZWwgV2ludGVyaGFsdGVyIDxyYWZhZWwud3RoQGdtYWlsLmNvbT65Ag0E +tCpSYWZhZWwgV2ludGVyaGFsdGVyIDxyYWZhZWwud3RoQGdtYWlsLmNvbT7OwU0E XcVTLwEQANX1UBfDab9DrU9htikuWt+vRWJm50CLI6HvlstxnL5GQ7Xpz0SK8pPT idIDayUoigNsByB81QkSBFNvL7TftI0iHQJ/CoplLs/SAdVd/sN40aE/TH54QDMk coKwG+i6cGhm4XHhjUlo0eSY8V0fxCVmNrAEEzB4QE3wD2dU2rYunNkY0w0hdKf+ @@ -5319,7 +5195,7 @@ lftW8JL5+OM7Vd1b5+wAUTGWXABGotR7gKl+rh4CXykLY90+H9lUXJiLaqFYhKKb 2reTtU7GXSQkfrwnqPjtYOHcUSDGknaH2ChHVkGTFyRI3xIxcJjmuFJyGG12qj8J +7v17wd+ek5LyfzL7jvHTkyJ7NZ61R94fBzm+EhNzdByO6tdSuz+C5pqj5J27Qm2 fbv+z3B0ZqOMpNDUDqKe9VSl8J+h1osUJ1UMbM4IG3ADKSY8GTSxPNEBfzregNCm -ursaFFB4NADqQjLQqNtphzRiZLN2w92FvOFQbNtP8qnwdkggos3pABEBAAGJBD4E +ursaFFB4NADqQjLQqNtphzRiZLN2w92FvOFQbNtP8qnwdkggos3pABEBAAHCw34E GAECAAkFAl3FUy8CGwICKQkQHaeEzLXEbdXBXSAEGQECAAYFAl3FUy8ACgkQeZm+ +6EDnov65BAAtjQptG1GxIE64t1u7BV5zNqJ1ytIV/jYPRznWGPwGfdzYTzkjjSw pE8iWydvlpktpa07OkjUWY8DMCN51aYIuvLzmmtRla+EpBj/mY5mMfhWZE7mR00J @@ -5342,7 +5218,7 @@ i3gd1+o96Ls1ZrmKt6yRXIIpLcS5/2M6HUJ88rN+lIQk5P/97fSDx2hlQ7zoF1e9 CYeqL7aCpp7sFJ7MdDu3WcVJzmDAZVVe8IbpyP1HkYcJJPMkmO3owKFWuf29b8A3 xJ0xWCN3rd0z1+o8WhHBIrMDF1W+MaZ7yKtwqg5KwSS8WeLTxj6XaM/TOS/rOdxE NUH0GaTV5P8pDPS4tTCI34it8Lq901+l4rHDo70IUU5ftn7IdE5jqxldTjAVmBAZ -sdhl/CfAsXMWSIYATNL/mexN2jiZeDIyPOCs2ce5Ag0EXcSnlAEQAMe4lWFXlf/p +sdhl/CfAsXMWSIYATNL/mexN2jiZeDIyPOCs2cfOwU0EXcSnlAEQAMe4lWFXlf/p 8S7jp6os1D9d6fK8Uyl0RiIQNOrhGWYlyC3PMbSaLxt/MZ0BPqgUf6mtxNTiwL1j 5HxSsszX8kiPavGS3uskRcB3VooNIERBlaiNaVXDZ5edYUNo+Hwnlzqs69Ol5qC4 xyGeHCcQGR85qTZDMqRRxn/Xv3+lhlQk3X+Ykc03unr2/y6NXALgucPdhB/BNs7R @@ -5353,7 +5229,7 @@ RaKla6wW9QOpNQ3E2geyjYCpJyb11sK5MmuCoBvGGM93pwQ8AjIZihA/hLoS3blP rpEKCKhMLAx5AldC6Lst4vzlCdAOzOtVh9QVmx/BPmGam/nuvLQVaYLYqUn66hJ3 SsmxD1umm76zbXpdIoSxGIJP+nLL+y4s9vWwOh+TTmvC1mzSCs4H+HPAj7klkNL1 EIji/RFQ4bB1RvI1HH2nm0+drLyu+u8CZmMecDgHx8uYra0Yabj6VpOtyp/BTfkm -fshK2YU99ZBW7RxdhTRSTEsGr/l9tG//ABEBAAGJAjYEGAEKACAWIQS0rIzcFBrw +fshK2YU99ZBW7RxdhTRSTEsGr/l9tG//ABEBAAHCwXYEGAEKACAWIQS0rIzcFBrw rkaNFpIdp4TMtcRt1QUCXcSnlAIbDAAKCRAdp4TMtcRt1X+tEACs5n8tWiv3gaVO ByMCschGwJOg/j2uokjCi16s180bNVerOZaPhTaaUC2S+8w0ugv1gh4RmqCPIrxD kYlDRgYzqF41B52mBv1SSfBlzl6jiAa63bf+pVV5N0QAiTo/MEX3naiFBISf9N5I @@ -5366,14 +5242,16 @@ FtvfI15rXhkXrz/SM1fVXEqIWkTrEnxuUj1mFQ0ire1GU4+6MV9hFy44DBWqtgWz yTy3p/VsYhIAbyIbB07tG7i2+eTjMCwEbt1MsgQufrXuioDKnQ85n4P0UX4Ohsa4 j32Xxht3w83NYdrSC2KEK1/GTzrVE7EzxI836bHHvqKuFdXFQ5eJNzZ1pt3cRZz+ pIXjPlQ0i6kV0h8KapE1Uo005JYgeg== -=ASmD +=/SKc -----END PGP PUBLIC KEY BLOCK----- pub 1DE461528F1F1B2A +uid Julian Reschke (CODE SIGNING KEY) + sub D4569BDF799A59AB -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBFd7wYcBEAC1jmtowY8q/BXHFr4bOvA4WtniUcECC36dHmQzd3LrG8zdDPK4 +xsFNBFd7wYcBEAC1jmtowY8q/BXHFr4bOvA4WtniUcECC36dHmQzd3LrG8zdDPK4 DgO/5w8xdilEe7BRD9etCV/uKXVM3KsKjFDHgh2puge4JElbePQL5l1oMmDUIGpK cj+O7REa8fSAh8MOKRYTBQ6C8z3S4iEJuiiO73gvoe8XvAdoM9tN6G8lh8HBcpIZ OT552jofRcStDw5WRKWj/MFYnqacReFo4ni6i+A733P+vtU5ZzWqtvhza6YNy4YA @@ -5384,30 +5262,31 @@ Ya1Qvt4oGijY+BKNnoiKBBJnQuay4y0dgfolpdmFZf7BR2wmh4Svzttwt00v2OEB 6Qs+caUz4uoa6mzDpuFaZaIpdP4kTSwsGdwqemHsjLaAYcdWssTOi9oS+ioUNjLa sIPGtI8pZ0WuN1X/IRSGSA6d/S+efqDGGyRligMtxuUicCk7+ew0fQ4dNxettN0B /wKRJ0ZP9TClw1jdLHDcuonI+8gxdxiT6dNOzCjMssQ1D4qfV56SenTNAQARAQAB -uQINBFd7wYcBEACXz5jc7lBQgd4KyQT6vl08QNuYRQFCScoLji3J7zElyqo0+jty -FXrQNwuTxKdbhcKrT1eiqlo7/ZBYzDMB/YQwbJ/sK6zgyrLdo8+e1G1SAWjlvoQR -ggmNIMHy67RjZC3lB2dkyLwWwaXNMuyyOGXJrhnCGvvpMFbHAFutLs5Dh4qfA+XI -dVgdO9JDOmZiMemltg4MR3Kd0vkNDB/B81JGTykZ4jbWiZjSYHl3hYxCWXu9hBiR -AgHJ7snp0vOwbLn/+pYSDfE4bripMBp3NEmsUEsCPaogh74COrOt8/nk9tT0SROD -+9/uM80oMJhMi2HkFPqtUfQ6iKDhs1AIhF6hEzDsAz1xaeVlfyvhKXAr8z1pJ/KI -43vReSYxkc8RRb+x4LSC7q5i6x7RBDGjvYTezFcofHJ24B2aVZOWCfWN0s5tw7TG -JY4VWvfo/yv9PPO8k+F75LVF9Y0C49SLYJQN7y1Hljf/In55mxKn0zZzFw6b1Bjc -W1GrB3Bo1fNZBMW1QZjPTx9NoOsG/CvcdXajhdaMA+8287LG5D9VUhV/UZ6sEQi2 -XbVMkJnj49hEvxfp5uBp7OJCPjtFakKhgpMmaGG2kqZy/yc/OlEirMVdXQ21TCsx -Q5LJW8V9V+c+2XigOB0b6n3AHzM5eu85XBvGn+jbubk55xQxOJhfAC18ewARAQAB -iQIfBBgBAgAJBQJXe8GHAhsMAAoJEB3kYVKPHxsqyfgQAIdy/pHm5xd9zdfYsFSN -nRHXQ4oGbrROy6tika9gULZ+d3iDUOxbxLJ18t+X2T7v7I2hLGE+N83yurlwsePg -z9MkjzJd63S7joyfIa1mFl9UfcqkCAHS+ADqjF+nl1kwktpcMaBac9HQiKJ2nZ/M -cH7Wh4HB3m4wLQAoXfNHJCpPcDGwUcXYt4uvvGnqgEX/0mbebaMW5s14PqAxQ5wo -oLWu8ZEdqJXO9sVoYpowVDDLqELonKc+OobkEQqnOX4e/Smyh72lKNnhDoTfZhhQ -H5giSYqXvRA8S32JZ55pWaQGD0pEC333BDyvadUPvr6EpG/+PBqQe5Vvkn+8slXY -qoW1DKcu0rl+XNHDqb9YbnGj7NK4qSo70UjL4Th+ZD6ELalxquAHEThJcrLWXF+1 -RLjWWRcppVSVpQKPTNBxVVnLgGUSxgGSFjNrj4YXm6nhJQziTkVNwd7CkI7XSmNc -4ncj7I7Crk3qtqpKumyU2yZGZrv+0l/6gD9UNHxL7BYRn9KLukRcXkZbuWeDefSu -pZF6PfhiwFrnPfZml1rmIqJZ+TnKD+8U2hWcKg5Rfmffz8c7tX6EFgfCq6j18Iae -/2dyZlv+4z+BHolyoAOa+LWwY2Z7oDoZHkb+fM9CCpSy6NHOK2oriWQLLYHbxKhS -x4dcl+CPon+VTgw9pxM1xQ8x -=Ozmu +tDZKdWxpYW4gUmVzY2hrZSAoQ09ERSBTSUdOSU5HIEtFWSkgPHJlc2Noa2VAYXBh +Y2hlLm9yZz7OwU0EV3vBhwEQAJfPmNzuUFCB3grJBPq+XTxA25hFAUJJyguOLcnv +MSXKqjT6O3IVetA3C5PEp1uFwqtPV6KqWjv9kFjMMwH9hDBsn+wrrODKst2jz57U +bVIBaOW+hBGCCY0gwfLrtGNkLeUHZ2TIvBbBpc0y7LI4ZcmuGcIa++kwVscAW60u +zkOHip8D5ch1WB070kM6ZmIx6aW2DgxHcp3S+Q0MH8HzUkZPKRniNtaJmNJgeXeF +jEJZe72EGJECAcnuyenS87Bsuf/6lhIN8ThuuKkwGnc0SaxQSwI9qiCHvgI6s63z ++eT21PRJE4P73+4zzSgwmEyLYeQU+q1R9DqIoOGzUAiEXqETMOwDPXFp5WV/K+Ep +cCvzPWkn8ojje9F5JjGRzxFFv7HgtILurmLrHtEEMaO9hN7MVyh8cnbgHZpVk5YJ +9Y3Szm3DtMYljhVa9+j/K/0887yT4XvktUX1jQLj1ItglA3vLUeWN/8ifnmbEqfT +NnMXDpvUGNxbUasHcGjV81kExbVBmM9PH02g6wb8K9x1dqOF1owD7zbzssbkP1VS +FX9RnqwRCLZdtUyQmePj2ES/F+nm4Gns4kI+O0VqQqGCkyZoYbaSpnL/Jz86USKs +xV1dDbVMKzFDkslbxX1X5z7ZeKA4HRvqfcAfMzl67zlcG8af6Nu5uTnnFDE4mF8A +LXx7ABEBAAHCwV8EGAECAAkFAld7wYcCGwwACgkQHeRhUo8fGyrJ+BAAh3L+kebn +F33N19iwVI2dEddDigZutE7Lq2KRr2BQtn53eINQ7FvEsnXy35fZPu/sjaEsYT43 +zfK6uXCx4+DP0ySPMl3rdLuOjJ8hrWYWX1R9yqQIAdL4AOqMX6eXWTCS2lwxoFpz +0dCIonadn8xwftaHgcHebjAtAChd80ckKk9wMbBRxdi3i6+8aeqARf/SZt5toxbm +zXg+oDFDnCigta7xkR2olc72xWhimjBUMMuoQuicpz46huQRCqc5fh79KbKHvaUo +2eEOhN9mGFAfmCJJipe9EDxLfYlnnmlZpAYPSkQLffcEPK9p1Q++voSkb/48GpB7 +lW+Sf7yyVdiqhbUMpy7SuX5c0cOpv1hucaPs0ripKjvRSMvhOH5kPoQtqXGq4AcR +OElystZcX7VEuNZZFymlVJWlAo9M0HFVWcuAZRLGAZIWM2uPhhebqeElDOJORU3B +3sKQjtdKY1zidyPsjsKuTeq2qkq6bJTbJkZmu/7SX/qAP1Q0fEvsFhGf0ou6RFxe +Rlu5Z4N59K6lkXo9+GLAWuc99maXWuYioln5OcoP7xTaFZwqDlF+Z9/Pxzu1foQW +B8KrqPXwhp7/Z3JmW/7jP4EeiXKgA5r4tbBjZnugOhkeRv58z0IKlLLo0c4raiuJ +ZAstgdvEqFLHh1yX4I+if5VODD2nEzXFDzE= +=DMRv -----END PGP PUBLIC KEY BLOCK----- pub 1F012999BF55C33C @@ -5416,37 +5295,37 @@ uid Hernan J Gonzalez sub 24E86B8F7B66511E -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBFIDA20BCADMep/wCKREt6NsQ+r7rqgIhlHazBndaS955izID79etP6DsE0W +xsBNBFIDA20BCADMep/wCKREt6NsQ+r7rqgIhlHazBndaS955izID79etP6DsE0W YhguJrLGyuD8Ro4U8HMS+R09qdfYC4kp8WKC1Iky+tSzJ4WrUcvvA9i0U6DMVZDj rJ/z+89BwgUvI2Iyt+APBXK37VCeAgztjKNXxT4S0pTKxf/k7fpc6QH2gkAoHM5u xdwR8mAHyzyONwvyIG4LOAPE5kXRM/+UQq6/GP8Vwa1F0Sp8Woha8wAkd+644Gcl peiTfRm1fj77rtU2vOfZ0MQXUsI5Q/gfRyRSXGMSHkmv1vQN+G7/Q0iRLrMefO8B tFu1m2j5uSB0uI5LTiH2DDzYfGIivHZqMa5XABEBAAG0KEhlcm5hbiBKIEdvbnph -bGV6IDxoamcuY29tLmFyQGdtYWlsLmNvbT65AQ0EUgMDbQEIAKL2WkHZbpSuFT1d +bGV6IDxoamcuY29tLmFyQGdtYWlsLmNvbT7OwE0EUgMDbQEIAKL2WkHZbpSuFT1d 7Vrv5FoKyod9XQV23AXvKI/lbv0w9wgLNYzhNyC6dw5Ih4dKphwoyqRPM9GKSZ2v xBrZ524K+ewTwHFb1uoTXsfHOH6jLRYAsUzNhDdlxs+Cdnff4Ja2aZ7dUUKGpTyh kJPEe6+AMMQ7Fl6Bwekotx0iyaBNk8dsxitFk2gwg+3sPFF1kwMaehQ7SNqPKrvg k0rUEJMr/e0yvgMFgw8+0S100TjCzVUXbS6BYg/YnEPdV0CXrlBMqA0Dj8SziZNR wD4xBxMTYUskWITNr9YcctrBKfss300IV1YTATp6f9U6/9JFksF7ZZLNkbpJdbq+ -sEQcEtUAEQEAAYkBHwQYAQIACQUCUgMDbQIbDAAKCRAfASmZv1XDPBCBCACzXhri +sEQcEtUAEQEAAcLAXwQYAQIACQUCUgMDbQIbDAAKCRAfASmZv1XDPBCBCACzXhri XGIBHrmbL3GfQuYZiLLHWh6h9o81CgE/gxO83BU/4bizrFRECPJChsHRcX09xSap 4KpMls2teCtPIKOhAocoZlBK38z062dUrmN943ZEFM9WBaex3XDQfmVvPh1ZX3UX 3LaG3r7nfqX3Vwb+dEa88lk5nA9DboCUghrM8CsAtfsQkuxQ3k8jFlJchyORKCQv s2sSKksBIuj6RxTGCC9zeY7RQ/ZoCYrzMjGx6oQBkU8KJ7kOXRS+P5vhxqgYLCAA itpeywR0F5n7ZI8lW4+3ksl/XXhLEPc2tDqB0joehhxxSeeFi36hq1EA3aOx055V hb44P/aDkzCoDOzx -=mIEN +=ZWKi -----END PGP PUBLIC KEY BLOCK----- pub 1F7A8F87B9D8F501 uid Download -sub 7D1BE4480B61E2A7 -sub C2148900BCD3C2AF sub CFF46EE3C17E53E9 +sub C2148900BCD3C2AF +sub 7D1BE4480B61E2A7 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGNBGBP58sBDADYRZmxLOkqrz0QZ/yESRpv7IeHGLqDE1a8QfFtFb14MJCLSAAS +xsDNBGBP58sBDADYRZmxLOkqrz0QZ/yESRpv7IeHGLqDE1a8QfFtFb14MJCLSAAS 3nMD6Szi9mEjEqYdJURRcMjbUBhePgbhzGa3FYkjAB8lj6IKbu+ogCwVm1S8+caZ C6HNP1CIefa1wQgi/6FNWEBKbKefUr/DoG1fBAWUvTPC2BjiYOHDaU1xFWwhF3Np p0gEoK2KNgGgy/aSCi9Rb1M1ynPF7CcY8vKpAo6YfJpoNnput3t5FoF0uPnIac0F @@ -5455,34 +5334,34 @@ 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 @@ -5490,17 +5369,17 @@ Je0ykdlUHQNKZpCf+RrW7tZ1p5bvJyxxa0Lile4c4Nncjbr8K3tVRQEm8dBvdxjz sv5sBUF+hMbJK2B9cFiOjvS9koqrxpC4hz6iJZJDeA25q8fD2Q0iEbys9ROUhW+8 McVzZ/gvLrsw7OUzoHkDsZxYqj/7+CqqpN+Al3Rj/AwPb8GieZBKgPSaqEzdFZ7F 2ljMrr3KC3USNBJzd0JZ3ami7F6h/sThqDqzC2TASDkkdHSnEDbUN15m2jP5x9EV -h/ei42lwwwet2KFLABEBAAGJA3IEGAEKACYCGwIWIQS0bcceA/7rf4nR8kkfeo+H -udj1AQUCZA5BEwUJCWc1PQHACRAfeo+Hudj1AcD0IAQZAQoAHRYhBDP9S/0zVUY0 -BT1zwMIUiQC808KvBQJgT+xWAAoJEMIUiQC808KvLiEL/RD5ksGyNWhPu1qoP+PS -l5myWniQgVKb5IxR83scsoUU4w+qlp5CNGMpFznQexdL48Ai8B6khpUO3Si9kU/Z -zvKLKf0xI+oIbUX+FaTvR9KoKTGWu3I705pFSshmo8lqZLMfpbxt8Gkz3SkZghRD -RggkHcJKxV0OISZMxTwZS/+xTIQW+rp/GKBRKpMEjcKnw4n0hYHSBI1B5Bi5gG9A -5GFebc2w7GoxjrwFDoDs7jRYICF0zn32tKPLs1r4W3oMcG0x6pGM4A+VGde7iTYf -6d7bDMYIETSkWHujLtxVR+zIsguJxoOuL7Zy68EA5QmuJTsdIwuHNC1ZwcKJ1Xvb -1CgeYys+MaDQrtEYHelq7QJ2iFvz8e71udzdTZqs9+NMTkQ+9pemab24nj4nGcUW -78WI9M5vVaI6+ETygAYEQ+A3iny7Al8UehNdWK/pqND4bXDplewHdwf+tgAElFP5 -MrPhU6icdqY4L1kN8AJql0StPGdgMiQiWw59oBUBiIZC3Z3WC/0frtV1m0UtBxau +h/ei42lwwwet2KFLABEBAAHCwrIEGAEKACYCGwIWIQS0bcceA/7rf4nR8kkfeo+H +udj1AQUCZA5BEwUJCWc1PQHAwPQgBBkBCgAdFiEEM/1L/TNVRjQFPXPAwhSJALzT +wq8FAmBP7FYACgkQwhSJALzTwq8uIQv9EPmSwbI1aE+7Wqg/49KXmbJaeJCBUpvk +jFHzexyyhRTjD6qWnkI0YykXOdB7F0vjwCLwHqSGlQ7dKL2RT9nO8osp/TEj6ght +Rf4VpO9H0qgpMZa7cjvTmkVKyGajyWpksx+lvG3waTPdKRmCFENGCCQdwkrFXQ4h +JkzFPBlL/7FMhBb6un8YoFEqkwSNwqfDifSFgdIEjUHkGLmAb0DkYV5tzbDsajGO +vAUOgOzuNFggIXTOffa0o8uzWvhbegxwbTHqkYzgD5UZ17uJNh/p3tsMxggRNKRY +e6Mu3FVH7MiyC4nGg64vtnLrwQDlCa4lOx0jC4c0LVnBwonVe9vUKB5jKz4xoNCu +0Rgd6WrtAnaIW/Px7vW53N1Nmqz340xORD72l6ZpvbiePicZxRbvxYj0zm9Vojr4 +RPKABgRD4DeKfLsCXxR6E11Yr+mo0PhtcOmV7Ad3B/62AASUU/kys+FTqJx2pjgv +WQ3wAmqXRK08Z2AyJCJbDn2gFQGIhkLdCRAfeo+Hudj1AZ3WC/0frtV1m0UtBxau oLie4unVSlmUzL51Ukdb9OQFySLrV9Fa++lGWXF7qjeNYe0VpGK9WqDX0stdnzDB ui3AA/rjk62VOf92m9Dw7niEjMtUu1+letgc2j5dWbzlAQ4EgDyEZoAMhEAWyqiM bNJB1XMJbWZu4tqc2z0/GRFPVVhBREcKVz9jfzYcMl/lG0FLrlbFqHPD5yhcIdGg @@ -5508,7 +5387,7 @@ kx3K6HdcRNKZ/SvTMtXbwYWGRRHGzybFBlB3cPRQ17PiKPxSgOvmySoEGR0NNskI dHlEFtOGKfYpd3LXanD97j12ccBPvFL04P2sOyBiSOYS6K0jSARa6AZu2OSJ64Cg 7Zfphvg4y/W+qGE6JUP0ui3s/TvmW640PVxqqN5dsWrjczLn+2wNzDSCsAdGayfJ RO1k9jc1B48hfJj0Jglrv1JdZXPPW96vaM00oy5OCnOAiWD+Z92arjBSjY+hkFxw -eM8m6Jr0N+U4i/wP2g4iUWj/eE4CBPKi28thsPoeMav6UIO9XDuJA3IEGAEKACYW +eM8m6Jr0N+U4i/wP2g4iUWj/eE4CBPKi28thsPoeMav6UIO9XDvCwrIEGAEKACYW IQS0bcceA/7rf4nR8kkfeo+Hudj1AQUCYE/sVgIbAgUJA8JnAAHACRAfeo+Hudj1 AcD0IAQZAQoAHRYhBDP9S/0zVUY0BT1zwMIUiQC808KvBQJgT+xWAAoJEMIUiQC8 08KvLiEL/RD5ksGyNWhPu1qoP+PSl5myWniQgVKb5IxR83scsoUU4w+qlp5CNGMp @@ -5527,70 +5406,44 @@ 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 -a3HXnE2l2ony -=gs9m ------END PGP PUBLIC KEY BLOCK----- - -pub 1F8CF885D537A431 -uid Niek Haarman - -sub B7D9C5C3EEC4A9A9 ------BEGIN PGP PUBLIC KEY BLOCK----- - -xsBNBFkyw7oBCACtGFos6g11ycruiWMuXwrE4+XbU85+1jR99AN5PcKjgXo/J3T9 -XaZLjJ+oTWCVgEHu5PTxAftbkq9+lmDAUEWZ1Q8dKrnVgBLsFNn+G2pcvVschorz -CYFu/WT+eORA2UkdPZ7LH00iMx8DFpGtL2dBZY+tS3OpLi1LdNw4Dh/dJO7x7gas -GWVUnL7+Cv53rmvwj8bQEuvrQjaeXMGxJKUSm0qpJ7BvkSEmQZ7qnRS7vZ05Iz4m -uJsTNnuxtf0+fmWNrIqpv/J4RvaZVdA5OW/zA1kKYaGlZoLtWhKOht9gPAKlBk4k -/fBfHoKqm+vnaOnxSzuYpQkYWqeEu6qzfZOHABEBAAG0JU5pZWsgSGFhcm1hbiA8 -aGFhcm1hbi5uaWVrQGdtYWlsLmNvbT7OwE0EWTLDugEIAMFs0MgoaDzDWtzhEf+9 -sPxuhLW0teT8TTZLZD2Bc9om6w4ZH892r+Bv5sWKWILz4Rh5YB25xhn5oXrRF1Xm -3NomlmIoeQF8cwgUHw0DQeYLFYOMe0gKea1Zk55oI7T1dHaJrG8Cv7zXqVCuHcOY -zMMSG1TvB7MuugeMrxDI95RSpDoN2vLmNfQ2gJcXoWAFsoln3G3bg/RngxmoiF52 -04Gn9MfLPGwtc1lJUoUSEqz5zDrz8Q/jwif0J2tosREuyKZMxyiQl9TTMCpNtKx+ -LGosCKUMC9wNpLRelUTJr9cR8GVJet8WWBje7vXCdqXeuMUhpE2cVcNz+SlaDDj0 -2NsAEQEAAcLAXwQYAQgACQUCWTLDugIbDAAKCRAfjPiF1TekMZFIB/sEzt8SNNO9 -jwxjRYJA3CLUcuxurSqYUDQMtspQx8tUGdrh1qjQR8vS7kdJc1laloHg7nUEC9jA -BDZ8SSFd5inohxrKTmo9kYEHLiBeoDLxVDg35nv72oSTKHuyYZl+8QjFVgxDKToP -ICMq96osdLOA55Fyl4BPr9aplaGG+aqD4LkkJzsqx2MVjeqnNyOpsAYuLCdz7Aq5 -Cg1F4CQYkY4G0pHppA4u52itLEUWBLbo4zkiAicta3O443hD0XLJNbp8nSPGizzt -nyKKIi61iST69H3nmVaxh0th6a9k45AfuSEdQNRSuKO6BXGUy3F1ZUBYJGnPAT8k -blBoRdWF9SQN -=AfUq +p0sZcFVmpIJMDdPOwM0EYE/sOQEMAM/zvkoXMyQBaB71Ry5DJmdc8ET6k4kpNwGJ +QNw5jB4cP7GZm9tBfvslOyHwcehXuVgNApq8M2QrLJ2UBjWu8gxqQ4CtguneYn0s +QVmeE9cwBjDWBbeHqMBz1xbJSdWoZvxC7LWmxBDsFiTLCCmVJUR4R7cz43Qhg0ap +wpS054GPlx7V4JzY23z7qLBPV1fSwyYWbnDp85sUcJtY1cwLeGQkW5O5+KF9SNiQ +3VNgR7GtoIoHScs49WJ+EUdrmqaJs2WmEHA2JoEG30AHMVbpyEgaF0PPFR1VzEVT +7PesVstSbnbq8mqgmBt+iQjQkYAb/wyBdVfFLPt2IsGbT92e9LQ1Itw9x5gpzD0z +egjS8QEg176KsGmpRJ1Vs1acpPfB8KWTV7q0If1h1fxmU6ziOHTEe0kvzISTcsO0 +RhHYiMNHNhHY8gSqnWUiPSzSc25vQfJ8/7bem9uuQUluUgAssXlVhn68aHE11Fxl +dGV4ATHY5rRGIGJkQfFJC4MPLIr3YQARAQABwsD8BBgBCgAmAhsMFiEEtG3HHgP+ +63+J0fJJH3qPh7nY9QEFAmQOQPAFCQlnNTcACgkQH3qPh7nY9QEOyQv9EgcZ0+BR ++EqQNpv2E51i6ny74IybA2u2dLK9CUmPBpu+6Meq1JAGSNd1qrfVshg1b+FWCNjS ++cqmSBdV9Bim/wfvk3xlDsxTvUE4Y9FiZ1VhacAIuCA1U61rnlwUemeCxl+Oc6LG +6PHSI95xWqLBhLawCptReqb9txTx9XtuGFhl+be3qAJCahjDLmVnPEL+E/el2SVn +HdTpE1YjWtrF3pa3SREj3AZfbz3lzLPwQesMLnnvPsD7Sz21w30debPstxEYwBsm +vgst61MOUXwgsEaLiNlQbW8a26PUcrRdKQ+LEL1AaMNbcUFreadPZSUJz/QRplCF +1AYtODCrzJ+M0KlGfLDunV4cBhtcskpIOTVW74CKP03xEQrYYAf7p+d5NvS4J0Ry +25PjY4ZtxBIiExGnQGnsbI8eCzWPOtWPIQE+Cp2OnqxB6Wx/qm09E/vg0JDLVbUC +t/SAnrAujm55yb3NjEqc9cQD6zx+S7s9PfY2m6KipNGZ9qVLaOqpMx3vwsD8BBgB +CgAmFiEEtG3HHgP+63+J0fJJH3qPh7nY9QEFAmBP7DkCGwwFCQPCZwAACgkQH3qP +h7nY9QHJqQv9GD4A3fGV2dOBxmyzw7HkJjyP5K46zlO0d3jHdqYquft7QiVUl7Qq +qH0hUBsUdcsjrxcxvl0bePHKHUf1ljcW8MWNjAZUx+LOG10leRAEct2t32BoiFdk +Qn+KT3g82olt0LPHklJDzx0yV2Duc1D1JXKFfH7KcCrPGByWkFqokUaTe3aVpkxr +5x6+KYJ3Zcfj1MLhvCoZKwVc/siXPEEBMea53+7L5JpHwMe5KU/SXNilALCH4F3u +cIrVfrD7MQOO+s05KA7uY0d2sTIokwmCq9VOnZwjvnDl+6Z9RJ288ngvssNgrsYo +zuwqFVjXqTo/w6j9kKrbw17HSoC56c2QNCrMYMavFOgOGvgrugQKUVqvclXm4AQv +vuoVMOavcX+n5EmEDzgbIoFCl/cuyRUrkZqwqaufcGia+g9eVkSVg5xCxQ+PWuy7 +9E8PECZHMIOzPRVXerHC8G9RRjZk98hfIeYeSs6pHhDI2hJ/hx8NI2b9fprN3g68 +nLx/8fai5lJq +=UDmg -----END PGP PUBLIC KEY BLOCK----- pub 205C8673DC742C7C +uid Brian E Fox (CODE SIGNING KEY) + sub AD9CEBA0521B1945 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBEry8yoBEADnhvT3m/zzzuiUKyAeIfnN9CeN0ilQx4P0kFMhyZchRR4Ekb41 +xsFNBEry8yoBEADnhvT3m/zzzuiUKyAeIfnN9CeN0ilQx4P0kFMhyZchRR4Ekb41 iKw7tDL9q+g7xSo3yUT9dKjDWJ3yhDpdAhp6d4y8GAuWqlOu8CQdEHJOKK0yxTzX NMhSiskfUesM16q82/xHH3rUV92b0lxkJ0D/V5ldmYTaOwW2KRtQ7U/WP0cftdw8 dJuy4ja/ASLn+WcsA32k3uA1X9qUCNGtJHQIZpcHi961rSb+fktiqjXloAX4TQfj @@ -5601,58 +5454,64 @@ Ni8umYYRdVau7fsChwjRUPaRdwPGHQZaFBYsCPHAfn8Dnd3JPUWkevxui9pZ8Wgg 1oFx1pBf2bu9NJgsWzn1idaXrxfyKTCuQFqazhBrhH9ecIwgzC3bLW8KBd5seG5l 3k6FNSjk+54Z7sUU1ucxUUS9zK6dAw8+Sb3KVR8n4P3VEyBNKbb/U1fcXWhvm8sD 0sQOruqx9h/g/d/V6iibZNu5fkmET/Q5X2qDFk9tRYUg4zeG0652KgTQnQARAQAB -uQINBEry8yoBEADRoV4ShpX4gh2LJSLxiW2cjJsxD4LosDPUUcstgwDcYfrtfXb5 -+avDbBYDi/5lIst82WPXTuAkWi+W1prht80ydNmpbC3wsztoW2xYJPF6GO9HpVW0 -n7tTVWuQWSgHZm77cIoOfAoz9FZDphxoE6Rp/ytSzOj2rXhBTJ7B2LAI2ddMyrND -X4lBRMQnuuGiaTxe8CXEGYICBPSjP4q11cBdzCKSlRFsz2/4cFVotJhBzm0oyROZ -po3/IBF/Gz8FckWM0Ud5fKxRuED9OL0vU7aRdQsUkcwbF9CsDkvHuxxRJkErD24C -vh8ywsE4NskjxJ8L4Fi0CjXq4IN7xUcHnbuM2zvlLv7aaBVZ5FE7il6qMtowLide -PzrihTUAmqeF4IOiutJZlSwoEDBnoGgh7iNY6kvUFp/FbCGl7cMt8JPjG41m9Tdq -qfcLl1JC4pYpzg7Li6i68mCubRPiGCEVdAWVhv4jAd23vNutBLwPymQ4EUBiforO -aPoM3zGvlea8p0MoIms2ir2rOz7R7Ai7aJHf7j8RBbb7KK93F+8dTYG1CDW2KTQm -kro0CSxkMC+BxzcP5KjrWQxgmNEz+MUv2dCfU9gARC4/SGXIpFuzjyzztsciRVKb -0G5QF2DuJ+LM7RnzBU15DmxUMil348F4Ovf6+nKlSHdneCt5Z4thK948awARAQAB -iQIfBBgBAgAJBQJK8vMqAhsMAAoJECBchnPcdCx8F7QP/jbAh/IHe0mpZ4YYCXPy -KOai/u3yEk12kS06195suhHsUdvSgxPTRB9DXkXaLXcRtXPHTDY0ww7vhLumvrmo -bBrkBbOcBbXKoKyPPIibVUVGzxkIDtK7pUUKtkkxNoWecPCFv6w9APVFIz9AbQVS -mIewT8bJG9k2CUYSnb/xjGEnB1poYlsE82uhfLpwe0k0k5vYE54wnmt7Ko+r968D -smdIE63J+CxkPs/RZ0RHi57LamxC7BBnOvHWCtzQabDNuYluyde0zSO66VvkS/Qj -DZerkq+1/1+E3as3557K4FplEriYUtq42UIpgrUsibLu9lTP13GdC2L/pylK4Nsm -TsgnrupjZkeSM9huNi15xdF2iFOwU0A1Tx2/zrdWLyrqlEBob+Bd9wJGqvY2E1Hk -Q9Dfcmx5OQFDAZTLOKUagVTULVhWZy/phLkuLhzP8IKjiDjvELDG/fNK3rKJJYlj -KkxPdL5WNpkmi52cdPGhF3IwQ0oN9uaLlte97QfPbuxgAtCl+GNG4DGHTKdQXIl/ -tSFvWgVNCQRoCa+jsKw5rhgH6Aj+5quFzy/yXPFto8mb+oQ1Qsh0tjDr06uII2Ix -n18TSwpN1BRPd6UpvoZhC03iQwAtw/M66LYoTWvwk1xyeC8G+m/FMyNqDziAypBC -k2jL7nGs2D66/qmjgmO2J1/D -=ugSE +tDJCcmlhbiBFIEZveCAoQ09ERSBTSUdOSU5HIEtFWSkgPGJyaWFuZkBhcGFjaGUu +b3JnPs7BTQRK8vMqARAA0aFeEoaV+IIdiyUi8YltnIybMQ+C6LAz1FHLLYMA3GH6 +7X12+fmrw2wWA4v+ZSLLfNlj107gJFovltaa4bfNMnTZqWwt8LM7aFtsWCTxehjv +R6VVtJ+7U1VrkFkoB2Zu+3CKDnwKM/RWQ6YcaBOkaf8rUszo9q14QUyewdiwCNnX +TMqzQ1+JQUTEJ7rhomk8XvAlxBmCAgT0oz+KtdXAXcwikpURbM9v+HBVaLSYQc5t +KMkTmaaN/yARfxs/BXJFjNFHeXysUbhA/Ti9L1O2kXULFJHMGxfQrA5Lx7scUSZB +Kw9uAr4fMsLBODbJI8SfC+BYtAo16uCDe8VHB527jNs75S7+2mgVWeRRO4peqjLa +MC4nXj864oU1AJqnheCDorrSWZUsKBAwZ6BoIe4jWOpL1BafxWwhpe3DLfCT4xuN +ZvU3aqn3C5dSQuKWKc4Oy4uouvJgrm0T4hghFXQFlYb+IwHdt7zbrQS8D8pkOBFA +Yn6Kzmj6DN8xr5XmvKdDKCJrNoq9qzs+0ewIu2iR3+4/EQW2+yivdxfvHU2BtQg1 +tik0JpK6NAksZDAvgcc3D+So61kMYJjRM/jFL9nQn1PYAEQuP0hlyKRbs48s87bH +IkVSm9BuUBdg7ifizO0Z8wVNeQ5sVDIpd+PBeDr3+vpypUh3Z3greWeLYSvePGsA +EQEAAcLBXwQYAQIACQUCSvLzKgIbDAAKCRAgXIZz3HQsfBe0D/42wIfyB3tJqWeG +GAlz8ijmov7t8hJNdpEtOtfebLoR7FHb0oMT00QfQ15F2i13EbVzx0w2NMMO74S7 +pr65qGwa5AWznAW1yqCsjzyIm1VFRs8ZCA7Su6VFCrZJMTaFnnDwhb+sPQD1RSM/ +QG0FUpiHsE/GyRvZNglGEp2/8YxhJwdaaGJbBPNroXy6cHtJNJOb2BOeMJ5reyqP +q/evA7JnSBOtyfgsZD7P0WdER4uey2psQuwQZzrx1grc0GmwzbmJbsnXtM0juulb +5Ev0Iw2Xq5Kvtf9fhN2rN+eeyuBaZRK4mFLauNlCKYK1LImy7vZUz9dxnQti/6cp +SuDbJk7IJ67qY2ZHkjPYbjYtecXRdohTsFNANU8dv863Vi8q6pRAaG/gXfcCRqr2 +NhNR5EPQ33JseTkBQwGUyzilGoFU1C1YVmcv6YS5Li4cz/CCo4g47xCwxv3zSt6y +iSWJYypMT3S+VjaZJoudnHTxoRdyMENKDfbmi5bXve0Hz27sYALQpfhjRuAxh0yn +UFyJf7Uhb1oFTQkEaAmvo7CsOa4YB+gI/uarhc8v8lzxbaPJm/qENULIdLYw69Or +iCNiMZ9fE0sKTdQUT3elKb6GYQtN4kMALcPzOui2KE1r8JNccngvBvpvxTMjag84 +gMqQQpNoy+5xrNg+uv6po4Jjtidfww== +=WYUM -----END PGP PUBLIC KEY BLOCK----- pub 2148325ADD28A1AD +uid Build Engineering + sub 2D4537C5AFEEBF9B -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBFFCZsIBCADQOqjBEfLoBf7L+CCIqlJRZEMi81HgFJA1Gy3/4fXe9E3OtMAJ +xsBNBFFCZsIBCADQOqjBEfLoBf7L+CCIqlJRZEMi81HgFJA1Gy3/4fXe9E3OtMAJ dSkiQYPIzDqbNagYCpsMBSSduJ7EnXNPJoWHIAEn1q+FJcFMvTo4nIC5eKFu7eF9 UBjF8MsmYKgvyPMWJuiY1/8SMDCKvGZA5x3LaPJfyF0CwUraYW8N5yaxyXP77Yhr 6keb+JMZ4Y092i5EpCykv1VhZm9zql6FRr6vVjKoLHBxaoO2kwBD2CAyDXGYBJAA gmths3vGjVLgknKbYE3amsmfwxVL47ecuR23Wz/YE/7u/QtqNQo1FjljJ/qU4kkx -+TaaLMUtOkbrZU1SNsmA98CF7J5OUhVk6F55ABEBAAG5AQ0EUUJmwgEIAL3n3dDP -glovXzkoiEZQKPqnbH1WizgHrWHJ1c1vhhNpQW9gFteiMv7ss8C56IEfu50SRNmY -ZJwbYPnGPhe/okPv6BdgAN/H9tIRlLuY1dAxQkO3K/qbM+33sMDLEm/aZ4NwJlU9 -smKKiWy4B+9Rg2RiZXIRHl7Z2tFvb3BMJBZZmG2EYrH9AwpcIO0jfvF8rTkhuY7H -uPsPXUOgg0MpZdS5VtqC3OPKnKYcu2e2AUVfVUQDHw/7PQz3B2Nyx0POPDI/d2Od -ssNcBNqjadCCVmk+MVbVjBMv1AVxUhDWDDjobcMmjZSmQPSmbenxFeO1TUjxNAl/ -AuiGqkj5GhbxSNUAEQEAAYkBHwQYAQIACQUCUUJmwgIbDAAKCRAhSDJa3SihrXNf -B/9+N+OLoc6zdbWAdl9lWvgkl8MncpBQu33Lq4sC3nZ3OeKZm6CyI40iLwmD63RJ -qkU1g41P1pcitRfmEukX/eUJPM3dDLkE9NGYU/H252FZGi5oOXEL3rWHnewykTVA -EVS0j2GgiMTePyaYA8AsI7ZAXv/FnAzlYaPJkI3dDyYzEnx+Eez6cV3GxWLhnD+6 -QiUlHKjFvZYJ4p7GbvXW9+y9eS4bVjsb9oe8/rVSuNC0blqpbZrvDoVHXbingv3d -+OL0uIIop5lk6dsCW8c7dJRpcgWzzdRAhLs+XVc62Y2VLRIMcID6agvA44qAijzq -KL63dnDfxqDAN5pdHJbzl7oE -=knbd ++TaaLMUtOkbrZU1SNsmA98CF7J5OUhVk6F55ABEBAAG0LEJ1aWxkIEVuZ2luZWVy +aW5nIDxidWlsZC10ZWFtQGF0bGFzc2lhbi5jb20+zsBNBFFCZsIBCAC9593Qz4Ja +L185KIhGUCj6p2x9Vos4B61hydXNb4YTaUFvYBbXojL+7LPAueiBH7udEkTZmGSc +G2D5xj4Xv6JD7+gXYADfx/bSEZS7mNXQMUJDtyv6mzPt97DAyxJv2meDcCZVPbJi +iolsuAfvUYNkYmVyER5e2drRb29wTCQWWZhthGKx/QMKXCDtI37xfK05IbmOx7j7 +D11DoINDKWXUuVbagtzjypymHLtntgFFX1VEAx8P+z0M9wdjcsdDzjwyP3djnbLD +XATao2nQglZpPjFW1YwTL9QFcVIQ1gw46G3DJo2UpkD0pm3p8RXjtU1I8TQJfwLo +hqpI+RoW8UjVABEBAAHCwF8EGAECAAkFAlFCZsICGwwACgkQIUgyWt0ooa1zXwf/ +fjfji6HOs3W1gHZfZVr4JJfDJ3KQULt9y6uLAt52dznimZugsiONIi8Jg+t0SapF +NYONT9aXIrUX5hLpF/3lCTzN3Qy5BPTRmFPx9udhWRouaDlxC961h53sMpE1QBFU +tI9hoIjE3j8mmAPALCO2QF7/xZwM5WGjyZCN3Q8mMxJ8fhHs+nFdxsVi4Zw/ukIl +JRyoxb2WCeKexm711vfsvXkuG1Y7G/aHvP61UrjQtG5aqW2a7w6FR124p4L93fji +9LiCKKeZZOnbAlvHO3SUaXIFs83UQIS7Pl1XOtmNlS0SDHCA+moLwOOKgIo86ii+ +t3Zw38agwDeaXRyW85e6BA== +=LxOb -----END PGP PUBLIC KEY BLOCK----- pub 21939FF0CA2A6567 +uid Alex Herbert (CODE SIGNING KEY) + sub A98BD25BE464EA45 -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -5667,30 +5526,31 @@ tzyxzqapJVDCLS4ypBH2JJLKSWWGghcgoVfeXtmB6iAki/nFNSRQODGru32lnLkU j6vwSjDYkx45OSKEZSwfkr4AHHnvYMVb3sFuyM1a6/nQdhsGu5cc9mGvNKmXE71U ArDBDq1w129pi3qttrCwxXdUdTE/PtnvQyaKlVX9lD5QLORD1Pis62p4t9CEr+x+ BaZZdy7PeLAV8pobv7H7jpfhVWnb6SrLfhokA3Uy3gMyfcq9dmIs6iteKQARAQAB -uQINBFxmwqABEADbqeRjxCk1AW780rfUpDsCQDNhAUG2e8fPbAqDFfRa1nbOgNBp -UF9d6hO+UqYxxLH8xQtUW9x/M/v7hEdEg1zCUMUU6vSIpKtEg4ctSEbv9VlsMM3Z -qBQ47SpMmmVSPlsXip8PqEBX5shfv8rxCpoHtgHYrkPhGhIdEAog7Jwclz5DgwB5 -ct2VYEJrbHH/cWIF27QAXaAFphzspV2kRlgrrIBREL+PeuPRJUJKYNxbTuzI6DZZ -yQJEZ8JZcmTqREKcVF94klMq15RbfFRpiodDXK93UYp27LMOVYq9vYOyXnPIpAmi -u23+JcIZlQe/UMb2x7zXFWJJO++gpB8sbuxrhGChl6i2kGGUE4JYU7RcDA6YgZrP -FJLAuP+P55xhXI4Jl0OHdLlJR9ytgWh8B4Z4QK03I5qDm2CVDXOWLtb0atqGL4zW -oUnhkseTynRN66Rv6CoxAQ/o1n7N4GvG/yLGNkcCBZO7QpCxfhqOT78OqtFvbOXo -MADd/cTFiNKP0OzYEiqysu06rD9zJCASorAELPmWbcccQP0FyFKigRw8YwjH+Mlq -U0j2Fvtw/5o+Asy2T5/4aH8PJ8vy1pnnFSK3qPElB/WgpHjjkhb0gMKGly8estyV -wAB7snGCxF7X7DcdKrrB3pdWZkx0UCV+5LThTVt5eIePiMUwQPXzTKuDBQARAQAB -iQIfBBgBAgAJBQJcZsKgAhsMAAoJECGTn/DKKmVnyPwQALK1CPoYkwcRhsEX7O92 -Ysyedffl5ewj+kQWjzeIjrIkw+uoW72/TEzHRZg/3mpISElhiuN53QoZQ779Vkoj -R9H2q0oLn4l1M33y8VMW5S1YrjH7UbxiUpkeMkRPJayOlJwC30L0e0tpSTrndO7m -oHvzxMJkNKne5XzbhbwuBxxDltNYx+yWcA71zyLirHV7mhvyl1taZO87woXFls+6 -njlRdDzxejJPQq+lUlIbNn7Q4VxEKTtepBkaF0aEqnAaL9BAeKSTnCfDbtbUvRKZ -0EB9p8WPootUsNA7cNi7g6Y8FSmyBb3c9h+HiBpdiw900Q9cc0Ohe/sMkgllZYQp -qyOgfyFQ8sIdqEHwjjqcl4YvROH2sIxrzCbg/99YBq53L67nv2czh/qjPyUSz8hg -IvOuepBGqVxromBRTrCkuvR3R2JchsjFh+Hy5LrL6KeXy4N3aeqafBpAd0elKs8B -a9SS5jZHud3+JYO23eL50mAlV2ldo70i1hgSXuNKfhFTqT+8cNC/WT0AGlzWQ7hx -SJPkgLdyP1kU2BbxF6LbddFoVDx5dxtouEHBxcrybTSc25mUx0YF0W48aI81vrpr -2u4A6VzflNwIfnYBY0VU+U9WKjnUlDRXiSfXpOTqkgdBf2SAwHNnCSM1uWs5/osg -jg+rHSKnuz3mrnglKl6RBnrm -=f7O2 +tDVBbGV4IEhlcmJlcnQgKENPREUgU0lHTklORyBLRVkpIDxhaGVyYmVydEBhcGFj +aGUub3JnPrkCDQRcZsKgARAA26nkY8QpNQFu/NK31KQ7AkAzYQFBtnvHz2wKgxX0 +WtZ2zoDQaVBfXeoTvlKmMcSx/MULVFvcfzP7+4RHRINcwlDFFOr0iKSrRIOHLUhG +7/VZbDDN2agUOO0qTJplUj5bF4qfD6hAV+bIX7/K8QqaB7YB2K5D4RoSHRAKIOyc +HJc+Q4MAeXLdlWBCa2xx/3FiBdu0AF2gBaYc7KVdpEZYK6yAURC/j3rj0SVCSmDc +W07syOg2WckCRGfCWXJk6kRCnFRfeJJTKteUW3xUaYqHQ1yvd1GKduyzDlWKvb2D +sl5zyKQJortt/iXCGZUHv1DG9se81xViSTvvoKQfLG7sa4RgoZeotpBhlBOCWFO0 +XAwOmIGazxSSwLj/j+ecYVyOCZdDh3S5SUfcrYFofAeGeECtNyOag5tglQ1zli7W +9Grahi+M1qFJ4ZLHk8p0Teukb+gqMQEP6NZ+zeBrxv8ixjZHAgWTu0KQsX4ajk+/ +DqrRb2zl6DAA3f3ExYjSj9Ds2BIqsrLtOqw/cyQgEqKwBCz5lm3HHED9BchSooEc +PGMIx/jJalNI9hb7cP+aPgLMtk+f+Gh/DyfL8taZ5xUit6jxJQf1oKR445IW9IDC +hpcvHrLclcAAe7JxgsRe1+w3HSq6wd6XVmZMdFAlfuS04U1beXiHj4jFMED180yr +gwUAEQEAAYkCHwQYAQIACQUCXGbCoAIbDAAKCRAhk5/wyiplZ8j8EACytQj6GJMH +EYbBF+zvdmLMnnX35eXsI/pEFo83iI6yJMPrqFu9v0xMx0WYP95qSEhJYYrjed0K +GUO+/VZKI0fR9qtKC5+JdTN98vFTFuUtWK4x+1G8YlKZHjJETyWsjpScAt9C9HtL +aUk653Tu5qB788TCZDSp3uV824W8LgccQ5bTWMfslnAO9c8i4qx1e5ob8pdbWmTv +O8KFxZbPup45UXQ88XoyT0KvpVJSGzZ+0OFcRCk7XqQZGhdGhKpwGi/QQHikk5wn +w27W1L0SmdBAfafFj6KLVLDQO3DYu4OmPBUpsgW93PYfh4gaXYsPdNEPXHNDoXv7 +DJIJZWWEKasjoH8hUPLCHahB8I46nJeGL0Th9rCMa8wm4P/fWAaudy+u579nM4f6 +oz8lEs/IYCLzrnqQRqlca6JgUU6wpLr0d0diXIbIxYfh8uS6y+inl8uDd2nqmnwa +QHdHpSrPAWvUkuY2R7nd/iWDtt3i+dJgJVdpXaO9ItYYEl7jSn4RU6k/vHDQv1k9 +ABpc1kO4cUiT5IC3cj9ZFNgW8Rei23XRaFQ8eXcbaLhBwcXK8m00nNuZlMdGBdFu +PGiPNb66a9ruAOlc35TcCH52AWNFVPlPVio51JQ0V4kn16Tk6pIHQX9kgMBzZwkj +NblrOf6LII4Pqx0ip7s95q54JSpekQZ65g== +=3q/e -----END PGP PUBLIC KEY BLOCK----- pub 21A24B3F8B0F594A @@ -5699,7 +5559,7 @@ uid Karl Heinz Marbaise (Apache Software Foundation) sub D658968EFD5E9F85 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQQNBFMPOkYBIACdXZi+34dvl+8q0IGIjLzFP7JvUH8ail4vrf2zwliW/QZskB/7 +xsNNBFMPOkYBIACdXZi+34dvl+8q0IGIjLzFP7JvUH8ail4vrf2zwliW/QZskB/7 pFXCpV2/hX+0n+kJz0eqenl1l/+lT6p0MQ1TMCtiMccnX7WseQM+xSv4ug82nAwa dOfCHar6FzgQ+/5+alCCKewYIqfjiWycYgGWDPpUK5FKErXU8drSwpwN2Hc4R4nz CbE4siGynY2QTu66oF/bVr9nPieMlXf4qIIHnnJmn+cOSOLrhnyK7g+7k1+D95Gb @@ -5722,7 +5582,7 @@ EG+cxejNs7POqx6x+3/l1AbyM2W8+vJFGJ1+AANyKVmYrhs3wDHt6DWDytMnwpfA /iZyfVAtXIbcpCc8CRVF96Bup7x+HMo8HJR56sN4jpXLzy6nBrZqz7E/ykjj6H/2 zNus9l2TeL81H4xchEwZyF8i5lFsJG1O2sf7ABEBAAG0SEthcmwgSGVpbnogTWFy YmFpc2UgKEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uKSA8a2htYXJiYWlzZUBh -cGFjaGUub3JnPrkEDQRTDzpGASAA6xWBjC2INOJS+RcC5WZH4+w3mqqy4CVM5E9/ +cGFjaGUub3JnPs7DTQRTDzpGASAA6xWBjC2INOJS+RcC5WZH4+w3mqqy4CVM5E9/ OSKcwgoo580H/hyGNetA8XrZPdmm6rNob5QvlfPmwtOw/6aiNuWEtBiZ3ddEil/5 KdNuhaTcva0yoPOpNexa5cFa9ZUN76XH2aCS6I89QroOHVm9pgGl9+EAMolj8bSg MwBAyU2MRTDnMYOGafc9EuLxjTTxw6lq97BcjVRddN5a8eesxkeX5LNoTsovJJag @@ -5743,7 +5603,7 @@ HevqoidWZtJs3Qve0RR8AoIFgotGoYmIwYjAMYlDcXsGRMbvAm8Fbnpqcw+1mOnd AYml6VSSY6IoVrj6uvBG52rW43mOkhsGbfnSzfkHLlx84+9pJgYPXlpEDLtSOiKM K6NDTIfiVY1q+KiNTxYMlFqmqTYVmuH2aaUifVPn6ilau+OsCdfwMay2WWQBLHqU xdM1YIBEKWDYMo6rCtT9ueFD8MOKA7bTosfIoAllMi7p6sK49cce3pfGOiWfEsZj -nOrMQzm//O07bpOY0bh6n6JLXi8Bbbz5rwssbAs/jS85uc3biQARAQABiQQlBBgB +nOrMQzm//O07bpOY0bh6n6JLXi8Bbbz5rwssbAs/jS85uc3biQARAQABwsNlBBgB CgAPBQJTDzpGAhsMBQkB4TOAAAoJECGiSz+LD1lKCp0f/0xyMmHehpCgAHnJS1Gy QYm0bgM4/aU+d+O82pVXsp6sgbjRvz3XiOlNkyYYKsHxcReG2xKa5MtK6Ttc+1dT 35hsineL+IIzeF/4YinfRpU1hfMPSBjfZ5SBe4cLG3NLf9BY8cpo3I/bf1dc6PLh @@ -5767,87 +5627,19 @@ pZyvTrwTt0un6hZmzQvnTVh1a6eY0fTsjRDcXsMGeD3pif4SpkibCvg3/rN6v7xH Z1NbLF/OF+X/0QWPq8hvvubyHbaJIUeS0g3wU4GRlrxae3xeCqROaYmkpwIARtSe ceNY02aV0NwutkHnOiV5nkDVujBZLt21hHbg830gLwcgv5tVVvrG6rAAPdvEZzdt jEA= -=Pdn8 ------END PGP PUBLIC KEY BLOCK----- - -pub 22E44AC0622B91C3 -uid Cedric Beust - -sub BFE9E301CD277BAF ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 +=iXhb -----END PGP PUBLIC KEY BLOCK----- pub 23778689FBFBE047 sub 40D34E692FCBA56E -----BEGIN PGP PUBLIC KEY BLOCK----- -mDMEZXgxpxYJKwYBBAHaRw8BAQdAbIycVyFgMJnhB7aqYPz+dU9MIlsok/qclCuI -IsilKgS4OARleDGnEgorBgEEAZdVAQUBAQdA3w+8KkqAyic6PWfjlTbhe1upf6Rr -Qt0Dqns3NoQYoU0DAQgHiHgEGBYKACAWIQSxcTbQYVNVgQHbffcjd4aJ+/vgRwUC +xjMEZXgxpxYJKwYBBAHaRw8BAQdAbIycVyFgMJnhB7aqYPz+dU9MIlsok/qclCuI +IsilKgTOOARleDGnEgorBgEEAZdVAQUBAQdA3w+8KkqAyic6PWfjlTbhe1upf6Rr +Qt0Dqns3NoQYoU0DAQgHwngEGBYKACAWIQSxcTbQYVNVgQHbffcjd4aJ+/vgRwUC ZXgxpwIbDAAKCRAjd4aJ+/vgR/CkAQD79gNi5NkEtK8jqYIYc4HJyHx8LuNov7Wh A5u9ZhIgTwEAhjiQCoCjYE/F9u0Y8fQrlalxahFEfM+qf31PB6fF7Qw= -=60bi ------END PGP PUBLIC KEY BLOCK----- - -pub 26E74B6874AEE127 -uid Sam Judd - -sub B4E75C15C3C701AE ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQENBFPsGJIBCADOxQoTLxpZVRIbLaRfsHa2y/TEIGvxLP7TgqTwspZYnwBd0cOW -OHAvF8yGfdk5gvkGTlQ/xchwu2Ix05FO2c+fBoOgIG1Gn2Q+PwheZklS7S+V+GFk -t5S3m6b54Pl2lKbcasaM99r5g2+MhxwVnG66ldLS9fdPWqWrviOC+EipHfGyuhj0 -R0E2Oh+dNHrsZR0vtoJawA8xDP5D1Ii3jEVdi71PF8OlavG7saAZXtOW1kU77oPa -SmGFTmcFLjDP1alo95TTfBihaYiwFFnW7NQEi5Bw1u3G0+Vaoo5eJBQwYsNxLs3h -I1d7wsqFW5LK6LSxEjfvEhJypi0XzrFkFzMvABEBAAG0H1NhbSBKdWRkIDxzYW0u -YS5qdWRkQGdtYWlsLmNvbT65AQ0EU+wYkgEIALu35o9Q309zBBZD6WLTMvFt/X+N -6S/cUrNLMv3YvR/Bo1mtDxsYwmzodWOHo6TNthWm1FIkDhHUMB58q9oHzL2/JIL2 -k/jCULOhj+YAT2N5fQwvZ2WBtWtfsuFYFO5y7UKKUqo+2Dhnk8YuorPbKjVXELrH -FIq0IRlKEKnDfNrkxwHBpfeU4QaCUcCW+OjRZFsgZVVc8ZjhvvKd9/vX4Jt/c4/O -52Ym+YEYtZaiawcNYFAdMhaiwSF+dof+v2e6BIYOJrBifZuILqA87XsHQyBCABO1 -zhspt5X2QGGqkjVHiFJnYiTwqYX72n1OpoMOklJZ+ShbbGpCst81i7lyz28AEQEA -AYkBHwQYAQIACQUCU+wYkgIbDAAKCRAm50todK7hJ8OJCACtdgGnPNmYILYJ3jyX -h+WPDvxr3y3yMKmC0pRhgs/WxGK6cmRV/ej8OB5aIWCaoWeJ03twgqiaSMbn+7ON -kr1DbPLzqQGY+QJBJEvLE9m9YcAdBMHCT0fn9Op0AYQhoInOPcKLD6NFO+c91uLB -Og0q316Wlpl0p3ULH526a2YVPeKwmjCVlhrQSoHgxagNrol4gC8bfpypsjTwCccj -esiYMOPPU6eyHelFAAGEuVDmkh9gGb9wOqgum0vJEummqOStTopEGr63PoWVMXSQ -bkrTrayCcxjSiKRfK10myhIGFU2npCL9QbIT7Aw2vZ5VjIm6fWIOPJJz4dsRuYL9 -Ar8c -=LpN7 ------END PGP PUBLIC KEY BLOCK----- - -pub 280D66A55F5316C5 ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQENBFOOGVgBCACiDwUZOc6943aBGUrxikkfUnsyZfHtF9jihYmA1pSgfsye+JxR -oG9QWW9+3qx4L/d4ZEqBftTWpsjyrY7NyMaeXtJEjE0vhiWNehgXB1z4XTJ66zCX -nhlMvixGLQtfZANqCxOmtUGoSXw+oRFY/SExAioSS19HlSxApSaUzc0prdujqp9k -vOKKIBWTBIUELdDTA4+enfzkAnIINUX9LcMTmO+Fh0AvfjDbq4fr8rBglyVUSCqt -TOT4oGZlbpsq9TOKrTXh5go0rm5KJcbgKvX78ZErK6pcpTgNA+XFXCz1rQ9nkIQt -HxWaEMJtpSkIvHIBz9qoAroGtNFzz2oF4ElRABEBAAE= -=1QGy +=JEFg -----END PGP PUBLIC KEY BLOCK----- pub 2838A2C567F74226 @@ -5856,38 +5648,41 @@ uid Seth Tisue sub B293A312CEB2E9F6 -----BEGIN PGP PUBLIC KEY BLOCK----- -mDMEYVOgzRYJKwYBBAHaRw8BAQdAPnTbK24vDd1YxFLwAmpdoemwlJMKH7PyGSe/ -ab65sry0JVNldGggVGlzdWUgPHNldGgudGlzdWVAbGlnaHRiZW5kLmNvbT64OARh +xjMEYVOgzRYJKwYBBAHaRw8BAQdAPnTbK24vDd1YxFLwAmpdoemwlJMKH7PyGSe/ +ab65sry0JVNldGggVGlzdWUgPHNldGgudGlzdWVAbGlnaHRiZW5kLmNvbT7OOARh U6DNEgorBgEEAZdVAQUBAQdAsh50gWqK3tkXRhXWTv8bKOfUUFs7RLvna3KUwhIX -nXADAQgHiH4EGBYKACYWIQQI7z7CaKgEl+0gMIEoOKLFZ/dCJgUCYVOgzQIbDAUJ +nXADAQgHwn4EGBYKACYWIQQI7z7CaKgEl+0gMIEoOKLFZ/dCJgUCYVOgzQIbDAUJ A8JnAAAKCRAoOKLFZ/dCJtYHAQD90Eu8uvLofLKxoY+hbjn+dJ+fzcMZ5I2xoc1s li442QEAp72J6Hz7p0Vyu1u05NZvb+jLBwWyI0P7Hq2pfR3qFg0= -=rrV8 +=AZwH -----END PGP PUBLIC KEY BLOCK----- pub 29579F18FA8FD93B +uid Tom Ball + sub 9DF7F2349731D55B -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBFYFiMABCADYpblWssqGxbjTwsyroPh48BwdSKl59zbFKoEHDw87NeWq7fik +xsBNBFYFiMABCADYpblWssqGxbjTwsyroPh48BwdSKl59zbFKoEHDw87NeWq7fik h95RkbdeWsQSvduXWgQZsUDq9cLOkuS/ChAMkAAd3MPp1NMdFmAqS7BX5wU5s5I7 XD+/p51SWLMvgrLxoenmoE04EuQqQiXd4DbU+HGPseiNx+mN0cxPssaZMBBsmi2r RjwcQrFTaC1iffzh8FKLQvoTDzci//b5bWcxCLbsY9dYcUaDCbBAkL8HzyZUKNE9 XwXh/Rq8wDakI/VEg/905a9c4xq6Rss6Yn5E4V2SAo2+B3hYmvHFsefaM9kkqvXk -MQ6zjx83LAtzavOzmthjhhPIgCAfoQ5Q5oDzABEBAAG5AQ0EVgWIwAEIAJ29KWGH -aEt7gXV8EweJkrYd02nwjc1LyjUT2TRwEzZ9N9qUiVqfpkgnZn4mpHCToxFoqkHa -iv/QDfj7cp8jbZJa2wjaUkDbH2pZqLBGJ0sUUBZ1KNPM2uhhWRzAnmF/bIo3+Yfl -hGINLNqoevkYoo9cdelP3hepef4+PUuPmKmeo856uknmaWQ89LPwLlV7oj6wiqMY -p22sHqTGAgXeR/fSLMK7d0vSPm+57LZed5ECoRMeqYFUwSMV64RjTMkKPsvFBGvR -hppJ+uWQiMjFFuFq2DFeNBVtueHSdgCHx1TP9i+x+7JmYsmFFmRwnEdbxO3THFXa -gFQGr4ima+oOjLcAEQEAAYkBHwQYAQIACQUCVgWIwAIbDAAKCRApV58Y+o/ZO+ZZ -CACL1DlaVyRNjNxzC+30X6xGykPwCdwMRF3CRjoeIicss2pBJRaIdTYFpg3bCZKJ -J5KDC6s+03zmd3ddnKEq1fEfRcoLZ9PNBYF3IESHnNPlR68RL2cjMgq6segbhOxa -v13ZcOIOnyrWzgbVw0ZgN8P3vCllFtifwvuF50vTshIRY11G8Gluu+GZ7tfSkPww -Eo+pRd8scdol62aUUo6a71rDOMg2XPULz0l2hxKWfeUsksT5EY03seZd3CYqOacL -R+jaHyOc5Nh6R1MzcRz65YTwzVbKplXtZjOghMh+rS4eDIjEKlo456M4spKFBbTf -Ub+QS9kCkBU8csUzwF0nk/oP -=SZ35 +MQ6zjx83LAtzavOzmthjhhPIgCAfoQ5Q5oDzABEBAAG0HVRvbSBCYWxsIDx0YmFs +bDcyNEBnbWFpbC5jb20+zsBNBFYFiMABCACdvSlhh2hLe4F1fBMHiZK2HdNp8I3N +S8o1E9k0cBM2fTfalIlan6ZIJ2Z+JqRwk6MRaKpB2or/0A34+3KfI22SWtsI2lJA +2x9qWaiwRidLFFAWdSjTzNroYVkcwJ5hf2yKN/mH5YRiDSzaqHr5GKKPXHXpT94X +qXn+Pj1Lj5ipnqPOerpJ5mlkPPSz8C5Ve6I+sIqjGKdtrB6kxgIF3kf30izCu3dL +0j5vuey2XneRAqETHqmBVMEjFeuEY0zJCj7LxQRr0YaaSfrlkIjIxRbhatgxXjQV +bbnh0nYAh8dUz/YvsfuyZmLJhRZkcJxHW8Tt0xxV2oBUBq+IpmvqDoy3ABEBAAHC +wF8EGAECAAkFAlYFiMACGwwACgkQKVefGPqP2TvmWQgAi9Q5WlckTYzccwvt9F+s +RspD8AncDERdwkY6HiInLLNqQSUWiHU2BaYN2wmSiSeSgwurPtN85nd3XZyhKtXx +H0XKC2fTzQWBdyBEh5zT5UevES9nIzIKurHoG4TsWr9d2XDiDp8q1s4G1cNGYDfD +97wpZRbYn8L7hedL07ISEWNdRvBpbrvhme7X0pD8MBKPqUXfLHHaJetmlFKOmu9a +wzjINlz1C89JdocSln3lLJLE+RGNN7HmXdwmKjmnC0fo2h8jnOTYekdTM3Ec+uWE +8M1WyqZV7WYzoITIfq0uHgyIxCpaOOejOLKShQW031G/kEvZApAVPHLFM8BdJ5P6 +Dw== +=nnAS -----END PGP PUBLIC KEY BLOCK----- pub 296CD27F60EED12C @@ -5896,7 +5691,7 @@ uid Charles Lee sub D95ECEC170500D9F -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGNBFsHC7gBDADlkoJglNVbX9MShcAm6jvS5atCZwWT63gSasObXFxswsJQd1NK +xsDNBFsHC7gBDADlkoJglNVbX9MShcAm6jvS5atCZwWT63gSasObXFxswsJQd1NK qryHNcj9tKBfLbSpMOoHeyyIKDdwdxN+6+N9Hi4hf0j1Ub6deJyI8ace8VERWaxF oWE2hKVLuY6GzlNEve421WJSThDtG3Y1jcCB8sQ9NLEhzB8Qh/eoqBP5IGNMM+XP XsMDIg+15sqMpEN3oTb0WUNNaAoiWVaRJAYbQG6DsqGSBZQEo1o7K4o8xrIP3Hft @@ -5904,8 +5699,8 @@ aHn0eaQqPSxK/D0bLLDaeRxxo4u8lefVSy1dYW/70A5+kZKbHkR95zUU+GoSHBIC 9hh+U9pcdf8Q1iDiN/BAuMtYBqG6I61UZDqaEUsxrR3iTa2RpHpclbqb7kED5kFH ggaXMBP3w2PLZ7iZAOd6eBPP3T0pOMDnNduAecFC34vYgPqXeN/0wV1VQWAc1FlB l8e10i4fcrCCq2YO9up55M3ZiX0OINabpZsPfTj11C9n6olTR0TiTsHiJKViL+Jr -tAscFDboH3HXC1cAEQEAAbQcQ2hhcmxlcyBMZWUgPGNrbEBnb29nbGUuY29tPrkB -jQRbBwu4AQwA2w0BcLAcrBNFxYaqgR/u+I8OZkLRw9ArcDm4SQHJ+JSODDpmCyb7 +tAscFDboH3HXC1cAEQEAAbQcQ2hhcmxlcyBMZWUgPGNrbEBnb29nbGUuY29tPs7A +zQRbBwu4AQwA2w0BcLAcrBNFxYaqgR/u+I8OZkLRw9ArcDm4SQHJ+JSODDpmCyb7 gOUs24Nx0P3za6dag4TLGXXcDfv7TgFlSzeUcvz0whyAWfJMkuXs5+BlFe8+puDb Ladcj9IfwWQfct8N8MjAiRxduGCAKQHqSD+raepPNaC0NPEvGXYaYCT9MzDOJtMF nxVxwhhmSBNQjm4kOWbnwdZVdP2qkBQ2XxVy+/nDbOCzno/chjBla2pgBAN4Wi9n @@ -5913,7 +5708,7 @@ mUGdTiFN6gOlAOb5awaKWz5KsDwCGkgoXwoA7/pAcUT7MaRcoOyr/VnAyIq3jAMX kLmm9VUlOJh1oemY6KohREJU4yMMcoqsS6Pd9icii2iHMcbLyC+RH/Z7scPWRq8y lWuD78n7kORCf10m+Ey7CpBwb29cDNIzBYiwNBOUF1L+m9UuSX0XIy43/YbcXTSt ZaPO+3t3422YWKSxkjF93cIQ8zrel6b51SzqFhKs1VfY1P929S6qW92C1sqAeA12 -PtJVg/XBJyrvABEBAAGJAbwEGAEKACYWIQRL95uCWQB7Vm0vzoIpbNJ/YO7RLAUC +PtJVg/XBJyrvABEBAAHCwPwEGAEKACYWIQRL95uCWQB7Vm0vzoIpbNJ/YO7RLAUC WwcLuAIbDAUJCWYBgAAKCRApbNJ/YO7RLOm/DADUL72DZSb/0ZXeAnyaT/Op59qa G9KxpKbPXYEaYto0AhEMDWEeAN4nHxsl/nNJEG1nf+qdDtrVhd6E2ORFv4Y0LIrD NN7vp5mUo4Stsbn6AXL+UYtqS9ChWCLnds8dfOJTq6xOr9XKbWoIoqGWxFfjrYFE @@ -5923,7 +5718,7 @@ eUlTnitvot2rIn+zzkKBfetYFqrxFM8YnP30R6KLBVJeTR9siRFdVUOcvCheWCt3 nT9l9JJNP1ceUe7e8TrcBC4qNvEPE6ZRQi6kD4fdC6dzM2X77CDLsmuKMcSqg388 wfg286OSdKsoCgj1YDvUQqWe61UbjRPE7NArAK2gx/bMv9iz1kdOKxHCq3agJjuB OAF0H5MI/eTLpbySzrh5PAD5/2W6CzkFMpH6a6E= -=ZqRe +=M2GG -----END PGP PUBLIC KEY BLOCK----- pub 2A742740E08E7F8D @@ -5932,7 +5727,7 @@ uid Terence Parr sub 74C249541619FF0B -----BEGIN PGP PUBLIC KEY BLOCK----- -mQMuBGJIi4URCADFspeHyziASBuPXpLpikWjmC3D6VtTaDT17ogOyGLf6/sjsQUz +xsJuBGJIi4URCADFspeHyziASBuPXpLpikWjmC3D6VtTaDT17ogOyGLf6/sjsQUz 0KS3PzWBuPoqRGRpTtZxJ5yr10apr8mJF9Po5LFkrtcexaiYmUWAZAik894OhKt1 O9he2Sh1OTUiTmFU4ImQY+AeRqASZMYabhbbJOfQLJV2Er+foKzRC0T2MSQVjDho NywU1IsQG58lXEQNOA50uCuhnaCUy7Mh/GKCejyBaqXMtd517evHhqsJd9tWMNW/ @@ -5949,7 +5744,7 @@ dgdencJoa0ElraZuVXfb2Pr6cBv5wKRfU7ZBvHfCE56vJ/0zAvGbIRy4DYup8+Pj vcLSSWvQMT0iHk9TTw6sJNV/S4aH37Ux2N3SsARvqR1nZ7rQaGN5eTg7qHmwgIgd AoHa2Jd3ixOKuLzwIF4hoh+XKI7bYzVHwYq6yVZWevloxlky0FfAXCH2/lrTGyvj i83tPUIushngZ07senzgK0IWQIuLVjl03tJ/rc12AtiZkx1/ykssQ2uJolIRLfou -u7QeVGVyZW5jZSBQYXJyIDxwYXJydEBhbnRsci5vcmc+uQINBGJIi4UQCAD5Ghrh +u7QeVGVyZW5jZSBQYXJyIDxwYXJydEBhbnRsci5vcmc+zsFNBGJIi4UQCAD5Ghrh 2sWmpfEBHhmMnZYDS/1ZQZaZtmvTcGmqOhbOAe8zjnchtJDd76X4NjN/HDQSlUqz 7saJEs/j9rV/e/S5sE9/9Ad+Jj+XN+pQPAJQ18HxmTDKC+zJ22Ej4MPqGBY6d3qV rc7m+0Ue+m4fxy/q5glVYifnBVu8BvKEkifVSDf75Cr+DgObtAIqy7+mG6VyAm1p @@ -5960,11 +5755,11 @@ eUXjG9wX2e0b7rtLu+48C9OwfKG98ZqoGyyyL94NJULEP0UhhcZkOutUIKgyQzVH uqYTcRkqvZ+MEpSaZBvyq7qySeMOpSQ3DKiWEyKnXb0BS+s5btJXQcrfdJIuVvN2 /3P4I5gzmXIu+CqZaMicrOK5ekbkBOzMaqXPUEwfzGG0UOg4ClWdU9c876ksZvGu 7La3kOFUgSey5X8DuuzqSjxcJeTX6eO8jIJCd1Tib6M1Go9TzpByHf6pnJQG6HCY -v+71Wwpys6XTDspfDFZNuSpBJnKe341W2m48o3GhorM4iHgEGBEIACAWIQRXGeUO +v+71Wwpys6XTDspfDFZNuSpBJnKe341W2m48o3GhorM4wngEGBEIACAWIQRXGeUO rFpLHdOQtywqdCdA4I5/jQUCYkiLhQIbDAAKCRAqdCdA4I5/jaJ6AP0XeybLJPdE 2S4dOCzdDWkY3/Ge7zR+24dG7IjwqbShRgD/cN7sq1NgRQ7ykCPxh0ZOjJNKSYyr KuT+DCAd1uFvcTw= -=nEuq +=i1h6 -----END PGP PUBLIC KEY BLOCK----- pub 2C7B12F2A511E325 @@ -5973,25 +5768,25 @@ uid Ceki Gulcu sub 10DA72CD7FBFA159 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBE+ZO+EBCAC3fZOOuYKthr0GcUge0PH2bh18sbM9XUmPKQz/W15l1NA/2ARS +xsBNBE+ZO+EBCAC3fZOOuYKthr0GcUge0PH2bh18sbM9XUmPKQz/W15l1NA/2ARS 2gUXM0R+SunMlun9KsqjnojJ2ObVPvbm1Hg/66JSRgR3JWfIpSlJxLicpfu8rCfN bOjh4v9ZipD+px8w3o/RNrnZH/KRsoJg9yER6pf+pUZqTJfdg5lXezc1WF+/1qVo ypldMGfrkfLsPrUZTT689ubbig978e7eYmJEqldtaIwaAzHQnB70wIJyg/rEwFUM ldsvs6t6czSuJ4zPMvmh8TMpTg9e6+DMktPl1CWRONl8RPpgYMIC96gb4OnfDDjk Ex6clSCwgbDwdeAyOjjR6pVq+pCNTo1Pcj5jABEBAAG0GENla2kgR3VsY3UgPGNl -a2lAcW9zLmNoPrkBDQRPmTvhAQgAtrGiCYnW3tqvDzaStXsguVw67pou65dO7LTc +a2lAcW9zLmNoPs7ATQRPmTvhAQgAtrGiCYnW3tqvDzaStXsguVw67pou65dO7LTc rX+NTvejJZ9SrC89JsfiKBwtvyS3X/qiB+S7RP21PH7SYOy+orwDw1nacNNeiTdP nxQCDQVNeWpSpmbLlA+0b6K3aPf/EaCKndXmnQyXVOoSXZJ9bqAe0um0NRbO7M+L 1KArVkWW56ms+DvHAeZaGnSDDHQpJI5haUqgSWWP/VoPEU1x0qiBZwY3lokSwRMI SC4E/uiUvvm7rvfbBzfOiVrjNPLlsVPiQRgOTfQO7dUZAmt2yqWJt1Clliby4fgB -VcOYUx0QCMiz8MZGtSB17+hSrC2Cb1T6n0ypxuYyh4sV2LtqMQARAQABiQEfBBgB +VcOYUx0QCMiz8MZGtSB17+hSrC2Cb1T6n0ypxuYyh4sV2LtqMQARAQABwsBfBBgB AgAJBQJPmTvhAhsMAAoJECx7EvKlEeMlX0UIAKS+4ZAKrGG9jbWfzTTDbu9zzkXg V13suMD+XcGz10DkdluTUBXj8wWlp289fXNm4E49ipsNK+dcZ+gOATjUvb1Llh6D 6bHz1QM7olxBCeU2feTmYYKBH8GYY9JZzfAXNMQhcNiiPj+ntZqePy/EFA4uZHM7 We7vl2c7CBcDAq1NNeEczo0KvG7AWt6QoaMVmbvA14EKadNzrmEy9apkag1BKvwz XInYCvIHMa9ZqicOSUcI5QCYu5TufvIE7Eq3Khh2Ex1FiOaEA+57LMrt6NsSKXrB 8JNYbI5pqE1rxJXZnYtx3ZpPAAEfLjPdi1AOkWhvhsoPmiGFC6ebYQ5eVbI= -=xA7Z +=yz9a -----END PGP PUBLIC KEY BLOCK----- pub 2D0E1FB8FE4B68B4 @@ -6000,7 +5795,7 @@ uid Joakim Erdfelt sub FCF74AFDF5947ABA -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBFYVT4EBEACqm1qKc6Twp2Iw0tjUqr3hrZ7mjZMWg5MemH9ZiQ9iVIqV4Lee +xsFNBFYVT4EBEACqm1qKc6Twp2Iw0tjUqr3hrZ7mjZMWg5MemH9ZiQ9iVIqV4Lee KmgjVWk5jnTslriymDilDIMk0YaT67JokhgSdqMIavI29tJ6quOp0K7Rj/rNBc6p Um+mw4rybjOUCsYddvP1bg8skDoh1dHnJpVho13u1zoTDMhHpzW5vOdSwVoGhP6h OwgdRcd8ZOmHsb7q7/VjUHN6n/nrrnadOn13AJLjw0pWl9d3Ht0uR1jCK1lAgaOb @@ -6011,7 +5806,7 @@ wp9ejY7xRbJbqmVASrKwg8u9WNKAb5QpIF3F2/DQRdhHD3kX0aZ8+a//dFfenAob 7qOldsje5PxeJ+x6sgtcJ0kKrK5uv3Hk9gTA9fq5i1UKz8C0b3ChPdus7WoYDTiw RUB4+2WMtAscGnmh+8jtNVSJIaT6Azc3v+8JiF9lbek49+sMLfTZyxI2Wt8tACpY EpiuNTn0R4U4+bKXxfMh2OJ+CfVYvR7/xdNw1OonK5zk2nN58cllAuEZLwARAQAB -tClKb2FraW0gRXJkZmVsdCA8am9ha2ltLmVyZGZlbHRAZ21haWwuY29tPrkCDQRW +tClKb2FraW0gRXJkZmVsdCA8am9ha2ltLmVyZGZlbHRAZ21haWwuY29tPs7BTQRW FU+BARAA1MHdfuaUiSEtdpn8Q2zz1YkEP7svDZ+TPaB8rMqb8pJ8iLfE9tXxyPvg W3ZB3JKEniGCFYux+mVNAiLUySvNYzoP148Xu1CojNF95qqCeob8VX+9l8NrESau bjqZlXTOErAIYnRsrwJr/n8Bp4MAdhFyc3eCyPxJK3LlDEukjRLwyRmoOJl4OhzU @@ -6022,7 +5817,7 @@ zsZJ1xbNsU2O5+5r7LlpCq0al4RE0PldZxgqEDxDwPc2l3PJFmS8Kb+DXZPO6Qt2 CRi/dslpnt/0OJpWCJ13eC/FvdremUP1i3NCcpEKwiDZbznp3KWKFHGDHgCDn8c0 5z4Yql1HPmZTnRcP9T9azL8svLUAffTQ9y17us31SB+uYF6qbMR3rlREBhHa7/+6 Gx4ckAMbFPijl0vs9/PCQfOgpm2M1AmLbqbBblC3rLm8C44ZT/jhqm6OJ8BhtxNI -PzEd565ovX81ZS7OGt28Sb927+gbb4aKXQZVQ74LatXAu7ApKxkAEQEAAYkCHwQY +PzEd565ovX81ZS7OGt28Sb927+gbb4aKXQZVQ74LatXAu7ApKxkAEQEAAcLBXwQY AQIACQUCVhVPgQIbDAAKCRAtDh+4/ktotANmD/9rvMM+1t4/VX63XTaalJOKuQV/ w66Iem04Kbf91GWBzhMX5GsfVm/fFmaYsjwUeSDCKF4LT+iKlZ+4hzzTZnM5eC4t +FKVFMC8b3lt5/h4Y7IoJWliWSjEUG1zIj2HnIAjg9+WaTr4vb2TReEggd2C/f6G @@ -6035,40 +5830,7 @@ vRnsfqPhd5jo5NYm7IiV+kHY6sWHW5fjKAE2kLv/HrvySvZhxwPvjZRBwlXEZ8zA Q/JLpuB5d96AJ2SEXti8CiPw8MRb6Uad8lFg+Ww/2nLMlO0uyq93RwI4qHOHBE23 9N4hhilrHWFgAhCHwHPMtV35FKw9dYZL9DUdQB4jveCW/p+r68eZ613aLbPemC70 D78JpXJRgHL1vib++Q== -=dGtv ------END PGP PUBLIC KEY BLOCK----- - -pub 2D6641C6AF88103E -uid Maven Central Java.net import (Used to sign artifacts imported from Java.net repos) - -sub 376179DC810188ED ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQGiBEvHiBERBACWsrXr/oU5TYqCoX2pGlKVop38NX9/klFswZue0YMrAlEP3cid -nQS7TYgEbUUIe25FFX7EsaiLoBDO0xKDcbO21vddThcBwF/cTwVrBvHThMECI1jX -BUthK1UHgtn4JgFCmRSg8YVvG7jd2EU+TetdLiagwqF5aJpW8HlYjlkWZwCguQwG -tsB0aNyAM47PEmaPdRsqd3sEAIyLOe6UdvuZaS45j0oNp35llY/FzXATI9cZJu8B -HBjPtadKSkHUqiGoY1GFWw+DJXAwGiVuISOuiIzj9V7JYRDPmm5KMQphU9Wt66Vo -dLB5821lg1aLsLxwT08q7lPsbfkdzpV6IEs6Xpjiixc36T3wtW/USLhKkSwhPMeJ -EWJfA/9wq71QBxjDqOVtfddX6lCBaLP22SSZ0UIfkL3cPKFu1BlHqm1W4g/TtppQ -i50NLN820IRDsZFQYK/c3e6uX1je5ovsro4C4mtex0e1Z1TULVeVooAnX/yjK8CF -Ftggucz0ti56cqpfjhpbn1JtVJdrZ9V4vc97qOXoyRxx/v4sa7RtTWF2ZW4gQ2Vu -dHJhbCBKYXZhLm5ldCBpbXBvcnQgKFVzZWQgdG8gc2lnbiBhcnRpZmFjdHMgaW1w -b3J0ZWQgZnJvbSBKYXZhLm5ldCByZXBvcykgPHJlcG9zaXRvcnlAc29uYXR5cGUu -Y29tPrkCDQRLx4gYEAgArRqEyhMVJS+IzyZkNirv++XDskoFFWbMF1u3xmBNGeZo -vmuXdsfonVaYjGIW3KU/RfHzyaHwe2DWnPXkz1duRD3ZU4FwIWLaZhEm9I1Uf+B+ -6rUYj8u1ZUk/P6pY1m0ADPbrj1TS13HAyX8QoKm4qjaqMTtgheCJ05GIsqeqSk3R -9GWEE2WPoO5IiUh8iy/xK+poufNVxRJUeMD6rn7WfK3pmtPF55elPVJnCiEnUBkm -pcdfCo/bAp9u/0MbGkFunXvs0kwi7AK8DilC1JT7htsbWkLWN7kBcHNlt8sjMlge -gEku0f7pOrlabVTydHL36bmAQwxN14NfgDJKG8fh/wADBQf/TfAnCFsHoQ8rig70 -zMQ16YSSHL0nrzAID/44Db5kji7+iD9P7a4jZd/nyIqzKeeJOqfN4t+F5xVgmdc0 -335JRRsIzsa0t3VE0+6yjEDAueBJvjyZtxKlBgDMUXR0h2TFxTCekN0BYnmkjVhL -xhuOvkUNNwff0JRlTMBTd7q1ImYF00xUoo4YCd0X++VsviduNT3rS/G9OIbqwswj -de+XKTraowpbRADse5HFPfZNbB1qJdWWY1CZC0JCVKwZ8rVpHWqmxK6H8JKqJwt1 -XGw6pHhkkeBCaeh/JVY9N0jLMBWUATJdvQqPcR6sb25co9UkNXpEOCrRnzjsyVj5 -++jlQYhJBBgRAgAJBQJLx4gYAhsMAAoJEC1mQcaviBA+FSUAnR5Xi/qPEHd1cXSp -wdAqGKwCen3WAJwIsFD8tHGarvnRqo0ij3FERxwR3A== -=TljG +=NKED -----END PGP PUBLIC KEY BLOCK----- pub 2E2010F8A7FF4A41 @@ -6077,7 +5839,7 @@ uid Benjamin Bentmann (CODE SIGNING KEY) sub E4D15F24364C7906 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGiBEnOgPURBADYutfvXAtNgf67BQ2gWTI6+nKfILIwMPzCbQPMd7pykzF5nPMu +xsDiBEnOgPURBADYutfvXAtNgf67BQ2gWTI6+nKfILIwMPzCbQPMd7pykzF5nPMu Nswt3E7efo5IP1Zsv6DRrLafAW0OJSmL/oo8/ta0AfqcxCCbJ6CUyViifRZ5T4nU WfuWTZiaKRQ57jtt0WnNpFNFf00gDbYJWs5b4RU5Vac/0B0WDQ0wvOJfBwCgylAw LrDQmwyOZcws9VbpvZvz9pMEAMRkV6DN8kvmfktpbUnHNuZJOps5botqKyffQVj/ @@ -6087,7 +5849,7 @@ duxTBACUE6vsxZlzB9dXe5HjKCoPGr90kUm8uCG/CVu6fBVpZZa9B6+OM6NhEkLG FA/EKgKc/tvNIlPsRwX1R2RoV9/tR9N772ZjhLcEBKV2UO9mb5iAWWZaMJtQ06SI Ws9fyd+Zx3GGY1+iwWPUxZ2lSGLlfg3Sunl7Cni86tb0fTHTrrQ6QmVuamFtaW4g QmVudG1hbm4gKENPREUgU0lHTklORyBLRVkpIDxiZW50bWFubkBhcGFjaGUub3Jn -PrkCDQRJzoD1EAgAlYw+EWr/t9pNqJhzVpAZ9u3LMKJfrGopbO+jOW0T58mIdVF4 +Ps7BTQRJzoD1EAgAlYw+EWr/t9pNqJhzVpAZ9u3LMKJfrGopbO+jOW0T58mIdVF4 oMF5WZ4lHPTgHrRLKxXNcGlzaxjxBKtkUbnjRTSGk7ExzGIcWoqq65RI8JgONif1 VpBaS4Y8WwX/akQBnCAL+eV7UwHttVUKEmt4xUW5CNa4BgCFKtVdiomvdxnBHBCg fWNHXpNnQLWhuOGJZVyqq1ZAh0/vIxUBDSJZPxmEh5235+2CDK8Zu4FCcsi409zr @@ -6098,9 +5860,9 @@ ibjXWTe7j5A5QSUxO7p3W4AXNTKldFnlKkVs+6ZKCkKeasY2/7do6Cf2Ed6lL1CD XEYcZRZ6BbkXruI/HqT/IP2mTw1i53S5Gxj3gaG/jOroXN5cBZnRoaPJQpuri9hd UJVqPNIDhe8dz3ZxkHEgVPMoanp8xti86ErSjgvsxGs6xjjuxC9CNjMjyod7d6E1 NSt7gvVdksX3vok3QvIqQKDO6l777R9LQcxEStPz91mrBRTAyO6b7AtCk4/5S2hT -dYhJBBgRAgAJBQJJzoD1AhsMAAoJEC4gEPin/0pBVNMAoLT0LzbZNVmium/JNdBh +dcJJBBgRAgAJBQJJzoD1AhsMAAoJEC4gEPin/0pBVNMAoLT0LzbZNVmium/JNdBh Dhufgi7JAJ9s7DMysnT2e4S6/VitgWdoI9iCfA== -=P/a4 +=3YS0 -----END PGP PUBLIC KEY BLOCK----- pub 31D2D79DF7E85DD3 @@ -6109,7 +5871,7 @@ uid Markus KARG sub D091C8FFA534EDA2 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGNBGTNOPIBDACjeIqMmK4jo8NBVVacAwmqnL6H2/ixU/rPg1WEJSJRQbWu0otK +xsDNBGTNOPIBDACjeIqMmK4jo8NBVVacAwmqnL6H2/ixU/rPg1WEJSJRQbWu0otK Zrs+0tOVuYsQReW5tYUwI8hclSkdO95NC8bM7rlxcO6JSixsjzf2cOXajOAvuLMj OlGtMPblTI88/2nPmj+k3jLClsuqdXNIPdf6DQGIrJjsNfpnCO184ialqIVv0X4y Z3e8aR/coToU+CcgbWXEyqqZL35RGLs/DR1o0supIm6tBEaDGGxRcrOGTkKaQEXV @@ -6118,7 +5880,7 @@ ZgFdMh5T4WJdzuDGOBrX1FAD1ZLeumz5+Td7Tw/7odKH10ToFf8DIvP0CJnAC8EK 4HGl3NYyKv0gafEmprVNSIDrGLjY7D6bvlJ0vJ70gsQAhJF/tGfa7+pBA3/zuLe7 WD2pSyiqdsyl2mZZ/KRtMXDrhvzSk3H0nxZ4+BQhNLVBW62ty/+XYWn6QOw6tD2v 4vZCXePrel4RhjEAEQEAAbQkTWFya3VzIEtBUkcgPG1hcmt1c0BoZWFkY3Jhc2hp -bmcuZXU+uQGNBGTNOPIBDAD1VVbxdqn7crMimZKLrwWyNVGGu/YKzrpKyO6h40m3 +bmcuZXU+zsDNBGTNOPIBDAD1VVbxdqn7crMimZKLrwWyNVGGu/YKzrpKyO6h40m3 TCUYslIDECFHQL2LqfzixL9w/nXn5Oqx4rTRnlfjCZJkJUv4OnV1dIW065T+bepL srbZ5cNnMin2336ClJwnD0fkyjrVSAI59roS04WELHvkKyl3LeaqgbJMYEMoweH3 LrrKXGi3fefdEBevRR80ulpw7o0AhPhjd5NWsp/1P43Xl9poNoWaL+7/7W1jKKIa @@ -6126,7 +5888,7 @@ LrrKXGi3fefdEBevRR80ulpw7o0AhPhjd5NWsp/1P43Xl9poNoWaL+7/7W1jKKIa zL7/Mp3LI7z5ajaXhSj2Wf6/0rg8ObZV9sBJtkEVp0oq7+mFmgeF6reefyKX7g+r nA1gkdXgMPOBqExXFsXKNLU3mtRd1KsNgdQYDPn9enncmKzjW4ha7NcaFrSWchXE 73Fq43dMbCOejVy4io6+BBSXXHe8M/3/ZB+4EFohRPW0kODnngxzE3E9usuvRJTR -t4c9hhJZdMuhhPs3ry1Cql0AEQEAAYkBvAQYAQoAJhYhBB2FRp2FWcLh31+SUTHS +t4c9hhJZdMuhhPs3ry1Cql0AEQEAAcLA/AQYAQoAJhYhBB2FRp2FWcLh31+SUTHS 15336F3TBQJkzTjyAhsMBQkDwmcAAAoJEDHS15336F3T9kMMAIJHtFRvBMfCh9p0 UM4jf0ahE1LX+fUhF4zf/t+vlUmRsIHJNcteD04SxG1WRDc5xxO0IO9oAnX0AgC9 NOCAZaJ11TlXPsCRk32+x8bfCe2Wf2hOLPOfZGO+vj89m74iJf0Gh/0BySMvgwcn @@ -6136,7 +5898,7 @@ COcemMTU0U9OWFA1JghFul0moaW+gV+VtZpWR1nCFn5xJOzD2UWFFWomYWiSvL6O qEVfV/jQYAREDj9vpxlBcfRpTiUlrdFQf4uOQT1G/nXY1KITmq/hNqUdhpUjCoMC OvdyVwwfG12cTWeQiDQofGqJSptQmsUvegmfF5byUPDbgjCi4tEpWOncOeehs/Hd ZgMBzI+v/ingWOyKpKqhpZR/50PHA0o23zw8P1BGeQOlr4kFNA== -=jR+6 +=x/dW -----END PGP PUBLIC KEY BLOCK----- pub 347CD0EAED975C5F @@ -6145,113 +5907,35 @@ uid Eric Vergnaud sub C1D2A95A576A4144 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBFhntCUBCAD4TyvpNK/pLusYgw2TdhDxX0v3wk5V18XeVIs2l+Ijj64xfU2A +xsBNBFhntCUBCAD4TyvpNK/pLusYgw2TdhDxX0v3wk5V18XeVIs2l+Ijj64xfU2A DR8Md1QPOZYFWbTJZ0T17CJ5jbPtGLu9ZJWR2s4lxcwtGK7n5y9ANeMjoG38dSyp rsEbgNAE0h56ygrRB7/mDVCb+ryD3pzzTm7sgXx7GuNWQ35yz/wGJ4i5vKpp5C+c 9bZb6xGiPCzVo6O5Xkd743YCLDukJZA76BJedFDyxNSxjFBgsMq4McW9s0C9OwDT 6oYjvoR/gAlSlbu691eLKinmAxEKLt+184gVShxjlUtsCvibGI+61wYDGfmfnPxT jnYwn/97LXl0CqF9464LtCqStXBk03fn1p6JABEBAAG0KEVyaWMgVmVyZ25hdWQg -PGVyaWMudmVyZ25hdWRAd2FuYWRvby5mcj65AQ0EWGe0JQEIAL7BD5Ee1NXBr1IS +PGVyaWMudmVyZ25hdWRAd2FuYWRvby5mcj7OwE0EWGe0JQEIAL7BD5Ee1NXBr1IS 1DTQma8rhl99TG25IXnehs7MTh8rrIFxtZBcOY0l5qINstjQY+l6o0vusMkjvQp3 uYHXZZRlMMIl5n+JBFPoUDqYkP2ez1N9cUDld1GB++/yWJEZa3AktIy0PU0kYNnE KxH2Zq3bqn9YduoHdQFdxDhiDz85WNCCP4SeDUpHGts8/NJi3KXh9uGAabmr5u1J kpeNkkyn53xZ4tQvuVapMgXCwJ0bZf+YC1e4HlP0xojg5b4PvGvypUQ/XK1Cwktx qEu8Ve8jh4nFSG/6JsrzggWxzmuwdC3AsFZGWl73QjkY42ZMMqnpL7mXVV71EkA/ -KKqyPPsAEQEAAYkBPAQYAQgAJhYhBLARKMj9ME/kjm7tLDR80Ortl1xfBQJYZ7Ql +KKqyPPsAEQEAAcLAfAQYAQgAJhYhBLARKMj9ME/kjm7tLDR80Ortl1xfBQJYZ7Ql AhsMBQkDwmcAAAoJEDR80Ortl1xfcMAIAKcFDi3x1oHYY9BEUMBnZ1saaYtlHOUT MH3Ogrs0OOCy5k1xd15zSPqEcxx3uFt3tce1pq1UZZuawbHrHZ2qD+yyr0OvONHY GF9qj3iWmNwxAW/rea6C5d95ZffRU4H3k51KeutqEHcAAXzfewktOWypdhj4Zrh6 2tTkFKDEY+J1eQQt6uq6DQZnhS6m1D2cGw7RTVIyE5b1G9jM5W1TAMvFzw9H/B7D 3nMmKS4MgEGxtfOyxfC+oWywgFNcsdAhaeuV8TXFzZONc5BqSmel18fqhIlKs6EB ZrkVdEFdXoc1d82j41Cfqv8i8Uoeobj+AHVOl2ufun1BHUNmOxqO8kU= -=ln6/ ------END PGP PUBLIC KEY BLOCK----- - -pub 34918B7D3969D2F5 -uid Brad Corso - -sub 5CE9BCD2ED28F793 ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQGNBF0vfHYBDADEDPY9ub98c7jQe4yMbPke3A/sxNHnn0WuA9JN880DPs3L7lrv -9VHTOlFXslDNBPYSbgFXH5YlMGg8ZY8bhngjc+Z3dtrCX1cAjUXOnibi7fBFomLB -xvKzTHyWprguV6B2YAldKpqA4DtecJEF6jusNPptSpMN2olZGcxVrTB1s75eO5Lr -MRIvZoWxvkH76KxisytDh/Z3MJMi9fFD+2OMsC/WynOs0TIih1T5U2jCz25dwkez -zb3Bd4G6E85fS+weJPXMRiezimF8WyFN+dDrFgpwWqgA24jbKG/tfF6sAuvGmPgw -aKIv2VFrdstqfCVC9p2nzuchIDS85f/D+fEjBsSj8spUzA15rD0T1/9BHxtW+L92 -fcTs0rTGT4sP5HPl2aD9R/NP03Ywg8bDqcBWofTuCMtfDz5lUBpeOPngByDiKtQC -tpsB0PyhPoMkrn701QSkMXPO6yLP6VZH5f9qhpvWrHLqsd4GEA+PoRuBJbYoDErq -5hLW0Sgi9qDyzLMAEQEAAbQeQnJhZCBDb3JzbyA8YmNvcnNvQGdvb2dsZS5jb20+ -uQGNBF0vfHYBDADQCIbElrNvg2km9F/xYNvj9JQmOcJcUiADJcYqJKjwPMtPZav4 -YO3t6E8q73cQEumDIONrl4ZnVTIb4KBEFvKsxlboOxqRJJxoPt4R8qLPSUJqJDRo -aMMqscaxRv6KTS3hpBJ6ga4ti5F2dOvqhyREWCXfjEhVcrBOn4naeoPNfzZTPQLK -Gp2RHK/kRTuVbLsVu6Ep1MyPutj4s1NBs7Ne3JTuxEkOP1mrG6hU2eNZMz7ooUHu -lasgnDZvq6qrYKoBPyxm7VytpPB6+jW8JsjvJZFB1KoQZM83uliGNLKdIY62ANc3 -n+iEp0wQZzIskgjPvClXKgqbCzqAYSiz9Nl546SpChnvlYDKYL2fjso9c0Ji3Kwi -6cLEmA3HqtIVT4haBOy4PbVaW7W62tscwCeDGFDKF+z0X4P5QhmvmnL0N4UTvcjn -mLVhZQDELxo0gYrLTsxOyFiGiyTGQ2tFMMBXM56+oLnfeoMsURrcLAfEr+6UeKn0 -dWazDXA3i0YvLp8AEQEAAYkBvAQYAQoAJhYhBE+P7GeF9hHZpxLqJzSRi305adL1 -BQJdL3x2AhsMBQkDwmcAAAoJEDSRi305adL15/ML/iz3yusafhsG4zh1KJhVuyQK -DinmReoBfrTBuETu2y6fwb1qwCpx454mT7aRgtFaEQHtNQW+7rQjDwn8CMgu2xP4 -2I26E0xlAfs5vcstJ3WdOrcbfIFEnSrQWEUumX4fWoMr1m2uOC1cy8uSdGTRPjCS -vOTxmmGWBbgAevhnh3P+4egb1aBEgfvz7rcklodxqftJcKlnHehqWdS8+SyM1z+v -i3Kk4SczMMgCgUNb3ZJjmL0F1kAHAXlolxhZjiODoB+WpyHHXw8ahGiqLz9pz6DL -VGe6el0xK9Gf6KDg5jfBvD03p9RBqNKc+gYZ5oTUoYQILmHmx9LvPdU9CYmIeg/e -sDcK4hd0+GJq2GzJNIZkoBQM/bi5xrpHh9ZJnwWrAJq7zIcxxJWPFK4zhpvZGlCY -9/9dnCinH+epV0d4POb7SUfCz+XfrOYdTYs/G5UCggCVrBxCqdq9wdIoPgi18pUq -K0rLXbIe/0Q1MkLjnJ9MqcnGGPSNV5d2f/Q9Y8U9EA== -=6FcK ------END PGP PUBLIC KEY BLOCK----- - -pub 3595395EB3D8E1BA -uid Ralph Goers (CODE SIGNING KEY) - -sub FE694B892910DD22 ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -E4MKxXh0DGLPEPiyStLVF41310m6rA== -=n4Zz +=2V7B -----END PGP PUBLIC KEY BLOCK----- pub 36D4E9618F3ADAB5 +uid Ohad Shai + sub C4935FA8AC763C70 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGNBGGiftwBDAC94Yhhh/5yO8jYFkg01MPnooXKZEPwxAbAg9wn5iM0tHxhEpkU +xsDNBGGiftwBDAC94Yhhh/5yO8jYFkg01MPnooXKZEPwxAbAg9wn5iM0tHxhEpkU zJVYZ+JYq013+Ldp8Of7A/d6hKTtZ0xwSeY7S/WFykIk6tc0P5j0sfFS3pGPDk+W D3DwUa+8m0PriF7iA57vCOE51znO/IUIA3PG2YAK6jv2/i8MDXOOq3qB7VrbvKGB kIPubp5PbjvP+LFhLuUReU9m2y/3q9lNFXdd9kE2iScqGmu3FDhRJxBK/WQ2kqiv @@ -6259,25 +5943,26 @@ sJZjAYeHEVNcc88Ah6vXI73uYrvWVGCErzswYy9UrxCAQ/x2OxUdLw7NTHwjZSYC JvH5JPPTlDxMgfwTIsmaECtw4QgiVmvDp+RVa9zyrdI++RNr0InsXv9gWMv3p3yf TF20ZL8znFYVUi6XkeQhZjT4fHwDqDVnxhSAFe3E0cwHFJBQe2EFLljwNy6VYnio wBr7HrAxczRRqlUy4a3bH5KwiNwwvxgqfdMj9KTVpP9t98/TA36bIohwGFRWB7W4 -i395S90NsTbCh/cAEQEAAbkBjQRhon7cAQwAtPmKcM1/z8sMJnt4sHe3ndXsOdSq -TJbRkAcdyDO1F4qgj5z9wkrlVVKGuVtmJS3qmR901Q+oH+JqM6UeGqhNig4IQvME -iQjjelvKXMX9PPVzlP+ga5Y1/2mnUmgmYXK406CU7aaQ3hs7++XDonnQUt5nWF9d -XT+xK/SDLYMk5i1TNqPVFZBPm44HpIjKGNJXD7Vv/5z62+hKswpLXgYt8Rz95ByG -ncjQ1Lo2M1T1Y/EuwlRoc9RTdyABavSQWVLKIz6kKM4LejajjRvLnybMUug0CJl5 -mni4cHXx9t0pMlG5DE2O3mZLwTgWcJ8cu2CtPxA9iLfVvFAThxk3ZitkEhChBtG9 -/V8D4DiTIht6bd49xkHP5pxtB/fuo9lNb0axSBaOAeant3KA6F6vki+chnGhOFqV -1KJHcxYG7VsG1hYhy5IbZsg4GdcXfTwwF1/mq8kvHfyTkBy6HMDGwpr0ATNnrxO7 -tJTiVqDuxfviGQUjqJIQDns6fM9BI4OfpXyjABEBAAGJAbYEGAEIACAWIQRH62g2 -JF0tQOid+0E21OlhjzratQUCYaJ+3AIbDAAKCRA21OlhjzratRBcDACCfhsaCFvM -JTls5lT/dcTqSCYJYZyDj95DlTiaRNkXnAGrTyE45PnmJLv6FFZzSZdu/eLE8ls2 -MY/KWqnZYYV2Mct/pwDDLSjdAN/NSRe9HeAh2OS1kNeN2SIcoL55gEodKBNSMisY -9N3ylLMxHZPa5LNBo+j9wftEaVi2fTX8LDJFQvUOZ3f7cz3f6u42FeHUqaLm2alH -QSkfTB3yIu8Hmo2EXHh4UfwTmS55OBGLQ91d8neu7PcimqCeadeHW+qY5g5hr5NN -LxMA+n+vwPGcQNxg0lH2XBdlFBbAELEGxMcKbW51QL2h+EdwGzT/nK3Iia/qm3N5 -0Z12j/hhzohlf7TQjhzB43Wbxef94JbKacvng8t/hG3+n8UASQzizCSn/oMkXQom -XdQe5JFgJCroU2CfrdFmZfbkkq9mAi80BLUEAGNTUQrg/W39VX1/klGiXiWtpU8g -q/tSGRQHXTwG53qejlUtKI315ZizOhJiniSDx4fZaK2zB9RlZkrnd1Y= -=KPJF +i395S90NsTbCh/cAEQEAAbQeT2hhZCBTaGFpIDxvaGFkc2hhaUBnbWFpbC5jb20+ +zsDNBGGiftwBDAC0+YpwzX/Pywwme3iwd7ed1ew51KpMltGQBx3IM7UXiqCPnP3C +SuVVUoa5W2YlLeqZH3TVD6gf4mozpR4aqE2KDghC8wSJCON6W8pcxf089XOU/6Br +ljX/aadSaCZhcrjToJTtppDeGzv75cOiedBS3mdYX11dP7Er9IMtgyTmLVM2o9UV +kE+bjgekiMoY0lcPtW//nPrb6EqzCkteBi3xHP3kHIadyNDUujYzVPVj8S7CVGhz +1FN3IAFq9JBZUsojPqQozgt6NqONG8ufJsxS6DQImXmaeLhwdfH23SkyUbkMTY7e +ZkvBOBZwnxy7YK0/ED2It9W8UBOHGTdmK2QSEKEG0b39XwPgOJMiG3pt3j3GQc/m +nG0H9+6j2U1vRrFIFo4B5qe3coDoXq+SL5yGcaE4WpXUokdzFgbtWwbWFiHLkhtm +yDgZ1xd9PDAXX+aryS8d/JOQHLocwMbCmvQBM2evE7u0lOJWoO7F++IZBSOokhAO +ezp8z0Ejg5+lfKMAEQEAAcLA9gQYAQgAIBYhBEfraDYkXS1A6J37QTbU6WGPOtq1 +BQJhon7cAhsMAAoJEDbU6WGPOtq1EFwMAIJ+GxoIW8wlOWzmVP91xOpIJglhnIOP +3kOVOJpE2RecAatPITjk+eYku/oUVnNJl2794sTyWzYxj8paqdlhhXYxy3+nAMMt +KN0A381JF70d4CHY5LWQ143ZIhygvnmASh0oE1IyKxj03fKUszEdk9rks0Gj6P3B ++0RpWLZ9NfwsMkVC9Q5nd/tzPd/q7jYV4dSpoubZqUdBKR9MHfIi7weajYRceHhR +/BOZLnk4EYtD3V3yd67s9yKaoJ5p14db6pjmDmGvk00vEwD6f6/A8ZxA3GDSUfZc +F2UUFsAQsQbExwptbnVAvaH4R3AbNP+crciJr+qbc3nRnXaP+GHOiGV/tNCOHMHj +dZvF5/3glsppy+eDy3+Ebf6fxQBJDOLMJKf+gyRdCiZd1B7kkWAkKuhTYJ+t0WZl +9uSSr2YCLzQEtQQAY1NRCuD9bf1VfX+SUaJeJa2lTyCr+1IZFAddPAbnep6OVS0o +jfXlmLM6EmKeJIPHh9lorbMH1GVmSud3Vg== +=EqUU -----END PGP PUBLIC KEY BLOCK----- pub 36F224409991B46C @@ -6288,7 +5973,7 @@ sub D137C32FD6897607 sub 4F91D100EB1F597B -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBFpLCbkBEACk79tGWBbIoD+A7IZv4UE3+I9i9EhEGn7yzx+XwGbKwyBIMYrs +xsFNBFpLCbkBEACk79tGWBbIoD+A7IZv4UE3+I9i9EhEGn7yzx+XwGbKwyBIMYrs cqzGaIwjid1tXz9wc7G4lXbzH0jgnCW26r0e4u0sBSziF+UKSAPZC2qduARGmlr8 6GFBhcwwgrMOo1niuQ79bHXmykN7sQ1YTi1P9FM+HN1c2vhWCcwx80bKtOjbohua vUzFTM6CaIoqBsHntQP/ObybtAnRKpp42OFXlnW5nP/vxAIL97Sll2XhYceWBYHg @@ -6299,7 +5984,7 @@ FIHDq/HhLND+BivwiLoaVrXshSNd0DRnfZnBl6J0L0NFhwqGViVfz+A63ym3+oUO PCRV/RH2RIyQ6fklh4faqQa/Q5KAzQ3TkR3actB4b1MPAS2zq4avZxqn3DuBethw /MV0JQPW+iZtFt/mHB9BtZf8oCPxR20CNFg/N6hjm3IGlbGcc3AOa3E2nH3X+qT3 e4/bwJ3zb4INTVBF5hqdkzxkwaBQ/FdhnykHwiNkC0RZP3pAePmAlzkKOQARAQAB -tCFMdWtobm9zIExpdSA8bHVraG5vc0BsdWtobm9zLm9yZz65Ag0EWksKewEQALY5 +tCFMdWtobm9zIExpdSA8bHVraG5vc0BsdWtobm9zLm9yZz7OwU0EWksKewEQALY5 aIXpHtSc6b/3e++yL/jYpdZTJwZdsNAfz0mdGsflYvgoBHyMyjs6D5ChJBJOS14u CgmCAG82AXPa8Ye3hGs/N5k6/jh3oOJwBV3P4oFBSzzq9Fq0jIYf4u524Tb42rO9 o14bCLaGk1rKW+EFHyuz/ApTMcIulAPxkiEb8K2gEg5YrafdFC72fV7pxTUR4I9W @@ -6310,7 +5995,7 @@ c/c2BjF9YCkfy4KShYdwi0Z1qy9oucSvnCezzF5r7JpgGpqBKCDZQe/P+oSf4BAv 5C+Irj8gxHlZh0nS4sn0mnt/nFNz0cRBPJyrlfn96KsU7mqON2c9bSLZYz9Irtbu 7Ce2+I8Q3D0ZDjlQztLB8+cCfD9uE4DICJMqwp1CQ/HyW0UXCI+TADr5Qf/qZdLx myZAqAGI9VVBbuWbdMBevrFM8MH917kfHKaheTKyfHIURsJUh+Wrxj/fPquCDsgH -VVM5hpwf4fa9mGPDxdFp2i1uKPBmvjvis6yIuQJdABEBAAGJAjYEGAEKACAWIQTM +VVM5hpwf4fa9mGPDxdFp2i1uKPBmvjvis6yIuQJdABEBAAHCwXYEGAEKACAWIQTM il3AESzJUb/ckDQ28iRAmZG0bAUCWksKewIbIAAKCRA28iRAmZG0bFbbD/oDpZ/A 6m7FxcG1jjz4Lx1DWyU64nsL469SAix9k0zvtxQLsQaF+WyTcitNxjMJfoUSBQBR UXPZ8qNku2dDxIUXzyDp8jBrPasVdddkwZtTgq06fh9Y3iNGouxcoD5c3YtgkOHL @@ -6322,7 +6007,7 @@ GZX8DQ9OEBiak1fDtJfCSYN+SDgmApAMNpL9fVAANua6jTuzz7f4T9uNPvpA4bI7 4eKLdTjpxzzDFlNoC0JuF1VfB9ulzBtqsrMOvJNTslUbq13G/xLHOtE7mj4Uv+70 PW4z/+3qrhSoau6Y4xWujp3N/1fJFIuPKNiGewbKVVMfFqPMLHaDdKoKB/nSRRly Pwqgob4T82ay0Q3+Iv1qpxJ4y90ecFiSPwb0LoErSFhBXY1qFbDKc8hEKooheJYw -U2efmIiOWwRdJXu95bm6vcaEhgTeR8ykXdvRlrkCDQRaSwpbARAAxxTN36p2LYve +U2efmIiOWwRdJXu95bm6vcaEhgTeR8ykXdvRls7BTQRaSwpbARAAxxTN36p2LYve QLOAPfcJpxVgDUiJHx/hn617CSupaoUfn87d1FScbunYXklsBh6zSOjY2VOl9NOe XszTNSvhHAeRUEg/teUZgXS7yiy46DADpO8g2QwkQILxdnZCgLccplJxGP9tg9AN YyAeuSAb5hP+lFWNK0MIh35KqKu1g+SbidiF4Q84UtPBlArdxDsbJ39Flv2i+MlH @@ -6333,7 +6018,7 @@ L/XncVzPzHg5xJFi/NOvjX7G0cL+veDi9ZMjb3w9H8JMp6FeyXCU73EjZK2n4LcK 9jbxdzLY4bWzcAFHpdJrOjwL3Y6nz0Jo5QbT9Sa+8HOt6rnHimXUtRdOvaK3ZuNX O25WhXExLL6JUA4FL0PTjYoxwz3mUSLZ2BNhDhVEGC8/yl4U3Z43HxTDQRweRmD8 M5d850n1GPmBr6NN7EQT9cnmqiBds4PbIRo6FIexdMuGPERo21hNuQlXqEAm/Y4v -cUPDJgzeiKZOObLzqcALT7DKzDtYyKkAEQEAAYkCNgQYAQoAIBYhBMyKXcARLMlR +cUPDJgzeiKZOObLzqcALT7DKzDtYyKkAEQEAAcLBdgQYAQoAIBYhBMyKXcARLMlR v9yQNDbyJECZkbRsBQJaSwpbAhsMAAoJEDbyJECZkbRs8nsP/isZluuMpQRlRNgV KE+/n6wfepssfDBVo1veE/W+O8HnFUWheh8Wv3kgaZYbga9wt12P7ZCzCsBIIvCj t7FycmaXJnIgFxsBS5qWbRIDL6QXeuJYSLuDzV3BTstZ8B1EseCZ0eqFG7XMdVoj @@ -6345,7 +6030,7 @@ n4kM8PQNei6pooo7E41pDCbQ/xPcxEbHMKgfZ1k17wUeXmGEy+KxVSMLvl2xCTbk zxQeoML8GP8lJrTIFzlqKTwgkMtJohPJ2cMMYglCck6u5cqMVugWEC2BHjdGNz4/ 5oIAlaW1iU5efbsENyitZUIRcFv7Ov0Pw+CpfWtZCwAuXigKCc20A1ansPFNHFVg WOv6WH13EGgAQSlCBu6GUciCscDUCTxVzk2YFFtggqdLOFryOV1NMAxQAXHqNKs6 -2321rl2ESemLHH0FuHwY4/zMQWGNuQINBFpLCkMBEADHh4VNRyUcAEBluZyCcfnA +2321rl2ESemLHH0FuHwY4/zMQWGNzsFNBFpLCkMBEADHh4VNRyUcAEBluZyCcfnA YHKIoeDJKIa67JYenE2X1yAnqTQvu8GUEZ+a2ZHZ9Iwm0uI1fKKx8ZBdrm/0hnpv lB2d/eB823afgM+7Jz4WL4hVjU3NQ50zXjC4RsHQi+jyJNwI5IuLRn3VoJBjHJa2 kcpsUoHyaPU2dwqTdRkqHX65ljPT2WOMPguVBqH0D0dIVpTgTDfYKT3BOhbaOyy6 @@ -6356,7 +6041,7 @@ WvF19ZvScHRQ4Hgr4rCKcSZtFDvSkPWUkbOwCLDEwFWbxLhNGmfZ6kju5Jd9arZA QZrtnLLjlbtrWqGxZ5mlqW67Lcs7q/O9NZ43WZvlLZg4uP/NnaAZZrwdzGJR5p2H TF6NwhUozllq4u7Ar/HcLTu2ymEJebXqpPrL6bs3uf3Lqoo3LwXexk29oMaTOL9r EdcW6ePhMZo2OmElTi6ieqMaCmfIX2mBv9EieH27IOYQ2Z/QWT3KEsavgw40OzT2 -qroryVEwk8+LI3r/Y9w1SwARAQABiQRsBBgBCgAgFiEEzIpdwBEsyVG/3JA0NvIk +qroryVEwk8+LI3r/Y9w1SwARAQABwsOsBBgBCgAgFiEEzIpdwBEsyVG/3JA0NvIk QJmRtGwFAlpLCkMCGwICQAkQNvIkQJmRtGzBdCAEGQEKAB0WIQRQi3NrJqpPZyoQ uSxPkdEA6x9ZewUCWksKQwAKCRBPkdEA6x9ZezBRD/9ZTfEmRAgWLRq3oYhNJ7Uy nSfgloQ0v6fzO8ftqHLXq9EeMbkE/FcHZfpgiOhvA3E/khgBrtBi0GtPNdzBIQef @@ -6381,7 +6066,7 @@ fzSHeZdifHKmo6/y03jpx1c/1wWAGdNDt710bDb9Mq7CIPnKMp22HBzEvm+JuNQM 8ugX951YvrSe/0UbQsi42fevoFWkl8h38ZfWaZA+U2RthAYxDMd4+qVE0iDrv6e+ wEQNfKHNM+6RIBgtpSxGhv98j4JxGvarToVFlAIgZ/bb4PD8zMnkW3uvrZdknRiv BRj7Sg== -=lSNM +=sk4V -----END PGP PUBLIC KEY BLOCK----- pub 379CE192D401AB61 @@ -6390,7 +6075,7 @@ uid Bintray (by JFrog) sub 0CFE993CDBE1D0A2 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBFTi8JIBEACcN1ucQ1uCOZ1owTELQV/6i4q7NbYdJ5wf7yPYfEugSo3yfbo3 +xsFNBFTi8JIBEACcN1ucQ1uCOZ1owTELQV/6i4q7NbYdJ5wf7yPYfEugSo3yfbo3 Pw/XEvlnpDZmT155sGNOkteZtZMdcm5XhFbdtquLlrkjAcUGatq5rAt3eLAlvU7u CBCDJg3ZaqpZti5ti2TfiaXHeawTpxaTb3V5tT4NYhY0aJqe0MGoVl2yZyoKMWsL 8XcUiJkUYnpu98BvnzO9ORSnKWHk60YxzZuHh5buMNiV4aI331ogiTxqISzTwEdQ @@ -6401,7 +6086,7 @@ z4vhfFVeQlyPkEycQNcRfHVzK62oF8L5Jj/D8BIGAD+dj3x10Cy+qVK6BTY/F1zv Zn44juAhZMweOt63Pn4n/K0W+uOdrLSmGxJDhoxztabUdIpIMsw44wZ8gnSmPAef IDTCjJO2x9s2YuaZbgstpJldooxGJ+FTe52QXFphti+tkiGOg6Tpj8Xq3+ZEM3L9 Js38SSdys0XBCHYiCv3/4Fk4jspTsCFrDzJ9HqNjsiktxPm9szmUZ72RjwARAQAB -tChCaW50cmF5IChieSBKRnJvZykgPGJpbnRyYXlAYmludHJheS5jb20+uQINBFTi +tChCaW50cmF5IChieSBKRnJvZykgPGJpbnRyYXlAYmludHJheS5jb20+zsFNBFTi 8JIBEACq+dSR6serUWrem1itiw0MslItsFyHuOV0+K8ZUOLRge/arBSfGjk7YZPF zIMVbxXo7LYiciHCydZ9K7HdqCqygC4k2IV+85Ll07ZfraPHa2vfgXshu03+VZcM cp6Jxs+UPlVHV7SE2R3o2w+KvKqzLLRLb6aBREoJCsI60HTWyPjsHiHraJ+XFNl0 @@ -6412,7 +6097,7 @@ tkYPnPNX0ra+jURZbie6tO/C5OWTYjurTSzBDiPxNLcxxUNjrOMzIbcLLhSRQ0DT FLiC56D+5UvPIUY/GiX5O7x4iF1kwSPcoXz1w+xzzCwfFZg9oE5voHAybrGkTFCI b5Oo+WKWDCY56K7yHLIUT4UmiF2Liaz7gesTc5yFSFJhP0WpkVX6FxDuoCryQx0L 38qD+4c445N7aUfVmqbOBBp4ORpJ/w0s8Rb946yQ8TTUB06otovyIz1iZsuj0yU9 -kzZYovrZpKJLeDEY2ThxdU/O3ZkAowEeTjW+KyddTT9rUuggAwARAQABiQIfBBgB +kzZYovrZpKJLeDEY2ThxdU/O3ZkAowEeTjW+KyddTT9rUuggAwARAQABwsFfBBgB AgAJBQJU4vCSAhsMAAoJEDec4ZLUAathzJIQAJkh7/G8uMQ+GJW1SpwAI/JcvhTu 4D5Xk5tlVGYoqWS6ircBAZCz8sDIJJggZHDXeECfVfq2eKt5O/68SgwNpfSwHWpT Dj1Y64HyHvU1oX9Rho96GNFbI02rlSX6Jw3Bzwjy2B+RRQUKb9rmcmHyllZ+j7jT @@ -6425,7 +6110,7 @@ YYM8KLDFLM67gE2UijFCHcTOuyaLKIHiFY+f2rNflUzYhe+0vVbO/ytS2kA2Syj0 w+OwwB/Vj8oEFpSbRB6GgzAJYX/UrCwX0Q27rGifiX4Z+Q+G4KwQcR2pYhUZesMt KyEwZnsd3IC1Qc9dcVXQUJPcqpXhSImuMDO/uOp9JJSxdPxB/gf6ELyVN9IFsU1/ E/XhP4QkRJrZI1F/ -=Jm2n +=uqis -----END PGP PUBLIC KEY BLOCK----- pub 385EF0846E5CF3F3 @@ -6457,10 +6142,12 @@ rkMX1h7CppAwX+yhOO4= -----END PGP PUBLIC KEY BLOCK----- pub 38EE757D69184620 +uid Lasse Collin + sub 5923A9D358ADF744 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBEzEOZIBEACxg/IuXERlDB48JBWmF4NxNUuuup1IhJAJyFGFSKh3OGAO2Ard +xsFNBEzEOZIBEACxg/IuXERlDB48JBWmF4NxNUuuup1IhJAJyFGFSKh3OGAO2Ard sNuRLjANsFXA7m7P5eTFcG+BoHHuAVYmKnI3PPZtHVLnUt4pGItPczQZ2BE1WpcI ayjGTBJeKItX3Npqg9D/odO9WWS1i3FQPVdrLn0YH37/BA66jeMQCRo7g7GLpaNf IrvYGsqTbxCwsmA37rpE7oyU4Yrf74HT091WBsRIoq/MelhbxTDMR8eu/dUGZQVc @@ -6471,97 +6158,135 @@ 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 -=/Guy +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 +pZ0rkw== +=4CTU -----END PGP PUBLIC KEY BLOCK----- pub 3A1959EEF8726006 +uid Eclipse Project for JAF + sub D908A43FB7EC07AC -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBFu07rsBEADYizNlY0FYNZ6q2wx7AmWLw6PHje55uFhYM8Saqtwg/rm1tl78 +xsFNBFu07rsBEADYizNlY0FYNZ6q2wx7AmWLw6PHje55uFhYM8Saqtwg/rm1tl78 j28E/coP2zMFf/ec+zqKsfYi4DMmLZ9ESIngMUOIE7mY0Pp4WN7oYFRtvU0ARWyp lOiq5GM/Em0mtCSDI+i+zpD7MKCQEeV6V9d09r8Ncltf42BQb2x30ajTsGps++tH Z6xxhlPaYsF6OT7SBSt40cjc+rhUuAUo7D4Jt7S7zvi2aeulEr9YD+gkp6+EED2p @@ -6572,42 +6297,67 @@ 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 -=vZg/ +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 +x8rPAFrvagaS2grj0z9tIo3Ki5HXDlWO9Q== +=Azmc -----END PGP PUBLIC KEY BLOCK----- pub 3AD93C3C677A106E @@ -6616,7 +6366,7 @@ uid Carl Mastrangelo sub 9B2A1B698A113AAD -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBFzwo60BEACg1rgL5jUtKkFE5DiwqJwxzJyJDH00TBSN6ZT+nXh1UxgC9q2h +xsFNBFzwo60BEACg1rgL5jUtKkFE5DiwqJwxzJyJDH00TBSN6ZT+nXh1UxgC9q2h olF9V+2+LV1Jcmnc946xzIMiWLG33QB0NKVCdU5jNuLahOcViQQjNfGXwNzYoNCR vK9pnLA7Qe4QA/P4LBgKJEgiOqhKkMFGs0erGZ9prlcUp5Q1gBodyR2y/W3UNneG XvbVxuFrR/hAEX6t14Gxel8BlLQkU24Ln/AIurkSQ//S1SkN2xcPj9EKuXAeKupZ @@ -6627,7 +6377,7 @@ XL5MTO2v+oHQqi9GFG9cJqQhGnJTpKOrZFhWbNmWqnHXJeENg1Rwm4U/a+mFQZNU nTp+9wuXXDHKbhI7og2dTMkU1s64We57dDJ1glKy+Rpza8kCzmCbk/JbAOPK1d6a jalEn1hLlFsE80AB4DTffJj8JL7MEpxtJEPZ54bOMLs6qkPxJRpcs8e2EoPWPxWx ATGI8R01S3wRmIER2TBOqSHGHCsfgBzdiwwQMvbGUTGjIz9oORQkfAObmwARAQAB -tCtDYXJsIE1hc3RyYW5nZWxvIDxjYXJsQGNhcmxtYXN0cmFuZ2Vsby5jb20+uQIN +tCtDYXJsIE1hc3RyYW5nZWxvIDxjYXJsQGNhcmxtYXN0cmFuZ2Vsby5jb20+zsFN BFzwo60BEADPw8ds3/NFfJR9BypshD8k52/yp824WXDQm7EWLisfU9scX/bgRlVD 8g0BdE7y0sZV24wJO/Y2xMezZ6ps0y4bcLf/yegXWTdD103F8sD9DUlT/81cFDm4 rj67+h3gaJMFmudtU7znMw5qlNL8ia7s3k4+MK226RrPvDw0/3tMwX6BFGutXWuB @@ -6638,7 +6388,7 @@ z4r/pnJn10pxKtmnSibWgmXF3lz9r/E+B5zl8KkT1x/acp5I8e3LGPx+hSBol6AI 9g1k43zheYKZHAgzTWKohO7ZmYkRVGAF6tB9bFJZ/0Eo5XMzlqmK4wQEbsWhOTC5 ovvCfXpzrAzBKbpPOPT9o42/dMHqcmsO3p0HeGBzrwz2/fNcTwqmJK/JXeuB2Ggu 2vVZxnRbMHxN+yE7fiV7JLOLFCwXSEA0biJlYrZgzBzUYiVKdSLt9ADKJmhh/EDe -tK3T54zKTAe7z8XbgGAdrt2eJaC/Aq9Ewgxj3U+Jloju/HYmZz1WHwARAQABiQI2 +tK3T54zKTAe7z8XbgGAdrt2eJaC/Aq9Ewgxj3U+Jloju/HYmZz1WHwARAQABwsF2 BBgBCgAgFiEExvfRyATIIfSa87/BOtk8PGd6EG4FAlzwo60CGwwACgkQOtk8PGd6 EG5gtw/+IKvBOTDxuFsjbEtFhcyNoDwh7CzkcqbQ48G3V0i86abjiywoYFSu9fGt JR9MivIEPYn3u8q7nO6ZZk5hrS9Oy98WgAyVuncAPXYNCMUJTBvnBit1yUx0V4bU @@ -6651,43 +6401,7 @@ p5lw6xA2qisMkRdkHQ7qVmkd/BYcx086WIukpVm4PuC0EGpGpCq5GkWtgIYoHe9w 4inPJAvF9sT9dZO9314r1NB4u+URNFoYuHSTJQ7eJaQQzqRbTPBmwVqepWbP8orv X3BfapEBr84/k8BLSjlbawFSidakkeOcHlliaFIB4B6wkEsvMLmVsu6mOIrqPmsP nEq4tzixXZee6daOaBArXoaC1pEN8grIppEyMBaqmVP1GT1+pvY= -=qc4l ------END PGP PUBLIC KEY BLOCK----- - -pub 3C27D97B0C83A85C -uid Alan Malloy - -sub 4BC7B9A81C39EBA0 ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQGNBGEdX1MBDACuRDzoPMh3CyUHQydFo363R6OdXqMZ8mJQMdysIJCXOXZGRwUC -uyPOUfH6uSG24RU2zvD72D2SGAehQKLXLQeN6XCt9PRAszP18dJADm10xgkXJm+G -GJm69bRYP0GIskQI0D2hXoUlSyXFKZa154pkVzmeM40UXo90FrMC/YjH5dLp7uDn -QtZbsASlHiy7lXFX0IoJHSHZFppmHcW2KOmFfKwgE9dpku7CdTdySY9BXiLC/Erb -l2WjwzSDEkQbnq6Jm3/wb/AXxDEu9H2SE6kOxrERqXBfc1ycaEsJMxpLxYpk/kGz -U6YXqXiOla1SYC78/SnSV8Dkj4/hN1/XtFmkmLUn/WgctmPnsE+fMN/ALXrH2OE7 -pUYLTy7jxJ46dChpjIPJ6Tp5z7EbxdsXR9JwLFQP+Fyp/anqLO/uLkZhZGhI3r6t -lvFyZW8zoAuf6UpKL6bIvxld9SDuEqahbU1RcLsK/7Lwh8gFYXvq6k9siV2Fs4K+ -UWyVrn5cdSMErMMAEQEAAbQgQWxhbiBNYWxsb3kgPGFtYWxsb3lAZ29vZ2xlLmNv -bT65AY0EYR1fUwEMANMwR7AK2pVja2QXQpFx7zSNFaniXyMdXOgDKhVuhTe99ed7 -mp+gGJKXgUls/Yh4HIWWOVF4GisMe+XlvvPV+F9EgVNi2wd/efOPlQ3Y4nsp61uB -x9hb/FSYnIqMjGMgf9ehEYnZCD0QERDdyukrg10ZJMyGRS2x4UWWelwcig13gGf1 -Oekz4LL2BLHRaI+75/uOGT9RmgHo3ub+56l4hwdZTa6RcE+zVe2EF0qZKkCeAA2i -+I8xh0u7pho2Of0+HcvuN6kzyKw0mpBxRhJXzX1ucuOrWiYgPh7+AaMCC4wzB7JG -vYVzNdtwgrlEvGUGJqLmJXikwnH6d+McV7ikTQyYGPKIgbI16JHQqGkYXXEvz65U -L1nwgPw+PVyxgnl3Qub3jnhiRfVuX5Oar/Aatbw/452qR1H/dlZAifmlasp39KT0 -yq3LX9HzbLbbLRqz0hoPkVujZ0NtAeM4KsGQGDBPs/cNs45pi45u/AUSfp81b4JZ -fGh8uW3peejnUpXSuwARAQABiQG8BBgBCgAmFiEEb2Vrf2v7I404rPgfPCfZewyD -qFwFAmEdX1MCGwwFCQPCZwAACgkQPCfZewyDqFwcewwAraeFuG7lc0CmC2TNBcbn -G/AIMycqzFP9NZ+MrP4RwSzZQh4/wK+PTz8SfezP0JyPKu8qjVjlzxnnFPrJQZiv -W4kx7R52kYZHAvzYWbCMDzYcNB+kBhmIueVUrlD6qbrNxXzwUOboRqUgsvXX7sfv -bMDZdWYTI9qjvptH5VX/LdSVi6kz7PYIkU1gGXx7hhhXUIPyPtyzMqpnKYXv8rE5 -WrIYi8rrEEt8fDqTYUXl42YslOOG1TuRfCvgmdvONODmYq4P01f5rax+beQOa54n -r+K9RQcy02qhF7JUq7xs2YZ2cinnxzS+xzIklnugJCQTrjDcz19/zykY4Z2ZSzPc -KQ0qRvWeunDQwxc1MLQ2MeTu4GyxYm9Dq4yM+6tK4ZtYfZ1pMvkWfnUbjUeh1fTp -T3EuTos8W3WfXYI8uH1LjCuxtYF8onxhFyiQlxVtcIbNJwzjmgvO4RjqX2VjAVRd -Zm7SPjIW+sWOab+FF35lQTVGS3U/EUoTCTsHpgSY1JMn -=uDN6 +=/qbd -----END PGP PUBLIC KEY BLOCK----- pub 3D002DBC5EA9615F @@ -6696,7 +6410,7 @@ uid Drew Hamilton sub 91FCCDE555C64A9F -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBF42lroBEACWa+RCajazimveyzyVwzq+1Kj8eiJ1XPJXqvIerGOQ6Tx2qeSM +xsFNBF42lroBEACWa+RCajazimveyzyVwzq+1Kj8eiJ1XPJXqvIerGOQ6Tx2qeSM 9AkMcfW7HeN6YW3BR/u2s7xe07D6p6c7UjTmiH1v23ELSk0Ou/BNxiTMdTSly77O 1NMFnqPUpQ6ovlVUBI+XfZvylVXErroL/ZMeC0R/eivJ6y/GgGgdJrQ6HVbKeoUU jN7xI04jAmf5NV4f+oYT7x684a70aTxx9mFuyuP8cWmc5RzYxVdAx+ZJotgvRBuc @@ -6707,7 +6421,7 @@ iYoYirIklTsAlsJ6jxlFa7tQECmr7aQVJ19k9I1biQpAs7/TTBjZM/ea33X1y4vh 7PZadPouksHHXFAik7vjMg5mpDqalpc3dRJwpORjRx5P1tzVnKaPkOON8p5kCDIM xYFfhAhLeIidjIYvaHO1a0Yncph8s0lRrBM57MAfpCknip9KI/8l3wysQy5LCoHM gvDb+p0ZH2U6/5PeaLE1T7sH9EyTbItiGqzGyX0Dwv5WQkZ6ey/QZ6RXowARAQAB -tClEcmV3IEhhbWlsdG9uIDxkcmV3LmhhbWlsdG9uLjBAZ21haWwuY29tPrkCDQRe +tClEcmV3IEhhbWlsdG9uIDxkcmV3LmhhbWlsdG9uLjBAZ21haWwuY29tPs7BTQRe Npa6ARAAvtDEDmOWFeeM7OqYzULWWT6ihpPPuzkxrw/iwQLNBgp5mOG3mCSA/I07 hIYYw7UIqx10arE4Wn0PzHpRq94hwLfjzg7TAaJQjnRqbfLq6M0teQ3xHjBcXTr1 dLro9bGxj7WBkAPnwRlitcrZWk7EM7y/iHSxiRoJTeHYg5dmaVOaVj1X5RdBoHoZ @@ -6718,7 +6432,7 @@ uZSWOf+q6iSkPYiTgqeAWxIKe7u2roKr+kYWyHFZ/BGLeaoyKheCjNjPWwHskBgo VMgf/fXy2t6dZNkVRf3Qlu2Ese+kQM2cxbj+N9IUDbHZ+n2/+t/n5f+4Z/VFBJbX nT7b4Vs5epz3Yy8hq7zUauXRAV5RrLpdW+88RCABdbAm3uRUbPc9Gkpbo86tkAn0 aCQ6JrhsJ5FzpJqG6DBF4Te8dtriM96WTH4nbcpS8GT+/8Hprb171b+rqMb+HIwJ -wdCMJg6Jm+Ln6mxk/0WFyECa22Bp8orj5nTs+EKp3a20t4nT1X8AEQEAAYkCNgQY +wdCMJg6Jm+Ln6mxk/0WFyECa22Bp8orj5nTs+EKp3a20t4nT1X8AEQEAAcLBdgQY AQgAIBYhBAmTnHMka0unREyqRT0ALbxeqWFfBQJeNpa6AhsMAAoJED0ALbxeqWFf Ly8P/2X6h8hYor/dTbi7/0Tn7okXtIQLrEXufGLaOwOpr/LmrceO9XXewvl+i+7M uPPQ7h9h4+ExL6sECdKnfkUgqe32L7P4HtMzr70Z9/HY5Jrh637CX0rrnohvqWdu @@ -6731,7 +6445,7 @@ ikJe/lNnE9JUgmlJLYAsdNk8wNJZ1SIltlsPsM7U1QDALP5sao6adwYKzNyVS05d JrprzzqhM8/Qto4taaOk3Gq2PgId7m5oZWplTEkhW9tCoAOGP6vuP9lz9tZhAI5e Hw61HIsMH6K29geZkmaD1TN5Tra2HgkxjU7umSCf8SyFi52fE+z5HSjEEVaze3bx SN7ABUYQJ4prOXJlUQQrmnhs8zqMdNV4nDRbiKDdyemlwXi2 -=f38L +=Cgcf -----END PGP PUBLIC KEY BLOCK----- pub 3D12CA2AC19F3181 @@ -6740,7 +6454,7 @@ uid Tatu Saloranta (cowtowncoder) sub 575D6C921D84AC76 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBGL4BxIBEAC+lX44fd/zrVQPzdKygarBd/X0bBpGakT++Kfk4UBGl3q+wd2G +xsFNBGL4BxIBEAC+lX44fd/zrVQPzdKygarBd/X0bBpGakT++Kfk4UBGl3q+wd2G R9puB9R377ds8hU7U3To8sHguUZo6DbD9Gb/is/WajSb9g92z+rMow3KbqfCYqWr kaIj27OJgbziFcnMAtvGoFRfaPI/7TOwEw3jT7B87RXeiATX4iL8fzMUmkfZm0Hk qjnepMQeaz3KzMY4DfBcI45kwzl3EIBFIlk428mhBU5iAAANoyPsimfqEPRCUDjx @@ -6752,7 +6466,7 @@ jyqVTgU+yRGq2HB90vJ0D3P1w4xRDuNF8c02futO415Yc/qkyh3/5AjGSoocrlfX cMreJXpQWVsvXn3NsitjsA6XOJpMOgipCDxfvn8SSLl9fWNJf55j7fCkBokF/lIi 81RVQbyjVCOV0OEqHJLP9asPHyAFvUppNWtcvViPxVmb52djnw/x/61WVQARAQAB tDVUYXR1IFNhbG9yYW50YSAoY293dG93bmNvZGVyKSA8dGF0dS5zYWxvcmFudGFA -aWtpLmZpPrkCDQRi+AcSARAAsKXGqznhDeU87UA073pnPg12bloq5h79U8iZozoV +aWtpLmZpPs7BTQRi+AcSARAAsKXGqznhDeU87UA073pnPg12bloq5h79U8iZozoV NIRhjMxJyilOlWZVCIOWEDWJJ1Dnzn/9OaYEJrBIY4yPDQQ9wsrOklUOsDpZAPiq QyrP3V8MibbWBPhBvyDM48GVtg2xedB5Jk9lSv6BYUUn9D2q/nG1UP5jSwFQu7nm VgVV5XXs6lb5N7Q2GGXn/U/EJX/ffS1VxYIjM0Ra8yy3HdihBwF+LHuuRU8SHxWG @@ -6763,7 +6477,7 @@ aG2ZbVG6fAjuu/YNJZPjiVkpsXXZVcm3VwhWgHjikG9MKEDpEdb6NrSR8hphq9tB HmvlF/pHS6I1UMGAqiAnb5yuGKR7oaU+XK85OpaIX2aQTzB3aUexUEGXkBFuRG3B TX6FBMLIG9qpBvoUCC+UO8EWox5Bmht1roWNsRMqB7i0m9tIT+YSNrobcbMFJf/i Do42bQwo8y8+fUPgA5A2WDPjzd3kdFCQ6mCpcuPSk7s9t8y5bjYzcKqPCtMtOVxg -kDMAEQEAAYkCPAQYAQgAJhYhBCgRjAcMsioBdaLo1D0SyirBnzGBBQJi+AcSAhsM +kDMAEQEAAcLBfAQYAQgAJhYhBCgRjAcMsioBdaLo1D0SyirBnzGBBQJi+AcSAhsM BQkJZgGAAAoJED0SyirBnzGBkG0P/28WaiFCKz2vOqFxC6tfRPjhU7wilUM4KIYm ij0uh8dq4Lbz0tmybzvq15QL0QBciPLF+w6tHXnmT9KV3n4nY6X4ys9W4VvFn+0V OkDinNBMpfP2KglWYoJ9Q8yZRda9pq5GWtFUTS44fOj/2NU+2YawIkdDzb/vixID @@ -6776,7 +6490,7 @@ Rq2IMF4rMYomDyOclcAL2E3DZ1NZw/VZOYsk4MdATQRtYSz2mQbZGGqw5lKNCsmH LBaslDFjyxMECWr3v7TuEmEmNcD+KwNyACFNuBjEBWeuJZYwCkAkVy8AyitrTMh8 /CPhk/tPm26c+KI5BJsQg8V34FMtd+trRhXRG2mfPB2cU2t9Il7Tlzi71iGEafIb 96Um/Inf -=ec6I +=Evfn -----END PGP PUBLIC KEY BLOCK----- pub 3F00DB67AE236E2E @@ -6829,7 +6543,7 @@ uid Rob Tompkins sub 3260CB2DEF74135B -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBFhqdSMBEACmveOOsQrTky8b5M+Cq6lbhqRB4+INnfigxr7+EMpswo4AxYuA +xsFNBFhqdSMBEACmveOOsQrTky8b5M+Cq6lbhqRB4+INnfigxr7+EMpswo4AxYuA Op/YG+G7NU5h6EK6Tj2dVfXga90GYFkehtFRZgOUJUGKPU/53upsbnsWS8qjJD8g MvWpHbuhK6WsXGxjqWykAk8D2o2jfJEsUGeJhbG/12BoT87pjsUcZu7DkKilx6/L WoM2/sirH2e4B1FLZvE7NCKpGttZv+vEI9oZmoKgm+ZHt4cSGOPrPtrAtf19irP1 @@ -6840,7 +6554,7 @@ ymZe5QZj9T5Nvy8tMkF4LwxA+2alWfvdHWRISuEO6jNwOuxHMtbprbD9KxY9Smd6 YcRKKsLmKR8J6a5V7pELFTVGSLhSL2H+Z2j14fkswGE5vkxAQpGCfxQh7rbvrhw2 lpx9OmvljnWFM7U26nfUG5tCp+ieE6pT76hcPZ5MPaqWl18Rk5dVJQhNZ3Gd52In ai/y0v96pn8XZBRuNFULMb2PFG88hvU2M49Y8Rdi2VW/IfN3hIh2e4FT2wARAQAB -tCJSb2IgVG9tcGtpbnMgPGNodG9tcGtpQGFwYWNoZS5vcmc+uQINBFhqdSMBEACz +tCJSb2IgVG9tcGtpbnMgPGNodG9tcGtpQGFwYWNoZS5vcmc+zsFNBFhqdSMBEACz wFoQH1MJLn3UYF+viqE8yw/CESTkU1aLoI5sXBSA4wIAGC5CmI4kCvb/1xJEsIqt EJkNJSna3GgR8ov5NIJmx+MqqhemDKDNJS0IKvFkesNk/khdt0zXF7wK9O6zY3XE 6lh/usB8/34mHaR0WkU5Td4kCgEhFJQIeOfPKMaG83lrxiXettRBIfmhldX+1LIR @@ -6851,7 +6565,7 @@ HaSIU3fuwItcdIHoG1Xf6RXJHW9Wgw/MSZYJhDclVwfznHI2D5HFS+hRLKbAF1G1 IVauXZBbXbOhcPyIAPwuTFdULhnPieu5ZGFetRfD9+t95rbupKMt54Lvx4cG8R27 LvJL86X9KrhPm4WdsDL9lKs8riEUmTliZjmbTjZD9/trIcxPQKHtfwtgoQnFm3ae Ma7HO4lUo8KgEQiHqFbQQ4WaQruium13SlXTRgGGZuqdEtWEMdTEIy+3c1STPR0C -koruBxlPCe/COf8XTn2h3EoyRWnNeNqudErVq34POwARAQABiQIfBBgBAgAJBQJY +koruBxlPCe/COf8XTn2h3EoyRWnNeNqudErVq34POwARAQABwsFfBBgBAgAJBQJY anUjAhsMAAoJED+q0s1ey7MUKSsP/2MyLOHhyX8Zsazzgbkk9jdOnV9f4Cvd/uQK 78c38R4/tfiJWtIbJgRR5v18ZbO742AFwcY4H5C9vwmR8JbU2lo+QD8+vZZFiu2V LoRrnyrTDaxfRo7+UsArQl7dPQw2EazhDaguybMVYY0JkrLu1C4OkmDYSdF3vjH1 @@ -6864,35 +6578,7 @@ qS94tanYWmDk/RGd3Nqr0SO86QAtKey3SuFsKhu6By1CEbKpNlg5kGxDFQv0q1ze vVYv6aokYDOFe449zf/uYkxS/qivfqFo+2QwdrViPNrDaSQXkPPT7ERDhiw/Kr5+ BDseGWS/dXJ+jdSvFWwkr7BGtnAV8Emw/tCUX7kb6WvAguCgxZG1NzW9unRL1j8/ o6QtwZ1S -=4qFv ------END PGP PUBLIC KEY BLOCK----- - -pub 40A3C4432BD7308C -uid Michael Schierl (Maven Project Release Key) - -sub C0B9C2CC3DD97C16 ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQENBE5zrtcBCADFfU0ugIGUCM44fqPJKrsB3TaDu5EpauvFfYqUfyookzMHSKtB -4YqBSKzBEiZ1rFB/KCn7XJTh5epoCau4DsG4U0XZjsx+esDR4ZtL42LEzeMTuluV -9eybw5EvW9GnvUrSOq4U1xFdQgCmBcRBPpLrP4hWUXgNlRTEpgHemnDmZIV7Jcyx -KZYQFoddPbUbIOutoMecl5flaa5uHe2kHp+R+PJ8DlQIKa7qsxsAwZhuamfApX8M -NYQmY/M473IVH3ByD8bQ7uc9HM/0q3f32KeEVHEYTKLs4/wTY5mZTDxndQeMpjF+ -8+LHbr4n0zDJERJnrOzgOoCW/bFa8YQv4ErhABEBAAG0TE1pY2hhZWwgU2NoaWVy -bCAoTWF2ZW4gUHJvamVjdCBSZWxlYXNlIEtleSkgPHNjaGllcmxtQHVzZXJzLnNv -dXJjZWZvcmdlLm5ldD65AQ0ETnOu1wEIAKOf1gsFUdUylLyP6hzc4RAgoFr2eHDo -a3w49fdcBflq84QSIjGkrcLggLvAP4eqJnaUhJh+8a4CBRg4FrW1bs/nhdC9rbzF -SXkbr3oG0RafTcTtGuP2JzoVXifY5OfNnia2fHIptex2hJofoh83yCiU36MaFgQN -lorK7/c+K733aEk4KBzMfAU3JiKrKsSTE92Vd1yh4pQ9gMANAPzPqMfcg9XiIKos -8d1XDQtndQSWccBNs5EZWMct++XPYOdZI4bwsmj+ayuJPbJOYG1T0HEA9x0vBwSC -fGEoyq6+ZqlCrxcAiuEqpYMUlPz3ZONUfC/C29Zb/0Q4AuZQPug2fvkAEQEAAYkB -HwQYAQIACQUCTnOu1wIbDAAKCRBAo8RDK9cwjNsdCAC12L1h5yiApA8v1nJ2YEGt -CHciX9B4J9iGnOHeU6XTquPmCgzANd65yLaeA90E//CikAtlHUgiz7+fGyrGbXUD -zS9yu97YP6L8Gfha8UylBr0Hm1bIFuNjG2C+SUU9DPfdeqd+Bh0ygYwnB6DCufrb -B9R0ElvqUDttyiJq9m1k9gCSELKMLjV/1F1F1XA+2k8PjcZKDgAXrLUpu/boCcr+ -8ozuTBTyxcL21w1nW7VignaRRt9DfvHlsli+5W/+LpSuq4XcaAgcX8rikT9YEsJo -UOXnXPP7mF30ChAY5F7mJ9BTe9RZZmnjA2cUdtHLvchd4fiFbu191pbeIk/BSf10 -=hyVS +=tuwh -----END PGP PUBLIC KEY BLOCK----- pub 429C8816DEA04CDB @@ -6901,7 +6587,7 @@ uid Taro L. Saito sub 8A57131A07E0911E -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBGB980QBEADLBOfY981RbUf7zI9AoXcxGignXkYbeSvxIMML9vAbnhmuHwa6 +xsFNBGB980QBEADLBOfY981RbUf7zI9AoXcxGignXkYbeSvxIMML9vAbnhmuHwa6 h+81ZTY2XK7Rz211y129YidPykkiLX9mY+OWvJsj7dTyVTcIm6MU5ETDvovfmKWg 5sJRrANAnkZ73UVJIKTQC9HonBIpiPLmDEBfReHkNsXtYqS4fyZO5tkjy9ejaw2p 5qpOS9WixIvZT43OfzH+8O4ecmDrOZ20azogcWqLCQ/ZDbfnyHFH+BvA8bn4bS6y @@ -6912,7 +6598,7 @@ b2bhgjqccIk2gASrjmTiryF7gUiMTgZVU5PF9f0+p1pGqC4GIjJOf/JGhhGEyzVt BNvJWUgImqWbSFOKWfvnmdjZyULAVouxrrxF1vPN2U7KFurmSQV6tq/1Uf/qccR9 /uhEI30ypv4OrVi+8WoVsEamag/AlnRLFCEjdfB0oUy7V/lPqMxRoxmhiTX+cCjM QkFfcspJt830vwct0pi4rtYt9pk1Roh9tOKh2UKRDGL5DE3rZbJYs+6TAQARAQAB -tB5UYXJvIEwuIFNhaXRvIDxsZW9AeGVyaWFsLm9yZz65Ag0EYH3zRAEQAN+bpqWu +tB5UYXJvIEwuIFNhaXRvIDxsZW9AeGVyaWFsLm9yZz7OwU0EYH3zRAEQAN+bpqWu uIuOsMvAGVAMhrIT9ILKJ5mV8Kx1wza1ycUXx3OccykOKaR7s2Znthim5KLiKbr3 bQPeiYBFUEcT4koBwhyEJE9FMfRm9tXHtvN2I/O1z/qy71gno1slLzUyTlzakB3D p7Sp3pnD3xpXKN9x3wPLja64F9CsdK5hilfLySf5ZnvOi7t3QJWyS96XwaGo+yFj @@ -6923,7 +6609,7 @@ xWkn1mezfmj6katVrTYJRAUR1kWsfV8XzgyCXJ1GAclCwW6o5S3lxCBGlcwCG79p 9miYeeseaYbkRoHCM67TFc8wSigggJR8I+Wqaidck0g+ballenuB4n3NXtvzeJaQ krhioizhQzvxPWRvYRQeC4BH55LuRzxnTArGfSf/V7uVPn+GWntlHvCf+qOvdIBH pGN8h69qQPW0rXOPjAmA9aZOetp7LLOs4KrvPi00aAZlK9KspZyRviHfmJISzqZw -ARVGvMHpr74cEaVMI5BD+Kz/S5QWvjI/lHuhABEBAAGJAjYEGAEIACAWIQRWtQXc +ARVGvMHpr74cEaVMI5BD+Kz/S5QWvjI/lHuhABEBAAHCwXYEGAEIACAWIQRWtQXc iinGkTikMLlCnIgW3qBM2wUCYH3zRAIbDAAKCRBCnIgW3qBM21ZfD/sHaK1wbxqA sDtL6VapwpwJOzGKGFYjevXeXIM16eluyNlq9hBvumLkXSHcci9yzHWjREKU+nLI GQiwfmjEB6ZWT0k6W0yQ4pUiJhsdjaukdj4KGQv0qIjl1YYjkYw5PvSNDR9mH/DO @@ -6936,7 +6622,7 @@ sgCWZUsdoarkFJvzWmybtRu0wZKmpGQ46aIV79pilPvolzqgkOSsGWf2TsIvuv4M lMobjCzLP67zO1IsTByHv4cQLhwZmZJV3dIdPTkJ1Kmg2rqrgXn+186ep1tbbWvA WAXb+JKwWDWNsTVMCOBDU1Z8680C7VGh4VOF+73p1Br4tWpR0AjWsL3CABlRbEKI cHTbyQzX3/0LQiL3A4W64yIUApDoir2W+A== -=sGos +=iKk4 -----END PGP PUBLIC KEY BLOCK----- pub 43203BE58F49479D @@ -6945,7 +6631,7 @@ uid Viktor Klang sub 1364C5E2DF3E99C5 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBF1Vn08BEADgfOupXhJxyb3t1kzDNa595spJptjF5ViyXuEJtlMQlmobPP9L +xsFNBF1Vn08BEADgfOupXhJxyb3t1kzDNa595spJptjF5ViyXuEJtlMQlmobPP9L 2gZH83gNe7Ro1TsLesgWTtin3hGANSKITdi/wVH4ET6lPInv1k/8hXe0zlF11Zmi pBxZBhFl/ow2g+V604RY581hQybIxFhjnlMoEhooIZl9x/GdleQBsrnPdKnllmO2 jxU2CKjjnAuaQusVXYBMQ2kCav1TrgZSr/5Tml1xe88p7K2zl1Ihi0okSJJ8CyR+ @@ -6956,7 +6642,7 @@ LycLJ3N4dBR1VYPRMWTrbH8RqX7RpqOaCVm9oKxWtIgDsRW+nNg7K7zMsaCC+pPt U31ju/eKRzHVw/2CpcrZqbbQlREGRPfPv3zS5vb/rAEz+QRAKcq6iLKvR3c/hi5T KZg2I4ZX8Mw0aoRygku7F8gpI+WEmvHgd5wOeI8mlGGAoEwSfgQq9tn5EoxpLtzD 8eC5NpEiYpUNNMVi5uhYdI9mYdp4WfChdsc6IkPvM3fpt/eHofSqci1rFQARAQAB -tCVWaWt0b3IgS2xhbmcgPHZpa3Rvci5rbGFuZ0BnbWFpbC5jb20+uQINBF1Vn08B +tCVWaWt0b3IgS2xhbmcgPHZpa3Rvci5rbGFuZ0BnbWFpbC5jb20+zsFNBF1Vn08B EADFtEGfSbLZTO4iKKrg2NSDmnAq9gGjtLnQ88jpzMYR61B0qSSuat8jUBfK2JEu j8VzEjHkYWkwCGZrX0Aq19ZtZFExohAw1btkiWtHj8JyCsgtLpkN+eNZH555dtKO qzkPRqsrVxtmrB5VsH74nGUmsmTG7uN7eCHbo+xWXvn7zgkiMWKCz89Ze4vc4kR0 @@ -6967,7 +6653,7 @@ el73sNLNIbmvz8PuD+S1uQhAgZ3nagh5uajYF+Mh3TsE/+ZL0ChQtlkBUIPyMEGq E6YyNv4QmpdiMXeHIXwSLl/6Rre/ynK1WzDi2w2UylEmdAb4JeqFkz93UcDmOL4q qs5WzJisKEubCzRS3sZ8HRESkc1iUkcN6ez3BtfqAeO+9AqZL1NM5r4xW13ZRP6+ JICdH6eqT2iRQoGsbnGWCnjp9Tq6xyYDws7p3WszrOKJ5vBoJ7WY7jut5eV+Qxt7 -phazndaslmF2vGVc3tQs8cfUhyRgVHQmJweNpwiqAlQMvQARAQABiQI2BBgBCAAg +phazndaslmF2vGVc3tQs8cfUhyRgVHQmJweNpwiqAlQMvQARAQABwsF2BBgBCAAg FiEE6Dqru5XKN0MeIEIgQyA75Y9JR50FAl1Vn08CGwwACgkQQyA75Y9JR50HLg// SW/tgPt0wlI8sJGYtOwOTn5O17DT+K6h1g0qAtbxUbkRGM8WL0zf3EwUnNQMWiIZ +u5KoUwmeurh4P5vGXz7rOTVUV4CJBaarllG8eCR/MzD53br9Eh5sxqjK2f5Pdfq @@ -6980,22 +6666,17 @@ KV0hLdj161GJiy7L8cfLG3TUcKFvFp8uZcktpF7hhm+z1LAuQUY7iqBZZh8F1kJW FyvzRrGANIX1EyEvSOEnIq1qxw+s4n/WPtW7i04xDM61UPws1Fvg9N6T7/S1Dadq 8niGZWrUwzMu4WDyYByrSMbTkWfR8e2tXjS2U85WP1Rh6y2iKT2RqAaIZzoCcsr8 2t/gxs0aau4lXnONM9m3G0fb34pfEnEO2WVsONrQaOI= -=JZti +=gEPU -----END PGP PUBLIC KEY BLOCK----- pub 436902AF59EDF60E -uid Sebastian Sampaoli - sub D94994D14B55169B -----BEGIN PGP PUBLIC KEY BLOCK----- -mDMEY4fp+xYJKwYBBAHaRw8BAQdArb04PVwQKvEhtUEmEu7/aASZivOWgEkZBqX0 -Tovwvq+0J1NlYmFzdGlhbiBTYW1wYW9saSA8c3NhbXBhb2xpQGVxdW8uZGV2Prg4 -BGOH6fsSCisGAQQBl1UBBQEBB0CSPWzZfBjKWyPW+D6RDRLFz5xlO9/30yGD/VhA -EPXybAMBCAeIfQQYFgoAJhYhBB0sfvitoPeUtYx8Y0NpAq9Z7fYOBQJjh+n7AhsM -BQkDwmcAAAoJEENpAq9Z7fYOTMMBAKfZb2ahnfGNBt8Hrbu1j99580a2IaFQddAk -xXZy2unHAPYyfxDLPkbTR7Mm4k8Cva8PCcXotDow4bDLm9rhwVkJ -=Hgs4 +xjMEY4fp+xYJKwYBBAHaRw8BAQdArb04PVwQKvEhtUEmEu7/aASZivOWgEkZBqX0 +Tovwvq/OOARjh+n7EgorBgEEAZdVAQUBAQdAkj1s2XwYylsj1vg+kQ0Sxc+cZTvf +99Mhg/1YQBD18mwDAQgH +=dZKk -----END PGP PUBLIC KEY BLOCK----- pub 453A03A250A2F726 @@ -7004,7 +6685,7 @@ uid Giorgio Antonioli (GPG key added manually) - -sub 8C8D68AF389810C4 ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQGNBGQSS3oBDACzF8yjumbMujh5LRH4c+AaUkaVfMv/tiSCWXANtlJrU+XRPeKw -Sm/jmT3g/W1cTbbTOt9I7329jrqbISHYSzmG4Q5f+KlHl2Mine6mUl6ipuIKmwhk -KfePwNRLa9KUwxSPzLa0N8mB3PZjQ+FQ22IQk+BGwWsFFClSrP2nuXVi0VPctBWs -jh5WUFu2dK2P0ZWJdb53ZJn53EVssvuQfanUqrxkEgvFc9yyIy4HKaqzHd8Etze5 -2NSt8LNUpdkPU4Agla4rhvhXIYQ8lL1Mhg3DAkmC7XGLuYxZq29esu3KYz+NfNrz -4z1E5jxm17BQ3x8aP06TSpeTFC6GiBRzMz9l4ycUohvb+5fLZJVBYIHY7xBhfU/P -2q6ipQPMo+t+bCIzMkQIeinsXq0LV8R7uODKUjy9IVg/ssqhcUovf0M505Pfaj30 -/9SZZ1vtNf3QUTbsHtINTl9bB87txqEp9tQDSFmU/cFynTeCK/VAvfrQyTUmFI7l -FdmRyVM6RF2chVEAEQEAAbQkRGF2ZSBCcm9zaXVzIDxtZWJpZ2ZhdGd1eUBnbWFp -bC5jb20+uQGNBGQSS3oBDADpK2KWHLVpVXJjkMnqr+TSUDW8VnEkdA2feLtyZZ+m -AoLto7SU/WpIpraWTvmBSwJWZITnKaOVQbNeVVcbv+HE3KkLwtFVeV8cjK2sQAMA -EQT7X+CtBegj6jIUYLQEbFoACnrfQUif0Rd1TU4NgqCLQfoKGq1OMUhfePteqVp4 -uv4dB7YUyntdkiCJgMFO6q8z/m35FlDSSaWdQew1d0WxTZxpO60WfC1li9Sx+h2+ -Ve8Euq8VKM4IyMp9co/oUw8SVnwb1PxUd6Xiz1s38W5F7McqSf3Et8ZasFVWLOZN -RFw0U+5pACExRJX2hiNNBYA9n3CHmtxUXWfuDPmFpeRdPno0DOp1s+Po3TwGcfg9 -EEqMEL19xOIq7Vgcv+naiSNNC5rOJc4qINEbf/H6sPK1WMSLKipWZ6BOf8ECMWex -zaWufsCHuZV3Snm8hEfqiEKUharFfdkdgmlkBF+OH6+HTCnaMlwuILfFSQCPkRUd -W9cEWGqft9AkDDoNP4smmGUAEQEAAYkBvAQYAQoAJhYhBLCHoOuEFlY6/mTOukYE -CRwBwwhqBQJkEkt6AhsMBQkDwmcAAAoJEEYECRwBwwhqWZsMAI32IIZp6pc8Bjk0 -UR9OYOSoTz5Ezmh9SlpO3LOLlb7OUUOuXt5ygzDGE5dChAA1V9tOTLyU8+qfXHOd -cJSJX7oYTIpFDYi4vTQFh9Uo5iXwHXFmuhhUMFpKJNaynhmMATs6l8O6Xt5W0OiJ -D4j5XqjDOVf/NNPS3gro4EKz/Qh/FuVs1n4iT38xJBE0CZhwz8X8JDWdT0eAvZBJ -gAGSZh4AE5KzKj0jQwoiACA6qeOCzJ/sfl0fojDJ4PehxJFfRs2hpTOp/AjjF78t -EGqzkcDrDM8gGCstIVeJDhB1yOvA63ExAkkFR14we0JZliFYHROJmo4GR7wKebqM -3UI989rk+O6bgIk+yEfFGLH3Au3tNc8eLNU0qspE2H1enmb6hj6NiTEoE+7OKrzL -vzqZL9WH1qfOB26bczhzqYBdpE3HRRqvOaFo2o7Rm9biGIJ/QqTk9C0xcI1/5BNv -2X76kgI6+2mxiKKvZiERRfYIye0c4h8c+SrfWHSEEXZxaPtTwA== -=tT4f +=kX1b -----END PGP PUBLIC KEY BLOCK----- pub 479D601F3A7B5C1A @@ -7085,51 +6730,54 @@ uid AJ Alt sub 868FF6CCEF26A83C -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBF5CDMYBCADC1/aWU6ZbGZEphRbmjUPNfqh3N5goSnDCou97mmQ9Uq8iBuKS +xsBNBF5CDMYBCADC1/aWU6ZbGZEphRbmjUPNfqh3N5goSnDCou97mmQ9Uq8iBuKS UXJnGSOHudXK56f+Drx5lGZdLAzveZdqaqb1o3yLFO3PJxwj3Ulhab3O3uTG2eR0 2Xo7GKjRW13kEfphJrfVIaQq/TiyIG8IQ1dbm9Vuzc5NLDIeC4jxYD2S3hUqCLGQ BiZAEH9un2cPax+hiT+9MGzdfQwdVrSQ9aEA9mtMhEGsk80XtxXJnd+hw2va6l5s lSErmH5nMtyKh/n9uo/ap1CfPl98n5VUI8dDtUfWVrqRrkyHgdX+MII0t0nABV5X rJLneg4dVy5Yw/+FVbLWB1Ta21reyytcIYQXABEBAAG0J0FKIEFsdCA8YWphbHRA -dXNlcnMubm9yZXBseS5naXRodWIuY29tPrkBDQReQgzGAQgA1oQHEM6wP40xPfpa +dXNlcnMubm9yZXBseS5naXRodWIuY29tPs7ATQReQgzGAQgA1oQHEM6wP40xPfpa YBBRAWVoEj/CbAV6BooApSqQkV0cocM9wK905az2FmlKn4WTZyNwiA2eHjHlevsI jKuHJWhSDVhulcKDi0cD6wTcjctcDWm7M3tvaICbieZQXPH7lju5Ct80kBo5ojdJ oXGD72kVhSuiF8vOrAOiLOXP8+bpCpY4+LZ4qt3XjSnrkZq+h/vcy9crwuzuFlSL wMRltOvfirrK/CSQZZtqG2PbT30CWFQ61DLo4DkXeNG1fKpnOaDAMaCedt+pNCAQ 1Vdzy1vT9b85LtOH/CmhumjM3S6x/VWwWZVBXi2xVLFCkm3LlWioSvVs6Na0Vvaq -0WDsbwARAQABiQE2BBgBCAAgFiEEA8EjA4wgqunihshXR51gHzp7XBoFAl5CDMYC +0WDsbwARAQABwsB2BBgBCAAgFiEEA8EjA4wgqunihshXR51gHzp7XBoFAl5CDMYC GwwACgkQR51gHzp7XBpoYQgAjnYuxyXaFSbCc2EFWDrBA8+OnlbSgJ3etaIOoLQH +Czv6+wLYc9snZDBm+IvbzEi3tXfi1TKcRI5ii9wDkti0KcVFrR2tpuXDLWYIF92 cSC7VyBiyT/aZpm0zX8qP8tjRZvy7mewbnoit1R6ea5UifSLvO0bHqNoswfgv90s rnuUYMY8tv1sSo4j0f0zre/k4QT8sCTeMDsLsviMIvy1Wls1IPRo1SW1euGGGvCo bxgke8Dw5QgumudwPqehOZVOkIbuddgcur55ZFFeitMOqdRoXkrGod9v6hYY1Jz8 W/Y2tzZmWsedFIc4ahuAeZG6cH6Ac8prHrQEz6lSbZ0flg== -=td3S +=kmhn -----END PGP PUBLIC KEY BLOCK----- pub 47B25FE8A3702A09 +uid Don Corley + sub 9FF026BD8292D6AD -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBEtjCpwBCADQHyrvtDB65xrmji7m37r3nyJwgSQbs5quzjAKl2H0xfpkIhmT +xsBNBEtjCpwBCADQHyrvtDB65xrmji7m37r3nyJwgSQbs5quzjAKl2H0xfpkIhmT IZESNqTMquwlz2wBlLZ4i80ydsDO3awm8nwhs9Q84pYFNYcfeQa+H3Y/uRMzaSiL obk6r/2aVj7DVhCVpZZFv+m2450G+IK4V7+OH1RbMS0pxpQjRZMqIwU7SWmYVaTJ sFinqzNy5f7INeTT6LC4UoRcrBFivIsum/WFJzg8CCxnmpsfmuK8rt9b96BgnoJQ na6UAdAIDlwm1YaUtHSzvFW872TaZabpMPFzo8/bQkVVBkLet7pdo1EW37K/EJ3o -HJsBH2gyEgB0ru1QxptX5WIvXa6YN8LyxLv/ABEBAAG5AQ0ES2MKnAEIANGdQGQm -u9O9vlo+8zBOgl10PA5qLVrJmHxYsW/r4brnU63KrvcsGkCg/qU2e2Iic/Cvu+P3 -+3DMbHwN0+aAx+qz4fBbZS8IBTyn2l5giY5sM2YNaOIrtBUsKHHyx60auzbA9Oc6 -XnJpfJaQXI4xv7tzowDTk1rWVoAUj7PSEzvQ4CuG3rT+6QBdxYZIPLlgsU08711S -asLBkwzR5yTp0gywLDfvSAfYkuNNIlPdfjtg/08UeVTJcxVcCMNDCY6Mk/rP6X7R -Ti9+vkCwwCHHBEDLODCAltNQIbUdXvdiA7mrVu9+GXSEgAhXHArp0xLYunj39thK -iZfJEJmQBW1nbdcAEQEAAYkBHwQYAQIACQUCS2MKnAIbDAAKCRBHsl/oo3AqCSq9 -B/44RE8nzdfDTz9fMVTvO+8jQ7ZGiujxs7TpPwxO/sHEP70t9MZVLxolYyddlkof -zr6QBLAaDBf5z2S6HfNum73DVM1+axVe9TpJyBzOjS9+vP7/Cb9tmnpT6XCmBUeM -nLmTs3IXZ2++dO5zhahGgiUOy+Oz/wRY4UEcGhrWy/UGJ/py8wtHVkjwYpc2mpDt -r77VTvBTio/jUMvT6KEvgjn2KRXrC5dKcQEPP/VItuqCJY4YsM8gwPTkZtkbD4N5 -WgNOZy3T8lsD+5/KpSgf8yqyecj3KmWkel6n0B2CaKEWLqf99nEiaD6Pn0rtwkqw -Wj4dPdQvYSg/m1N4Hmkk7fqr -=IvXI +HJsBH2gyEgB0ru1QxptX5WIvXa6YN8LyxLv/ABEBAAG0HkRvbiBDb3JsZXkgPGRv +bkBkb25hbmRhbm4uY29tPs7ATQRLYwqcAQgA0Z1AZCa7072+Wj7zME6CXXQ8Dmot +WsmYfFixb+vhuudTrcqu9ywaQKD+pTZ7YiJz8K+74/f7cMxsfA3T5oDH6rPh8Ftl +LwgFPKfaXmCJjmwzZg1o4iu0FSwocfLHrRq7NsD05zpecml8lpBcjjG/u3OjANOT +WtZWgBSPs9ITO9DgK4betP7pAF3Fhkg8uWCxTTzvXVJqwsGTDNHnJOnSDLAsN+9I +B9iS400iU91+O2D/TxR5VMlzFVwIw0MJjoyT+s/pftFOL36+QLDAIccEQMs4MICW +01AhtR1e92IDuatW734ZdISACFccCunTEti6ePf22EqJl8kQmZAFbWdt1wARAQAB +wsBfBBgBAgAJBQJLYwqcAhsMAAoJEEeyX+ijcCoJKr0H/jhETyfN18NPP18xVO87 +7yNDtkaK6PGztOk/DE7+wcQ/vS30xlUvGiVjJ12WSh/OvpAEsBoMF/nPZLod826b +vcNUzX5rFV71OknIHM6NL368/v8Jv22aelPpcKYFR4ycuZOzchdnb7507nOFqEaC +JQ7L47P/BFjhQRwaGtbL9QYn+nLzC0dWSPBilzaakO2vvtVO8FOKj+NQy9PooS+C +OfYpFesLl0pxAQ8/9Ui26oIljhiwzyDA9ORm2RsPg3laA05nLdPyWwP7n8qlKB/z +KrJ5yPcqZaR6XqfQHYJooRYup/32cSJoPo+fSu3CSrBaPh091C9hKD+bU3geaSTt ++qs= +=91mg -----END PGP PUBLIC KEY BLOCK----- pub 4B1E11D5A4B91E89 @@ -7138,7 +6786,7 @@ uid Adam Cozzette sub 726F4E5C34CFD750 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGNBF8QwXwBDADKNLAHhjWUqnLYiO+ws3Hy1du6tMvkR3nfsnIDqpCvSjb+3/rI +xsDNBF8QwXwBDADKNLAHhjWUqnLYiO+ws3Hy1du6tMvkR3nfsnIDqpCvSjb+3/rI OHSyq8TbaGLLuHOM4K/KvrKgjhTbXQxvx1WR5IpoylcINzI959yAbaywBj6gVQB3 JX1xeZqiep8ZOD5V8YfwFOF5pOidVhabwdkC3xw03ZG9N0izgx4gyou1u8ovpa/T clEvZh3OnmT8FU+NtwdCDBHhQ6CpYqUzslw3Lcr7gNWJrecdqH4aZdVetGPwJXqU @@ -7147,7 +6795,7 @@ kEwwhlKsym2RWVMm69cdk9wOfdLP/gHvqWqw9+eh2cQ8d4p9dqMdehkZ/KMbzeyi hM11wMNTz+QEAIG9xzYe/tGgoIK8Nn8Ts3jSNNQaY40tJJRzheWZrnUXrpFwAh7W TDUyHOS2QFCoSLZ//n1YTT1qhLeXLTkX9KpwPZWYl/qJOJhp1P4XfQLEAtfiCVhy HZA8CJDH1uJPuq0AEQEAAbQkQWRhbSBDb3p6ZXR0ZSA8YWNvenpldHRlQGdvb2ds -ZS5jb20+uQGNBF8QwXwBDADkcS7lqcf5rVllBe2TN4ICFhmIw9AimWRN+FQ84DKQ +ZS5jb20+zsDNBF8QwXwBDADkcS7lqcf5rVllBe2TN4ICFhmIw9AimWRN+FQ84DKQ mXleF2vkE+13g4YMt2EK5Kz7KWYMzX/EjJPaNCz/YjPStxs1YoLK79AxE0qj7zN0 KLD43SC5SkC+9neTLuCYR/gkZY0DfF4DgMfNC0pA0jI4Han7yiP945u2UojPmsXW UQBPdIRJ8XtVizGI0SGIV9HWICL3XEAfOqLdvziyaX2o53SkhY4eB/u1vaJxOql3 @@ -7155,7 +6803,7 @@ uJnOFXvvb27sQRntf/7CLc0XJ4Kfl0kOZSEu5jj5E+BGyIRdZHfZuVK/+ILrOZku XKHvcP+jLS9nzjo8HV/AYxZYmRFMR2sf5Kz7ADkHqIA2qqSW0y+dUqp9f+f5KLna RkppZ23DUJuiIO5Ogn8v4XNru1lwwtQDe//TUVO/kUCRBiSxpTcBwFIkMPUP4fuB H6xFyjCNFR7BQxvtxxKbuW5YcFcOxdV8WkQ4ncoZEVJ4CKjI2d0qGM/F+frmXAfT -rlkixP/ThJbyDL49bO7GkgUAEQEAAYkBvAQYAQoAJhYhBPGlHgUfUn4MjiTVTUse +rlkixP/ThJbyDL49bO7GkgUAEQEAAcLA/AQYAQoAJhYhBPGlHgUfUn4MjiTVTUse EdWkuR6JBQJfEMF8AhsMBQkDwmcAAAoJEEseEdWkuR6Jf1IL/jS/by4WkRkfEgAC FSVi4sLsb45MjXMsQir62TZ7QOTAIVA2FiUio8Y2hHNMNcs8icpzlMGWZb8vtPKw zFfCqhQuJmHrPHhTwISn3r2FGJ2nvUzu1uqMAHdVENPWQd94vBxL/9ZC2S8I6df3 @@ -7165,7 +6813,7 @@ vxPIjU55QHlf3pE2bELntMR5siFvCKL3wMHorzcw1fJsSeJRTt7tIqFd58klu4IZ TkXNOSowlAbFwVXHh3dI2+Rbf8KgjeZo9gu2PDSe1JnLc9FvGsFaHHDD/y0puIKW VPqpelEi+SOEo9tvgUEUUDwigvpiT7WzKit5B0Icbg+moRvY6a0FZPSvsZZx8V2J AGg2/CyrKszDpsR8R04jHL/ZAxrodA4Awc3BTpNxQDPfdRPc8w== -=SIQO +=Amzi -----END PGP PUBLIC KEY BLOCK----- pub 4D176DC503FB4267 @@ -7174,31 +6822,29 @@ uid Colin White sub 5686B45C142551D3 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBF1EtnUBCAChtyYd/4eMAxTz5DVmO+8QOrTA1cf9bprQhtXD5pVbw8/IGKN+ +xsBNBF1EtnUBCAChtyYd/4eMAxTz5DVmO+8QOrTA1cf9bprQhtXD5pVbw8/IGKN+ EqXmvt7AGy+4O633g7ec5iyirwCfEP+4YDv8k1LOvY9C5+tOwfK+FxAPRVc1AAB5 q23x4yMI7aDdvN52/jqpREeBBWPcrnEIET68RApayALenjUP6Kx5K0ge9aU8uaSB HsVpHSr05L1nKuuqh0LDNXIYDLCpo0LnwPNfLrJ2xT6gNTwHBY5mncDy4m01rdxD 3to/s2Uu/9Xkfz3+BJKRD2kr5txiqoW69H/qsg7u8tTOr9FhB1T21pjFZsdpzbOq cKd7UyD0RpyQYHmTeUIhKSI0Su7pKT+RTL9BABEBAAG0IUNvbGluIFdoaXRlIDxj -b2xpbkBjb2xpbndoaXRlLm1lPrkBDQRdRLZ1AQgAxOP3klOByUo1Kyl1O6rZqj9e +b2xpbkBjb2xpbndoaXRlLm1lPs7ATQRdRLZ1AQgAxOP3klOByUo1Kyl1O6rZqj9e yts/oXtuDTISfcRkZyg6fmkhT4kpd4xLSP3xHvRwJugybyTedDHzXXCOSjl3EFfU GaKJuMqSKs5YjQOWk8S9BegAPeiq6PGV6gbHZQ3Xqy+XE+TLy5N96zu7th/YJraE NpS79sj//mJQE2d49YrxhZwtMj64X0B8/mDmED+D2cPXAoLxNh//LaV26gpOC9yV YTXrCq7ODPE5LyoljhBmPZxoapcn/39V6UvVSG8Dq6R5QdahDgNnCEjVPtSzGtbC B4zpSv/LvZkm8gKlaxUcra5clXL7p4NWGx1C1Ap4+H6U2h53lC7FuYl8k9mBNwAR -AQABiQE2BBgBCAAgAhsMFiEE3yXTxIaP7BdxgvrWTRdtxQP7QmcFAl1P4JcACgkQ +AQABwsB2BBgBCAAgAhsMFiEE3yXTxIaP7BdxgvrWTRdtxQP7QmcFAl1P4JcACgkQ TRdtxQP7QmcrkAgAiSZ2VRgHTY8SV4dXXjYBO6WM2Yzamt4bO5Uqflw7gPO44AtJ h+Pn89iz37RnGL+bAq2MCNsgV4G+KaLJrE0c/rt/szC7UmwEJmy4DcH5B80wzBvo 2kpN1Uyr7+1+IgHogL6HjLxccoBpawpm0AnhNYrd2ml7STBCfNmilztWGrTkerb/ 2qOY7PmgWEad7whM0OEj1OE+M2IYZUga3gxf0B94GtQNwmI4xv5qXGskTFAlM9ko 94NfvOxEkgCGtnicN4Md74od0POEVrZxBpXuJGt60XVGvOr1iLmlpypWo+PkHhZe Wt45mNAFy6vraTYYCkGXQKqx1kxg+OurYgIFgw== -=zwEJ +=o//+ -----END PGP PUBLIC KEY BLOCK----- pub 4D21AC964B4DD57B -uid Fares Alhassen (GPG key for Maven publications) - sub 07FCE9F56E69AD99 -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -7210,36 +6856,32 @@ e2ZttF/vXSX59qsHzLJdqbXh71N7EYh6jpRgvMJwcUeeB1rdcxedTZBVjXcUJDzf LP1y0VUtGqeH1zDcWy2mv7vDxnN300IesYwkk5XfgIvqk/sMTNIbaQxUnbLZGUjo SEWKqBrUVcuA+MP+UHUPjRKULREhT4QyTKzPPczuxQCYkqUleS4P33qDb03d5c6Z mI4RFJhRuOrxaekm3xkJsSRnmZVyF4j3xx1zggWaOD+76xCJgAfQSEhAvUJBcmPg -z5kg/qXIUFV8Q3EAEQEAAbRGRmFyZXMgQWxoYXNzZW4gKEdQRyBrZXkgZm9yIE1h -dmVuIHB1YmxpY2F0aW9ucykgPGZhbGhhc3NlbkBnb29nbGUuY29tPs7AzQRor11p -AQwAqjOLxqOOYYpZ7wI63mODt+Wrgf00ohszF50xsaGQnqUOPjQflMDDYo4cGeNp -5AuVTio+BDKxmilXeq2w7dko7gVZiGdFI60XaUiAh6fhvaaQoHzyln9GsM6m0jCY -oLAhBb4VHLriJGqNRyOJfJ6LG5J69co0xujjYiwzea58Z+pIq7GfEMb9rrf6v2E9 -b+7BndvG2bAeZAF9V1y8mksH7PBnNOfI121cm8ISdeSynGovXVydnEPiw4ZTcM8T -CUUCF/3V0Gld9MNhieYUXHwtlPncs01OWwCOB+TTxUZzGwWOoZOTHlLZ3upYNLH9 -pJ5LaSPhzlqC40YEBWk+AxOXtQO38d9WnJESn/u+/OqeVAAvSzL1QmJkfwnVW1fc -fVHrzlTZhDeD3T420XnBVC0Q7Cn1VEDawgJDvW9PtnX24yTVMgixHdS37SmuodCa -rfjtber7XaKa2T/poArUhAZT3yS4RKXX78MZCajhxYvIT3o6XoRv0Zv6085Avkk9 -NqUvABEBAAHCwPwEGAEKACYWIQR6RoY1ubjQTEQIt75NIayWS03VewUCaK9daQIb -DAUJAeEzgAAKCRBNIayWS03Ve25+C/96OVNtCjtr09qjh1XDtm9ZO5s1JmiqUbtB -c9jAr1vLWwSPzuEJfyr0/fEmBtgJtszz9Hj1rPd6TLn1eYVVt2y9JDe3Ecq/WGfb -i6HbgF+ETEQr1h+NAlV2iFKCQeA96SKqElCuCZLaRDOBFhJ3+hHsd4IqXEwPFHIt -SJipkmqPM0QnORlQjzY7mlfq6Pp9I4yvC8dRqRW0V/0QDVyM5SVlcCoL31zNUCKw -u14WHvbV/7DAXDOUnhGKhOY6/Q/+n0fNDduk0KVtP+RATfeE0IThUXDCHmYA4Pm9 -/ifo2UJjo7PKJhN3Eq8LP7Bv5XhT+BzGDa068m0ZVuqqJYLb9H4YYhrRymKMBpVo -2Ltr1S3uSMMCYDeDHzHv/snogHXkD0f0Z8f+1XlS9uC2WlNmoZAELJDTPwD+nkW/ -pjlvn/cWbpZAPfqVssE5+0PojQNNMES97HPPJwyptMWtDSJnUhu0kzFB25An54d0 -LoRfFjQzldcy4ShYHShR10dGhf1wkWM= -=3cc9 +z5kg/qXIUFV8Q3EAEQEAAc7AzQRor11pAQwAqjOLxqOOYYpZ7wI63mODt+Wrgf00 +ohszF50xsaGQnqUOPjQflMDDYo4cGeNp5AuVTio+BDKxmilXeq2w7dko7gVZiGdF +I60XaUiAh6fhvaaQoHzyln9GsM6m0jCYoLAhBb4VHLriJGqNRyOJfJ6LG5J69co0 +xujjYiwzea58Z+pIq7GfEMb9rrf6v2E9b+7BndvG2bAeZAF9V1y8mksH7PBnNOfI +121cm8ISdeSynGovXVydnEPiw4ZTcM8TCUUCF/3V0Gld9MNhieYUXHwtlPncs01O +WwCOB+TTxUZzGwWOoZOTHlLZ3upYNLH9pJ5LaSPhzlqC40YEBWk+AxOXtQO38d9W +nJESn/u+/OqeVAAvSzL1QmJkfwnVW1fcfVHrzlTZhDeD3T420XnBVC0Q7Cn1VEDa +wgJDvW9PtnX24yTVMgixHdS37SmuodCarfjtber7XaKa2T/poArUhAZT3yS4RKXX +78MZCajhxYvIT3o6XoRv0Zv6085Avkk9NqUvABEBAAHCwPwEGAEKACYWIQR6RoY1 +ubjQTEQIt75NIayWS03VewUCaK9daQIbDAUJAeEzgAAKCRBNIayWS03Ve25+C/96 +OVNtCjtr09qjh1XDtm9ZO5s1JmiqUbtBc9jAr1vLWwSPzuEJfyr0/fEmBtgJtszz +9Hj1rPd6TLn1eYVVt2y9JDe3Ecq/WGfbi6HbgF+ETEQr1h+NAlV2iFKCQeA96SKq +ElCuCZLaRDOBFhJ3+hHsd4IqXEwPFHItSJipkmqPM0QnORlQjzY7mlfq6Pp9I4yv +C8dRqRW0V/0QDVyM5SVlcCoL31zNUCKwu14WHvbV/7DAXDOUnhGKhOY6/Q/+n0fN +Dduk0KVtP+RATfeE0IThUXDCHmYA4Pm9/ifo2UJjo7PKJhN3Eq8LP7Bv5XhT+BzG +Da068m0ZVuqqJYLb9H4YYhrRymKMBpVo2Ltr1S3uSMMCYDeDHzHv/snogHXkD0f0 +Z8f+1XlS9uC2WlNmoZAELJDTPwD+nkW/pjlvn/cWbpZAPfqVssE5+0PojQNNMES9 +7HPPJwyptMWtDSJnUhu0kzFB25An54d0LoRfFjQzldcy4ShYHShR10dGhf1wkWM= +=+Yvq -----END PGP PUBLIC KEY BLOCK----- pub 4ECE492B63E38ACF -uid Philippe Arteau - sub 7569B5DA31ECF7BB -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBFGP/FABEAC+7JFR/qhFujSJzNooyM1Zrc3Qmreadn8K3/7xZ8QpG0MF/UlT +xsFNBFGP/FABEAC+7JFR/qhFujSJzNooyM1Zrc3Qmreadn8K3/7xZ8QpG0MF/UlT TvlUFnjOnlXIpEaFJ0pHnZmpqYXoQqwMNW+qVspFqYa86gMKy8L2VgWWVuBFLMf4 3m5GvjLs99BzLKI/sUqv2lfAJ+kuZTQW4t108y3d5irbahP+1xW9qpK4YfPbkfCP XOeMHGUHKDY3XqVleUdO3PW+mnnhwChT+9a0IuNRLln6/i2Mb81xcktLR/kexxU/ @@ -7250,76 +6892,63 @@ PvmP4b153xdtGNl4Y+3vTHjvFMxXUTbeZbbXfPyBeqa/ZKW7yhpCFSf22/OpgGZn NuUjxqUElA6ZGHydtxk8E7cg0nLB4nSQ66XEbqm6bULqvsqVPobKULOysdzq1LUA SlKuGklLtGpxP1ma0K/39eik+kmM+ecX+fhG3X9+h5LLHFLuPU9cwakkMeMe2Rwq Q8ceOkD586OLW4tE8swfIfB8hl29JqEekf9DscABQn3/B83DKwqo2xkcwwARAQAB -tCtQaGlsaXBwZSBBcnRlYXUgPHBoaWxpcHBlLmFydGVhdUBnbWFpbC5jb20+uQIN -BFGP/FABEADgetmfLp3yE3ag6+xfqDdySqliRGxLUbmweA9sU4JmCvtAIGrn6mqO -g10pNCBzzJX7kFcX8ZmlCEBFavbm0eywqcUwn2M1DzuuoecAMdmHu8jXX/iGUlql -hQEFkiqdhR/xWUfA3qj9F1o2N8w5puTtwxMIkkgTohZXksAdWQEOJkakctm+WlOk -udLgl7Q3GJnmqIMYiac7TwmLQ9lYpNoz4cFVJH1W+p0kPnjDBg/0nccZ/5HlXaM7 -9/lcYys2my0DKh7OR1Xa4iEinbXTiDiHiQS5jpjopUPgnjkPNdjTCxOHdgg8beIf -rONGlZpD3yr9hofnJDDDf3bxg0zepL3rrlqDwwSX4Jj8gLzDHLUbfwfZgTO5/eF2 -uhcM7PNfHVEi/Z8icCVEK1t3e5xVAjaZFjt6R7rJOl4zsllJYPj84wBICqyP1G51 -Nj2ZE1724qArla84trPHy1J3f472s+AwB60gwocwy1wBIjSQCJ428h99m1f2QEHH -8P7tdlYF3/SDLdSijZ+6g+2HeLkm7SGqnfDWJ3GT1fMy0piC1SnYI2tFMehkkQJy -B1mGsOilrEuUkohD66l0R9TDEBefpNDN07aP6ByPP39TsbTOBJjdWImhMdyyALi5 -XkD0BYRgrlZiUkotIljr7p0bGHt5QiJ81Qt3E2RsyDOGN43qnxDobQARAQABiQIl -BBgBAgAPBQJRj/xQAhsMBQkJZgGAAAoJEE7OSStj44rPE/EP/ApAHrbiy071WXLD -0RbZc3dy+qFtNP3ZJ0kD+l0QgWVl04shgQmhaWJi4kA5WLIaSTTZK+nEoD7EE2a8 -VrBw1Jb38mUaQNo2M4kY0qWa5YEhF0CFdQI1P6Gs+R9DAnVZQEWtLXWdCji/RSlC -9Ixq8kQkco2K5kB2D+ojGXvt4KMR0oolNB64CoKuSTHyEiobFDbhDBrfSxZAuwsi -qRZh6Gm+EvYeGMrxDuQLtZ0o/4L2KMiHv0Hzw8s6mFc72f+ZbrctMjlFivB37hZX -jm+1Kr18L4dLcRoZmJjH9SW7k7pCgpIuYlI0n9yx8BbMXmF/3Gxt4fJrJhCKSERb -Lp6EM6VJR+ETPhH3kKsseSJaEricmD/Cw9VE5nhYxYJ44/QXEng6JG4FBV0hPKCN -x4Yi4QJHqZfmhCt6VoXHwRAOe6VnrmfUWoEa6vP/scH14sun5eA/6J2mBYNZa+DD -YQud90FLaEf135xMv9bBdYv3tMt7xalD4OvxZgcVcD2nuQKm9z56tEC/msWu9lc0 -0gqIyAwhgRK2Ml3GE3dVLQ25+yj9YdmvisFRlTxQV2FHrPWvrftB08nfERM/jJM8 -eKej8y3YRDgQU+O9SrfNjf8PhhpG98C+k/yOh/tty5HGNfdvyMB8TdVxzTd5uHMN -2jfImvpKk61/hgAEI20K0qvSRdKP -=m6Ii ------END PGP PUBLIC KEY BLOCK----- - -pub 520410E2AF06FA82 -uid Sam Judd - -sub 04155300547530C4 ------BEGIN PGP PUBLIC KEY BLOCK----- - -mDMEZOLxKBYJKwYBBAHaRw8BAQdAxs2w5zrEoMuboI/b+hJv8zlrWNbcg6coKPu9 -bJ5Ktfq0H1NhbSBKdWRkIDxzYW0uYS5qdWRkQGdtYWlsLmNvbT64OARk4vEoEgor -BgEEAZdVAQUBAQdA2rpw9zPXi/Kvjlu9NYPouxk7dED9SE1T5G5KyPw8gwMDAQgH -iH4EGBYKACYWIQTi9RpldnKEIgxt/WBSBBDirwb6ggUCZOLxKAIbDAUJBaOagAAK -CRBSBBDirwb6gomdAQDcbCDu1+NttutpaDY0yyUNkDgGiFMIQhu1t5J4cCOj3gD9 -Eq/0QAoo6ZBLTyhMHEx96p4akwxOyNhUiOv0QsxtUQw= -=Rppe +zsFNBFGP/FABEADgetmfLp3yE3ag6+xfqDdySqliRGxLUbmweA9sU4JmCvtAIGrn +6mqOg10pNCBzzJX7kFcX8ZmlCEBFavbm0eywqcUwn2M1DzuuoecAMdmHu8jXX/iG +UlqlhQEFkiqdhR/xWUfA3qj9F1o2N8w5puTtwxMIkkgTohZXksAdWQEOJkakctm+ +WlOkudLgl7Q3GJnmqIMYiac7TwmLQ9lYpNoz4cFVJH1W+p0kPnjDBg/0nccZ/5Hl +XaM79/lcYys2my0DKh7OR1Xa4iEinbXTiDiHiQS5jpjopUPgnjkPNdjTCxOHdgg8 +beIfrONGlZpD3yr9hofnJDDDf3bxg0zepL3rrlqDwwSX4Jj8gLzDHLUbfwfZgTO5 +/eF2uhcM7PNfHVEi/Z8icCVEK1t3e5xVAjaZFjt6R7rJOl4zsllJYPj84wBICqyP +1G51Nj2ZE1724qArla84trPHy1J3f472s+AwB60gwocwy1wBIjSQCJ428h99m1f2 +QEHH8P7tdlYF3/SDLdSijZ+6g+2HeLkm7SGqnfDWJ3GT1fMy0piC1SnYI2tFMehk +kQJyB1mGsOilrEuUkohD66l0R9TDEBefpNDN07aP6ByPP39TsbTOBJjdWImhMdyy +ALi5XkD0BYRgrlZiUkotIljr7p0bGHt5QiJ81Qt3E2RsyDOGN43qnxDobQARAQAB +wsF8BBgBAgAPBQJRj/xQAhsMBQkJZgGAACEJEE7OSStj44rPFiEEz8ELaTgsvPU4 +flFITs5JK2Pjis8T8Q/8CkAetuLLTvVZcsPRFtlzd3L6oW00/dknSQP6XRCBZWXT +iyGBCaFpYmLiQDlYshpJNNkr6cSgPsQTZrxWsHDUlvfyZRpA2jYziRjSpZrlgSEX +QIV1AjU/oaz5H0MCdVlARa0tdZ0KOL9FKUL0jGryRCRyjYrmQHYP6iMZe+3goxHS +iiU0HrgKgq5JMfISKhsUNuEMGt9LFkC7CyKpFmHoab4S9h4YyvEO5Au1nSj/gvYo +yIe/QfPDyzqYVzvZ/5luty0yOUWK8HfuFleOb7UqvXwvh0txGhmYmMf1JbuTukKC +ki5iUjSf3LHwFsxeYX/cbG3h8msmEIpIRFsunoQzpUlH4RM+EfeQqyx5IloSuJyY +P8LD1UTmeFjFgnjj9BcSeDokbgUFXSE8oI3HhiLhAkepl+aEK3pWhcfBEA57pWeu +Z9RagRrq8/+xwfXiy6fl4D/onaYFg1lr4MNhC533QUtoR/XfnEy/1sF1i/e0y3vF +qUPg6/FmBxVwPae5Aqb3Pnq0QL+axa72VzTSCojIDCGBErYyXcYTd1UtDbn7KP1h +2a+KwVGVPFBXYUes9a+t+0HTyd8REz+Mkzx4p6PzLdhEOBBT471Kt82N/w+GGkb3 +wL6T/I6H+23LkcY192/IwHxN1XHNN3m4cw3aN8ia+kqTrX+GAAQjbQrSq9JF0o8= +=OeJu -----END PGP PUBLIC KEY BLOCK----- pub 5365A8A69292AF1A -uid Seth Tisue - sub 6DAC12FEF3928B80 -----BEGIN PGP PUBLIC KEY BLOCK----- -mDMEYVTpMBYJKwYBBAHaRw8BAQdAgCkGHxDJ2ObI6x5cwp6Cl85hJQ5vIZFH/0+1 -wnaiXA20JVNldGggVGlzdWUgPHNldGgudGlzdWVAbGlnaHRiZW5kLmNvbT64OARh -VOkwEgorBgEEAZdVAQUBAQdAsJWY4kW6HpMZV8X5VYH0oq18gI8vVaQPTK+UXiu3 -FkEDAQgHiH4EGBYKACYWIQRgDSEhmWPyKCAKcjdTZaimkpKvGgUCYVTpMAIbDAUJ -A8JnAAAKCRBTZaimkpKvGlyYAQC0bd1I8QbHqLzhkSv7NyKCh8SDTj/xb9DXPF24 -09RywQEAjKh4ayeMU3KgTAoCps9UZ1tw/tySVUY0qIzV4dDP1w4= -=82EY +xjMEYVTpMBYJKwYBBAHaRw8BAQdAgCkGHxDJ2ObI6x5cwp6Cl85hJQ5vIZFH/0+1 +wnaiXA3OOARhVOkwEgorBgEEAZdVAQUBAQdAsJWY4kW6HpMZV8X5VYH0oq18gI8v +VaQPTK+UXiu3FkEDAQgHwn4EGBYKACYWIQRgDSEhmWPyKCAKcjdTZaimkpKvGgUC +YVTpMAIbDAUJA8JnAAAKCRBTZaimkpKvGlyYAQC0bd1I8QbHqLzhkSv7NyKCh8SD +Tj/xb9DXPF2409RywQEAjKh4ayeMU3KgTAoCps9UZ1tw/tySVUY0qIzV4dDP1w4= +=NACZ -----END PGP PUBLIC KEY BLOCK----- pub 55C7E5E701832382 +uid Andrey Somov (SnakeYAML) + -----BEGIN PGP PUBLIC KEY BLOCK----- -mI0EVdDLQQEEAJMtYCaTA56YsP5RzQzPvqVTaR2nZ27qRk36blHB9WmXK+NHpGeH +xo0EVdDLQQEEAJMtYCaTA56YsP5RzQzPvqVTaR2nZ27qRk36blHB9WmXK+NHpGeH PHgq59mLPVueo2/M5k/fFrCe36jHePP31gYpFtueeYDfsofHwod0WhsHyC7JfG8d -jEnSczTCmOHRZ3ed9ef6SeWUozYCQAX/tAbpoCthe0lTDYhFhkzVCe/FABEBAAE= -=45ZY +jEnSczTCmOHRZ3ed9ef6SeWUozYCQAX/tAbpoCthe0lTDYhFhkzVCe/FABEBAAG0 +MUFuZHJleSBTb21vdiAoU25ha2VZQU1MKSA8cHVibGljLnNvbW92QGdtYWlsLmNv +bT4= +=XKj5 -----END PGP PUBLIC KEY BLOCK----- pub 56E73BA9A0B592D0 +uid ASF Logging Services RM + -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBGO9IPgBEADHCB2evKGSjQutTtIjODtaYUoU634Tl4Iv4DYsOR+MyOQBJ3Eo +xsFNBGO9IPgBEADHCB2evKGSjQutTtIjODtaYUoU634Tl4Iv4DYsOR+MyOQBJ3Eo 9okST4azX6r9Fspgmc4LxpFnGm9OSEGn4NZ9ZxiTrmKaGsoXzj2w4JKtgAip4F5h o9Ai/ridqeA7V9VH31OLSyZ/YJvrcoBcxWdwcpydxchlKQOOYX6wKqGk0BO38870 sI1d0y1W9pC9AiL+z7qaX3WUslOFDCGxRSxZs57x28P4pkRy0HwUWn38TrS4fnA5 @@ -7330,13 +6959,17 @@ Cd6FQTGJdtcgfruwltQOUWl4IaCOsCAzI0XnxTIdsaCDDQ6+KspvdFw7zav03eVN TguQ39IkZgke2Am2He5vtxXAayv/qiTKsyTUxIIDe1ZTS5j3MJ+SNWR0faXvvDaV QgqVjsB9U/CHjcCYbmFhKxk2phGwa0Wc+NHKwyVwjhJkFo+U+XDGJaT2RbhDYD1H LeoZAT6kdngSzr2WvXWs6xJbWIXJc5FivUorfkhaiaBWam1R4o+8kSuxSwARAQAB -=wRa/ +tDRBU0YgTG9nZ2luZyBTZXJ2aWNlcyBSTSA8cHJpdmF0ZUBsb2dnaW5nLmFwYWNo +ZS5vcmc+ +=EOf+ -----END PGP PUBLIC KEY BLOCK----- pub 571A5291E827E1C7 +uid Central Repository sync with maven.java.net (Used for signing artifacts that support syncing maven.java.net with the Central Repository) + -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGiBE9iFawRBACJb4OMk3zqMDNvSJKYZ8fGYrPq7yCcf/ykKDkGb2dtPnAZGkSp +xsDiBE9iFawRBACJb4OMk3zqMDNvSJKYZ8fGYrPq7yCcf/ykKDkGb2dtPnAZGkSp 3mmNlTsU6s9ARn7BtkhIuM5TdbLs+z+okX62h3F0WW3h+CpfIXyKSgl7uWbhZ5G8 RSCCRr7A8m6y83npkTVDW6m2oFN2cjFwPLm/vxg1gu5pO+NCwz5iBRHdewCg1idO Gl6gBAZVNteCRMVnGnX4EhMD/RaYBO2j511h7gR+p+6BBeJTEIA1+tsi+GhTBkS9 @@ -7344,95 +6977,17 @@ mUMGuD9Z8PyvwL7quGQyXJ/kTe3eB6iyDFn0oemB1w736FQe3vcIX6eePOEiDZs5 1Uepv7bXI4wn1i3Z3kzynXNKcjCd5ZxAmML5VlQ0zWeE0W18reCjt1P5q5xxBFjw 0L8WA/9aPi4d5VPakzuDvxfKK29BogScTLn2C3fpEnqWsTfpoWSkNXkRsoB4jUU4 oIqRFMTxwsjUmjVUPOG+YqoeAaVpj+RBpp+V+CqgfNWpnH4caxzODE9f+6RYRCGm -LSq/6OmgZg6t38M5XWVpvk7Ixygs6Vrd99VZyIQPJwSBM/pvAw== -=dENk ------END PGP PUBLIC KEY BLOCK----- - -pub 5796E91EE6619C69 -uid Eclipse EE4J Project - -sub 153E7A3C2B4E5118 ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -=+ZVZ ------END PGP PUBLIC KEY BLOCK----- - -pub 586654072EAD6677 -sub 2E74CACB6918A897 ------BEGIN PGP PUBLIC KEY BLOCK----- - -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/e3puhmgNkzrZj26T85LkCDQRNVUpZEAgA -6xveuDcah4gFC0l2BFR9QsJU0SC5IkwRJC/3GcqAQZ5Bf0i1V90wuu8tt/jJLIgn -VKEFHyTzReTwzoLZcD5zXgBVSu09Qeax47ndNjSfZWNkPmaztM5j9yr4OF5MEvOX -E2wrzmrSNlc4rb5KWK/1pEEiX/zdzWJLmQEzvp/MtZmqyK6pCwtS8S+gKZQjZZLO -EnezizecIce2r6xCRxotqncUwfUg+jMUUlZKUlKwh4TrYDFHhet8azXLpjED0ASG -7/pBYDbRPnmWhX1NPiB4MvLDETrx67aszzrsGXZx9Tr61bhFbRKyDY5ia//5017V -gStGAqbkkCNZHGnQnNzjuwADBQgA6A58Mp77pUtCtVhfBRnziKkEaCn8nCpqM/PF -rxih08fQJ3xt/DbfpBx31Hky7KM1uLgzZEnekuU0ZqwgK3aqWg80moKaJNxUZdd5 -oreFobsO7ptejt5omX6kxdGjPclOt1M8sc6E+A3sR5a2QC/9Bts42myc1zKK6+6d -3UpfUlqgaPvXbGTsisM7jt4DtVz6mXLTyjAiWeO07dcbSjgZuRnHsSCJobzTmNtF -TP1DgUecgTcOK2ajgGsuzLqkbaQnK/RiRIzqkFIWlz8rzlYNXh8TA90BLeGXSuVO -EW7GBIc8fVns6o10OdsAqnzEQqcCZv/eHHXjt9T5WgV3epy514hJBBgRAgAJBQJN -VUpZAhsMAAoJEFhmVAcurWZ3QEMAoLP6krvubxUbwXhlbIO2EiMTh3/MAKCyB20O -CDJEYrz4EqbscOdx6H3uwA== -=e+jv +LSq/6OmgZg6t38M5XWVpvk7Ixygs6Vrd99VZyIQPJwSBM/pvA7SfQ2VudHJhbCBS +ZXBvc2l0b3J5IHN5bmMgd2l0aCBtYXZlbi5qYXZhLm5ldCAoVXNlZCBmb3Igc2ln +bmluZyBhcnRpZmFjdHMgdGhhdCBzdXBwb3J0IHN5bmNpbmcgbWF2ZW4uamF2YS5u +ZXQgd2l0aCB0aGUgQ2VudHJhbCBSZXBvc2l0b3J5KSA8Y2VudHJhbEBzb25hdHlw +ZS5jb20+ +=ly/L -----END PGP PUBLIC KEY BLOCK----- pub 597852B0B140F0BC +uid AndroidSVG (Key for signing maven packages) + sub E0A468B5546CD437 -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -7441,45 +6996,21 @@ mQENBFFDPRgBCAC7Z/0fkdEkWVCD5BCDrIj/YOZBFOLHAZWLiVhyX0iDO1fhJcj7 +tAB0yUQVAorl33vHJWV93WaiKwsFpl6Gzr4i5Fmo4G5isXaDMO6NXbNbx45tmfU V1RPI3EcIl/h5jNyRlJqDkoNz3TmgVpt9UO9hH2cGsejdj0c+56/4+/OE+IH15pt w+oRt1dmGFxLlSA6k60rIzc27stABX0ZXi0WoPKGW8psRnZKNVf8/9d8IaGQivWu -sytoVGsaUmIjlJnZYEIJtk7xOMrWqmJdqsHvABEBAAG5AQ0EUUM9GAEIANjKOJC8 -CevFnuPewZfDQTFJtSbRxw7BmfkQ2xRM6NW8eapIRATJZB5rolc3X7wQfctQJPDD -yzhtkIS2ogMzSpuauMAPm+qYWGpT8pyq76d3h4do5um9zwGIQdkK0YyRfHVdyCzy -PxE8FUYmBh77ooCLIA8ihl0HFe8vjRf/BYZF9C9bcIh+r/1LNOwdAKkDrSIR6A6M -iax8vJhvGiyQz9biquMggySL6pDd48ktz5QhrNGce0d25b698QSqYeVWFx66niro -R1ek0/lhnzDsrK0yVcKSUy01qnM9D43g6GmJ2vYgq4+53h6P12vY0ck2KnzFFpOl -4M2S9k8cyJ5dfWcAEQEAAYkBHgQYAQIACQUCUUM9GAIbDAAKCRBZeFKwsUDwvFjZ -B/MEjtMILcxKKDEH7G7rDZxvnIzZwPbYQm4q5bzgX/zgIcjLNBbY2+pli7wSSfpl -rpXNfkNRSE2koyxBOOzRjVNyRcA/mKfHtuo+fkUEqdp4lXM6FfSBaav9qGBRbU0p -3XSOYigJ+EHomYRuaIXPHi7AOAtG20bNa3IejFQT8dcLj1ZS1/ZPFrPcWay/bDbA -QpHobv/5My04QmbgUqmvV2FWxodjTc7j1KXgINux5E4NruiwaCHVoHR0F/d79wHs -Xv1s3ITZmLZFbsMT1CusuZOGRZBZR/v41c1d2Ju3KH/G5+9HslfCsrWaxK/uN4Eq -c7/hvC5COsGvtYPqHtHFSXU= -=XfhY ------END PGP PUBLIC KEY BLOCK----- - -pub 59A252FB1199D873 -sub 92BD2D0B5B21ABA2 ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 +sytoVGsaUmIjlJnZYEIJtk7xOMrWqmJdqsHvABEBAAG0SkFuZHJvaWRTVkcgKEtl +eSBmb3Igc2lnbmluZyBtYXZlbiBwYWNrYWdlcykgPGFuZHJvaWRzdmdmZWVkYmFj +a0BnbWFpbC5jb20+uQENBFFDPRgBCADYyjiQvAnrxZ7j3sGXw0ExSbUm0ccOwZn5 +ENsUTOjVvHmqSEQEyWQea6JXN1+8EH3LUCTww8s4bZCEtqIDM0qbmrjAD5vqmFhq +U/Kcqu+nd4eHaObpvc8BiEHZCtGMkXx1Xcgs8j8RPBVGJgYe+6KAiyAPIoZdBxXv +L40X/wWGRfQvW3CIfq/9SzTsHQCpA60iEegOjImsfLyYbxoskM/W4qrjIIMki+qQ +3ePJLc+UIazRnHtHduW+vfEEqmHlVhceup4q6EdXpNP5YZ8w7KytMlXCklMtNapz +PQ+N4Ohpidr2IKuPud4ej9dr2NHJNip8xRaTpeDNkvZPHMieXX1nABEBAAGJAR4E +GAECAAkFAlFDPRgCGwwACgkQWXhSsLFA8LxY2QfzBI7TCC3MSigxB+xu6w2cb5yM +2cD22EJuKuW84F/84CHIyzQW2NvqZYu8Ekn6Za6VzX5DUUhNpKMsQTjs0Y1TckXA +P5inx7bqPn5FBKnaeJVzOhX0gWmr/ahgUW1NKd10jmIoCfhB6JmEbmiFzx4uwDgL +RttGzWtyHoxUE/HXC49WUtf2Txaz3Fmsv2w2wEKR6G7/+TMtOEJm4FKpr1dhVsaH +Y03O49Sl4CDbseRODa7osGgh1aB0dBf3e/cB7F79bNyE2Zi2RW7DE9QrrLmThkWQ +WUf7+NXNXdibtyh/xufvR7JXwrK1msSv7jeBKnO/4bwuQjrBr7WD6h7RxUl1 +=ES/b -----END PGP PUBLIC KEY BLOCK----- pub 59E05CE618187ED4 @@ -7488,20 +7019,22 @@ uid Taro L. Saito (For GitHub Actions) sub 8857595B73BFD468 -----BEGIN PGP PUBLIC KEY BLOCK----- -mDMEYuRVGhYJKwYBBAHaRw8BAQdA2Dp4m1Yhtb1g94pQzzL24FuP6b9KXF8lP9Dh +xjMEYuRVGhYJKwYBBAHaRw8BAQdA2Dp4m1Yhtb1g94pQzzL24FuP6b9KXF8lP9Dh hZnynhe0M1Rhcm8gTC4gU2FpdG8gKEZvciBHaXRIdWIgQWN0aW9ucykgPGxlb0B4 -ZXJpYWwub3JnPrg4BGLkVRoSCisGAQQBl1UBBQEBB0Atu9kejBi+6wfOT0a9z/LY -EEdNXM/VX6xt1onKToPPdQMBCAeIeAQYFgoAIBYhBMHLp17JvQuvgGGTVFngXOYY +ZXJpYWwub3JnPs44BGLkVRoSCisGAQQBl1UBBQEBB0Atu9kejBi+6wfOT0a9z/LY +EEdNXM/VX6xt1onKToPPdQMBCAfCeAQYFgoAIBYhBMHLp17JvQuvgGGTVFngXOYY GH7UBQJi5FUaAhsMAAoJEFngXOYYGH7UlMABAKyRCazhVyUFg5FOpAnmckBY38Ca MGPPLXVyY8Kr6dYFAP9wYLu7nsDZCOXkAgS+et4Pk1WZCggoYUkxsX1o0KZXBQ== -=7Gio +=UTdL -----END PGP PUBLIC KEY BLOCK----- pub 5B05CCDE140C2876 +uid Matthias Sohn + sub 9D29AE4A6B50E01F -----BEGIN PGP PUBLIC KEY BLOCK----- -mQMuBEwVZOURCADNnKQzSjFuI9/IGj3WTJcPU2B/H8NbZaTsz5WE91WumgZulK2q +xsJuBEwVZOURCADNnKQzSjFuI9/IGj3WTJcPU2B/H8NbZaTsz5WE91WumgZulK2q YeD4u6zdOyFK7DEScgxk7dicox9cNEgYKQnQXctDhfqER9bnvA2iJ+AFxjRAWyvs en3ClYLXT5UVx0H1ZfDVKCvmaZVirZInfkqbi3OiPQoWrUfu02c3DiHQJ+Y34kdB egH2sIShNH8WLfEZ3YDQ4XaWHVuN1C7VwCBM8R3OeTTfyDrTsuyqJ0SeZXRR/6df @@ -7518,36 +7051,24 @@ ElYE1H7+HpphoI5vEwS6uElF67CoO5r74Zrb6nshGEj2AoOqjbrsdQm0noBBNYAu f9RsjU0sQQFzLW8+2xahqK3oZkLWOkSxzLtVwJbm7EGaGIYxEBjg87OnGQkAi9vv tVPwdO3VWyvgKLuPHudLDhTpeH3AMbzKgnru1Pnh/ZpiRhPzsbuFtFPEX8PMuCyE n4OLzUALl98kXuPjG5ww+24UsNgKMbKbu8qq/zRu7IHlpZvd730RoCWU2/i18tnY -zLkCDQRMFWTlEAgA+MQFGIhyA4Ww9g7J8ZiEltwSzRblrjM1q9anexsBIGsWH37A -92rlVK1RzMVfhj5yl+BzIBGO+zHbgycX7iB5/Fwsm+6R/2Uich6NDm1Qai9rc/jg -3MS0phOAQzgxlGKOTS2GzdbDJCBQMijDObNe+Cs5DNB/E29/nzzCTQvtRzSeplZN -r+8Q8lWz6efXmm5EeeZxN4x1YXjjzMJCHbc3yGxOjTgYQOs962yUYsg9UDRJm1OH -9NKZe1m3dTRIMUcZvL12dq/kyiHHR9V/6CkdiNw1AFMi3tvEdvX4D1k1/Qr/2ORZ -E4lRzgug4sKkpgaclLnkJZ9EMczmUFTGbbkx3wADBQf/Y+2nZCJSuHiDv/+SdhQh -OBapZ2hYPDvg29mpPqin/LwH7eFTNv/oos1wzuzGtTHHGEP5mUQLOxjwdAXsWMMj -scSbCs66ytTN7X4O8qh+1yN7vrM6ZBL12Ix7Ku40cgkWyvTVLBXKaEGm4ElhAmSL -Fpu+/fJw0riR6rIuwHcGB4R1IJtMWcj+b1odgw9QmJ8AGpHh2WVdXspoCGnTUN4m -DEswZjplkKXCgLypU13SrHVOqhjd4caK5GNZUfWtCKtwNcJMnvgp2truMvh9BBn6 -widfK48hEknQtXzGjui+bZz2/AD7/OT/T1CqDspB8IQlBCMBn8J4U1grSrZ1wTJf -HIhnBBgRCAAPBQJMFWTlAhsMBQkLRzUAAAoJEFsFzN4UDCh23wsBANDSDn2KWz7H -b5geDwUTX4T8Uqn21eFbp54tFTfopCd/AP4nTdX1iahsClr9q6G+CWQBuQWHVmq3 -FlPU/jTn6vXQwA== -=dKtU ------END PGP PUBLIC KEY BLOCK----- - -pub 5C504E1210E49773 -uid Dave Brosius - -sub 9344C7E75E48ADA3 ------BEGIN PGP PUBLIC KEY BLOCK----- - -mDMEZvif2hYJKwYBBAHaRw8BAQdADgAH6bMuk4zOzywMl2kUy2IYqiQF+R/4qYUL -KQ9Zq2i0J0RhdmUgQnJvc2l1cyA8ZGJyb3NpdXNAbWViaWdmYXRndXkuY29tPrg4 -BGb4n9oSCisGAQQBl1UBBQEBB0DPBdgnYQNLxY7c/uAopyjsC2v2xYyAPL1hxcUt -TqubbwMBCAeIfgQYFgoAJhYhBHekV0DCOIDH+BudTVxQThIQ5JdzBQJm+J/aAhsM -BQkFo5qAAAoJEFxQThIQ5JdzM8wA/2kla7yBkpcffOAvcBjP9vxJuAPlHLVlMY+J -mAQzOOYVAP92fNohJLnu7JhsE+f9U9IlWpf6LunQtPiknm9q+rZVCA== -=Op+a +zLQlTWF0dGhpYXMgU29obiA8bWF0dGhpYXMuc29obkBzYXAuY29tPs7BTQRMFWTl +EAgA+MQFGIhyA4Ww9g7J8ZiEltwSzRblrjM1q9anexsBIGsWH37A92rlVK1RzMVf +hj5yl+BzIBGO+zHbgycX7iB5/Fwsm+6R/2Uich6NDm1Qai9rc/jg3MS0phOAQzgx +lGKOTS2GzdbDJCBQMijDObNe+Cs5DNB/E29/nzzCTQvtRzSeplZNr+8Q8lWz6efX +mm5EeeZxN4x1YXjjzMJCHbc3yGxOjTgYQOs962yUYsg9UDRJm1OH9NKZe1m3dTRI +MUcZvL12dq/kyiHHR9V/6CkdiNw1AFMi3tvEdvX4D1k1/Qr/2ORZE4lRzgug4sKk +pgaclLnkJZ9EMczmUFTGbbkx3wADBQf/Y+2nZCJSuHiDv/+SdhQhOBapZ2hYPDvg +29mpPqin/LwH7eFTNv/oos1wzuzGtTHHGEP5mUQLOxjwdAXsWMMjscSbCs66ytTN +7X4O8qh+1yN7vrM6ZBL12Ix7Ku40cgkWyvTVLBXKaEGm4ElhAmSLFpu+/fJw0riR +6rIuwHcGB4R1IJtMWcj+b1odgw9QmJ8AGpHh2WVdXspoCGnTUN4mDEswZjplkKXC +gLypU13SrHVOqhjd4caK5GNZUfWtCKtwNcJMnvgp2truMvh9BBn6widfK48hEknQ +tXzGjui+bZz2/AD7/OT/T1CqDspB8IQlBCMBn8J4U1grSrZ1wTJfHMJ+BBgRCAAm +AhsMFiEEfGaYEIksvTFI+pKZWwXM3hQMKHYFAl/Nd2UFCRlbrQAACgkQWwXM3hQM +KHY46gEAuNHWGw1PGYSAT5I8F+rvPQsmRY6K+007+Q/icme7bIYBALgkQgbrBPO/ +CkgxHBlvr2BJHjE+nRgTCN73Sqh6JSZXwmcEGBEIAA8FAkwVZOUCGwwFCQtHNQAA +CgkQWwXM3hQMKHbfCwEA0NIOfYpbPsdvmB4PBRNfhPxSqfbV4Vunni0VN+ikJ38A +/idN1fWJqGwKWv2rob4JZAG5BYdWarcWU9T+NOfq9dDA +=Ll5p -----END PGP PUBLIC KEY BLOCK----- pub 5E1F79A7C298661E @@ -7556,26 +7077,26 @@ uid David P. Baker sub A7CC6488427379A4 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBFgRFtYBCADud9fmvTI8Dbs+9GcZUIVzxkL84QYHSDxI9fF+sxfAviq1U+YJ +xsBNBFgRFtYBCADud9fmvTI8Dbs+9GcZUIVzxkL84QYHSDxI9fF+sxfAviq1U+YJ a+ZLIW7HsXx8vpn3hqIqAbDxHjrb6MEJ3OWD5Ks7O9Lq7HOhtqAT/mpV3fZmf6pF zdEw7c4UrfbtKyBY2kSBpKzTfu6HD3q4OBDm59Ezs2XFhKrXtlNC0fQ30ysBpIvm vZH/opwlBgyELKnAYJ6eCmdW1iiju7DPKDBOrGi6zgvslToLpnZeSg6hzSyjM15n Gx6Dgby0GNR4VEVze/UdOpsFVTSfP9qXgdt5ZOWQqW2Jg5V/ezvk+3Ok+ecfHWRz q8tHkagnqn0SfP6mLqUNvmvAH7xp8crH8L/TABEBAAG0H0RhdmlkIFAuIEJha2Vy -IDxkcGJAZ29vZ2xlLmNvbT65AQ0EWBEW1gEIAMuetYIGcqEC7KdfWn6EKmO7Zucf +IDxkcGJAZ29vZ2xlLmNvbT7OwE0EWBEW1gEIAMuetYIGcqEC7KdfWn6EKmO7Zucf OEirvo+WXclo48WX0Eo0gsTghKPGTS2kOzglwn/wYCbBVKzYaOngZljIcrR47hJi Y/u7OH7EjiCiB0sh5WuEqOaCPPFo8lCA1+SBPAF+c1d7SfIEABL/WCc6e1rkKhe7 wkBSclspL8YQUG3cr5G/cSCGOV69TsCqq7rtezjkSsfE5dxmcs39Ouur7hs25DKe hufUA5bV2i51v49WIuTE8x53VfInYsJyeRs7f4sx3hmkwN+EL2mo1YFymGwEkp8i B0Jtrpsevl4AFOajl6X4IrdLn6+XSok/1mzIm+t1ZHokQ3mUWe5FC9c1Y1MAEQEA -AYkBHwQYAQIACQUCWBEW1gIbDAAKCRBeH3mnwphmHv59CACEnAU1vbN4qxquAzNu +AcLAXwQYAQIACQUCWBEW1gIbDAAKCRBeH3mnwphmHv59CACEnAU1vbN4qxquAzNu aalyV6Hyx9olUQqPHopRGBA2ulPs0l+gtAXz5USotNsh3Ai5j39Y4J+qxN3HuDts cxEReogawzOo/B+1IKuGuuTzvL6fU6ZFUnEosxChAKwJo9eS5xlyenyumTcXx5yB /5X5nqTes6tcZlDcEefh7K5IaazwE5caITBX0ze8g7WQzRxyN+vuhY30U7P8TTKx AsavdSBVIb+Hp0e2W2S5T3ogXaGkIi5qllr9uhfX+E9zLxJJKfJot33ix647mPwp Xxo7K6teo2rkwOTQij1sEe2sbMZiKZkn4rYSgLpZiVLPiDYuP3RTuHnFenYROA/Y cDvA -=Sagc +=nzuN -----END PGP PUBLIC KEY BLOCK----- pub 5F69AD087600B22C @@ -7584,70 +7105,26 @@ uid Eric Bruneton sub 0440006D577EAE4B -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBE7JURcBCADO+9Dc4/JnB+wX+fq+Fr2zUGSPOT6/qjE5kXL4FEbJKsqDSAKG +xsBNBE7JURcBCADO+9Dc4/JnB+wX+fq+Fr2zUGSPOT6/qjE5kXL4FEbJKsqDSAKG VnbtRrsIUdmNIFQmz71bBDFhRBbrSrkz927k8eUPhYtxE2NmmWSuKgrjF4qviPQv m/7SqGx378m/qw4EvpgGUB8EYif98LYdWp5vsU/zx0Ps9auqvetAzJaL9489oE0F q8FVhve6BMfUUV7zOTCmJnf438YO68upjU0PVBdfFE6Qx4cgCeWbQGy2cooW5azN iIenhuYU1qikmxMHq2xZzN4uSTWLGDpimPyz+Y1aTSYJ/bgn9gPStbI9sojWo9SS 5gvNK3XqJzMwxwFow86UcIE0vPD2T6ZlBAXRABEBAAG0IUVyaWMgQnJ1bmV0b24g -PGVicnVuZXRvbkBmcmVlLmZyPrkBDQROyVEXAQgA2uNV77VI+ARj1d97b5cY3/er +PGVicnVuZXRvbkBmcmVlLmZyPs7ATQROyVEXAQgA2uNV77VI+ARj1d97b5cY3/er 0Mcc8/Q9ctMY+5YpSYDOQF100QBdOQ8q3IJsfhZeF/iMFlHIUikuSgatb/Ih4lk1 +irnERPuV2MNoAw3Fvn3/vwl/Jy0ZsQCBSXO54U42TcOXSwNLkYOJaomDiiuo61R xj7jqijpnydwoFvEi84v6q/Uota3MijGMbzU9QyTX8J9OKMeCSUq0uVuk4ezebjv /bwA/ax/qQRIrEHDOOB1LJ5JyLacK4+h5J8tMkEmWxEQv7MNokRLgbaePqv+tdf1 gee4f2fSE3EXKFxjTO2wjLPXCrHSSI5gecsilQn7ZNxH9g2YUJipn9yj3ywMxQAR -AQABiQEfBBgBAgAJBQJOyVEXAhsMAAoJEF9prQh2ALIsrWwH/3s8uN8/gDnbcbTX +AQABwsBfBBgBAgAJBQJOyVEXAhsMAAoJEF9prQh2ALIsrWwH/3s8uN8/gDnbcbTX +7N/ZfQBXJZ+H9GGikmYRJE1xoOeEt9MOqZyGDTZfGM/qNKeDGfar7pcRQlMK/A4 Nts5E6d1OX8fBkUBtYanyyjNLlT3yDjO6VaV0SCsgAzNjUZqc4lxS9atN6md5m6l WLAdHghrXuV6LsiKOS+96htchoCvTvm7mcPI7w146yJRSyCC5+PybG3ult5Y6QAS kwI3ZWB0u0PKUoqglwWngplu+0Fib2rxQvL32is4YrYaZ+XwoR6u/Bgv0ZvZiypk 17Uk17rDb/JfeLqDn7oW6Hlgi9KOLbRRIg7vwZVo2Ixco7aGxZp5c4zSfaPvn241 v813ZcA= -=a3mq ------END PGP PUBLIC KEY BLOCK----- - -pub 5F7786DF73E61F56 -uid Ting-Yuan Huang - -sub 73F7734B17EC71F4 ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -=w18e +=hdCI -----END PGP PUBLIC KEY BLOCK----- pub 62467C4F2D39940A @@ -7656,166 +7133,62 @@ uid pedro_karumi (Pedro's key) sub 365D826E84B11B58 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBF7D95MBCADKhJjqI9jckLUSJDyuS3ury2a6CUy4M5Ak/AzFBB6PdBJWuZuB +xsBNBF7D95MBCADKhJjqI9jckLUSJDyuS3ury2a6CUy4M5Ak/AzFBB6PdBJWuZuB WLU1A2Pae/ADkqoQWv/TATsi8eHcQzLhL+TmdqDXiojdxn0Wk9krtO5u20O8WbYo AeagDUnF4FYkuHVCXFsvmZex7vBS6L0gEYcsyl4ibiT3kyLF0jvr1gEXkqQ1qMhy N4zam/fBzRAKtNIn+7zJDI2cQNrHrpL7qUq5o5TKODoBIJuXB2isiI4WBXr8fFgZ XgU5Ck2U9R6SJ72P1Qsn5sy7t+D/JnDtwMa1mHdO+Fsf6+M3lQOrXtNaGcALi9aU 1SUQgMVucfdKnRmytqrvxH2Md9vgwB9rGAULABEBAAG0LXBlZHJvX2thcnVtaSAo -UGVkcm8ncyBrZXkpIDxwZWRyb0BrYXJ1bWkuY29tPrkBDQRew/eTAQgAwBlk3/eh +UGVkcm8ncyBrZXkpIDxwZWRyb0BrYXJ1bWkuY29tPs7ATQRew/eTAQgAwBlk3/eh eyPbn4K5t80WatFoJ6U3yIg3fFDGa7OApvYXSjZjMcCNkO1zkSQUhzkdJQYryrCF fdNRMXGqToq9lbUJGVvk5QvnHd5nG4aMOTj8A64ByXvKjmr8qWyBLWTmMLDh/zGF AE0DrgpziT8uP8C7ALsUxmG7Nkbyf7TwAfp4KBm5UEQGXCa4TzOt2rH2ZAD+pyrb Tdyr5UOHr+fH9yk1rze88JdbhGslvzSxk24fqtTFAJ7AVUIxYugmolFMwzuXs09K lzHamuk7dJ3ABJ7cfxnRjh5ZujUMGssGh7DAYU5Q+/bDsndrgkwOqHe3JUr4lAQn -7TPPIpapNuKXqwARAQABiQE2BBgBCAAgFiEEarI58oUmej6g9yQ/YkZ8Ty05lAoF +7TPPIpapNuKXqwARAQABwsB2BBgBCAAgFiEEarI58oUmej6g9yQ/YkZ8Ty05lAoF Al7D95MCGwwACgkQYkZ8Ty05lAq53gf/b671rYoRtzO4Y1KEn1uxKUbxde8VB7C6 Fs59coKyqxMEQvROGLakM2SoLt1hYp22wYaTj3QkaF6k/rwuKtTAxSTRTJ1scOwd YsQipDrpFna1mSD8PqmbqCZZuUXSNwB87XdCs+zy2cI6jUvTptWQqTq3ms4EIeHg lqJvxtHD8oX6J5nFkX3SlOPE/oWKN4N6mhB+O1dvqgPviJw21d94msqueBD/PALp JG2P0/cDQUTxCHI+FSiMg5vpWNBqh1ZzXPf3N+6P1sbxPetGAH7+SyUJUXOQvsC9 KFUZDiG2rfnZRWX4DtELHO6prCqwFr5K8wVCSXuVpsKeG9pJKBKdNA== -=qr6Z ------END PGP PUBLIC KEY BLOCK----- - -pub 63426A08B91ED6B0 -uid scala-parallel-collections bot - -sub 92AEAA033EDCFC13 ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQENBF14+1IBCADMFJyazFt4gCmOWzVO5LU0WoRVzH0PuRtIV267uZtBqgknQWvU -RzQz4bijv4+Eg+QmEJuCKpLs1MXgSh3wCqHNwLg1+UX0pbqxQPz+XeP07A4F+tN2 -VHmamN7aq9EkYUU6HNlHCTa6jJnf0Krnh36W9KgbAAms+kOE1m5KbEO4k4Sad4M6 -KxySbDbTtma3P2TWc73fIc5LeLJYRgNpXaOWQgXpwiCOAy2SBsZFiOBcxqUE7lZQ -32VoO82Xtf4IPj461CDzJV9VQ68W+zqzx1A1+9H34PtBwASH7GGFDdPE5AdPE4iz -ThN9Hf+lpEkJimbdY6jjylTdm9liShcJwwlHABEBAAG0QXNjYWxhLXBhcmFsbGVs -LWNvbGxlY3Rpb25zIGJvdCA8c2NhbGEtaW50ZXJuYWxzQGdvb2dsZWdyb3Vwcy5j -b20+uQENBF14+1IBCACgdIkEJUV4675xb8qzku9S30JzyDbSqRUQBMwq8a1Q+2b6 -7MfTliWzbE9a0lP4Rim3kZ4+QmQelY1I3bCjkNgaRndIoKSLf3BZsMynBv/z5Mvj -MumQVwOWCCB9ot8MJ6G89EW66m/DC5EAz+oY1VWXuGp2ANPHBP8Juo2SYCGCE/NG -TaLuOWHUfMWs79tzvqwwMxVQ8D9RYZBBwk/gsi4ptMT909gOvPbgfYF/3CRhN4MS -+VDt/s5hXP7EG0odxXamG/o3gvdCLFGQXDPio4aGmRmtf6QzqUqzn3TZ+6syxg1r -pJrkeJpvQvvl8vFMHdO4dQpuoHInFtIOUFC8bfH1ABEBAAGJATwEGAEIACYWIQTE -eKggrRUEEv8oYMVjQmoIuR7WsAUCXXj7UgIbDAUJA8JnAAAKCRBjQmoIuR7WsK3m -B/9EhC8WLNVt8d9U+PBnPpU3u1bQZsnv59bgM3if1a63Etq/OtgJ3Fo8+LONwFtK -Oc4Xw69GwC4+/JRJeG08GuFlVqpoZ5NLgmDvg/v52S+grWStp1Q9i9MMkTS/p2du -ArkzV7+xme9Ek/YRHcuG8h0tC3oGReFlFQaHzvu2BUyQgKsslKqhN0Tb3knb93nY -KJqU8j/8vrD3uq2OboyvnvS6OwgbF6JqLDjEughYCS2/L7xYtpKtG4lfWCnde14V -hvTlZBsPJfiCWXYpSUqPdA04tFqTU8w/2kK5F1M+bUsS/XFp/Cq5SbDRlb6khCBd -G9e86vW0gwWqerOXyCYXpc6P -=nzqF +=Ji1z -----END PGP PUBLIC KEY BLOCK----- pub 6425559C47CC79C4 +uid java_re + sub D547B4A01F74AC1E -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBE3XFIUBCADcj1zw8m1evCgEMqxgOfl6L8y1tsYWsX7tVPvHEkYlXHrdcpkB +xsBNBE3XFIUBCADcj1zw8m1evCgEMqxgOfl6L8y1tsYWsX7tVPvHEkYlXHrdcpkB fGuWPrauvhBmB9sBkFfxzU98Ilz3Xk9pfISYiaMUk9Mk1ZxsCoYPVhxvOSvk5LgS sviDzjYdZfZtskUM0sRmjmoQL//fVQbfLxJ2zses21za2VHuS3puUbdcm8+UIl/q oyneDbzM7j2nYXXJPNXJOfvyVxi1+rsc7xcjMvAj5ievYlWwYlAIgYbAiz969NdL RkoA1Wg+cQg+59k7Wvi6xwTfzMsO4jfkV2p24xn4fpcch9J49UhADh6O7XEls1Xr -80WjysMJWTOX1O2oTtV/BMjpI4gj08SgZRhzABEBAAG5AQ0ETdcUhQEIALq5+uXj -S4IHZBmOWOBSf6R1EnU4pUqEza0uwgIX5Xr2uSaaCMPCm5xrbtf/Iv45VEuR8zGK -b8/0dV74me6nXnOeqD27pkkliVE5nMPQnqKAUQmrA5aDR7Tzmey46Bmc+IFrvbWq -iyA3yZwUpi1FKZR5VLEYhMGI0qOyoaa1NWjD3LDL7/AmQESe9QLCtT6QhNhmj/QW -ByRpmuIhayNyPGlh5osFyiGgVcinlZE7x12uG76C1V7jo9eYrkjl/uHJHRqfB628 -oLubDFimKl1raYClRZ63jkbZBfC1fRYzxk6356mAxlB2OVDH3aYB97KKZkU8cX22 -IMawk4aBhCyhX8sAEQEAAYkBHwQYAQIACQUCTdcUhQIbDAAKCRBkJVWcR8x5xIbA -B/9HU+RuaFxAIVwySrAvBwycrq5qb850RU9+KgrKo8CSCKTLdmphgBSE3pCMr6A/ -Q1QtOUndbm7SSq+XqODhij4FfUx0Kz669iPEVEZgZCausY7LH9aTmTJCRM+Ey2eM -32Skz+ur0T812dN3iNd8HtC/iaJAoGFAnWRHetcH03QMEuogZp80NBg0CHV5Is8x -0uh8JRHi8hWD1f6vVq9/GwbgRsDOppVa8Z2BgyHOsBDoec/fYC3i4iF8rHuuSGqa -jswzG9SnFN1zLcGhLEUEOJzeDCANb1b2sJO2r9xEvfNcswj6ksY5lgItE1roCI61 -unkajH4ViHheqLZ/7wRm6eOF -=kuUA ------END PGP PUBLIC KEY BLOCK----- - -pub 655E4BF442CFAE07 -uid Jukka Zitting (CODE SIGNING KEY) - -sub 6A73B16B42B5977B ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -McpbToSnw03RGZPKBs85X1mx1+ZIvQ2n4A== -=GWuh ------END PGP PUBLIC KEY BLOCK----- - -pub 6601E5C08DCCBB96 -uid Popma Remko - -sub 0AC07D0BBD11498C ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQGNBGBVUWMBDACXALXWXSrB2V95lR1L+i+sQsTQt8tCIgX0iX9UZ7Vw2K/lLnLw -WYtM3oTxYox4OdgkK9tK6771EdCH5wQtRdUQJjlsBfZDPMiGqmh1jrAxAugEkFyC -anVQ8VL1Z7uPeqw4UbtqA7Or/E0aOhF3zkkmhaiE9Yrp+I3KXWH4F0Cj3X9IUcf5 -Z93CPcEFQx7ajxSJ1xw/mSgbU4AtKZXUdK1ehnFAhH3rcMVW9paFSYaXD8f+vUbj -hdJOp3e9UYEFShsdwo2X0FRqI318ef3gPDpbTATyCaz6NMIybDgRGo9WOGwF+Ysf -snXwLU2UnT44kpAzHjFdjZhQGcY1w7d8yGNrYX4qw/RMPhmuVefuF2yodBtRxhWW -09dwNiIYFVuGS4S03vlnEfYZlhmRgvWZK9PDJXm0vE5GI7LdOKlqwZxvoznjGmUU -lscRU57DtrNlAjyXMZaGdNfPIG85B+ijJmIb0REHbszvG6csX4g1MiZ+i0WID8Jl -20YpJTUkkvIztXkAEQEAAbQeUG9wbWEgUmVta28gPHJlbWtvcEB5YWhvby5jb20+ -uQGNBGBVUWMBDACp9Vpf+IvWC5bHXRe6bYRYm4LO74f5GICC3cqfHNe0xzwnhDM1 -X8Kve87djZrWp/Q07yjh03iccddZsH1Wfme0b1Ue3UdrhYMuvvMQPI2k+IR7+wut -AsDlMPbyRcgnhaAO5URhn7PW0Hq2RxmRTPHrXzajEJUodT2VgjEC9DOD5cDAU2gc -SUJgBANOvIoPEQAMBsYMRgYUczjvr8wTPP3kuqBq0MhZrETpENIGOeNIDjhkewkb -BweOubP5FeAWeFCML/3LBLM1lA1bNaPJL2qAuYgSQcxvqYP95AesYDlLK8SWogkw -y9etGmegbWXYUWI2frTDK4H4XO1/H1iAqUknB0t+YMNBO5UidotTmJMq9ln26Hx6 -RqO1ifc1QRu8A3VIryCdapNGFUib/TBwF201WJPK1MfsIzQvS/HgVmmu7tzYrIVD -HYbj/RXEiiULMfPZE4PezahFO8/oHmvkR0KLOuwnOuMyWO/DWGn30Cdd8k+00zJ4 -crCR/FVfwrGeTacAEQEAAYkBtgQYAQgAIBYhBKpBdze9gFRW2zy93mYB5cCNzLuW -BQJgVVFjAhsMAAoJEGYB5cCNzLuW3OcL/15j9/sQ7mzMVeAQPQlhMaFhtrheMPyf -0eOorklsJ9afcBPsYPCtY33vibJzm43MiPeys+tW42B07i3wWnrcS0ZChgCHzGoq -nF1QRu+O+G8hZ7EARNXMu+GAmY2sxCdF6vJtgEY5tIM82I9dtMMlaqvx6hKsVox9 -YZkvK2yL4x0F/nVD1VQTf3zUvZNrrdrowIf3cIuBTzkgTE7FrfaLsvdBZC2sNYuu -NAY94zHsfqlppCGNjSB5Ig70S/YqPp1WYxU6yiXPRMY6qyNIO4NkAmtIJFEEDveY -bbpvMBYYo8vcVjEXuCOQWQuMbfnMWu70jCC/3E0zn8RebEI5kdXxk0D4+pDh3TFV -nqgi40dbwmHEv4p06IBCzaSoyzDfYH0Y5i9kZ4zUM1S9GEOtFwgEWxD80g1YU+Wg -Mr9k+0YfV/wXDbIPLodc1J9OCnwqrzJnxZiRO0q/xM719KVhsJqR0I9e5trpPrft -AA4fEAfsK22q/zZWGn1aDs1RyzdSprcN2g== -=CEC3 +80WjysMJWTOX1O2oTtV/BMjpI4gj08SgZRhzABEBAAG0ImphdmFfcmUgPEdGX1JF +TEVBU0VfV1dAb3JhY2xlLmNvbT7OwE0ETdcUhQEIALq5+uXjS4IHZBmOWOBSf6R1 +EnU4pUqEza0uwgIX5Xr2uSaaCMPCm5xrbtf/Iv45VEuR8zGKb8/0dV74me6nXnOe +qD27pkkliVE5nMPQnqKAUQmrA5aDR7Tzmey46Bmc+IFrvbWqiyA3yZwUpi1FKZR5 +VLEYhMGI0qOyoaa1NWjD3LDL7/AmQESe9QLCtT6QhNhmj/QWByRpmuIhayNyPGlh +5osFyiGgVcinlZE7x12uG76C1V7jo9eYrkjl/uHJHRqfB628oLubDFimKl1raYCl +RZ63jkbZBfC1fRYzxk6356mAxlB2OVDH3aYB97KKZkU8cX22IMawk4aBhCyhX8sA +EQEAAcLAXwQYAQIACQUCTdcUhQIbDAAKCRBkJVWcR8x5xIbAB/9HU+RuaFxAIVwy +SrAvBwycrq5qb850RU9+KgrKo8CSCKTLdmphgBSE3pCMr6A/Q1QtOUndbm7SSq+X +qODhij4FfUx0Kz669iPEVEZgZCausY7LH9aTmTJCRM+Ey2eM32Skz+ur0T812dN3 +iNd8HtC/iaJAoGFAnWRHetcH03QMEuogZp80NBg0CHV5Is8x0uh8JRHi8hWD1f6v +Vq9/GwbgRsDOppVa8Z2BgyHOsBDoec/fYC3i4iF8rHuuSGqajswzG9SnFN1zLcGh +LEUEOJzeDCANb1b2sJO2r9xEvfNcswj6ksY5lgItE1roCI61unkajH4ViHheqLZ/ +7wRm6eOF +=RK8X -----END PGP PUBLIC KEY BLOCK----- pub 66B50994442D2D40 +uid Square Clippy + -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBGDoYisBEACqUDZnT4h6ma6XIzdC6KR++uDbR2VKdhCuv0Og/sHEKkm6ZbG0 +xsFNBGDoYisBEACqUDZnT4h6ma6XIzdC6KR++uDbR2VKdhCuv0Og/sHEKkm6ZbG0 OFB8tAaQx/WlsoQyf3DlLfUEOGDai875Aqor3fbM+E1hrZbQNfsOySKEE52k7PYe 0qGWlnAzINuQaEuZwNw+pjZqPraMlwc/hwzJB8yFNHCv25pCFohK7KXvFGr5Fc6y NHBp6pM3pnDQ1kbkloDr32YZY2LdrfdkRqwa9STNMcZtM724aaInValFpVGEHolF @@ -7826,7 +7199,8 @@ ZEbPrfGMi5/MIVtLayglLHSPoZtjQBhlqo8w3nuADR/aFlIUZ6NGOwaz5yXIGVEs 6E1wiuILRAd7ecJ3Zyr/URHjawfHfKMM2tNCJKl48cScBMY61FJ1EmYzwhDw+at5 D4pCk75eM5/t6VdYQ1cDWm7J3LGXEANMU5aSZMqgVnb4SQEmRxkW7oq3Z+GIkQQf Sj4OK6Oi4cUpM7b0m7Cbcsoqb6nD27VKD3J5KTYEq3e+78h0VRjhoi0Z+QARAQAB -=UUB8 +tCdTcXVhcmUgQ2xpcHB5IDxvcGVuc291cmNlQHNxdWFyZXVwLmNvbT4= +=Vcde -----END PGP PUBLIC KEY BLOCK----- pub 66D68DAA073BE985 @@ -7835,18 +7209,18 @@ uid Ceki Gulcu sub A1766BE5F812AC2E -----BEGIN PGP PUBLIC KEY BLOCK----- -mJMEYvEGpBMFK4EEACMEIwQA6knc/2gtbqDhPh5EzrymR4Hwi1Xf2S0aqMopA1zg +xpMEYvEGpBMFK4EEACMEIwQA6knc/2gtbqDhPh5EzrymR4Hwi1Xf2S0aqMopA1zg IeZzBgSfL+4fEfpXL4eAzvrk29jIXSizDEOgFpw3PW3Om1gASxub4Jo6EQrRgOdd OlJl1bajIRC4pAoZafDzhOb+FkjJ61lEJzJ6pQtG0Yi24QWDBfXHkSiQSbZFvcC/ -FTJpZua0GENla2kgR3VsY3UgPGNla2lAcW9zLmNoPriXBGLxBqQSBSuBBAAjBCME +FTJpZua0GENla2kgR3VsY3UgPGNla2lAcW9zLmNoPs6XBGLxBqQSBSuBBAAjBCME AdqQOy84O/j7xo1rAaMB3jGHCn42wBJF8nMVZ1oh6WRN8d33JP0ojCpCK9oe3lyx jZRvBsVkFhOF5lsb72kqR34hALXmZvhwFhzNoQlz4NuDLg6aQjAQEyiS7NqI2SVT -qbGoyIE6yg2ZLuv2svxk1dNlvtqtfOnmoeIZG3pybRRhyuIVAwEKCYi6BBgTCgAg +qbGoyIE6yg2ZLuv2svxk1dNlvtqtfOnmoeIZG3pybRRhyuIVAwEKCcK6BBgTCgAg FiEEYCAKxK52HxYU1sRnZtaNqgc76YUFAmLxBqQCGwwACgkQZtaNqgc76YUkLAIH aAcCM1niPs/kj3NEmFl3P9ivExlWa6Q45l8qPgitCLO2v932TElX+ux8O+fv0Ax2 XJezAj+eMV+lYScyvXpmzbwCB36nuPmtsCJ31kYLXhN2WIJWPvPVesreI/GQUq0W uAngfd6DOtCKYtNKP7xqDu/2bMU23cxGaRj2ToH4RfCClg1B -=rv9Q +=j1tx -----END PGP PUBLIC KEY BLOCK----- pub 67AB3C2A8FC5C42E @@ -7855,7 +7229,7 @@ uid Cl?ment Fournier (sonatype signing key) sub 96725015DF9CFD68 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGNBGH5V6ABDAC/3vY53y/CLvTSWomsYRPasbGWj9SyhGYbqfDAvBl+CUXdrn0C +xsDNBGH5V6ABDAC/3vY53y/CLvTSWomsYRPasbGWj9SyhGYbqfDAvBl+CUXdrn0C EjDqBDgkHCm+brjrsa4jiNIFVNiaXIBq3hdnotLqQLvNkZKq5Ffgd5/8FpPNNo04 bVzNlllCTylnFjp2YYUbM6IZf06aKWHYlOyHCaAjZdAM98dXen4MhCTHlbVjvAE/ H4probzm2VYpP59GL4l7lFFnLK6NFgHUCOjcBuDzEFlWEl68vluob+sSvs9Vuur6 @@ -7864,7 +7238,7 @@ H4probzm2VYpP59GL4l7lFFnLK6NFgHUCOjcBuDzEFlWEl68vluob+sSvs9Vuur6 DCJiZLTRXdo4v2t7chKROlVQ/+vbZtWBQk59SDCz37Mcjhb8eXi3hRxFV9IU2mlW C2fdraAt1qf3b4X3i+Fs+Gf1tggtAsh55Rwz+Yvd/F/6ieu+aYwn9rjvXNwxdkXt 5abHl/w0VEflQjMAEQEAAbRHQ2zDqW1lbnQgRm91cm5pZXIgKHNvbmF0eXBlIHNp -Z25pbmcga2V5KSA8Y2xlbWVudC5mb3Vybmllcjc2QGdtYWlsLmNvbT65AY0EYflX +Z25pbmcga2V5KSA8Y2xlbWVudC5mb3Vybmllcjc2QGdtYWlsLmNvbT7OwM0EYflX oAEMALxbq0TQOnda07RFdCeIq1MEbCDz9a2tuozqTpbcAb8DWJ/ENolbp9+5tRbm Ta3W0PGWjie3BkLrqpW+JdW6lLzXsOfGsK0lfZMd2+fPynngm/UDJilTEx+yQm2+ eP7CNRnvLuC+6FFEn7CHKsqpujhzcq6gXxXj3lF1z8cz+es/7EnqyLBKX4m91YTu @@ -7873,7 +7247,7 @@ hsIQOjsyzSyeeKv1xfpOgjevplUL0zDuj27iD6ax6JNFVSOgh/V1Nx4s4PJDO323 +F2CHrrVRfHvAMIL03rMooOtEOo+zSGcx5hAC5Tgc4wka9yNf4Z1zfY8b0/X/qer BxUuUz2ATkc50xD0F5hqEkSUQibY3XXQWTXXIq+pKYe4BSME48BbYXDrj3ZJaqiC qWEAxhjACsiBWPWoqJHaOe1Zc4yMJMN0Vhyj941s2dPkrdTkZFFTOkKMtvrpdulE -lV3zFwARAQABiQG2BBgBCgAgFiEEaK+CuZw8mt/lymYXZ6s8Ko/FxC4FAmH5V6AC +lV3zFwARAQABwsD2BBgBCgAgFiEEaK+CuZw8mt/lymYXZ6s8Ko/FxC4FAmH5V6AC GwwACgkQZ6s8Ko/FxC59rQwAuNO0uQBNUHj967Csp4ZVPX4Og+Ws/KiivqUByDQz JxH4YLGb3b5YbPfOvum0gVHXuxzmsi9a1cPDt0CnkadQX0hr30hR7+GzIaM3KCI7 1z9yKpLhaGUdA58TLL9Pv56so2QwveFGvemRTm//3cryRwyQ8Yug2d8bkZdG/kZj @@ -7883,16 +7257,14 @@ LQv2INMXWP4OxbQnLYByiNfC1KJ2E95dNC5o9gQzHojdDdUdC7EcBEx2Qnyjzn5Z u7Soh90nDXDoDke4qIkbzhD8xv7bWg2VLFLgzOUd5qlkU1tQHjQV3oi9bLv8SzkD BT0eV3VYhXt0StpPv6nGFUemZPmKtIx7nk88nT9Qx9xu9umjjQ5FGlLMV/vRQmEg SfSMrKyPnYJ/wpmKlRrSLrlm -=og46 +=QoIR -----END PGP PUBLIC KEY BLOCK----- pub 689CBE64F4BC997F -uid Szczepan Faber - sub C0058C509A81C102 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGNBGAofm8BDADhvXfCdHebhi2I1nd+n+1cTk0Kfv8bq4BQ1T2O85XlFpp1jaIR +xsDNBGAofm8BDADhvXfCdHebhi2I1nd+n+1cTk0Kfv8bq4BQ1T2O85XlFpp1jaIR 70GAm2MOt8+eEXt/TuPkVBWnJovDpBbkUfYWxSIpPxJzcxWV+4WJi/25fBOq2EuP QQhkqHQRECQ0CsogzsqI/Tn3FksiGKB7v67hAetM3KpwZ5IlG8chLoaeDf7k3P3S fBWO9MFxYW/7K5G3vqARKXHvzq/jYiXziMDeWIKswwTPqfeDc89tsEdE6GMT6m2u @@ -7900,117 +7272,25 @@ ECaulbHlzEzazSAh322/yyf/nfVZ/yZhK1y0MjvwpOhGxFbay5hA7L4bHAwR3qb9 YGiPIL+K97TYY1G5+3X0TSvTIg4VsW5VDu50oB2iYK7uGE08GhT4uc73tiDlZm8L BUwT/KtKT7g++LYwAMeZJ5+rfIKKxblXUN06vz9stylo1rNVhTXftuqqO+x5uVGG KlOWzx3p9N3nqrufwuoQNvIMzCAvJZNm99j/Y/40wsrUkBxVBGNs6nEpQ6c5lvf3 -24Dfk3nY/7Fts1cAEQEAAbQjU3pjemVwYW4gRmFiZXIgPHN6Y3plcGlxQGdtYWls -LmNvbT65AY0EYCh+bwEMALVHwkeMzw/wcUboKcEUmmXmiGgwDn4xac47U9x75JgC -OqQE1+4Hxu5qULrPlCLLP1PDmD2PK/QUwbGpjjEuw4YxI6JjuOQ9sQa7HbzRVOmw -0kd0T4hr4Xa37D3E4oAxqwpeXcPsUWewtpjoqjLpTDBuaRpp/x3sFFmM9+s2ci4S -614yppuWqu4X/u7w5CbWFYMKl/N5aqK5RYYMAgPUqsI4J0NKwb5UszFuatFevTvD -MuwOf9LfW7kun13s0Z+/+hWGlNhk38ahIR8PSr4yT1pR271dUQKCTtZUFC6ObVAY -WAaEzrJ2XuJMnbHjpciv9WqaXFLpda7eE4TucmjU3+W29kWer9ts48EkD8Hv+a8T -BXXzK8KBi0ACUJi6uma1DWdUk6tqe2CniwirRzR1mWhKfOmQqr487pH5h0jMSPN8 -Dhyyuw4Ef2BLmTQmvbDYv9bwkeisskKjg108OoWOid1tbXudFdPQWqNc8FVPMlde -kza4cC4qBd+vjVcKHrEx3wARAQABiQG8BBgBCAAmFiEEFHtpGhkJdiSQL06paJy+ -ZPS8mX8FAmAofm8CGwwFCQPCZwAACgkQaJy+ZPS8mX9PxQwAn+LmPCqO6ig0fsgi -nOhUaoM2QX6A//IiFDXa2pY3bKaWf5LAYpuvRAyMsGPI3ceAnwfFSMXjktlssmD5 -bQKFisEuCuFQ0B+dlMO/+BZ1Id1Nldi8yKRTfcffgONO4kuKGKN7MKWPBX6/cJfA -pwHV7QubGEl/b/UNjPVFv34QCLU1ZFhVKHO582m0N94dwkwThaQQZX/op+cT2kSC -DWn7zl38KoYSy/6ThxKyIWKimiEpug0VeRHDoYw2NUyVvidj/F3jsnbEiNTH1Rpp -DzXuJbN7c/fxaAAhlAgxnt/hvrECPylnA98CPd1tBl8Q6IDcgbXmIa/jLS+Rqv5Q -xUNYlwhcFP9WxU8RwzxIHo9SiVRUaLcqit5eVI+eZbcL+TZP5b8wtLoKr199Ej2F -xNkL3+InFdjTH2Ir6RZpmqeY4NI6ujL41iUru20RzTNCAQA8jgmCMq9kDxaykpzd -SvFHnyijywCZB1jblPtxo2UqRO/qhPfqSkoVcpWmxgiPUFOr -=E7F7 ------END PGP PUBLIC KEY BLOCK----- - -pub 6A65176A0FB1CD0B -sub EA8543C570FAF804 -sub CA890A5FA09CFD80 ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -pjR9iVjH1oML0H5i1H4= -=MfhW ------END PGP PUBLIC KEY BLOCK----- - -pub 6B1B008864323B92 -sub FA6831EE37606774 ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQENBFTDM4oBCAC9cUMAjkP1dD7tt0JUI5kVORKagn4/zG6+Y2MUwGgJs481xsFC -jXPuNZMucAVtXmw5Sl7FbsfSxR/9jJ2pnbXL918eRFbUqY4LnuOTZjcgNWo8PWPc -0NLmqoLj3HXaLrpB5cRIXaQvzmfoWxt8o/ZWq1zSfDJDePuQb6qlWmnoDz/S2YJb -f2AILPsljTE8kYIBHORGilKtUXtQRjs0SCqnbx+DSDAVKSnqYHWDMmxgBMMQsSE/ -RQ/EZ7I4eGRLLfONCxox0fuIt4kOLuMNqGWQlqiG2Kp6Uulx5SepToSrPZLyDGVA -MgefKrKe/lzKiLeppmx7ELXOKBXlIvTFZBuzABEBAAG5AQ0EVMMzigEIAMvOlDqi -K4QHjd+L+UCr9mRlljXOq1ou4ngvnZ8dg+JJr5/gS2gl+4SQsjS9Xsdk72ZYV7fH -IAPIwFYDefmh02icKXEx1Kc8dqeVCHvaAQBKttDcoxdz/aO5bdQuVdW+9RCjE8Ez -kn1lHCtEpM+Bv/oJITY0lX8WMGTtb/gnuJkQgkYusfKRRh3crpFUdMCf6PMir0Io -1HIhjBG56Qwu+jdXgEIHdMKO/VlhmbcvsP6kEpJ18E0ydNvC5bprlVfFJWMWf3mG -Eq7StrdsPulBtek6hwEwxZRMkoc2CQnq9h9X5khlp3GWeDg0ApDczVoqz5/qv0a/ -AgaOz5TFFdOjimUAEQEAAYkBHwQYAQIACQUCVMMzigIbDAAKCRBrGwCIZDI7kmTj -B/9ld0zPal78IhrJjtprGyLWvW9jG73ZSI+xHyPa7dmsz42Ey4kHGFlp7SjerWJg -etZCt6swEcHFvKSUNBYjqFxBvI6sB1M92yMRfH7W6t6Xi1CYtNzw0KDZU6Skbo+R -L1ezNX9bmRmilOVvPgVVcTqvHsTHsg1PvD4nx5lvUtYhT6qtID6o5Y5c83CGR/yT -O6aufbqI92Ljc9l9z63kD11Ws+tOyV1IcSeDCBKhMv6ow+ThmUSkK+OHksZO/d/I -/NDnAWv9SG247xrOaItiGIBM6Vdyhg1PpEgx1binMJaFOajAtVb4a5IpXW9t8LRQ -UWCKYJHuhwXGkDiIrwmrUmwS -=OaPQ +24Dfk3nY/7Fts1cAEQEAAc7AzQRgKH5vAQwAtUfCR4zPD/BxRugpwRSaZeaIaDAO +fjFpzjtT3HvkmAI6pATX7gfG7mpQus+UIss/U8OYPY8r9BTBsamOMS7DhjEjomO4 +5D2xBrsdvNFU6bDSR3RPiGvhdrfsPcTigDGrCl5dw+xRZ7C2mOiqMulMMG5pGmn/ +HewUWYz36zZyLhLrXjKmm5aq7hf+7vDkJtYVgwqX83lqorlFhgwCA9SqwjgnQ0rB +vlSzMW5q0V69O8My7A5/0t9buS6fXezRn7/6FYaU2GTfxqEhHw9KvjJPWlHbvV1R +AoJO1lQULo5tUBhYBoTOsnZe4kydseOlyK/1appcUul1rt4ThO5yaNTf5bb2RZ6v +22zjwSQPwe/5rxMFdfMrwoGLQAJQmLq6ZrUNZ1STq2p7YKeLCKtHNHWZaEp86ZCq +vjzukfmHSMxI83wOHLK7DgR/YEuZNCa9sNi/1vCR6KyyQqODXTw6hY6J3W1te50V +09Bao1zwVU8yV16TNrhwLioF36+NVwoesTHfABEBAAHCwPwEGAEIACYWIQQUe2ka +GQl2JJAvTqlonL5k9LyZfwUCYCh+bwIbDAUJA8JnAAAKCRBonL5k9LyZf0/FDACf +4uY8Ko7qKDR+yCKc6FRqgzZBfoD/8iIUNdraljdsppZ/ksBim69EDIywY8jdx4Cf +B8VIxeOS2WyyYPltAoWKwS4K4VDQH52Uw7/4FnUh3U2V2LzIpFN9x9+A407iS4oY +o3swpY8Ffr9wl8CnAdXtC5sYSX9v9Q2M9UW/fhAItTVkWFUoc7nzabQ33h3CTBOF +pBBlf+in5xPaRIINafvOXfwqhhLL/pOHErIhYqKaISm6DRV5EcOhjDY1TJW+J2P8 +XeOydsSI1MfVGmkPNe4ls3tz9/FoACGUCDGe3+G+sQI/KWcD3wI93W0GXxDogNyB +teYhr+MtL5Gq/lDFQ1iXCFwU/1bFTxHDPEgej1KJVFRotyqK3l5Uj55ltwv5Nk/l +vzC0ugqvX30SPYXE2Qvf4icV2NMfYivpFmmap5jg0jq6MvjWJSu7bRHNM0IBADyO +CYIyr2QPFrKSnN1K8UefKKPLAJkHWNuU+3GjZSpE7+qE9+pKShVylabGCI9QU6s= +=NfCL -----END PGP PUBLIC KEY BLOCK----- pub 72475FD306B9CAB7 @@ -8019,26 +7299,26 @@ uid Daniel Lemire sub 1723844CF9A045EC -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBE7+huMBCADW9rfqKBXOqUSLCK5Klag5WqLFxAOddqEM7wTx/42XaIKjDiAW +xsBNBE7+huMBCADW9rfqKBXOqUSLCK5Klag5WqLFxAOddqEM7wTx/42XaIKjDiAW gmFnV4XBKm/7Z4fwWq7+ku6NDYUjBpI4vcQ2hYJJ4SRWZHT5wWzOmqgznf+/Qwug P7Ss3EUTRGX3LnhKhKN656XQhM0PutdsHQlUKjvnl2JOaKerEhbHCRxga/U/WWOT KdobRO+x8v1scsrnUG83J7sTSaja0McmgUhKrhJqrgSk1Tod45SxprxOyp0cgATY xjHrf2rkafBn7K7aFDe8a73iCJPWS77gxTZCZ72xkcnMLR0m7QI8TzFa4lRjTovA QcTpr7jwjmyjA1+68peL6VHdVr0cdXm34mTVABEBAAG0IERhbmllbCBMZW1pcmUg -PGxlbWlyZUBnbWFpbC5jb20+uQENBE7+huMBCADS5gJ9frZF9KUorujSdK5GmZTG +PGxlbWlyZUBnbWFpbC5jb20+zsBNBE7+huMBCADS5gJ9frZF9KUorujSdK5GmZTG 75MXhQLLR3UOczqElryVfudgwHfofBymcuiPPfwSNWpWLeylgCxs49SOrNfh2r2m Cln7ZO1LwDOoRIfD8xUA+TTc4qbQzo0xt6M7WdEiuhLdxUGnM8s4fRsjwvN7wvA6 +PGvgaeWIKaP+S27jZaKbVSGqR37Vuj1JkbsZV1V4BXXOb0gyNsT6s/Hcy0owWtZ kVBIgBanYui9J2uosgRMhHeEJUO05w6ehCoAkr2ktzj0QRDmljmbGjiHEsOcO7ZD u2JQyI25bVUCk21S1CEdIfZ4xmiV5Rj2Lwxb7LCDEe+umc+W2/7j5RtR7RWFABEB -AAGJAR8EGAECAAkFAk7+huMCGwwACgkQckdf0wa5yrcgCAgAh0VKQHRwwov6YDV2 +AAHCwF8EGAECAAkFAk7+huMCGwwACgkQckdf0wa5yrcgCAgAh0VKQHRwwov6YDV2 1H0/h0vv934brwNWxIPz46WVa0xI+fmA0wYXg+1OTQBy7rqJHWoK0I3M6qjZvvaK o77yUUtdye16gf/SxKPUwXMyTg98ojOvq7orvDF0ktE59stzayjUs3vrR7xDh/mx pwiCN602Jk27vCCTdg0AHbu/CsK+Cu1rkqlqa9nQ0O0No0IiGJdDK51/ZluGBhhB 73xQ+jqgAf/g1qabG0Zyv2N+5tw+Alp9sqDsfyA119B6q3xKoaJqo+9h+zQ0vpZr NMuph0EDebGxR9VMiO2F98dacAm/Qr8QTyRj4424rkCSK2VbZtvalewylY514xg2 lV/Shw== -=qKIA +=8Yuo -----END PGP PUBLIC KEY BLOCK----- pub 7457CA33C3CE9E15 @@ -8047,19 +7327,19 @@ uid Colin Decker sub ABE9F3126BB741C1 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBFIXyRQBCADe285y3Pu7KzoKyP6wqeNXtvvuwMatAmPm5x/i+S8MlryqzsYa +xsBNBFIXyRQBCADe285y3Pu7KzoKyP6wqeNXtvvuwMatAmPm5x/i+S8MlryqzsYa x6twUmXV1yKjjtGrO+9fHvTOWBfSSP+fP9KTaTQYSasoJq2Mw4cQDy1i0zrxNZUw N4/BiyjQA25sdfaOolhO0sFlZuTZpYy5wG72KkA1ygNq0L+8aBKhEF6zDU61YzCC AxjcgTftgTeeoqkJtYa06lNz3jmJDN+zUQignfRa3ymoGtFHTzoXR9maE8RWDty4 y+DY+8ibdGgSgKPZ0byTCDyNojgU1YTlADa/1/NY1ShYg617O1xicLNo0JEJlf2U Tu4Ymql36+xSkYSISU97Q6Utgq27XMuZvDUDABEBAAG0IkNvbGluIERlY2tlciA8 -Y2dkZWNrZXJAZ29vZ2xlLmNvbT65AQ0EUhfJFAEIAN9NHRd2bYP/3CDi+n1ilSCh +Y2dkZWNrZXJAZ29vZ2xlLmNvbT7OwE0EUhfJFAEIAN9NHRd2bYP/3CDi+n1ilSCh ld0NR3DUBgS/AdqQ7IoAUfj7skyI/WyaMdV4uy6vRh5YgNg2g01nd0LLZR8Gf2Ck +D6F88CdZaTxlkcxHV/dXMZ8yBO+0D6yFRZEL7Imsv8Ig4QXOVwfuiXEPk/Ef5Dy 9SdAVhcoErTGGR6BOGVVvexGtBwefsjMaOG0khkRbWIQ32WxfUFuAv5XBQ0ckLrl KvYWUYhOlXg27GtFKH2EBBF0Z5ZWu7gaBFwSV0oLp9EWcD+C+WEwUSfBdqfRJtyX vgf4kZdwdQ5caM8P2/Sdncl2l/LU1At2Smc+plr6zhIhDlLhlrzKGa16oARSBdUA -EQEAAYkCPgQYAQoACQUCUhfJFAIbLgEpCRB0V8ozw86eFcBdIAQZAQoABgUCUhfJ +EQEAAcLBfgQYAQoACQUCUhfJFAIbLgEpCRB0V8ozw86eFcBdIAQZAQoABgUCUhfJ FAAKCRCr6fMSa7dBwURMCADHrqwRNHkbG1QsXJr9oUK6KVkLsPhcngIhxRLlqe89 omg9G7eGNauzs2PKsB3txotCFc7ROVNv/TAuSDYzkPos8G46p3bGesjfJb24zc6G MT4RGIJoh1oNG1IciafIIHjp2ZJHRmEDwmvZG24OHJ+mlHLjaedtqlWu+zwwhH2V @@ -8072,10 +7352,12 @@ KlNSs+aVM48UnQeFtTDyOhwa5jvtqtst4eQHwHWQ99BK0TEymNx0vF0nPjWA76CR rfopOwXKdxJgoKq4MrxE92ot5I82AZBPeiWVJ+6wECeK/GoBIXZ5jEUqrQmmzIbo WA5G5PMJ8egzLJNRJjTWHjCWrUTnwNcqaD4/qZxIlW4Lt0uvGlx6pKOJQ05u+9X/ BzoVWrw= -=fJQM +=nWoM -----END PGP PUBLIC KEY BLOCK----- pub 760F395DC40D55A7 +uid Dimitry Ivanov + sub 9BBDD59B9EC621AF -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -8084,33 +7366,36 @@ UZl90EYkT1aYw5tE5c/SLsUE5LO3EmrGK91HFpYDdAajg+WEyS8UDPA/npFPvoRY 72rgPTZOd/i3b4k53A1h1OmXjBN9lKwsBQ1E35UDZVoWkEuZ0SlJoKv1/ckzISoU 11Opj7m+fmfCpopRpDHQ8hbRSqofhrOz3HJtUiY3FezcjatwHgEcgtVJjr872wfO ZnVFx9uHMTD9gURQbGT1Wc+A/q4whEhatuI0DKcPrssVQ5Z9I1XzYlhgzegzJdk/ -KZq35XNYfwfPyZ7n5CxmNu9wk7z9wxe4VDTXABEBAAG5AQ0EVJ/5nwEIALQR8vdn -Jo6yAfIMlMCPHGPyzDL2qGwZp/N+GbpJAJO9gJQzUvrL/uijy3Obw4umavIgr5Gh -bZcUffzFFU3dIuu77BuHH3DLOpdYQ0MQVYc3ZV0+2r7suaSsl0V1nmB5XBzIoKdo -wXGcybgDFH4IlxP8d+cp8oppRO8tNJy/ls8Wj48EguiRcBTHm//kdOMQUZ71z/3V -yPwNrn4pd+U8X7sIobqU9SsE9fFm4SDBpr/wkcxxZ6YgkYu+V5ZT2ESKO3h5LEiR -KjmwnjE10mempty9zxIrtOuD8QqK1EDbbI6OgET36ajM6znmMDjmeEhsua8jc8Xm -BuS2yVy5p2yQEkkAEQEAAYkBHwQYAQIACQUCVJ/5nwIbDAAKCRB2DzldxA1Vp5GJ -CACXXeNkGdhDcQBfUWD8HpaNPj7EWBzB8RkqvLv4iKDi7uirUxNOYaJ6x4LagX9J -WUdmPLLanwQJPrF1Oos5T8XsE6gRXYM24yDN+tJj5H8KgDuhbXOyAFmFui+hva2+ -8RCnxq6i0qNt3rp0ZlSF/6+MbcNx+t7dr+963QG2N6iu01xPJOpoMWHtVr6KRVaO -wdck3zLViXDmxOcUt3JhIGtKwRMO4mte4wmT6Ko+Nj4uy6tFjbTfN2eBins/1F9q -LU4YJUqC4QD48TvN2g+mJng83sC+lG2Wcyk5J9jaO2vvRRELwdplgBPqNmwVaQfP -IVnJtxjuqGPv22HRIgeCE7aG -=GYfa +KZq35XNYfwfPyZ7n5CxmNu9wk7z9wxe4VDTXABEBAAG0JURpbWl0cnkgSXZhbm92 +IDxub3RpZXMuYXBwQGdtYWlsLmNvbT65AQ0EVJ/5nwEIALQR8vdnJo6yAfIMlMCP +HGPyzDL2qGwZp/N+GbpJAJO9gJQzUvrL/uijy3Obw4umavIgr5GhbZcUffzFFU3d +Iuu77BuHH3DLOpdYQ0MQVYc3ZV0+2r7suaSsl0V1nmB5XBzIoKdowXGcybgDFH4I +lxP8d+cp8oppRO8tNJy/ls8Wj48EguiRcBTHm//kdOMQUZ71z/3VyPwNrn4pd+U8 +X7sIobqU9SsE9fFm4SDBpr/wkcxxZ6YgkYu+V5ZT2ESKO3h5LEiRKjmwnjE10mem +pty9zxIrtOuD8QqK1EDbbI6OgET36ajM6znmMDjmeEhsua8jc8XmBuS2yVy5p2yQ +EkkAEQEAAYkBHwQYAQIACQUCVJ/5nwIbDAAKCRB2DzldxA1Vp5GJCACXXeNkGdhD +cQBfUWD8HpaNPj7EWBzB8RkqvLv4iKDi7uirUxNOYaJ6x4LagX9JWUdmPLLanwQJ +PrF1Oos5T8XsE6gRXYM24yDN+tJj5H8KgDuhbXOyAFmFui+hva2+8RCnxq6i0qNt +3rp0ZlSF/6+MbcNx+t7dr+963QG2N6iu01xPJOpoMWHtVr6KRVaOwdck3zLViXDm +xOcUt3JhIGtKwRMO4mte4wmT6Ko+Nj4uy6tFjbTfN2eBins/1F9qLU4YJUqC4QD4 +8TvN2g+mJng83sC+lG2Wcyk5J9jaO2vvRRELwdplgBPqNmwVaQfPIVnJtxjuqGPv +22HRIgeCE7aG +=t42b -----END PGP PUBLIC KEY BLOCK----- pub 7721F63BD38B4796 -sub 4EB27DB2A3B88B8B -sub 1397BC53640DB551 -sub 78BD65473CB3BD13 -sub 6494C6D6997C215E +uid Google Inc. (Linux Packages Signing Authority) + sub FD533C07C264648F sub 32EE5355A6BC6E42 sub E88979FB9B30ACF2 +sub 1397BC53640DB551 +sub 6494C6D6997C215E +sub 78BD65473CB3BD13 +sub 4EB27DB2A3B88B8B -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBFcMjNMBEAC6Wr5QuLIFgz1V1EFPlg8ty2TsjQEl4VWftUAqWlMevJFWvYEx +xsFNBFcMjNMBEAC6Wr5QuLIFgz1V1EFPlg8ty2TsjQEl4VWftUAqWlMevJFWvYEx BOsOZ6kNFfBfjAxgJNWTkxZrHzDl74R7KW/nUx6X57bpFjUyRaB8F3/NpWKSeIGS pJT+0m2SgUNhLAn1WY/iNJGNaMl7lgUnaP+/ZsSNT9hyTBiH3Ev5VvAtMGhVI/u8 P0EtTjXp4o2U+VqFTBGmZ6PJVhCFjZUeRByloHw8dGOshfXKgriebpioHvU8iQ2U @@ -8121,304 +7406,418 @@ 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 -c8LNGrDaCFdXnOdlNV/zT9VvBk/RkV+Tl/Lk4g== -=AP/d +tFRHb29nbGUgSW5jLiAoTGludXggUGFja2FnZXMgU2lnbmluZyBBdXRob3JpdHkp +IDxsaW51eC1wYWNrYWdlcy1rZXltYXN0ZXJAZ29vZ2xlLmNvbT7OwU0EZ31b7QEQ +AMEWM0g1KKIxE7q8JK7QblKom7++NYn92E3suHv3WxqzrhRT9tYNDSaoOazQP+ha +NA2BqkdFcB7G4jKdtK2VLFc7RBpcR2rnQEJWgpeP03DHrdZYFdpH9zABoFsotgZR +KwwTOoxdm6XtV+47LEY9yAefPrt1gPJQ4h1SKwWIFSRPChQ1cThBz2QD2LaPAGtj +Wzr6+0xf0nm4xTDvya0EbdTpMOvtyDCUp7qe41u34RelGxoo0+rmoL/0cTJGCr2L +3xWijlvWCMLhp2dgVnvRIpvo+tOSSl/pvTCLgE0nFjNQFbNh3D1Qo/AHhEz3MzbQ +9JbEy7MF+fiw83YULRKN1kZ673Z1ng1wLA0m4+EWrh/PpMPp1raYQT0fSqUkiGBo +25MfIjdheAuTgUf/4aHKU7vi4yFwxr8DWcKrxiv7g6xxbFvI3p+/wmyDbLXBBh2c +iqwQfW/H32TlfL+cXqtapB93L1xR4IPTRvMnIVJBA+J6I/jlqx6RqPABemHudFvL +2sAJu91lQjL5GxEmgVNL7l+UKGsy+h8mg4Sonnw3MI1c1KrvvIhJlkTpqiCqCnaG +BBjZQWkuiyVJSq8VLHq2LxlWJd9nt73MpOLgj79ylD5G7OQEVgGBbvKwqdRYvKik +8UTYYu7sTolNFVNMvQoCIJxropO/xk17qK0a4LtaZ8oVABEBAAHCw7IEGAEKACYW +IQTrTBv9TwQvbd3M7JF3IfY704tHlgUCZ31b7QIbAgUJBaOagAJACRB3IfY704tH +lsF0IAQZAQoAHRYhBA4iWRdBRnD0RCwlDf1TPAfCZGSPBQJnfVvtAAoJEP1TPAfC +ZGSPphkP/iHWjnYuEXC7uKzt+zvsqjkGkGkXVApXgZGm9h1/ujlab0FK+9VA1JlV +uzqw9SBYuwUwkGX0TVVCCc5KAxDa6sYH2IggcC+dN4ZjCMiUrJlEHNVE6f7Fjg59 +STScr+jWOckKnP5p2x4xmH0kZX/rkZ+90lfniPUvVt/g5aunoEQDvtMOZBn3Opgx +4zOWxqK4vGMtF1bhFUieMtg5B3E5jlNeNwmkDYV3MHGu+oMYy1TFMA3OQuTOz5de +D86xE73hK9HQ3DBoETPIuzlYXP0qoQswVKBI4z7HjRLmfBQagXCXj+64LEUaumAZ +lWWV3zzxZnAk4kzJv51+vESxaMm6Ll5VG18MLrzv3Zi4Ez4BMr7OjbAnxfcgrsIT +DlwrweCYC7Rq9fWw5USyk93h0kNJ8AVT6CG2a5/LsCztfW4jkg7LFDWWkMISoN/r +CaR2sJfvy2aijZ33yAWUnEpWZG6+8811YAFdn9g1bnuWLHx9Z7q8VjalzJhVFe9f +8Mhwk2K764VUL7pnNNYxl4Kj0oTAqVVGDZoMWHCcE7nxqGbzjn8H/unTY0vtK5k8 +BPyuUt0Dtel8fspjlDl5o5VbeBQo6cFBEzZSd5rbavXmtixhL7CGKqCWaHbJ6OYT +a85W14ndUmRJ5qPdLcYakdl16Uj/DrFuKHOPrulgAbs+hmgm1q/nYdgP/3UUMgaq +xU6efsiWi3M3pz9nTu0mcI8kpJzvfov7WINjLLu2+yVRyRbS98473Zr6KS49BFqO +XNQBmtZl77bcz5shfhPxoKLd8YJVayvnBQrjCIE1CACvmJBZGDZSNY0vEa4G+n6W +T3DwEan6plZ3/xM6s4caZfP43ZZkEiu1M1svQtgzF98HFxAhX5oLyMPwx8R61X0X +tKxmjVbNrTBwRfJf/FRDmmv5qSxoO2g1gpbCcm2VGoGBvoDws95GvPFNlWUes4xQ +MclIo01JuynJGLyOaEm19TXu4T36ulCTO/b1lGIOLi+25vpFKlwBrD6yq4yrt81t +6vGvtI1pZrt1Wcm7hce8CFLrzfzo2D28yHPIsT0YvK7AnwUK/SMKIV1EUNrLIRhn +TMBnP+BaOF0HxcAYnlRLSwScPx2pATglHmIvNcRkCsfIZQOXjn8lvFXs7lnkP5KU +F5/+ccsJj8kEdzcsYaczQe3wY2N36ibqRPOfPeVmPFAKPQsUdgx47cAPKTm6PxIp +73IxceGXbkOXJ7W1lqVPKiwQh09RkwWpMtJA2HSdbmInxBiE71tJqSxQpp2EfNXO +gWTTrs46lkuW39I7dr0NOAGomeaNnOuexMmlTZy2Rf77BfozRZIZ+RAYlZu5/W1E +d2X4iR8i76QET6ICFmgxADKzB4WnpeBaBqArzsFNBGW5WnYBEADEptUD7cowK13T +NYtmOuN/SXPwCct8pFY8U2g4up+c+5YEIqWkAUqVm8Lp+DqdFuX7NbfK2BNojwPy +iqKlaBAN6Nx7bO9bjSvlbbZBrVJ3mL+k7xrFdTGLeDSSTlEBesj7FXK1zK7SW9AV +3n45lmOLAXTC13VQ3K0SEXb+69FwXr31/i54NgTfM/1LcJZhIoR6MutHJCSYKuO6 +ZHxYaOdfj48BGSWj7RIEbF59rIEzDR7pBk61fLm/2illTQTxdMGGBeSwNjR4Fade +PJ0tdReDoIjaQpAGZiUAj5cqeHpmH8ZIoY4fk2SsOinK8cDgse2HnHiiusFr6xx6 +8IycZdp4WrQyGDSJZ1ZKk5QaeAPYE3QsZnImdcV2/kJZS8nAWDFoLtpaNSpONDTn +1ZYyCi2rWPPF8JiVMkmCxsl+ZHjyNvZHPslRsnGB7EoKDpcjP1cPhl37o/wUYpyi +LYyE8W+mDNucH4YHLVHq/zQGqO3V6axTA1Ds+gu9tHV/3+yErIqpou19VOfPKJjY +C7yfzvID58jLZNYFq8IRWQ5VWCOQJWMcdzMKB57S2Zb5vIhJkfl/S5ISMGXDXb32 +nyKVfvC5TmiMbfrszc3DLAxwhqJlAH/xmF2yPP8dYh6KKWSIffVGTm38scs9kkm1 +bVBAR18ilx6dGxVjNSM9i30MMXjUUQARAQABwsOyBBgBCgAmFiEE60wb/U8EL23d +zOyRdyH2O9OLR5YFAmW5WnYCGwIFCQWjmoACQAkQdyH2O9OLR5bBdCAEGQEKAB0W +IQQPBv+Gvur05xhm7lIy7lNVprxuQgUCZbladgAKCRAy7lNVprxuQpgeD/9UZ1yh +68qd1JWjgKv1ABdmChUvTQIIFcB/D4bBXOp2aa7nPghVNbOY8ArlvWoloEPk4wRb +0NIf2xy27o5U0pn8ssqPyI/uL0sUc5ZlGvJRz6sqr+3yLEPNgALPFhP5lfA4n9uI +bMSUmRB9d9A05EarZ10tBQerDkDxo+RCgBbd79Lzf2dUEV9ni5mXNozu0H5HUbLa +7xd26K2+8XbduvzzPIPEYGGhvn6iCfzbRkBdFyPllMbkPprURhMlaS+Kp8MJ6JMs +Y7DMbCb7xiGj1CykdQmoRiQ+LQJchNw7zYpDESNkg6I2hsoeXMNuJiSVWZseOu0N +7ROHcJgLvKQhgpXVEARunqa0y/1mrsiXJpCa9arEiu4MsflMvJsFxEmP7OW8A5M4 +Zc2idFowcal36BxSBJRyX4S0tHn6iK+jRZj1LuHASiSqGaBQcEz00xJls+7RNpg4 +FTvWekPX6uwsGUuifxnIYnkIAMt0cZuQYswWbForGNwUOCV9cOsB9AmnuK2Anm5L +rRRVgYOyQN49p5IH87A95GB2H+QZZS9slefPXRKHDYz4qLOerz4uZIPVEDhTtUml ++BH7tXgKzXDbXgcSn+aR/KJA3II6o/cl2UbOnyNlJPc889FC+t/okUqko/Cr+onq +SwszqYdQx52NrRYIaUhWKpWsoXaazCVZOxpixaImD/9Z0+sKvJP0Q0t/1uxxASfE +bcbNby+dZ1NHuSu44G1E/ZGhtigZpZ0W4JBC477tJV+syxYsj3HOSZLxNgMn2e7e +XCH2pzkuIXNFvQuukUKNnL1MZJ9oLQqzOygk3NeiMHv7jAtkTRJ3jS4gnrcHOQ4a +Y2BMUefbM80PTacd9aXn7JpEsCnbrRM/Fvepdvch2ICA6C2Ft2+p7gUQX6eJwF0N +YFqnxJhTRZSmQWtqT7CjZRYKXIQvhIjEP3W9RJVTclt/CuyDseoTRqRAScGz7hzX +n/VlN59gyCIDAR0xz72zR4gjU37jjNfvwTG5iufUZluuk0tFGsWbLMBxy2be7zTe +0is17L3k/fgNXesGZVaMvGN4MpASpwRxkWhjtM2l3Mx7eGLFAOC94rOpQI2yKKVO +TN49hdURSka/efh2U/zVzXhmxb7HSprz+BC7QwLmFTIGEfBqoyOcj/3HFTLIv5oU +/nFMTvxe/u54scNRqOt+yaq/zReZI46wQ/BIhsvEKxpurgUdzRmndAZzFimtmKGC +hdZtxbP3rwZHMpkfoUsBc5F5ulkjm/IcySGshWupAHO7kiskeYhtNKf53om26jNW +lAEAwcFe4PcD5nHUSIyUtjLStSVx2QkdYFSm/hDm3LekSTlcPLOfBEuTvcBmZm1b +SGfiR027h/rYNBKETXAm887BTQRj7PlYARAAym4Cy/rwGmyldqxkg4GPiLbUwLYP +cPVKK9fkPwiFhsYvyUMu5e10yo5ktML3cFPvX/3hrI8YoG7wHErFdbM8in1UEBU9 +pvSoQ6wajQgL0OU4OmUHTXudaB8I4iENYu8/EKE9tlbnHU2KnDCwB3voNGjaiy0k +liwIluM/p3q3JYp44k0QsP2lmSUdaM0HdnisAMOq5NfWx3IoV6NhNCtRA5nR3DQP +MrcqccFllwX7QmEVl4uSdNhnmWs8Zsfw1C5xYMtieBtFC06hlrG3/7Qrdto6oMl/ +rxY/7CT5/pdyCaqcjWOcgRuhnHo3j/b0aEK2qRqh5HMft+39r48JqY+eePCSOdih +AtcmXhcKfB4xi6fsxmo6Z6JKyneFyR54lvfmzy6u2KezzZ+uTGmL2VI7+XpyneOX +xSuryd2LP38ejwVyigbPX5USIHVzikr7VfmxiBtCP6fyRGf8D8UYMRzwyuY23COi +gVZt1JPghxQuCAQLc3Uoeh+GX8NRB93UGTC1QQf0o9+FEIZcADpQF7WR975LPyqX +JVivIJ6s94vBzdHs73J0JUYkTvCKpTffz5hamXjU3q5JU+07dI16oqKSxy9BV0di +7J3XjkX8QxNa4VTlMZaHriLGPMeoDvIdmxoONWGqUTo2MWWRHGpIPTXIeFwJcXqg +eCErbX24lcXi9g0AEQEAAcLDhAQYAQgADwUCY+z5WAIbAgUJBaOagAIpCRB3IfY7 +04tHlsFdIAQZAQgABgUCY+z5WAAKCRDoiXn7mzCs8kblD/48yE3Wpi6Cw8RBzq2u +zLdkuqXh691zG6VhHUZQNb85ewGjGDu/D25u2JFrhAcmlzOrxggvL4a8WatPXQaP +qDZaSh41elM1Ya0C7cNQq7xNVA0pcN5bQ+KXXZMuQaA89BClTSXITz6j4O4pvhAG +8y8Q2E9Mv7UYas0OhDgzVIry2s1o2Pml1qjlb9jctO9crRUiF6v9Ru9aQkgGHYt4 +uyP3HzKDfoNuzX/WX3O0Fm8NNpnJk6qZsLKwg7ukUdJOIEIbLLNLU9ZYmys3wNtD +KMfm4T79abSNwNIn4dd5hapH9BAuDJnk4WnFOap9AQZPgJX2WXKC2DXQZeSX1VXp +I3rr7FSbSec8d5bitw7s20XWyQB2+ZoetRxNgR104GIh/LajtatLKFc9NnP9Smhe +y8nrxVZFx6HuXsnGOPkbjsiFYMsxtPVYnO72nBDTDP4ZejLOaay2KtCb8pJkCH8U +0guquDGVd+S02Xx947evyvHqGt5V0yVFPD7uAu7A5QBYXvtctzq93S1jZDIoMP93 +Oe8VpUrXBBfizzHVxP6VUmxM97IE+gjVRqN9PuMrp2D9yEBUGk44fQW5zyuuomYa +c7Mpx2fnWgGA/Al9ug2uvS4oIzUyLEJxpc6M8RYluacSIjFgCigucRsvTBy6lobG +1FMvnQyze6+fAeKbbrK85OuA1KW3EACfsMyLwntqn+Qu8r3k/6IRn0i9XV/bhStE +2y6iHUmqs5sd7dfkmVI7bspoOuDKFIErdTephH09E0hvQDJERnMm+rh8TlZtOS/w +Yywx+2ahSh5Jt3dI5L48ozR+WJbExiXq8ZqTnpn/EQGQ8MoM+S2dS+czX85ZL+m3 +ig+tKHwaaXdvGcYI3h8WwQnX3IBUFCur8WSdfcoGyiQ4cpTXcI11GgGgkypxM8wx +xoLVCTttpCBRCpPf8/PLKMCK0/k3u4QShtp1WDDQVhFm/E6ofG9TSGIKcJmsHHQY +7rukEp6lSIvmL0ZjByRah4nK5zoc2j89sNpyuemZwr9X+V9LOjF7vQTO/8y3cBBN +Ct0R5lrxeBvRze15k0DzShuHyPhg2PBqfPOS7RnUiF2FeI+zQ7xFnLqoD6ckI76R +RAf7w0sqnvMlDRpjVU+cDyupR5NdB79oPXJpHltKg4kaQ4O5x6BXHVEpAMhJc8bP +vmfAiTFac5f0ycibf2R5tNlzbKMD/BxVrzXMghsJ5PWmAiUbqPv1II5kLw51b6Bz +vl8KzJI0h+ySiUGb86yecfHGbF7zPRch2Kt5+7t0fgEjAVcMRfcgHsfQn8EYP9zo +czp5Gw7LvR8BBDq1dsTEEEPTDre+HyGxpDN4c8LNGrDaCFdXnOdlNV/zT9VvBk/R +kV+Tl/Lk4sLDmwQYAQgAJgIbAhYhBOtMG/1PBC9t3czskXch9jvTi0eWBQJj7PlY +BQkFo5qAAinBXSAEGQEIAAYFAmPs+VgACgkQ6Il5+5swrPJG5Q/+PMhN1qYugsPE +Qc6trsy3ZLql4evdcxulYR1GUDW/OXsBoxg7vw9ubtiRa4QHJpczq8YILy+GvFmr +T10Gj6g2WkoeNXpTNWGtAu3DUKu8TVQNKXDeW0Pil12TLkGgPPQQpU0lyE8+o+Du +Kb4QBvMvENhPTL+1GGrNDoQ4M1SK8trNaNj5pdao5W/Y3LTvXK0VIher/UbvWkJI +Bh2LeLsj9x8yg36Dbs1/1l9ztBZvDTaZyZOqmbCysIO7pFHSTiBCGyyzS1PWWJsr +N8DbQyjH5uE+/Wm0jcDSJ+HXeYWqR/QQLgyZ5OFpxTmqfQEGT4CV9llygtg10GXk +l9VV6SN66+xUm0nnPHeW4rcO7NtF1skAdvmaHrUcTYEddOBiIfy2o7WrSyhXPTZz +/UpoXsvJ68VWRceh7l7Jxjj5G47IhWDLMbT1WJzu9pwQ0wz+GXoyzmmstirQm/KS +ZAh/FNILqrgxlXfktNl8feO3r8rx6hreVdMlRTw+7gLuwOUAWF77XLc6vd0tY2Qy +KDD/dznvFaVK1wQX4s8x1cT+lVJsTPeyBPoI1UajfT7jK6dg/chAVBpOOH0Fuc8r +rqJmGnOzKcdn51oBgPwJfboNrr0uKCM1MixCcaXOjPEWJbmnEiIxYAooLnEbL0wc +upaGxtRTL50Ms3uvnwHim26yvOTrgNQJEHch9jvTi0eWzxkQAJoEooabuFEvyaFp +0f2nohX/bqaG11Q5wZ6jgF4jFGhXkvoVLoeRFlIQyyFmL114T2nL26VDpccC7CyH +T0UBhkqdf66oVUZ5lrCd+A6ACsRuxJavBAKyv6Rfr+MElDHoIwDyUHryHC75vN8/ +ox5m5NQBHoqAWE6uOUW85R5si5hiv809dypwVFhN7BZBAqHKPrzJYvKD3i/iTH4j +ID29rw7PufGJR6uVtuqXtPAcBs2OS0DOybedqMbKoFxF/zfeUKoEnLHOtucAiBPP +0KOaV09EypPuVYhaI7NhIt5oFxwVxYCEnQLVgRJqjfUxEqjz6x835xZPbepj4Na+ +Tbd+yCju6E87u/0l6yZVzyEPfTZauhzv5jFXWI21hQT8PPjRlRnpkHITjg2bJLLx +yRleIIzKVtRQt+zETbImotVDK2lcc7KwrXuP6KqWu22PFXVsOqeZr33a6C5MB1tn +EtpYAvH7e3uJ6Yh11ywCIm/rBR3KyJGbtLicRgiTpFMJGg6wBSls2WB3NmFK1uVz +ewjQaP33vdK9Vvf+HrJ+fUjNpkzGq61J9X4hMcBYlHIuFPt/+1OCIlYjXjaGdidf +oasbnZcdTk+wHtloOHSwEqBB2jCm8uPiVVYnAPI3ZaHKwm6RL9YVVeO4cIinPlU0 +BrwmarPHk/qW58NUXnHddyfTcu2zwsObBBgBCAAPBQJj7PlYAhsCBQkFo5qAAkAJ +EHch9jvTi0eWwV0gBBkBCAAGBQJj7PlYAAoJEOiJefubMKzyRuUP/jzITdamLoLD +xEHOra7Mt2S6peHr3XMbpWEdRlA1vzl7AaMYO78Pbm7YkWuEByaXM6vGCC8vhrxZ +q09dBo+oNlpKHjV6UzVhrQLtw1CrvE1UDSlw3ltD4pddky5BoDz0EKVNJchPPqPg +7im+EAbzLxDYT0y/tRhqzQ6EODNUivLazWjY+aXWqOVv2Ny071ytFSIXq/1G71pC +SAYdi3i7I/cfMoN+g27Nf9Zfc7QWbw02mcmTqpmwsrCDu6RR0k4gQhsss0tT1lib +KzfA20Mox+bhPv1ptI3A0ifh13mFqkf0EC4MmeThacU5qn0BBk+AlfZZcoLYNdBl +5JfVVekjeuvsVJtJ5zx3luK3DuzbRdbJAHb5mh61HE2BHXTgYiH8tqO1q0soVz02 +c/1KaF7LyevFVkXHoe5eycY4+RuOyIVgyzG09Vic7vacENMM/hl6Ms5prLYq0Jvy +kmQIfxTSC6q4MZV35LTZfH3jt6/K8eoa3lXTJUU8Pu4C7sDlAFhe+1y3Or3dLWNk +Migw/3c57xWlStcEF+LPMdXE/pVSbEz3sgT6CNVGo30+4yunYP3IQFQaTjh9BbnP +K66iZhpzsynHZ+daAYD8CX26Da69LigjNTIsQnGlzozxFiW5pxIiMWAKKC5xGy9M +HLqWhsbUUy+dDLN7r58B4ptusrzk64DUFiEE60wb/U8EL23dzOyRdyH2O9OLR5al +txAAn7DMi8J7ap/kLvK95P+iEZ9IvV1f24UrRNsuoh1JqrObHe3X5JlSO27KaDrg +yhSBK3U3qYR9PRNIb0AyREZzJvq4fE5WbTkv8GMsMftmoUoeSbd3SOS+PKM0fliW +xMYl6vGak56Z/xEBkPDKDPktnUvnM1/OWS/pt4oPrSh8Gml3bxnGCN4fFsEJ19yA +VBQrq/FknX3KBsokOHKU13CNdRoBoJMqcTPMMcaC1Qk7baQgUQqT3/PzyyjAitP5 +N7uEEobadVgw0FYRZvxOqHxvU0hiCnCZrBx0GO67pBKepUiL5i9GYwckWoeJyuc6 +HNo/PbDacrnpmcK/V/lfSzoxe70Ezv/Mt3AQTQrdEeZa8Xgb0c3teZNA80obh8j4 +YNjwanzzku0Z1IhdhXiPs0O8RZy6qA+nJCO+kUQH+8NLKp7zJQ0aY1VPnA8rqUeT +XQe/aD1yaR5bSoOJGkODucegVx1RKQDISXPGz75nwIkxWnOX9MnIm39kebTZc2yj +A/wcVa81zIIbCeT1pgIlG6j79SCOZC8OdW+gc75fCsySNIfskolBm/OsnnHxxmxe +8z0XIdirefu7dH4BIwFXDEX3IB7H0J/BGD/c6HM6eRsOy70fAQQ6tXbExBBD0w63 +vh8hsaQzeHPCzRqw2ghXV5znZTVf80/VbwZP0ZFfk5fy5OLOwU0EVwyNyAEQAKsv +2AeF2vqBBfhkwDmyWnrbzE6scKx0s7nhY109Ep4UdcmpJImLd+zwXEFYjgWd6N4p +QZsX4ys6UWkqoQvFoyN7tvBnJqneLPO1kezM/diY6hMEm9EQYp0KQvzZwuwKFgP8 ++uATxyu+SFKer169ywoCfOIzGD/AMIKFQvcS+qjb0F6gHzV/4T3CStRMwJP+RXG3 +ekZFqUpfRSGu0qumbzJF+O58l/COR3CC+KeREZnYatYePgvMxuL3+51holnrpjDS +ERThRLFQH2822ZIWtvgQH3VPauFzrx2BDiNgEjsrgRtvxdpYDFv4gCrfWXVSSIQD +fYXipQygvqsKEHjLqcfE6dO+z5cRvlMHBdWiCMtEpNCzlT8dX2XuP4cByGTnLeKb +Y3ZQqYzEeqi289llRk91oJHFR51B/2BHTItlX5T0FwO7CPMv/OOu2E1liUQYnodn +9MtJOnh0Mf65e4uoxVbLmKq4q2duuc1NC2/m3AP4COmDLrRgs4n1hqIngaOJ86nN +KTzd7Wsnen+lfoHk1ZCKdUtknPHJ46iHeIyN2YINKcRcusKZi/mDqPJX9Zt3gZgW +4wrxNPv49B1Ytxtn8vFznDSz5zv5/k5+Ypc7ko8eedSysXkMFopE+NJynB49CK3F +4iCVSAQwOQ2u4GG7U/MLF3cG1eC774rdZ2gfdVyDABEBAAHCw4QEGAECAA8FAlcM +jcgCGwIFCQWjmoACKQkQdyH2O9OLR5bBXSAEGQECAAYFAlcMjcgACgkQE5e8U2QN +tVFBJg//QTCvdPt7SyhPPyDhAkstWpkNl1fwh7PTiJ00e68C7QDB1nbCXQL60yQP +uXhHZojoEp7/3A+d2T80l75lhwP+7PKIoglAPjw+uJ82fC8e70DzSsTgGmlCemUQ +16GJttZoY0lA40YUnHtBNiUWNLks2UbUBfqZCPG9vjbfM5ZI6YRqZhdgGZjIwbq+ +Sv9dM/OyV2TLxcW4+slRmyUv9aXHfVdDUiu2Qcc5ipbCvSFNznT/Y7wfR7CX90Fk +urcSaKdln62xO6Ch/SPhJvFiGmXD32cbBs3W5fLgvz91Y5Redjk6BpMpk8XXnNEz +Fc30V7KUFVimnmTOt7+tEjqZDaVp9gd1uO93uvIcXkm9hOhINd3SbMXacvObqPCw +7zjtk13kZ1MPr+9x5/Ugm1rWdLAD+GEu2C2XPr+02dyneUR0KMAzHb2Ng8Nf4uqz +0kDFwke5+vzajrAz1MXbhDytrw1u8Hreh1WJ0J+Ieg6wgUNStrMfxe5pDPJmQjRt +vMuaAwC8w7q7XM9979Mrot0mDsB4ApJw4lLfwPmabBoPVsAGvrt5sD9fkd1qiZIM +pV1Rhp7B9MYEiytaYKYql1v5Z9fih0Wk3Ndb+qySIGnlZJ6wq83VBSQslkNkPWTP +b75e6XkH3uzkvEtMtHC+Aug1pQWveWd6PM0uB0Gl/oWeQDn2zJFS4g/+OIBna4nN +dUo95EmowYv5R7YeJUR7yKZrdJAhx6pbyMpLtzs2Jzp0xbGCcOmTm0mZWOuB9zRr +1zUVjgaiZQFtkWP6Pvf5ZGTcRpUoiy3L7HPjz6uUmN1gVUImjQmnruOONc63oQ4d +OeI4D8A23NEjMMydavAlnsDEIYnhiMtKGRxEz1LfRfSK4CTE0gtf75I053xqpzZs +Wh/JMKRxuToIhzVbTS99+/VAZM2Oy02lVKX35tGaUkOolacMaTk2Xg1yp3xfnVXS +1gSDpYQrg4zzfDHkTD9N1NGrmMmRsK7YZg1o002BdbttdK9PlUg1u4/p2ZuLX/yz +SMolA4QEjdHHGgH7TUODH1h01+OwIzeG9C/KRpYwAt5kinNtfFXXXxj1BBQhF7Yv +7hdkAIQCFaOPYrXA/s4MZNCusziriwjDWXeXvI71pdc3uWKQAB11PhYSkZXQKKit +F44nXL+wolElIj+ek3VQrvAxrNn7LOHE3SrMbyypEQolCc264ZBD+ogZv+h7h087 +QWKEBQaRahrRuC0ZWKM3l9BJsxtXnSRlippr0ac1BGdyGZlv6krbEtwrzmEPWenf +v8CbmjaCCg42PeojclpEexlo6zWo9BzJ3jo7IgVSkckh+Tid7MMKhBh33dtZQaoP +DEj+f8Kx07TfrnKoM78AOxx6GVWp0C6lW/bCw5sEGAEIACYCGwIWIQTrTBv9TwQv +bd3M7JF3IfY704tHlgUCVwyNyAUJBaOagAIpwV0gBBkBAgAGBQJXDI3IAAoJEBOX +vFNkDbVRQSYP/0Ewr3T7e0soTz8g4QJLLVqZDZdX8Iez04idNHuvAu0AwdZ2wl0C ++tMkD7l4R2aI6BKe/9wPndk/NJe+ZYcD/uzyiKIJQD48PrifNnwvHu9A80rE4Bpp +QnplENehibbWaGNJQONGFJx7QTYlFjS5LNlG1AX6mQjxvb423zOWSOmEamYXYBmY +yMG6vkr/XTPzsldky8XFuPrJUZslL/Wlx31XQ1IrtkHHOYqWwr0hTc50/2O8H0ew +l/dBZLq3EminZZ+tsTugof0j4SbxYhplw99nGwbN1uXy4L8/dWOUXnY5OgaTKZPF +15zRMxXN9FeylBVYpp5kzre/rRI6mQ2lafYHdbjvd7ryHF5JvYToSDXd0mzF2nLz +m6jwsO847ZNd5GdTD6/vcef1IJta1nSwA/hhLtgtlz6/tNncp3lEdCjAMx29jYPD +X+Lqs9JAxcJHufr82o6wM9TF24Q8ra8NbvB63odVidCfiHoOsIFDUrazH8XuaQzy +ZkI0bbzLmgMAvMO6u1zPfe/TK6LdJg7AeAKScOJS38D5mmwaD1bABr67ebA/X5Hd +aomSDKVdUYaewfTGBIsrWmCmKpdb+WfX4odFpNzXW/qskiBp5WSesKvN1QUkLJZD +ZD1kz2++Xul5B97s5LxLTLRwvgLoNaUFr3lnejzNLgdBpf6FnkA59syRCRB3IfY7 +04tHllaPD/9jlUs3zxXz1ISUsM5oDV9lrFuljfdcLW39KFKTkSuKLYyRE1E77q1R +z4p+O95kgHiMqczDtaR0ukNbsj4+RJvMewYBs2tYQS1E70yKUX0vieeIaGkC+lxp +6xN/0CJfwMRiuWqnPYexKrE24T3JIOgRC1rnioNT6QhlrUNYoAnLE1Lf5ICeeE40 ++3VMrhQgGqVYGOpTJRLWuHSGCXW3kFpGUdON6Oru0dB72B5dD9d7YQ+NYLoXWbDz +WoepJuYXeyBF7gTaPx0Xkh54iMwiqJaSJCcp/V9YPkiieWkOjLxXdi+KZKiSrfpz +b5KEFyE8PchMQxyUkAoV+UJ8HniaFNEtkHOlvYy/asjsN1PrLtv6D805NsUbtQsI +mC3jY2UjWIVPQM+/ArLza2VFCgpoma5JjfLUZRRabN02hf36HcLmH1jwv0fVqSm7 +Wqo489z6lx2G4eTclEVcPxKrzMtcj9uj7EJ+NbRORG53Zej9mM4wGUCyjU3OfOAV +6u06o+eY3nh/7Etl17+YBdkvrZvfjcMrmr5dZguQjWi/im5F+sPzmnSDVDgK0Fth +wtUsKj9fOHzfXCQsdzXgduJCoPODONqkD1DiB34rtEdOiSmj1om5PVgFOrLEC3K2 +0bOTWdMkqiVlNLaUv1uGZc9WI2LZ3HtFQG89uTgAAmdGnSp1oCr/Ds7BTQRYhr/M +ARAAra5iu3Ndg38ZDwCUg9dlWp8Sy7742FtChFisTekzEUAmsC4RsBX+xSzaWm/N +vQxTIQXDVYCfGlNGCCLvXx66CGhovm5AZA5ElhIUk5WGuiEnwZ+mZPQBgVgf0iHp +Tp3LgHCPyJOgXQ8yF5wze3F7DIFdape4yG3W7HV+t8GRBcKm2oi9RlneAVCoY9B+ +OmUxFQS5dDHxzZWJfl94m/VqUUuogQBjlrPCqsOcVRO6CZvQw111jnT1BPPxVbYv +m5js/iAsEBE2PSNhJsjV8lBt4mirNO1QH+0jx4YMgRJDJ4LeWRnB+ILNZtpfxxUN +ErTRTYV7s5R70IQ83fTNZ6qbLRHvn/AGTIMjZzPrhhyavVVbWjZ8LTA2rLbzZFDr +PmrjF2zcLJecvzumT1+SOSLyZlIW0odFDoLhjySlLv25eubYXmoc+BxgQNEOZ84D +S11ZlOmonNeN4oscTJPv6gOfSOinpYFho/UATwB1OvP/yeHTxbZbESme7yNLw9eM +JzL2iRb+rck0oDXVrEDglovp9eqxnzMdSzWUztWzukxOvmS7rznIRiU2D+C2wnli +y/Kg23X896Eih1KcmpRCyZY84p+q96qAN06r6BiuTlqxaM7oVq1rd7SLaOd6Cd+L +yQrEWdKryg5/T0F/a96OeoSoZ/Bvc/1+bTZX683kmIpFkHEAEQEAAcLDhAQYAQIA +DwUCWIa/zAIbAgUJBaOagAIpCRB3IfY704tHlsFdIAQZAQIABgUCWIa/zAAKCRBk +lMbWmXwhXluJD/4mavm5UQ84EczsNesfNL8gY3zzlCnfvnUlJHK+CoYub4wcoDXV +UlnCmWgSlZHQZgr3/qfW2MM3y/kXcbxhL/FijUzY3WlnCdnIVNjuB+QJt0LHbkP7 +En/o085ZzHuzaXxfZ97qN+KPsRBTjnJ8hd3B64cVjgnXva1+pG51EK4iDF2bXiWP +HvUbPiL+Og6C9XjpWrwIA1CWyH/4i7dtfTnbViO2aqKQNHfrXJ+xS938Lr8r5+Vm +UWByHqweBGIASOmwsJeSUHozkZYbmMdaJJ8j458zyfS6LO+HIa3+zhzidOoiEH9c +5QvVf54gNsYjPTcHj7U0DgkxCVQeiBKBLR+q6M6QHa4qax/X0Z2ZCcSDTZwqGJNa +KfcFYd8X1B2zgrxkGweeHKjfmpqfXRKrggHumLdVqHU7KS9cz1yeTL+Nw7ne+kzR +MEA8sLnm4ODRUJwUz12RqS0GG1FYV0rjJVWVzRFMfMUs+7xAptEuMdoddkQSmytk +XyOKAqv8KQ9XUEbGWikmCxW2cOY9spOpwQa7X2oXe7FlV9RfmHYrG03k+YlIREgF +qlvWwsgpzURculd+CIFvT3vci7vFm1UiQBb5wC8bHOoRsr7OXW1267lipouZr5Or +QhVnRZQVa64cdUIKjLXEt4790uxh8ggNwktZRILIn2JHjgEQICdYWeQb1Lq1D/sG ++upSIQwdFPTbhXSVE3Opzv9XMt4vZhglaKsJk3AdQSfRNYZ3DFD9fzL6wIJAQawF +iYg9l4/UFf7gaMwO5y8a1e3H9XXvTi4B+HjRH19ucY/AQT2J8lch7MpOWRw4Y4/U +mrq375RVmItd4uYnjKci1SVePq9lotcdVIClQJQe/LB2J2w80qBzywXCMbSCqd9C +ydDxJGrfEhuxtsILb9UXYZnGRAVdObzJ6xhjvfdXvqSs0TT2B/Kw91UCiZb2hcLC +bgU1uNoGdyn6VDSiNroAnJ0TaaBxVjQq85SdAhSOPCzJZlErPu4v5fkBpXmiykMU +UzTaQJnry60u4GuCKtCBKsXsulVukUpP2dWd+yfAezyEkkdK2Z+k3skIBVn/xTi8 +OjrcDqrhpjHhkqo9lM8cm8oLbL1Gc9AcWMpqFhXeBfLKeN6C9k11Olqe0CKQWhYJ +En/1EMX0esHEN4r2n3ktZYPL1BbjH7jC7aOk9CYmcPLikrg1pbUkXhfhV1Z4WsM+ +9gWTMvESKLIRnaVh5/2Gzei/iTrsWZ75DAGb0i093NB+Fwg2LRHytpiTKg9sp1+b +RkfBctxgGhI4cd+k7804wl0ZifhZ5Ultae+8flIxVBXKWPLJL/n9Boqd9IspwG9Y +aAHYmyA2m+tdjlov+L19A2jOrevFKvK7Gm3iWLGRuMLDmwQYAQgAJgIbAhYhBOtM +G/1PBC9t3czskXch9jvTi0eWBQJYhr/MBQkFo5qAAinBXSAEGQECAAYFAliGv8wA +CgkQZJTG1pl8IV5biQ/+Jmr5uVEPOBHM7DXrHzS/IGN885Qp3751JSRyvgqGLm+M +HKA11VJZwploEpWR0GYK9/6n1tjDN8v5F3G8YS/xYo1M2N1pZwnZyFTY7gfkCbdC +x25D+xJ/6NPOWcx7s2l8X2fe6jfij7EQU45yfIXdweuHFY4J172tfqRudRCuIgxd +m14ljx71Gz4i/joOgvV46Vq8CANQlsh/+Iu3bX0521YjtmqikDR361yfsUvd/C6/ +K+flZlFgch6sHgRiAEjpsLCXklB6M5GWG5jHWiSfI+OfM8n0uizvhyGt/s4c4nTq +IhB/XOUL1X+eIDbGIz03B4+1NA4JMQlUHogSgS0fqujOkB2uKmsf19GdmQnEg02c +KhiTWin3BWHfF9Qds4K8ZBsHnhyo35qan10Sq4IB7pi3Vah1OykvXM9cnky/jcO5 +3vpM0TBAPLC55uDg0VCcFM9dkaktBhtRWFdK4yVVlc0RTHzFLPu8QKbRLjHaHXZE +EpsrZF8jigKr/CkPV1BGxlopJgsVtnDmPbKTqcEGu19qF3uxZVfUX5h2KxtN5PmJ +SERIBapb1sLIKc1EXLpXfgiBb0973Iu7xZtVIkAW+cAvGxzqEbK+zl1tduu5YqaL +ma+Tq0IVZ0WUFWuuHHVCCoy1xLeO/dLsYfIIDcJLWUSCyJ9iR44BECAnWFnkG9QJ +EHch9jvTi0eW9zAP/A0WYtLO0i0MGkIia0+xqwArCDI2KOkmqVFcQzBdvEHwDVvN +PQDaati3rfsgA5hIm0oKYg4ju66uj72Jx5j8sZk2xMDLZtWw4tI+ef08m5zTeoZ1 +KPBfqNMsAiY36E/Bg7gV+dDg6DmFDJiKGMMjM/1LTYvIh7cUwT0eW+5dVbfBH1G9 +8K8BmuIttpo4CylOPYezsotVWGUazPtIZa5mixe/bU/ZrA55/N5oKvann5CblOJw +alF7ovwmOW/LyVwvvLQ/qtcAolDPLr9iybP+ScivNMxSW5AVwP2QmLVNCyRKVH+x +42yAHQjA1o6XOI/iMo1PgMb/jZDC4GEYWmnZz0Vc6mPH9k9gbPhEFpNoutQVUDKm +pBrcAViDAqdn5xgwsSC/xQjdZCANCdIfaJpoTIGXTiWgJLbHXa/y8FYf4XGF/DH8 +veLz7PhNym+joosD5JDerpkL3RWvUYYfUlDb5rV8zKN1hCy6G7b1Sgvn3RVWrQ7C +bq00SiwyhLz40sRZSf0/LfciLUwQGe/mm+JyYVqBG85FU4DYsywiTZnQBLYimvXR +GTmZdA1ZsQYQdWqjHxwN0uVIWV5hgR8Ahej3KZzNwuF2NjI0P7EcXRWu/xxQSjjt +e+oeh8ro0PwMjpZZryQgoPR89FpNLY0zBbJwG4e3QdhkzUMATWetIFAlkfphzsFN +BF01/K4BEACskZL08crrKfX2aD2w8OUS3jVGSW7K10Jr/dgl6ZB7Xx/y3c9lhBim +7oRIsl6tpR/DBP50UnTIgBbvynbJ6tbWGptt64AznI7el9pH0k63DOKcfqRUgJKT +M4OUZSkcuqQ2qnkvn+g0oiJ3VhaVYOJdJfJF/pLj5Oi3UEL2afoEd048/lZEaATR +vEqLj+h2pSfETEl5wCWyRnuMSu6ay9NmVzRxiJhPDGW2ppQTxJuaKj+6Vqw5WISu +9nsRxTPE1DW8f7LYyPBwgultuSYKZoCdfoYE8ff471oZIuCKcGSSBHQbR6MBTD6K +JtqzBzpfJ8zZJmVO4lg0CJgp9xX2QZ8hPkpaBbnq2JCMS1zriCMN8iGhW6ZHYmZQ +JtWuubuZt51VL9QmEUUhCF1t+3ld11SaowY4NFKILUdYbC2zAOQIEEJkWRIHKleu +c2zYSNSoXl06oGgwCKQb5l+LlcYHx4+/F3+KzyAq0NqBC1rMnhbn3tcckdZyhLEp +nx9/y33ypo6ZZ0s6dLGrmSpJpedEz6zr8siBa4uT3IvVF4xjfpzSt3cMD/Lzhbnk +5onUfkmoCmQ/pkuKpMr35hHtdDxshLcLPFkTncMjEVAOBToHDbKDSplueyJm48EL +Pi9ZmuyNu7WsB8TWVEAkUShxdeHALVpY1D+MjXK+Z5ap6/tppj+fmwARAQABwsOE +BBgBCAAPBQJdNfyuAhsCBQkFo5qAAikJEHch9jvTi0eWwV0gBBkBCAAGBQJdNfyu +AAoJEHi9ZUc8s70TzUAP/1Qq69M1CMd302TMnp1Yh1O06wkCPFGnMFMVwYRXH5gg +oYUb3IoCOmIAHOEn6v9fho0rYImS+oRDFeE08dOxeI+Co0xVisVHJ1JJvdnu216B +aXEsztZ0KGyUlFidXROrwndlpE3qlz4t1wh/EEaUH2TaQjRJ+O1mXJtF6vLB1+Yv +MTMz3+/3aeX/elDz9aatHSpjBVS2NzbHurb9g7mqD45nB80yTBsPYT7439O9m70O +qsxjoDqe0bL/XlIXsM9w3ei/Us7rSfSY5zgIKf7/iu+aJcMAQC9Zir7XASUVsbBZ +ywfpo2v4/ACWCHJ63lFST2Qrlf4Rjj1PhF0ifvB2XMR6SewNkDgVlQV+YRPO1XwT +OmloFU8qepkt8nm0QM1lhdOQdKVe0QyNn6btyUCKI7p4pKc8/yfZm5j6EboXiGAb +3XCcSFhR6pFrad12YMcKBhFYvLCaCN6g1q5sSDxvxqfRETvEFVwqOzlfiUH9KVY3 +WJcOZ3Cpbeu3QCpPkTiVZgbnR+WU9JSGQFEi7iZTrT8tct4hIg1Pa35B1lGZIlpY +mzvdN5YoV9ohJoa1Bxj7qialTT/Su1Eb/toOOkOlqQ7B+1NBXzv9FmiBntC4afyk +HIeEIESNX9LdmvB+kQMW7d1d7Bs0aW2okPDt02vgwH2VEtQTtfq5B98jbwNW9mbX +TvMQAKKCKl+H8T72WdueqgPKHEkXDZtJmTn6nyneYlETvdmHGEIb1ejxuJ5URlAY +nciY+kvSQ/boKjVHNGmf6+JBexd+HqPhkeextV6Jcnmi47HDvIU/TSynhuqZeK/3 +SZAV7ESqQl42q7wm7Pqw0dkv4jjFCRxDA+Qq2aH6szJ7DZxTRWqfR3Zbe78NyFVX +KxhFQO72zHzC3pFu/Ak59hmTU23yoXVo5t+5O+Q21kX2dbuLd6Px1bnT+EmyneoP +P1Emea5jgsw2/ECqHnvNt6cbp+42XYldGh+PBHBmucC3Mn7sALajHe5k2XkNlfbj +SNlmutxQFH1qq9rh/JVyxJNHeGzV5G0timAwfdJFUzE1vNU5P0w4O8HrCsX5Ecfg +cw2BQ9vPCE3OfG+11xp6oiNMRVsR5pTu7RiI1BQAyICWUW/wXuhhHkkwNTiwfciJ +fVA8ckOiRubik8geEH5boOxgeAaBu6yusQVHnRRyG4wjQ+qsWo+wDI9WMdtpNG1t +oJrSUL4OYa4oX3YogSv5hGrbYIaP4HwO6O2oTMnS0lRIGJOqbEQcmKUa/nWT/3Ni +pTnYzyMjMlEQe89YKjd+32tjMfOSdIOvwCGaTizdWnKPF77qB9D0v8C/7AdHmEFq +f2ZX8vK31aaY+ZpPWG5IHlf6f/buIMBalJOxIBeveBqxcHwQwsObBBgBCAAmAhsC +FiEE60wb/U8EL23dzOyRdyH2O9OLR5YFAl01/K4FCQWjmoACKcFdIAQZAQgABgUC +XTX8rgAKCRB4vWVHPLO9E81AD/9UKuvTNQjHd9NkzJ6dWIdTtOsJAjxRpzBTFcGE +Vx+YIKGFG9yKAjpiABzhJ+r/X4aNK2CJkvqEQxXhNPHTsXiPgqNMVYrFRydSSb3Z +7ttegWlxLM7WdChslJRYnV0Tq8J3ZaRN6pc+LdcIfxBGlB9k2kI0SfjtZlybRery +wdfmLzEzM9/v92nl/3pQ8/WmrR0qYwVUtjc2x7q2/YO5qg+OZwfNMkwbD2E++N/T +vZu9DqrMY6A6ntGy/15SF7DPcN3ov1LO60n0mOc4CCn+/4rvmiXDAEAvWYq+1wEl +FbGwWcsH6aNr+PwAlghyet5RUk9kK5X+EY49T4RdIn7wdlzEeknsDZA4FZUFfmET +ztV8EzppaBVPKnqZLfJ5tEDNZYXTkHSlXtEMjZ+m7clAiiO6eKSnPP8n2ZuY+hG6 +F4hgG91wnEhYUeqRa2nddmDHCgYRWLywmgjeoNaubEg8b8an0RE7xBVcKjs5X4lB +/SlWN1iXDmdwqW3rt0AqT5E4lWYG50fllPSUhkBRIu4mU60/LXLeISINT2t+QdZR +mSJaWJs73TeWKFfaISaGtQcY+6ompU0/0rtRG/7aDjpDpakOwftTQV87/RZogZ7Q +uGn8pByHhCBEjV/S3ZrwfpEDFu3dXewbNGltqJDw7dNr4MB9lRLUE7X6uQffI28D +VvZm1wkQdyH2O9OLR5YsPhAAuRTTsJAAcWWdQvCuMFA5djnu5nsFUYVTar01kuLo +m7xWse/Bw8izaipn4vskR0kLAwJCq/Rs5gXNQzmm6eFfiEcI9LwAx23KcKBjOxCd +hqP9EbXWYkz/fAfAzAArtezcIzNZeRFBMaoxhHl6d4xGRjEhPL6o6vHY5L5fLOZl +DI9PVqY9xpeOuDTUP4JwdD/9rKddU9AVW9rt9szSySodGT/UMV098/d1ATnok/Qc +0YahTMpdOMabea6mA1HYi+8vrWQ0dvCDWWe2mLArODZANthYepyN7+N1LN/Piq6K +7tPYqSxPAOX8dxuS8TMLViQPs2YrK65MvOiWBBTlCxqRbiq5JT9m0cmh3j4zHqjs +w2Of5+bp6pOPhGQD1iDOCxTsA7Uw9QVprg3aT/0Yz7j2VIaDEltKf1b/xbgQJ6YF +UPQ/5FyN8WgMSoGj6fgM0DedHQqLJp+uN8wBq2U4iAyKdVbV1URQFYpzf5myZKkC +b/MzP8dG3OhFDW/yvAT/ySafseQ9dw47V2FBBvExR8+mCmXvUM5YSua2WPxbbcKr +8iryCmp1xIzn+f2s5HThpUjeme+BuJdtrbot8twjPr5ka5TIgWy5Ak7j38PK0urs +4geTaPD2AcKL26jb6ZvnRjR8khU7zciYc1prwlbfBWfnOLajpsHfw/n4aJ9D4ONm +7vnOwU0EYXgMnwEQAKTYbBq76z+kqY5OcYsycHfJtCyJUYtGGzDZKpJO9LIG2EDJ +bVQCp1Go0Dz8V0yW9W6mkbz68Itc+ak/rcL70za3JB45HZpVCn67UQjA3iU+7jCu +Hq922BJGKby7EF0sgcbXrPTHFWETasz863+C5x+SmgTDbz1VpHuw+YjF9VObVByo +IaIVCXetmeZroHPxQ5cmgTzA74srlaRx2YXPr5ncEtJvkgv2WGwCsVOg2rl03ZJJ +NsJN0dHOtG6gJ159gd3GgsIziQl+CBFGBaEqgQmuj5mKkRKrVPnIdX+IAnL7cO4L +wttgu+yO31VlgBHDzEgZv3RWPdOFa4yhWv8hWYpPt+gLlaF7Q9Mj9vZ+s1pYLHEL +hxFXEy6yIFfrqZyVDgy/PCPnQbVYrKBQthy89DzVODSm+BMqqDHAv2W430yINW2S +f0JnHs0WWzNWv6JzudUmMA2cl5sUcIRl8ltCji4jAp9huGilSQJrjWJel6xtXMAq +o3B4+DI1MAwXJieMBQTwVVSbHtklVvXmIRsyzfyAkon9ZvzC0lF+UB+SGsTOHUz/ +jdZQBTdF8+ZdOsZ7IMJgpMeJdOePvjy4fpTjSwH2r6p4SFl1OPQq5+OC1ZoVaxlO +RWu0Y5ojrF9fqnL+TeGNTd6z7t10SXGE8Fyo0TemQ9Gpv3DP57FJ0zuGJTM3ABEB +AAHCw4QEGAEIAA8FAmF4DJ8CGwIFCQWjmoACKQkQdyH2O9OLR5bBXSAEGQEIAAYF +AmF4DJ8ACgkQTrJ9sqO4i4uCCQ//Ug1HJFOguZjWaz0NNYxDSXBsEvwnfG7+d4og +4pUY53D3NxaUa6BSg62FJtPxuO+7JsfVWPHjAUz5ye4xV+MPnxe7pmmAIc3XBdgy +7NjB4EUpoyDihLBMq4AkEnYiF8Sb9wCvJW8pjbNj67LOCLPHe8CDeyOQA8NytIIk +/aeS4dwnefNRso0COZ0yydYOuqplXA/32e7IyTxsC255nRIq8ikK/bAh5g7vOSPr +W+5A4U4aGX3w4G6LnBSG2BDD/96xNZiIY0pKYPd16t3YkdUDTW0GYJZXgowsNuDc +JwwxDXHdXWZ7oQbeCLAEvUj3FOwFRsRrp4Q31TTN0q+gxtKiA43nAK7EDM78JcYy +t4m0FS6kcRzr2hO7B7jboiGLcBtGs8CDe2cYYUK3XUehAU2dE9Zve6cXxSUDatLK +2/AXJCLenMFi3lWxMgDs0Qca4mz786ivoA4ifOG3VynsB+YMZ8bLY3mjD7gYjoU9 +7ZSoiDb6cWIav2FFk69dGAtAvx2UOcUKHKaV3Gb8n9QV0kZJZGV0QOw+vMdARIq+ +xX0SOclBHmnnORArqPHTOpKUOCI0bYZPf8JK/Ah0KKHoKX0dOEe1g2bdlg3RtT1b +aN6guHcAg01NyunS0Adm5AsXG6RuPno7l4H6d+Trv9faI2KLjpl0lA3BtP1g3oKy +1DP4KeqDtg//cbpjo0chCCBeeVgiLeLA3vaESASrPq8hErzuUEZbavd5DRwNm4Tf +7lDgVhyLD4HZEp4OGN2Y8fKkDmj5GIDIjsk5nAlqWoc7efAkbmyvStHNwmxsa+lv +OyjYm5PJNRG/i0E2rjlv3LRB3O3k+k2s8ltAAMlaf4daxtUkHmBYFN2hBiCnJOvz +idDKxxYBQVNFuYe+2MIJ8t29TzAzu5sBDkPCLWkAFG21EAy48D3gfNoEXnJeSCHE +emdbQhxcaLCByH0tDJo71VJGGI8fqvlm6Tsq8aEemHtILkmBSf28maanXNx3SZdD +ZmHwzzUndGLeIY8czYKqmUDFc1siufO1sQmE3Yj7vubvdnh34rWK+DrFCG15JmHC +HHv9ndOX5TaNg4QUif9QWZXdTFFIlr+NBFyO8wqmtKni0BnbIkjdtpuNFuLGBQS2 +UrXTn8l6nFwB3D2+izE7+tHtWoLO7Ryil3ELQYAfyiD4D3/cs+GVEbLdCF/OPL0k +dYePgQiyiXTYFLz51a8Chh6uS970736Hr8HnAz9ieD0GNP46s2+R+aorZyykFfBh +506sLi5ZxSa54RWu/k/gUXfrAn56O89Lq91PFVN0teOi5QfBNBBlWU2NZjdwjKPT +ednX1z5vfT7YXMb+5Kdv949axEtjsjLPjKCvx63B4E+cQi+PCkBnE67Cw5sEGAEI +ACYCGwIWIQTrTBv9TwQvbd3M7JF3IfY704tHlgUCYXgMnwUJBaOagAIpwV0gBBkB +CAAGBQJheAyfAAoJEE6yfbKjuIuLggkP/1INRyRToLmY1ms9DTWMQ0lwbBL8J3xu +/neKIOKVGOdw9zcWlGugUoOthSbT8bjvuybH1Vjx4wFM+cnuMVfjD58Xu6ZpgCHN +1wXYMuzYweBFKaMg4oSwTKuAJBJ2IhfEm/cAryVvKY2zY+uyzgizx3vAg3sjkAPD +crSCJP2nkuHcJ3nzUbKNAjmdMsnWDrqqZVwP99nuyMk8bAtueZ0SKvIpCv2wIeYO +7zkj61vuQOFOGhl98OBui5wUhtgQw//esTWYiGNKSmD3derd2JHVA01tBmCWV4KM +LDbg3CcMMQ1x3V1me6EG3giwBL1I9xTsBUbEa6eEN9U0zdKvoMbSogON5wCuxAzO +/CXGMreJtBUupHEc69oTuwe426Ihi3AbRrPAg3tnGGFCt11HoQFNnRPWb3unF8Ul +A2rSytvwFyQi3pzBYt5VsTIA7NEHGuJs+/Oor6AOInzht1cp7AfmDGfGy2N5ow+4 +GI6FPe2UqIg2+nFiGr9hRZOvXRgLQL8dlDnFChymldxm/J/UFdJGSWRldEDsPrzH +QESKvsV9EjnJQR5p5zkQK6jx0zqSlDgiNG2GT3/CSvwIdCih6Cl9HThHtYNm3ZYN +0bU9W2jeoLh3AINNTcrp0tAHZuQLFxukbj56O5eB+nfk67/X2iNii46ZdJQNwbT9 +YN6CstQz+CnqCRB3IfY704tHlsa8D/9M5VgmDrDR+SHeEmbDynvIpnrwm495b26E +2D3OLuh7228G2Ki3q8z9mo1kgnVACuAjKwLrxYpXaOJOgjoelWmXYgzsLCqCX7Ol +XeaLneWvo0Z7/PqJLUQX+TgFXN0S3wRtUQvaiPPdSUzoxq01O3QSa0Y0VncvWEHf +3qTdiNEVbVGiZcShC6BY+exTxEWYIPsqJooXgQESvny2GP6BU8CSt/ird63ZwbVH +laRIi+lY1Om6ryKVBvj9LtuwLKXGnIA3sIOffrYXG2OLZ7HaOg0mQUPdmwT1Rs6V +zxIaUP72TOtwhvKrGX0NY8PNqL5kp5Cjy5wUEWmxWFZdAwpdbmB4NuFKeusOi4/7 +U9l2wngX9p+eCvR6FDFfX+/6S6E2tHRN1GCNSuBi2XafssTL3lBIxp4dGDkwZqAb +aXculHXo7o4pesWx9oC8GyAhZvm6ClVsM62Asn5edQEoquXZqkMHd7TwIPR3Oqrb +2fHLMMlsjTkKWaNJsr3z2iqx1mvbthqkJnhgcIXJFycRTP82rtMsejTJEhSOPZE4 +JcNAO+63JpSVAEEHqF5kyjJejTP9wFH7y/EH7vf++JIKBSPaZkBZMgbXEDAngdvy +UPSvcsD4Yv4CHm437XzICkLE1vv+jZdcmfKt/Mtp9SeKf2nFZRXNij4W5ii+Ar3E +nZUEuAm7xcLDmwQYAQgADwUCYXgMnwIbAgUJBaOagAJACRB3IfY704tHlsFdIAQZ +AQgABgUCYXgMnwAKCRBOsn2yo7iLi4IJD/9SDUckU6C5mNZrPQ01jENJcGwS/Cd8 +bv53iiDilRjncPc3FpRroFKDrYUm0/G477smx9VY8eMBTPnJ7jFX4w+fF7umaYAh +zdcF2DLs2MHgRSmjIOKEsEyrgCQSdiIXxJv3AK8lbymNs2Prss4Is8d7wIN7I5AD +w3K0giT9p5Lh3Cd581GyjQI5nTLJ1g66qmVcD/fZ7sjJPGwLbnmdEiryKQr9sCHm +Du85I+tb7kDhThoZffDgboucFIbYEMP/3rE1mIhjSkpg93Xq3diR1QNNbQZglleC +jCw24NwnDDENcd1dZnuhBt4IsAS9SPcU7AVGxGunhDfVNM3Sr6DG0qIDjecArsQM +zvwlxjK3ibQVLqRxHOvaE7sHuNuiIYtwG0azwIN7ZxhhQrddR6EBTZ0T1m97pxfF +JQNq0srb8BckIt6cwWLeVbEyAOzRBxribPvzqK+gDiJ84bdXKewH5gxnxstjeaMP +uBiOhT3tlKiINvpxYhq/YUWTr10YC0C/HZQ5xQocppXcZvyf1BXSRklkZXRA7D68 +x0BEir7FfRI5yUEeaec5ECuo8dM6kpQ4IjRthk9/wkr8CHQooegpfR04R7WDZt2W +DdG1PVto3qC4dwCDTU3K6dLQB2bkCxcbpG4+ejuXgfp35Ou/19ojYouOmXSUDcG0 +/WDegrLUM/gp6hYhBOtMG/1PBC9t3czskXch9jvTi0eWg7YP/3G6Y6NHIQggXnlY +Ii3iwN72hEgEqz6vIRK87lBGW2r3eQ0cDZuE3+5Q4FYciw+B2RKeDhjdmPHypA5o ++RiAyI7JOZwJalqHO3nwJG5sr0rRzcJsbGvpbzso2JuTyTURv4tBNq45b9y0Qdzt +5PpNrPJbQADJWn+HWsbVJB5gWBTdoQYgpyTr84nQyscWAUFTRbmHvtjCCfLdvU8w +M7ubAQ5Dwi1pABRttRAMuPA94HzaBF5yXkghxHpnW0IcXGiwgch9LQyaO9VSRhiP +H6r5Zuk7KvGhHph7SC5JgUn9vJmmp1zcd0mXQ2Zh8M81J3Ri3iGPHM2CqplAxXNb +IrnztbEJhN2I+77m73Z4d+K1ivg6xQhteSZhwhx7/Z3Tl+U2jYOEFIn/UFmV3UxR +SJa/jQRcjvMKprSp4tAZ2yJI3babjRbixgUEtlK105/JepxcAdw9vosxO/rR7VqC +zu0copdxC0GAH8og+A9/3LPhlRGy3Qhfzjy9JHWHj4EIsol02BS8+dWvAoYerkve +9O9+h6/B5wM/Yng9BjT+OrNvkfmqK2cspBXwYedOrC4uWcUmueEVrv5P4FF36wJ+ +ejvPS6vdTxVTdLXjouUHwTQQZVlNjWY3cIyj03nZ19c+b30+2FzG/uSnb/ePWsRL +Y7Iyz4ygr8etweBPnEIvjwpAZxOu +=v/kS -----END PGP PUBLIC KEY BLOCK----- pub 7905DE25C78AD456 -uid Protobuf Release - sub DBC5123E2E98FEFE -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGNBGSsZCsBDADJZoPoHGJNAB3sn/kFQ3zlj+vZ7OY5aWoH2nL3tHQYZvN/pJRs +xsDNBGSsZCsBDADJZoPoHGJNAB3sn/kFQ3zlj+vZ7OY5aWoH2nL3tHQYZvN/pJRs 8wu4Cw1ApatqLIaur6S6LR+s4xB7HxnMvpiF3NMwr6ZeZBUUTGEJbRgFhY9TqZam CZJ/xPz/FevPhZn3/McqDGbjEx+G7hciUl0EwIOhanAQQvVYaWxDL+Pesqqh23U7 Cex2NcotieICt7dWJ7SAM3TOSLP9OQd4scRvYLWqv6/vu/nQ68RwqaonR2QzxhUY @@ -8426,42 +7825,25 @@ Uul7vR3iNRXtbnS31qIgCYWAoX6w0xHf6KUeIPWV21ZIUu5cg6kQr/sPt/OQuGS2 nKk+InYtopDi6d7AUh8WI2TP7qAMIoRkhAeDEQ99DiopwFNPA/7M4g99AQfFSmp3 acPCdeXXAZeDAqoFGFKTlqzg3FLWpGkubI/iXyHkpQfOXv4MtYuPGVNheBXGcWbf XPjbkFYjkGIN2Wx4i7yf43hMCk6ArhswfgCcgoORI+DCVdm7ORID1PjIU2Z71EA2 -qDdFwdoOdEV42YUAEQEAAbQsUHJvdG9idWYgUmVsZWFzZSA8cHJvdG9idWZAZ29v -Z2xlZ3JvdXBzLmNvbT65AY0EZKxkKwEMAK4LeTj1dr8F9E98Up6y4AKHY0Zbeb5v -c/TzsJX6UCudzygYTbQnEcrPIcJ5TJV5leniAlxnqUz/qJxmpBtGCNH63c9+iJNh -VqJEZh9dbupqQn+mqtBvsPABbHU+C46TLebmOK4R99zgtxVlSYabJubuG2Mqnq96 -mutBUWKI3iY5j0JAMLY1DJesAGwAWP8gvUZHhd4LJN3iikNSTWyUE0Hnwm2VKFq4 -cxI/6qaCpztfuSD1y0JplSfmKRd+ecLSqhDvlMZkwigUpjCvF7iSaPvpxWdkFabS -frMeIjwbGU/fLV8ilwtPPb57X6Nrk9NIUdVa6ZbxiuIErIcp3JfgfUfy7wxcI/Uj -Mq1I50NOwizLVprZbmKv1P88bACmdon612pnDhhs84phJmA7fzQ/jAqF1JQ4Crdz -L+6g56Kkx1VlN3dSmPjuycjTzykuNwZ/Fi0Lj9Czg4LVp6peSsPWS+lp9h9tOSzt -lQev+GXiQKZTYt8JxvBPOkm0hd5M30BDbwARAQABiQG8BBgBCgAmFiEEGlXwka0o -wH+DH6RNeQXeJceK1FYFAmSsZCsCGwwFCQPCZwAACgkQeQXeJceK1FbX9wwAmLBK -Q8JljEwk0KqYxawrusWXwaH+1I83urf/WsOJYEkKoiQObsFGTuaolyln6ZHyF+gt -uKeWtlbvG6aXqv9XXcsVQG7NMGdEAy6DTNj77uBAXMWTxVpD09iVeepvWSiz7r7M -gzJfluNgGDOGKpkxxIjS8NnOAsK9uquyvBQa97I+YniarTkpnVWpgSR/7V3HHf6Q -2aCKL3ihdK2uIS4dIrFi+mVCt2zDad8U8N7S2Gv2VO/vBF+hIFCV788hLH9HeX3f -70E99X57hrVCh0MeColOIV1zwK8GLeV7bpr6x11x5cjiv27xky95WteyH5w9w/Xq -Tu0NQ5YyKX/0PUYVX3mLs59H7Wys6ANygWJs59JT4KSwb3pIEV7gWSwp3mWkstlF -m4Tq/d+gVF64ItrHylZg0WpHPv1s+dH6/tWcsBnkgR/OS33PkijQgvMW4imQNRxg -ymOZIduHXX1X+KzlRZTXvv4tSFnIQ0mWY1ySiOJQJS2WABVwFpFc8rECm6eN -=z4dc ------END PGP PUBLIC KEY BLOCK----- - -pub 793FD5751A0F0780 -uid Block Open Source Releases - -sub 59EF9FBBED4216F5 ------BEGIN PGP PUBLIC KEY BLOCK----- - -mDMEZzuZjRYJKwYBBAHaRw8BAQdA/FAoxAeXKY80R8UZ35NNr06SMFqC3Pv/LtP2 -sZS+7N60M0Jsb2NrIE9wZW4gU291cmNlIFJlbGVhc2VzIDxvc3MtcmVsZWFzZXNA -YmxvY2sueHl6Prg4BGc7mY0SCisGAQQBl1UBBQEBB0BxT6NyXTVMCaIjZGa2M+/h -z+xbicRNpHTpudCgcUvccwMBCAeIfgQYFgoAJhYhBB0hf4R17unxmrjda3k/1XUa -DweABQJnO5mNAhsMBQkSzAMAAAoJEHk/1XUaDweAmCgA/2x1ZfeK2BbKUoPDvSHk -bdks1K3OorITH/c1RHMJZe1TAP92RwDPmqy7YsZDKctpFeA0jhlWBNvbNTNkzRNu -yEjMCg== -=Eg1b +qDdFwdoOdEV42YUAEQEAAc7AzQRkrGQrAQwArgt5OPV2vwX0T3xSnrLgAodjRlt5 +vm9z9POwlfpQK53PKBhNtCcRys8hwnlMlXmV6eICXGepTP+onGakG0YI0frdz36I +k2FWokRmH11u6mpCf6aq0G+w8AFsdT4LjpMt5uY4rhH33OC3FWVJhpsm5u4bYyqe +r3qa60FRYojeJjmPQkAwtjUMl6wAbABY/yC9RkeF3gsk3eKKQ1JNbJQTQefCbZUo +WrhzEj/qpoKnO1+5IPXLQmmVJ+YpF355wtKqEO+UxmTCKBSmMK8XuJJo++nFZ2QV +ptJ+sx4iPBsZT98tXyKXC089vntfo2uT00hR1VrplvGK4gSshyncl+B9R/LvDFwj +9SMyrUjnQ07CLMtWmtluYq/U/zxsAKZ2ifrXamcOGGzzimEmYDt/ND+MCoXUlDgK +t3Mv7qDnoqTHVWU3d1KY+O7JyNPPKS43Bn8WLQuP0LODgtWnql5Kw9ZL6Wn2H205 +LO2VB6/4ZeJAplNi3wnG8E86SbSF3kzfQENvABEBAAHCwPwEGAEKACYWIQQaVfCR +rSjAf4MfpE15Bd4lx4rUVgUCZKxkKwIbDAUJA8JnAAAKCRB5Bd4lx4rUVtf3DACY +sEpDwmWMTCTQqpjFrCu6xZfBof7Ujze6t/9aw4lgSQqiJA5uwUZO5qiXKWfpkfIX +6C24p5a2Vu8bppeq/1ddyxVAbs0wZ0QDLoNM2Pvu4EBcxZPFWkPT2JV56m9ZKLPu +vsyDMl+W42AYM4YqmTHEiNLw2c4Cwr26q7K8FBr3sj5ieJqtOSmdVamBJH/tXccd +/pDZoIoveKF0ra4hLh0isWL6ZUK3bMNp3xTw3tLYa/ZU7+8EX6EgUJXvzyEsf0d5 +fd/vQT31fnuGtUKHQx4KiU4hXXPArwYt5XtumvrHXXHlyOK/bvGTL3la17IfnD3D +9epO7Q1DljIpf/Q9RhVfeYuzn0ftbKzoA3KBYmzn0lPgpLBvekgRXuBZLCneZaSy +2UWbhOr936BUXrgi2sfKVmDRakc+/Wz50fr+1ZywGeSBH85Lfc+SKNCC8xbiKZA1 +HGDKY5kh24ddfVf4rOVFlNe+/i1IWchDSZZjXJKI4lAlLZYAFXAWkVzysQKbp40= +=JJ5h -----END PGP PUBLIC KEY BLOCK----- pub 79752DB6C966F0B8 @@ -8470,7 +7852,7 @@ uid Rob Manning sub AC9F6F1991913E30 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGiBEqXMWkRBACnsxVroe9ojc2AnRn/85KJi/Ntsbku5iJ5z72B6I+VGn/b1Xln +xsDiBEqXMWkRBACnsxVroe9ojc2AnRn/85KJi/Ntsbku5iJ5z72B6I+VGn/b1Xln kuvRJ41RLG13lKVmHtSTq2pajjmAr9jY5gS8nJ3JUES9bG3yKNN1IDswXExfAUJp skESh6a/7GY9Zp50hGmCEp4cNJWa0VfZm+pgEz9wMhvpMnVwqf9AooHRVwCgjUbp RsDn+OY8GfSY3oB+WSnQlQ0D/0YgQIkORZwQt4jePiWnCHDshsmfJMCF7wEZLQM/ @@ -8479,7 +7861,7 @@ rviqeWy/EuoY9d1Mq39m2d27zqeGuO6dpTGA7fBKDY1C2rl6gb/vlS9Apu9lh35X FbHkA/9P2ViXldsyXHA9Pwkv7V0ZGD0KvqKkS7wyb8fEx5OEA0WwKWCoaIm192Rt 3WtNpefqjzZ9vhaAf+V/9DyhS5WGbdb7uuj+3wzqakz+1iCgjqvWNHc3SaCvv9o9 o/NQFrG0K2w1Z8P/iQn+igRFC9YwBJ66dqgOaeW4oO61JNWDRrQoUm9iIE1hbm5p -bmcgPHJvYmVydC5tLm1hbm5pbmdAZ21haWwuY29tPrkEDQRKlzFpEBAA1YDlDKBk +bmcgPHJvYmVydC5tLm1hbm5pbmdAZ21haWwuY29tPs7DTQRKlzFpEBAA1YDlDKBk 16508Po2wEKLU5KPAroNs4bAtGucYrtHmeWLEaRi5lSLp1C6Dk3hcW/lAEN5N38K 2R5wt3/rvS7xIagXKdOzFwFk5VyJ6X0uvHrfiAAEvSoPzGb5FsB9ziIkBSUOCsXI m5tFTq3GfbRVETsM7Y0ZDPMLyqVpoF74HSmuL+UeXGU80036Jqmsi3xlGQMV0VbF @@ -8501,9 +7883,9 @@ pnb9fycO/YDmFhO5sDtxd1BbzVNBkKbkl9ElbW/IseV36LhDHVV7SNczXCsbFOIC sqxEpht3EdZXJvA0Kws8hp/e/aJDrSWSrMtwNlfeKF82zZqthpccgqVTByopdfII 97xaTR4lGnvpGEsJcTaUVuakKOrzT8Nd1Oy+O/DBg5SNmlQC2dZwYTNZG8Yf0yKt qszCDzsw0cwTGLMNt+O007gP3aqwKqWw6iDOzndXcLMSTjz+6k3Ayw/cSZYDGyjG -PxnB/ZP6BiDIRsXsLtZriE8EGBECAA8FAkqXMWkCGwwFCQPCZwAACgkQeXUttslm +PxnB/ZP6BiDIRsXsLtZrwk8EGBECAA8FAkqXMWkCGwwFCQPCZwAACgkQeXUttslm 8Lj3NQCeOBP0sP0G9/RVN593WRVf6uzT8IUAoIhxBvKhTjQtx4t7oNb/cJR4YXWx -=obDX +=0ATW -----END PGP PUBLIC KEY BLOCK----- pub 79E193516BE7998F @@ -8512,51 +7894,54 @@ uid Filip Jirs?k sub 9F7335D63326E7F9 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBFWdcSoBCADK8j+0eVZKUGctZo/VaJ/K2Wppx4jEFgih8xiIWREQ9B3QEugJ +xsBNBFWdcSoBCADK8j+0eVZKUGctZo/VaJ/K2Wppx4jEFgih8xiIWREQ9B3QEugJ mJMWZHhrnHB+sjVx5No482ch6sVhYmC+VMyTdzepItZ8beYa0pnNGJnrFT+HcTOS g21Ef5e6BRORNho2j9YTvxvjof29XxU4SJFVgffs48jGeJzN1EDmOz4OlZupKGU+ 98o+kMKCiFjcf6Vu03asuml97b2fMOJ09n+UQVlZbBR/Yo407ZLkL2Elx47Fz+82 iO+M8w2qNnxT4PA/TLgaVzkVHaR/JIDlQQ4DfuyloQI1hBpMB8f60oukVr5dBGuS 1dPZ1H7td975sLegWoj7CCOFZXrDzYUXwwXPABEBAAG0IEZpbGlwIEppcnPDoWsg -PGZpbGlwQGppcnNhay5vcmc+uQENBFWdcSoBCACidgjpeAycovmOPWf/eRXEoD7i +PGZpbGlwQGppcnNhay5vcmc+zsBNBFWdcSoBCACidgjpeAycovmOPWf/eRXEoD7i bTOdKgy60rcHYPeB6pPMVaUMhZQQ4QTTRTaYEw9SJtD2itu7khittctHq3RA5EmI e50/cvF22MipcJqB3MJ7AnQp+92lH9rrl2xQsu7j6/xHsoEf6UFWzRo3TPx7nf1l qgY8JVpaWLJtsfByvLi04y73DIF0+W3SmSpDvL5h6teAc76Fz26tBVj3MdUFF7Un a+rMU42K0WUPkGhPfzqnPy0GLRbfYnjqdOBF66TMlYtu1Xnd/FgAVSugDth3LbFg pDbJWoGr02tpQ2pt22USElENLdZ5CziK22D6jIy6Yh02NJtSVsNfQ7sQ/XopABEB -AAGJAR8EGAEIAAkFAlWdcSoCGwwACgkQeeGTUWvnmY8ABQf+K0Uy8ar+uLVqVFeE +AAHCwF8EGAEIAAkFAlWdcSoCGwwACgkQeeGTUWvnmY8ABQf+K0Uy8ar+uLVqVFeE tuHHz8ebAEGSBLzAK7+ggg8RnhaNEHwR8RgAxuaq2ZsYVz+UvZBLG+oByxQYWVWp F75TH0uKVDH/zjO8Ppob3R5PN8Wk1QeSAE5LumhFsOCBVoJK4NgqLJNzTuEc2XiJ k43dVKI5pd//ivNsjO/SfSzBzSzTQ3UhzAj+k/7vi362Z8fg9SNnBQLpxccwdJ+8 iYA7aE8wBt3esn9k79lXCM2hyNHl9CP8xI6CXmGJcSS4F2iqgPSVMkxgLA+DA8Y1 wGvbF5c4rF4iVtgbCH+PcCwrQ6m6pQl9nnC8ANt2Zyj7o+JqefWrRa+F+ZFqJ7sg 8ba0HQ== -=DwAM +=Vimk -----END PGP PUBLIC KEY BLOCK----- pub 7A01B0F236E5430F +uid Inderjeet Singh + sub C3E640F38D845FA2 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBFZUsiQBCADGmoidvh3VvXWGdwbAtHPtDPKEebE/MfFVO+QTRbjJxphzKwAt +xsBNBFZUsiQBCADGmoidvh3VvXWGdwbAtHPtDPKEebE/MfFVO+QTRbjJxphzKwAt mxHruikafaSTnC9FWizj99e/Yc45YZHcnt5Htmy0a7DSOQXL37rrnieZxg86tYmC 4PxvvzC/s7xF8wmxDo4A+mRyoSF0NF/fQTZAr3ri5l0G/vntH7w8AbiiyerpLobW /TqQn1tpMh7XfZZ+XqQKANVRECUiCYT4iJKWMqcBpLZW8aa+iYW8yCQ1xfmNXjrx jpTqFCiQjvwCw4dDffNe/A1Dbq0wE6mw3YHW3OC1fnLiP+TEM9P9v02bZyem6uW2 -+krrToLTTHSqIGF9wUUF6S3Ikrw2EtJiRQtnABEBAAG5AQ0EVlSyJAEIAL0+8UoJ -uUsC3jDE60tmrApu/hK+dCbe5UJnR8z93aQ/1AfEX6So6JZzBlxID/HCOvRjJbau -L6Lrvw2xgSnrnOzRLf1StvBPASfJk1Zdo9LZon6Xofzg34qCLUQLkDyntgXQaYF3 -Yw/xfiqqTC/yav29VTzKnf0Nri8aXGsHOycJ8nTO7I0p4xuRirFu7Bkvd7bK99/t -DxttYkvUnG3BUGlr85UX4uODh3EcVcgVQteawYbmsf4F00IBoTAycutCOdbP2RAg -P6kgFxLcGz4zVqu93QjSjEdTegF1SUXcGpzvDR8T8zRsQbBCZ32A/UJqmx+EIPPF -HNkLijDp+f5mkJcAEQEAAYkBHwQYAQIACQUCVlSyJAIbDAAKCRB6AbDyNuVDD2xj -CACqL670xI/26dWsz66ZyHQ2yJI7DNQxoiU3OZs2bfrRZxLpGP9Q6YWCehb+iucv -mFFvLZBoGGWzffmVBisD2Yz3mHtF3wLx+2zJXHt1Xz7H6W89M54T3qUhQTTV6pl5 -f5/JCXK1DP9iC0y453ORY5B60byrGIUvBAv+qWXBPn3ECZ/3oEkErb5ZGof+gJjf -fqvWRAN3Li0WBRj0ldXpJoP/YE8naDJ7UdPfzcnh3tnOTfUDvFer1Nh00ilMmf6E -YznRwaN9whc9W/1HwvDeXrijrc6/1U7Hp1r5b1DddTtx6aHxpWrcwYw1yXGcm82f -jXnRdomz6nBt2DF400YubAZR -=dciM ++krrToLTTHSqIGF9wUUF6S3Ikrw2EtJiRQtnABEBAAG0K0luZGVyamVldCBTaW5n +aCA8aW5kZXJAYWx1bW5pLnN0YW5mb3JkLmVkdT7OwE0EVlSyJAEIAL0+8UoJuUsC +3jDE60tmrApu/hK+dCbe5UJnR8z93aQ/1AfEX6So6JZzBlxID/HCOvRjJbauL6Lr +vw2xgSnrnOzRLf1StvBPASfJk1Zdo9LZon6Xofzg34qCLUQLkDyntgXQaYF3Yw/x +fiqqTC/yav29VTzKnf0Nri8aXGsHOycJ8nTO7I0p4xuRirFu7Bkvd7bK99/tDxtt +YkvUnG3BUGlr85UX4uODh3EcVcgVQteawYbmsf4F00IBoTAycutCOdbP2RAgP6kg +FxLcGz4zVqu93QjSjEdTegF1SUXcGpzvDR8T8zRsQbBCZ32A/UJqmx+EIPPFHNkL +ijDp+f5mkJcAEQEAAcLAXwQYAQIACQUCVlSyJAIbDAAKCRB6AbDyNuVDD2xjCACq +L670xI/26dWsz66ZyHQ2yJI7DNQxoiU3OZs2bfrRZxLpGP9Q6YWCehb+iucvmFFv +LZBoGGWzffmVBisD2Yz3mHtF3wLx+2zJXHt1Xz7H6W89M54T3qUhQTTV6pl5f5/J +CXK1DP9iC0y453ORY5B60byrGIUvBAv+qWXBPn3ECZ/3oEkErb5ZGof+gJjffqvW +RAN3Li0WBRj0ldXpJoP/YE8naDJ7UdPfzcnh3tnOTfUDvFer1Nh00ilMmf6EYznR +waN9whc9W/1HwvDeXrijrc6/1U7Hp1r5b1DddTtx6aHxpWrcwYw1yXGcm82fjXnR +domz6nBt2DF400YubAZR +=wcly -----END PGP PUBLIC KEY BLOCK----- pub 7A8860944FAD5F62 @@ -8565,7 +7950,7 @@ uid Sebastian Bazley (ASF CODE SIGNING KEY) sub C189C86B813330C4 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQINBEvxja8BEADAzZOup1X0B12zJsNsDvXVIwmM6bB+uhEsUHoFTvmsEVwRoZtn +xsFNBEvxja8BEADAzZOup1X0B12zJsNsDvXVIwmM6bB+uhEsUHoFTvmsEVwRoZtn i7Q0WSFoY+LDxbvC4Bg1+urCrUrstRJYRyF/pMqPYq/HokRlPjtrli/i3mUSd0zN PGC5+qXvAlOck3GK8Hv05PsW32SlSczZw6PSDKh0natuM3hnb+vt+w2MXadXoSwU EV6GtSZpj19vRzAwG/Zv+ZUDCBXVQG13mG7nr6+Q9+E0hJf8i/XZBcvTuWPy5niY @@ -8577,7 +7962,7 @@ u68Q51i3fG92Owgy4Z/YXN/IgnAUrCb+EkLYIscSHby1voyvj2a/nIXajmldHqNX 63EGV3k8A6IB/WJScGveJsNRGCZLReff+UyvRkRy0jVVI0/G32ge13PbpPLGHoRx LXiBSZ6Nuat8R4PS3ry8HKzFx6r2+VO082ptyLjl7e3yQzdVNshpxYxQZwARAQAB tDlTZWJhc3RpYW4gQmF6bGV5IChBU0YgQ09ERSBTSUdOSU5HIEtFWSkgPHNlYmJA -YXBhY2hlLm9yZz65Ag0ES/GNrwEQAN+4ziP52k2AwMNcZ6bFMbYeRBiJk2uj/K0f +YXBhY2hlLm9yZz7OwU0ES/GNrwEQAN+4ziP52k2AwMNcZ6bFMbYeRBiJk2uj/K0f 5Y4Fn3rYSAoda3xEq4cP7r18dvhsOMcoUXzJW/36iR6LSorXdJZz/65FRXIuafXE 9f1yBO+MKF+ydEYmWKgVndfF1Ane8fyH8ypvTKrECCOhZhAioh4CUT7sjA1hnL4u y4MPw5RRJsI3fM1D0TjYyjUgPCIyAeXohARa9iqO4gKK7qcQDjZta4xAm5zsftTG @@ -8588,7 +7973,7 @@ HOo6igrD2FSmo1iS+HzyHpBAtyR0f1MogeomT1SIQ0gS/ftclpWyvVZIC894e6xC gxLyT8D/WSet4tU4WH0ChQob7aCNizpVRHh/V6ksRYsG+wEHAbBtdvDA4hv/RuWu OneHzKnnRO/L5PSFyj19BbU7X7nRrO1AJ9UEhD7781WhBft3nPYrpMRxF8gWggxs A1KYH9lfZq5I0hpTfWFWfhy4Q7IQ2ctgfdcIQtoaFx7qUwQAIPUnWbaLRO1+vXc1 -4K2mmwYzABEBAAGJAh8EGAECAAkFAkvxja8CGwwACgkQeohglE+tX2Ih+Q/+OTpC +4K2mmwYzABEBAAHCwV8EGAECAAkFAkvxja8CGwwACgkQeohglE+tX2Ih+Q/+OTpC unloKhRNiKfMe3hZLiaCeKkcc2c+jZI/9Y5VqJ92qbWeShW6nJ4/4wNdAUggyTwA aMV4qncYC360IzgaUEYvlpnpD0ES0xvIVzl25lJVLisJDS+wg/hlL3fsIqlOBiGW YREW0T6zRwm4LAA26n3CPgnF6Esput1CT78aeOjldEaYYecn2zycZxJJ/EgJc/Mk @@ -8600,16 +7985,14 @@ pqeL0XZl608dHppdyxjKXvqtVe6UrGJdifmWwAOqLb7rcHmIyjnWTNhGdnkbPsxH Grl7hsoSOgxSxgmMO+Vl74ueArTC1bD6JhB9j8KLDkx57ZalDrxVxHJIMso7y7Qk emJxib8JkfFsaOFye3nvehO6ohGnt42hqvBZWke2E/7xC8ds+UM/HfWdrkQve6Yi DHdF2x8pWC+ok+JbFn916yL/54nwMp3l9/9ITv8= -=9dUG +=gh7G -----END PGP PUBLIC KEY BLOCK----- pub 7C25280EAE63EBE5 -uid Oleg Kalnichevski - sub 926DFB2EDB329089 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGiBEPonucRBACtbhYckAoyz1tuSXYX4XiqGa5390gIMcxe2hJ+Ncx9o3zX09Im +xsDiBEPonucRBACtbhYckAoyz1tuSXYX4XiqGa5390gIMcxe2hJ+Ncx9o3zX09Im f8PW27BnMrz7EIydgB2wphhjfK4vkNNtm5ZDWH/zJStsk1Fe7lNuuxs8XorX1+8D bhhFEuc2B85vNf2o9Y4V5GFwbD+tFNy4u24n7zg6/VgE2WDvYJ8JRqCEkwCggyLj ba0lsZ2XtSINh/W8ok+9f0sD/A8WhqBfDTEBuG9gnuCYXM0j7XBBPdPS+FXmmfea @@ -8617,31 +8000,32 @@ zyP+URKRprLCdt0ThZAMllIxZJrkbv7aeXVpM6KSZ/XvvaFQ/gha4o4iJFvpoKt1 Er2j4Tz/STKztHGsMt6pqfrMNPWovu4tLuLZQmojtbIk+IwmcYxMy99owH8oV1WC U4HeA/9MlUxzmlmrQF7VLqFTGEEqQaEJqz95wNPj/t1DmI97hshPzXLD4zwKwa9m qZJPStRHM0a6xW2dztF12aXhrmYg1gIGNnsHtq+t8ZhfINZUurSWn0m65WT5notA -15s6hwyDACHWWOgFQ9jmWuGDh0ZpiaBe7BxeTV+MsswY81sOn7QgT2xlZyBLYWxu -aWNoZXZza2kgPG9sZWdAdXJhbC5ydT65Ag0EQ+ifBxAIALIr1cwH89+EBPkuFk1w -rpJ5mIkhBJ8k8JPWsG+dr62JYaENrdhIUQpXP7UekG4TTIWjMT7dTmHrrTr2TeKt -teiBNksGcyAw03IWAKT/26wXSA3+C/1xlhSKn7Qkp/r529CwM2DVbjV7TcEZ4tqv -32d4NcJ4lTGydjKyTbdlYS6z/Sv4qRc+yQiYrbTJ4Jpgxe5hCoZ66gUTi7mxbFHz -Zs9akQuj4hMMsggnRvuJvHyIksqp2twjJGa/1GlX8bhmR1jPB2BpokI2n6ni6qPG -km1nq8w2LRdvr+IQALfXg8HYGMvKDcVxL8O0PhuZYsfuklDGFejSizVGwWH35vcI -1bsAAwUH/A2wO0ac4mVi7+wx40d9QAOZ5xhHrndHQkTvK8H0DZ2kL7iavLIkZlN7 -jwC9jcA4DGmtHE9cbe6eP/P0VNDfaLVap85CzFE7qqv8LUK0LdDlrBCUcsXplhcI -i/WaVOHk4OPXHzkF44Nqt328fQ9V6+gbvz5+1A1PK/Rmw0rRie0d2dJJIbQhK1px -jV27qpVXfLhLMnjNh2KTO+gZh//LzION5TicsoeiHdtGU59x4Fs0SOUGgydSWAYT -LlQoW0z1AnDKMfqoIh+CrUSAI7fpt8NAMY7KqNxBT8HlhqUX6jMolHBEreF/2fVd -jX+NTR/p0O+L90b6T+xFin/RXxLRaa8= -=t151 +15s6hwyDACHWWOgFQ9jmWuGDh0ZpiaBe7BxeTV+MsswY81sOn87BTQRD6J8HEAgA +sivVzAfz34QE+S4WTXCuknmYiSEEnyTwk9awb52vrYlhoQ2t2EhRClc/tR6QbhNM +haMxPt1OYeutOvZN4q216IE2SwZzIDDTchYApP/brBdIDf4L/XGWFIqftCSn+vnb +0LAzYNVuNXtNwRni2q/fZ3g1wniVMbJ2MrJNt2VhLrP9K/ipFz7JCJittMngmmDF +7mEKhnrqBROLubFsUfNmz1qRC6PiEwyyCCdG+4m8fIiSyqna3CMkZr/UaVfxuGZH +WM8HYGmiQjafqeLqo8aSbWerzDYtF2+v4hAAt9eDwdgYy8oNxXEvw7Q+G5lix+6S +UMYV6NKLNUbBYffm9wjVuwADBQf8DbA7RpziZWLv7DHjR31AA5nnGEeud0dCRO8r +wfQNnaQvuJq8siRmU3uPAL2NwDgMaa0cT1xt7p4/8/RU0N9otVqnzkLMUTuqq/wt +QrQt0OWsEJRyxemWFwiL9ZpU4eTg49cfOQXjg2q3fbx9D1Xr6Bu/Pn7UDU8r9GbD +StGJ7R3Z0kkhtCErWnGNXbuqlVd8uEsyeM2HYpM76BmH/8vMg43lOJyyh6Id20ZT +n3HgWzRI5QaDJ1JYBhMuVChbTPUCcMox+qgiH4KtRIAjt+m3w0Axjsqo3EFPweWG +pRfqMyiUcESt4X/Z9V2Nf41NH+nQ74v3RvpP7EWKf9FfEtFpr8JdBBgRAgAGBQJD +6J8HACEJEHwlKA6uY+vlFiEEB4Wz7/YLGxvqlOC7fCUoDq5j6+U3vQCfV0asXnE+ +aHo/jdT35nAky2TXxokAn3R9/kTwWykkKH89mxse/54k3fao +=xOW/ -----END PGP PUBLIC KEY BLOCK----- pub 7C30F7B1329DBA87 uid Ktor Release -sub 0588BC69A286FF16 -sub 3967D4EDA591B991 sub 72FF58594F983302 +sub 3967D4EDA591B991 +sub 0588BC69A286FF16 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGNBF+TCd4BDACbIA94MfIWL0SpvZwBddXgx36Lp9GYOWNgGoQCWSvk9vaMrLaI +xsDNBF+TCd4BDACbIA94MfIWL0SpvZwBddXgx36Lp9GYOWNgGoQCWSvk9vaMrLaI rEll0xnoP98CfBQYrVSAmHDMhSLBCjNB3V1Sdz8GRdOG7HUffF7Cqwbm3Fxo3H/h +Tsrodv23NuvKsDpgglUL6nJy5e/FO8y9dcxLXRRVdPFDhJubi08SiUJy9FQbnfA yb2LuTzXtjDmjEsMZpdpQUlQkk0xNDkrrq+2miwxemVd35cnVQCFP0K7c4T0ksGg @@ -8650,116 +8034,151 @@ Rf9A2r45DBbPfvwTL+ZbrGtCssUpCneWhPl79UsMxeY+vJjEggqqqRqbHRn6nOQd 1JUAHNEFtuJQKGWNuwWO58Yun1EBtOdUEvnIIoQ+CIN/XeKrnEIXE3LSblB8BR3H bqX54BMe9AzsmDQtc5pUOm2pfvCoiv8xFXQznBg24dGqo2A/jMoUnGj6oRj7k8mt i9AdPLigldr0S0sAEQEAAbQhS3RvciBSZWxlYXNlIDxrdG9yQGpldGJyYWlucy5j -b20+uQGNBF+TCkEBDADafdzCGQlmG4e83+VsqAVCmiO1SlVkfwfgXpuXdnLx+rDz -f6FgkIwUcNwkBpTCQF3i457Mt50kKW4XIV9/uzSYM+VohUn273HmN0+2iExW0jW5 -LzxQf0jCnbPDnnfjc2qZ6B5ySmVks8zwsv9vLz6rcK3+IDJYMlTHLQaH+if2v8vz -MJ5r5DowJJOJcxhFZCBThXpWl1zAhpnv+Fwb9sNpoXfANwqzhpSi9PwDVqaw9at9 -fDRZgqlKqdIt7mlUA+Jl4jLe7t9zBquDuNeKCST97IdeTXV/NOGoVkp8pdLyEzQx -xdaCiLDdl8CaN/JVg9Jj/uwQRVq4KvRaUe+jMdQIpYu4RcHPQMkPkLXO5J3kSvk2 -cjtibogiN2HCPpa2G9H9Ar1TKKn1e5U4qy/fDryR11GVlEdFxVsugplbIXZLDzeA -FvEiFWVcMSINTnsKRp8W5yvvd58sEI+WbMLwym/825oRs1VocbTIfqjSmD68N/Ax -y7z0Vo3ZsUREArFvADUAEQEAAYkBvAQYAQoAJgIbDBYhBDlMtDbFaRb8Ae6kp3ww -97EynbqHBQJjUcQMBQkHgSDLAAoJEHww97EynbqH4rcL/0xgE9PanLa6WddRuN1k -dt148r30mfTSiLc6Kl9ujzMIOf2BEShvRB39ZPPEP4CbOyeOsdIBONTOrbfSnjah -TDp74nRSQOiZ2jZliFe8bqyBtc5xcBf0l18gF+0amutC/UGZ2Q3XfisXOhnPl8vH -LcAxwRdCyoujf3fzG7SvVLXZ+ijsgYp5f6UCguTtMiRkxg7U0MROHpmBYLBWKqaC -buhEpKPPXX7r6xo6J5KnxuMMyEwHa5nGxpQKyBFlVliKSwwdIRuMN9YA175hwjM1 -XY4wJCxtybFGnybnASi04xAuFl2+fHq+i9EEbIlc9BOlwizedFaqu1EJrJKTz5Kf -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 -XwCWdYzvSwRp -=Hi5G +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 +s/VObsFtKMUFPmME +=10eM -----END PGP PUBLIC KEY BLOCK----- pub 7C7D8456294423BA -uid Henri Tremblay - sub 9842FE565AA0601E -----BEGIN PGP PUBLIC KEY BLOCK----- -mQGiBEvsZw4RBADH20nX+H1xvMBYmXRj1Aae4dRr6Y6qI7QRWHO6Z7/dxr9bk/NN +xsDiBEvsZw4RBADH20nX+H1xvMBYmXRj1Aae4dRr6Y6qI7QRWHO6Z7/dxr9bk/NN Yjq5KsVOQxZzloVdtqx75rznT7fZq98g7Nq9IeEtB6k4tnh6XQLhljJMk0a3mzdt q3VzdxeVbwCaPJ0zixv8XPTAH6MpRJUvP9XjzxwaYHrjwcQ1LslW4TrIzwCgi5rf jChLCyKcaL05gqUjl4lmefED/iqOwYZw5pJ8+X+OHUViiOB43wsJt1brAhPj4KgB @@ -8767,22 +8186,21 @@ ODStcE6WlHFKi7YzcYNLzYMebSGYn6bj65b3qNf6rybWD1hGUFK4122Q7+HCH9Ic J+rr8HwjGFo/yxI0/mkyaF0BthXYPy4WtdsdTM2kgx8Zr3Q2rSt1jBPuV3q8d27z FZMiA/9cWPkRx0RfAJmBPKmKkbBkEtBbNau3G7MY1OEAkEkRnzmnyyjr5IP84A7K RdjTCvkbiQrOQH00Ki4sHIg+9Xv1gDg1XLkFDzRARKA1TxjL0OeS4RWF3iia7Swk -MOnTdhR50pjb18W8kB4mEMZY7duP4nwDfQwHMwbFZGHrjImaurQpSGVucmkgVHJl -bWJsYXkgPGhlbnJpLnRyZW1ibGF5QGdtYWlsLmNvbT65Ag0ES+xnEBAIALYa2xQw -2yBqve3W19WRMDRqYyC3XrpsWc2gnOT4JXRxgPOky9lfYj6TjSbb+/wrK9XP67x9 -CAPwRbvtCnXvVD/s/ScnJnyaSLHdkLcX4Z/UePk3dFbTfTTZKbdfiXE4W88kKuFF -PNrgSsEhv8M7mziOBZ/u8qSLjYA5KitEkyC97nChf0Ve+z7DgXix5AhiiFYVFH2N -Q+dQVmSigdXn2lSuzy3Z7IuuJQIW2nsQON3cFFLVcEDrw8yVbZMnFdiDMF8Mh6J5 -SvuL23MCB9gQFOOiyGcvlRWiPpTTZkffsXlh+PaCWJzFiF4n+Ec7ztWoNiisJRtr -GnLlU7aVlaimsgcAAwUH+wRpeDzirZbgG192vyhp19WMomz09nuKXTsamyk8LkXO -yCyCvy1XHo1bi3fnjhdUJo06CO2N6o5c77WsUnpn5MWyEKXbrNEshxBABh/6ozbk -7PGcBJfbTz6ymiR2yfZEK5Qz8JLnwNDQwF0xO+lIXBz2NA3spAChMNq2rxKiO2NJ -10dlkpkSxQoZkPmjU5v/VBiPyKEXUv3YKNXmiw/+0SxXi+bRg3vtp4/geo/udp2R -JmkQlllOzvY2C9XELuVk7q7Z3gi7SKnoS7I7lc/YoQcrGLlHEzlf+ltACHJUKDBI -hUfSsr9KMA5Oi7V9g4ImybgL7y5Z2o7IhpuZ8lYdxtSISQQYEQIACQUCS+xnEAIb -DAAKCRB8fYRWKUQjuol1AJ0XC8Ne5QYXv1nChUZMxE0sWiXIyACePz9TTTp/3knC -3cdu7I3u6t7ARDc= -=xYLL +MOnTdhR50pjb18W8kB4mEMZY7duP4nwDfQwHMwbFZGHrjImaus7BTQRL7GcQEAgA +thrbFDDbIGq97dbX1ZEwNGpjILdeumxZzaCc5PgldHGA86TL2V9iPpONJtv7/Csr +1c/rvH0IA/BFu+0Kde9UP+z9JycmfJpIsd2Qtxfhn9R4+Td0VtN9NNkpt1+JcThb +zyQq4UU82uBKwSG/wzubOI4Fn+7ypIuNgDkqK0STIL3ucKF/RV77PsOBeLHkCGKI +VhUUfY1D51BWZKKB1efaVK7PLdnsi64lAhbaexA43dwUUtVwQOvDzJVtkycV2IMw +XwyHonlK+4vbcwIH2BAU46LIZy+VFaI+lNNmR9+xeWH49oJYnMWIXif4RzvO1ag2 +KKwlG2sacuVTtpWVqKayBwADBQf7BGl4POKtluAbX3a/KGnX1YyibPT2e4pdOxqb +KTwuRc7ILIK/LVcejVuLd+eOF1QmjToI7Y3qjlzvtaxSemfkxbIQpdus0SyHEEAG +H/qjNuTs8ZwEl9tPPrKaJHbJ9kQrlDPwkufA0NDAXTE76UhcHPY0DeykAKEw2rav +EqI7Y0nXR2WSmRLFChmQ+aNTm/9UGI/IoRdS/dgo1eaLD/7RLFeL5tGDe+2nj+B6 +j+52nZEmaRCWWU7O9jYL1cQu5WTurtneCLtIqehLsjuVz9ihBysYuUcTOV/6W0AI +clQoMEiFR9Kyv0owDk6LtX2DgibJuAvvLlnajsiGm5nyVh3G1MJgBBgRAgAJBQJL +7GcQAhsMACEJEHx9hFYpRCO6FiEE6FrtFVAhr4psa3pKfH2EVilEI7qJdQCdFwvD +XuUGF79ZwoVGTMRNLFolyMgAnj8/U006f95Jwt3HbuyN7urewEQ3 +=xEOq -----END PGP PUBLIC KEY BLOCK----- pub 7EB97D110DFADD60 @@ -8791,19 +8209,19 @@ uid Niall Gallagher (www.npgall.com) sub DC0B7E986BD7398F -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBE9/RAsBCADI/pVIFcoLmbq4LCKkqeN4i5xgGKsuQsDAf/ndFkILDUA2FaPN +xsBNBE9/RAsBCADI/pVIFcoLmbq4LCKkqeN4i5xgGKsuQsDAf/ndFkILDUA2FaPN 7cI3EvZacWnWUA0QkkKNKpajU2OjjQlu4IyBosJht3VMtD0BJ2nL8eIDvwO6L8TS 2RRGMnMaDUc91NnoxKs/7VlQ2ySk6Cm6lH3t8KVkwaJdU59lAH1ey9UKhYyvRQuT htenl2R63lyyDe1ZLMAlmQXi4RcCWOO+L1emChNv0q0Fsir+7go9ZNYUi6pmIEva jKXM8bo/VtRIHrS73DsH7BVVCURYoBWexZWlRdb86KSE993dRXLvFPy5JzlRM+eu mUY3CMKxx3nLaDN5qepf1nGzMW88xjq4z4rhABEBAAG0M05pYWxsIEdhbGxhZ2hl -ciAod3d3Lm5wZ2FsbC5jb20pIDxuaWFsbEBucGdhbGwuY29tPrkBDQRPf0QLAQgA +ciAod3d3Lm5wZ2FsbC5jb20pIDxuaWFsbEBucGdhbGwuY29tPs7ATQRPf0QLAQgA 68HLImPvBSPnMtjUHczE+gccsVWzLEsjVYSBcOUi1j67KQHbTPcHAqzYJl19t4FA N/yU1oOjuu/4GKVni27y8NGSavzY5elTZ22lqUqgqT6DjoOG2BTLHuOiNRIMqBmD Gy41mEq62C9I107pqJnnbARmde4646kDiaf2vkF1BsnBx0Dp93re2eJq4rkAf803 fDvA8iyk5uDFiGg3f70JAu7ZCAKczglD0WUjIiO5Jxncz2sWiO2OuVgdsTuZf+9T 0aODKua60Z7CLn4ZK4ZpdibbOEp66XLeaGuy5HPInTTsr4UnT2kvor/AmmPKOryp -9oBFnPvf5+wREwlQN2h/PwARAQABiQJbBBgBAgAPBQJPf0QLAhsuBQkHhh+AAUAJ +9oBFnPvf5+wREwlQN2h/PwARAQABwsGbBBgBAgAPBQJPf0QLAhsuBQkHhh+AAUAJ EH65fREN+t1gwF0gBBkBAgAGBQJPf0QLAAoJENwLfphr1zmPJtcH/RJ5ba5m0Obq BGbcJpJwhEjpB6tCOufdzvvJGAMMAuH0Vs5kXrASIJPyVgJ2ab4txg6U3DKIfxnE IGjfdH9okl/oHRYrI/EDMN0PnIkE1JidhVOEOj3UWaoLUS8vvobKq0XP8B6J+P4q @@ -8817,7 +8235,7 @@ Op85vZ45d17mnwCSHV7G+4jImZF/+lF5ED/x1coIT+ob4pmQk6Hwf2AP/ydfyf/l B+boV/SIUXeZ0Esz1B0Frfr+qjAFhDO7blgUfQ0qLOIXRjavSl3g1CGgCKsZ1qZU 99YrO8eFnxdaGSWvVV77df02pkg5xdDHWusPcEvovBUm0dx9DG5PchEOeOdhdkBQ 5UCV -=Sdfi +=MD5j -----END PGP PUBLIC KEY BLOCK----- pub 7FE9900F412D622E @@ -8826,24 +8244,24 @@ uid Wouter van Oortmerssen sub AE6B5325E74ED034 -----BEGIN PGP PUBLIC KEY BLOCK----- -mQENBFnyVlkBCACe8zGkIlDV0dUKmk9PWe2Hw8qM9DdPbtpUOpmUOidGY5svQDL3 +xsBNBFnyVlkBCACe8zGkIlDV0dUKmk9PWe2Hw8qM9DdPbtpUOpmUOidGY5svQDL3 eqvHk85TbxqFEe3Qbjjt+R+iApFuXy5kmueXTvwCm7nAU+k/pZtPuzHyhDs3iFFH 8LCI/dOpd04LXLpuoeLCjBqPlOM+Pxiiu9h9tEnJaJzuXcw9SY3I/puj7qIEwxsJ W23gdPtYij9If1ht9gtTsDq9s7VbCM5vL0ofM8JVPilnE4oWuw9hjgIfT/QotbuS wPo+1ExZUfaKYPvMxi2kY3LZU3hlp6P5AxU+eI31yaYjtL+0lu66jTD6s8lwmF87 QqjjxiHwic05//tp2Pk3PIZCoQurfEL6ZHhhABEBAAG0LFdvdXRlciB2YW4gT29y -dG1lcnNzZW4gPGFhcmRhcHBlbEBnbWFpbC5jb20+uQENBFnyVlkBCACk/9GoJK23 +dG1lcnNzZW4gPGFhcmRhcHBlbEBnbWFpbC5jb20+zsBNBFnyVlkBCACk/9GoJK23 GwRKF8kx4h2oOkb63mP7DSPmsgBGCxvhH04oE9Rg+SPWKTjx7E0XFytyCuBYn9Bo yGVPp45X5k4Vvj6sNJsSuyW7ExJf1AA7Xqa0mo1tjsUPSeAWyhruZCTaHGmnY6Cl A3Bsy4E1C8sC0UapW9dNAf66SDp0jWeEkU366fa0RZexz92nIDCTQv4YZkYROX63 P6Se7hNtontmKA6JajD+46OLGgNVgdSKZpO0PMyD8VMg5RUN8PXHqZ68gJ1ihjUJ 499sXFuAaXKcxkbb+ajD6fYPQ2jy4S1tQpUGmBKAdvthMenEShmwk6lsTN86yH5q -9tTNwMWjTbqFABEBAAGJAR8EGAECAAkFAlnyVlkCGwwACgkQf+mQD0EtYi7nngf/ +9tTNwMWjTbqFABEBAAHCwF8EGAECAAkFAlnyVlkCGwwACgkQf+mQD0EtYi7nngf/ aPDwJQG7NICIuMue/QlWCUG4zW2FZL1iCKMYhfVnz29lM/5AG4Y0SlcRkgEigizB QUkeLVHaj3obLlxr1I5yrjaOwD/fruk3roC1pi+1i0sv0/eZJvyVN3Ta3pjzYDT/ Qw09Ao5py7HksJsvAM8tIbw5hnmxq091M8/zdgIi/H38QFBWKNYaPkC6WMxWv0M4 7Kttcfv1DBF/NmsMzts45BDoE98CVB/5M2eLVVrbHlj4QqpLDTeSYwcTb7JVSKrN byp2Ws27l1oNhMexztBivHz1OLxGJY8odrCtuxK3JMllDdln/HHdwrp6h7SDRdxR 6llX74zIdctZVsii8eJHvA== -=DZ0u +=LFgr -----END PGP PUBLIC KEY BLOCK----- diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 48465f5b1b02..2a99e2c815e1 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -11,6 +11,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -410,6 +455,7 @@ + @@ -841,6 +887,14 @@ + + + + + + + + @@ -915,10 +969,10 @@ - + - + @@ -963,10 +1017,10 @@ - + - + @@ -1172,10 +1226,10 @@ - + - + @@ -1198,10 +1252,10 @@ - + - + @@ -1245,10 +1299,10 @@ - + - + @@ -1403,12 +1457,20 @@ - + + + + + + + + + @@ -1451,10 +1513,18 @@ - + - + + + + + + + + + @@ -1507,12 +1577,20 @@ - + + + + + + + + + @@ -1555,10 +1633,18 @@ - + + + + + + + + + - + @@ -1603,12 +1689,20 @@ - + + + + + + + + + @@ -1651,10 +1745,18 @@ - + - + + + + + + + + + @@ -1699,12 +1801,20 @@ - + + + + + + + + + @@ -1747,10 +1857,18 @@ - + + + + + + + + + - + @@ -1783,6 +1901,11 @@ + + + + + @@ -1831,6 +1954,14 @@ + + + + + + + + @@ -1849,10 +1980,10 @@ - + - + @@ -1873,10 +2004,10 @@ - + - + @@ -1921,12 +2052,20 @@ - + + + + + + + + + @@ -1969,10 +2108,18 @@ - + + + + + + + + + - + @@ -1985,10 +2132,10 @@ - + - + @@ -2001,10 +2148,10 @@ - + - + @@ -2075,12 +2222,20 @@ - + + + + + + + + + @@ -2123,26 +2278,50 @@ - + + + + + + + + + - + - + + + + + + + + + - + + + + + + + + + - + @@ -2208,12 +2387,20 @@ - + + + + + + + + + @@ -2256,10 +2443,18 @@ - + + + + + + + + + - + @@ -2320,12 +2515,20 @@ - + + + + + + + + + @@ -2368,10 +2571,18 @@ - + - + + + + + + + + + @@ -2432,12 +2643,20 @@ - + + + + + + + + + @@ -2480,10 +2699,18 @@ - + + + + + + + + + - + @@ -2544,12 +2771,20 @@ - + + + + + + + + + @@ -2592,10 +2827,18 @@ - + - + + + + + + + + + @@ -2614,6 +2857,19 @@ + + + + + + + + + + + + + @@ -2630,6 +2886,19 @@ + + + + + + + + + + + + + @@ -2688,12 +2957,20 @@ - + + + + + + + + + @@ -2736,10 +3013,18 @@ - + + + + + + + + + - + @@ -2772,6 +3057,11 @@ + + + + + @@ -2820,6 +3110,14 @@ + + + + + + + + @@ -2850,6 +3148,11 @@ + + + + + @@ -2898,6 +3201,14 @@ + + + + + + + + @@ -2946,6 +3257,14 @@ + + + + + + + + @@ -2994,6 +3313,14 @@ + + + + + + + + @@ -3052,12 +3379,20 @@ - + + + + + + + + + @@ -3100,10 +3435,18 @@ - + - + + + + + + + + + @@ -3164,12 +3507,20 @@ - + + + + + + + + + @@ -3212,10 +3563,18 @@ - + + + + + + + + + - + @@ -3292,10 +3651,10 @@ - + - + @@ -3324,10 +3683,10 @@ - + - + @@ -3404,7 +3763,7 @@ - + @@ -3499,10 +3858,10 @@ - + - + @@ -3546,10 +3905,10 @@ - + - + @@ -3610,10 +3969,10 @@ - + - + @@ -3730,10 +4089,10 @@ - + - + @@ -3850,10 +4209,10 @@ - + - + @@ -3970,10 +4329,10 @@ - + - + @@ -4090,10 +4449,10 @@ - + - + @@ -4210,10 +4569,10 @@ - + - + @@ -4330,10 +4689,10 @@ - + - + @@ -4445,6 +4804,11 @@ + + + + + @@ -4453,11 +4817,24 @@ + + + + + + + + + + + + + @@ -4466,11 +4843,24 @@ + + + + + + + + + + + + + @@ -4479,11 +4869,24 @@ + + + + + + + + + + + + + @@ -4492,11 +4895,32 @@ + + + + + + + + + + + + + + + + + + + + + @@ -4513,6 +4937,14 @@ + + + + + + + + @@ -4521,6 +4953,14 @@ + + + + + + + + @@ -4555,10 +4995,10 @@ - + - + @@ -4635,10 +5075,10 @@ - + - + @@ -4774,7 +5214,7 @@ - + @@ -4843,10 +5283,10 @@ - + - + @@ -4873,6 +5313,14 @@ + + + + + + + + @@ -4889,6 +5337,14 @@ + + + + + + + + @@ -5018,7 +5474,7 @@ - + @@ -5045,6 +5501,14 @@ + + + + + + + + @@ -5076,10 +5540,10 @@ - + - + @@ -5106,6 +5570,14 @@ + + + + + + + + @@ -5124,10 +5596,10 @@ - + - + @@ -5154,6 +5626,14 @@ + + + + + + + + @@ -5232,7 +5712,7 @@ - + @@ -5263,6 +5743,9 @@ + + + @@ -5327,10 +5810,10 @@ - + - + @@ -5357,6 +5840,14 @@ + + + + + + + + @@ -5396,10 +5887,10 @@ - + - + @@ -5426,6 +5917,14 @@ + + + + + + + + @@ -5468,10 +5967,10 @@ - + - + @@ -5498,6 +5997,14 @@ + + + + + + + + @@ -5568,7 +6075,7 @@ - + @@ -5595,6 +6102,14 @@ + + + + + + + + @@ -5613,10 +6128,10 @@ - + - + @@ -5643,6 +6158,14 @@ + + + + + + + + @@ -5655,7 +6178,7 @@ - + @@ -5682,6 +6205,14 @@ + + + + + + + + @@ -5700,10 +6231,10 @@ - + - + @@ -5730,6 +6261,14 @@ + + + + + + + + @@ -5766,7 +6305,7 @@ - + @@ -5793,6 +6332,14 @@ + + + + + + + + @@ -5811,10 +6358,10 @@ - + - + @@ -5841,6 +6388,14 @@ + + + + + + + + @@ -5881,6 +6436,14 @@ + + + + + + + + @@ -5957,10 +6520,10 @@ - + - + @@ -5996,6 +6559,17 @@ + + + + + + + + + + + @@ -6014,10 +6588,10 @@ - + - + @@ -6044,6 +6618,14 @@ + + + + + + + + @@ -6083,10 +6665,10 @@ - + - + @@ -6113,6 +6695,14 @@ + + + + + + + + @@ -6168,7 +6758,7 @@ - + @@ -6204,12 +6794,23 @@ + + + + + + + + + + + - + - + @@ -6236,6 +6837,14 @@ + + + + + + + + @@ -7113,6 +7722,14 @@ + + + + + + + + @@ -7129,6 +7746,14 @@ + + + + + + + + @@ -7161,6 +7786,14 @@ + + + + + + + + @@ -7193,6 +7826,14 @@ + + + + + + + + @@ -7209,6 +7850,14 @@ + + + + + + + + @@ -7238,6 +7887,14 @@ + + + + + + + + @@ -7270,6 +7927,14 @@ + + + + + + + + @@ -7286,6 +7951,14 @@ + + + + + + + + @@ -7318,6 +7991,14 @@ + + + + + + + + @@ -7334,6 +8015,14 @@ + + + + + + + + @@ -7366,6 +8055,14 @@ + + + + + + + + @@ -7382,6 +8079,14 @@ + + + + + + + + @@ -7416,7 +8121,7 @@ - + @@ -7424,55 +8129,55 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -7493,18 +8198,18 @@ - + - + - + - + @@ -7517,7 +8222,7 @@ - + @@ -7555,6 +8260,14 @@ + + + + + + + + @@ -7571,6 +8284,14 @@ + + + + + + + + @@ -7608,6 +8329,14 @@ + + + + + + + + @@ -7624,6 +8353,14 @@ + + + + + + + + @@ -7703,10 +8440,10 @@ - + - + @@ -7735,10 +8472,10 @@ - + - + @@ -7791,10 +8528,10 @@ - + - + @@ -7823,10 +8560,10 @@ - + - + @@ -7852,10 +8589,10 @@ - + - + @@ -7894,10 +8631,10 @@ - + - + @@ -7918,10 +8655,10 @@ - + - + @@ -7942,10 +8679,10 @@ - + - + @@ -7974,10 +8711,10 @@ - + - + @@ -8006,10 +8743,10 @@ - + - + @@ -8030,10 +8767,10 @@ - + - + @@ -8054,10 +8791,10 @@ - + - + @@ -8086,10 +8823,10 @@ - + - + @@ -8115,10 +8852,10 @@ - + - + @@ -8147,10 +8884,10 @@ - + - + @@ -8299,10 +9036,10 @@ - + - + @@ -8353,6 +9090,14 @@ + + + + + + + + @@ -8401,6 +9146,14 @@ + + + + + + + + @@ -8419,10 +9172,10 @@ - + - + @@ -8509,10 +9262,10 @@ - + - + @@ -8629,10 +9382,10 @@ - + - + @@ -8723,6 +9476,11 @@ + + + + + @@ -8754,10 +9512,10 @@ - + - + @@ -8848,6 +9606,11 @@ + + + + + @@ -8879,10 +9642,10 @@ - + - + @@ -8999,10 +9762,10 @@ - + - + @@ -9119,10 +9882,10 @@ - + - + @@ -9287,10 +10050,10 @@ - + - + @@ -9407,10 +10170,10 @@ - + - + @@ -9527,10 +10290,10 @@ - + - + @@ -9647,10 +10410,10 @@ - + - + @@ -9767,10 +10530,10 @@ - + - + @@ -9887,10 +10650,10 @@ - + - + @@ -10007,10 +10770,10 @@ - + - + @@ -10126,6 +10889,9 @@ + + + @@ -10215,10 +10981,10 @@ - + - + @@ -10335,10 +11101,10 @@ - + - + @@ -10455,10 +11221,10 @@ - + - + @@ -10575,10 +11341,10 @@ - + - + @@ -10695,10 +11461,10 @@ - + - + @@ -10815,10 +11581,10 @@ - + - + @@ -10935,10 +11701,10 @@ - + - + @@ -11103,10 +11869,10 @@ - + - + @@ -11223,10 +11989,10 @@ - + - + @@ -11319,10 +12085,10 @@ - + - + @@ -11351,10 +12117,10 @@ - + - + @@ -11471,10 +12237,10 @@ - + - + @@ -11619,10 +12385,10 @@ - + - + @@ -11739,10 +12505,10 @@ - + - + @@ -12003,10 +12769,10 @@ - + - + @@ -12315,10 +13081,10 @@ - + - + @@ -12435,10 +13201,10 @@ - + - + @@ -12555,10 +13321,10 @@ - + - + @@ -12675,10 +13441,10 @@ - + - + @@ -13019,10 +13785,10 @@ - + - + @@ -13099,10 +13865,10 @@ - + - + @@ -13179,10 +13945,10 @@ - + - + @@ -13299,10 +14065,10 @@ - + - + @@ -13419,10 +14185,10 @@ - + - + @@ -13539,10 +14305,10 @@ - + - + @@ -13659,10 +14425,10 @@ - + - + @@ -13779,10 +14545,10 @@ - + - + @@ -13899,10 +14665,10 @@ - + - + @@ -14019,10 +14785,10 @@ - + - + @@ -14139,10 +14905,10 @@ - + - + @@ -14259,10 +15025,10 @@ - + - + @@ -14379,10 +15145,10 @@ - + - + @@ -14499,10 +15265,10 @@ - + - + @@ -14795,10 +15561,10 @@ - + - + @@ -14915,10 +15681,10 @@ - + - + @@ -15035,10 +15801,10 @@ - + - + @@ -15186,26 +15952,26 @@ - + - + - + - + - + - + @@ -15291,10 +16057,10 @@ - + - + @@ -15331,10 +16097,10 @@ - + - + @@ -15371,10 +16137,10 @@ - + - + @@ -15798,6 +16564,14 @@ + + + + + + + + @@ -15814,6 +16588,14 @@ + + + + + + + + @@ -15830,6 +16612,14 @@ + + + + + + + + @@ -15854,6 +16644,14 @@ + + + + + + + + @@ -15870,12 +16668,20 @@ + + + + + + + + - + - + @@ -15966,6 +16772,14 @@ + + + + + + + + @@ -16046,6 +16860,14 @@ + + + + + + + + @@ -16382,6 +17204,14 @@ + + + + + + + + @@ -17178,6 +18008,11 @@ + + + + + @@ -17218,6 +18053,14 @@ + + + + + + + + @@ -17258,6 +18101,14 @@ + + + + + + + + @@ -17378,6 +18229,14 @@ + + + + + + + + @@ -17435,10 +18294,10 @@ - + - + @@ -17537,6 +18396,14 @@ + + + + + + + + @@ -17569,6 +18436,14 @@ + + + + + + + + @@ -17638,6 +18513,14 @@ + + + + + + + + @@ -17854,10 +18737,10 @@ - + - + @@ -17878,18 +18761,18 @@ - + - + - + - + @@ -18045,10 +18928,10 @@ - + - + @@ -18583,6 +19466,11 @@ + + + + + @@ -18671,6 +19559,14 @@ + + + + + + + + @@ -18703,6 +19599,14 @@ + + + + + + + + @@ -18756,7 +19660,7 @@ - + @@ -18822,10 +19726,10 @@ - + - + @@ -18852,6 +19756,14 @@ + + + + + + + + @@ -18940,6 +19852,14 @@ + + + + + + + + @@ -19020,6 +19940,14 @@ + + + + + + + + @@ -19108,6 +20036,14 @@ + + + + + + + + @@ -19376,6 +20312,14 @@ + + + + + + + + @@ -19391,10 +20335,10 @@ - + - + @@ -19429,6 +20373,14 @@ + + + + + + + + @@ -19471,10 +20423,10 @@ - + - + @@ -19637,15 +20589,26 @@ + + + + + + + + - + - + + + + @@ -20184,10 +21147,10 @@ - + - + @@ -20208,18 +21171,18 @@ - + - + - + - + @@ -20325,6 +21288,14 @@ + + + + + + + + @@ -20655,10 +21626,10 @@ - + - + @@ -20671,10 +21642,10 @@ - + - + @@ -20687,10 +21658,10 @@ - + - + @@ -20754,6 +21725,11 @@ + + + + + @@ -20778,6 +21754,14 @@ + + + + + + + + @@ -20786,6 +21770,14 @@ + + + + + + + + @@ -20820,18 +21812,18 @@ - + - + - + - + @@ -20849,10 +21841,10 @@ - + - + @@ -20899,10 +21891,10 @@ - + - + @@ -20931,7 +21923,7 @@ - + @@ -20942,10 +21934,10 @@ - + - + @@ -21417,10 +22409,10 @@ - + - + @@ -21493,10 +22485,15 @@ - + - + + + + + + @@ -21525,10 +22522,10 @@ - + - + @@ -21541,10 +22538,10 @@ - + - + @@ -21557,10 +22554,10 @@ - + - + @@ -22250,6 +23247,11 @@ + + + + + @@ -23633,23 +24635,23 @@ - + - + - + - + - + @@ -23707,10 +24709,10 @@ - + - + @@ -23859,10 +24861,10 @@ - + - + @@ -23913,6 +24915,14 @@ + + + + + + + + @@ -24033,7 +25043,7 @@ - + @@ -24194,7 +25204,7 @@ - + @@ -24204,7 +25214,7 @@ - + @@ -24241,7 +25251,7 @@ - + @@ -24369,10 +25379,10 @@ - + - + @@ -24390,12 +25400,12 @@ - + - + @@ -24405,23 +25415,23 @@ - + - + - + - + @@ -24434,18 +25444,18 @@ - + - + - + - + @@ -24706,10 +25716,10 @@ - + - + @@ -25100,10 +26110,10 @@ - + - + @@ -25129,22 +26139,22 @@ - + - + - + - + @@ -25229,10 +26239,10 @@ - + - + @@ -25258,18 +26268,18 @@ - + - + - + - + @@ -25438,10 +26448,10 @@ - + - + @@ -25489,18 +26499,18 @@ - + - + - + - + @@ -25521,10 +26531,10 @@ - + - + @@ -25545,10 +26555,10 @@ - + - + @@ -25609,10 +26619,10 @@ - + - + @@ -25649,10 +26659,10 @@ - + - + @@ -25686,10 +26696,10 @@ - + - + @@ -25814,10 +26824,10 @@ - + - + @@ -25827,7 +26837,7 @@ - + @@ -25912,10 +26922,10 @@ - + - + @@ -25981,10 +26991,10 @@ - + - + @@ -26045,10 +27055,10 @@ - + - + @@ -26093,10 +27103,10 @@ - + - + @@ -26149,10 +27159,10 @@ - + - + @@ -26226,10 +27236,10 @@ - + - + @@ -26290,10 +27300,10 @@ - + - + @@ -26367,10 +27377,10 @@ - + - + @@ -26407,10 +27417,10 @@ - + - + @@ -26463,10 +27473,10 @@ - + - + @@ -26535,10 +27545,10 @@ - + - + @@ -26607,10 +27617,10 @@ - + - + @@ -26703,13 +27713,13 @@ - + - + - + @@ -26778,10 +27788,10 @@ - + - + @@ -26850,10 +27860,10 @@ - + - + @@ -26922,10 +27932,10 @@ - + - + @@ -27004,10 +28014,10 @@ - + - + @@ -27076,10 +28086,10 @@ - + - + @@ -27148,10 +28158,10 @@ - + - + @@ -27167,15 +28177,15 @@ - + - + - + @@ -27188,10 +28198,10 @@ - + - + @@ -27260,10 +28270,10 @@ - + - + @@ -27332,10 +28342,10 @@ - + - + @@ -27353,10 +28363,10 @@ - + - + @@ -27417,10 +28427,10 @@ - + - + @@ -27433,10 +28443,10 @@ - + - + @@ -27449,10 +28459,10 @@ - + - + @@ -27505,18 +28515,18 @@ - + - + - + - + @@ -27529,18 +28539,18 @@ - + - + - + - + @@ -27577,10 +28587,10 @@ - + - + @@ -27633,10 +28643,10 @@ - + - + @@ -27705,10 +28715,10 @@ - + - + @@ -27777,10 +28787,10 @@ - + - + @@ -27849,10 +28859,10 @@ - + - + @@ -27921,15 +28931,31 @@ - + - + + + + + + + + + + + + + + + + + - + @@ -27945,7 +28971,7 @@ - + @@ -27958,23 +28984,26 @@ - + - + + + + - + - + - + @@ -27987,10 +29016,10 @@ - + - + @@ -28017,7 +29046,7 @@ - + @@ -28038,10 +29067,10 @@ - + - + @@ -28062,10 +29091,10 @@ - + - + @@ -28092,13 +29121,13 @@ - + - + @@ -28117,10 +29146,10 @@ - + - + @@ -28131,18 +29160,18 @@ - + - + - + - + @@ -28155,7 +29184,7 @@ - + @@ -28181,23 +29210,26 @@ - + - + + + + - + - + - + @@ -28205,15 +29237,15 @@ - + - + - + @@ -28241,7 +29273,7 @@ - + @@ -28256,7 +29288,7 @@ - + @@ -28271,7 +29303,7 @@ - + @@ -28281,7 +29313,7 @@ - + @@ -28291,15 +29323,15 @@ - + - + - + @@ -28307,15 +29339,15 @@ - + - + - + @@ -28328,18 +29360,18 @@ - + - + - + - + @@ -28352,10 +29384,10 @@ - + - + @@ -28440,10 +29472,10 @@ - + - + @@ -28456,10 +29488,10 @@ - + - + @@ -28467,15 +29499,15 @@ - + - + - + @@ -28493,18 +29525,18 @@ - + - + - + - + @@ -28517,10 +29549,10 @@ - + - + @@ -28605,10 +29637,10 @@ - + - + @@ -28621,10 +29653,10 @@ - + - + @@ -28693,10 +29725,10 @@ - + - + @@ -28765,10 +29797,10 @@ - + - + @@ -28837,10 +29869,10 @@ - + - + @@ -28893,18 +29925,18 @@ - + - + - + - + @@ -28912,6 +29944,11 @@ + + + + + @@ -29055,6 +30092,11 @@ + + + + + @@ -29152,7 +30194,7 @@ - + @@ -29258,7 +30300,7 @@ - + @@ -29429,11 +30471,29 @@ + + + + + + + + + + + + + + + + + + @@ -29442,6 +30502,14 @@ + + + + + + + + @@ -29473,6 +30541,11 @@ + + + + + @@ -29494,6 +30567,22 @@ + + + + + + + + + + + + + + + + @@ -29518,6 +30607,22 @@ + + + + + + + + + + + + + + + + @@ -29541,6 +30646,22 @@ + + + + + + + + + + + + + + + + @@ -29565,6 +30686,22 @@ + + + + + + + + + + + + + + + + @@ -29573,6 +30710,14 @@ + + + + + + + + @@ -30127,10 +31272,10 @@ - + - + @@ -30175,10 +31320,10 @@ - + - + @@ -30238,10 +31383,10 @@ - + - + @@ -30286,10 +31431,10 @@ - + - + @@ -30334,10 +31479,10 @@ - + - + @@ -30350,10 +31495,10 @@ - + - + @@ -30404,6 +31549,14 @@ + + + + + + + + @@ -30622,7 +31775,7 @@ - + diff --git a/jacoco.gradle b/jacoco.gradle deleted file mode 100644 index f3a7090b679b..000000000000 --- a/jacoco.gradle +++ /dev/null @@ -1,106 +0,0 @@ -apply plugin: "jacoco" - -jacoco { - toolVersion = "$jacoco_version" -} - -// Force Jacoco Version - -subprojects { - configurations.all { - resolutionStrategy { - eachDependency { details -> - if ("org.jacoco" == details.requested.group) { - details.useVersion "$jacocoVersion" - } - } - } - } -} - -project.afterEvaluate { project -> - - tasks.withType(Test).configureEach { - jacoco.includeNoLocationClasses = true - jacoco.excludes = ["jdk.internal.*"] - } - - final flavor = "Gplay" - final buildType = "Debug" - final variant = "$flavor${buildType.capitalize()}" - final taskName = "jacocoTest${variant.capitalize()}UnitTestReport" - - task "$taskName"(type: JacocoReport, dependsOn: "test${variant.capitalize()}UnitTest") { - - reports { - csv.required = Boolean.FALSE - xml.required = Boolean.TRUE - html.required = Boolean.TRUE - } - - final fileFilter = [ - // data binding - "**/databinding/*", - "android/databinding/**/*.class", - "**/android/databinding/*Binding.class", - "**/android/databinding/*", - "**/androidx/databinding/*", - "**/BR.*", - // android - "**/R.class", - "**/R\$*.class", - "**/BuildConfig.*", - "**/Manifest*.*", - "**/*Test*.*", - "android/**/*.*", - // kotlin - "**/*MapperImpl*.*", - "**/*\$ViewInjector*.*", - "**/*\$ViewBinder*.*", - "**/BuildConfig.*", - "**/*Component*.*", - "**/*BR*.*", - "**/Manifest*.*", - "**/*\$Lambda\$*.*", - "**/*Companion*.*", - "**/*Module*.*", - "**/*Dagger*.*", - "**/*Hilt*.*", - "**/*MembersInjector*.*", - "**/*_MembersInjector.class", - "**/*_Factory*.*", - "**/*_Provide*Factory*.*", - "**/*Extensions*.*", - // sealed and data classes - "**/*\$Result.*", - "**/*\$Result\$*.*", - // adapters generated by moshi - "**/*JsonAdapter.*", - // Hilt - "**/*Module.kt", - "**/di/**", - "dagger.hilt.internal/*", - "hilt_aggregated_deps/*", - - "**/*\$Result.*", /* filtering `sealed` and `data` classes */ - "**/*\$Result\$*.*",/* filtering `sealed` and `data` classes */ - "**/*Args*.*", /* filtering Navigation Component generated classes */ - "**/*Directions*.*", /* filtering Navigation Component generated classes */ - "**/*inlined*.class", /* filtering inlined classes */ - "**/composables/**" - /* INSERT ANY OTHER JUNK YOU WANT FILTERED OUT HERE */] - - final androidKotlinTree = fileTree(dir: "${project.buildDir}/tmp/kotlin-classes/${variant}", excludes: fileFilter) - final kotlinTree = fileTree(dir: "${project.buildDir}/classes/kotlin/main", excludes: fileFilter) - final javacTree = fileTree(dir: "${project.buildDir}/intermediates/javac/${variant}/classes", excludes: fileFilter) - - final mainSrc = "${project.projectDir}/src/main/java" - final productFlavorSrc = "${project.projectDir}/src/${flavor}/java" - final buildTypeSrc = "${project.projectDir}/src/${buildType}/java" - - sourceDirectories.setFrom files([mainSrc, productFlavorSrc, buildTypeSrc]) - classDirectories.setFrom files([androidKotlinTree, kotlinTree, javacTree]) - executionData.setFrom fileTree(dir: project.buildDir, includes: ["jacoco/test${variant.capitalize()}UnitTest.exec", - "outputs/unit_test_code_coverage/${variant}UnitTest/test${variant.capitalize()}UnitTest.exec",]) - } -} diff --git a/jacoco.gradle.kts b/jacoco.gradle.kts new file mode 100644 index 000000000000..48a59fa6f279 --- /dev/null +++ b/jacoco.gradle.kts @@ -0,0 +1,109 @@ +apply() + +configure { + toolVersion = extensions + .getByType() + .find("libs") + .get() + .findVersion("jacoco") + .get() + .displayName +} + +val flavor = "gplay" +val buildType = "Debug" +val variant = "$flavor${buildType.capitalize()}" + +val jacocoTask = tasks.register("jacocoTest${variant.capitalize()}UnitTestReport") { + reports { + csv.required = false + xml.required = true + html.required = true + } + + val fileFilter = listOf( + // data binding + "**/databinding/*", + "android/databinding/**/*.class", + "**/android/databinding/*Binding.class", + "**/android/databinding/*", + "**/androidx/databinding/*", + "**/BR.*", + // android + "**/R.class", + "**/R\$*.class", + "**/BuildConfig.*", + "**/Manifest*.*", + "**/*Test*.*", + "android/**/*.*", + // kotlin + "**/*MapperImpl*.*", + "**/*\$ViewInjector*.*", + "**/*\$ViewBinder*.*", + "**/BuildConfig.*", + "**/*Component*.*", + "**/*BR*.*", + "**/Manifest*.*", + "**/*\$Lambda\$*.*", + "**/*Companion*.*", + "**/*Module*.*", + "**/*Dagger*.*", + "**/*Hilt*.*", + "**/*MembersInjector*.*", + "**/*_MembersInjector.class", + "**/*_Factory*.*", + "**/*_Provide*Factory*.*", + "**/*Extensions*.*", + // sealed and data classes + "**/*\$Result.*", + "**/*\$Result\$*.*", + // adapters generated by moshi + "**/*JsonAdapter.*", + // Hilt + "**/*Module.kt", + "**/di/**", + "dagger.hilt.internal/*", + "hilt_aggregated_deps/*", + + "**/*\$Result.*", /* filtering `sealed` and `data` classes */ + "**/*\$Result\$*.*",/* filtering `sealed` and `data` classes */ + "**/*Args*.*", /* filtering Navigation Component generated classes */ + "**/*Directions*.*", /* filtering Navigation Component generated classes */ + "**/*inlined*.class", /* filtering inlined classes */ + "**/composables/**" + /* INSERT ANY OTHER JUNK YOU WANT FILTERED OUT HERE */ + ) + + val androidKotlinTree = project.fileTree("${project.layout.buildDirectory}/tmp/kotlin-classes/${variant}") { + exclude(fileFilter) + } + val javacTree = project.fileTree("${project.layout.buildDirectory}/intermediates/javac/${variant}") { + exclude(fileFilter) + } + + sourceDirectories.setFrom( + project.layout.projectDirectory.dir("src/main/java"), + project.layout.projectDirectory.dir("src/${flavor}/java"), + project.layout.projectDirectory.dir("src/${buildType}/java") + ) + classDirectories.setFrom( + project.layout.projectDirectory.files( + project.fileTree(project.layout.buildDirectory.dir("intermediates/javac/${variant}")) { exclude(fileFilter) }, + project.fileTree(project.layout.buildDirectory.dir("tmp/kotlin-classes/$variant")) { exclude(fileFilter) } + ) + ) + executionData.setFrom( + project.fileTree(project.layout.buildDirectory.dir("jacoco")) { + include("**/test${variant.capitalize()}UnitTest.exec") + } + ) +} + +tasks.withType() + .matching { task -> task.name == "test${variant.capitalize()}UnitTest" } + .configureEach { + extensions.getByType().isIncludeNoLocationClasses = true + extensions.getByType().setExcludes(listOf("jdk.internal.*")) + + finalizedBy(jacocoTask) + } diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index f8c7dc28b281..000000000000 --- a/settings.gradle +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2014-2024 Nextcloud GmbH and Nextcloud contributors - * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only - */ -rootProject.name = "Nextcloud" - -include ":app" -include ":appscan" - -//includeBuild("../android-common") { -// dependencySubstitution { -// substitute module("com.github.nextcloud.android-common:ui") using project(":ui") -// } -//} - -//includeBuild("../android-library") { -// dependencySubstitution { -// substitute module('com.github.nextcloud:android-library') using project(':library') // broken on gradle 8.14.2, so use 8.13 if needed -// } -//} diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 000000000000..9f9d6ddecf7d --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,54 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2014-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only + */ +rootProject.name = "Nextcloud" + +pluginManagement { + resolutionStrategy.eachPlugin { + if (requested.id.id == "shot") useModule("com.karumi:shot:${requested.version}") + } + + repositories { + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } + gradlePluginPortal() + mavenCentral() + } +} + +@Suppress("UnstableApiUsage") +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } + mavenCentral() + maven("https://jitpack.io") + } +} +//includeBuild("../android-common") { +// dependencySubstitution { +// substitute module("com.github.nextcloud.android-common:ui") using project(":ui") +// } +//} + +//includeBuild("../android-library") { +// dependencySubstitution { +// substitute module('com.github.nextcloud:android-library') using project(':library') // broken on gradle 8.14.2, so use 8.13 if needed +// } +//} + +include(":app", ":appscan") \ No newline at end of file