From 3a059e54805e1a6a1606b28236c7f415842a293c Mon Sep 17 00:00:00 2001
From: Mat Booth <mat.booth@redhat.com>
Date: Mon, 7 Sep 2020 12:17:31 +0100
Subject: [PATCH 1/7] Remove optional dep Blockhound

---
 common/pom.xml                                |   5 -
 .../java/io/netty/util/internal/Hidden.java   | 187 ------
 ...ockhound.integration.BlockHoundIntegration |  14 -
 pom.xml                                       |   8 -
 transport-blockhound-tests/pom.xml            | 154 -----
 .../NettyBlockHoundIntegrationTest.java       | 575 ------------------
 .../netty/util/internal/localhost_server.key  |  28 -
 .../netty/util/internal/localhost_server.pem  |  17 -
 .../io/netty/util/internal/mutual_auth_ca.pem |  19 -
 9 files changed, 1007 deletions(-)
 delete mode 100644 common/src/main/java/io/netty/util/internal/Hidden.java
 delete mode 100644 common/src/main/resources/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration
 delete mode 100644 transport-blockhound-tests/pom.xml
 delete mode 100644 transport-blockhound-tests/src/test/java/io/netty/util/internal/NettyBlockHoundIntegrationTest.java
 delete mode 100644 transport-blockhound-tests/src/test/resources/io/netty/util/internal/localhost_server.key
 delete mode 100644 transport-blockhound-tests/src/test/resources/io/netty/util/internal/localhost_server.pem
 delete mode 100644 transport-blockhound-tests/src/test/resources/io/netty/util/internal/mutual_auth_ca.pem

diff --git a/common/pom.xml b/common/pom.xml
index 05cee2d1b1..a99044c4e5 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -82,11 +82,6 @@
       <artifactId>log4j-core</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>io.projectreactor.tools</groupId>
-      <artifactId>blockhound</artifactId>
-      <optional>true</optional>
-    </dependency>
     <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
diff --git a/common/src/main/java/io/netty/util/internal/Hidden.java b/common/src/main/java/io/netty/util/internal/Hidden.java
deleted file mode 100644
index 9094fd677f..0000000000
--- a/common/src/main/java/io/netty/util/internal/Hidden.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright 2019 The Netty Project
- *
- * The Netty Project licenses this file to you under the Apache License,
- * version 2.0 (the "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at:
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-
-package io.netty.util.internal;
-
-import io.netty.util.concurrent.FastThreadLocalThread;
-import reactor.blockhound.BlockHound;
-import reactor.blockhound.integration.BlockHoundIntegration;
-
-import java.util.function.Function;
-import java.util.function.Predicate;
-
-/**
- * Contains classes that must have public visibility but are not public API.
- */
-class Hidden {
-
-    /**
-     * This class integrates Netty with BlockHound.
-     * <p>
-     * It is public but only because of the ServiceLoader's limitations
-     * and SHOULD NOT be considered a public API.
-     */
-    @UnstableApi
-    @SuppressJava6Requirement(reason = "BlockHound is Java 8+, but this class is only loaded by it's SPI")
-    public static final class NettyBlockHoundIntegration implements BlockHoundIntegration {
-
-        @Override
-        public void applyTo(BlockHound.Builder builder) {
-            builder.allowBlockingCallsInside(
-                    "io.netty.channel.nio.NioEventLoop",
-                    "handleLoopException"
-            );
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.channel.kqueue.KQueueEventLoop",
-                    "handleLoopException"
-            );
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.channel.epoll.EpollEventLoop",
-                    "handleLoopException"
-            );
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.util.HashedWheelTimer",
-                    "start"
-            );
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.util.HashedWheelTimer",
-                    "stop"
-            );
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.util.HashedWheelTimer$Worker",
-                    "waitForNextTick"
-            );
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.util.concurrent.SingleThreadEventExecutor",
-                    "confirmShutdown"
-            );
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.buffer.PoolArena",
-                    "lock"
-            );
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.buffer.PoolSubpage",
-                    "lock"
-            );
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.buffer.PoolChunk",
-                    "allocateRun"
-            );
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.buffer.PoolChunk",
-                    "free"
-            );
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.handler.ssl.SslHandler",
-                    "handshake"
-            );
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.handler.ssl.SslHandler",
-                    "runAllDelegatedTasks"
-            );
-            builder.allowBlockingCallsInside(
-                    "io.netty.handler.ssl.SslHandler",
-                    "runDelegatedTasks"
-            );
-            builder.allowBlockingCallsInside(
-                    "io.netty.util.concurrent.GlobalEventExecutor",
-                    "takeTask");
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.util.concurrent.GlobalEventExecutor",
-                    "addTask");
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.util.concurrent.SingleThreadEventExecutor",
-                    "takeTask");
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.util.concurrent.SingleThreadEventExecutor",
-                    "addTask");
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.handler.ssl.ReferenceCountedOpenSslClientContext$ExtendedTrustManagerVerifyCallback",
-                    "verify");
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.handler.ssl.JdkSslContext$Defaults",
-                    "init");
-
-            // Let's whitelist SSLEngineImpl.unwrap(...) for now as it may fail otherwise for TLS 1.3.
-            // See https://mail.openjdk.java.net/pipermail/security-dev/2020-August/022271.html
-            builder.allowBlockingCallsInside(
-                    "sun.security.ssl.SSLEngineImpl",
-                    "unwrap");
-
-            builder.allowBlockingCallsInside(
-                    "sun.security.ssl.SSLEngineImpl",
-                    "wrap");
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.resolver.dns.UnixResolverDnsServerAddressStreamProvider",
-                    "parse");
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.resolver.dns.UnixResolverDnsServerAddressStreamProvider",
-                    "parseEtcResolverSearchDomains");
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.resolver.dns.UnixResolverDnsServerAddressStreamProvider",
-                    "parseEtcResolverOptions");
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.resolver.HostsFileEntriesProvider$ParserImpl",
-                    "parse");
-
-            builder.allowBlockingCallsInside(
-                    "io.netty.util.NetUtil$SoMaxConnAction",
-                    "run");
-
-            builder.allowBlockingCallsInside("io.netty.util.internal.PlatformDependent", "createTempFile");
-            builder.nonBlockingThreadPredicate(new Function<Predicate<Thread>, Predicate<Thread>>() {
-                @Override
-                public Predicate<Thread> apply(final Predicate<Thread> p) {
-                    return new Predicate<Thread>() {
-                        @Override
-                        @SuppressJava6Requirement(reason = "Predicate#test")
-                        public boolean test(Thread thread) {
-                            return p.test(thread) ||
-                                    thread instanceof FastThreadLocalThread &&
-                                            !((FastThreadLocalThread) thread).permitBlockingCalls();
-                        }
-                    };
-                }
-            });
-        }
-
-        @Override
-        public int compareTo(BlockHoundIntegration o) {
-            return 0;
-        }
-    }
-}
diff --git a/common/src/main/resources/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration b/common/src/main/resources/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration
deleted file mode 100644
index e33bea796c..0000000000
--- a/common/src/main/resources/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright 2019 The Netty Project
-#
-# The Netty Project licenses this file to you under the Apache License,
-# version 2.0 (the "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at:
-#
-#   https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-io.netty.util.internal.Hidden$NettyBlockHoundIntegration
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 8bc23fd7c0..edfb0235d0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -692,7 +692,6 @@
     <module>testsuite-native-image</module>
     <module>testsuite-native-image-client</module>
     <module>testsuite-native-image-client-runtime-init</module>
