Hardcode known wrapper checksums to avoid network requests

This commit is contained in:
Marcono1234 2024-01-31 18:45:32 +01:00 committed by daz
parent 2572bdd97b
commit bb2ea9bd17
No known key found for this signature in database
8 changed files with 1208 additions and 11 deletions

View file

@ -0,0 +1,92 @@
/*
* Updates the `wrapper-checksums.json` file
*
* This is intended to be executed by the GitHub workflow, but can also be run
* manually.
*/
// @ts-check
const httpm = require('typed-rest-client/HttpClient')
const path = require('path')
const fs = require('fs')
/**
* @returns {Promise<void>}
*/
async function main() {
const httpc = new httpm.HttpClient(
'gradle/wrapper-validation-action/update-checksums-workflow',
undefined,
{allowRetries: true, maxRetries: 3}
)
/**
* @param {string} url
* @returns {Promise<string>}
*/
async function httpGetText(url) {
const response = await httpc.get(url)
return await response.readBody()
}
/**
* @typedef {Object} ApiVersionEntry
* @property {string} version - version name
* @property {string=} wrapperChecksumUrl - wrapper checksum URL; not present for old versions
* @property {boolean} snapshot - whether this is a snapshot version
*/
/**
* @returns {Promise<ApiVersionEntry[]>}
*/
async function httpGetVersions() {
return JSON.parse(
await httpGetText('https://services.gradle.org/versions/all')
)
}
const versions = (await httpGetVersions())
// Only include versions with checksum
.filter(e => e.wrapperChecksumUrl !== undefined)
// Ignore snapshots; they are changing frequently so no point in including them in checksums file
.filter(e => !e.snapshot)
console.info(`Got ${versions.length} relevant Gradle versions`)
// Note: For simplicity don't sort the entries but keep the order from the API; this also has the
// advantage that the latest versions come first, so compared to appending versions at the end
// this will not cause redundant Git diff due to trailing `,` being forbidden by JSON
/**
* @typedef {Object} FileVersionEntry
* @property {string} version
* @property {string} checksum
*/
/** @type {FileVersionEntry[]} */
const fileVersions = []
for (const entry of versions) {
/** @type {string} */
// @ts-ignore
const checksumUrl = entry.wrapperChecksumUrl
const checksum = await httpGetText(checksumUrl)
fileVersions.push({version: entry.version, checksum})
}
const jsonPath = path.resolve(
__dirname,
'..',
'..',
'src',
'wrapper-checksums.json'
)
console.info(`Writing checksums file to ${jsonPath}`)
// Write pretty-printed JSON (and add trailing line break)
fs.writeFileSync(jsonPath, JSON.stringify(fileVersions, null, 2) + '\n')
}
main().catch(e => {
console.error(e)
// Manually set error exit code, otherwise error is logged but script exits successfully
process.exitCode = 1
})

View file

@ -0,0 +1,49 @@
name: 'Update Wrapper checksums file'
on:
schedule:
# Run weekly (at arbitrary time)
- cron: '24 5 * * 6'
# Support running workflow manually
workflow_dispatch:
jobs:
update-checksums:
name: Update checksums
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20.x
cache: npm
- name: Install dependencies
run: |
npm install typed-rest-client@1.8.11 --no-save
- name: Update checksums file
run: node ./.github/workflows/update-checksums-file.js
# If there are no changes, this action will not create a pull request
- name: Create or update pull request
uses: peter-evans/create-pull-request@v6
with:
branch: wrapper-checksums-update
commit-message: Update known wrapper checksums
title: Update known wrapper checksums
# Note: Unfortunately this action cannot trigger the regular workflows for the PR automatically, see
# https://github.com/peter-evans/create-pull-request/blob/main/docs/concepts-guidelines.md#triggering-further-workflow-runs
# Therefore suggest below to close and then reopen the PR
body: |
Automatically generated pull request to update the known wrapper checksums.
In case of conflicts, manually run the workflow from the [Actions tab](https://github.com/gradle/wrapper-validation-action/actions/workflows/update-checksums-file.yml), the changes will then be force-pushed onto this pull request branch.
Do not manually update the pull request branch; those changes might get overwritten.
> [!IMPORTANT]
> GitHub workflows have not been executed for this pull request yet. Before merging, close and then directly reopen this pull request to trigger the workflows.

View file

@ -6,7 +6,7 @@ jest.setTimeout(30000)
test('fetches wrapper jars checksums', async () => { test('fetches wrapper jars checksums', async () => {
const validChecksums = await checksums.fetchValidChecksums(false) const validChecksums = await checksums.fetchValidChecksums(false)
expect(validChecksums.length).toBeGreaterThan(10) expect(validChecksums.size).toBeGreaterThan(10)
}) })
describe('retry', () => { describe('retry', () => {
@ -25,7 +25,7 @@ describe('retry', () => {
}) })
const validChecksums = await checksums.fetchValidChecksums(false) const validChecksums = await checksums.fetchValidChecksums(false)
expect(validChecksums.length).toBeGreaterThan(10) expect(validChecksums.size).toBeGreaterThan(10)
nock.isDone() nock.isDone()
}) })
}) })

