From 2c090760dffa75ea541f930b40bc4b95ebef7e87 Mon Sep 17 00:00:00 2001 From: Ben Manes Date: Sat, 12 Mar 2022 16:04:14 -0800 Subject: [PATCH] build cleanups and test cases --- .circleci/config.yml | 3 + .github/workflows/analysis.yml | 5 - .github/workflows/build.yml | 3 - .github/workflows/dependency-check.yml | 3 - .github/workflows/examples.yml | 5 - .github/workflows/lincheck.yml | 3 - .github/workflows/qodana.yml | 3 - .github/workflows/snyke.yml | 3 - build.gradle | 4 - caffeine/build.gradle | 3 + .../caffeine/cache/BoundedLocalCache.java | 4 +- .../caffeine/cache/stats/CacheStats.java | 3 + .../caffeine/cache/BoundedLocalCacheTest.java | 135 +++ .../caffeine/cache/ExpireAfterAccessTest.java | 1 + .../caffeine/cache/ExpireAfterWriteTest.java | 1 + .../caffeine/cache/LoadingCacheTest.java | 4 +- .../caffeine/cache/RefreshAfterWriteTest.java | 1 + caffeine/testing.gradle | 3 - checksum.xml | 901 ------------------ gradle.properties | 1 - gradle/codeQuality.gradle | 2 + gradle/dependencies.gradle | 10 +- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 64 +- 24 files changed, 165 insertions(+), 1002 deletions(-) delete mode 100644 checksum.xml diff --git a/.circleci/config.yml b/.circleci/config.yml index f93130d3ea..8d28011360 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -93,6 +93,7 @@ jobs: image: ubuntu-2004:202101-01 environment: JAVA_VERSION: << pipeline.parameters.java_version >> + TERM: dumb steps: - run_tests: cache_key: strong_keys @@ -115,6 +116,7 @@ jobs: image: ubuntu-2004:202101-01 environment: JAVA_VERSION: << pipeline.parameters.java_version >> + TERM: dumb steps: - run_tests: cache_key: weak_keys @@ -137,6 +139,7 @@ jobs: image: ubuntu-2004:202101-01 environment: JAVA_VERSION: << pipeline.parameters.java_version >> + TERM: dumb steps: - run_tests: cache_key: isolated diff --git a/.github/workflows/analysis.yml b/.github/workflows/analysis.yml index d4bded7fad..88b76da52c 100644 --- a/.github/workflows/analysis.yml +++ b/.github/workflows/analysis.yml @@ -2,11 +2,6 @@ name: analysis permissions: read-all on: [ push, pull_request ] -env: - ORG_GRADLE_PROJECT_checksumFailOn: never - ORG_GRADLE_PROJECT_checksumIgnore: false - ORG_GRADLE_PROJECT_checksumPrint: true - jobs: analyze: runs-on: ubuntu-latest diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c5472e74c5..2dde8b7567 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,9 +3,6 @@ permissions: read-all on: [ push, pull_request ] env: - ORG_GRADLE_PROJECT_checksumFailOn: never - ORG_GRADLE_PROJECT_checksumIgnore: false - ORG_GRADLE_PROJECT_checksumPrint: true MIN_JVM: 11 MAX_JVM: 17 diff --git a/.github/workflows/dependency-check.yml b/.github/workflows/dependency-check.yml index 82da24ada4..364a690def 100644 --- a/.github/workflows/dependency-check.yml +++ b/.github/workflows/dependency-check.yml @@ -3,9 +3,6 @@ on: [ push, pull_request ] permissions: read-all env: - ORG_GRADLE_PROJECT_checksumFailOn: never - ORG_GRADLE_PROJECT_checksumIgnore: false - ORG_GRADLE_PROJECT_checksumPrint: true JAVA_VERSION: 17 jobs: diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml index 43f86f2df2..554bc63cfc 100644 --- a/.github/workflows/examples.yml +++ b/.github/workflows/examples.yml @@ -2,11 +2,6 @@ name: examples permissions: read-all on: [ push, pull_request ] -env: - ORG_GRADLE_PROJECT_checksumFailOn: never - ORG_GRADLE_PROJECT_checksumIgnore: false - ORG_GRADLE_PROJECT_checksumPrint: true - jobs: examples: runs-on: ubuntu-latest diff --git a/.github/workflows/lincheck.yml b/.github/workflows/lincheck.yml index bce25fcb17..0449b08c55 100644 --- a/.github/workflows/lincheck.yml +++ b/.github/workflows/lincheck.yml @@ -3,9 +3,6 @@ permissions: read-all on: [ push, pull_request ] env: - ORG_GRADLE_PROJECT_checksumFailOn: never - ORG_GRADLE_PROJECT_checksumIgnore: false - ORG_GRADLE_PROJECT_checksumPrint: true JAVA_VERSION: 17 jobs: diff --git a/.github/workflows/qodana.yml b/.github/workflows/qodana.yml index 8477b7ba9b..9b733a8594 100644 --- a/.github/workflows/qodana.yml +++ b/.github/workflows/qodana.yml @@ -3,9 +3,6 @@ permissions: read-all on: [ push, pull_request ] env: - ORG_GRADLE_PROJECT_checksumFailOn: never - ORG_GRADLE_PROJECT_checksumIgnore: false - ORG_GRADLE_PROJECT_checksumPrint: true JAVA_VERSION: 11 jobs: diff --git a/.github/workflows/snyke.yml b/.github/workflows/snyke.yml index bdb0234004..88bc917cfa 100644 --- a/.github/workflows/snyke.yml +++ b/.github/workflows/snyke.yml @@ -5,9 +5,6 @@ on: permissions: read-all env: - ORG_GRADLE_PROJECT_checksumFailOn: never - ORG_GRADLE_PROJECT_checksumIgnore: false - ORG_GRADLE_PROJECT_checksumPrint: true JAVA_VERSION: 17 jobs: diff --git a/build.gradle b/build.gradle index 9360d6af3b..6debdf9cca 100644 --- a/build.gradle +++ b/build.gradle @@ -25,10 +25,6 @@ allprojects { apply plugin: 'com.github.ethankhall.semantic-versioning' apply from: "${rootDir}/gradle/eclipse.gradle" - repositories { - mavenCentral() - } - group = 'com.github.ben-manes.caffeine' version.with { major = 3 // incompatible API changes diff --git a/caffeine/build.gradle b/caffeine/build.gradle index 9d3b21ece8..24f1df9bd9 100644 --- a/caffeine/build.gradle +++ b/caffeine/build.gradle @@ -124,6 +124,9 @@ tasks.named('compileJava').configure { tasks.named('compileJavaPoetJava').configure { finalizedBy generateLocalCaches, generateNodes } +tasks.named('compileTestJava').configure { + dependsOn(jar) +} ['compileTestJava', 'pmdMain', 'spotbugsMain'].collect { tasks.named(it) }*.configure { dependsOn compileCodeGenJava } diff --git a/caffeine/src/main/java/com/github/benmanes/caffeine/cache/BoundedLocalCache.java b/caffeine/src/main/java/com/github/benmanes/caffeine/cache/BoundedLocalCache.java index 107b7bd8d0..2c6fa0a478 100644 --- a/caffeine/src/main/java/com/github/benmanes/caffeine/cache/BoundedLocalCache.java +++ b/caffeine/src/main/java/com/github/benmanes/caffeine/cache/BoundedLocalCache.java @@ -390,7 +390,7 @@ public void notifyRemoval(@Nullable K key, @Nullable V value, RemovalCause cause /* --------------- Eviction Listener Support --------------- */ - private void notifyEviction(@Nullable K key, @Nullable V value, RemovalCause cause) { + void notifyEviction(@Nullable K key, @Nullable V value, RemovalCause cause) { if (evictionListener == null) { return; } @@ -914,7 +914,7 @@ void expireVariableEntries(long now) { /** Returns the duration until the next item expires, or {@link Long.MAX_VALUE} if none. */ @GuardedBy("evictionLock") - private long getExpirationDelay(long now) { + long getExpirationDelay(long now) { long delay = Long.MAX_VALUE; if (expiresAfterAccess()) { Node node = accessOrderWindowDeque().peekFirst(); diff --git a/caffeine/src/main/java/com/github/benmanes/caffeine/cache/stats/CacheStats.java b/caffeine/src/main/java/com/github/benmanes/caffeine/cache/stats/CacheStats.java index 25052e791c..26a79dfee4 100644 --- a/caffeine/src/main/java/com/github/benmanes/caffeine/cache/stats/CacheStats.java +++ b/caffeine/src/main/java/com/github/benmanes/caffeine/cache/stats/CacheStats.java @@ -22,6 +22,7 @@ import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.LoadingCache; +import com.google.errorprone.annotations.CheckReturnValue; import com.google.errorprone.annotations.Immutable; /** @@ -295,6 +296,7 @@ public static CacheStats empty() { * @param other the statistics to subtract with * @return the difference between this instance and {@code other} */ + @CheckReturnValue public CacheStats minus(CacheStats other) { return CacheStats.of( Math.max(0L, saturatedSubtract(hitCount, other.hitCount)), @@ -317,6 +319,7 @@ public CacheStats minus(CacheStats other) { * @param other the statistics to add with * @return the sum of the statistics */ + @CheckReturnValue public CacheStats plus(CacheStats other) { return CacheStats.of( saturatedAdd(hitCount, other.hitCount), diff --git a/caffeine/src/test/java/com/github/benmanes/caffeine/cache/BoundedLocalCacheTest.java b/caffeine/src/test/java/com/github/benmanes/caffeine/cache/BoundedLocalCacheTest.java index ee2077936a..f604ec2dac 100644 --- a/caffeine/src/test/java/com/github/benmanes/caffeine/cache/BoundedLocalCacheTest.java +++ b/caffeine/src/test/java/com/github/benmanes/caffeine/cache/BoundedLocalCacheTest.java @@ -86,7 +86,9 @@ import com.github.benmanes.caffeine.testing.Int; import com.github.valfirst.slf4jtest.TestLogger; import com.github.valfirst.slf4jtest.TestLoggerFactory; +import com.google.common.collect.FluentIterable; import com.google.common.collect.Iterables; +import com.google.common.collect.Range; import com.google.common.testing.GcFinalization; import com.google.common.util.concurrent.Uninterruptibles; @@ -1156,6 +1158,139 @@ public void unschedule_invalidateAll(BoundedLocalCache cache, CacheCon assertThat(cache.pacer().future).isNull(); } + @Test(dataProvider = "caches") + @CacheSpec(population = Population.EMPTY, expireAfterAccess = Expire.ONE_MINUTE, + maximumSize = {Maximum.DISABLED, Maximum.FULL}, weigher = CacheWeigher.DEFAULT) + public void expirationDelay_window(BoundedLocalCache cache, CacheContext context) { + int maximum = cache.evicts() ? (int) context.maximumSize() : 100; + long stepSize = context.expireAfterAccess().timeNanos() / (2 * maximum); + for (int i = 0; i < maximum; i++) { + var key = CacheContext.intern(Int.valueOf(i)); + cache.put(key, key); + context.ticker().advance(stepSize, TimeUnit.NANOSECONDS); + } + + if (cache.evicts()) { + for (var node : List.copyOf(cache.accessOrderProbationDeque())) { + node.setAccessTime(context.ticker().read()); + } + for (var node : List.copyOf(cache.accessOrderProtectedDeque())) { + node.setAccessTime(context.ticker().read()); + } + for (var node : FluentIterable.from(cache.accessOrderProbationDeque()).skip(5).toList()) { + cache.get(node.getKey()); + } + context.ticker().advance(stepSize, TimeUnit.NANOSECONDS); + cache.cleanUp(); + } + + var expectedDelay = context.expireAfterAccess().timeNanos() + - (context.ticker().read() - cache.accessOrderWindowDeque().getFirst().getAccessTime()); + assertThat(cache.getExpirationDelay(context.ticker().read())).isEqualTo(expectedDelay); + } + + @Test(dataProvider = "caches") + @CacheSpec(population = Population.EMPTY, expireAfterAccess = Expire.ONE_MINUTE, + maximumSize = Maximum.FULL, weigher = CacheWeigher.DEFAULT) + public void expirationDelay_probation(BoundedLocalCache cache, CacheContext context) { + long stepSize = context.expireAfterAccess().timeNanos() / (2 * context.maximumSize()); + for (int i = 0; i < (int) context.maximumSize(); i++) { + var key = CacheContext.intern(Int.valueOf(i)); + cache.put(key, key); + context.ticker().advance(stepSize, TimeUnit.NANOSECONDS); + } + + for (var node : List.copyOf(cache.accessOrderWindowDeque())) { + node.setAccessTime(context.ticker().read()); + } + for (var node : List.copyOf(cache.accessOrderProtectedDeque())) { + node.setAccessTime(context.ticker().read()); + } + for (var node : FluentIterable.from(cache.accessOrderProbationDeque()).skip(5).toList()) { + cache.get(node.getKey()); + } + context.ticker().advance(stepSize, TimeUnit.NANOSECONDS); + cache.cleanUp(); + + var expectedDelay = context.expireAfterAccess().timeNanos() + - (context.ticker().read() - cache.accessOrderProbationDeque().getFirst().getAccessTime()); + assertThat(cache.getExpirationDelay(context.ticker().read())).isEqualTo(expectedDelay); + } + + @Test(dataProvider = "caches") + @CacheSpec(population = Population.EMPTY, expireAfterAccess = Expire.ONE_MINUTE, + maximumSize = Maximum.FULL, weigher = CacheWeigher.DEFAULT) + public void expirationDelay_protected(BoundedLocalCache cache, CacheContext context) { + long stepSize = context.expireAfterAccess().timeNanos() / (2 * context.maximumSize()); + for (int i = 0; i < (int) context.maximumSize(); i++) { + var key = CacheContext.intern(Int.valueOf(i)); + cache.put(key, key); + context.ticker().advance(stepSize, TimeUnit.NANOSECONDS); + } + + for (var node : FluentIterable.from(cache.accessOrderProbationDeque()).skip(5).toList()) { + cache.get(node.getKey()); + } + context.ticker().advance(stepSize, TimeUnit.NANOSECONDS); + cache.cleanUp(); + + + for (var node : List.copyOf(cache.accessOrderWindowDeque())) { + node.setAccessTime(context.ticker().read()); + } + for (var node : List.copyOf(cache.accessOrderProbationDeque())) { + node.setAccessTime(context.ticker().read()); + } + + var expectedDelay = context.expireAfterAccess().timeNanos() + - (context.ticker().read() - cache.accessOrderProtectedDeque().getFirst().getAccessTime()); + assertThat(cache.getExpirationDelay(context.ticker().read())).isEqualTo(expectedDelay); + } + + @Test(dataProvider = "caches") + @CacheSpec(population = Population.EMPTY, expireAfterWrite = Expire.ONE_MINUTE, + maximumSize = Maximum.FULL, weigher = CacheWeigher.DEFAULT) + public void expirationDelay_writeOrder(BoundedLocalCache cache, CacheContext context) { + long stepSize = context.expireAfterWrite().timeNanos() / (2 * context.maximumSize()); + for (int i = 0; i < (int) context.maximumSize(); i++) { + var key = CacheContext.intern(Int.valueOf(i)); + cache.put(key, key); + context.ticker().advance(stepSize, TimeUnit.NANOSECONDS); + } + for (var key : cache.keySet()) { + cache.get(key); + } + cache.cleanUp(); + + var expectedDelay = context.expireAfterWrite().timeNanos() + - (context.ticker().read() - cache.writeOrderDeque().getFirst().getWriteTime()); + assertThat(cache.getExpirationDelay(context.ticker().read())).isEqualTo(expectedDelay); + } + + @Test(dataProvider = "caches") + @CacheSpec(population = Population.EMPTY, maximumSize = {Maximum.DISABLED, Maximum.FULL}, + expiry = CacheExpiry.WRITE, expiryTime = Expire.ONE_MINUTE) + public void expirationDelay_varTime(BoundedLocalCache cache, CacheContext context) { + long startTime = context.ticker().read(); + int maximum = cache.evicts() ? (int) context.maximumSize() : 100; + long stepSize = context.expiryTime().timeNanos() / (2 * maximum); + for (int i = 0; i < maximum; i++) { + var key = CacheContext.intern(Int.valueOf(i)); + cache.put(key, key); + context.ticker().advance(stepSize, TimeUnit.NANOSECONDS); + } + for (var key : cache.keySet()) { + cache.get(key); + } + cache.cleanUp(); + + var expectedDelay = context.expiryTime().timeNanos() - (context.ticker().read() - startTime); + assertThat(cache.getExpirationDelay(context.ticker().read())).isIn( + Range.closed(expectedDelay - TimerWheel.SPANS[0], expectedDelay)); + } + + /* --------------- Refresh --------------- */ + @Test(dataProvider = "caches", groups = "isolated") @CacheSpec(implementation = Implementation.Caffeine, population = Population.EMPTY, refreshAfterWrite = Expire.ONE_MINUTE, executor = CacheExecutor.THREADED, diff --git a/caffeine/src/test/java/com/github/benmanes/caffeine/cache/ExpireAfterAccessTest.java b/caffeine/src/test/java/com/github/benmanes/caffeine/cache/ExpireAfterAccessTest.java index 767ae61cd8..64256712fe 100644 --- a/caffeine/src/test/java/com/github/benmanes/caffeine/cache/ExpireAfterAccessTest.java +++ b/caffeine/src/test/java/com/github/benmanes/caffeine/cache/ExpireAfterAccessTest.java @@ -335,6 +335,7 @@ public void ageOf_duration(CacheContext context, @CacheSpec(expireAfterAccess = Expire.ONE_MINUTE) public void ageOf_absent(CacheContext context, @ExpireAfterAccess FixedExpiration expireAfterAccess) { + assertThat(expireAfterAccess.ageOf(context.absentKey())).isEmpty(); assertThat(expireAfterAccess.ageOf(context.absentKey(), TimeUnit.SECONDS)).isEmpty(); } diff --git a/caffeine/src/test/java/com/github/benmanes/caffeine/cache/ExpireAfterWriteTest.java b/caffeine/src/test/java/com/github/benmanes/caffeine/cache/ExpireAfterWriteTest.java index 5dc2e3ce29..6ae6e0e2db 100644 --- a/caffeine/src/test/java/com/github/benmanes/caffeine/cache/ExpireAfterWriteTest.java +++ b/caffeine/src/test/java/com/github/benmanes/caffeine/cache/ExpireAfterWriteTest.java @@ -319,6 +319,7 @@ public void ageOf_duration(CacheContext context, @CacheSpec(expireAfterWrite = Expire.ONE_MINUTE) public void ageOf_absent(CacheContext context, @ExpireAfterWrite FixedExpiration expireAfterWrite) { + assertThat(expireAfterWrite.ageOf(context.absentKey())).isEmpty(); assertThat(expireAfterWrite.ageOf(context.absentKey(), TimeUnit.SECONDS)).isEmpty(); } diff --git a/caffeine/src/test/java/com/github/benmanes/caffeine/cache/LoadingCacheTest.java b/caffeine/src/test/java/com/github/benmanes/caffeine/cache/LoadingCacheTest.java index 84f4b0df0b..bb18265595 100644 --- a/caffeine/src/test/java/com/github/benmanes/caffeine/cache/LoadingCacheTest.java +++ b/caffeine/src/test/java/com/github/benmanes/caffeine/cache/LoadingCacheTest.java @@ -143,9 +143,7 @@ public void getAll_iterable_empty(LoadingCache cache, CacheContext con assertThat(context).stats().hits(0).misses(0); } - // TODO(ben): Update for Guava's fix - // https://github.com/google/guava/issues/5810 - @CacheSpec(implementation = Implementation.Caffeine, loader = Loader.BULK_MODIFY_KEYS) + @CacheSpec(loader = Loader.BULK_MODIFY_KEYS) @Test(dataProvider = "caches", expectedExceptions = UnsupportedOperationException.class) public void getAll_immutable_keys(LoadingCache cache, CacheContext context) { cache.getAll(context.absentKeys()); diff --git a/caffeine/src/test/java/com/github/benmanes/caffeine/cache/RefreshAfterWriteTest.java b/caffeine/src/test/java/com/github/benmanes/caffeine/cache/RefreshAfterWriteTest.java index 1775a81733..81c7c5e3ce 100644 --- a/caffeine/src/test/java/com/github/benmanes/caffeine/cache/RefreshAfterWriteTest.java +++ b/caffeine/src/test/java/com/github/benmanes/caffeine/cache/RefreshAfterWriteTest.java @@ -733,6 +733,7 @@ public void ageOf_duration(CacheContext context, FixedRefresh refreshA @Test(dataProvider = "caches") @CacheSpec(refreshAfterWrite = Expire.ONE_MINUTE) public void ageOf_absent(CacheContext context, FixedRefresh refreshAfterWrite) { + assertThat(refreshAfterWrite.ageOf(context.absentKey())).isEmpty(); assertThat(refreshAfterWrite.ageOf(context.absentKey(), TimeUnit.SECONDS)).isEmpty(); } diff --git a/caffeine/testing.gradle b/caffeine/testing.gradle index 14feaa23cc..435f03dfbe 100644 --- a/caffeine/testing.gradle +++ b/caffeine/testing.gradle @@ -5,9 +5,6 @@ test { useTestNG() exclude 'com/github/benmanes/caffeine/cache/**' } -tasks.named('compileTestJava').configure { - dependsOn(jar) -} def implementations = ['Caffeine', 'Guava'] def testNames = [ diff --git a/checksum.xml b/checksum.xml deleted file mode 100644 index 719b698292..0000000000 --- a/checksum.xml +++ /dev/null @@ -1,901 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 4FD71D2654435626B5FC1D5FB47809D322D9AC3AEDE1A45D1A45070B1820C922522C7D1586CD1C074F3F27D9E73C8F51F554AEE0F07A08ECB6593CAF0638825D - 6CB83B6D5054C63C13AF5FD39F11065556137EDD423385F5D960A656FAFDDF5A5DDCCD1DDEDDAFDCBD511D0FEF005C58FAC9E3FB0BDF1D469AF24450DFBC2325 - F8FEFDB21CB04D9C229D3C27DC03BDF141A943AED99D29B1349CAFB10758901AE8A564C0C00FF55F574D1CBCE4BEF9E33B6F6CF92B8ABD31A8D98009870DB800 - - - 311C3115F9F6651D1711C52D1739E25A70F25456CACB9A2CDDE7627498C30B13D721133CC75B39462AD18812A82472EF1B3B9D64FAB5ABB0377C12BF82043A74 - - - 3F44A932D8C00CFEEE2EB057BCD7C301A2D029063E0A916E1E20B3AEC4877D19D67A2FD8AAF58FA2D5A00133D1602128A7F50912FFB6CABC7B0FDC7FBDA3F8A1 - - - B683854D72E20AB8BE7AEBB41212A559D1B984560675D38423A6603C2F0B71578502431B0BBF7F94EB8833E66017B7237B0966DCF7165349B05A6385C595DA7B - - - 46B0259FEC934F044B0B2120F5C63EF57F3A98CC227E46F2651B700DA936475FFA3546EB0DECB35B40D2EBA1DFF67A53E977F412F54C9A49DD18AE17E6F28051 - - - 4C5619A1191B8450FCC10AFD613F38B286B95EA28C4F20150AE388569ED7BDC6D963C042233A5FD45A8933DF86CD4DDCABDFFBD855181578289D1E0A5CD3E981 - - - A10FD1E1534E4054656DD0A372172ECFE45E3BA79BDF2F8E807ED63B54BE8013894F0E850F961DC3693523C3209F2DF2B74286024786E9E4D54C2D4E1C1243B7 - - - 2623B6B94D30365A2F8EC881CD88AD079789B1A876DA96E756689AB260B0AE7BAE9632BADF84858B3252CC8C691579DB2C65CCE7A9ABCC1931FCC8FE50D29EC - - - D8862371CE47D917CE42D9E6D0B515A689389732F914A8FCCE68BF4F5E23199B7632EA3A29578E530584337C816E5787B4168EFD0123FC59D114FBE5D94267D0 - - - 5EE2EF4C12888A48D7C830189D06EE8A653C7664A53C9B6FA935D4E7866B0454111F8092D7ECE086EC80C61EDAB2856187A1E247873E5C8E4724EFB02C37504B - - - EE4724836776BBB74983ED44958DBF566E60F258E2BC5B6669D61BC6F962F8DEC70C8EACA50BE5C9DDBF1D5AC8DD48BFEB583C33426B62396146EBA511471D4A - - - DB4ED602996D01166A138BC3DDF2B926CA4A0870A8575EEB033C0230BA46EAF0C72C1E821DEC77DF2F737D70773DB4B3D6C7EFB6172939A0D05B31B9DEAE1195 - - - 7A734E87D19D016D25D97D67B139C5C7CFFF2C655177980EAB20A4D19BA97012079F97FD70B8E72C24BC11C90205616B36696F0D256B4D3FE7A16234C0F16232 - - - D5C91E2276B9E3EC98BF3F1EE4110A1371403CE554DC54C45F408C55A65037BB22BA7F0D453C7A70E16E0D68616054DB6F14F73CEE2B60280A76D297CF53ABB0 - - - BA336464F60B2A58DFE6F5ED5C3A29EF4DEEE339F98EA532D71B4DB8142A3B21370678931AC1FF5DBFFC2713A78BF66CC6AA61C2836947AA8478AF6DE4071F7A - - - F4EF28996D370BF019BDCBAF77052F25D89F05F64273825A3C9546B1A672DC9D0E38189FD6BFBDE9DB3E1633DBA45A96D38EB28ED1237C4CE6F94A0F978A78A6 - - - 1E637F7546DDA1EDD3EB74B181B918137776611EB703ED90A91B3845DD7D2615D40A0A586DCAA4E494EB097D2E2E05511D0DCFEAD47416AE7622EBA05EFBF7C - - - 6FD361BA1B148773039C29A73711839213EB098702C5736D3A8B0CF586F9514468D498D13DABB2857728C1150DD85488CAC3337A3C6D0AC31F029DECACAE9662 - - - 77C6C69702F89D2320AF23149DCDB2597A9A5ABCD7E18520892CF62931D66349C040BB1CE391FAAF6250624BAC62F003F0C612A582B0366A98D1491742E9E96B - - - EEA3D1118C6DE8F890AB6A04EA3505C149F99C034C26707C44ED736F6603C6253A03BA07D0361C4D1008E5CE944B0DD7457DC1AF2CD6B01091F6594261DB1F77 - - - 6B6E1C845DF98A6EFD07354F7DC2FABB77FFB171F20BE88BC232270AEB0243370B5265E2A310D8CBAC77F83F2B0D11AE8EB59A9ED1F030D5789357DA3899798B - - - B6382350A47641D02372F93D535ED31CD2141CAD2792FACB9497B4E434EA0881D0DD344E39267381033F40BDC58F5EAEA1C1632AE4BD0BC04CD78D2384CDA440 - - - C0B463A7C016BA23733DA36F7B6AA224CD466605E8EBA63688A06665E9AF6110218D4081088F8AF824BEB6E139259CAC18E7E26DD9B63826698D0669FF29B303 - - - 1BDB77D5580D6207599083E00A64AA6A585405A0A530BB044B4EFB94FF3C6BDF669C6BF1E64E122E02431BE18E948E2922C065345C050264FFEB8C6E23EE9BA9 - - - 4268D3B67E5E8A64A899486DD4B1648B35FC39BD5C8020694F3CBDCFE3843E8CD6A8A11C5C3136B71F162E9D69F267BBCF0C5BE01D136AAC04B9AA4AD496DB77 - - - D57AC7E2C3AB7135504C2ADED5E622032AB03905EF259645A0EE2B0D3B9868BC15131AD50027F47044F710DBA681AD2A54B669451C795E8189378AD2525D4E44 - - - C1AB30AA9984AAF40E0DEF6474F535875ABCCA1568E6D495317D1092B782AC39D13505BBBD50877589610A59273AC89ADE0B68EEE0501961C1AF17CA5D509178 - - - 9D2B8E7F26D347B6C7EA42BC50E42BCDCA1CFA3388E160FAB5A0E1A5B6F7C4CAD1920F91A384C0B6145C0FE4B03ADE39C9CDF28145D709CCE763E3BE8188818 - - - 47D46F7E4481C2D107F4EBE18EB03BAFFA1383BDAA614E9B18E5C69A3F0712CCC88D3D142D090CBE00E359820418F2CF5670F8686DA512B488E4D063A5A8C8D3 - - - 27A66A61915CE5267605968A4D4024671221A2620D0EAF501FB4021F68CD5A32A6FF1812ED7081351767562A3703F9EC48EA72C5845377BC5B4703D8740076DD - - - 1ABEEE4AA1A033F7A38333846B8B65AD6A859F1A3F4420F193A5A47A096EEE032D2F769B1BD79A05F752EC3139A256CEE9EED36984B5078CFF651DAC0412D352 - - - DF5BFED7DFC327166FE0CB81BD6A9655F44CCB268E7E69204BD09955147CE9A97EBBCC28F9ACF315DBAF49E850A43CE8744F44E68D7BE816EACCAF0BEE41B203 - - - BD2785EAFEFF5D53597B22798B352C2CDF354AB297C7DC444FF87FBAABE89E5C8D67D496379A99EF1531958524C0010B60F6EB48BB4A27AFA61145F094702360 - - - 7D41E58487E4EAE601BAA6F42EDACD2F903AC04DBD12AC2A9784FABF0A8DCE8A416C18C452D14B1D1608938F19518E87536986387AAAE9737FE736E82BDE94E2 - - - 39308A31635C2B4728354CC79A1EA2F0DE10F7F80BAE0205E3D960A92A42A25E55E0B4ABD18960502B22E5467474DCC8E35079A6866742773D47A3D2D1A206FB - - - BEA7726A32C1541ADBC5968B4BC44187CF7B75E48868933AC9114DE5D611A312B5BA990207460AF5FD46AA14094ADB74DE2D13EFD8941EDB55C8410F62C8BED4 - - - B28C169500637C1FB668A45C59B890C78BBAB1AA9B70A8F4E0436A94D88773E372C46B1C7974E1D71676D1A2C49641F337E1242802BBB9050B083C2578CE3DC2 - - - 200B2783133DB13CEC356EC2390ED028AFE41A2E685A0805E9DC6F83BB0809C70FC1DCB14232F0863EC09C9508DABB988D3A728C4D10DC1E7AE17E25E5102C37 - - - 755DA0929DEC520A7A5AFA7C46C5DAB0040A7DDD8C6DC9E2092BB83074BFF519E23DDE2CE45118F449B6CE417B4123D519FDA6FE6694D295B575C983F782C49D - - - BD956309B6719B39F5C9F76134F94D4868AB64BF34E811ECA6C2B435C1E6AB1ED9E036BF6F12EB928FE8424EF9CF8DFF023A2498D7A930FA4E2F570516990BAE - - - F49F447FBCE57A1C8EA792FFA38744929CAEEB7398056B3760C3DB984E911C52BBC2057CA1000E29C91931FB94125BF1D3267858D3981988CB8F912CAF1CAA1C - - - ED4830A92C542A6CA4DFFDC74F9A5AC80D4C554B8B54451083EA345E9B2F0790E90F20393F3E36B08EE44CDD053FA2489B3C489CF9A14A14BB4EF723938B79E8 - - - B865FAE7D5F9515F7E92CB9442A5480597F024C779A47A53D68E09D6933AA95E68DE1FE74D73DF35C0A3D991D6882F9F8598738227CDE5CF13E3C1BCB08CDD54 - - - C7F61D41E7D23B6DEF4134EA14E13B5E03553F77B39EB5D4B521372414AB5A9070B80BE13E8FFF80DF60BEC9E26B34BB0511EB733A52BCF203C1FE0302FBE4AF - - - 91E20F45BBBE65CFAD1C1534BD3F95AB53F34DB34255AE35FED7EDE37F1AE7C1B56F1BB3494EC32ECE081FD7A1626712D8E5E5B2E41588098B076F6D44FE2E48 - - - BC3BF88FB96DF29FA572179B63009FB95D7A41F938E00AEC5EE6B3F59205E934F74B31F2BFCBF7284F9CEE65CE2D24953D5353726C816C2E8D57C76C40B467A7 - - - B913893393AFEF1984D4E0C111706364578F7872A8502D8BEA0566DA5A608AE32BAAF95BEEAEF7364D896AD1ACB5884280225E36DEDAF6F9F6D154D243BFE29A - - - 2FD5E4F2A0178762BE14EA39A4087B43CA4E7C15BFF0051F5EE61C940A6BA7B520E4D52625134BCAE6C6F0B3BF0503F007265E360B6DF8B570E8884353A3743C - - - 51372BCAFB87FBFDEC5DAB387014693B86A800CE5954C847A11DA1E36FC5ACF95110F335B0BBA31B1E1D31960DE0F5565F34A73CA5567EBFDFEACC70DB574EFB - - - 8D6E78F1F9D54E0D50525328BAD7CC904F98CAC05FF7B783784E2115185CBE0A4CF659B8A8129E0759D96775A1B2A0AFB63953ECA897FEDEFF8A2B7A371B804E - - - 30866ECE3D4797484855798C5CE613A5D4B0CE21F2D5EFD88223DC2695302801C5CE4632A3469A53B68AC4582F9D603FD8EB38D32E5A6FBB82E8E98065225149 - - - 2C09B102601DF179B615EF37F5E56B9AA1100BB2A17D742B8CB452C1A193C44ED3EBE029FEAFB9822D55A680D99B682184C733D56F835874DD01B02209AFA13D - - - 5E0AAF09AE8E6BA8C6653E79C098520B5CC82B7953E5902528C638097A25EE6020C160A63D4D45EE4A367C66B50128A8D8A19B992B54C5A948FB44A1E7567C11 - - - 724EE5877AD0EF07E76A417505E611EB2D34E54CB6F918A41CD47F31BB6215A57DB3332E4F228F094EA0D2C17B0D52A0E92C70E9AB6992FCBBD83F9B95B26321 - - - D6255782CC501EA366563ED3F95E770668627F711D08D02C24381C892FBA279578454DBFCEA536C4780FFEA2A2C07C443D3AC5DBC03F099EB6374305A0C005D8 - - - 6CC8079B133D8DC8CD550994343646F8409A56273158546FD2C7E190B05573799F605CB1CEC3AB16E05E21B91787BA9DB7BE4DB936909E1832BE0E1293DAB59A - - - D6DD92A7DF0663581E5D57B45D9224ECBF8B43334EF27E09FBE6F2819D282BF4A0A78DDEDA3EE61814A6A5C92FE3FF73A9E60F91B1F0987BB4B92189FB0FE9FD - - - 9249FEFDE77B88E68E490608423D40DA2D8171985D0878C5EAB75C4B1B01FF5FE11E2242259E7B7976AC8836C99B76BCD46FAB01BEDC30B1C45BAA1023CF6302 - - - 4C0ED497B1028C748C725E5726215641EC654413F11413C0D0EB868569D0D8AA898130900F17E8C76C1788606919A606441AA90D5348A0EFCA174A618D90338D - - - CA5BD814B149137FF7FCB52CE0261EA491C182E3B41BA0702EA3725D714FA76B85CC73078D254A351050C9332EEDEC9BFC846701A98D3FEA0127D4BA16ECB7F7 - - - F173CC7E0FBC2BEDE655D20BB2CFD1AE771347C176FC59AEC0D1959327D94D223E44CCD64A8E96B9637E5840FD006935F5859C67EB992E9FAB77349B7E1A6A14 - - - AC62C764F78C5180F03EA58EEA3D5E66A3DB93A37AC612D1C2AB23C65726CD61868B53DC6EB3B982595852DA561843CF50BC43C5C4A362A6E8280BE5E89D6111 - - - 73060E097B37683F251485BC20932012159FF6AAC2C8952271C674807AE83273DEA3DB232E7897B9EF3F56E41068C98F9D321658ECAF6EA664D4506FF95DC7E1 - - - A38A0DB2C8BA0AB6BBCD17DD62625CF67886B2664E5EA02D3C2C1677DD84FD63BBEC3C4485234DC424E2C00BDA4B51FBA439C227F1D113800BEE85AB5F242A3B - - - 93F850936BEAC2AC2F9BBB5B6644DC6B5E77520381DDA38B4C5D2D6B1315253FDF3B15CF0E3C7A0FACF8D2164DCCFB5CB61D54C5B05E52A8D52E2C02A3D4E2DC - - - C4AACF24D6BCBB3278C0942D4772CB8BDF5C9EBEA68D94587EA83D66ED20E329DA9C14D0B406C9D5C64D05EED4B887F56C4D91410B2AF221EA90CB3EF5966F3F - - - D0ADDB6CD04B6283B870A08DCED7E838365B31B63BCBE45C5BBE6F62545126D51FE5DE219353C03F9BDE045AE6539F712DE06890E55A2EE52E2F1B71BBC94BF5 - - - FB90690350A257F2E164D5D77A614FE7988FEBF28EC9D616ACE4143FA161987A6965E85BA3095B3B27F552963B8E8CD17A27C65401C49060EA09DEBEDC816DAC - - - B3690AA0E1E8CDD2A4EE342410F352769455EEEC988F57322D7EA3DD82EC8FD2FDCCDEAF1F603A0C080F5DDC727B134784083B4827426C06921F4B36930C5409 - - - F91D782396ACB868E8AB123D1E4B8432B93A449E3B43856DF2FFA4B393ABD0AF9EFF400977FC070C39BB368104804E0A5038FD1E6E1716DF9AF6E3774734A0D7 - - - 924DDFC09530C66FD400E92D50F5C0D7553CEAF913BF0E5FC69664282EEDFE7EB3B92BD0ECDB32EC64F51FDF38D52A1CE076A105927FB025B7CB782B07496AE1 - - - 845EE811846E707233CA6C3D866E7D761C0036C81081BCF520927EDBA8B1D0B31A7AC15F647821F6434BD4EECC5715146EDEDC52D3AABB8E4C9A24C2C9511DD2 - - - F1AB0D030C7983804AD10FA1A375AFE50EFBBBEC15003E3EB1AD37953C591A6CFC9642912D682CDE180FF207B3CE4388BFB96E0AB17FA68806298C661F294F4 - - - 8F9401E239BFC8E80ED59C6CBE911A6FE1C1098A5FDDDE9B49916AD2FDB82DC63FDD6EC7E2B649564442E93C11317CA7CD4D178A3A9C59F1CFBA8A79BE904836 - - - BAA77246D7575449BD53C52C7C1401228603CE23FB2327492739A3308C9A3F4041710EAB0D5E875E00A13A3536A7855ED319F8AAE37457EF4788C57E268E3A43 - - - A959CBD144487261AFD4AA2C4108B5D8D19A9F4B1FC1AAC270FA6BEA0D5E82EAC70AE550294935D25729321F5248756DC063CD30823A6D3C3A572902E5C86F8 - - - 50C3BCDCB19435BDA4B65CA781019895D44B1778DAF304728D4A8981581AFD0A339740B48452611C09D2183605B02E95F7E55C184211001B6A8534FB6C1F2B74 - - - 347F865BD5B9310D6972BDA95AB089D2BA911C4EA897A1E4E316465077A0153609E31DFFD3C2D61DEEA7E54C07D7D36D5807F9B24F3111A97553DFD260A205F1 - - - 6263B511BFAC9A83B3EA02F740B9A9A61639621AB27B722632322144009FD50139291AEBC4F0D29409BEFBBF8597252E66407289CFE5E0199E54B6D1E0830400 - - - E0E647F10A79E91B88A0F2EA12460E7F004E97EFFC6788ED03574283CE566C828023CE68613A5CC2E68013D9D23783F0BA1A27093DBE6C2844FB1DDA801FC7AA - - - 4DE22E2A50711F756A5542474395D8619DCA0A8BE0407B722605005A1167F8C306BC5EEF7F0B8252F5508C817C1CEB759171E4E18D4EB9697DFDD809AC39673F - - - 826D35C2E981DDBBF010AB2A6074D46D0E307C77FB4AD63F3920E983554BF138E95F4E7242629D1752B434A59353C75B7D4172DAA0C0C54DFD8A19FF5574C239 - - - 3DAB33F115BB27B80604AC59D2CA8DDBCA0002FBA647BB6BE3C13D10EBF072C2652E249E890F0FB3A9361952AD68D9B4864BD0E4660D5F4610BDD745AFC640C5 - - - 1B2D2CCCCB561062C2C4FA3C948CFCC6DC17851E9C09B45ADD4312F2B674A32D8BE6D14180DE2D652322E578A6F8D391CFD5359064717C0042A86BC74C062DCC - - - 28DD641FB4948EABC29DAEBED0BA285C95F0C6D0FC3D595809C2A374AA5102ACA6821EB494AD792702C390914A6A91600C1810B2AA7CA965AF9003D0752039B1 - - - CEAA0F67FB9D04CDC125BC25694B4C412BFC0AFFC6ACC641C8E24E9E276E1990FF995B6A2A64DB896E4CF7E1BAD96682FBFC97DE95587C4313D6D8A958035E3C - - - D046D70ABBD137039F917CCD3786F5B3FCABA0FBAC3AE1C7597A77FA84BC75466F48A40DA53ADA6C45F05F77AF952D5EA82A9B0F873C53DF894DE0E15DB6D8AA - - - 559ECA3B9FC21BE76ECAAA9E0073DC2014BA50DF2A14AD8919F358C1D7761E2C492EB09DAE1099A308C2F8C0A14635AD4583FF26B7868A782DE6A16D26F7EC6C - - - 24498846D540C1FDA16E3F835058DEAD3FE28C8D8D1AF35D1DA40C53441876AD3022085110ED3F633685EECC56642AB7B6EC7E6F1B0A11584CF4BBB3464C435D - - - 66E569F3C5CB1FCAC9B2D3444AB9550017BAF64FEF46281505F7DE4BF602E73AD3C1A849790EEB24F3F5CD7E49647DFB7BF65E91ADD497FE619EDEA31EE6B8F1 - - - 56D0480F4DD5A53D5A13A4B2FE58EE861589D1ECAC9A42BF7DAC7376A08C82A3654E3E1B5ECC03622BAE1FD9BFBD2D8CC9BF36292AB96A9BC3ABB3A1FE0A328 - - - E4C006C0F02D96E33AC434A94002AC1FE4B7851C163CD77B89B93D662C5C632CE36B207657DC763B00940DA19B5DB5B364B0088A89214BE9CA28B0559444EF0 - - - BCF18D17C1BF5AFE15872B77C84C23A88E2A3D93829520EF9BCEA74F1E42CB36575301FC0BAFB3458932437636645F046F03348751F695D960A9C4C2744B734D - - - CA5FAE58FC542D332923F7BBA52EFDCCD2779DA42ED3FE0A72F6E3E70A53F4DAA079EE8D7497EACEC144BDC135FBDACAD39920D3F00B408A033583B3467DC3B4 - - - 36557C04B8FC7DC446B5FBDD6383A1B7281708B424C3039E7EC11807F3BB9A5E2764BE4BEC1D717C38595B12D8B291CB2A002D85B5E79DC9A9A4CBD27C58C7BB - - - 5D5868FDE2D3C76909980535E146F4FD4EC8C921BFC337953B8E2C29D2F55D274100FFC4200CA0385CAA60DF2E5E9234DEB9745EEE63A04FBCD1E76603AE9873 - - - 80BE5ADF1A1D5F182DA3BC718953D0149673C43844690DEA30FE00D83EA3886517E88473DA48619007932047FD45E461643EC07704B3B7C5B52D798801C6066E - - - 97823390838111768E99E68A9EB8E603E528A910850EF58B1A9198828C5DE9C8F4BE53238DBED56C46A2471E5F1871FA4CD1D34F86FA44B4E3643BD3D03901A9 - - - A9789681117B1D01021884DB7D0F6367CA3B7F4AC6A4630BC6769DFDF6D1003E49CD7A894D803BFA6244AEE5135F610EEAA4E2E1AD67F8C5196C8B7A1CEEE451 - - - 4D2D1FBDC1C8EBF905F8BCE824B3B87DEF250BFE77465D68A24A5FB348B40AED821AFD24060132A7320920F7C87B3A4B8373ECFD033C08D4660A625C6CD8B5C5 - - - 8138BCC41F3573FABC75DAB54D73303408301880ABD63838E0CFB2E6C9405CF54DB623684536209035FA31ADE4E6D627A4C11460C98FF29EFC0A372B40375F93 - - - 44C956BA53F81CEF4BC36EC4FC11A7862922524C970BCA4116790615A335795B28B0717F9F105C89949727DC77D97F5D4CE830438510776C52F69D968FCE14D6 - - - 9EC10D4159C75F8C4E0AE9AE190FC8385FA54715B8DB8F675D1F3A64384F2C141B6EBBDEBB51AE349BD6ED162B29F94B1476E00FAB43505E9800668CBAAA84BD - - - AC82F58C37BFB512DA55DEB2AEE73BF3D52E572FFF9DEA892F564CDF3778D4B7653AFAC2D1C9DFF5C7FF2262275508576372824BF7C50227D2EEF25E22A35312 - - - 3F7BEB248EE35BCB965B4024A824961FD0D25375CC3EBB2A5C7E148881A4D5C7B3685C2A607166758CE6B972E028318F0BBB16CDDF412FC96F117BFB23D4EC5A - - - B3BFAD07E6A3D4D73CBCE802D8614CF4AC84E589166D243D41028DC077F84C027DF4D514F145360405F37DA73A8F2E7B65D90877A9EE1151174D2440530F9051 - - - 3C76A1066218F9C54B83D167E34B563C09BA2F72DB330F5843B2324DD2E40EE1F7E7887416B9C7A8DC03C07223E42216B76569F5D3962B911F922A6963C0C917 - - - 57615A7D2E58587CB360913ED2C995F433DAA3E80FCAAE5CDB74D730ACA84E309FA7B8C4B678340EC4004CFEEF70B250CDBAA712B2290746A57B1D946882A968 - - - 9AEC8CAD28C018AEA65F3C2C57FD0D4B82C00A8F6C778F6DBAA61C961AF3A7C369655F5A5E93B360FAE297ADFA3205BC40EAF16847B6EDB56F01DF9AD655A18C - - - 1A47AAF2442159C1CBD22521F31C74B4C71C4168AF5B22D04B4691FDD286E90F02B2792DEDAD3EEEC12B5034ADA1A9EE751C975B5A169AE0B33EE800A8D96E7F - - - 4C8808B0607564006379FBEB63BCEFC03A0F5FE83F307E455EE66B0B40AC238D14388CEA3C1D883835AF089238F824037A423124348571085C6D5415AB3981CF - - - 750C97C7BE33EEF83B43A94E4342F978F5FDB0E4A523ABB408CC1E2111CE214CEC3A6177265618A8429FFB6C09A0E47070C68F2F046F3A6CCC0F5DD77D2E2ED0 - - - B57469B9FA2C5D598688FF9C6A3B3283496921B91E269EA6D5A1DA6511125BD2545E2CFA8D3736739787B0BACF69C0AF5C5ECDEA474CB9FD56C96495E654682B - - - 8D72884FB1D818ACB2732128FD96C1C3AAF7F89670EE505BEA419621B287D028AD61CFAEDB71B23BCB80491500BD7A30D5450F1CF6C326013310F6053479911A - - - E126B7CCF3E42FD1984A0BEEF1004A7269A337C202E59E04E8E2AF714280D2F2D8D2BA5E6F59481B8DCD34AAF35C966A688D0B48EC7E96F102C274DC0D3B381E - - - 414F1B2D7269B751DDEEFC84E1BEA08DD1B10E8CC129C2D72CCCA4EF0D1E678D58A4346BE8BC4FFB9D8551FE96828212CFD0A711FE140DBBFE92A7C2DD947F7E - - - D377CB534FEB576A1D392B435BF650AC5690323C7A3C5C5D5F902CD3BC28F1916C2F1939D9C30DB236E69C6FD72E4553A94E0C2C76095D8AA49B63E0D7D81990 - - - E04A4F762BE04B506EBD71A464B7D163C2F51F85BE44674E4A38AF084D98FBA0671EA229B5EFB9E10D611B4E1636795ACCDA62C96C6E37D3A9B4B665B61C7612 - - - 84C4330B4677C21A5CEA0337B9E9946B70BB6F5A7C52B87DB165C30905A026B7C6B833249A43364B211049CFB21F033C64106FC6335618E4C75F8F77309F8DC3 - - - 87AA1C28EE42BAAC98B4E2DB8D41F6C248A93B92C5AF2F10DF3DF512FDBA2357BE4727C9529F6DAA4917E59DDFA990CF48DE54BFF194471C3CD5EE59D70CEC7B - - - EEB189E22FA686CD71103C943A185533C3976C1706E86F737D60AAA28CE3FE5C16658979DCD22CD359B0F0B6F3C94043347638617E4367BB46E8E876B7DE498C - - - CB312B3F571D91EF183C119D878F50464FFD97F853B7311CBA386463F295E8B7B3A5A89ED4269A045CACD5AA7CB4C803D4882854A0FDDEFA9BBC28C72AA6C786 - - - 5B18A20FA4B5BC4259AD0DD965FEDADEB33F0673AB3C5BCBC6D80C4C23A7DF2A2C023DD689BBF65CB96360056BFC77898A29D8CF2003194BC17BBBA4197DFBB5 - - - F6BC83A10A9C7116879C14ADD7CE2632B49FE72FA6089D599717A10F1349BD8B33253BFE7D6B345F77CFEA272CACFCFE1AEE0D19F6EC03706226391BA13D1992 - - - 681CBDD3FA8CDDB60B2B046CAF00CB29346A27B5F672A703B81BA449ADB65C54E760DB1BF3534FBDDC11AA00A3F3F0367FB010A5013AEACC4D82F12770A2EEB1 - - - DC1FA477AE67F94B7CA427F1F88FD3C56E562EB3ED92A3CBC4CC116258EB3856F4B53C99506FDC279F6983EAE74BA21271E4A152F5DB8B41392FFCBB6B087C78 - - - 7245456641F2BF87960CF859D31827EBF937739932C59E135635579199122A5763F437A19DED6B9CCAAF9E84FD698A675F60427138EF35C10BF40BBC3E7B68DA - - - A4C943D4945189F4EB883D764E63CF5C5F8F2A17EA1BBFE6C3F05A4B28E1E011D0358246618A39EC705E7CEE60D30ABFDD82A36A621BC7A3F5455E47D0EDAF2B - - - 7F18348A8EDC88BB4B0D6EB5412BC4F6D79D1E5843F28CA72F717BE50BF0BF6A19AE1C3416E5EAB40CC1FD27C697CB0F9B5E10A51CFA574093EF0A4F57CB93CF - - - 5EA9CA94A3682E090E28895ECAAE1E020C48DD249EE5040FB6EBE4B01DA027B86F94450E30692253DFA787371D4B4286FE257CEBF02E184AC149A746952D669C - - - 779F0D784A11834392C65DA375CF5F9612FD89B0540C665BCE1009EFAA7C35642E38D381AF7362703378306C95D24669B02CA27A2CCAFB574173BF9FA273F625 - - - C9D9D86002E5555FB8763AEE5E0E809C29F5D7A272E8130AE636040D40ABAEBDCDED435A12C8AB9788312650F0E6089B45CFE385CAF9DB32476BEFCD2C941D5 - - - 291E475CC67908330C30037783F7D57F773EAA7FD259CF95658BBB484EF173E012DDF88A882E3AE94BDE207EBE471A364791C43C8D7FFB6108576EDFF5F7209A - - - 2932761455396C0A92985A5929C8A66249DD36AAAF4D0FA13213C34A5FD2679BAE255D39739BC810A1328874C55C7987EE6276DF94FC26DBA74F9BA9AA03D99C - - - 6F44BE79691ECF80771220086E796626B45D053BEA913AD16E5AD3DEA3FA07995FEC8045DA6265B4FDF837EA985AD7E58DC398405D3FFA79C4E2DAA5881E2D09 - - - 51F4EECF44441AC5BA056087C6C9BC10750FC5A2DBE3FBEE69372B2187E9B045C198C8BED86003657D77BB3297C41B32008CFC4857BA8E02DD461029A5D5C237 - - - 16D30BE564723B74F312B4E7D06F349370FB6726B3162778C869CD723ECA2A40C4972C2757B3E107E1820CEC0D70B0BD2B96EFCD466518FC64495F7AEF97967A - - - ED6E95BF555AD3193B527258972DAFABD73745D993DA0CECE486E34A471D080850D201864026F4F41CA0982926C264C6E6CC55D91F000CDFD5D09EE3F306735C - - - F97D418D4C2892FA184F5BE83166AC2CD771FD10D7625104D9B054EC0FF361927A2AC2539D38F326F61373B6D700A3B5075605763562AC0AE6714903773CD1CB - - - 24C4E9138A757EAC59FCE3C65F2BDFD4E54EDE68899E191B55D68DDFD92BBD854C72546B37A21B31593ECE82C2C697D6E57CFB2AA8753B1F9B192D419646614B - - - 9D311F26017C6849918444C38211BDACA292DE1177BA9819E0658D2D273C0ADD0B0E50F13088C495440B530566F595CE8D1C8DAC4FBEA2E98006FC0741A9FC2D - - - A2001C5E2F3D7EB6FFF5DD19E92925114DF28AE0E23357D811E7C82955751220C39AE73BFEB0EA0BC34C3AF95E27A1D39EBB9E7F5F9522F3957D269F72FD920E - - - 5A630269AE2E19E48529A5D768DD9C01DCC9A91247A9D24CC777F0D2B79DBA06AC40AEAC4560C57BFCB6BBBD423621313013B742B78C24C8861490C957A4DC92 - - - 6B9620FFEA84B67D27132B6BD8D2EB080C519383CC3187474CABD10EB398BEB259D25974386508AADA1194A2BDAB5D223FAB584AC84E6B03D007EDEBFCBD9A68 - - - F21E8EBD12D3BAAF1289485AACD4AD9E9965F40EE4D1F21833DAE92277B7DD56FFEB073E187600AB205C42221A3EAD5551A2EAD20F746F9BD497C75E59871603 - - - 12EE6B6DAB34CB3538CC415E46CC5232BD8A7F750DAAD821F25AAEDDB27450FD490DFC52D96DAAF7D7E65FB138E18BD83CF1CB4375DF1680D09B86B4E2950B20 - - - 2840F74F04FACB68B2D90FBEA28A184119BFD4A2133B54DAE8B07289EEF7572C97CD01C97AC70269A5D72E0E1F43EB92F564970D53F45FCA41FA84272BFABD9E - - - BC7BC2A514F8CA104A392ECF8736F4A3D316EE988FA91299D33B0AF46134B38E14E4A5061449D17B2DF7A521643E6C02DFA37CC277ED7CAB7CE83C28C00E9719 - - - 3833DF2611E977764E7BCC46FB551E0418BF8494F3E85660F6F37A58FFDEA4B7D99D147B345810C32E5C3F3ECA7A9959CFD0442945B731C77EA5DB8BB72A7816 - - - C3E9D22597510BBB2960D8219CBA762293262F1418C5DB830A2BC28B3A9D75B58317FCE868029F10EA3149B59A3C8A6ACE5C6C0D48D58A543CC465014AA18956 - - - 8CF524598AFCC9B4D9C52FB3924FE0611622179E8EA505DA6268D2CAAF072AEFAA337804745C0247876E7867EADBECC0C7558C38E144B23C2FAE432D940DE762 - - - 99A7E007B96C87013DBB4712CB7F119EE6BCBA56EA857682357EAE26ED4E1679E0B3D4C2746C6E4703036F336368A28A6C7C0C3A6B2AF9D007BCA1AC7A584C78 - - - 5E95C4C5B28EFCBAE4BEED6D35317A84E191F1782BA6C462575D53188295B740ED7D5FF1E538FC8A31FC972BFA5603C01A3FF34FB1DCB188782AA34EEEEDEBEA - - - D0D63D9B78AF292EF9167871598A345EF2F10B91DC0CD1E2B5B827AC6D57CF9AF40567ED59AFD6E434B4647C05FABC42CA6D9DD7417A5252E49EF3BBD21B16A6 - - - 4F4C3A6480ADE387EDB8FA8BC10D71F8642B96A27B2E5478D9557E08C747C8C2206B5AE1A161151CEDF54F3AA8AB107CDE8C777303A0E4BD1B25C97B44059186 - - - A2011FB69D4853D4386C6878D9F6CDE8335E39D28699DABB5B4253DCC5376EA9468DD6D8F1C0EC5B87FA3E54AD80EC2F2C71DA3E1232900C64EA4CCD754931B2 - - - FAB99A85D81BAF519EA0B0B854D7D46CD4246160B32DD8D3D5A720D8DA7A1FED0FE09E8CC223F74124D31517D30CD9CFE7F19C7F37A58E091B81CB9D1113F314 - - - 1EB4F9BCFC7411794CF2F665D80A0905904B483599B5EB76CDDD1C62C340E520E6A2E5AC30D6E2EF43882BFC3E72756B3B627466C112499B07B31D3EADB3B018 - - - A2AE577D7135E1411A9C6BAAD045C72E32BC6D4F058FAA8F18E1899B4A1B8EFE6006E896EBC89345A37A0B2175EFFE115A48FF59A39E133E072760E64EC7C088 - - - ADBFA4FFC3760D2EED3A0DA909FBCA3A917EDDE34A401EC06689B31F4BAE48D23CBD3A2CF2E0591A694AB09FA28E31D5448009850BEE452BFD2B127DB526E272 - - - 93F5BF49FE5125BAFC561892F038BE371420B81F9FB210CAC31606C7868418F3CA9F133F3AC0C7D568CC1399468BF0FB54E32B6B0000AE1288A68E836B8D817E - - - 4CF33A1093AA77448C71E16C989C2357AC96E473E75C2BDC65987484B526C1DC60594BB73E085A245BFD92AC0AF5C06300C302A111FF2D735068A418F685BF5D - - - 8D9BF9B5CE5846F4CC641A701B74D139A66295206E6F2DF4D2C3B3772344D866DAF5C6DE0318613CA6B94EA4F6B5FC2F15E7516C2B3AB0F307AAAC65733E1FCD - - - CFAB87EE54727A23526EBB62939E38294E551DF853DEECFD9F3AA5C5FB70B697A5F59679BB90064B0DC57AE3BB4DFB7ECE5D215DEEBDFD5C76F72D3A9280A7BC - - - B9C81F86EFF60CB2E1E87529CC35685A6723BF8AC62EE2B5C6DABD09DF7DD379464965329B91B0A4178A07DE0B95B85709677F6921CCF75CFC1D0526C263E795 - - - A02D859D91CF51F8E272AC81400DE786AB75E193D836EA90C401AEC9F0C59DD26B0228511F0B7FA76C6589F30BD02EDAD5494049FD79882C7DA72F7A860C2DB2 - - - 98D59086A6021CA571D9C1D64B715E43044C730E1AC563F514C40CF44302615D30378B6D5CC69990446522DE6260DC8E7B303E3990A3139DC326D058DFB6DBD9 - - - E31DFFB5044774C1B14224F5103B995715FC4A705FEEDECD209D73577D54F55D5764350CE603F5E688120F3C7557B6474124E00D827E30FB3C32A3C7868FFC2D - - - 1A6CA169E9E2D29256F9C45570D89E5B039EAF7D405CCB3F7F79926552F2A0818975CE2C6ADCE3F1F59E28172E4303A1C790C52AB06263C61C9C8181FF279CEE - - - D74FD51F49A8278545EAAAAF808692D69F7140FA73F4CF1EEC01A21D5D2A378356A5D74FADC2F6983EE023CDF6E06851F9F37A084BE547120300AC97D9CC6BBA - - - CA97B49EECE30DA774055B58A63C6E4F65A6BC4C0F40A829DCAF7164FBFFDEC10C6B2D9A22DF0A0918FDC83A47EA9906294AA99D3F170B35FD9E0632578C80B2 - - - 2879AE5E7B796F0777B4730FB3F21B8D42CBDBF3A090ACADF2CE52082F1EA030059B0067D9A3B4D2C4B4680519A8EE9B2CF1563901931645245A973B9F60B1C2 - - - 81A223620DD16340D18ECBA20AB15CFE078F61AB0EC1AEF091AFCD282E3F6047B9800200412116289EC14917B5ECE9414C8009E92CC9A3333C677B5BFEC13BCF - - - 7C285E6DE13CED1FD6110C616F9F38120D5D37DA9E39BE1B6FC16224595F54F645C675313F75ED819AE27E66D84E9BC378A6FB42DF2F4DD2819ED745767A79AC - - - 6B9630AD4C5F6ABC2724F9D85A7C0E81E524F8B0BF25273DD5578EDC20EFC7AB400095CD48E904D2536071181A8E9F39635FF3FEE0986BD078016D2DFF8241B1 - - - F8F693C0EFDEDB244EC09D0FD1E32E2C3DD392C464468ABBAD1D730C80FB2FDAC889719C57911D5EECCAA9E20EA4FBB47452FA24B6AFE31B07E7BBDF70F25466 - - - B31699F50485DDC4E84466064CF5789A3E61BAFBEC53C4B9CB19FFEF07B36722D3EFDCA8722884FD6D6DEDACA65DB4DD6F71CD886BBA599E8A77971955167A60 - - - 7EBA7097109389F48FA9142BF22D225F5D3104D68013D3B8E0A6D4054A8CD0EF64614372BDCB38987D68ADB6D33A3804E98DDF112BA84DBB09D448CE702DACC4 - - - 59A1682A1EFC5DA51128C9F184EC9278075208F29725FD596B18BAEDCD0C54090056009CDDF77E532DDF892BA2B41D9B0FF66F131B69E83CFB8585918FEB0EBE - - - 18519D5F13C5FEF9AE97F388362B3F62798F268D07B37FC5DF3F01741C259B8D91D33E477718D0C9D2D204069D9E9C0B5806E48C392314ED2AA8D71DE6D15A44 - A056FCE66EA9664D1CF22C64D948FE7BFB809253ABAB646EB6C9DFAA5B2894377D2E403A40B5F965C4BFDFA83EAC06F0CC9511CBFA7FA4E8DB3F3F0C59716CCD - AFC41AFD611214C500CACA4D826652E38D5DDD1BCF182D935AFFD2B5B8DF26650DFEB76E4C06C2D46593E1FB86BB4D093438E8E862666E64AB32FB4B6EFEA30D - - - EB7805D2B2321B4C0537C4BC228E2485EF374ED22F37001AAAA4790A983B6DE3642E19DFDF3ADECFC5921BAEA0FFBD092901955D8184AA67969C5B32A912108E - - - 7B0855B530B6AB5271CE774876DEB2CF98FED7BDC2A15989FD80B524C3CAD650EE40EC32DEE5476D08B7981FBF20FF7D860F3084A834D39289E688BA15907230 - - - B5DB61917A9D04FCDD7C7334A86E7F9CF299302CA8DB9BC1DA78452A62433226E59D1EFD8627D72B7A09CB758A4D9A6745D3D7E73F722ED24D288B9B54D652F6 - - - D31295F9998A446F62AE7BA9B7EE39A0F898D9B185047800920B72EE53632EC54A7BDD9E5BE4BB41EFAFE9D4C209DC4227CE6C9CC230301FE762875EFBC3F7C9 - - - E91C5D07ED0532F89A1B84E6DE6BF31F583018F92D360F74357D233D26B601408B6D6EA65FBFC7C913C7BD6878D91AF4C7C01143B61B79AE9E0A2261A62F4996 - - - 508B1F1594A3E377DD9AEBA9EF1EF43DA24F22BE488B4AF9EDB719D02814741B47AD69D22A7E8CAF799D847A5CE20DE8B199586958AECA17C79EFDCA8D257E - - - AC7BBD700CB88EDB3E0FC92D7A0D659F42C97E6E0B5E21DD3EC2EC8537841CAEA50E99AC3414026BFE54D89EA72F6F635F964B429EC8A1E5BF6F44101AC58868 - - - A35004F99DCE4D6D219A7C14CDD2702613C09D69F5ED4C767EC306A3819419C75AF88BD76ACA4E2A774A1B75F539D9B88043033502F656C5FFB3A41778E5D0B6 - - - 37A13B129F3536A53F2A553151A53997DA6DE7CE4D7231EFEEFD26A68C92BE309666F2EE1F527D3B8C38BC6ADDC9FCCBBDD0D134759FD88667976B0CFF842435 - EC2200E5A5A70F5C64744F6413A546F5E4979B3FB1649B02756FF035D36DDE31170EAADC70842230296B60896F04877270C26B40415736299AEF44AC16C5811C - - - 1086A52924ADD2406E0B4EC7219A8783AC20E02A32A7A2461EFBF092F0070501F7CADE9C0588907C403352F1A48F80B950E6D40B2E4E3E9EB886E7DB4E97BDEC - - - ECA19B8A6B04C279B7982B16F1763CA1D49B0081A8D4CA2B7419F057D22A0EC60795EB4D901C5EB25DD4A733248876AA2F522C17A6144A26C8EDE9FB2F84531A - - - 54D1090623497E81270B2AF633268656E8855E1EDCE2217886431039516A391BA9F8D8DB3C21A0B5E51C7F7CB672D63EBE77BE75708B760B06F399486960F261 - - - 34989289CE8ED861499F31742EE1E7B9DC3C59973CE915A7B561D33D98968E77DB5BB94C1692802CCDBD86D04CAA7DB67748EFAFB1402428B2D6AE3056497618 - - - diff --git a/gradle.properties b/gradle.properties index f1e537bd13..2f73f3830b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,6 +2,5 @@ org.gradle.jvmargs=-Xmx2g -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError org.gradle.configureondemand=true org.gradle.parallel=true org.gradle.daemon=true -checksumIgnore=true nexusUsername= nexusPassword= diff --git a/gradle/codeQuality.gradle b/gradle/codeQuality.gradle index fa6050267e..19e99b8dd9 100644 --- a/gradle/codeQuality.gradle +++ b/gradle/codeQuality.gradle @@ -31,6 +31,8 @@ dependencies { tasks.register('downloadCaffeineLocal') { def local = file("${buildDir}/libs/caffeine-local.jar") outputs.upToDateWhen { local.exists() } + outputs.cacheIf { true } + outputs.file local doFirst { def version = '3.0.5' diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 80414c5873..83c525ae01 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -35,13 +35,13 @@ ext { commonsIo: '2.11.0', concurrentlinkedhashmap: '1.4.2', config: '1.4.2', - ehcache3: '3.10.0-alpha1', + ehcache3: '3.10.0', errorprone: '2.11.0', expiringMap: '0.5.10', fastfilter: '1.0.2', fastutil: '8.5.8', flipTables: '1.1.0', - googleJavaFormat: '1.14.0', + googleJavaFormat: '1.15.0', guava: '31.1-jre', jackrabbit: '1.42.0', jamm: '0.3.3', @@ -52,7 +52,7 @@ ext { jmh: '1.34', joor: '0.9.14', jsr330: '1', - nullaway: '0.9.5', + nullaway: '0.9.6', ohc: '0.6.1', osgiComponentAnnotations: '1.5.0', picocli: '4.6.3', @@ -74,7 +74,7 @@ ext { jctools: '3.3.0', junit: '4.13.2', lincheck: '2.14.1', - mockito: '4.3.1', + mockito: '4.4.0', paxExam: '4.13.5', slf4jTest: '2.5.0', testng: '7.5', @@ -101,7 +101,7 @@ ext { shadow: '7.1.2', snyke: '0.4', sonarqube: '3.3', - spotbugs: '4.5.3', + spotbugs: '4.6.0', spotbugsContrib: '7.4.7', spotbugsPlugin: '5.0.6', stats: '0.47.0', diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e4b72699b1..911403da5b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,4 @@ -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle b/settings.gradle index a9db56077a..2662f0efc6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,29 +1,7 @@ -// See https://github.com/vlsi/vlsi-release-plugins -buildscript { - dependencies { - classpath('com.github.vlsi.gradle:checksum-dependency-plugin:1.78') { - // Gradle ships kotlin-stdlib which is good enough - exclude(group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib') - } - classpath 'org.bouncycastle:bcprov-jdk15on:1.69' - classpath 'org.bouncycastle:bcpg-jdk15on:1.69' - } - repositories { - gradlePluginPortal() - } -} - plugins { id 'com.gradle.enterprise' version '3.7.1' } -rootProject.name = 'caffeine' - -include 'caffeine' -include 'guava' -include 'jcache' -include 'simulator' - gradleEnterprise.buildScan { if (System.env.'CI') { tag 'CI' @@ -34,41 +12,13 @@ gradleEnterprise.buildScan { termsOfServiceUrl = 'https://gradle.com/terms-of-service' } -// Note: we need to verify the checksum for checksum-dependency-plugin itself -def expectedSha512 = [ - '5EC9186DAA4F484B8BD4616E897912DD481CEFD34CA3B2B789824A61F46283B04CF98BEC7A16FB11354175651F5584640E249BFF915A61DE4C43008A98937FBD': - 'gradle-enterprise-gradle-plugin-3.7.1.jar', - '9E843A1C24CEDFB3BF26810E524AD669BCFB287F4B673F6DFB488679616936FFC8AB8F5A127BCD932108B8C0A6A5B9F61F701BB45F76F57332D4BCC1550416D2': - 'bcpg-jdk15on-1.69.jar', - '9C9E9DC57E55762AFE1E7C72290FF8016E42AA368C735429A974AB519A6B22859CE371006764326C9672DD37A86F3755DDCFD703C23FCE3631D28779DE172D48': - 'bcprov-jdk15on-1.69.jar', - '17DAAF511BE98F99007D7C6B3762C9F73ADD99EAB1D222985018B0258EFBE12841BBFB8F213A78AA5300F7A3618ACF252F2EEAD196DF3F8115B9F5ED888FE827': - 'okhttp-4.1.0.jar', - '93E7A41BE44CC17FB500EA5CD84D515204C180AEC934491D11FC6A71DAEA761FB0EECEF865D6FD5C3D88AAF55DCE3C2C424BE5BA5D43BEBF48D05F1FA63FA8A7': - 'okio-2.2.2.jar', - 'C297874DB24FADAACD097C4BF3BC2E4A1F684D04EAD286B6FED9919C563AB9BC5BF86B679156D72B700C2BEC429633291DFF680253088151D702CD6B4DD3A4EE': - 'checksum-dependency-plugin-1.78.jar', -] - -def sha512(File file) { - def md = java.security.MessageDigest.getInstance('SHA-512') - file.eachByte(8192) { buffer, length -> - md.update(buffer, 0, length) - } - new BigInteger(1, md.digest()).toString(16).toUpperCase() +dependencyResolutionManagement.repositories { + mavenCentral() } -def violations = - buildscript.configurations.classpath - .resolve() - .sort { it.name } - .collectEntries { [(it): sha512(it)] } - .findAll { !expectedSha512.containsKey(it.value) } - .collect { file, sha512 -> "SHA-512(${file.name}) = $sha512 ($file)" } - .join('\n ') - -if (!violations.isBlank()) { - throw new GradleException("Buildscript classpath has non-whitelisted files:\n $violations") -} +rootProject.name = 'caffeine' -apply plugin: 'com.github.vlsi.checksum-dependency' +include 'caffeine' +include 'guava' +include 'jcache' +include 'simulator'