-    <module>transport-blockhound-tests</module>
     <module>microbench</module>
     <module>bom</module>
   </modules>
@@ -1096,13 +1095,6 @@
         <version>${log4j2.version}</version>
         <scope>test</scope>
       </dependency>
-
-      <!-- BlockHound integration -->
-      <dependency>
-        <groupId>io.projectreactor.tools</groupId>
-        <artifactId>blockhound</artifactId>
-        <version>1.0.6.RELEASE</version>
-      </dependency>
     </dependencies>
   </dependencyManagement>
 
diff --git a/transport-blockhound-tests/pom.xml b/transport-blockhound-tests/pom.xml
deleted file mode 100644
index 43f6e4e162..0000000000
--- a/transport-blockhound-tests/pom.xml
+++ /dev/null
@@ -1,154 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2019 The Netty Project
-  ~
-  ~ The Netty Project licenses this file to you under the Apache License,
-  ~ version 2.0 (the "License"); you may not use this file except in compliance
-  ~ with the License. You may obtain a copy of the License at:
-  ~
-  ~   https://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-  ~ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-  ~ License for the specific language governing permissions and limitations
-  ~ under the License.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
-
-  <modelVersion>4.0.0</modelVersion>
-  <parent>
-    <groupId>io.netty</groupId>
-    <artifactId>netty-parent</artifactId>
-    <version>4.1.94.Final</version>
-  </parent>
-
-  <artifactId>netty-transport-blockhound-tests</artifactId>
-  <packaging>jar</packaging>
-  <description>
-    Tests for the BlockHound integration.
-  </description>
-
-  <name>Netty/Transport/BlockHound/Tests</name>
-
-  <profiles>
-    <profile>
-      <id>java13</id>
-      <activation>
-        <jdk>13</jdk>
-      </activation>
-      <properties>
-        <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
-      </properties>
-    </profile>
-    <profile>
-      <id>java14</id>
-      <activation>
-        <jdk>14</jdk>
-      </activation>
-      <properties>
-        <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
-      </properties>
-    </profile>
-    <profile>
-      <id>java15</id>
-      <activation>
-        <jdk>15</jdk>
-      </activation>
-      <properties>
-        <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
-      </properties>
-    </profile>
-    <profile>
-      <id>java16</id>
-      <activation>
-        <jdk>16</jdk>
-      </activation>
-      <properties>
-        <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
-      </properties>
-    </profile>
-    <profile>
-      <id>java17</id>
-      <activation>
-        <jdk>17</jdk>
-      </activation>
-      <properties>
-        <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
-      </properties>
-    </profile>
-    <profile>
-      <id>java18</id>
-      <activation>
-        <jdk>18</jdk>
-      </activation>
-      <properties>
-        <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
-      </properties>
-    </profile>
-    <profile>
-      <id>java19</id>
-      <activation>
-        <jdk>19</jdk>
-      </activation>
-      <properties>
-        <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
-      </properties>
-    </profile>
-    <profile>
-      <id>java20</id>
-      <activation>
-        <jdk>20</jdk>
-      </activation>
-      <properties>
-        <argLine.common>-XX:+AllowRedefinitionToAddDeleteMethods</argLine.common>
-      </properties>
-    </profile>
-  </profiles>
-
-  <properties>
-    <maven.compiler.source>1.8</maven.compiler.source>
-    <maven.compiler.target>1.8</maven.compiler.target>
-    <!-- Needed for SelfSignedCertificate -->
-    <argLine.java9.extras>--add-exports java.base/sun.security.x509=ALL-UNNAMED</argLine.java9.extras>
-    <japicmp.skip>true</japicmp.skip>
-    <!-- Do not deploy this module -->
-    <skipDeploy>true</skipDeploy>
-    <javaModuleName>io.netty.transport_blockhound_tests</javaModuleName>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>netty-transport</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>netty-handler</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>netty-resolver-dns</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>${tcnative.artifactId}</artifactId>
-      <classifier>${tcnative.classifier}</classifier>
-      <optional>true</optional>
-    </dependency>
-
-    <dependency>
-      <groupId>org.bouncycastle</groupId>
-      <artifactId>bcpkix-jdk15on</artifactId>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>io.projectreactor.tools</groupId>
-      <artifactId>blockhound</artifactId>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/transport-blockhound-tests/src/test/java/io/netty/util/internal/NettyBlockHoundIntegrationTest.java b/transport-blockhound-tests/src/test/java/io/netty/util/internal/NettyBlockHoundIntegrationTest.java
deleted file mode 100644
index a005095d82..0000000000
--- a/transport-blockhound-tests/src/test/java/io/netty/util/internal/NettyBlockHoundIntegrationTest.java
+++ /dev/null
@@ -1,575 +0,0 @@
-/*
- * Copyright 2019 The Netty Project
-
- * The Netty Project licenses this file to you under the Apache License,
- * version 2.0 (the "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at:
-
- * https://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations
- * under the License.
- */
-package io.netty.util.internal;
-
-import io.netty.bootstrap.Bootstrap;
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.PooledByteBufAllocator;
-import io.netty.buffer.UnpooledByteBufAllocator;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelFutureListener;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelInboundHandlerAdapter;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.nio.NioDatagramChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import io.netty.channel.socket.nio.NioSocketChannel;
-import io.netty.handler.ssl.SslContext;
-import io.netty.handler.ssl.SslContextBuilder;
-import io.netty.handler.ssl.SslHandler;
-import io.netty.handler.ssl.SslHandshakeCompletionEvent;
-import io.netty.handler.ssl.SslProvider;
-import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
-import io.netty.handler.ssl.util.SelfSignedCertificate;
-import io.netty.resolver.dns.DnsNameResolverBuilder;
-import io.netty.resolver.dns.DnsServerAddressStreamProviders;
-import io.netty.util.HashedWheelTimer;
-import io.netty.util.ReferenceCountUtil;
-import io.netty.util.concurrent.DefaultThreadFactory;
-import io.netty.util.concurrent.EventExecutor;
-import io.netty.util.concurrent.FastThreadLocalThread;
-import io.netty.util.concurrent.GlobalEventExecutor;
-import io.netty.util.concurrent.ImmediateEventExecutor;
-import io.netty.util.concurrent.ImmediateExecutor;
-import io.netty.util.concurrent.ScheduledFuture;
-import io.netty.util.concurrent.SingleThreadEventExecutor;
-import io.netty.util.internal.Hidden.NettyBlockHoundIntegration;
-import org.hamcrest.Matchers;
-import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.Timeout;
-import org.junit.jupiter.api.condition.DisabledIf;
-import reactor.blockhound.BlockHound;
-import reactor.blockhound.BlockingOperationError;
-import reactor.blockhound.integration.BlockHoundIntegration;
-
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Queue;
-import java.util.ServiceLoader;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.atomic.AtomicReference;
-import java.util.concurrent.locks.ReentrantLock;
-
-import static io.netty.buffer.Unpooled.wrappedBuffer;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
-import static org.junit.jupiter.api.Assumptions.assumeTrue;
-
-@DisabledIf("isDisabledIfJavaVersion18OrAbove")
-public class NettyBlockHoundIntegrationTest {
-
-    private static boolean isDisabledIfJavaVersion18OrAbove() {
-        return PlatformDependent.javaVersion() >= 18;
-    }
-
-    @BeforeAll
-    public static void setUpClass() {
-        BlockHound.install();
-    }
-
-    @Test
-    public void testServiceLoader() {
-        for (BlockHoundIntegration integration : ServiceLoader.load(BlockHoundIntegration.class)) {
-            if (integration instanceof NettyBlockHoundIntegration) {
-                return;
-            }
-        }
-
-        fail("NettyBlockHoundIntegration cannot be loaded with ServiceLoader");
-    }
-
-    @Test
-    public void testBlockingCallsInNettyThreads() throws Exception {
-        final FutureTask<Void> future = new FutureTask<>(() -> {
-            Thread.sleep(0);
-            return null;
-        });
-        GlobalEventExecutor.INSTANCE.execute(future);
-
-        try {
-            future.get(5, TimeUnit.SECONDS);
-            fail("Expected an exception due to a blocking call but none was thrown");
-        } catch (ExecutionException e) {
-            assertThat(e.getCause(), Matchers.instanceOf(BlockingOperationError.class));
-        }
-    }
-
-    @Test
-    @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
-    public void testGlobalEventExecutorTakeTask() throws InterruptedException {
-        testEventExecutorTakeTask(GlobalEventExecutor.INSTANCE);
-    }
-
-    @Test
-    @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
-    public void testSingleThreadEventExecutorTakeTask() throws InterruptedException {
-        SingleThreadEventExecutor executor =
-                new SingleThreadEventExecutor(null, new DefaultThreadFactory("test"), true) {
-                    @Override
-                    protected void run() {
-                        while (!confirmShutdown()) {
-                            Runnable task = takeTask();
-                            if (task != null) {
-                                task.run();
-                            }
-                        }
-                    }
-                };
-        testEventExecutorTakeTask(executor);
-    }
-
-    private static void testEventExecutorTakeTask(EventExecutor eventExecutor) throws InterruptedException {
-        CountDownLatch latch = new CountDownLatch(1);
-        ScheduledFuture<?> f = eventExecutor.schedule(latch::countDown, 10, TimeUnit.MILLISECONDS);
-        f.sync();
-        latch.await();
-    }
-
-    @Test
-    @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
-    public void testSingleThreadEventExecutorAddTask() throws Exception {
-        TestLinkedBlockingQueue<Runnable> taskQueue = new TestLinkedBlockingQueue<>();
-        SingleThreadEventExecutor executor =
-                new SingleThreadEventExecutor(null, new DefaultThreadFactory("test"), true) {
-                    @Override
-                    protected Queue<Runnable> newTaskQueue(int maxPendingTasks) {
-                        return taskQueue;
-                    }
-
-                    @Override
-                    protected void run() {
-                        while (!confirmShutdown()) {
-                            Runnable task = takeTask();
-                            if (task != null) {
-                                task.run();
-                            }
-                        }
-                    }
-                };
-        taskQueue.emulateContention();
-        CountDownLatch latch = new CountDownLatch(1);
-        executor.submit(() -> {
-            executor.execute(() -> { }); // calls addTask
-            latch.countDown();
-        });
-        taskQueue.waitUntilContented();
-        taskQueue.removeContention();
-        latch.await();
-    }
-
-    @Test
-    void permittingBlockingCallsInFastThreadLocalThreadSubclass() throws Exception {
-        final FutureTask<Void> future = new FutureTask<>(() -> {
-            Thread.sleep(0);
-            return null;
-        });
-        FastThreadLocalThread thread = new FastThreadLocalThread(future) {
-            @Override
-            public boolean permitBlockingCalls() {
-                return true; // The Thread.sleep(0) call should not be flagged because we allow blocking calls.
-            }
-        };
-        thread.start();
-        future.get(5, TimeUnit.SECONDS);
-        thread.join();
-    }
-
-    @Test
-    @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
-    public void testHashedWheelTimerStartStop() throws Exception {
-        HashedWheelTimer timer = new HashedWheelTimer();
-        Future<?> futureStart = GlobalEventExecutor.INSTANCE.submit(timer::start);
-        futureStart.get(5, TimeUnit.SECONDS);
-        Future<?> futureStop = GlobalEventExecutor.INSTANCE.submit(timer::stop);
-        futureStop.get(5, TimeUnit.SECONDS);
-    }
-
-    // Tests copied from io.netty.handler.ssl.SslHandlerTest
-    @Test
-    public void testHandshakeWithExecutorThatExecuteDirectory() throws Exception {
-        testHandshakeWithExecutor(Runnable::run, "TLSv1.2");
-    }
-
-    @Test
-    public void testHandshakeWithExecutorThatExecuteDirectoryTLSv13() throws Exception {
-        assumeTrue(SslProvider.isTlsv13Supported(SslProvider.JDK));
-        testHandshakeWithExecutor(Runnable::run, "TLSv1.3");
-    }
-
-    @Test
-    public void testHandshakeWithImmediateExecutor() throws Exception {
-        testHandshakeWithExecutor(ImmediateExecutor.INSTANCE, "TLSv1.2");
-    }
-
-    @Test
-    public void testHandshakeWithImmediateExecutorTLSv13() throws Exception {
-        assumeTrue(SslProvider.isTlsv13Supported(SslProvider.JDK));
-        testHandshakeWithExecutor(ImmediateExecutor.INSTANCE, "TLSv1.3");
-    }
-
-    @Test
-    public void testHandshakeWithImmediateEventExecutor() throws Exception {
-        testHandshakeWithExecutor(ImmediateEventExecutor.INSTANCE, "TLSv1.2");
-    }
-
-    @Test
-    public void testHandshakeWithImmediateEventExecutorTLSv13() throws Exception {
-        assumeTrue(SslProvider.isTlsv13Supported(SslProvider.JDK));
-        testHandshakeWithExecutor(ImmediateEventExecutor.INSTANCE, "TLSv1.3");
-    }
-
-    @Test
-    public void testHandshakeWithExecutor() throws Exception {
-        ExecutorService executorService = Executors.newCachedThreadPool();
-        try {
-            testHandshakeWithExecutor(executorService, "TLSv1.2");
-        } finally {
-            executorService.shutdown();
-        }
-    }
-
-    @Test
-    public void testHandshakeWithExecutorTLSv13() throws Exception {
-        assumeTrue(SslProvider.isTlsv13Supported(SslProvider.JDK));
-        ExecutorService executorService = Executors.newCachedThreadPool();
-        try {
-            testHandshakeWithExecutor(executorService, "TLSv1.3");
-        } finally {
-            executorService.shutdown();
-        }
-    }
-
-    @Test
-    public void testTrustManagerVerifyJDK() throws Exception {
-        testTrustManagerVerify(SslProvider.JDK, "TLSv1.2");
-    }
-
-    @Test
-    public void testTrustManagerVerifyTLSv13JDK() throws Exception {
-        assumeTrue(SslProvider.isTlsv13Supported(SslProvider.JDK));
-        testTrustManagerVerify(SslProvider.JDK, "TLSv1.3");
-    }
-
-    @Test
-    public void testTrustManagerVerifyOpenSSL() throws Exception {
-        testTrustManagerVerify(SslProvider.OPENSSL, "TLSv1.2");
-    }
-
-    @Test
-    public void testTrustManagerVerifyTLSv13OpenSSL() throws Exception {
-        assumeTrue(SslProvider.isTlsv13Supported(SslProvider.OPENSSL));
-        testTrustManagerVerify(SslProvider.OPENSSL, "TLSv1.3");
-    }
-
-    @Test
-    public void testSslHandlerWrapAllowsBlockingCalls() throws Exception {
-        final SslContext sslClientCtx =
-                SslContextBuilder.forClient()
-                                 .trustManager(InsecureTrustManagerFactory.INSTANCE)
-                                 .sslProvider(SslProvider.JDK)
-                                 .build();
-        final SslHandler sslHandler = sslClientCtx.newHandler(UnpooledByteBufAllocator.DEFAULT);
-        final EventLoopGroup group = new NioEventLoopGroup();
-        final CountDownLatch activeLatch = new CountDownLatch(1);
-        final AtomicReference<Throwable> error = new AtomicReference<>();
-
-        Channel sc = null;
-        Channel cc = null;
-        try {
-            sc = new ServerBootstrap()
-                    .group(group)
-                    .channel(NioServerSocketChannel.class)
-                    .childHandler(new ChannelInboundHandlerAdapter())
-                    .bind(new InetSocketAddress(0))
-                    .syncUninterruptibly()
-                    .channel();
-
-            cc = new Bootstrap()
-                    .group(group)
-                    .channel(NioSocketChannel.class)
-                    .handler(new ChannelInitializer<Channel>() {
-
-                        @Override
-                        protected void initChannel(Channel ch) {
-                            ch.pipeline().addLast(sslHandler);
-                            ch.pipeline().addLast(new ChannelInboundHandlerAdapter() {
-
-                                @Override
-                                public void channelActive(ChannelHandlerContext ctx) {
-                                    activeLatch.countDown();
-                                }
-
-                                @Override
-                                public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
-                                    if (evt instanceof SslHandshakeCompletionEvent &&
-                                            ((SslHandshakeCompletionEvent) evt).cause() != null) {
-                                        Throwable cause = ((SslHandshakeCompletionEvent) evt).cause();
-                                        cause.printStackTrace();
-                                        error.set(cause);
-                                    }
-                                    ctx.fireUserEventTriggered(evt);
-                                }
-                            });
-                        }
-                    })
-                    .connect(sc.localAddress())
-                    .addListener((ChannelFutureListener) future ->
-                        future.channel().writeAndFlush(wrappedBuffer(new byte [] { 1, 2, 3, 4 })))
-                    .syncUninterruptibly()
-                    .channel();
-
-            assertTrue(activeLatch.await(5, TimeUnit.SECONDS));
-            assertNull(error.get());
-        } finally {
-            if (cc != null) {
-                cc.close().syncUninterruptibly();
-            }
-            if (sc != null) {
-                sc.close().syncUninterruptibly();
-            }
-            group.shutdownGracefully();
-            ReferenceCountUtil.release(sslClientCtx);
-        }
-    }
-
-    @Test
-    @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
-    public void pooledBufferAllocation() throws Exception {
-        AtomicLong iterationCounter = new AtomicLong();
-        PooledByteBufAllocator allocator = PooledByteBufAllocator.DEFAULT;
-        FutureTask<Void> task = new FutureTask<>(() -> {
-            List<ByteBuf> buffers = new ArrayList<>();
-            long count;
-            do {
-                count = iterationCounter.get();
-            } while (count == 0);
-            for (int i = 0; i < 13; i++) {
-                int size = 8 << i;
-                buffers.add(allocator.ioBuffer(size, size));
-            }
-            for (ByteBuf buffer : buffers) {
-                buffer.release();
-            }
-            return null;
-        });
-        FastThreadLocalThread thread = new FastThreadLocalThread(task);
-        thread.start();
-        do {
-            allocator.dumpStats(); // This will take internal pool locks and we'll race with the thread.
-            iterationCounter.set(1);
-        } while (thread.isAlive());
-        thread.join();
-        task.get();
-    }
-
-    @Test
-    @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
-    public void testUnixResolverDnsServerAddressStreamProvider_Parse() throws InterruptedException {
-        doTestParseResolverFilesAllowsBlockingCalls(DnsServerAddressStreamProviders::unixDefault);
-    }
-
-    @Test
-    @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
-    public void testHostsFileParser_Parse() throws InterruptedException {
-        doTestParseResolverFilesAllowsBlockingCalls(DnsNameResolverBuilder::new);
-    }
-
-    @Test
-    @Timeout(value = 5000, unit = TimeUnit.MILLISECONDS)
-    public void testUnixResolverDnsServerAddressStreamProvider_ParseEtcResolverSearchDomainsAndOptions()
-            throws InterruptedException {
-        NioEventLoopGroup group = new NioEventLoopGroup();
-        try {
-            DnsNameResolverBuilder builder = new DnsNameResolverBuilder(group.next())
-                    .channelFactory(NioDatagramChannel::new);
-            doTestParseResolverFilesAllowsBlockingCalls(builder::build);
-        } finally {
-            group.shutdownGracefully();
-        }
-    }
-
-    private static void doTestParseResolverFilesAllowsBlockingCalls(Callable<Object> callable)
-            throws InterruptedException {
-        SingleThreadEventExecutor executor =
-                new SingleThreadEventExecutor(null, new DefaultThreadFactory("test"), true) {
-                    @Override
-                    protected void run() {
-                        while (!confirmShutdown()) {
-                            Runnable task = takeTask();
-                            if (task != null) {
-                                task.run();
-                            }
-                        }
-                    }
-                };
-        try {
-            CountDownLatch latch = new CountDownLatch(1);
-            List<Object> result = new ArrayList<>();
-            List<Throwable> error = new ArrayList<>();
-            executor.execute(() -> {
-                try {
-                    result.add(callable.call());
-                } catch (Throwable t) {
-                    error.add(t);
-                }
-                latch.countDown();
-            });
-            latch.await();
-            assertEquals(0, error.size());
-            assertEquals(1, result.size());
-        } finally {
-            executor.shutdownGracefully();
-        }
-    }
-
-    private static void testTrustManagerVerify(SslProvider provider, String tlsVersion) throws Exception {
-        final SslContext sslClientCtx =
-                SslContextBuilder.forClient()
-                                 .sslProvider(provider)
-                                 .protocols(tlsVersion)
-                                 .trustManager(ResourcesUtil.getFile(
-                                         NettyBlockHoundIntegrationTest.class, "mutual_auth_ca.pem"))
-                                 .build();
-
-        final SslContext sslServerCtx =
-                SslContextBuilder.forServer(ResourcesUtil.getFile(
-                        NettyBlockHoundIntegrationTest.class, "localhost_server.pem"),
-                                            ResourcesUtil.getFile(
-                                                    NettyBlockHoundIntegrationTest.class, "localhost_server.key"),
-                                            null)
-                                 .sslProvider(provider)
-                                 .protocols(tlsVersion)
-                                 .build();
-
-        final SslHandler clientSslHandler = sslClientCtx.newHandler(UnpooledByteBufAllocator.DEFAULT);
-        final SslHandler serverSslHandler = sslServerCtx.newHandler(UnpooledByteBufAllocator.DEFAULT);
-
-        testHandshake(sslClientCtx, clientSslHandler, serverSslHandler);
-    }
-
-    private static void testHandshakeWithExecutor(Executor executor, String tlsVersion) throws Exception {
-        final SslContext sslClientCtx = SslContextBuilder.forClient()
-                .trustManager(InsecureTrustManagerFactory.INSTANCE)
-                .sslProvider(SslProvider.JDK).protocols(tlsVersion).build();
-
-        final SelfSignedCertificate cert = new SelfSignedCertificate();
-        final SslContext sslServerCtx = SslContextBuilder.forServer(cert.key(), cert.cert())
-                .sslProvider(SslProvider.JDK).protocols(tlsVersion).build();
-
-        final SslHandler clientSslHandler = sslClientCtx.newHandler(UnpooledByteBufAllocator.DEFAULT, executor);
-        final SslHandler serverSslHandler = sslServerCtx.newHandler(UnpooledByteBufAllocator.DEFAULT, executor);
-
-        testHandshake(sslClientCtx, clientSslHandler, serverSslHandler);
-    }
-
-    private static void testHandshake(SslContext sslClientCtx, SslHandler clientSslHandler,
-                                      SslHandler serverSslHandler) throws Exception {
-        EventLoopGroup group = new NioEventLoopGroup();
-        Channel sc = null;
-        Channel cc = null;
-        try {
-            sc = new ServerBootstrap()
-                    .group(group)
-                    .channel(NioServerSocketChannel.class)
-                    .childHandler(serverSslHandler)
-                    .bind(new InetSocketAddress(0)).syncUninterruptibly().channel();
-
-            ChannelFuture future = new Bootstrap()
-                    .group(group)
-                    .channel(NioSocketChannel.class)
-                    .handler(new ChannelInitializer<Channel>() {
-                        @Override
-                        protected void initChannel(Channel ch) {
-                            ch.pipeline()
-                              .addLast(clientSslHandler)
-                              .addLast(new ChannelInboundHandlerAdapter() {
-
-                                  @Override
-                                  public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
-                                      if (evt instanceof SslHandshakeCompletionEvent &&
-                                              ((SslHandshakeCompletionEvent) evt).cause() != null) {
-                                          ((SslHandshakeCompletionEvent) evt).cause().printStackTrace();
-                                      }
-                                      ctx.fireUserEventTriggered(evt);
-                                  }
-                              });
-                        }
-                    }).connect(sc.localAddress());
-            cc = future.syncUninterruptibly().channel();
-
-            clientSslHandler.handshakeFuture().await().sync();
-            serverSslHandler.handshakeFuture().await().sync();
-        } finally {
-            if (cc != null) {
-                cc.close().syncUninterruptibly();
-            }
-            if (sc != null) {
-                sc.close().syncUninterruptibly();
-            }
-            group.shutdownGracefully();
-            ReferenceCountUtil.release(sslClientCtx);
-        }
-    }
-
-    private static class TestLinkedBlockingQueue<T> extends LinkedBlockingQueue<T> {
-
-        private final ReentrantLock lock = new ReentrantLock();
-
-        @Override
-        public boolean offer(T t) {
-            lock.lock();
-            try {
-                return super.offer(t);
-            } finally {
-                lock.unlock();
-            }
-        }
-
-        void emulateContention() {
-            lock.lock();
-        }
-
-        void waitUntilContented() throws InterruptedException {
-            // wait until the lock gets contended
-            while (lock.getQueueLength() == 0) {
-                Thread.sleep(10L);
-            }
-        }
-
-        void removeContention() {
-            lock.unlock();
-        }
-    }
-}
diff --git a/transport-blockhound-tests/src/test/resources/io/netty/util/internal/localhost_server.key b/transport-blockhound-tests/src/test/resources/io/netty/util/internal/localhost_server.key
deleted file mode 100644
index 9aa6611400..0000000000
--- a/transport-blockhound-tests/src/test/resources/io/netty/util/internal/localhost_server.key
+++ /dev/null
@@ -1,28 +0,0 @@
------BEGIN PRIVATE KEY-----
-MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDYrLtMlZzoe2BP
-iCURF3So5XNLfsOLcAVERXXjnxqX6Mex55WdJiy6uWTFKbRHWJdbWELdZxVl5+GX
-pMv3OdkKZt+19ZdSfByv6bB5RNdZOEGnKOHSY2XdnzYnF5JBaWEx0fvtvIPZOUlW
-DWgsQzJk1UQhu+XnBc7P1hHYNvwsVNOR+HD9LGebDy+UcfiL34XwAyBdHUsbcIr8
-hltABcj6vNbqOLndpU86DxU9z9b1PDmkFVfisElhpDEhpxmTCwI22Us1GC8D81LM
-ZzMlbWSzTfNPEuqNzJYGiFt/XPwPkPPyVvti0XWPBQpwzJFFUX5xKsOGERolELRT
-0yNQYznFAgMBAAECggEAOFR/xSNITbB1k3ejm1PrwlUUqlXkZIXU+LDOO0UL1t5v
-vDKm1Not2sWECzYSZlID132UtJauG3YzUgdH95gUcv3XvyiAFLOriZhJht181vcn
-KlwYiWfJ/dn8bCFWpqbM2/TpeB8AcCLSjAqkQI2ftlMziUmeNXdvEt1mej2hRay1
-ULfoxlC0mftNRQptD5gBFzrc47O4mVpVEQt4yS3Qyzp2/9ds9UkhaCIFpXPVCalZ
-ds7R+bDDP+wiYTkUcd8fvelaMkD3Wcy8DedGRShhILZvBYTDdWcpJ7+e5EkNlEq4
-+Ys4Y/u6aFDJD53g3zCaJhatmdAZcct2MMmWH1vewQKBgQD3Y2S245cad1D9AqYD
-ChZGp95EfRo3EzXk4VkE50bjZXjHq9fD8T0CWEZGWQZrXJCR+vBpEURy0mrPD8se
-QQ0Q5+I27RadtfPnMd6ry9nDGMPxyd/10vzU6LazzLNE+uf9ljF1RHZu1iDAvInR
-r1cQGbn/wKBF6BurPPIXABZEuQKBgQDgN6JHbIfDzHKhwEoUTvRrYJsTXqplD+h0
-Whg+kSQyhtKdlpINFOoEj8FUNJvTjG8les1aoajyWIqikVdvHto/mrxrSIeRkEmt
-X+KG+5ld2n466tzv1DmVcIGXSrBrH3lA0i6R8Ly26FLSqw0Z12fx5GUUa1qaVRqo
-rwcrIZovbQKBgHa2mojs9AC+Sv3uvG1u9LuZKJ7jDaZqMI2R2d7xgOH0Op5Ohy6+
-39D1PVvasqroc3Op4J36rEcRVDHi2Uy+WJ/JNpO2+AhcXRuPodP88ZWel8C6aB+V
-zL/6oFntnAU5BgR5g2hLny2W0YbLsrMNmhDe15O0AvUo6cYla+K/pu/5AoGACr/g
-EdiMMcDthf+4DX0zjqpVBPq25J18oYdoPierOpjoJBIB8oqcJZfWxvi2t8+1zHA0
-xDGX7fZ8vwqEzJkIEaCTg/k4NqxaO+uq6pnJYoyFHMIB0aW1FQsNy3kTOC+MGqV5
-Ahoukf5VajA1MpX3L8upZO84qsmFu6yYhWLZB4kCgYBlgSD5G4q6rX4ELa3XG61h
-fDtu75IYEsjWm4vgJzHjeYT2xPIm9OFFYXjPghto0f1oH37ODD3DoXmsnmddgpmn
-tH7aRWWHsSpB5zVgftV4urNCIsm87LWw8mvUGgCwYV1CtCX8warKokfeoA2ltz4u
-oeuUzo98hN+aKRU5RO6Bmg==
------END PRIVATE KEY-----
diff --git a/transport-blockhound-tests/src/test/resources/io/netty/util/internal/localhost_server.pem b/transport-blockhound-tests/src/test/resources/io/netty/util/internal/localhost_server.pem
deleted file mode 100644
index 70759b29e5..0000000000
--- a/transport-blockhound-tests/src/test/resources/io/netty/util/internal/localhost_server.pem
+++ /dev/null
@@ -1,17 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICozCCAYsCAnS/MA0GCSqGSIb3DQEBDQUAMBgxFjAUBgNVBAMTDU5ldHR5VGVz
-dFJvb3QwIBcNMTcwMjE3MDMzMzQ0WhgPMjExNzAxMjQwMzMzNDRaMBQxEjAQBgNV
-BAMTCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANis
-u0yVnOh7YE+IJREXdKjlc0t+w4twBURFdeOfGpfox7HnlZ0mLLq5ZMUptEdYl1tY
-Qt1nFWXn4Zeky/c52Qpm37X1l1J8HK/psHlE11k4Qaco4dJjZd2fNicXkkFpYTHR
-++28g9k5SVYNaCxDMmTVRCG75ecFzs/WEdg2/CxU05H4cP0sZ5sPL5Rx+IvfhfAD
-IF0dSxtwivyGW0AFyPq81uo4ud2lTzoPFT3P1vU8OaQVV+KwSWGkMSGnGZMLAjbZ
-SzUYLwPzUsxnMyVtZLNN808S6o3MlgaIW39c/A+Q8/JW+2LRdY8FCnDMkUVRfnEq
-w4YRGiUQtFPTI1BjOcUCAwEAATANBgkqhkiG9w0BAQ0FAAOCAQEAQNXnwE2MJFy5
-ti07xyi8h/mY0Kl1dwZUqx4F9D9eoxLCq2/p3h/Z18AlOmjdW06pvC2sGtQtyEqL
-YjuQFbMjXRo9c+6+d+xwdDKTu7+XOTHvznJ8xJpKnFOlohGq/n3efBIJSsaeasTU
-slFzmdKYABDZzbsQ4X6YCIOF4XVdEQqmXpS+uEbn5C2sVtG+LXI8srmkVGpCcRew
-SuTGanwxLparhBBeN1ARjKzNxXUWuK2UKZ9p8c7n7TXGhd12ZNTcLhk4rCnOFq1J
-ySFvP5YL2q29fpEt+Tq0zm3V7An2qtaNDp26cEdevtKPjRyOLkCJx8OlZxc9DZvJ
-HjalFDoRUw==
------END CERTIFICATE-----
diff --git a/transport-blockhound-tests/src/test/resources/io/netty/util/internal/mutual_auth_ca.pem b/transport-blockhound-tests/src/test/resources/io/netty/util/internal/mutual_auth_ca.pem
deleted file mode 100644
index 9c9241bc65..0000000000
--- a/transport-blockhound-tests/src/test/resources/io/netty/util/internal/mutual_auth_ca.pem
+++ /dev/null
@@ -1,19 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIDLDCCAhSgAwIBAgIJAO1m5pioZhLLMA0GCSqGSIb3DQEBDQUAMBgxFjAUBgNV
-BAMTDU5ldHR5VGVzdFJvb3QwHhcNMTcwMjE3MDMzMzQ0WhcNMTcwMzE5MDMzMzQ0
-WjAYMRYwFAYDVQQDEw1OZXR0eVRlc3RSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAnC7Y/p/TSWI1KxBKETfFKaRWCPEkoYn5G973WbCF0VDT90PX
-xK6yHvhqNdDQZPmddgfDAQfjekHeeIFkjCKlvQu0js0G4Bubz4NffNumd/Mgsix8
-SWJ13lPk+Ly4PDv0bK1zB6BxP1qQm1qxVwsPy9zNP8ylJrM0Div4TXHmnWOfc0JD
-4/XPpfeUHH1tt/GMtsS2Gx6EpTVPD2w7LDKUza1/rQ7d9sqmFpgsNcI9Db/sAtFP
-lK2iJku5WIXQkmHimn4bqZ9wkiXJ85pm5ggGQqGMPSbe+2Lh24AvZMIBiwPbkjEU
-EDFXEJfKOC3Dl71JgWOthtHZ9vcCRDQ3Sky6AQIDAQABo3kwdzAdBgNVHQ4EFgQU
-qT+cH8qrebiVPpKCBQDB6At2iOAwSAYDVR0jBEEwP4AUqT+cH8qrebiVPpKCBQDB
-6At2iOChHKQaMBgxFjAUBgNVBAMTDU5ldHR5VGVzdFJvb3SCCQDtZuaYqGYSyzAM
-BgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBDQUAA4IBAQCEemXTIew4pR2cHEFpVsW2
-bLHXLAnC23wBMT46D3tqyxscukMYjFuWosCdEsgRW8d50BXy9o4dHWeg94+aDo3A
-DX4OTRN/veQGIG7dgM6poDzFuVJlSN0ubKKg6gpDD60IhopZpMviFAOsmzr7OXwS
-9hjbTqUWujMIEHQ95sPlQFdSaavYSFfqhSltWmVCPSbArxrw0lZ2QcnUqGN47EFp
-whc5wFB+rSw/ojU1jBLMvgvgzf/8V8zr1IBTDSiHNlknGqGpOOaookzUh95YRiAT
-hH82y9bBeflqroOeztqMpONpWoZjlz0sWbJNvXztXINL7LaNmVYOcoUrCcxPS54T
------END CERTIFICATE-----
-- 
2.41.0