View file

@ -12,6 +12,30 @@ test('succeeds if all found wrapper jars are valid', async () => {
]) ])
expect(result.isValid()).toBe(true) expect(result.isValid()).toBe(true)
// Only hardcoded and explicitly allowed checksums should have been used
expect(result.fetchedChecksums).toBe(false)
expect(result.toDisplayString()).toBe(
'✓ Found known Gradle Wrapper JAR files:\n' +
' e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 __tests__/data/invalid/gradle-wrapper.jar\n' +
' e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 __tests__/data/invalid/gradlе-wrapper.jar\n' + // homoglyph
' 3888c76faa032ea8394b8a54e04ce2227ab1f4be64f65d450f8509fe112d38ce __tests__/data/valid/gradle-wrapper.jar'
)
})
test('succeeds if all found wrapper jars are valid (and checksums are fetched from Gradle API)', async () => {
const knownValidChecksums = new Map<string, Set<string>>()
const result = await validate.findInvalidWrapperJars(
baseDir,
1,
false,
['e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'],
knownValidChecksums
)
expect(result.isValid()).toBe(true)
// Should have fetched checksums because no known checksums were provided
expect(result.fetchedChecksums).toBe(true)
expect(result.toDisplayString()).toBe( expect(result.toDisplayString()).toBe(
'✓ Found known Gradle Wrapper JAR files:\n' + '✓ Found known Gradle Wrapper JAR files:\n' +

View file

@ -1,14 +1,40 @@
import * as httpm from 'typed-rest-client/HttpClient' import * as httpm from 'typed-rest-client/HttpClient'
import fileWrapperChecksums from './wrapper-checksums.json'
const httpc = new httpm.HttpClient( const httpc = new httpm.HttpClient(
'gradle/wrapper-validation-action', 'gradle/wrapper-validation-action',
undefined, undefined,
{allowRetries: true, maxRetries: 3} {allowRetries: true, maxRetries: 3}
) )
function getKnownValidChecksums(): Map<string, Set<string>> {
const versionsMap = new Map<string, Set<string>>()
for (const entry of fileWrapperChecksums) {
const checksum = entry.checksum
let versionNames = versionsMap.get(checksum)
if (versionNames === undefined) {
versionNames = new Set()
versionsMap.set(checksum, versionNames)
}
versionNames.add(entry.version)
}
return versionsMap
}
/**
* Known checksums from previously published Wrapper versions.
*
* Maps from the checksum to the names of the Gradle versions whose wrapper has this checksum.
*/
export const KNOWN_VALID_CHECKSUMS = getKnownValidChecksums()
export async function fetchValidChecksums( export async function fetchValidChecksums(
allowSnapshots: boolean allowSnapshots: boolean
): Promise<string[]> { ): Promise<Set<string>> {
const all = await httpGetJsonArray('https://services.gradle.org/versions/all') const all = await httpGetJsonArray('https://services.gradle.org/versions/all')
const withChecksum = all.filter( const withChecksum = all.filter(
entry => entry =>
@ -27,7 +53,7 @@ export async function fetchValidChecksums(
const checksums = await Promise.all( const checksums = await Promise.all(
checksumUrls.map(async (url: string) => httpGetText(url)) checksumUrls.map(async (url: string) => httpGetText(url))
) )
return [...new Set(checksums)] return new Set(checksums)
} }
async function httpGetJsonArray(url: string): Promise<unknown[]> { async function httpGetJsonArray(url: string): Promise<unknown[]> {

View file

@ -6,7 +6,11 @@ export async function findInvalidWrapperJars(
gitRepoRoot: string, gitRepoRoot: string,
minWrapperCount: number, minWrapperCount: number,
allowSnapshots: boolean, allowSnapshots: boolean,
allowChecksums: string[] allowedChecksums: string[],
knownValidChecksums: Map<
string,
Set<string>
> = checksums.KNOWN_VALID_CHECKSUMS
): Promise<ValidationResult> { ): Promise<ValidationResult> {
const wrapperJars = await find.findWrapperJars(gitRepoRoot) const wrapperJars = await find.findWrapperJars(gitRepoRoot)
const result = new ValidationResult([], []) const result = new ValidationResult([], [])
@ -16,14 +20,28 @@ export async function findInvalidWrapperJars(
) )
} }
if (wrapperJars.length > 0) { if (wrapperJars.length > 0) {
const validChecksums = await checksums.fetchValidChecksums(allowSnapshots) const notYetValidatedWrappers = []
validChecksums.push(...allowChecksums)
for (const wrapperJar of wrapperJars) { for (const wrapperJar of wrapperJars) {
const sha = await hash.sha256File(wrapperJar) const sha = await hash.sha256File(wrapperJar)
if (!validChecksums.includes(sha)) { if (allowedChecksums.includes(sha) || knownValidChecksums.has(sha)) {
result.invalid.push(new WrapperJar(wrapperJar, sha))
} else {
result.valid.push(new WrapperJar(wrapperJar, sha)) result.valid.push(new WrapperJar(wrapperJar, sha))
} else {
notYetValidatedWrappers.push(new WrapperJar(wrapperJar, sha))
}
}
// Otherwise fall back to fetching checksums from Gradle API and compare against them
if (notYetValidatedWrappers.length > 0) {
result.fetchedChecksums = true
const fetchedValidChecksums =
await checksums.fetchValidChecksums(allowSnapshots)
for (const wrapperJar of notYetValidatedWrappers) {
if (!fetchedValidChecksums.has(wrapperJar.checksum)) {
result.invalid.push(wrapperJar)
} else {
result.valid.push(wrapperJar)
}
} }
} }
} }
@ -33,6 +51,7 @@ export async function findInvalidWrapperJars(
export class ValidationResult { export class ValidationResult {
valid: WrapperJar[] valid: WrapperJar[]
invalid: WrapperJar[] invalid: WrapperJar[]
fetchedChecksums = false
errors: string[] = [] errors: string[] = []
constructor(valid: WrapperJar[], invalid: WrapperJar[]) { constructor(valid: WrapperJar[], invalid: WrapperJar[]) {

986
src/wrapper-checksums.json Normal file
View file

@ -0,0 +1,986 @@
[
{
"version": "8.6-rc-4",
"checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd"
},
{
"version": "8.6-rc-3",
"checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd"
},
{
"version": "8.6-rc-2",
"checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd"
},
{
"version": "8.6-rc-1",
"checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd"
},
{
"version": "8.6-milestone-1",
"checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd"
},
{
"version": "8.5",
"checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd"
},
{
"version": "8.5-rc-4",
"checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd"
},
{
"version": "8.5-rc-3",
"checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd"
},
{
"version": "8.5-rc-2",
"checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd"
},
{
"version": "8.5-rc-1",
"checksum": "d3b261c2820e9e3d8d639ed084900f11f4a86050a8f83342ade7b6bc9b0d2bdd"
},
{
"version": "8.4",
"checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15"
},
{
"version": "7.6.3",
"checksum": "14dfa961b6704bb3decdea06502781edaa796a82e6da41cd2e1962b14fbe21a3"
},
{
"version": "8.4-rc-3",
"checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15"
},
{
"version": "8.4-rc-2",
"checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15"
},
{
"version": "8.4-rc-1",
"checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15"
},
{
"version": "8.3",
"checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15"
},
{
"version": "8.3-rc-4",
"checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15"
},
{
"version": "8.3-rc-3",
"checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15"
},
{
"version": "8.3-rc-2",
"checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15"
},
{
"version": "8.3-rc-1",
"checksum": "0336f591bc0ec9aa0c9988929b93ecc916b3c1d52aed202c7381db144aa0ef15"
},
{
"version": "8.2.1",
"checksum": "a8451eeda314d0568b5340498b36edf147a8f0d692c5ff58082d477abe9146e4"
},
{
"version": "8.2",
"checksum": "a8451eeda314d0568b5340498b36edf147a8f0d692c5ff58082d477abe9146e4"
},
{
"version": "7.6.2",
"checksum": "14dfa961b6704bb3decdea06502781edaa796a82e6da41cd2e1962b14fbe21a3"
},
{
"version": "8.2-rc-3",
"checksum": "a8451eeda314d0568b5340498b36edf147a8f0d692c5ff58082d477abe9146e4"
},
{
"version": "8.2-rc-2",
"checksum": "5c9a1a6f50b4f8c0264b1ac69013bef9f8363733275fafa56c70c84be3276bb8"
},
{
"version": "8.2-rc-1",
"checksum": "55e949185c26ba3ddcd2c6a4217d043bfa0ce3cc002bbbb52b709a181a513e81"
},
{
"version": "8.2-milestone-1",
"checksum": "55e949185c26ba3ddcd2c6a4217d043bfa0ce3cc002bbbb52b709a181a513e81"
},
{
"version": "8.1.1",
"checksum": "ed2c26eba7cfb93cc2b7785d05e534f07b5b48b5e7fc941921cd098628abca58"
},
{
"version": "8.1",
"checksum": "ed2c26eba7cfb93cc2b7785d05e534f07b5b48b5e7fc941921cd098628abca58"
},
{
"version": "8.1-rc-4",
"checksum": "ed2c26eba7cfb93cc2b7785d05e534f07b5b48b5e7fc941921cd098628abca58"
},
{
"version": "8.1-rc-3",
"checksum": "ed2c26eba7cfb93cc2b7785d05e534f07b5b48b5e7fc941921cd098628abca58"
},
{
"version": "8.1-rc-2",
"checksum": "ed2c26eba7cfb93cc2b7785d05e534f07b5b48b5e7fc941921cd098628abca58"
},
{
"version": "8.1-rc-1",
"checksum": "ed2c26eba7cfb93cc2b7785d05e534f07b5b48b5e7fc941921cd098628abca58"
},
{
"version": "8.0.2",
"checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5"
},
{
"version": "7.6.1",
"checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a"
},
{
"version": "6.9.4",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "8.0.1",
"checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5"
},
{
"version": "8.0",
"checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5"
},
{
"version": "8.0-rc-5",
"checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5"
},
{
"version": "8.0-rc-4",
"checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5"
},
{
"version": "8.0-rc-3",
"checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5"
},
{
"version": "8.0-rc-2",
"checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5"
},
{
"version": "8.0-rc-1",
"checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5"
},
{
"version": "8.0-milestone-6",
"checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5"
},
{
"version": "8.0-milestone-5",
"checksum": "91941f522fbfd4431cf57e445fc3d5200c85f957bda2de5251353cf11174f4b5"
},
{
"version": "8.0-milestone-4",
"checksum": "577b2de036000db2e0f04f2ec842a4f1e648c8b6f9c87f29a8d896acb1732538"
},
{
"version": "7.6",
"checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a"
},
{
"version": "7.6-rc-4",
"checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a"
},
{
"version": "7.6-rc-3",
"checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a"
},
{
"version": "7.6-rc-2",
"checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a"
},
{
"version": "8.0-milestone-3",
"checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a"
},
{
"version": "7.6-rc-1",
"checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a"
},
{
"version": "6.9.3",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "8.0-milestone-2",
"checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a"
},
{
"version": "8.0-milestone-1",
"checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a"
},
{
"version": "7.6-milestone-1",
"checksum": "c5a643cf80162e665cc228f7b16f343fef868e47d3a4836f62e18b7e17ac018a"
},
{
"version": "7.5.1",
"checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60"
},
{
"version": "7.5",
"checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60"
},
{
"version": "7.5-rc-5",
"checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60"
},
{
"version": "7.5-rc-4",
"checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60"
},
{
"version": "7.5-rc-3",
"checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60"
},
{
"version": "7.5-rc-2",
"checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60"
},
{
"version": "7.5-rc-1",
"checksum": "91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60"
},
{
"version": "7.4.2",
"checksum": "575098db54a998ff1c6770b352c3b16766c09848bee7555dab09afc34e8cf590"
},
{
"version": "7.4.1",
"checksum": "575098db54a998ff1c6770b352c3b16766c09848bee7555dab09afc34e8cf590"
},
{
"version": "7.4",
"checksum": "575098db54a998ff1c6770b352c3b16766c09848bee7555dab09afc34e8cf590"
},
{
"version": "7.4-rc-2",
"checksum": "575098db54a998ff1c6770b352c3b16766c09848bee7555dab09afc34e8cf590"
},
{
"version": "7.4-rc-1",
"checksum": "575098db54a998ff1c6770b352c3b16766c09848bee7555dab09afc34e8cf590"
},
{
"version": "7.3.3",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.3.3-rc-1",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "6.9.2",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "7.3.2",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.3.1",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.3",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.3-rc-5",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.3-rc-4",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.3-rc-3",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.3-rc-2",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.3-rc-1",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "6.9.1",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "7.2",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.2-rc-3",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.2-rc-2",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.2-rc-1",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.1.1",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.1",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.1-rc-2",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.1-rc-1",
"checksum": "33ad4583fd7ee156f533778736fa1b4940bd83b433934d1cc4e9f608e99a6a89"
},
{
"version": "7.0.2",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "7.0.1",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.9",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.9-rc-2",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.9-rc-1",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "7.0",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "7.0-rc-2",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "7.0-rc-1",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "7.0-milestone-3",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "7.0-milestone-2",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.8.3",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.8.2",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "7.0-milestone-1",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.8.1",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.8",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.8-rc-5",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.8-rc-4",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.8-rc-3",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.8-rc-1",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.7.1",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.8-milestone-3",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.8-milestone-2",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.7",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.8-milestone-1",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.7-rc-5",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.7-rc-4",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.7-rc-3",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.7-rc-2",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.7-rc-1",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.6.1",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.6",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.6-rc-6",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.6-rc-5",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.6-rc-4",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.6-rc-3",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.6-rc-2",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.6-rc-1",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.6-milestone-3",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.5.1",
"checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857"
},
{
"version": "6.6-milestone-2",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.6-milestone-1",
"checksum": "e996d452d2645e70c01c11143ca2d3742734a28da2bf61f25c82bdc288c9e637"
},
{
"version": "6.5",
"checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857"
},
{
"version": "6.5-rc-1",
"checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857"
},
{
"version": "6.4.1",
"checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857"
},
{
"version": "6.5-milestone-2",
"checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857"
},
{
"version": "6.5-milestone-1",
"checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857"
},
{
"version": "6.4",
"checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857"
},
{
"version": "6.4-rc-4",
"checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857"
},
{
"version": "6.4-rc-3",
"checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857"
},
{
"version": "6.4-rc-2",
"checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857"
},
{
"version": "6.4-rc-1",
"checksum": "70239e6ca1f0d5e3b2808ef6d82390cf9ad58d3a3a0d271677a51d1b89475857"
},
{
"version": "6.3",
"checksum": "1cef53de8dc192036e7b0cc47584449b0cf570a00d560bfaa6c9eabe06e1fc06"
},
{
"version": "6.3-rc-4",
"checksum": "1cef53de8dc192036e7b0cc47584449b0cf570a00d560bfaa6c9eabe06e1fc06"
},
{
"version": "6.3-rc-3",
"checksum": "1cef53de8dc192036e7b0cc47584449b0cf570a00d560bfaa6c9eabe06e1fc06"
},
{
"version": "6.3-rc-2",
"checksum": "1cef53de8dc192036e7b0cc47584449b0cf570a00d560bfaa6c9eabe06e1fc06"
},
{
"version": "6.3-rc-1",
"checksum": "1cef53de8dc192036e7b0cc47584449b0cf570a00d560bfaa6c9eabe06e1fc06"
},
{
"version": "6.2.2",
"checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6"
},
{
"version": "6.2.1",
"checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6"
},
{
"version": "6.2",
"checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6"
},
{
"version": "6.2-rc-3",
"checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6"
},
{
"version": "6.2-rc-2",
"checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6"
},
{
"version": "6.2-rc-1",
"checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6"
},
{
"version": "6.1.1",
"checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6"
},
{
"version": "6.1",
"checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6"
},
{
"version": "6.1-rc-3",
"checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6"
},
{
"version": "6.1-rc-2",
"checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6"
},
{
"version": "6.1-rc-1",
"checksum": "96f793a18e056c23ffeec67c1f3bb8eccff5a4a407fc9ceac183527e7eedf4b6"
},
{
"version": "6.1-milestone-3",
"checksum": "3888c76faa032ea8394b8a54e04ce2227ab1f4be64f65d450f8509fe112d38ce"
},
{
"version": "6.1-milestone-2",
"checksum": "3888c76faa032ea8394b8a54e04ce2227ab1f4be64f65d450f8509fe112d38ce"
},
{
"version": "6.1-milestone-1",
"checksum": "3888c76faa032ea8394b8a54e04ce2227ab1f4be64f65d450f8509fe112d38ce"
},
{
"version": "6.0.1",
"checksum": "28b330c20a9a73881dfe9702df78d4d78bf72368e8906c70080ab6932462fe9e"
},
{
"version": "6.0",
"checksum": "28b330c20a9a73881dfe9702df78d4d78bf72368e8906c70080ab6932462fe9e"
},
{
"version": "6.0-rc-3",
"checksum": "28b330c20a9a73881dfe9702df78d4d78bf72368e8906c70080ab6932462fe9e"
},
{
"version": "5.6.4",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "6.0-rc-2",
"checksum": "28b330c20a9a73881dfe9702df78d4d78bf72368e8906c70080ab6932462fe9e"
},
{
"version": "6.0-rc-1",
"checksum": "28b330c20a9a73881dfe9702df78d4d78bf72368e8906c70080ab6932462fe9e"
},
{
"version": "5.6.3",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.6.2",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.6.1",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.6",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.6-rc-2",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.6-rc-1",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.5.1",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.5",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.5-rc-4",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.5-rc-3",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.5-rc-2",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.5-rc-1",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.4.1",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.4",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.4-rc-1",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.3.1",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.3",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.3-rc-3",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.3-rc-2",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.3-rc-1",
"checksum": "3dc39ad650d40f6c029bd8ff605c6d95865d657dbfdeacdb079db0ddfffedf9f"
},
{
"version": "5.2.1",
"checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae"
},
{
"version": "5.2",
"checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae"
},
{
"version": "5.2-rc-1",
"checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae"
},
{
"version": "5.1.1",
"checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae"
},
{
"version": "5.1",
"checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae"
},
{
"version": "5.1-rc-3",
"checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae"
},
{
"version": "5.1-rc-2",
"checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae"
},
{
"version": "5.1-rc-1",
"checksum": "76b12da7f4a7cdd025e5996811a2e49bf5df0fb62d72554ab555c0e434b63aae"
},
{
"version": "4.10.3",
"checksum": "660ab018b8e319e9ae779fdb1b7ac47d0321bde953bf0eb4545f14952cfdcaa3"
},
{
"version": "5.1-milestone-1",
"checksum": "8ff6bee43c55efc0cce9e1147860a76fc970398fbef587e64b6e7a5a7e0291df"
},
{
"version": "5.0",
"checksum": "f1a597a1f2b23089deec11d5b924d074f9e4ed810f2093be7021ded01c8073ad"
},
{
"version": "4.10.2",
"checksum": "ad63ba21fb91e490e0f6fd0ca7d4049241f0f68a454b0b3075c041c4554e611c"
},
{
"version": "4.10.1",
"checksum": "d8a69ca8efe271d8de080c42a2ea4b08fc9e85c41aa2d163255c70d9da239db0"
},
{
"version": "4.10",
"checksum": "778e7f46bd67eaea2de5bcbdbb40878c6614656014ba59a72ce8648eaf43a925"
},
{
"version": "4.9",
"checksum": "e55e7e47a79e04c26363805b31e2f40b7a9cc89ea12113be7de750a3b2cede85"
},
{
"version": "4.8.1",
"checksum": "080e30657661539701b66827b96eb0043191e0a7a73090e8a57bd6735e5af5c5"
},
{
"version": "4.8",
"checksum": "4160d5a6d8d6efc6af336582bbbba8194e4d7a742835f7b0fd3964cbd419c994"
},
{
"version": "4.7",
"checksum": "7d6fe0a055f133226409de2457fb0e887d1f6b096f36c8d5fd76fb7a9357cd45"
},
{
"version": "4.6",
"checksum": "381dff8aa434499aa93bc25572b049c8c586a67faff2c02f375e4f23e17e49de"
},
{
"version": "4.5.1",
"checksum": "3bf04e39ed259ff0a1217a875199a11775855d2a29207b98318ac79178249de8"
},
{
"version": "4.5",
"checksum": "d283a04caee0e97b666b09e50ab394834934bee6225c2e9cd4650afdeac43828"
},
{
"version": "4.4.1",
"checksum": "4e318d74d06aa7b998091345c397a3c7c4b291b59da31e6f9c772a596711acac"
},
{
"version": "4.4",
"checksum": "88b5b31f390a268ab3773df580d83fd1e388f49c2b685f78a16600577bd72fe2"
},
{
"version": "4.3.1",
"checksum": "383f4efa709b52632a520708e8a07353961970941ab3867ab8ac182132ce1c54"
},
{
"version": "4.3",
"checksum": "ba496e7e0e03ffa432eaf715bb1466fac2ffc8491a71e7164a5438c48c79d8ea"
},
{
"version": "4.2.1",
"checksum": "c536e519e65a4bb787e071c6a90d23bd219c9d409a2123db649d3684acbf3ae7"
},
{
"version": "4.2",
"checksum": "53aa048fef3c06a8442c6a44df5edd2e8c791ee883e42ded6189c7eed112095d"
},
{
"version": "4.1",
"checksum": "f4d953f31fbf6c38a8c330d19171c8ba6e0d1ff59d4d5c5c2d3ed821c9f3d5a3"
},
{
"version": "3.2.1",
"checksum": "020ef0245a07b33ca48b12f59415e7e5083cf701ef02690464a8cc2ab3984608"
},
{
"version": "3.2",
"checksum": "d2d3abae74e89cc4200f48d4a08a7e5960363c33ee62272ef5ffbb39f4c7f83e"
},
{
"version": "3.1",
"checksum": "0f49043be582d7a39b671f924c66bd9337b92fa88ff5951225acc60560053067"
},
{
"version": "3.0",
"checksum": "42d7a2f636983aa09d21dfeb6e90d21d7a8dad905351390643ce60cc82c8f8a9"
},
{
"version": "2.14.1",
"checksum": "8e47da0b2656354d059609cae9d44b196d4f9b14512e688ffee4e0eb7e723ae9"
},
{
"version": "2.14",
"checksum": "b5ca811c057b3eb4164c78f4155d667c6092ff98ba91a4c90d29e127426f37a7"
},
{
"version": "2.13",
"checksum": "0c3c576e28b44eddcab6b8b4854f484363dfbcd047657d41654e839835da2c53"
},
{
"version": "2.12",
"checksum": "4894520b03c007bf38e983bf933320c483a9790010d997029fa8985dc6128559"
},
{
"version": "2.11",
"checksum": "0bc7b16a0a3fa52af674de44d1fea48abc4dee3431f3d4829cd9ea329836e596"
},
{
"version": "2.10",
"checksum": "16caeaf66d57a0d1d2087fef6a97efa62de8da69afa5b908f40db35afc4342da"
},
{
"version": "2.9",
"checksum": "b92386e36a96da6be89e91f71087d1394a26c0450231ba0b22e28ee1ee8fa14b"
},
{
"version": "2.8",
"checksum": "198159fcd7d29533c0d37423d66c44729982d5280c9e2c7c5f4b7bc6a9317f6b"
},
{
"version": "2.7",
"checksum": "d7e1975ccf2dc079d4f0b1010febdad466506d1565c5aa8017c88ebc5e471604"
},
{
"version": "2.6",
"checksum": "695089a2b306f55f0bd63140fbcc5ead8c383819018188ce484cd5a055bec6e4"
},
{
"version": "2.5",
"checksum": "718d7b25ea60b357fc4cb2212ce10b3f03dfd0e6fe5f23f565b15553ec46bb7e"
},
{
"version": "2.4",
"checksum": "98420079ffe3e24b1013180d9b9bc2e2ee6a9d867ee232004b75a961d9c18e27"
},
{
"version": "2.3",
"checksum": "b18a1114ebe81fb7502d40ad9a4f86cef82fff244a865ad45533b4d5e7ff0cc8"
},
{
"version": "2.2.1",
"checksum": "5f73d431fd1c5dcc2cf11555b8e486c43249c1099f678ccc6088b05be600a2e1"
},
{
"version": "2.2",
"checksum": "fa9b4294d47cf8db7039cb9b2435de3dd1accb0d3d67926705775a0579dfa397"
},
{
"version": "2.1",
"checksum": "5e27c39c2336c25748f279d8b105162d14b1a39eb7839d0b658432282d0ce79f"
},
{
"version": "2.0",
"checksum": "80a33ca14e3bca3116bc8749550397f739f126190c82bb6399fdc8d10f49661f"
},
{
"version": "1.12",
"checksum": "dea5ceba47b58df0b7f69a65b24357527c1927ccc72b6d4ed90658d39e461b29"
},
{
"version": "1.11",
"checksum": "a14b54dd3790f5ce1dc08ebbf4b5bcc05f76c4554b43accb84696c970f29aba0"
},
{
"version": "1.10",
"checksum": "6a6c15e222a0458aa33985b87f67954f4222410b43b1e26866197d0a77d93cbc"
},
{
"version": "1.9",
"checksum": "134337ea7c13221f9d1a1c14288a5cf8af9f6060167b903b724b115cf5a0cf73"
},
{
"version": "1.8",
"checksum": "13f23a24252ddca0a0fabef212e3c854f5895b081c09d015c91587a5df9bf9f7"
},
{
"version": "1.7",
"checksum": "7af529cc3331d38b3d8f8344ddd9b2d3744542b55b68318abd8bb1a6f3812a1c"
},
{
"version": "1.6",
"checksum": "66dbcc9f0bc33789ea0bdb4d49c8ea037047bda5647ef696c47bdca65f785159"
},
{
"version": "1.5",
"checksum": "9598ffdf7ee26949d8b861ece267c70c802f21f7fc52596693834792d155195a"
},
{
"version": "1.4",
"checksum": "c95985b7b5684e133c5d45044fd90faaf6c8f7cd2493d61a11c2b8c5b71ef514"
},
{
"version": "1.3",
"checksum": "95513eccca99e1ae1aeadc4f69cabd0e7fb64821d3f26c46a489df844c8a7353"
},
{
"version": "1.2",
"checksum": "5c91fa893665f3051eae14578fac2df14e737423387e75ffbeccd35f335a3d8b"
},
{
"version": "1.1",
"checksum": "22c56a9780daeee00e5bf31621f991b68e73eff6fe8afca628a1fe2c50c6038e"
},
{
"version": "1.0",
"checksum": "87e50531ca7aab675f5bb65755ef78328afd64cf0877e37ad876047a8a014055"
}
]

View file

@ -6,7 +6,8 @@
"rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
"strict": true, /* Enable all strict type-checking options. */ "strict": true, /* Enable all strict type-checking options. */
"noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
"resolveJsonModule": true, /* Enable importing JSON files as module; used for importing wrapper checksums JSON */
}, },
"exclude": ["node_modules", "**/*.test.ts"] "exclude": ["node_modules", "**/*.test.ts"]
} }