From 998f750432a91e1e1832d507e66aab77d02449f9 Mon Sep 17 00:00:00 2001 From: Teppei Fukuda Date: Fri, 3 May 2024 15:14:34 +0400 Subject: [PATCH] feat: introduce package UIDs for improved vulnerability mapping (#6583) Signed-off-by: knqyf263 --- Dockerfile.protoc | 4 +- integration/client_server_test.go | 17 +- integration/integration_test.go | 37 +- integration/registry_test.go | 4 +- integration/repo_test.go | 6 +- integration/sbom_test.go | 134 ++-- integration/testdata/almalinux-8.json.golden | 3 +- integration/testdata/alpine-310.json.golden | 12 +- .../alpine-39-high-critical.json.golden | 6 +- .../alpine-39-ignore-cveids.json.golden | 6 +- integration/testdata/alpine-39.json.golden | 18 +- .../testdata/alpine-distroless.json.golden | 3 +- integration/testdata/amazon-1.json.golden | 3 +- integration/testdata/amazon-2.json.golden | 6 +- .../busybox-with-lockfile.json.golden | 6 +- integration/testdata/centos-6.json.golden | 6 +- .../centos-7-ignore-unfixed.json.golden | 6 +- .../testdata/centos-7-medium.json.golden | 3 +- integration/testdata/centos-7.json.golden | 9 +- integration/testdata/cocoapods.json.golden | 6 +- .../testdata/composer.lock.json.golden | 9 +- integration/testdata/conan.json.golden | 24 +- .../debian-buster-ignore-unfixed.json.golden | 3 +- .../testdata/debian-buster.json.golden | 6 +- .../testdata/debian-stretch.json.golden | 15 +- .../testdata/distroless-base.json.golden | 12 +- .../testdata/distroless-python27.json.golden | 12 +- integration/testdata/dotnet.json.golden | 6 +- integration/testdata/fluentd-gems.json.golden | 6 +- .../fluentd-multiple-lockfiles.json.golden | 3 + integration/testdata/gomod-skip.json.golden | 12 +- integration/testdata/gomod.json.golden | 15 +- integration/testdata/gradle.json.golden | 6 +- integration/testdata/mariner-1.0.json.golden | 6 +- .../testdata/minikube-kbom.json.golden | 1 + integration/testdata/mix.lock.json.golden | 33 +- integration/testdata/npm-with-dev.json.golden | 42 +- integration/testdata/npm.json.golden | 39 +- integration/testdata/nuget.json.golden | 9 +- .../testdata/opensuse-leap-151.json.golden | 6 +- .../testdata/oraclelinux-8.json.golden | 6 +- .../testdata/packagesprops.json.golden | 6 +- integration/testdata/photon-30.json.golden | 9 +- integration/testdata/pip.json.golden | 27 +- integration/testdata/pipenv.json.golden | 9 +- integration/testdata/pnpm.json.golden | 6 +- integration/testdata/poetry.json.golden | 12 +- integration/testdata/pom.json.golden | 6 +- integration/testdata/pubspec.lock.json.golden | 9 +- integration/testdata/rockylinux-8.json.golden | 3 +- .../testdata/spring4shell-jre11.json.golden | 3 +- .../testdata/spring4shell-jre8.json.golden | 3 +- integration/testdata/swift.json.golden | 9 +- integration/testdata/test-repo.json.golden | 6 +- integration/testdata/ubi-7.json.golden | 3 +- .../ubuntu-1804-ignore-unfixed.json.golden | 12 +- integration/testdata/ubuntu-1804.json.golden | 15 +- integration/testdata/yarn.json.golden | 6 +- integration/vm_test.go | 4 +- pkg/fanal/applier/applier_test.go | 22 + pkg/fanal/applier/docker.go | 48 +- pkg/fanal/applier/docker_test.go | 120 ++++ pkg/fanal/artifact/vm/vm_test.go | 2 +- .../goldens/packages/alpine-310.json.golden | 42 +- .../goldens/packages/vulnimage.json.golden | 174 +++-- .../vuln-image1.2.3.expectedlibs.golden | 630 +++++++++++------ pkg/fanal/types/artifact.go | 3 +- pkg/rpc/convert.go | 4 +- pkg/rpc/convert_test.go | 12 + rpc/common/service.pb.go | 633 +++++++++--------- rpc/common/service.proto | 1 + 71 files changed, 1531 insertions(+), 874 deletions(-) diff --git a/Dockerfile.protoc b/Dockerfile.protoc index 9b21ed16a55d..f87c333562b9 100644 --- a/Dockerfile.protoc +++ b/Dockerfile.protoc @@ -14,7 +14,7 @@ RUN curl --retry 5 -OL https://github.com/protocolbuffers/protobuf/releases/down # Install Go tools RUN go install github.com/twitchtv/twirp/protoc-gen-twirp@v8.1.0 -RUN go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.27.1 -RUN go install github.com/magefile/mage@v1.14.0 +RUN go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.0 +RUN go install github.com/magefile/mage@v1.15.0 ENV TRIVY_PROTOC_CONTAINER=true diff --git a/integration/client_server_test.go b/integration/client_server_test.go index f217021658ae..f6b25c6cc3ef 100644 --- a/integration/client_server_test.go +++ b/integration/client_server_test.go @@ -283,7 +283,9 @@ func TestClientServer(t *testing.T) { osArgs = append(osArgs, "--secret-config", tt.args.secretConfig) } - runTest(t, osArgs, tt.golden, "", types.FormatJSON, runOptions{}) + runTest(t, osArgs, tt.golden, "", types.FormatJSON, runOptions{ + override: overrideUID, + }) }) } } @@ -397,7 +399,9 @@ func TestClientServerWithFormat(t *testing.T) { t.Setenv("AWS_ACCOUNT_ID", "123456789012") osArgs := setupClient(t, tt.args, addr, cacheDir, tt.golden) - runTest(t, osArgs, tt.golden, "", tt.args.Format, runOptions{}) + runTest(t, osArgs, tt.golden, "", tt.args.Format, runOptions{ + override: overrideUID, + }) }) } } @@ -475,7 +479,10 @@ func TestClientServerWithToken(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { osArgs := setupClient(t, tt.args, addr, cacheDir, tt.golden) - runTest(t, osArgs, tt.golden, "", types.FormatJSON, runOptions{wantErr: tt.wantErr}) + runTest(t, osArgs, tt.golden, "", types.FormatJSON, runOptions{ + override: overrideUID, + wantErr: tt.wantErr, + }) }) } } @@ -501,7 +508,9 @@ func TestClientServerWithRedis(t *testing.T) { osArgs := setupClient(t, testArgs, addr, cacheDir, golden) // Run Trivy client - runTest(t, osArgs, golden, "", types.FormatJSON, runOptions{}) + runTest(t, osArgs, golden, "", types.FormatJSON, runOptions{ + override: overrideUID, + }) }) // Terminate the Redis container diff --git a/integration/integration_test.go b/integration/integration_test.go index 43fe3ac8c820..80f0d96119fb 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -192,9 +192,10 @@ func readSpdxJson(t *testing.T, filePath string) *spdx.Document { return bom } +type OverrideFunc func(t *testing.T, want, got *types.Report) type runOptions struct { wantErr string - override func(want, got *types.Report) + override OverrideFunc fakeUUID string } @@ -262,11 +263,11 @@ func compareRawFiles(t *testing.T, wantFile, gotFile string) { assert.EqualValues(t, string(want), string(got)) } -func compareReports(t *testing.T, wantFile, gotFile string, override func(want, got *types.Report)) { +func compareReports(t *testing.T, wantFile, gotFile string, override func(t *testing.T, want, got *types.Report)) { want := readReport(t, wantFile) got := readReport(t, gotFile) if override != nil { - override(&want, &got) + override(t, &want, &got) } assert.Equal(t, want, got) } @@ -307,3 +308,33 @@ func validateReport(t *testing.T, schema string, report any) { assert.True(t, valid, strings.Join(errs, "\n")) } } + +func overrideFuncs(funcs ...OverrideFunc) OverrideFunc { + return func(t *testing.T, want, got *types.Report) { + for _, f := range funcs { + if f == nil { + continue + } + f(t, want, got) + } + } +} + +// overrideUID only checks for the presence of the package UID and clears the UID; +// the UID is calculated from the package metadata, but the UID does not match +// as it varies slightly depending on the mode of scanning, e.g. the digest of the layer. +func overrideUID(t *testing.T, want, got *types.Report) { + for i, result := range got.Results { + for j, vuln := range result.Vulnerabilities { + assert.NotEmptyf(t, vuln.PkgIdentifier.UID, "UID is empty: %s", vuln.VulnerabilityID) + // Do not compare UID as the package metadata is slightly different between the tests, + // causing different UIDs. + got.Results[i].Vulnerabilities[j].PkgIdentifier.UID = "" + } + } + for i, result := range want.Results { + for j := range result.Vulnerabilities { + want.Results[i].Vulnerabilities[j].PkgIdentifier.UID = "" + } + } +} diff --git a/integration/registry_test.go b/integration/registry_test.go index b62865667dc3..9a2570062e56 100644 --- a/integration/registry_test.go +++ b/integration/registry_test.go @@ -202,12 +202,12 @@ func TestRegistry(t *testing.T) { // Run Trivy runTest(t, osArgs, tc.golden, "", types.FormatJSON, runOptions{ wantErr: tc.wantErr, - override: func(_, got *types.Report) { + override: overrideFuncs(overrideUID, func(t *testing.T, _, got *types.Report) { got.ArtifactName = tc.imageName for i := range got.Results { got.Results[i].Target = fmt.Sprintf("%s (alpine 3.10.2)", tc.imageName) } - }, + }), }) }) } diff --git a/integration/repo_test.go b/integration/repo_test.go index 8d787104e63f..3aa2baff521e 100644 --- a/integration/repo_test.go +++ b/integration/repo_test.go @@ -37,7 +37,7 @@ func TestRepository(t *testing.T) { name string args args golden string - override func(want, got *types.Report) + override func(t *testing.T, want, got *types.Report) }{ { name: "gomod", @@ -378,7 +378,7 @@ func TestRepository(t *testing.T) { skipFiles: []string{"testdata/fixtures/repo/gomod/submod2/go.mod"}, }, golden: "testdata/gomod-skip.json.golden", - override: func(want, _ *types.Report) { + override: func(_ *testing.T, want, _ *types.Report) { want.ArtifactType = ftypes.ArtifactFilesystem }, }, @@ -392,7 +392,7 @@ func TestRepository(t *testing.T) { input: "testdata/fixtures/repo/custom-policy", }, golden: "testdata/dockerfile-custom-policies.json.golden", - override: func(want, got *types.Report) { + override: func(_ *testing.T, want, got *types.Report) { want.ArtifactType = ftypes.ArtifactFilesystem }, }, diff --git a/integration/sbom_test.go b/integration/sbom_test.go index 65c99f9e9600..428efe5cfec3 100644 --- a/integration/sbom_test.go +++ b/integration/sbom_test.go @@ -6,11 +6,11 @@ import ( "path/filepath" "testing" - ftypes "github.com/aquasecurity/trivy/pkg/fanal/types" v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + ftypes "github.com/aquasecurity/trivy/pkg/fanal/types" "github.com/aquasecurity/trivy/pkg/types" ) @@ -25,7 +25,7 @@ func TestSBOM(t *testing.T) { name string args args golden string - override types.Report + override OverrideFunc }{ { name: "centos7 cyclonedx", @@ -35,31 +35,17 @@ func TestSBOM(t *testing.T) { artifactType: "cyclonedx", }, golden: "testdata/centos-7.json.golden", - override: types.Report{ - ArtifactName: "testdata/fixtures/sbom/centos-7-cyclonedx.json", - ArtifactType: ftypes.ArtifactType("cyclonedx"), - Results: types.Results{ - { - Target: "testdata/fixtures/sbom/centos-7-cyclonedx.json (centos 7.6.1810)", - Vulnerabilities: []types.DetectedVulnerability{ - { - PkgIdentifier: ftypes.PkgIdentifier{ - BOMRef: "pkg:rpm/centos/bash@4.2.46-31.el7?arch=x86_64&distro=centos-7.6.1810", - }, - }, - { - PkgIdentifier: ftypes.PkgIdentifier{ - BOMRef: "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64&epoch=1&distro=centos-7.6.1810", - }, - }, - { - PkgIdentifier: ftypes.PkgIdentifier{ - BOMRef: "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64&epoch=1&distro=centos-7.6.1810", - }, - }, - }, - }, - }, + override: func(t *testing.T, want, got *types.Report) { + want.ArtifactName = "testdata/fixtures/sbom/centos-7-cyclonedx.json" + want.ArtifactType = ftypes.ArtifactCycloneDX + + require.Len(t, got.Results, 1) + want.Results[0].Target = "testdata/fixtures/sbom/centos-7-cyclonedx.json (centos 7.6.1810)" + + require.Len(t, got.Results[0].Vulnerabilities, 3) + want.Results[0].Vulnerabilities[0].PkgIdentifier.BOMRef = "pkg:rpm/centos/bash@4.2.46-31.el7?arch=x86_64&distro=centos-7.6.1810" + want.Results[0].Vulnerabilities[1].PkgIdentifier.BOMRef = "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64&epoch=1&distro=centos-7.6.1810" + want.Results[0].Vulnerabilities[2].PkgIdentifier.BOMRef = "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64&epoch=1&distro=centos-7.6.1810" }, }, { @@ -88,31 +74,17 @@ func TestSBOM(t *testing.T) { artifactType: "cyclonedx", }, golden: "testdata/centos-7.json.golden", - override: types.Report{ - ArtifactName: "testdata/fixtures/sbom/centos-7-cyclonedx.intoto.jsonl", - ArtifactType: ftypes.ArtifactType("cyclonedx"), - Results: types.Results{ - { - Target: "testdata/fixtures/sbom/centos-7-cyclonedx.intoto.jsonl (centos 7.6.1810)", - Vulnerabilities: []types.DetectedVulnerability{ - { - PkgIdentifier: ftypes.PkgIdentifier{ - BOMRef: "pkg:rpm/centos/bash@4.2.46-31.el7?arch=x86_64&distro=centos-7.6.1810", - }, - }, - { - PkgIdentifier: ftypes.PkgIdentifier{ - BOMRef: "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64&epoch=1&distro=centos-7.6.1810", - }, - }, - { - PkgIdentifier: ftypes.PkgIdentifier{ - BOMRef: "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64&epoch=1&distro=centos-7.6.1810", - }, - }, - }, - }, - }, + override: func(t *testing.T, want, got *types.Report) { + want.ArtifactName = "testdata/fixtures/sbom/centos-7-cyclonedx.intoto.jsonl" + want.ArtifactType = ftypes.ArtifactCycloneDX + + require.Len(t, got.Results, 1) + want.Results[0].Target = "testdata/fixtures/sbom/centos-7-cyclonedx.intoto.jsonl (centos 7.6.1810)" + + require.Len(t, got.Results[0].Vulnerabilities, 3) + want.Results[0].Vulnerabilities[0].PkgIdentifier.BOMRef = "pkg:rpm/centos/bash@4.2.46-31.el7?arch=x86_64&distro=centos-7.6.1810" + want.Results[0].Vulnerabilities[1].PkgIdentifier.BOMRef = "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64&epoch=1&distro=centos-7.6.1810" + want.Results[0].Vulnerabilities[2].PkgIdentifier.BOMRef = "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64&epoch=1&distro=centos-7.6.1810" }, }, { @@ -123,14 +95,12 @@ func TestSBOM(t *testing.T) { artifactType: "spdx", }, golden: "testdata/centos-7.json.golden", - override: types.Report{ - ArtifactName: "testdata/fixtures/sbom/centos-7-spdx.txt", - ArtifactType: ftypes.ArtifactType("spdx"), - Results: types.Results{ - { - Target: "testdata/fixtures/sbom/centos-7-spdx.txt (centos 7.6.1810)", - }, - }, + override: func(t *testing.T, want, got *types.Report) { + want.ArtifactName = "testdata/fixtures/sbom/centos-7-spdx.txt" + want.ArtifactType = ftypes.ArtifactSPDX + + require.Len(t, got.Results, 1) + want.Results[0].Target = "testdata/fixtures/sbom/centos-7-spdx.txt (centos 7.6.1810)" }, }, { @@ -141,14 +111,12 @@ func TestSBOM(t *testing.T) { artifactType: "spdx", }, golden: "testdata/centos-7.json.golden", - override: types.Report{ - ArtifactName: "testdata/fixtures/sbom/centos-7-spdx.json", - ArtifactType: ftypes.ArtifactType("spdx"), - Results: types.Results{ - { - Target: "testdata/fixtures/sbom/centos-7-spdx.json (centos 7.6.1810)", - }, - }, + override: func(t *testing.T, want, got *types.Report) { + want.ArtifactName = "testdata/fixtures/sbom/centos-7-spdx.json" + want.ArtifactType = ftypes.ArtifactSPDX + + require.Len(t, got.Results, 1) + want.Results[0].Target = "testdata/fixtures/sbom/centos-7-spdx.json (centos 7.6.1810)" }, }, { @@ -195,20 +163,30 @@ func TestSBOM(t *testing.T) { osArgs = append(osArgs, tt.args.input) // Run "trivy sbom" - err := execute(osArgs) - assert.NoError(t, err) - - // Compare want and got - switch tt.args.format { - case "json": - compareSBOMReports(t, tt.golden, outputFile, tt.override) - default: - require.Fail(t, "invalid format", "format: %s", tt.args.format) - } + runTest(t, osArgs, tt.golden, outputFile, types.Format(tt.args.format), runOptions{ + override: overrideFuncs(overrideSBOMReport, overrideUID, tt.override), + }) }) } } +func overrideSBOMReport(t *testing.T, want, got *types.Report) { + want.Metadata.ImageID = "" + want.Metadata.ImageConfig = v1.ConfigFile{} + want.Metadata.DiffIDs = nil + for i, result := range want.Results { + for j := range result.Vulnerabilities { + want.Results[i].Vulnerabilities[j].Layer.DiffID = "" + } + } + + // when running on Windows FS + got.ArtifactName = filepath.ToSlash(filepath.Clean(got.ArtifactName)) + for i, result := range got.Results { + got.Results[i].Target = filepath.ToSlash(filepath.Clean(result.Target)) + } +} + // TODO(teppei): merge into compareReports func compareSBOMReports(t *testing.T, wantFile, gotFile string, overrideWant types.Report) { want := readReport(t, wantFile) diff --git a/integration/testdata/almalinux-8.json.golden b/integration/testdata/almalinux-8.json.golden index 409e02d6e9bd..3f513e20b9f8 100644 --- a/integration/testdata/almalinux-8.json.golden +++ b/integration/testdata/almalinux-8.json.golden @@ -57,7 +57,8 @@ "PkgID": "openssl-libs@1.1.1k-4.el8.x86_64", "PkgName": "openssl-libs", "PkgIdentifier": { - "PURL": "pkg:rpm/alma/openssl-libs@1.1.1k-4.el8?arch=x86_64\u0026distro=alma-8.5\u0026epoch=1" + "PURL": "pkg:rpm/alma/openssl-libs@1.1.1k-4.el8?arch=x86_64\u0026distro=alma-8.5\u0026epoch=1", + "UID": "3f965238234faa63" }, "InstalledVersion": "1:1.1.1k-4.el8", "FixedVersion": "1:1.1.1k-5.el8_5", diff --git a/integration/testdata/alpine-310.json.golden b/integration/testdata/alpine-310.json.golden index d6b4a7884027..35010bb44794 100644 --- a/integration/testdata/alpine-310.json.golden +++ b/integration/testdata/alpine-310.json.golden @@ -59,7 +59,8 @@ "PkgID": "libcrypto1.1@1.1.1c-r0", "PkgName": "libcrypto1.1", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/libcrypto1.1@1.1.1c-r0?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/libcrypto1.1@1.1.1c-r0?arch=x86_64\u0026distro=3.10.2", + "UID": "c6c116a4441ec6de" }, "InstalledVersion": "1.1.1c-r0", "FixedVersion": "1.1.1d-r0", @@ -131,7 +132,8 @@ "PkgID": "libcrypto1.1@1.1.1c-r0", "PkgName": "libcrypto1.1", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/libcrypto1.1@1.1.1c-r0?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/libcrypto1.1@1.1.1c-r0?arch=x86_64\u0026distro=3.10.2", + "UID": "c6c116a4441ec6de" }, "InstalledVersion": "1.1.1c-r0", "FixedVersion": "1.1.1d-r2", @@ -213,7 +215,8 @@ "PkgID": "libssl1.1@1.1.1c-r0", "PkgName": "libssl1.1", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/libssl1.1@1.1.1c-r0?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/libssl1.1@1.1.1c-r0?arch=x86_64\u0026distro=3.10.2", + "UID": "e132dcfcc51772ef" }, "InstalledVersion": "1.1.1c-r0", "FixedVersion": "1.1.1d-r0", @@ -285,7 +288,8 @@ "PkgID": "libssl1.1@1.1.1c-r0", "PkgName": "libssl1.1", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/libssl1.1@1.1.1c-r0?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/libssl1.1@1.1.1c-r0?arch=x86_64\u0026distro=3.10.2", + "UID": "e132dcfcc51772ef" }, "InstalledVersion": "1.1.1c-r0", "FixedVersion": "1.1.1d-r2", diff --git a/integration/testdata/alpine-39-high-critical.json.golden b/integration/testdata/alpine-39-high-critical.json.golden index 73288f579caa..408cd11d4988 100644 --- a/integration/testdata/alpine-39-high-critical.json.golden +++ b/integration/testdata/alpine-39-high-critical.json.golden @@ -59,7 +59,8 @@ "PkgID": "musl@1.1.20-r4", "PkgName": "musl", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/musl@1.1.20-r4?arch=x86_64\u0026distro=3.9.4" + "PURL": "pkg:apk/alpine/musl@1.1.20-r4?arch=x86_64\u0026distro=3.9.4", + "UID": "d6abd271e71d3ce2" }, "InstalledVersion": "1.1.20-r4", "FixedVersion": "1.1.20-r5", @@ -104,7 +105,8 @@ "PkgID": "musl-utils@1.1.20-r4", "PkgName": "musl-utils", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/musl-utils@1.1.20-r4?arch=x86_64\u0026distro=3.9.4" + "PURL": "pkg:apk/alpine/musl-utils@1.1.20-r4?arch=x86_64\u0026distro=3.9.4", + "UID": "8c341199f4077fc8" }, "InstalledVersion": "1.1.20-r4", "FixedVersion": "1.1.20-r5", diff --git a/integration/testdata/alpine-39-ignore-cveids.json.golden b/integration/testdata/alpine-39-ignore-cveids.json.golden index f11198c2364e..14cda282c1aa 100644 --- a/integration/testdata/alpine-39-ignore-cveids.json.golden +++ b/integration/testdata/alpine-39-ignore-cveids.json.golden @@ -59,7 +59,8 @@ "PkgID": "libcrypto1.1@1.1.1b-r1", "PkgName": "libcrypto1.1", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/libcrypto1.1@1.1.1b-r1?arch=x86_64\u0026distro=3.9.4" + "PURL": "pkg:apk/alpine/libcrypto1.1@1.1.1b-r1?arch=x86_64\u0026distro=3.9.4", + "UID": "d2c46e721bca75d3" }, "InstalledVersion": "1.1.1b-r1", "FixedVersion": "1.1.1d-r2", @@ -141,7 +142,8 @@ "PkgID": "libssl1.1@1.1.1b-r1", "PkgName": "libssl1.1", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/libssl1.1@1.1.1b-r1?arch=x86_64\u0026distro=3.9.4" + "PURL": "pkg:apk/alpine/libssl1.1@1.1.1b-r1?arch=x86_64\u0026distro=3.9.4", + "UID": "e39a91b0fefcbb1d" }, "InstalledVersion": "1.1.1b-r1", "FixedVersion": "1.1.1d-r2", diff --git a/integration/testdata/alpine-39.json.golden b/integration/testdata/alpine-39.json.golden index 303f7a3c7277..3e1089f3e7cb 100644 --- a/integration/testdata/alpine-39.json.golden +++ b/integration/testdata/alpine-39.json.golden @@ -59,7 +59,8 @@ "PkgID": "libcrypto1.1@1.1.1b-r1", "PkgName": "libcrypto1.1", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/libcrypto1.1@1.1.1b-r1?arch=x86_64\u0026distro=3.9.4" + "PURL": "pkg:apk/alpine/libcrypto1.1@1.1.1b-r1?arch=x86_64\u0026distro=3.9.4", + "UID": "d2c46e721bca75d3" }, "InstalledVersion": "1.1.1b-r1", "FixedVersion": "1.1.1d-r0", @@ -131,7 +132,8 @@ "PkgID": "libcrypto1.1@1.1.1b-r1", "PkgName": "libcrypto1.1", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/libcrypto1.1@1.1.1b-r1?arch=x86_64\u0026distro=3.9.4" + "PURL": "pkg:apk/alpine/libcrypto1.1@1.1.1b-r1?arch=x86_64\u0026distro=3.9.4", + "UID": "d2c46e721bca75d3" }, "InstalledVersion": "1.1.1b-r1", "FixedVersion": "1.1.1d-r2", @@ -213,7 +215,8 @@ "PkgID": "libssl1.1@1.1.1b-r1", "PkgName": "libssl1.1", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/libssl1.1@1.1.1b-r1?arch=x86_64\u0026distro=3.9.4" + "PURL": "pkg:apk/alpine/libssl1.1@1.1.1b-r1?arch=x86_64\u0026distro=3.9.4", + "UID": "e39a91b0fefcbb1d" }, "InstalledVersion": "1.1.1b-r1", "FixedVersion": "1.1.1d-r0", @@ -285,7 +288,8 @@ "PkgID": "libssl1.1@1.1.1b-r1", "PkgName": "libssl1.1", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/libssl1.1@1.1.1b-r1?arch=x86_64\u0026distro=3.9.4" + "PURL": "pkg:apk/alpine/libssl1.1@1.1.1b-r1?arch=x86_64\u0026distro=3.9.4", + "UID": "e39a91b0fefcbb1d" }, "InstalledVersion": "1.1.1b-r1", "FixedVersion": "1.1.1d-r2", @@ -367,7 +371,8 @@ "PkgID": "musl@1.1.20-r4", "PkgName": "musl", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/musl@1.1.20-r4?arch=x86_64\u0026distro=3.9.4" + "PURL": "pkg:apk/alpine/musl@1.1.20-r4?arch=x86_64\u0026distro=3.9.4", + "UID": "d6abd271e71d3ce2" }, "InstalledVersion": "1.1.20-r4", "FixedVersion": "1.1.20-r5", @@ -412,7 +417,8 @@ "PkgID": "musl-utils@1.1.20-r4", "PkgName": "musl-utils", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/musl-utils@1.1.20-r4?arch=x86_64\u0026distro=3.9.4" + "PURL": "pkg:apk/alpine/musl-utils@1.1.20-r4?arch=x86_64\u0026distro=3.9.4", + "UID": "8c341199f4077fc8" }, "InstalledVersion": "1.1.20-r4", "FixedVersion": "1.1.20-r5", diff --git a/integration/testdata/alpine-distroless.json.golden b/integration/testdata/alpine-distroless.json.golden index 8f79cba7610c..4ba010f0eea0 100644 --- a/integration/testdata/alpine-distroless.json.golden +++ b/integration/testdata/alpine-distroless.json.golden @@ -54,7 +54,8 @@ "PkgID": "git@2.35.1-r2", "PkgName": "git", "PkgIdentifier": { - "PURL": "pkg:apk/alpine/git@2.35.1-r2?arch=x86_64\u0026distro=3.16" + "PURL": "pkg:apk/alpine/git@2.35.1-r2?arch=x86_64\u0026distro=3.16", + "UID": "d44ac4666246b919" }, "InstalledVersion": "2.35.1-r2", "FixedVersion": "2.35.2-r0", diff --git a/integration/testdata/amazon-1.json.golden b/integration/testdata/amazon-1.json.golden index 6be4b41ffe3b..6472eb1859d2 100644 --- a/integration/testdata/amazon-1.json.golden +++ b/integration/testdata/amazon-1.json.golden @@ -58,7 +58,8 @@ "PkgID": "curl@7.61.1-11.91.amzn1.x86_64", "PkgName": "curl", "PkgIdentifier": { - "PURL": "pkg:rpm/amazon/curl@7.61.1-11.91.amzn1?arch=x86_64\u0026distro=amazon-AMI+release+2018.03" + "PURL": "pkg:rpm/amazon/curl@7.61.1-11.91.amzn1?arch=x86_64\u0026distro=amazon-AMI+release+2018.03", + "UID": "9fafb1be522b1e7" }, "InstalledVersion": "7.61.1-11.91.amzn1", "FixedVersion": "7.61.1-12.93.amzn1", diff --git a/integration/testdata/amazon-2.json.golden b/integration/testdata/amazon-2.json.golden index 1f20d8d37b68..530f2b6daf69 100644 --- a/integration/testdata/amazon-2.json.golden +++ b/integration/testdata/amazon-2.json.golden @@ -58,7 +58,8 @@ "PkgID": "curl@7.61.1-9.amzn2.0.1.x86_64", "PkgName": "curl", "PkgIdentifier": { - "PURL": "pkg:rpm/amazon/curl@7.61.1-9.amzn2.0.1?arch=x86_64\u0026distro=amazon-2+%28Karoo%29" + "PURL": "pkg:rpm/amazon/curl@7.61.1-9.amzn2.0.1?arch=x86_64\u0026distro=amazon-2+%28Karoo%29", + "UID": "c5998529d683c5c3" }, "InstalledVersion": "7.61.1-9.amzn2.0.1", "FixedVersion": "7.61.1-12.amzn2.0.1", @@ -129,7 +130,8 @@ "PkgID": "curl@7.61.1-9.amzn2.0.1.x86_64", "PkgName": "curl", "PkgIdentifier": { - "PURL": "pkg:rpm/amazon/curl@7.61.1-9.amzn2.0.1?arch=x86_64\u0026distro=amazon-2+%28Karoo%29" + "PURL": "pkg:rpm/amazon/curl@7.61.1-9.amzn2.0.1?arch=x86_64\u0026distro=amazon-2+%28Karoo%29", + "UID": "c5998529d683c5c3" }, "InstalledVersion": "7.61.1-9.amzn2.0.1", "FixedVersion": "7.61.1-11.amzn2.0.2", diff --git a/integration/testdata/busybox-with-lockfile.json.golden b/integration/testdata/busybox-with-lockfile.json.golden index 520afe2de928..1420c166d012 100644 --- a/integration/testdata/busybox-with-lockfile.json.golden +++ b/integration/testdata/busybox-with-lockfile.json.golden @@ -58,7 +58,8 @@ "PkgID": "ammonia@1.9.0", "PkgName": "ammonia", "PkgIdentifier": { - "PURL": "pkg:cargo/ammonia@1.9.0" + "PURL": "pkg:cargo/ammonia@1.9.0", + "UID": "fa518cac41270ffe" }, "InstalledVersion": "1.9.0", "FixedVersion": "\u003e= 2.1.0", @@ -103,7 +104,8 @@ "PkgID": "ammonia@1.9.0", "PkgName": "ammonia", "PkgIdentifier": { - "PURL": "pkg:cargo/ammonia@1.9.0" + "PURL": "pkg:cargo/ammonia@1.9.0", + "UID": "fa518cac41270ffe" }, "InstalledVersion": "1.9.0", "FixedVersion": "\u003e= 3.1.0, \u003e= 2.1.3, \u003c 3.0.0", diff --git a/integration/testdata/centos-6.json.golden b/integration/testdata/centos-6.json.golden index c1791c58a486..aefd6f2652e0 100644 --- a/integration/testdata/centos-6.json.golden +++ b/integration/testdata/centos-6.json.golden @@ -80,7 +80,8 @@ "PkgID": "glibc@2.12-1.212.el6.x86_64", "PkgName": "glibc", "PkgIdentifier": { - "PURL": "pkg:rpm/centos/glibc@2.12-1.212.el6?arch=x86_64\u0026distro=centos-6.10" + "PURL": "pkg:rpm/centos/glibc@2.12-1.212.el6?arch=x86_64\u0026distro=centos-6.10", + "UID": "24b11591bb7262c4" }, "InstalledVersion": "2.12-1.212.el6", "Status": "end_of_life", @@ -136,7 +137,8 @@ "PkgID": "openssl@1.0.1e-57.el6.x86_64", "PkgName": "openssl", "PkgIdentifier": { - "PURL": "pkg:rpm/centos/openssl@1.0.1e-57.el6?arch=x86_64\u0026distro=centos-6.10" + "PURL": "pkg:rpm/centos/openssl@1.0.1e-57.el6?arch=x86_64\u0026distro=centos-6.10", + "UID": "935959fd0ed81eb9" }, "InstalledVersion": "1.0.1e-57.el6", "FixedVersion": "1.0.1e-58.el6_10", diff --git a/integration/testdata/centos-7-ignore-unfixed.json.golden b/integration/testdata/centos-7-ignore-unfixed.json.golden index ad8379a5d80e..9a5deaa4e5fa 100644 --- a/integration/testdata/centos-7-ignore-unfixed.json.golden +++ b/integration/testdata/centos-7-ignore-unfixed.json.golden @@ -73,7 +73,8 @@ "PkgID": "openssl-libs@1.0.2k-16.el7.x86_64", "PkgName": "openssl-libs", "PkgIdentifier": { - "PURL": "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64\u0026distro=centos-7.6.1810\u0026epoch=1" + "PURL": "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64\u0026distro=centos-7.6.1810\u0026epoch=1", + "UID": "20f09cdcea6545a2" }, "InstalledVersion": "1:1.0.2k-16.el7", "FixedVersion": "1:1.0.2k-19.el7", @@ -166,7 +167,8 @@ "PkgID": "openssl-libs@1.0.2k-16.el7.x86_64", "PkgName": "openssl-libs", "PkgIdentifier": { - "PURL": "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64\u0026distro=centos-7.6.1810\u0026epoch=1" + "PURL": "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64\u0026distro=centos-7.6.1810\u0026epoch=1", + "UID": "20f09cdcea6545a2" }, "InstalledVersion": "1:1.0.2k-16.el7", "FixedVersion": "1:1.0.2k-19.el7", diff --git a/integration/testdata/centos-7-medium.json.golden b/integration/testdata/centos-7-medium.json.golden index ef4a44d2bbe5..479640858f19 100644 --- a/integration/testdata/centos-7-medium.json.golden +++ b/integration/testdata/centos-7-medium.json.golden @@ -73,7 +73,8 @@ "PkgID": "openssl-libs@1.0.2k-16.el7.x86_64", "PkgName": "openssl-libs", "PkgIdentifier": { - "PURL": "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64\u0026distro=centos-7.6.1810\u0026epoch=1" + "PURL": "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64\u0026distro=centos-7.6.1810\u0026epoch=1", + "UID": "20f09cdcea6545a2" }, "InstalledVersion": "1:1.0.2k-16.el7", "FixedVersion": "1:1.0.2k-19.el7", diff --git a/integration/testdata/centos-7.json.golden b/integration/testdata/centos-7.json.golden index 55ea768c99a8..d130399fcd53 100644 --- a/integration/testdata/centos-7.json.golden +++ b/integration/testdata/centos-7.json.golden @@ -70,7 +70,8 @@ "PkgID": "bash@4.2.46-31.el7.x86_64", "PkgName": "bash", "PkgIdentifier": { - "PURL": "pkg:rpm/centos/bash@4.2.46-31.el7?arch=x86_64\u0026distro=centos-7.6.1810" + "PURL": "pkg:rpm/centos/bash@4.2.46-31.el7?arch=x86_64\u0026distro=centos-7.6.1810", + "UID": "64aff37eb11b9c25" }, "InstalledVersion": "4.2.46-31.el7", "Status": "will_not_fix", @@ -130,7 +131,8 @@ "PkgID": "openssl-libs@1.0.2k-16.el7.x86_64", "PkgName": "openssl-libs", "PkgIdentifier": { - "PURL": "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64\u0026distro=centos-7.6.1810\u0026epoch=1" + "PURL": "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64\u0026distro=centos-7.6.1810\u0026epoch=1", + "UID": "20f09cdcea6545a2" }, "InstalledVersion": "1:1.0.2k-16.el7", "FixedVersion": "1:1.0.2k-19.el7", @@ -223,7 +225,8 @@ "PkgID": "openssl-libs@1.0.2k-16.el7.x86_64", "PkgName": "openssl-libs", "PkgIdentifier": { - "PURL": "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64\u0026distro=centos-7.6.1810\u0026epoch=1" + "PURL": "pkg:rpm/centos/openssl-libs@1.0.2k-16.el7?arch=x86_64\u0026distro=centos-7.6.1810\u0026epoch=1", + "UID": "20f09cdcea6545a2" }, "InstalledVersion": "1:1.0.2k-16.el7", "FixedVersion": "1:1.0.2k-19.el7", diff --git a/integration/testdata/cocoapods.json.golden b/integration/testdata/cocoapods.json.golden index 9553f0624286..7b8af93265b0 100644 --- a/integration/testdata/cocoapods.json.golden +++ b/integration/testdata/cocoapods.json.golden @@ -25,7 +25,8 @@ "ID": "_NIODataStructures@2.41.0", "Name": "_NIODataStructures", "Identifier": { - "PURL": "pkg:cocoapods/_NIODataStructures@2.41.0" + "PURL": "pkg:cocoapods/_NIODataStructures@2.41.0", + "UID": "ddc948d6b5e15241" }, "Version": "2.41.0", "Layer": {} @@ -37,7 +38,8 @@ "PkgID": "_NIODataStructures@2.41.0", "PkgName": "_NIODataStructures", "PkgIdentifier": { - "PURL": "pkg:cocoapods/_NIODataStructures@2.41.0" + "PURL": "pkg:cocoapods/_NIODataStructures@2.41.0", + "UID": "ddc948d6b5e15241" }, "InstalledVersion": "2.41.0", "FixedVersion": "2.29.1, 2.39.1, 2.42.0", diff --git a/integration/testdata/composer.lock.json.golden b/integration/testdata/composer.lock.json.golden index b2a341f96e31..5e2e49d8b965 100644 --- a/integration/testdata/composer.lock.json.golden +++ b/integration/testdata/composer.lock.json.golden @@ -25,7 +25,8 @@ "ID": "guzzlehttp/guzzle@7.4.4", "Name": "guzzlehttp/guzzle", "Identifier": { - "PURL": "pkg:composer/guzzlehttp/guzzle@7.4.4" + "PURL": "pkg:composer/guzzlehttp/guzzle@7.4.4", + "UID": "c26bf8868607a91c" }, "Version": "7.4.4", "Licenses": [ @@ -47,7 +48,8 @@ "ID": "guzzlehttp/psr7@1.8.3", "Name": "guzzlehttp/psr7", "Identifier": { - "PURL": "pkg:composer/guzzlehttp/psr7@1.8.3" + "PURL": "pkg:composer/guzzlehttp/psr7@1.8.3", + "UID": "1730859e3ff83ab9" }, "Version": "1.8.3", "Licenses": [ @@ -70,7 +72,8 @@ "PkgID": "guzzlehttp/psr7@1.8.3", "PkgName": "guzzlehttp/psr7", "PkgIdentifier": { - "PURL": "pkg:composer/guzzlehttp/psr7@1.8.3" + "PURL": "pkg:composer/guzzlehttp/psr7@1.8.3", + "UID": "1730859e3ff83ab9" }, "InstalledVersion": "1.8.3", "FixedVersion": "1.8.4", diff --git a/integration/testdata/conan.json.golden b/integration/testdata/conan.json.golden index 4de31b4c3a87..8cee1572ba19 100644 --- a/integration/testdata/conan.json.golden +++ b/integration/testdata/conan.json.golden @@ -25,7 +25,8 @@ "ID": "bzip2/1.0.8", "Name": "bzip2", "Identifier": { - "PURL": "pkg:conan/bzip2@1.0.8" + "PURL": "pkg:conan/bzip2@1.0.8", + "UID": "6e2ff993df2d9107" }, "Version": "1.0.8", "Indirect": true, @@ -42,7 +43,8 @@ "ID": "expat/2.4.8", "Name": "expat", "Identifier": { - "PURL": "pkg:conan/expat@2.4.8" + "PURL": "pkg:conan/expat@2.4.8", + "UID": "71c2d92d60f7f21c" }, "Version": "2.4.8", "Indirect": true, @@ -59,7 +61,8 @@ "ID": "openssl/1.1.1q", "Name": "openssl", "Identifier": { - "PURL": "pkg:conan/openssl@1.1.1q" + "PURL": "pkg:conan/openssl@1.1.1q", + "UID": "13c605db6afa69dd" }, "Version": "1.1.1q", "Indirect": true, @@ -76,7 +79,8 @@ "ID": "pcre/8.43", "Name": "pcre", "Identifier": { - "PURL": "pkg:conan/pcre@8.43" + "PURL": "pkg:conan/pcre@8.43", + "UID": "4e01c692a67e12e4" }, "Version": "8.43", "Indirect": true, @@ -97,7 +101,8 @@ "ID": "poco/1.9.4", "Name": "poco", "Identifier": { - "PURL": "pkg:conan/poco@1.9.4" + "PURL": "pkg:conan/poco@1.9.4", + "UID": "312753cebe80c0eb" }, "Version": "1.9.4", "Relationship": "direct", @@ -120,7 +125,8 @@ "ID": "sqlite3/3.39.2", "Name": "sqlite3", "Identifier": { - "PURL": "pkg:conan/sqlite3@3.39.2" + "PURL": "pkg:conan/sqlite3@3.39.2", + "UID": "43bc9c58092c7c9e" }, "Version": "3.39.2", "Indirect": true, @@ -137,7 +143,8 @@ "ID": "zlib/1.2.12", "Name": "zlib", "Identifier": { - "PURL": "pkg:conan/zlib@1.2.12" + "PURL": "pkg:conan/zlib@1.2.12", + "UID": "d6faf8d6dfd1985" }, "Version": "1.2.12", "Indirect": true, @@ -157,7 +164,8 @@ "PkgID": "pcre/8.43", "PkgName": "pcre", "PkgIdentifier": { - "PURL": "pkg:conan/pcre@8.43" + "PURL": "pkg:conan/pcre@8.43", + "UID": "4e01c692a67e12e4" }, "InstalledVersion": "8.43", "FixedVersion": "8.45", diff --git a/integration/testdata/debian-buster-ignore-unfixed.json.golden b/integration/testdata/debian-buster-ignore-unfixed.json.golden index 0d387db18fbf..cb5a606e3a94 100644 --- a/integration/testdata/debian-buster-ignore-unfixed.json.golden +++ b/integration/testdata/debian-buster-ignore-unfixed.json.golden @@ -61,7 +61,8 @@ "PkgID": "libidn2-0@2.0.5-1", "PkgName": "libidn2-0", "PkgIdentifier": { - "PURL": "pkg:deb/debian/libidn2-0@2.0.5-1?arch=amd64\u0026distro=debian-10.1" + "PURL": "pkg:deb/debian/libidn2-0@2.0.5-1?arch=amd64\u0026distro=debian-10.1", + "UID": "473f5eb9e3d4a2f2" }, "InstalledVersion": "2.0.5-1", "FixedVersion": "2.0.5-1+deb10u1", diff --git a/integration/testdata/debian-buster.json.golden b/integration/testdata/debian-buster.json.golden index 739158b5fe6e..4c9d64fc8347 100644 --- a/integration/testdata/debian-buster.json.golden +++ b/integration/testdata/debian-buster.json.golden @@ -58,7 +58,8 @@ "PkgID": "bash@5.0-4", "PkgName": "bash", "PkgIdentifier": { - "PURL": "pkg:deb/debian/bash@5.0-4?arch=amd64\u0026distro=debian-10.1" + "PURL": "pkg:deb/debian/bash@5.0-4?arch=amd64\u0026distro=debian-10.1", + "UID": "d45ab8ae65ffe67" }, "InstalledVersion": "5.0-4", "Status": "affected", @@ -124,7 +125,8 @@ "PkgID": "libidn2-0@2.0.5-1", "PkgName": "libidn2-0", "PkgIdentifier": { - "PURL": "pkg:deb/debian/libidn2-0@2.0.5-1?arch=amd64\u0026distro=debian-10.1" + "PURL": "pkg:deb/debian/libidn2-0@2.0.5-1?arch=amd64\u0026distro=debian-10.1", + "UID": "473f5eb9e3d4a2f2" }, "InstalledVersion": "2.0.5-1", "FixedVersion": "2.0.5-1+deb10u1", diff --git a/integration/testdata/debian-stretch.json.golden b/integration/testdata/debian-stretch.json.golden index ed15dd42381f..e4be6f91f1f7 100644 --- a/integration/testdata/debian-stretch.json.golden +++ b/integration/testdata/debian-stretch.json.golden @@ -58,7 +58,8 @@ "PkgID": "bash@4.4-5", "PkgName": "bash", "PkgIdentifier": { - "PURL": "pkg:deb/debian/bash@4.4-5?arch=amd64\u0026distro=debian-9.9" + "PURL": "pkg:deb/debian/bash@4.4-5?arch=amd64\u0026distro=debian-9.9", + "UID": "6100d09336f565a0" }, "InstalledVersion": "4.4-5", "Status": "end_of_life", @@ -124,7 +125,8 @@ "PkgID": "e2fslibs@1.43.4-2", "PkgName": "e2fslibs", "PkgIdentifier": { - "PURL": "pkg:deb/debian/e2fslibs@1.43.4-2?arch=amd64\u0026distro=debian-9.9" + "PURL": "pkg:deb/debian/e2fslibs@1.43.4-2?arch=amd64\u0026distro=debian-9.9", + "UID": "656652ce5818f7b6" }, "InstalledVersion": "1.43.4-2", "FixedVersion": "1.43.4-2+deb9u1", @@ -197,7 +199,8 @@ "PkgID": "e2fsprogs@1.43.4-2", "PkgName": "e2fsprogs", "PkgIdentifier": { - "PURL": "pkg:deb/debian/e2fsprogs@1.43.4-2?arch=amd64\u0026distro=debian-9.9" + "PURL": "pkg:deb/debian/e2fsprogs@1.43.4-2?arch=amd64\u0026distro=debian-9.9", + "UID": "3d19fd957338dc06" }, "InstalledVersion": "1.43.4-2", "FixedVersion": "1.43.4-2+deb9u1", @@ -270,7 +273,8 @@ "PkgID": "libcomerr2@1.43.4-2", "PkgName": "libcomerr2", "PkgIdentifier": { - "PURL": "pkg:deb/debian/libcomerr2@1.43.4-2?arch=amd64\u0026distro=debian-9.9" + "PURL": "pkg:deb/debian/libcomerr2@1.43.4-2?arch=amd64\u0026distro=debian-9.9", + "UID": "6ba1fac685a0c068" }, "InstalledVersion": "1.43.4-2", "FixedVersion": "1.43.4-2+deb9u1", @@ -343,7 +347,8 @@ "PkgID": "libss2@1.43.4-2", "PkgName": "libss2", "PkgIdentifier": { - "PURL": "pkg:deb/debian/libss2@1.43.4-2?arch=amd64\u0026distro=debian-9.9" + "PURL": "pkg:deb/debian/libss2@1.43.4-2?arch=amd64\u0026distro=debian-9.9", + "UID": "e507c185f61cd2e8" }, "InstalledVersion": "1.43.4-2", "FixedVersion": "1.43.4-2+deb9u1", diff --git a/integration/testdata/distroless-base.json.golden b/integration/testdata/distroless-base.json.golden index 0bd390a36f54..c5872a901494 100644 --- a/integration/testdata/distroless-base.json.golden +++ b/integration/testdata/distroless-base.json.golden @@ -56,7 +56,8 @@ "PkgID": "libssl1.1@1.1.0k-1~deb9u1", "PkgName": "libssl1.1", "PkgIdentifier": { - "PURL": "pkg:deb/debian/libssl1.1@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9" + "PURL": "pkg:deb/debian/libssl1.1@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9", + "UID": "96b92444b87304a5" }, "InstalledVersion": "1.1.0k-1~deb9u1", "Status": "affected", @@ -140,7 +141,8 @@ "PkgID": "libssl1.1@1.1.0k-1~deb9u1", "PkgName": "libssl1.1", "PkgIdentifier": { - "PURL": "pkg:deb/debian/libssl1.1@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9" + "PURL": "pkg:deb/debian/libssl1.1@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9", + "UID": "96b92444b87304a5" }, "InstalledVersion": "1.1.0k-1~deb9u1", "FixedVersion": "1.1.0l-1~deb9u1", @@ -230,7 +232,8 @@ "PkgID": "openssl@1.1.0k-1~deb9u1", "PkgName": "openssl", "PkgIdentifier": { - "PURL": "pkg:deb/debian/openssl@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9" + "PURL": "pkg:deb/debian/openssl@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9", + "UID": "ed86402b9a8c2be6" }, "InstalledVersion": "1.1.0k-1~deb9u1", "Status": "affected", @@ -314,7 +317,8 @@ "PkgID": "openssl@1.1.0k-1~deb9u1", "PkgName": "openssl", "PkgIdentifier": { - "PURL": "pkg:deb/debian/openssl@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9" + "PURL": "pkg:deb/debian/openssl@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9", + "UID": "ed86402b9a8c2be6" }, "InstalledVersion": "1.1.0k-1~deb9u1", "FixedVersion": "1.1.0l-1~deb9u1", diff --git a/integration/testdata/distroless-python27.json.golden b/integration/testdata/distroless-python27.json.golden index 8c0657976b97..403b34c2dba8 100644 --- a/integration/testdata/distroless-python27.json.golden +++ b/integration/testdata/distroless-python27.json.golden @@ -73,7 +73,8 @@ "PkgID": "libssl1.1@1.1.0k-1~deb9u1", "PkgName": "libssl1.1", "PkgIdentifier": { - "PURL": "pkg:deb/debian/libssl1.1@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9" + "PURL": "pkg:deb/debian/libssl1.1@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9", + "UID": "96b92444b87304a5" }, "InstalledVersion": "1.1.0k-1~deb9u1", "Status": "affected", @@ -157,7 +158,8 @@ "PkgID": "libssl1.1@1.1.0k-1~deb9u1", "PkgName": "libssl1.1", "PkgIdentifier": { - "PURL": "pkg:deb/debian/libssl1.1@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9" + "PURL": "pkg:deb/debian/libssl1.1@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9", + "UID": "96b92444b87304a5" }, "InstalledVersion": "1.1.0k-1~deb9u1", "FixedVersion": "1.1.0l-1~deb9u1", @@ -247,7 +249,8 @@ "PkgID": "openssl@1.1.0k-1~deb9u1", "PkgName": "openssl", "PkgIdentifier": { - "PURL": "pkg:deb/debian/openssl@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9" + "PURL": "pkg:deb/debian/openssl@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9", + "UID": "ed86402b9a8c2be6" }, "InstalledVersion": "1.1.0k-1~deb9u1", "Status": "affected", @@ -331,7 +334,8 @@ "PkgID": "openssl@1.1.0k-1~deb9u1", "PkgName": "openssl", "PkgIdentifier": { - "PURL": "pkg:deb/debian/openssl@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9" + "PURL": "pkg:deb/debian/openssl@1.1.0k-1~deb9u1?arch=amd64\u0026distro=debian-9.9", + "UID": "ed86402b9a8c2be6" }, "InstalledVersion": "1.1.0k-1~deb9u1", "FixedVersion": "1.1.0l-1~deb9u1", diff --git a/integration/testdata/dotnet.json.golden b/integration/testdata/dotnet.json.golden index 264b28d7534d..778b1270fcf2 100644 --- a/integration/testdata/dotnet.json.golden +++ b/integration/testdata/dotnet.json.golden @@ -24,7 +24,8 @@ { "Name": "Newtonsoft.Json", "Identifier": { - "PURL": "pkg:nuget/Newtonsoft.Json@9.0.1" + "PURL": "pkg:nuget/Newtonsoft.Json@9.0.1", + "UID": "19955f480b8a6340" }, "Version": "9.0.1", "Layer": {}, @@ -41,7 +42,8 @@ "VulnerabilityID": "GHSA-5crp-9r3c-p9vr", "PkgName": "Newtonsoft.Json", "PkgIdentifier": { - "PURL": "pkg:nuget/Newtonsoft.Json@9.0.1" + "PURL": "pkg:nuget/Newtonsoft.Json@9.0.1", + "UID": "19955f480b8a6340" }, "InstalledVersion": "9.0.1", "FixedVersion": "13.0.1", diff --git a/integration/testdata/fluentd-gems.json.golden b/integration/testdata/fluentd-gems.json.golden index 2072e0c4bf8d..ef3a04bb7a50 100644 --- a/integration/testdata/fluentd-gems.json.golden +++ b/integration/testdata/fluentd-gems.json.golden @@ -114,7 +114,8 @@ "PkgID": "libidn2-0@2.0.5-1", "PkgName": "libidn2-0", "PkgIdentifier": { - "PURL": "pkg:deb/debian/libidn2-0@2.0.5-1?arch=amd64\u0026distro=debian-10.2" + "PURL": "pkg:deb/debian/libidn2-0@2.0.5-1?arch=amd64\u0026distro=debian-10.2", + "UID": "14f80a7091a08e71" }, "InstalledVersion": "2.0.5-1", "FixedVersion": "2.0.5-1+deb10u1", @@ -185,7 +186,8 @@ "PkgName": "activesupport", "PkgPath": "var/lib/gems/2.5.0/specifications/activesupport-6.0.2.1.gemspec", "PkgIdentifier": { - "PURL": "pkg:gem/activesupport@6.0.2.1" + "PURL": "pkg:gem/activesupport@6.0.2.1", + "UID": "dedd4bd33ed812a3" }, "InstalledVersion": "6.0.2.1", "FixedVersion": "6.0.3.1, 5.2.4.3", diff --git a/integration/testdata/fluentd-multiple-lockfiles.json.golden b/integration/testdata/fluentd-multiple-lockfiles.json.golden index 701c0262753d..fec0e1a39a0d 100644 --- a/integration/testdata/fluentd-multiple-lockfiles.json.golden +++ b/integration/testdata/fluentd-multiple-lockfiles.json.golden @@ -31,6 +31,7 @@ "PkgName": "bash", "PkgIdentifier": { "PURL": "pkg:deb/debian/bash@5.0-4?distro=debian-10.2", + "UID": "8ca99d0ea2f4b0a3", "BOMRef": "pkg:deb/debian/bash@5.0-4?distro=debian-10.2" }, "InstalledVersion": "5.0-4", @@ -95,6 +96,7 @@ "PkgName": "libidn2-0", "PkgIdentifier": { "PURL": "pkg:deb/debian/libidn2-0@2.0.5-1?distro=debian-10.2", + "UID": "bd31ad93af9a5d2", "BOMRef": "pkg:deb/debian/libidn2-0@2.0.5-1?distro=debian-10.2" }, "InstalledVersion": "2.0.5-1", @@ -165,6 +167,7 @@ "PkgPath": "var/lib/gems/2.5.0/specifications/activesupport-6.0.2.1.gemspec", "PkgIdentifier": { "PURL": "pkg:gem/activesupport@6.0.2.1", + "UID": "66a6de64809697cd", "BOMRef": "pkg:gem/activesupport@6.0.2.1?file_path=var%2Flib%2Fgems%2F2.5.0%2Fspecifications%2Factivesupport-6.0.2.1.gemspec" }, "InstalledVersion": "6.0.2.1", diff --git a/integration/testdata/gomod-skip.json.golden b/integration/testdata/gomod-skip.json.golden index ce748cc19823..69ab998ec9dd 100644 --- a/integration/testdata/gomod-skip.json.golden +++ b/integration/testdata/gomod-skip.json.golden @@ -26,7 +26,8 @@ "PkgID": "github.com/docker/distribution@v2.7.1+incompatible", "PkgName": "github.com/docker/distribution", "PkgIdentifier": { - "PURL": "pkg:golang/github.com/docker/distribution@2.7.1%2Bincompatible" + "PURL": "pkg:golang/github.com/docker/distribution@2.7.1%2Bincompatible", + "UID": "de19cd663ca047a8" }, "InstalledVersion": "2.7.1+incompatible", "FixedVersion": "v2.8.0", @@ -52,7 +53,8 @@ "PkgID": "github.com/open-policy-agent/opa@v0.35.0", "PkgName": "github.com/open-policy-agent/opa", "PkgIdentifier": { - "PURL": "pkg:golang/github.com/open-policy-agent/opa@0.35.0" + "PURL": "pkg:golang/github.com/open-policy-agent/opa@0.35.0", + "UID": "6b685002e082ffc5" }, "InstalledVersion": "0.35.0", "FixedVersion": "0.37.0", @@ -98,7 +100,8 @@ "PkgID": "golang.org/x/text@v0.3.6", "PkgName": "golang.org/x/text", "PkgIdentifier": { - "PURL": "pkg:golang/golang.org/x/text@0.3.6" + "PURL": "pkg:golang/golang.org/x/text@0.3.6", + "UID": "825dc613c0f39d45" }, "InstalledVersion": "0.3.6", "FixedVersion": "0.3.7", @@ -130,7 +133,8 @@ "PkgID": "github.com/docker/distribution@v2.7.1+incompatible", "PkgName": "github.com/docker/distribution", "PkgIdentifier": { - "PURL": "pkg:golang/github.com/docker/distribution@2.7.1%2Bincompatible" + "PURL": "pkg:golang/github.com/docker/distribution@2.7.1%2Bincompatible", + "UID": "94376dc37054a7e8" }, "InstalledVersion": "2.7.1+incompatible", "FixedVersion": "v2.8.0", diff --git a/integration/testdata/gomod.json.golden b/integration/testdata/gomod.json.golden index 5009b9d3bf81..627088188285 100644 --- a/integration/testdata/gomod.json.golden +++ b/integration/testdata/gomod.json.golden @@ -26,7 +26,8 @@ "PkgID": "github.com/docker/distribution@v2.7.1+incompatible", "PkgName": "github.com/docker/distribution", "PkgIdentifier": { - "PURL": "pkg:golang/github.com/docker/distribution@2.7.1%2Bincompatible" + "PURL": "pkg:golang/github.com/docker/distribution@2.7.1%2Bincompatible", + "UID": "de19cd663ca047a8" }, "InstalledVersion": "2.7.1+incompatible", "FixedVersion": "v2.8.0", @@ -52,7 +53,8 @@ "PkgID": "github.com/open-policy-agent/opa@v0.35.0", "PkgName": "github.com/open-policy-agent/opa", "PkgIdentifier": { - "PURL": "pkg:golang/github.com/open-policy-agent/opa@0.35.0" + "PURL": "pkg:golang/github.com/open-policy-agent/opa@0.35.0", + "UID": "6b685002e082ffc5" }, "InstalledVersion": "0.35.0", "FixedVersion": "0.37.0", @@ -98,7 +100,8 @@ "PkgID": "golang.org/x/text@v0.3.6", "PkgName": "golang.org/x/text", "PkgIdentifier": { - "PURL": "pkg:golang/golang.org/x/text@0.3.6" + "PURL": "pkg:golang/golang.org/x/text@0.3.6", + "UID": "825dc613c0f39d45" }, "InstalledVersion": "0.3.6", "FixedVersion": "0.3.7", @@ -130,7 +133,8 @@ "PkgID": "github.com/docker/distribution@v2.7.1+incompatible", "PkgName": "github.com/docker/distribution", "PkgIdentifier": { - "PURL": "pkg:golang/github.com/docker/distribution@2.7.1%2Bincompatible" + "PURL": "pkg:golang/github.com/docker/distribution@2.7.1%2Bincompatible", + "UID": "94376dc37054a7e8" }, "InstalledVersion": "2.7.1+incompatible", "FixedVersion": "v2.8.0", @@ -163,7 +167,8 @@ "PkgID": "github.com/docker/distribution@v2.7.1+incompatible", "PkgName": "github.com/docker/distribution", "PkgIdentifier": { - "PURL": "pkg:golang/github.com/docker/distribution@2.7.1%2Bincompatible" + "PURL": "pkg:golang/github.com/docker/distribution@2.7.1%2Bincompatible", + "UID": "94306cdcf85fb50a" }, "InstalledVersion": "2.7.1+incompatible", "FixedVersion": "v2.8.0", diff --git a/integration/testdata/gradle.json.golden b/integration/testdata/gradle.json.golden index 86822d526e3b..4f546add29a5 100644 --- a/integration/testdata/gradle.json.golden +++ b/integration/testdata/gradle.json.golden @@ -26,7 +26,8 @@ "PkgID": "com.fasterxml.jackson.core:jackson-databind:2.9.1", "PkgName": "com.fasterxml.jackson.core:jackson-databind", "PkgIdentifier": { - "PURL": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.1" + "PURL": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.1", + "UID": "7014f907b756006b" }, "InstalledVersion": "2.9.1", "FixedVersion": "2.9.10.4", @@ -91,7 +92,8 @@ "PkgID": "com.fasterxml.jackson.core:jackson-databind:2.9.1", "PkgName": "com.fasterxml.jackson.core:jackson-databind", "PkgIdentifier": { - "PURL": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.1" + "PURL": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.1", + "UID": "7014f907b756006b" }, "InstalledVersion": "2.9.1", "FixedVersion": "2.9.10.7", diff --git a/integration/testdata/mariner-1.0.json.golden b/integration/testdata/mariner-1.0.json.golden index 435dd5bdf7a6..1d549e1ef188 100644 --- a/integration/testdata/mariner-1.0.json.golden +++ b/integration/testdata/mariner-1.0.json.golden @@ -42,7 +42,8 @@ "VulnerabilityID": "CVE-2022-0261", "PkgName": "vim", "PkgIdentifier": { - "PURL": "pkg:cbl-mariner/vim@8.2.4081-1.cm1?arch=x86_64" + "PURL": "pkg:cbl-mariner/vim@8.2.4081-1.cm1?arch=x86_64", + "UID": "3f08cd76fa5ba73d" }, "InstalledVersion": "8.2.4081-1.cm1", "Status": "affected", @@ -78,7 +79,8 @@ "VulnerabilityID": "CVE-2022-0158", "PkgName": "vim", "PkgIdentifier": { - "PURL": "pkg:cbl-mariner/vim@8.2.4081-1.cm1?arch=x86_64" + "PURL": "pkg:cbl-mariner/vim@8.2.4081-1.cm1?arch=x86_64", + "UID": "3f08cd76fa5ba73d" }, "InstalledVersion": "8.2.4081-1.cm1", "FixedVersion": "8.2.4082-1.cm1", diff --git a/integration/testdata/minikube-kbom.json.golden b/integration/testdata/minikube-kbom.json.golden index fd5b6b24718f..c80807eb9c99 100644 --- a/integration/testdata/minikube-kbom.json.golden +++ b/integration/testdata/minikube-kbom.json.golden @@ -36,6 +36,7 @@ "PkgName": "k8s.io/kubelet", "PkgIdentifier": { "PURL": "pkg:k8s/k8s.io%2Fkubelet@1.27.0", + "UID": "4cb15d0a98eeae67", "BOMRef": "pkg:k8s/k8s.io%2Fkubelet@1.27.0" }, "InstalledVersion": "1.27.0", diff --git a/integration/testdata/mix.lock.json.golden b/integration/testdata/mix.lock.json.golden index 54445fbf9cfa..259337374490 100644 --- a/integration/testdata/mix.lock.json.golden +++ b/integration/testdata/mix.lock.json.golden @@ -25,7 +25,8 @@ "ID": "castore@0.1.18", "Name": "castore", "Identifier": { - "PURL": "pkg:hex/castore@0.1.18" + "PURL": "pkg:hex/castore@0.1.18", + "UID": "92fd0f5d45735c7c" }, "Version": "0.1.18", "Layer": {}, @@ -40,7 +41,8 @@ "ID": "jason@1.4.0", "Name": "jason", "Identifier": { - "PURL": "pkg:hex/jason@1.4.0" + "PURL": "pkg:hex/jason@1.4.0", + "UID": "b9cff6ce54a65dae" }, "Version": "1.4.0", "Layer": {}, @@ -55,7 +57,8 @@ "ID": "phoenix@1.6.13", "Name": "phoenix", "Identifier": { - "PURL": "pkg:hex/phoenix@1.6.13" + "PURL": "pkg:hex/phoenix@1.6.13", + "UID": "5b0d3fb75bef47e3" }, "Version": "1.6.13", "Layer": {}, @@ -70,7 +73,8 @@ "ID": "phoenix_html@3.2.0", "Name": "phoenix_html", "Identifier": { - "PURL": "pkg:hex/phoenix_html@3.2.0" + "PURL": "pkg:hex/phoenix_html@3.2.0", + "UID": "8c18e24394b53ab" }, "Version": "3.2.0", "Layer": {}, @@ -85,7 +89,8 @@ "ID": "phoenix_pubsub@2.1.1", "Name": "phoenix_pubsub", "Identifier": { - "PURL": "pkg:hex/phoenix_pubsub@2.1.1" + "PURL": "pkg:hex/phoenix_pubsub@2.1.1", + "UID": "89226dc20d54eb50" }, "Version": "2.1.1", "Layer": {}, @@ -100,7 +105,8 @@ "ID": "phoenix_template@1.0.0", "Name": "phoenix_template", "Identifier": { - "PURL": "pkg:hex/phoenix_template@1.0.0" + "PURL": "pkg:hex/phoenix_template@1.0.0", + "UID": "5cd9afe7111a31b7" }, "Version": "1.0.0", "Layer": {}, @@ -115,7 +121,8 @@ "ID": "phoenix_view@2.0.1", "Name": "phoenix_view", "Identifier": { - "PURL": "pkg:hex/phoenix_view@2.0.1" + "PURL": "pkg:hex/phoenix_view@2.0.1", + "UID": "2f4485f9653589ad" }, "Version": "2.0.1", "Layer": {}, @@ -130,7 +137,8 @@ "ID": "plug@1.14.0", "Name": "plug", "Identifier": { - "PURL": "pkg:hex/plug@1.14.0" + "PURL": "pkg:hex/plug@1.14.0", + "UID": "2390188ac1142ded" }, "Version": "1.14.0", "Layer": {}, @@ -145,7 +153,8 @@ "ID": "plug_crypto@1.2.3", "Name": "plug_crypto", "Identifier": { - "PURL": "pkg:hex/plug_crypto@1.2.3" + "PURL": "pkg:hex/plug_crypto@1.2.3", + "UID": "912b06dac071654" }, "Version": "1.2.3", "Layer": {}, @@ -160,7 +169,8 @@ "ID": "telemetry@1.1.0", "Name": "telemetry", "Identifier": { - "PURL": "pkg:hex/telemetry@1.1.0" + "PURL": "pkg:hex/telemetry@1.1.0", + "UID": "15879b8627da74b9" }, "Version": "1.1.0", "Layer": {}, @@ -178,7 +188,8 @@ "PkgID": "phoenix@1.6.13", "PkgName": "phoenix", "PkgIdentifier": { - "PURL": "pkg:hex/phoenix@1.6.13" + "PURL": "pkg:hex/phoenix@1.6.13", + "UID": "5b0d3fb75bef47e3" }, "InstalledVersion": "1.6.13", "FixedVersion": "1.6.14", diff --git a/integration/testdata/npm-with-dev.json.golden b/integration/testdata/npm-with-dev.json.golden index fb1ecb091209..eb2d03fa58c1 100644 --- a/integration/testdata/npm-with-dev.json.golden +++ b/integration/testdata/npm-with-dev.json.golden @@ -25,7 +25,8 @@ "ID": "asap@2.0.6", "Name": "asap", "Identifier": { - "PURL": "pkg:npm/asap@2.0.6" + "PURL": "pkg:npm/asap@2.0.6", + "UID": "199d95f873330bd3" }, "Version": "2.0.6", "Layer": {}, @@ -40,7 +41,8 @@ "ID": "jquery@3.3.9", "Name": "jquery", "Identifier": { - "PURL": "pkg:npm/jquery@3.3.9" + "PURL": "pkg:npm/jquery@3.3.9", + "UID": "e19e84d31f72b60c" }, "Version": "3.3.9", "Licenses": [ @@ -58,7 +60,8 @@ "ID": "js-tokens@4.0.0", "Name": "js-tokens", "Identifier": { - "PURL": "pkg:npm/js-tokens@4.0.0" + "PURL": "pkg:npm/js-tokens@4.0.0", + "UID": "605df7770562762" }, "Version": "4.0.0", "Layer": {}, @@ -73,7 +76,8 @@ "ID": "loose-envify@1.4.0", "Name": "loose-envify", "Identifier": { - "PURL": "pkg:npm/loose-envify@1.4.0" + "PURL": "pkg:npm/loose-envify@1.4.0", + "UID": "a40682339e264167" }, "Version": "1.4.0", "DependsOn": [ @@ -91,7 +95,8 @@ "ID": "object-assign@4.1.1", "Name": "object-assign", "Identifier": { - "PURL": "pkg:npm/object-assign@4.1.1" + "PURL": "pkg:npm/object-assign@4.1.1", + "UID": "ec3b70276c206ac2" }, "Version": "4.1.1", "Layer": {}, @@ -106,7 +111,8 @@ "ID": "promise@8.0.3", "Name": "promise", "Identifier": { - "PURL": "pkg:npm/promise@8.0.3" + "PURL": "pkg:npm/promise@8.0.3", + "UID": "b60f9aaa4e3cba8f" }, "Version": "8.0.3", "Licenses": [ @@ -127,7 +133,8 @@ "ID": "prop-types@15.7.2", "Name": "prop-types", "Identifier": { - "PURL": "pkg:npm/prop-types@15.7.2" + "PURL": "pkg:npm/prop-types@15.7.2", + "UID": "5a0c427e953b2a24" }, "Version": "15.7.2", "DependsOn": [ @@ -147,7 +154,8 @@ "ID": "react@16.8.6", "Name": "react", "Identifier": { - "PURL": "pkg:npm/react@16.8.6" + "PURL": "pkg:npm/react@16.8.6", + "UID": "da9140320b70dc57" }, "Version": "16.8.6", "Licenses": [ @@ -171,7 +179,8 @@ "ID": "react-is@16.8.6", "Name": "react-is", "Identifier": { - "PURL": "pkg:npm/react-is@16.8.6" + "PURL": "pkg:npm/react-is@16.8.6", + "UID": "f50b67a44460b362" }, "Version": "16.8.6", "Licenses": [ @@ -189,7 +198,8 @@ "ID": "redux@4.0.1", "Name": "redux", "Identifier": { - "PURL": "pkg:npm/redux@4.0.1" + "PURL": "pkg:npm/redux@4.0.1", + "UID": "fbb7d7c45dbba492" }, "Version": "4.0.1", "Licenses": [ @@ -211,7 +221,8 @@ "ID": "scheduler@0.13.6", "Name": "scheduler", "Identifier": { - "PURL": "pkg:npm/scheduler@0.13.6" + "PURL": "pkg:npm/scheduler@0.13.6", + "UID": "9738f8ac302a0bb" }, "Version": "0.13.6", "DependsOn": [ @@ -230,7 +241,8 @@ "ID": "symbol-observable@1.2.0", "Name": "symbol-observable", "Identifier": { - "PURL": "pkg:npm/symbol-observable@1.2.0" + "PURL": "pkg:npm/symbol-observable@1.2.0", + "UID": "b14a083f8b9e59bc" }, "Version": "1.2.0", "Layer": {}, @@ -245,7 +257,8 @@ "ID": "z-lock@1.0.0", "Name": "z-lock", "Identifier": { - "PURL": "pkg:npm/z-lock@1.0.0" + "PURL": "pkg:npm/z-lock@1.0.0", + "UID": "f6ba8a4be50ce713" }, "Version": "1.0.0", "Dev": true, @@ -267,7 +280,8 @@ "PkgID": "jquery@3.3.9", "PkgName": "jquery", "PkgIdentifier": { - "PURL": "pkg:npm/jquery@3.3.9" + "PURL": "pkg:npm/jquery@3.3.9", + "UID": "e19e84d31f72b60c" }, "InstalledVersion": "3.3.9", "FixedVersion": "3.4.0", diff --git a/integration/testdata/npm.json.golden b/integration/testdata/npm.json.golden index a576da82c72e..88ca91b48044 100644 --- a/integration/testdata/npm.json.golden +++ b/integration/testdata/npm.json.golden @@ -25,7 +25,8 @@ "ID": "asap@2.0.6", "Name": "asap", "Identifier": { - "PURL": "pkg:npm/asap@2.0.6" + "PURL": "pkg:npm/asap@2.0.6", + "UID": "199d95f873330bd3" }, "Version": "2.0.6", "Layer": {}, @@ -40,7 +41,8 @@ "ID": "jquery@3.3.9", "Name": "jquery", "Identifier": { - "PURL": "pkg:npm/jquery@3.3.9" + "PURL": "pkg:npm/jquery@3.3.9", + "UID": "e19e84d31f72b60c" }, "Version": "3.3.9", "Licenses": [ @@ -58,7 +60,8 @@ "ID": "js-tokens@4.0.0", "Name": "js-tokens", "Identifier": { - "PURL": "pkg:npm/js-tokens@4.0.0" + "PURL": "pkg:npm/js-tokens@4.0.0", + "UID": "605df7770562762" }, "Version": "4.0.0", "Layer": {}, @@ -73,7 +76,8 @@ "ID": "loose-envify@1.4.0", "Name": "loose-envify", "Identifier": { - "PURL": "pkg:npm/loose-envify@1.4.0" + "PURL": "pkg:npm/loose-envify@1.4.0", + "UID": "a40682339e264167" }, "Version": "1.4.0", "DependsOn": [ @@ -91,7 +95,8 @@ "ID": "object-assign@4.1.1", "Name": "object-assign", "Identifier": { - "PURL": "pkg:npm/object-assign@4.1.1" + "PURL": "pkg:npm/object-assign@4.1.1", + "UID": "ec3b70276c206ac2" }, "Version": "4.1.1", "Layer": {}, @@ -106,7 +111,8 @@ "ID": "promise@8.0.3", "Name": "promise", "Identifier": { - "PURL": "pkg:npm/promise@8.0.3" + "PURL": "pkg:npm/promise@8.0.3", + "UID": "b60f9aaa4e3cba8f" }, "Version": "8.0.3", "Licenses": [ @@ -127,7 +133,8 @@ "ID": "prop-types@15.7.2", "Name": "prop-types", "Identifier": { - "PURL": "pkg:npm/prop-types@15.7.2" + "PURL": "pkg:npm/prop-types@15.7.2", + "UID": "5a0c427e953b2a24" }, "Version": "15.7.2", "DependsOn": [ @@ -147,7 +154,8 @@ "ID": "react@16.8.6", "Name": "react", "Identifier": { - "PURL": "pkg:npm/react@16.8.6" + "PURL": "pkg:npm/react@16.8.6", + "UID": "da9140320b70dc57" }, "Version": "16.8.6", "Licenses": [ @@ -171,7 +179,8 @@ "ID": "react-is@16.8.6", "Name": "react-is", "Identifier": { - "PURL": "pkg:npm/react-is@16.8.6" + "PURL": "pkg:npm/react-is@16.8.6", + "UID": "f50b67a44460b362" }, "Version": "16.8.6", "Licenses": [ @@ -189,7 +198,8 @@ "ID": "redux@4.0.1", "Name": "redux", "Identifier": { - "PURL": "pkg:npm/redux@4.0.1" + "PURL": "pkg:npm/redux@4.0.1", + "UID": "fbb7d7c45dbba492" }, "Version": "4.0.1", "Licenses": [ @@ -211,7 +221,8 @@ "ID": "scheduler@0.13.6", "Name": "scheduler", "Identifier": { - "PURL": "pkg:npm/scheduler@0.13.6" + "PURL": "pkg:npm/scheduler@0.13.6", + "UID": "9738f8ac302a0bb" }, "Version": "0.13.6", "DependsOn": [ @@ -230,7 +241,8 @@ "ID": "symbol-observable@1.2.0", "Name": "symbol-observable", "Identifier": { - "PURL": "pkg:npm/symbol-observable@1.2.0" + "PURL": "pkg:npm/symbol-observable@1.2.0", + "UID": "b14a083f8b9e59bc" }, "Version": "1.2.0", "Layer": {}, @@ -248,7 +260,8 @@ "PkgID": "jquery@3.3.9", "PkgName": "jquery", "PkgIdentifier": { - "PURL": "pkg:npm/jquery@3.3.9" + "PURL": "pkg:npm/jquery@3.3.9", + "UID": "e19e84d31f72b60c" }, "InstalledVersion": "3.3.9", "FixedVersion": "3.4.0", diff --git a/integration/testdata/nuget.json.golden b/integration/testdata/nuget.json.golden index 6c5a2f19b9ac..b4ec872a839c 100644 --- a/integration/testdata/nuget.json.golden +++ b/integration/testdata/nuget.json.golden @@ -25,7 +25,8 @@ "ID": "Newtonsoft.Json@12.0.3", "Name": "Newtonsoft.Json", "Identifier": { - "PURL": "pkg:nuget/Newtonsoft.Json@12.0.3" + "PURL": "pkg:nuget/Newtonsoft.Json@12.0.3", + "UID": "d4249b2442e303e9" }, "Version": "12.0.3", "Relationship": "direct", @@ -41,7 +42,8 @@ "ID": "NuGet.Frameworks@5.7.0", "Name": "NuGet.Frameworks", "Identifier": { - "PURL": "pkg:nuget/NuGet.Frameworks@5.7.0" + "PURL": "pkg:nuget/NuGet.Frameworks@5.7.0", + "UID": "6fa0c117039de82a" }, "Version": "5.7.0", "Relationship": "direct", @@ -63,7 +65,8 @@ "PkgID": "Newtonsoft.Json@12.0.3", "PkgName": "Newtonsoft.Json", "PkgIdentifier": { - "PURL": "pkg:nuget/Newtonsoft.Json@12.0.3" + "PURL": "pkg:nuget/Newtonsoft.Json@12.0.3", + "UID": "d4249b2442e303e9" }, "InstalledVersion": "12.0.3", "FixedVersion": "13.0.1", diff --git a/integration/testdata/opensuse-leap-151.json.golden b/integration/testdata/opensuse-leap-151.json.golden index 9ca650d3dbb3..77b0148604bb 100644 --- a/integration/testdata/opensuse-leap-151.json.golden +++ b/integration/testdata/opensuse-leap-151.json.golden @@ -66,7 +66,8 @@ "PkgID": "libopenssl1_1@1.1.0i-lp151.8.3.1.x86_64", "PkgName": "libopenssl1_1", "PkgIdentifier": { - "PURL": "pkg:rpm/opensuse.leap/libopenssl1_1@1.1.0i-lp151.8.3.1?arch=x86_64\u0026distro=opensuse.leap-15.1" + "PURL": "pkg:rpm/opensuse.leap/libopenssl1_1@1.1.0i-lp151.8.3.1?arch=x86_64\u0026distro=opensuse.leap-15.1", + "UID": "898b73ddd0412f57" }, "InstalledVersion": "1.1.0i-lp151.8.3.1", "FixedVersion": "1.1.0i-lp151.8.6.1", @@ -98,7 +99,8 @@ "PkgID": "openssl-1_1@1.1.0i-lp151.8.3.1.x86_64", "PkgName": "openssl-1_1", "PkgIdentifier": { - "PURL": "pkg:rpm/opensuse.leap/openssl-1_1@1.1.0i-lp151.8.3.1?arch=x86_64\u0026distro=opensuse.leap-15.1" + "PURL": "pkg:rpm/opensuse.leap/openssl-1_1@1.1.0i-lp151.8.3.1?arch=x86_64\u0026distro=opensuse.leap-15.1", + "UID": "58980d005de43f54" }, "InstalledVersion": "1.1.0i-lp151.8.3.1", "FixedVersion": "1.1.0i-lp151.8.6.1", diff --git a/integration/testdata/oraclelinux-8.json.golden b/integration/testdata/oraclelinux-8.json.golden index 6629e7fe0e55..71a0411cba93 100644 --- a/integration/testdata/oraclelinux-8.json.golden +++ b/integration/testdata/oraclelinux-8.json.golden @@ -67,7 +67,8 @@ "PkgID": "curl@7.61.1-8.el8.x86_64", "PkgName": "curl", "PkgIdentifier": { - "PURL": "pkg:rpm/oracle/curl@7.61.1-8.el8?arch=x86_64\u0026distro=oracle-8.0" + "PURL": "pkg:rpm/oracle/curl@7.61.1-8.el8?arch=x86_64\u0026distro=oracle-8.0", + "UID": "6837a94bd82971ac" }, "InstalledVersion": "7.61.1-8.el8", "FixedVersion": "7.61.1-11.el8", @@ -137,7 +138,8 @@ "PkgID": "curl@7.61.1-8.el8.x86_64", "PkgName": "curl", "PkgIdentifier": { - "PURL": "pkg:rpm/oracle/curl@7.61.1-8.el8?arch=x86_64\u0026distro=oracle-8.0" + "PURL": "pkg:rpm/oracle/curl@7.61.1-8.el8?arch=x86_64\u0026distro=oracle-8.0", + "UID": "6837a94bd82971ac" }, "InstalledVersion": "7.61.1-8.el8", "FixedVersion": "7.61.1-12.el8", diff --git a/integration/testdata/packagesprops.json.golden b/integration/testdata/packagesprops.json.golden index 5cce23a7c754..6eba4413ccad 100644 --- a/integration/testdata/packagesprops.json.golden +++ b/integration/testdata/packagesprops.json.golden @@ -25,7 +25,8 @@ "ID": "Newtonsoft.Json@9.0.1", "Name": "Newtonsoft.Json", "Identifier": { - "PURL": "pkg:nuget/Newtonsoft.Json@9.0.1" + "PURL": "pkg:nuget/Newtonsoft.Json@9.0.1", + "UID": "a391c576ea549d63" }, "Version": "9.0.1", "Layer": {} @@ -37,7 +38,8 @@ "PkgID": "Newtonsoft.Json@9.0.1", "PkgName": "Newtonsoft.Json", "PkgIdentifier": { - "PURL": "pkg:nuget/Newtonsoft.Json@9.0.1" + "PURL": "pkg:nuget/Newtonsoft.Json@9.0.1", + "UID": "a391c576ea549d63" }, "InstalledVersion": "9.0.1", "FixedVersion": "13.0.1", diff --git a/integration/testdata/photon-30.json.golden b/integration/testdata/photon-30.json.golden index 4e4c8d793faa..08597fd526ce 100644 --- a/integration/testdata/photon-30.json.golden +++ b/integration/testdata/photon-30.json.golden @@ -68,7 +68,8 @@ "PkgID": "bash@4.4.18-1.ph3.x86_64", "PkgName": "bash", "PkgIdentifier": { - "PURL": "pkg:rpm/photon/bash@4.4.18-1.ph3?arch=x86_64\u0026distro=photon-3.0" + "PURL": "pkg:rpm/photon/bash@4.4.18-1.ph3?arch=x86_64\u0026distro=photon-3.0", + "UID": "a092142482df7886" }, "InstalledVersion": "4.4.18-1.ph3", "FixedVersion": "4.4.18-2.ph3", @@ -131,7 +132,8 @@ "PkgID": "curl@7.61.1-4.ph3.x86_64", "PkgName": "curl", "PkgIdentifier": { - "PURL": "pkg:rpm/photon/curl@7.61.1-4.ph3?arch=x86_64\u0026distro=photon-3.0" + "PURL": "pkg:rpm/photon/curl@7.61.1-4.ph3?arch=x86_64\u0026distro=photon-3.0", + "UID": "1f44492024a630e8" }, "InstalledVersion": "7.61.1-4.ph3", "FixedVersion": "7.61.1-5.ph3", @@ -202,7 +204,8 @@ "PkgID": "curl-libs@7.61.1-4.ph3.x86_64", "PkgName": "curl-libs", "PkgIdentifier": { - "PURL": "pkg:rpm/photon/curl-libs@7.61.1-4.ph3?arch=x86_64\u0026distro=photon-3.0" + "PURL": "pkg:rpm/photon/curl-libs@7.61.1-4.ph3?arch=x86_64\u0026distro=photon-3.0", + "UID": "434cc417a46529a9" }, "InstalledVersion": "7.61.1-4.ph3", "FixedVersion": "7.61.1-5.ph3", diff --git a/integration/testdata/pip.json.golden b/integration/testdata/pip.json.golden index 29873d943d55..cc715f05357d 100644 --- a/integration/testdata/pip.json.golden +++ b/integration/testdata/pip.json.golden @@ -24,7 +24,8 @@ { "Name": "Flask", "Identifier": { - "PURL": "pkg:pypi/flask@2.0.0" + "PURL": "pkg:pypi/flask@2.0.0", + "UID": "301ccf5fd90d6082" }, "Version": "2.0.0", "Layer": {} @@ -32,7 +33,8 @@ { "Name": "Jinja2", "Identifier": { - "PURL": "pkg:pypi/jinja2@3.0.0" + "PURL": "pkg:pypi/jinja2@3.0.0", + "UID": "212193e1595e68cc" }, "Version": "3.0.0", "Layer": {} @@ -40,7 +42,8 @@ { "Name": "Werkzeug", "Identifier": { - "PURL": "pkg:pypi/werkzeug@0.11" + "PURL": "pkg:pypi/werkzeug@0.11", + "UID": "56b919b561299a48" }, "Version": "0.11", "Layer": {} @@ -48,7 +51,8 @@ { "Name": "click", "Identifier": { - "PURL": "pkg:pypi/click@8.0.0" + "PURL": "pkg:pypi/click@8.0.0", + "UID": "d58cb56b4e8b1ffd" }, "Version": "8.0.0", "Layer": {} @@ -56,7 +60,8 @@ { "Name": "itsdangerous", "Identifier": { - "PURL": "pkg:pypi/itsdangerous@2.0.0" + "PURL": "pkg:pypi/itsdangerous@2.0.0", + "UID": "9bf39d440e409733" }, "Version": "2.0.0", "Layer": {} @@ -64,7 +69,8 @@ { "Name": "oauth2-client", "Identifier": { - "PURL": "pkg:pypi/oauth2-client@4.0.0" + "PURL": "pkg:pypi/oauth2-client@4.0.0", + "UID": "ffc67df5ef686f77" }, "Version": "4.0.0", "Layer": {} @@ -72,7 +78,8 @@ { "Name": "python-gitlab", "Identifier": { - "PURL": "pkg:pypi/python-gitlab@2.0.0" + "PURL": "pkg:pypi/python-gitlab@2.0.0", + "UID": "f9cbb9736717c4d4" }, "Version": "2.0.0", "Layer": {} @@ -83,7 +90,8 @@ "VulnerabilityID": "CVE-2019-14806", "PkgName": "Werkzeug", "PkgIdentifier": { - "PURL": "pkg:pypi/werkzeug@0.11" + "PURL": "pkg:pypi/werkzeug@0.11", + "UID": "56b919b561299a48" }, "InstalledVersion": "0.11", "FixedVersion": "0.15.3", @@ -139,7 +147,8 @@ "VulnerabilityID": "CVE-2020-28724", "PkgName": "Werkzeug", "PkgIdentifier": { - "PURL": "pkg:pypi/werkzeug@0.11" + "PURL": "pkg:pypi/werkzeug@0.11", + "UID": "56b919b561299a48" }, "InstalledVersion": "0.11", "FixedVersion": "0.11.6", diff --git a/integration/testdata/pipenv.json.golden b/integration/testdata/pipenv.json.golden index e5076aa4571b..c8a317515ae6 100644 --- a/integration/testdata/pipenv.json.golden +++ b/integration/testdata/pipenv.json.golden @@ -24,7 +24,8 @@ { "Name": "werkzeug", "Identifier": { - "PURL": "pkg:pypi/werkzeug@0.11.1" + "PURL": "pkg:pypi/werkzeug@0.11.1", + "UID": "390fc5ac777dc4e0" }, "Version": "0.11.1", "Layer": {}, @@ -41,7 +42,8 @@ "VulnerabilityID": "CVE-2019-14806", "PkgName": "werkzeug", "PkgIdentifier": { - "PURL": "pkg:pypi/werkzeug@0.11.1" + "PURL": "pkg:pypi/werkzeug@0.11.1", + "UID": "390fc5ac777dc4e0" }, "InstalledVersion": "0.11.1", "FixedVersion": "0.15.3", @@ -97,7 +99,8 @@ "VulnerabilityID": "CVE-2020-28724", "PkgName": "werkzeug", "PkgIdentifier": { - "PURL": "pkg:pypi/werkzeug@0.11.1" + "PURL": "pkg:pypi/werkzeug@0.11.1", + "UID": "390fc5ac777dc4e0" }, "InstalledVersion": "0.11.1", "FixedVersion": "0.11.6", diff --git a/integration/testdata/pnpm.json.golden b/integration/testdata/pnpm.json.golden index 305552bf1f2a..1ae0c6400db0 100644 --- a/integration/testdata/pnpm.json.golden +++ b/integration/testdata/pnpm.json.golden @@ -26,7 +26,8 @@ "PkgID": "jquery@3.3.9", "PkgName": "jquery", "PkgIdentifier": { - "PURL": "pkg:npm/jquery@3.3.9" + "PURL": "pkg:npm/jquery@3.3.9", + "UID": "d002d4ebac4ee286" }, "InstalledVersion": "3.3.9", "FixedVersion": "3.4.0", @@ -158,7 +159,8 @@ "PkgID": "lodash@4.17.4", "PkgName": "lodash", "PkgIdentifier": { - "PURL": "pkg:npm/lodash@4.17.4" + "PURL": "pkg:npm/lodash@4.17.4", + "UID": "68507e8301071074" }, "InstalledVersion": "4.17.4", "FixedVersion": "4.17.12", diff --git a/integration/testdata/poetry.json.golden b/integration/testdata/poetry.json.golden index a17528965df9..f1ddf6802143 100644 --- a/integration/testdata/poetry.json.golden +++ b/integration/testdata/poetry.json.golden @@ -25,7 +25,8 @@ "ID": "click@8.1.3", "Name": "click", "Identifier": { - "PURL": "pkg:pypi/click@8.1.3" + "PURL": "pkg:pypi/click@8.1.3", + "UID": "37edb5c90a97272e" }, "Version": "8.1.3", "Relationship": "direct", @@ -38,7 +39,8 @@ "ID": "colorama@0.4.6", "Name": "colorama", "Identifier": { - "PURL": "pkg:pypi/colorama@0.4.6" + "PURL": "pkg:pypi/colorama@0.4.6", + "UID": "895013c17f373da3" }, "Version": "0.4.6", "Indirect": true, @@ -49,7 +51,8 @@ "ID": "werkzeug@0.14", "Name": "werkzeug", "Identifier": { - "PURL": "pkg:pypi/werkzeug@0.14" + "PURL": "pkg:pypi/werkzeug@0.14", + "UID": "4176be111ad01070" }, "Version": "0.14", "Relationship": "direct", @@ -62,7 +65,8 @@ "PkgID": "werkzeug@0.14", "PkgName": "werkzeug", "PkgIdentifier": { - "PURL": "pkg:pypi/werkzeug@0.14" + "PURL": "pkg:pypi/werkzeug@0.14", + "UID": "4176be111ad01070" }, "InstalledVersion": "0.14", "FixedVersion": "0.15.3", diff --git a/integration/testdata/pom.json.golden b/integration/testdata/pom.json.golden index 244817f1e4c7..a583f02ce8e9 100644 --- a/integration/testdata/pom.json.golden +++ b/integration/testdata/pom.json.golden @@ -26,7 +26,8 @@ "PkgID": "com.fasterxml.jackson.core:jackson-databind:2.9.1", "PkgName": "com.fasterxml.jackson.core:jackson-databind", "PkgIdentifier": { - "PURL": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.1" + "PURL": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.1", + "UID": "a704d87fd1c0b0e1" }, "InstalledVersion": "2.9.1", "FixedVersion": "2.9.10.4", @@ -91,7 +92,8 @@ "PkgID": "com.fasterxml.jackson.core:jackson-databind:2.9.1", "PkgName": "com.fasterxml.jackson.core:jackson-databind", "PkgIdentifier": { - "PURL": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.1" + "PURL": "pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.9.1", + "UID": "a704d87fd1c0b0e1" }, "InstalledVersion": "2.9.1", "FixedVersion": "2.9.10.7", diff --git a/integration/testdata/pubspec.lock.json.golden b/integration/testdata/pubspec.lock.json.golden index cd941a66652f..a96211ac9119 100644 --- a/integration/testdata/pubspec.lock.json.golden +++ b/integration/testdata/pubspec.lock.json.golden @@ -25,7 +25,8 @@ "ID": "http@0.13.2", "Name": "http", "Identifier": { - "PURL": "pkg:pub/http@0.13.2" + "PURL": "pkg:pub/http@0.13.2", + "UID": "b2aa9906ee615d4c" }, "Version": "0.13.2", "Relationship": "direct", @@ -35,7 +36,8 @@ "ID": "shelf@1.3.1", "Name": "shelf", "Identifier": { - "PURL": "pkg:pub/shelf@1.3.1" + "PURL": "pkg:pub/shelf@1.3.1", + "UID": "8367a65de5b4cda0" }, "Version": "1.3.1", "Indirect": true, @@ -49,7 +51,8 @@ "PkgID": "http@0.13.2", "PkgName": "http", "PkgIdentifier": { - "PURL": "pkg:pub/http@0.13.2" + "PURL": "pkg:pub/http@0.13.2", + "UID": "b2aa9906ee615d4c" }, "InstalledVersion": "0.13.2", "FixedVersion": "0.13.3", diff --git a/integration/testdata/rockylinux-8.json.golden b/integration/testdata/rockylinux-8.json.golden index 6d8b3b7a29a8..f6e377a49ca0 100644 --- a/integration/testdata/rockylinux-8.json.golden +++ b/integration/testdata/rockylinux-8.json.golden @@ -57,7 +57,8 @@ "PkgID": "openssl-libs@1.1.1k-4.el8.x86_64", "PkgName": "openssl-libs", "PkgIdentifier": { - "PURL": "pkg:rpm/rocky/openssl-libs@1.1.1k-4.el8?arch=x86_64\u0026distro=rocky-8.5\u0026epoch=1" + "PURL": "pkg:rpm/rocky/openssl-libs@1.1.1k-4.el8?arch=x86_64\u0026distro=rocky-8.5\u0026epoch=1", + "UID": "2a2f49f9bf5fc512" }, "InstalledVersion": "1:1.1.1k-4.el8", "FixedVersion": "1:1.1.1k-5.el8_5", diff --git a/integration/testdata/spring4shell-jre11.json.golden b/integration/testdata/spring4shell-jre11.json.golden index 7db6bae72bfa..98c49376cf53 100644 --- a/integration/testdata/spring4shell-jre11.json.golden +++ b/integration/testdata/spring4shell-jre11.json.golden @@ -199,7 +199,8 @@ "PkgName": "org.springframework:spring-beans", "PkgPath": "usr/local/tomcat/webapps/helloworld.war/WEB-INF/lib/spring-beans-5.3.15.jar", "PkgIdentifier": { - "PURL": "pkg:maven/org.springframework/spring-beans@5.3.15" + "PURL": "pkg:maven/org.springframework/spring-beans@5.3.15", + "UID": "9d9e0a303e263760" }, "InstalledVersion": "5.3.15", "FixedVersion": "5.3.18", diff --git a/integration/testdata/spring4shell-jre8.json.golden b/integration/testdata/spring4shell-jre8.json.golden index e1a0e9ee0457..45da22c7f39c 100644 --- a/integration/testdata/spring4shell-jre8.json.golden +++ b/integration/testdata/spring4shell-jre8.json.golden @@ -199,7 +199,8 @@ "PkgName": "org.springframework:spring-beans", "PkgPath": "usr/local/tomcat/webapps/helloworld.war/WEB-INF/lib/spring-beans-5.3.15.jar", "PkgIdentifier": { - "PURL": "pkg:maven/org.springframework/spring-beans@5.3.15" + "PURL": "pkg:maven/org.springframework/spring-beans@5.3.15", + "UID": "9d9e0a303e263760" }, "InstalledVersion": "5.3.15", "FixedVersion": "5.3.18", diff --git a/integration/testdata/swift.json.golden b/integration/testdata/swift.json.golden index 0a9d1ebffb21..bbd94884bf95 100644 --- a/integration/testdata/swift.json.golden +++ b/integration/testdata/swift.json.golden @@ -25,7 +25,8 @@ "ID": "github.com/apple/swift-atomics@1.1.0", "Name": "github.com/apple/swift-atomics", "Identifier": { - "PURL": "pkg:swift/github.com/apple/swift-atomics@1.1.0" + "PURL": "pkg:swift/github.com/apple/swift-atomics@1.1.0", + "UID": "863921f724d081f4" }, "Version": "1.1.0", "Layer": {}, @@ -40,7 +41,8 @@ "ID": "github.com/apple/swift-nio@2.41.0", "Name": "github.com/apple/swift-nio", "Identifier": { - "PURL": "pkg:swift/github.com/apple/swift-nio@2.41.0" + "PURL": "pkg:swift/github.com/apple/swift-nio@2.41.0", + "UID": "e98d348b22b3c01" }, "Version": "2.41.0", "Layer": {}, @@ -58,7 +60,8 @@ "PkgID": "github.com/apple/swift-nio@2.41.0", "PkgName": "github.com/apple/swift-nio", "PkgIdentifier": { - "PURL": "pkg:swift/github.com/apple/swift-nio@2.41.0" + "PURL": "pkg:swift/github.com/apple/swift-nio@2.41.0", + "UID": "e98d348b22b3c01" }, "InstalledVersion": "2.41.0", "FixedVersion": "2.29.1, 2.39.1, 2.42.0", diff --git a/integration/testdata/test-repo.json.golden b/integration/testdata/test-repo.json.golden index e1ebd91418f7..360ba1f3f097 100644 --- a/integration/testdata/test-repo.json.golden +++ b/integration/testdata/test-repo.json.golden @@ -26,7 +26,8 @@ "PkgID": "ammonia@1.9.0", "PkgName": "ammonia", "PkgIdentifier": { - "PURL": "pkg:cargo/ammonia@1.9.0" + "PURL": "pkg:cargo/ammonia@1.9.0", + "UID": "fa518cac41270ffe" }, "InstalledVersion": "1.9.0", "FixedVersion": "\u003e= 2.1.0", @@ -68,7 +69,8 @@ "PkgID": "ammonia@1.9.0", "PkgName": "ammonia", "PkgIdentifier": { - "PURL": "pkg:cargo/ammonia@1.9.0" + "PURL": "pkg:cargo/ammonia@1.9.0", + "UID": "fa518cac41270ffe" }, "InstalledVersion": "1.9.0", "FixedVersion": "\u003e= 3.1.0, \u003e= 2.1.3, \u003c 3.0.0", diff --git a/integration/testdata/ubi-7.json.golden b/integration/testdata/ubi-7.json.golden index 36062495c5a9..41d78d2be351 100644 --- a/integration/testdata/ubi-7.json.golden +++ b/integration/testdata/ubi-7.json.golden @@ -81,7 +81,8 @@ "PkgID": "bash@4.2.46-33.el7.x86_64", "PkgName": "bash", "PkgIdentifier": { - "PURL": "pkg:rpm/redhat/bash@4.2.46-33.el7?arch=x86_64\u0026distro=redhat-7.7" + "PURL": "pkg:rpm/redhat/bash@4.2.46-33.el7?arch=x86_64\u0026distro=redhat-7.7", + "UID": "f5b786381193ad1b" }, "InstalledVersion": "4.2.46-33.el7", "Status": "will_not_fix", diff --git a/integration/testdata/ubuntu-1804-ignore-unfixed.json.golden b/integration/testdata/ubuntu-1804-ignore-unfixed.json.golden index f2a38510385b..5ec55a3fc397 100644 --- a/integration/testdata/ubuntu-1804-ignore-unfixed.json.golden +++ b/integration/testdata/ubuntu-1804-ignore-unfixed.json.golden @@ -76,7 +76,8 @@ "PkgID": "e2fsprogs@1.44.1-1ubuntu1.1", "PkgName": "e2fsprogs", "PkgIdentifier": { - "PURL": "pkg:deb/ubuntu/e2fsprogs@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04" + "PURL": "pkg:deb/ubuntu/e2fsprogs@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04", + "UID": "ae80ec86b8816b6c" }, "InstalledVersion": "1.44.1-1ubuntu1.1", "FixedVersion": "1.44.1-1ubuntu1.2", @@ -146,7 +147,8 @@ "PkgID": "libcom-err2@1.44.1-1ubuntu1.1", "PkgName": "libcom-err2", "PkgIdentifier": { - "PURL": "pkg:deb/ubuntu/libcom-err2@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04" + "PURL": "pkg:deb/ubuntu/libcom-err2@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04", + "UID": "3c28244e063693a2" }, "InstalledVersion": "1.44.1-1ubuntu1.1", "FixedVersion": "1.44.1-1ubuntu1.2", @@ -216,7 +218,8 @@ "PkgID": "libext2fs2@1.44.1-1ubuntu1.1", "PkgName": "libext2fs2", "PkgIdentifier": { - "PURL": "pkg:deb/ubuntu/libext2fs2@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04" + "PURL": "pkg:deb/ubuntu/libext2fs2@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04", + "UID": "937ce6e3021ed568" }, "InstalledVersion": "1.44.1-1ubuntu1.1", "FixedVersion": "1.44.1-1ubuntu1.2", @@ -286,7 +289,8 @@ "PkgID": "libss2@1.44.1-1ubuntu1.1", "PkgName": "libss2", "PkgIdentifier": { - "PURL": "pkg:deb/ubuntu/libss2@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04" + "PURL": "pkg:deb/ubuntu/libss2@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04", + "UID": "7a50c6bc4279c93b" }, "InstalledVersion": "1.44.1-1ubuntu1.1", "FixedVersion": "1.44.1-1ubuntu1.2", diff --git a/integration/testdata/ubuntu-1804.json.golden b/integration/testdata/ubuntu-1804.json.golden index 5fc21dba6a6e..7ae275b7e5a6 100644 --- a/integration/testdata/ubuntu-1804.json.golden +++ b/integration/testdata/ubuntu-1804.json.golden @@ -76,7 +76,8 @@ "PkgID": "bash@4.4.18-2ubuntu1.2", "PkgName": "bash", "PkgIdentifier": { - "PURL": "pkg:deb/ubuntu/bash@4.4.18-2ubuntu1.2?arch=amd64\u0026distro=ubuntu-18.04" + "PURL": "pkg:deb/ubuntu/bash@4.4.18-2ubuntu1.2?arch=amd64\u0026distro=ubuntu-18.04", + "UID": "da318bd19a304cc0" }, "InstalledVersion": "4.4.18-2ubuntu1.2", "Status": "affected", @@ -138,7 +139,8 @@ "PkgID": "e2fsprogs@1.44.1-1ubuntu1.1", "PkgName": "e2fsprogs", "PkgIdentifier": { - "PURL": "pkg:deb/ubuntu/e2fsprogs@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04" + "PURL": "pkg:deb/ubuntu/e2fsprogs@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04", + "UID": "ae80ec86b8816b6c" }, "InstalledVersion": "1.44.1-1ubuntu1.1", "FixedVersion": "1.44.1-1ubuntu1.2", @@ -208,7 +210,8 @@ "PkgID": "libcom-err2@1.44.1-1ubuntu1.1", "PkgName": "libcom-err2", "PkgIdentifier": { - "PURL": "pkg:deb/ubuntu/libcom-err2@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04" + "PURL": "pkg:deb/ubuntu/libcom-err2@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04", + "UID": "3c28244e063693a2" }, "InstalledVersion": "1.44.1-1ubuntu1.1", "FixedVersion": "1.44.1-1ubuntu1.2", @@ -278,7 +281,8 @@ "PkgID": "libext2fs2@1.44.1-1ubuntu1.1", "PkgName": "libext2fs2", "PkgIdentifier": { - "PURL": "pkg:deb/ubuntu/libext2fs2@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04" + "PURL": "pkg:deb/ubuntu/libext2fs2@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04", + "UID": "937ce6e3021ed568" }, "InstalledVersion": "1.44.1-1ubuntu1.1", "FixedVersion": "1.44.1-1ubuntu1.2", @@ -348,7 +352,8 @@ "PkgID": "libss2@1.44.1-1ubuntu1.1", "PkgName": "libss2", "PkgIdentifier": { - "PURL": "pkg:deb/ubuntu/libss2@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04" + "PURL": "pkg:deb/ubuntu/libss2@1.44.1-1ubuntu1.1?arch=amd64\u0026distro=ubuntu-18.04", + "UID": "7a50c6bc4279c93b" }, "InstalledVersion": "1.44.1-1ubuntu1.1", "FixedVersion": "1.44.1-1ubuntu1.2", diff --git a/integration/testdata/yarn.json.golden b/integration/testdata/yarn.json.golden index 452dcd0172a6..16b6c37584a1 100644 --- a/integration/testdata/yarn.json.golden +++ b/integration/testdata/yarn.json.golden @@ -25,7 +25,8 @@ "ID": "jquery@3.2.1", "Name": "jquery", "Identifier": { - "PURL": "pkg:npm/jquery@3.2.1" + "PURL": "pkg:npm/jquery@3.2.1", + "UID": "c7da6fd622178ea0" }, "Version": "3.2.1", "Licenses": [ @@ -47,7 +48,8 @@ "PkgID": "jquery@3.2.1", "PkgName": "jquery", "PkgIdentifier": { - "PURL": "pkg:npm/jquery@3.2.1" + "PURL": "pkg:npm/jquery@3.2.1", + "UID": "c7da6fd622178ea0" }, "InstalledVersion": "3.2.1", "FixedVersion": "3.4.0", diff --git a/integration/vm_test.go b/integration/vm_test.go index 7ccc85f03994..78de5741e682 100644 --- a/integration/vm_test.go +++ b/integration/vm_test.go @@ -88,13 +88,13 @@ func TestVM(t *testing.T) { // Run "trivy vm" runTest(t, osArgs, tt.golden, "", types.FormatJSON, runOptions{ - override: func(_, got *types.Report) { + override: overrideFuncs(overrideUID, func(t *testing.T, _, got *types.Report) { got.ArtifactName = "disk.img" for i := range got.Results { lastIndex := strings.LastIndex(got.Results[i].Target, "/") got.Results[i].Target = got.Results[i].Target[lastIndex+1:] } - }, + }), }) }) } diff --git a/pkg/fanal/applier/applier_test.go b/pkg/fanal/applier/applier_test.go index 8037e0bee922..bea3f30fa0c5 100644 --- a/pkg/fanal/applier/applier_test.go +++ b/pkg/fanal/applier/applier_test.go @@ -151,6 +151,7 @@ func TestApplier_ApplyLayers(t *testing.T) { SrcName: "glibc", SrcVersion: "2.24-11+deb9u4", Identifier: types.PkgIdentifier{ + UID: "1565c6a375877d3d", PURL: &packageurl.PackageURL{ Type: packageurl.TypeDebian, Namespace: "debian", @@ -175,6 +176,7 @@ func TestApplier_ApplyLayers(t *testing.T) { SrcName: "tzdata", SrcVersion: "2019a-0+deb9u1", Identifier: types.PkgIdentifier{ + UID: "15974c575bfa26a7", PURL: &packageurl.PackageURL{ Type: packageurl.TypeDebian, Namespace: "debian", @@ -207,6 +209,7 @@ func TestApplier_ApplyLayers(t *testing.T) { DiffID: "sha256:24df0d4e20c0f42d3703bf1f1db2bdd77346c7956f74f423603d651e8e5ae8a7", }, Identifier: types.PkgIdentifier{ + UID: "38462330435c69bc", PURL: &packageurl.PackageURL{ Type: packageurl.TypeComposer, Namespace: "guzzlehttp", @@ -223,6 +226,7 @@ func TestApplier_ApplyLayers(t *testing.T) { DiffID: "sha256:24df0d4e20c0f42d3703bf1f1db2bdd77346c7956f74f423603d651e8e5ae8a7", }, Identifier: types.PkgIdentifier{ + UID: "ef7e3567678854cb", PURL: &packageurl.PackageURL{ Type: packageurl.TypeComposer, Namespace: "symfony", @@ -345,6 +349,7 @@ func TestApplier_ApplyLayers(t *testing.T) { Name: "busybox", Version: "1.30.1-r3", Identifier: types.PkgIdentifier{ + UID: "3bfef897b9fcc058", PURL: &packageurl.PackageURL{ Type: packageurl.TypeApk, Namespace: "alpine", @@ -367,6 +372,7 @@ func TestApplier_ApplyLayers(t *testing.T) { Name: "libcrypto1.1", Version: "1.1.1d-r2", Identifier: types.PkgIdentifier{ + UID: "a4495e1af163f55a", PURL: &packageurl.PackageURL{ Type: packageurl.TypeApk, Namespace: "alpine", @@ -389,6 +395,7 @@ func TestApplier_ApplyLayers(t *testing.T) { Name: "libssl1.1", Version: "1.1.1d-r2", Identifier: types.PkgIdentifier{ + UID: "4c683a33e3b7899c", PURL: &packageurl.PackageURL{ Type: packageurl.TypeApk, Namespace: "alpine", @@ -411,6 +418,7 @@ func TestApplier_ApplyLayers(t *testing.T) { Name: "musl", Version: "1.1.22-r3", Identifier: types.PkgIdentifier{ + UID: "bb9bd4dfce8858bf", PURL: &packageurl.PackageURL{ Type: packageurl.TypeApk, Namespace: "alpine", @@ -433,6 +441,7 @@ func TestApplier_ApplyLayers(t *testing.T) { Name: "openssl", Version: "1.1.1d-r2", Identifier: types.PkgIdentifier{ + UID: "3f6c865591e06595", //PURL: "pkg:apk/alpine/openssl@1.1.1d-r2?distro=3.10.4", PURL: &packageurl.PackageURL{ Type: packageurl.TypeApk, @@ -641,6 +650,9 @@ func TestApplier_ApplyLayers(t *testing.T) { Digest: "sha256:dffd9992ca398466a663c87c92cfea2a2db0ae0cf33fcb99da60eec52addbfc5", DiffID: "sha256:aad63a9339440e7c3e1fff2b988991b9bfb81280042fa7f39a5e327023056819", }, + Identifier: types.PkgIdentifier{ + UID: "1565c6a375877d3d", + }, }, { Name: "tzdata", @@ -651,6 +663,9 @@ func TestApplier_ApplyLayers(t *testing.T) { Digest: "sha256:932da51564135c98a49a34a193d6cd363d8fa4184d957fde16c9d8527b3f3b02", DiffID: "sha256:a187dde48cd289ac374ad8539930628314bc581a481cdb41409c9289419ddb72", }, + Identifier: types.PkgIdentifier{ + UID: "15974c575bfa26a7", + }, }, }, Applications: []types.Application{ @@ -666,6 +681,7 @@ func TestApplier_ApplyLayers(t *testing.T) { DiffID: "sha256:24df0d4e20c0f42d3703bf1f1db2bdd77346c7956f74f423603d651e8e5ae8a7", }, Identifier: types.PkgIdentifier{ + UID: "38462330435c69bc", PURL: &packageurl.PackageURL{ Type: packageurl.TypeComposer, Namespace: "guzzlehttp", @@ -682,6 +698,7 @@ func TestApplier_ApplyLayers(t *testing.T) { DiffID: "sha256:24df0d4e20c0f42d3703bf1f1db2bdd77346c7956f74f423603d651e8e5ae8a7", }, Identifier: types.PkgIdentifier{ + UID: "ef7e3567678854cb", PURL: &packageurl.PackageURL{ Type: packageurl.TypeComposer, Namespace: "symfony", @@ -859,6 +876,9 @@ func TestApplier_ApplyLayers(t *testing.T) { Digest: "sha256:932da51564135c98a49a34a193d6cd363d8fa4184d957fde16c9d8527b3f3b02", DiffID: "sha256:a187dde48cd289ac374ad8539930628314bc581a481cdb41409c9289419ddb72", }, + Identifier: types.PkgIdentifier{ + UID: "15974c575bfa26a7", + }, }, }, Applications: []types.Application{ @@ -874,6 +894,7 @@ func TestApplier_ApplyLayers(t *testing.T) { DiffID: "sha256:aad63a9339440e7c3e1fff2b988991b9bfb81280042fa7f39a5e327023056819", }, Identifier: types.PkgIdentifier{ + UID: "38462330435c69bc", PURL: &packageurl.PackageURL{ Type: packageurl.TypeComposer, Namespace: "guzzlehttp", @@ -890,6 +911,7 @@ func TestApplier_ApplyLayers(t *testing.T) { DiffID: "sha256:aad63a9339440e7c3e1fff2b988991b9bfb81280042fa7f39a5e327023056819", }, Identifier: types.PkgIdentifier{ + UID: "ef7e3567678854cb", PURL: &packageurl.PackageURL{ Type: packageurl.TypeComposer, Namespace: "symfony", diff --git a/pkg/fanal/applier/docker.go b/pkg/fanal/applier/docker.go index 0e9781edbca6..7640cfadaec6 100644 --- a/pkg/fanal/applier/docker.go +++ b/pkg/fanal/applier/docker.go @@ -6,6 +6,7 @@ import ( "time" "github.com/knqyf263/nested" + "github.com/mitchellh/hashstructure/v2" "github.com/package-url/packageurl-go" "github.com/samber/lo" @@ -208,18 +209,19 @@ func ApplyLayers(layers []ftypes.BlobInfo) ftypes.ArtifactDetail { for i, pkg := range mergedLayer.Packages { // Skip lookup for SBOM - if !lo.IsEmpty(pkg.Layer) { - continue - } - originLayerDigest, originLayerDiffID, buildInfo := lookupOriginLayerForPkg(pkg, layers) - mergedLayer.Packages[i].Layer = ftypes.Layer{ - Digest: originLayerDigest, - DiffID: originLayerDiffID, + if lo.IsEmpty(pkg.Layer) { + originLayerDigest, originLayerDiffID, buildInfo := lookupOriginLayerForPkg(pkg, layers) + mergedLayer.Packages[i].Layer = ftypes.Layer{ + Digest: originLayerDigest, + DiffID: originLayerDiffID, + } + mergedLayer.Packages[i].BuildInfo = buildInfo } - mergedLayer.Packages[i].BuildInfo = buildInfo + if mergedLayer.OS.Family != "" { mergedLayer.Packages[i].Identifier.PURL = newPURL(mergedLayer.OS.Family, types.Metadata{OS: &mergedLayer.OS}, pkg) } + mergedLayer.Packages[i].Identifier.UID = calcPkgUID("", pkg) // Only debian packages if licenses, ok := dpkgLicenses[pkg.Name]; ok { @@ -230,17 +232,17 @@ func ApplyLayers(layers []ftypes.BlobInfo) ftypes.ArtifactDetail { for _, app := range mergedLayer.Applications { for i, lib := range app.Libraries { // Skip lookup for SBOM - if !lo.IsEmpty(lib.Layer) { - continue - } - originLayerDigest, originLayerDiffID := lookupOriginLayerForLib(app.FilePath, lib, layers) - app.Libraries[i].Layer = ftypes.Layer{ - Digest: originLayerDigest, - DiffID: originLayerDiffID, + if lo.IsEmpty(lib.Layer) { + originLayerDigest, originLayerDiffID := lookupOriginLayerForLib(app.FilePath, lib, layers) + app.Libraries[i].Layer = ftypes.Layer{ + Digest: originLayerDigest, + DiffID: originLayerDiffID, + } } if lib.Identifier.PURL == nil { app.Libraries[i].Identifier.PURL = newPURL(app.Type, types.Metadata{}, lib) } + app.Libraries[i].Identifier.UID = calcPkgUID(app.FilePath, lib) } } @@ -259,6 +261,22 @@ func newPURL(pkgType ftypes.TargetType, metadata types.Metadata, pkg ftypes.Pack return p.Unwrap() } +// calcPkgUID calculates the hash of the package for the unique ID +func calcPkgUID(filePath string, pkg ftypes.Package) string { + v := map[string]any{ + "filePath": filePath, // To differentiate the hash of the same package but different file path + "pkg": pkg, + } + hash, err := hashstructure.Hash(v, hashstructure.FormatV2, &hashstructure.HashOptions{ + ZeroNil: true, + IgnoreZeroValue: true, + }) + if err != nil { + log.Warn("Failed to calculate the package hash", log.String("pkg", pkg.Name), log.Err(err)) + } + return fmt.Sprintf("%x", hash) +} + // aggregate merges all packages installed by pip/gem/npm/jar/conda into each application func aggregate(detail *ftypes.ArtifactDetail) { var apps []ftypes.Application diff --git a/pkg/fanal/applier/docker_test.go b/pkg/fanal/applier/docker_test.go index 425930b9ba2e..9a5f043c6e3c 100644 --- a/pkg/fanal/applier/docker_test.go +++ b/pkg/fanal/applier/docker_test.go @@ -145,6 +145,7 @@ func TestApplyLayers(t *testing.T) { Version: "1.2.4", Release: "4.5.8", Identifier: types.PkgIdentifier{ + UID: "108c0f3943d7bc9", PURL: &packageurl.PackageURL{ Type: packageurl.TypeApk, Namespace: "alpine", @@ -168,6 +169,7 @@ func TestApplyLayers(t *testing.T) { Version: "1.2.3", Release: "4.5.6", Identifier: types.PkgIdentifier{ + UID: "9d77cb17d1fc8736", PURL: &packageurl.PackageURL{ Type: packageurl.TypeApk, Namespace: "alpine", @@ -200,6 +202,7 @@ func TestApplyLayers(t *testing.T) { DiffID: "sha256:a187dde48cd289ac374ad8539930628314bc581a481cdb41409c9289419ddb72", }, Identifier: types.PkgIdentifier{ + UID: "b3549e98a3094a66", PURL: &packageurl.PackageURL{ Type: packageurl.TypeGem, Name: "activesupport", @@ -216,6 +219,7 @@ func TestApplyLayers(t *testing.T) { DiffID: "sha256:a187dde48cd289ac374ad8539930628314bc581a481cdb41409c9289419ddb72", }, Identifier: types.PkgIdentifier{ + UID: "f27f3b46e09fc2e2", PURL: &packageurl.PackageURL{ Type: packageurl.TypeGem, Name: "gon", @@ -237,6 +241,7 @@ func TestApplyLayers(t *testing.T) { DiffID: "sha256:a187dde48cd289ac374ad8539930628314bc581a481cdb41409c9289419ddb72", }, Identifier: types.PkgIdentifier{ + UID: "a3363562b587cfa2", PURL: &packageurl.PackageURL{ Type: packageurl.TypeGem, Name: "gemlibrary1", @@ -310,6 +315,25 @@ func TestApplyLayers(t *testing.T) { Digest: "sha256:e67fdae3559346105027c63e7fb032bba57e62b1fe9f2da23e6fdfb56384e00b", DiffID: "sha256:633f5bf471f7595b236a21e62dc60beef321db45916363a02ad5af02d794d497", }, + Identifier: types.PkgIdentifier{ + UID: "e984be704d7e13ef", + PURL: &packageurl.PackageURL{ + Type: packageurl.TypeDebian, + Namespace: "debian", + Name: "adduser", + Version: "3.118+deb11u1", + Qualifiers: packageurl.Qualifiers{ + { + Key: "arch", + Value: "all", + }, + { + Key: "distro", + Value: "debian-11.8", + }, + }, + }, + }, }, }, Applications: []types.Application{ @@ -323,6 +347,14 @@ func TestApplyLayers(t *testing.T) { Layer: types.Layer{ DiffID: "sha256:1def056a3160854c9395aa76282dd62172ec08c18a5fa03bb7d50a777c15ba99", }, + Identifier: types.PkgIdentifier{ + UID: "8d8c54cecea3dd33", + PURL: &packageurl.PackageURL{ + Type: packageurl.TypePyPi, + Name: "pip", + Version: "23.0.1", + }, + }, }, }, }, @@ -462,6 +494,7 @@ func TestApplyLayers(t *testing.T) { DiffID: "sha256:a187dde48cd289ac374ad8539930628314bc581a481cdb41409c9289419ddb72", }, Identifier: types.PkgIdentifier{ + UID: "9744e21755aea0ef", PURL: &packageurl.PackageURL{ Type: packageurl.TypeGem, Name: "rack", @@ -477,6 +510,7 @@ func TestApplyLayers(t *testing.T) { DiffID: "sha256:aad63a9339440e7c3e1fff2b988991b9bfb81280042fa7f39a5e327023056819", }, Identifier: types.PkgIdentifier{ + UID: "7e9712137f044ffe", PURL: &packageurl.PackageURL{ Type: packageurl.TypeGem, Name: "rails", @@ -498,6 +532,7 @@ func TestApplyLayers(t *testing.T) { DiffID: "sha256:aad63a9339440e7c3e1fff2b988991b9bfb81280042fa7f39a5e327023056819", }, Identifier: types.PkgIdentifier{ + UID: "940351428c1fed49", PURL: &packageurl.PackageURL{ Type: packageurl.TypeComposer, Name: "phplibrary1", @@ -761,6 +796,7 @@ func TestApplyLayers(t *testing.T) { Release: "4.5.7", Licenses: []string{"GPL-2"}, Identifier: types.PkgIdentifier{ + UID: "c3c9ea1442ead294", PURL: &packageurl.PackageURL{ Type: packageurl.TypeDebian, Namespace: "debian", @@ -785,6 +821,7 @@ func TestApplyLayers(t *testing.T) { Release: "4.5.6", Licenses: []string{"OpenSSL"}, Identifier: types.PkgIdentifier{ + UID: "9d77cb17d1fc8736", PURL: &packageurl.PackageURL{ Type: packageurl.TypeDebian, Namespace: "debian", @@ -935,6 +972,7 @@ func TestApplyLayers(t *testing.T) { Version: "5.6.7", Release: "8", Identifier: types.PkgIdentifier{ + UID: "3982c06acacff066", PURL: &packageurl.PackageURL{ Type: packageurl.TypeRPM, Namespace: "redhat", @@ -962,6 +1000,7 @@ func TestApplyLayers(t *testing.T) { Version: "1.2.4", Release: "5", Identifier: types.PkgIdentifier{ + UID: "8a72001605297eac", PURL: &packageurl.PackageURL{ Type: packageurl.TypeRPM, Namespace: "redhat", @@ -991,6 +1030,7 @@ func TestApplyLayers(t *testing.T) { Version: "1.2.3", Release: "4", Identifier: types.PkgIdentifier{ + UID: "8de1ca1c33881bac", PURL: &packageurl.PackageURL{ Type: packageurl.TypeRPM, Namespace: "redhat", @@ -1018,6 +1058,86 @@ func TestApplyLayers(t *testing.T) { }, }, }, + { + name: "same package but different file path", // different hashes + inputLayers: []types.BlobInfo{ + { + SchemaVersion: 1, + Digest: "sha256:932da51564135c98a49a34a193d6cd363d8fa4184d957fde16c9d8527b3f3b02", + DiffID: "sha256:a187dde48cd289ac374ad8539930628314bc581a481cdb41409c9289419ddb72", + Applications: []types.Application{ + { + Type: types.Bundler, + FilePath: "app1/Gemfile.lock", + Libraries: types.Packages{ + { + Name: "gemlibrary1", + Version: "1.2.3", + }, + }, + }, + { + Type: types.Bundler, + FilePath: "app2/Gemfile.lock", + Libraries: types.Packages{ + { + Name: "gemlibrary1", + Version: "1.2.3", + }, + }, + }, + }, + }, + }, + want: types.ArtifactDetail{ + Applications: []types.Application{ + { + Type: types.Bundler, + FilePath: "app1/Gemfile.lock", + Libraries: types.Packages{ + { + Name: "gemlibrary1", + Version: "1.2.3", + Layer: types.Layer{ + Digest: "sha256:932da51564135c98a49a34a193d6cd363d8fa4184d957fde16c9d8527b3f3b02", + DiffID: "sha256:a187dde48cd289ac374ad8539930628314bc581a481cdb41409c9289419ddb72", + }, + Identifier: types.PkgIdentifier{ + UID: "176111c6c0c6488", // different hash + PURL: &packageurl.PackageURL{ + Type: packageurl.TypeGem, + Name: "gemlibrary1", + Version: "1.2.3", + }, + }, + }, + }, + }, + { + Type: types.Bundler, + FilePath: "app2/Gemfile.lock", + Libraries: types.Packages{ + { + Name: "gemlibrary1", + Version: "1.2.3", + Layer: types.Layer{ + Digest: "sha256:932da51564135c98a49a34a193d6cd363d8fa4184d957fde16c9d8527b3f3b02", + DiffID: "sha256:a187dde48cd289ac374ad8539930628314bc581a481cdb41409c9289419ddb72", + }, + Identifier: types.PkgIdentifier{ + UID: "e1416731a0829253", // different hash + PURL: &packageurl.PackageURL{ + Type: packageurl.TypeGem, + Name: "gemlibrary1", + Version: "1.2.3", + }, + }, + }, + }, + }, + }, + }, + }, } for _, tt := range tests { diff --git a/pkg/fanal/artifact/vm/vm_test.go b/pkg/fanal/artifact/vm/vm_test.go index 445707c8739b..b510662a2dbf 100644 --- a/pkg/fanal/artifact/vm/vm_test.go +++ b/pkg/fanal/artifact/vm/vm_test.go @@ -14,7 +14,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - xio "github.com/aquasecurity/trivy/pkg/x/io" "github.com/aquasecurity/trivy/pkg/fanal/analyzer" "github.com/aquasecurity/trivy/pkg/fanal/artifact" "github.com/aquasecurity/trivy/pkg/fanal/artifact/vm" @@ -22,6 +21,7 @@ import ( "github.com/aquasecurity/trivy/pkg/fanal/types" "github.com/aquasecurity/trivy/pkg/fanal/walker" "github.com/aquasecurity/trivy/pkg/misconf" + xio "github.com/aquasecurity/trivy/pkg/x/io" _ "github.com/aquasecurity/trivy/pkg/fanal/analyzer/os/alpine" _ "github.com/aquasecurity/trivy/pkg/fanal/analyzer/pkg/apk" diff --git a/pkg/fanal/test/integration/testdata/goldens/packages/alpine-310.json.golden b/pkg/fanal/test/integration/testdata/goldens/packages/alpine-310.json.golden index ff6de7ec239e..32513f398b9f 100644 --- a/pkg/fanal/test/integration/testdata/goldens/packages/alpine-310.json.golden +++ b/pkg/fanal/test/integration/testdata/goldens/packages/alpine-310.json.golden @@ -3,7 +3,8 @@ "ID": "alpine-baselayout@3.1.2-r0", "Name": "alpine-baselayout", "Identifier": { - "PURL": "pkg:apk/alpine/alpine-baselayout@3.1.2-r0?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/alpine-baselayout@3.1.2-r0?arch=x86_64\u0026distro=3.10.2", + "UID": "3ca42aecf84bfa9" }, "Version": "3.1.2-r0", "Arch": "x86_64", @@ -53,7 +54,8 @@ "ID": "alpine-keys@2.1-r2", "Name": "alpine-keys", "Identifier": { - "PURL": "pkg:apk/alpine/alpine-keys@2.1-r2?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/alpine-keys@2.1-r2?arch=x86_64\u0026distro=3.10.2", + "UID": "c8139a25abdfb636" }, "Version": "2.1-r2", "Arch": "x86_64", @@ -92,7 +94,8 @@ "ID": "apk-tools@2.10.4-r2", "Name": "apk-tools", "Identifier": { - "PURL": "pkg:apk/alpine/apk-tools@2.10.4-r2?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/apk-tools@2.10.4-r2?arch=x86_64\u0026distro=3.10.2", + "UID": "fa7ca40ce236844e" }, "Version": "2.10.4-r2", "Arch": "x86_64", @@ -120,7 +123,8 @@ "ID": "busybox@1.30.1-r2", "Name": "busybox", "Identifier": { - "PURL": "pkg:apk/alpine/busybox@1.30.1-r2?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/busybox@1.30.1-r2?arch=x86_64\u0026distro=3.10.2", + "UID": "1941d9acbebe7f44" }, "Version": "1.30.1-r2", "Arch": "x86_64", @@ -150,7 +154,8 @@ "ID": "ca-certificates-cacert@20190108-r0", "Name": "ca-certificates-cacert", "Identifier": { - "PURL": "pkg:apk/alpine/ca-certificates-cacert@20190108-r0?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/ca-certificates-cacert@20190108-r0?arch=x86_64\u0026distro=3.10.2", + "UID": "9b1db91ad655d76c" }, "Version": "20190108-r0", "Arch": "x86_64", @@ -173,7 +178,8 @@ "ID": "libc-utils@0.7.1-r0", "Name": "libc-utils", "Identifier": { - "PURL": "pkg:apk/alpine/libc-utils@0.7.1-r0?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/libc-utils@0.7.1-r0?arch=x86_64\u0026distro=3.10.2", + "UID": "53fe480444a44c6e" }, "Version": "0.7.1-r0", "Arch": "x86_64", @@ -195,7 +201,8 @@ "ID": "libcrypto1.1@1.1.1c-r0", "Name": "libcrypto1.1", "Identifier": { - "PURL": "pkg:apk/alpine/libcrypto1.1@1.1.1c-r0?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/libcrypto1.1@1.1.1c-r0?arch=x86_64\u0026distro=3.10.2", + "UID": "c6c116a4441ec6de" }, "Version": "1.1.1c-r0", "Arch": "x86_64", @@ -231,7 +238,8 @@ "ID": "libssl1.1@1.1.1c-r0", "Name": "libssl1.1", "Identifier": { - "PURL": "pkg:apk/alpine/libssl1.1@1.1.1c-r0?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/libssl1.1@1.1.1c-r0?arch=x86_64\u0026distro=3.10.2", + "UID": "e132dcfcc51772ef" }, "Version": "1.1.1c-r0", "Arch": "x86_64", @@ -258,7 +266,8 @@ "ID": "libtls-standalone@2.9.1-r0", "Name": "libtls-standalone", "Identifier": { - "PURL": "pkg:apk/alpine/libtls-standalone@2.9.1-r0?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/libtls-standalone@2.9.1-r0?arch=x86_64\u0026distro=3.10.2", + "UID": "578e2c441f445479" }, "Version": "2.9.1-r0", "Arch": "x86_64", @@ -287,7 +296,8 @@ "ID": "musl@1.1.22-r3", "Name": "musl", "Identifier": { - "PURL": "pkg:apk/alpine/musl@1.1.22-r3?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/musl@1.1.22-r3?arch=x86_64\u0026distro=3.10.2", + "UID": "796d455bf42e5034" }, "Version": "1.1.22-r3", "Arch": "x86_64", @@ -310,7 +320,8 @@ "ID": "musl-utils@1.1.22-r3", "Name": "musl-utils", "Identifier": { - "PURL": "pkg:apk/alpine/musl-utils@1.1.22-r3?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/musl-utils@1.1.22-r3?arch=x86_64\u0026distro=3.10.2", + "UID": "40edadcb74964baa" }, "Version": "1.1.22-r3", "Arch": "x86_64", @@ -342,7 +353,8 @@ "ID": "scanelf@1.2.3-r0", "Name": "scanelf", "Identifier": { - "PURL": "pkg:apk/alpine/scanelf@1.2.3-r0?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/scanelf@1.2.3-r0?arch=x86_64\u0026distro=3.10.2", + "UID": "6e5cf642f47e44d0" }, "Version": "1.2.3-r0", "Arch": "x86_64", @@ -367,7 +379,8 @@ "ID": "ssl_client@1.30.1-r2", "Name": "ssl_client", "Identifier": { - "PURL": "pkg:apk/alpine/ssl_client@1.30.1-r2?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/ssl_client@1.30.1-r2?arch=x86_64\u0026distro=3.10.2", + "UID": "3338164dd993d2c8" }, "Version": "1.30.1-r2", "Arch": "x86_64", @@ -393,7 +406,8 @@ "ID": "zlib@1.2.11-r1", "Name": "zlib", "Identifier": { - "PURL": "pkg:apk/alpine/zlib@1.2.11-r1?arch=x86_64\u0026distro=3.10.2" + "PURL": "pkg:apk/alpine/zlib@1.2.11-r1?arch=x86_64\u0026distro=3.10.2", + "UID": "73011a6749e0754a" }, "Version": "1.2.11-r1", "Arch": "x86_64", diff --git a/pkg/fanal/test/integration/testdata/goldens/packages/vulnimage.json.golden b/pkg/fanal/test/integration/testdata/goldens/packages/vulnimage.json.golden index d6e7df5676d6..4bfbb16a3dff 100644 --- a/pkg/fanal/test/integration/testdata/goldens/packages/vulnimage.json.golden +++ b/pkg/fanal/test/integration/testdata/goldens/packages/vulnimage.json.golden @@ -3,7 +3,8 @@ "ID": ".composer-phpext-rundeps@0", "Name": ".composer-phpext-rundeps", "Identifier": { - "PURL": "pkg:apk/alpine/.composer-phpext-rundeps@0?arch=noarch\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/.composer-phpext-rundeps@0?arch=noarch\u0026distro=3.7.1", + "UID": "6a71fef044f9139b" }, "Version": "0", "Arch": "noarch", @@ -22,7 +23,8 @@ "ID": ".persistent-deps@0", "Name": ".persistent-deps", "Identifier": { - "PURL": "pkg:apk/alpine/.persistent-deps@0?arch=noarch\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/.persistent-deps@0?arch=noarch\u0026distro=3.7.1", + "UID": "6f77911c02034886" }, "Version": "0", "Arch": "noarch", @@ -43,7 +45,8 @@ "ID": ".php-rundeps@0", "Name": ".php-rundeps", "Identifier": { - "PURL": "pkg:apk/alpine/.php-rundeps@0?arch=noarch\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/.php-rundeps@0?arch=noarch\u0026distro=3.7.1", + "UID": "5aa1e73ffa97555a" }, "Version": "0", "Arch": "noarch", @@ -67,7 +70,8 @@ "ID": "alpine-baselayout@3.0.5-r2", "Name": "alpine-baselayout", "Identifier": { - "PURL": "pkg:apk/alpine/alpine-baselayout@3.0.5-r2?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/alpine-baselayout@3.0.5-r2?arch=x86_64\u0026distro=3.7.1", + "UID": "fb3e0109c30ad75d" }, "Version": "3.0.5-r2", "Arch": "x86_64", @@ -118,7 +122,8 @@ "ID": "alpine-keys@2.1-r1", "Name": "alpine-keys", "Identifier": { - "PURL": "pkg:apk/alpine/alpine-keys@2.1-r1?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/alpine-keys@2.1-r1?arch=x86_64\u0026distro=3.7.1", + "UID": "6a7b3011335f9352" }, "Version": "2.1-r1", "Arch": "x86_64", @@ -157,7 +162,8 @@ "ID": "apk-tools@2.10.1-r0", "Name": "apk-tools", "Identifier": { - "PURL": "pkg:apk/alpine/apk-tools@2.10.1-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/apk-tools@2.10.1-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "44e4204bb4dc2b2a" }, "Version": "2.10.1-r0", "Arch": "x86_64", @@ -185,7 +191,8 @@ "ID": "apr@1.6.3-r0", "Name": "apr", "Identifier": { - "PURL": "pkg:apk/alpine/apr@1.6.3-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/apr@1.6.3-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "715dd499dcec48f9" }, "Version": "1.6.3-r0", "Arch": "x86_64", @@ -213,7 +220,8 @@ "ID": "apr-util@1.6.1-r1", "Name": "apr-util", "Identifier": { - "PURL": "pkg:apk/alpine/apr-util@1.6.1-r1?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/apr-util@1.6.1-r1?arch=x86_64\u0026distro=3.7.1", + "UID": "2aa1dd25c68a60eb" }, "Version": "1.6.1-r1", "Arch": "x86_64", @@ -244,7 +252,8 @@ "ID": "bash@4.4.19-r1", "Name": "bash", "Identifier": { - "PURL": "pkg:apk/alpine/bash@4.4.19-r1?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/bash@4.4.19-r1?arch=x86_64\u0026distro=3.7.1", + "UID": "32e82b55d6afc293" }, "Version": "4.4.19-r1", "Arch": "x86_64", @@ -358,7 +367,8 @@ "ID": "busybox@1.27.2-r11", "Name": "busybox", "Identifier": { - "PURL": "pkg:apk/alpine/busybox@1.27.2-r11?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/busybox@1.27.2-r11?arch=x86_64\u0026distro=3.7.1", + "UID": "e32c8aeae1daa385" }, "Version": "1.27.2-r11", "Arch": "x86_64", @@ -388,7 +398,8 @@ "ID": "ca-certificates@20171114-r0", "Name": "ca-certificates", "Identifier": { - "PURL": "pkg:apk/alpine/ca-certificates@20171114-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/ca-certificates@20171114-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "fc49474e56f2cdca" }, "Version": "20171114-r0", "Arch": "x86_64", @@ -571,7 +582,8 @@ "ID": "curl@7.61.0-r0", "Name": "curl", "Identifier": { - "PURL": "pkg:apk/alpine/curl@7.61.0-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/curl@7.61.0-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "9161a384fc3be35a" }, "Version": "7.61.0-r0", "Arch": "x86_64", @@ -599,7 +611,8 @@ "ID": "db@5.3.28-r0", "Name": "db", "Identifier": { - "PURL": "pkg:apk/alpine/db@5.3.28-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/db@5.3.28-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "fb760539eab5fe62" }, "Version": "5.3.28-r0", "Arch": "x86_64", @@ -624,7 +637,8 @@ "ID": "expat@2.2.5-r0", "Name": "expat", "Identifier": { - "PURL": "pkg:apk/alpine/expat@2.2.5-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/expat@2.2.5-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "617bea3266e3407" }, "Version": "2.2.5-r0", "Arch": "x86_64", @@ -651,7 +665,8 @@ "ID": "gdbm@1.13-r1", "Name": "gdbm", "Identifier": { - "PURL": "pkg:apk/alpine/gdbm@1.13-r1?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/gdbm@1.13-r1?arch=x86_64\u0026distro=3.7.1", + "UID": "eb4b3efac8d4d73f" }, "Version": "1.13-r1", "Arch": "x86_64", @@ -682,7 +697,8 @@ "ID": "git@2.15.2-r0", "Name": "git", "Identifier": { - "PURL": "pkg:apk/alpine/git@2.15.2-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/git@2.15.2-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "845b6214d48ea80e" }, "Version": "2.15.2-r0", "Arch": "x86_64", @@ -901,7 +917,8 @@ "ID": "libbz2@1.0.6-r6", "Name": "libbz2", "Identifier": { - "PURL": "pkg:apk/alpine/libbz2@1.0.6-r6?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libbz2@1.0.6-r6?arch=x86_64\u0026distro=3.7.1", + "UID": "bc5027058e147d99" }, "Version": "1.0.6-r6", "Arch": "x86_64", @@ -927,7 +944,8 @@ "ID": "libc-utils@0.7.1-r0", "Name": "libc-utils", "Identifier": { - "PURL": "pkg:apk/alpine/libc-utils@0.7.1-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libc-utils@0.7.1-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "486e6fc636a30805" }, "Version": "0.7.1-r0", "Arch": "x86_64", @@ -949,7 +967,8 @@ "ID": "libcurl@7.61.1-r0", "Name": "libcurl", "Identifier": { - "PURL": "pkg:apk/alpine/libcurl@7.61.1-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libcurl@7.61.1-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "39cb881b68d4d86" }, "Version": "7.61.1-r0", "Arch": "x86_64", @@ -980,7 +999,8 @@ "ID": "libedit@20170329.3.1-r3", "Name": "libedit", "Identifier": { - "PURL": "pkg:apk/alpine/libedit@20170329.3.1-r3?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libedit@20170329.3.1-r3?arch=x86_64\u0026distro=3.7.1", + "UID": "d579817be3cf172e" }, "Version": "20170329.3.1-r3", "Arch": "x86_64", @@ -1007,7 +1027,8 @@ "ID": "libffi@3.2.1-r4", "Name": "libffi", "Identifier": { - "PURL": "pkg:apk/alpine/libffi@3.2.1-r4?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libffi@3.2.1-r4?arch=x86_64\u0026distro=3.7.1", + "UID": "742cc1cdc4bc5c97" }, "Version": "3.2.1-r4", "Arch": "x86_64", @@ -1033,7 +1054,8 @@ "ID": "libressl@2.6.5-r0", "Name": "libressl", "Identifier": { - "PURL": "pkg:apk/alpine/libressl@2.6.5-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libressl@2.6.5-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "af5b603971965a1d" }, "Version": "2.6.5-r0", "Arch": "x86_64", @@ -1062,7 +1084,8 @@ "ID": "libressl2.6-libcrypto@2.6.5-r0", "Name": "libressl2.6-libcrypto", "Identifier": { - "PURL": "pkg:apk/alpine/libressl2.6-libcrypto@2.6.5-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libressl2.6-libcrypto@2.6.5-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "da55f7ea92a187ed" }, "Version": "2.6.5-r0", "Arch": "x86_64", @@ -1093,7 +1116,8 @@ "ID": "libressl2.6-libssl@2.6.5-r0", "Name": "libressl2.6-libssl", "Identifier": { - "PURL": "pkg:apk/alpine/libressl2.6-libssl@2.6.5-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libressl2.6-libssl@2.6.5-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "e29c3e48f6adbae8" }, "Version": "2.6.5-r0", "Arch": "x86_64", @@ -1122,7 +1146,8 @@ "ID": "libressl2.6-libtls@2.6.5-r0", "Name": "libressl2.6-libtls", "Identifier": { - "PURL": "pkg:apk/alpine/libressl2.6-libtls@2.6.5-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libressl2.6-libtls@2.6.5-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "43debd6f8f000ce9" }, "Version": "2.6.5-r0", "Arch": "x86_64", @@ -1152,7 +1177,8 @@ "ID": "libsasl@2.1.26-r11", "Name": "libsasl", "Identifier": { - "PURL": "pkg:apk/alpine/libsasl@2.1.26-r11?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libsasl@2.1.26-r11?arch=x86_64\u0026distro=3.7.1", + "UID": "e3a28098ef8cd138" }, "Version": "2.1.26-r11", "Arch": "x86_64", @@ -1188,7 +1214,8 @@ "ID": "libsodium@1.0.15-r0", "Name": "libsodium", "Identifier": { - "PURL": "pkg:apk/alpine/libsodium@1.0.15-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libsodium@1.0.15-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "c69c7ea7978a25e3" }, "Version": "1.0.15-r0", "Arch": "x86_64", @@ -1214,7 +1241,8 @@ "ID": "libssh2@1.8.0-r2", "Name": "libssh2", "Identifier": { - "PURL": "pkg:apk/alpine/libssh2@1.8.0-r2?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libssh2@1.8.0-r2?arch=x86_64\u0026distro=3.7.1", + "UID": "3bffc81dc8d84ee0" }, "Version": "1.8.0-r2", "Arch": "x86_64", @@ -1242,7 +1270,8 @@ "ID": "libuuid@2.31-r0", "Name": "libuuid", "Identifier": { - "PURL": "pkg:apk/alpine/libuuid@2.31-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libuuid@2.31-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "ec8a9d1580eb93d7" }, "Version": "2.31-r0", "Arch": "x86_64", @@ -1273,7 +1302,8 @@ "ID": "libxml2@2.9.7-r0", "Name": "libxml2", "Identifier": { - "PURL": "pkg:apk/alpine/libxml2@2.9.7-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/libxml2@2.9.7-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "fb90495b3dc37892" }, "Version": "2.9.7-r0", "Arch": "x86_64", @@ -1300,7 +1330,8 @@ "ID": "mercurial@4.5.2-r0", "Name": "mercurial", "Identifier": { - "PURL": "pkg:apk/alpine/mercurial@4.5.2-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/mercurial@4.5.2-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "28d12c554475942a" }, "Version": "4.5.2-r0", "Arch": "x86_64", @@ -2044,7 +2075,8 @@ "ID": "musl@1.1.18-r3", "Name": "musl", "Identifier": { - "PURL": "pkg:apk/alpine/musl@1.1.18-r3?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/musl@1.1.18-r3?arch=x86_64\u0026distro=3.7.1", + "UID": "2888024f672bbd23" }, "Version": "1.1.18-r3", "Arch": "x86_64", @@ -2067,7 +2099,8 @@ "ID": "musl-utils@1.1.18-r3", "Name": "musl-utils", "Identifier": { - "PURL": "pkg:apk/alpine/musl-utils@1.1.18-r3?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/musl-utils@1.1.18-r3?arch=x86_64\u0026distro=3.7.1", + "UID": "c2765ad0d8dd83f9" }, "Version": "1.1.18-r3", "Arch": "x86_64", @@ -2099,7 +2132,8 @@ "ID": "ncurses-libs@6.0_p20171125-r1", "Name": "ncurses-libs", "Identifier": { - "PURL": "pkg:apk/alpine/ncurses-libs@6.0_p20171125-r1?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/ncurses-libs@6.0_p20171125-r1?arch=x86_64\u0026distro=3.7.1", + "UID": "d5320ac17433cd9a" }, "Version": "6.0_p20171125-r1", "Arch": "x86_64", @@ -2134,7 +2168,8 @@ "ID": "ncurses-terminfo@6.0_p20171125-r1", "Name": "ncurses-terminfo", "Identifier": { - "PURL": "pkg:apk/alpine/ncurses-terminfo@6.0_p20171125-r1?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/ncurses-terminfo@6.0_p20171125-r1?arch=x86_64\u0026distro=3.7.1", + "UID": "45885ee497b379d2" }, "Version": "6.0_p20171125-r1", "Arch": "x86_64", @@ -4887,7 +4922,8 @@ "ID": "ncurses-terminfo-base@6.0_p20171125-r1", "Name": "ncurses-terminfo-base", "Identifier": { - "PURL": "pkg:apk/alpine/ncurses-terminfo-base@6.0_p20171125-r1?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/ncurses-terminfo-base@6.0_p20171125-r1?arch=x86_64\u0026distro=3.7.1", + "UID": "4679519d850307b7" }, "Version": "6.0_p20171125-r1", "Arch": "x86_64", @@ -4922,7 +4958,8 @@ "ID": "openssh@7.5_p1-r9", "Name": "openssh", "Identifier": { - "PURL": "pkg:apk/alpine/openssh@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/openssh@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1", + "UID": "fa7d7dc4eb75b48a" }, "Version": "7.5_p1-r9", "Arch": "x86_64", @@ -4951,7 +4988,8 @@ "ID": "openssh-client@7.5_p1-r9", "Name": "openssh-client", "Identifier": { - "PURL": "pkg:apk/alpine/openssh-client@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/openssh-client@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1", + "UID": "f2d105c566e0ac48" }, "Version": "7.5_p1-r9", "Arch": "x86_64", @@ -4989,7 +5027,8 @@ "ID": "openssh-keygen@7.5_p1-r9", "Name": "openssh-keygen", "Identifier": { - "PURL": "pkg:apk/alpine/openssh-keygen@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/openssh-keygen@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1", + "UID": "2c95ef90d057e6b4" }, "Version": "7.5_p1-r9", "Arch": "x86_64", @@ -5015,7 +5054,8 @@ "ID": "openssh-server@7.5_p1-r9", "Name": "openssh-server", "Identifier": { - "PURL": "pkg:apk/alpine/openssh-server@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/openssh-server@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1", + "UID": "8c21a4ada527dd06" }, "Version": "7.5_p1-r9", "Arch": "x86_64", @@ -5044,7 +5084,8 @@ "ID": "openssh-server-common@7.5_p1-r9", "Name": "openssh-server-common", "Identifier": { - "PURL": "pkg:apk/alpine/openssh-server-common@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/openssh-server-common@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1", + "UID": "4c8ce137b360c8f3" }, "Version": "7.5_p1-r9", "Arch": "x86_64", @@ -5068,7 +5109,8 @@ "ID": "openssh-sftp-server@7.5_p1-r9", "Name": "openssh-sftp-server", "Identifier": { - "PURL": "pkg:apk/alpine/openssh-sftp-server@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/openssh-sftp-server@7.5_p1-r9?arch=x86_64\u0026distro=3.7.1", + "UID": "2335817fb194e000" }, "Version": "7.5_p1-r9", "Arch": "x86_64", @@ -5093,7 +5135,8 @@ "ID": "patch@2.7.5-r2", "Name": "patch", "Identifier": { - "PURL": "pkg:apk/alpine/patch@2.7.5-r2?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/patch@2.7.5-r2?arch=x86_64\u0026distro=3.7.1", + "UID": "c3945b28493e2842" }, "Version": "2.7.5-r2", "Arch": "x86_64", @@ -5118,7 +5161,8 @@ "ID": "pcre2@10.30-r0", "Name": "pcre2", "Identifier": { - "PURL": "pkg:apk/alpine/pcre2@10.30-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/pcre2@10.30-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "68c6dfe1e3d664b9" }, "Version": "10.30-r0", "Arch": "x86_64", @@ -5146,7 +5190,8 @@ "ID": "pkgconf@1.3.10-r0", "Name": "pkgconf", "Identifier": { - "PURL": "pkg:apk/alpine/pkgconf@1.3.10-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/pkgconf@1.3.10-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "6fc191337a8d3ba1" }, "Version": "1.3.10-r0", "Arch": "x86_64", @@ -5175,7 +5220,8 @@ "ID": "python2@2.7.15-r2", "Name": "python2", "Identifier": { - "PURL": "pkg:apk/alpine/python2@2.7.15-r2?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/python2@2.7.15-r2?arch=x86_64\u0026distro=3.7.1", + "UID": "e7105320e999ebd6" }, "Version": "2.7.15-r2", "Arch": "x86_64", @@ -7620,7 +7666,8 @@ "ID": "readline@7.0.003-r0", "Name": "readline", "Identifier": { - "PURL": "pkg:apk/alpine/readline@7.0.003-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/readline@7.0.003-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "2cb2c7047f5911f5" }, "Version": "7.0.003-r0", "Arch": "x86_64", @@ -7647,7 +7694,8 @@ "ID": "scanelf@1.2.2-r1", "Name": "scanelf", "Identifier": { - "PURL": "pkg:apk/alpine/scanelf@1.2.2-r1?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/scanelf@1.2.2-r1?arch=x86_64\u0026distro=3.7.1", + "UID": "88086fdb5a997cfd" }, "Version": "1.2.2-r1", "Arch": "x86_64", @@ -7672,7 +7720,8 @@ "ID": "serf@1.3.9-r3", "Name": "serf", "Identifier": { - "PURL": "pkg:apk/alpine/serf@1.3.9-r3?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/serf@1.3.9-r3?arch=x86_64\u0026distro=3.7.1", + "UID": "34d5052ef0071707" }, "Version": "1.3.9-r3", "Arch": "x86_64", @@ -7703,7 +7752,8 @@ "ID": "sqlite-libs@3.21.0-r1", "Name": "sqlite-libs", "Identifier": { - "PURL": "pkg:apk/alpine/sqlite-libs@3.21.0-r1?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/sqlite-libs@3.21.0-r1?arch=x86_64\u0026distro=3.7.1", + "UID": "206767891b55f1ff" }, "Version": "3.21.0-r1", "Arch": "x86_64", @@ -7729,7 +7779,8 @@ "ID": "ssl_client@1.27.2-r11", "Name": "ssl_client", "Identifier": { - "PURL": "pkg:apk/alpine/ssl_client@1.27.2-r11?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/ssl_client@1.27.2-r11?arch=x86_64\u0026distro=3.7.1", + "UID": "eab2a79208d922b" }, "Version": "1.27.2-r11", "Arch": "x86_64", @@ -7755,7 +7806,8 @@ "ID": "subversion@1.9.7-r0", "Name": "subversion", "Identifier": { - "PURL": "pkg:apk/alpine/subversion@1.9.7-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/subversion@1.9.7-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "b8bc1bc573cbdaf7" }, "Version": "1.9.7-r0", "Arch": "x86_64", @@ -7813,7 +7865,8 @@ "ID": "subversion-libs@1.9.7-r0", "Name": "subversion-libs", "Identifier": { - "PURL": "pkg:apk/alpine/subversion-libs@1.9.7-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/subversion-libs@1.9.7-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "61329cde7aca5119" }, "Version": "1.9.7-r0", "Arch": "x86_64", @@ -7876,7 +7929,8 @@ "ID": "tar@1.29-r1", "Name": "tar", "Identifier": { - "PURL": "pkg:apk/alpine/tar@1.29-r1?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/tar@1.29-r1?arch=x86_64\u0026distro=3.7.1", + "UID": "636f4bd512a19da9" }, "Version": "1.29-r1", "Arch": "x86_64", @@ -7903,7 +7957,8 @@ "ID": "tini@0.16.1-r0", "Name": "tini", "Identifier": { - "PURL": "pkg:apk/alpine/tini@0.16.1-r0?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/tini@0.16.1-r0?arch=x86_64\u0026distro=3.7.1", + "UID": "eafb8d9cee8b473c" }, "Version": "0.16.1-r0", "Arch": "x86_64", @@ -7928,7 +7983,8 @@ "ID": "xz@5.2.3-r1", "Name": "xz", "Identifier": { - "PURL": "pkg:apk/alpine/xz@5.2.3-r1?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/xz@5.2.3-r1?arch=x86_64\u0026distro=3.7.1", + "UID": "ccae1ee63a106adf" }, "Version": "5.2.3-r1", "Arch": "x86_64", @@ -7976,7 +8032,8 @@ "ID": "xz-libs@5.2.3-r1", "Name": "xz-libs", "Identifier": { - "PURL": "pkg:apk/alpine/xz-libs@5.2.3-r1?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/xz-libs@5.2.3-r1?arch=x86_64\u0026distro=3.7.1", + "UID": "d1e50abea889c8e6" }, "Version": "5.2.3-r1", "Arch": "x86_64", @@ -8002,7 +8059,8 @@ "ID": "zlib@1.2.11-r1", "Name": "zlib", "Identifier": { - "PURL": "pkg:apk/alpine/zlib@1.2.11-r1?arch=x86_64\u0026distro=3.7.1" + "PURL": "pkg:apk/alpine/zlib@1.2.11-r1?arch=x86_64\u0026distro=3.7.1", + "UID": "1367b2e4f6864f4c" }, "Version": "1.2.11-r1", "Arch": "x86_64", diff --git a/pkg/fanal/test/integration/testdata/goldens/vuln-image1.2.3.expectedlibs.golden b/pkg/fanal/test/integration/testdata/goldens/vuln-image1.2.3.expectedlibs.golden index 0b85bf333243..58abc9c33585 100644 --- a/pkg/fanal/test/integration/testdata/goldens/vuln-image1.2.3.expectedlibs.golden +++ b/pkg/fanal/test/integration/testdata/goldens/vuln-image1.2.3.expectedlibs.golden @@ -7,7 +7,8 @@ "ID": "actioncable@5.2.3", "Name": "actioncable", "Identifier": { - "PURL": "pkg:gem/actioncable@5.2.3" + "PURL": "pkg:gem/actioncable@5.2.3", + "UID": "a2f0009734c47a50" }, "Version": "5.2.3", "Indirect": true, @@ -29,7 +30,8 @@ "ID": "actionmailer@5.2.3", "Name": "actionmailer", "Identifier": { - "PURL": "pkg:gem/actionmailer@5.2.3" + "PURL": "pkg:gem/actionmailer@5.2.3", + "UID": "957dd2cc6d970211" }, "Version": "5.2.3", "Indirect": true, @@ -53,7 +55,8 @@ "ID": "actionpack@5.2.3", "Name": "actionpack", "Identifier": { - "PURL": "pkg:gem/actionpack@5.2.3" + "PURL": "pkg:gem/actionpack@5.2.3", + "UID": "b4e4b4e5f7967b8a" }, "Version": "5.2.3", "Indirect": true, @@ -78,7 +81,8 @@ "ID": "actionview@5.2.3", "Name": "actionview", "Identifier": { - "PURL": "pkg:gem/actionview@5.2.3" + "PURL": "pkg:gem/actionview@5.2.3", + "UID": "e303cfc150443baf" }, "Version": "5.2.3", "Indirect": true, @@ -102,7 +106,8 @@ "ID": "activejob@5.2.3", "Name": "activejob", "Identifier": { - "PURL": "pkg:gem/activejob@5.2.3" + "PURL": "pkg:gem/activejob@5.2.3", + "UID": "107f18a1d47c926e" }, "Version": "5.2.3", "Indirect": true, @@ -123,7 +128,8 @@ "ID": "activemodel@5.2.3", "Name": "activemodel", "Identifier": { - "PURL": "pkg:gem/activemodel@5.2.3" + "PURL": "pkg:gem/activemodel@5.2.3", + "UID": "22b9bacf4efb92d7" }, "Version": "5.2.3", "Indirect": true, @@ -143,7 +149,8 @@ "ID": "activerecord@5.2.3", "Name": "activerecord", "Identifier": { - "PURL": "pkg:gem/activerecord@5.2.3" + "PURL": "pkg:gem/activerecord@5.2.3", + "UID": "a30ec4dd4f1cad0d" }, "Version": "5.2.3", "Indirect": true, @@ -165,7 +172,8 @@ "ID": "activestorage@5.2.3", "Name": "activestorage", "Identifier": { - "PURL": "pkg:gem/activestorage@5.2.3" + "PURL": "pkg:gem/activestorage@5.2.3", + "UID": "4e3f0e59a70b38a9" }, "Version": "5.2.3", "Indirect": true, @@ -187,7 +195,8 @@ "ID": "activesupport@5.2.3", "Name": "activesupport", "Identifier": { - "PURL": "pkg:gem/activesupport@5.2.3" + "PURL": "pkg:gem/activesupport@5.2.3", + "UID": "b83d5718f12b7df1" }, "Version": "5.2.3", "Indirect": true, @@ -210,7 +219,8 @@ "ID": "arel@9.0.0", "Name": "arel", "Identifier": { - "PURL": "pkg:gem/arel@9.0.0" + "PURL": "pkg:gem/arel@9.0.0", + "UID": "9a68b51c670c5d28" }, "Version": "9.0.0", "Indirect": true, @@ -227,7 +237,8 @@ "ID": "ast@2.4.0", "Name": "ast", "Identifier": { - "PURL": "pkg:gem/ast@2.4.0" + "PURL": "pkg:gem/ast@2.4.0", + "UID": "fad54f55dc524edc" }, "Version": "2.4.0", "Indirect": true, @@ -244,7 +255,8 @@ "ID": "builder@3.2.3", "Name": "builder", "Identifier": { - "PURL": "pkg:gem/builder@3.2.3" + "PURL": "pkg:gem/builder@3.2.3", + "UID": "4998ad08ac24b078" }, "Version": "3.2.3", "Indirect": true, @@ -261,7 +273,8 @@ "ID": "coderay@1.1.2", "Name": "coderay", "Identifier": { - "PURL": "pkg:gem/coderay@1.1.2" + "PURL": "pkg:gem/coderay@1.1.2", + "UID": "a48fa0679d10835e" }, "Version": "1.1.2", "Indirect": true, @@ -278,7 +291,8 @@ "ID": "concurrent-ruby@1.1.5", "Name": "concurrent-ruby", "Identifier": { - "PURL": "pkg:gem/concurrent-ruby@1.1.5" + "PURL": "pkg:gem/concurrent-ruby@1.1.5", + "UID": "bca3d9447a1c8032" }, "Version": "1.1.5", "Indirect": true, @@ -295,7 +309,8 @@ "ID": "crass@1.0.4", "Name": "crass", "Identifier": { - "PURL": "pkg:gem/crass@1.0.4" + "PURL": "pkg:gem/crass@1.0.4", + "UID": "63d9762f8a29e52" }, "Version": "1.0.4", "Indirect": true, @@ -312,7 +327,8 @@ "ID": "dotenv@2.7.2", "Name": "dotenv", "Identifier": { - "PURL": "pkg:gem/dotenv@2.7.2" + "PURL": "pkg:gem/dotenv@2.7.2", + "UID": "bf323ef200ea177a" }, "Version": "2.7.2", "Relationship": "direct", @@ -328,7 +344,8 @@ "ID": "erubi@1.8.0", "Name": "erubi", "Identifier": { - "PURL": "pkg:gem/erubi@1.8.0" + "PURL": "pkg:gem/erubi@1.8.0", + "UID": "de475f0ffcba457d" }, "Version": "1.8.0", "Indirect": true, @@ -345,7 +362,8 @@ "ID": "faker@1.9.3", "Name": "faker", "Identifier": { - "PURL": "pkg:gem/faker@1.9.3" + "PURL": "pkg:gem/faker@1.9.3", + "UID": "b5ac01b24ab4ed39" }, "Version": "1.9.3", "Relationship": "direct", @@ -364,7 +382,8 @@ "ID": "globalid@0.4.2", "Name": "globalid", "Identifier": { - "PURL": "pkg:gem/globalid@0.4.2" + "PURL": "pkg:gem/globalid@0.4.2", + "UID": "daff7877b36bd14b" }, "Version": "0.4.2", "Indirect": true, @@ -384,7 +403,8 @@ "ID": "i18n@1.6.0", "Name": "i18n", "Identifier": { - "PURL": "pkg:gem/i18n@1.6.0" + "PURL": "pkg:gem/i18n@1.6.0", + "UID": "66065208a829ff94" }, "Version": "1.6.0", "Indirect": true, @@ -404,7 +424,8 @@ "ID": "jaro_winkler@1.5.2", "Name": "jaro_winkler", "Identifier": { - "PURL": "pkg:gem/jaro_winkler@1.5.2" + "PURL": "pkg:gem/jaro_winkler@1.5.2", + "UID": "9a5b22728e40960b" }, "Version": "1.5.2", "Indirect": true, @@ -421,7 +442,8 @@ "ID": "json@2.2.0", "Name": "json", "Identifier": { - "PURL": "pkg:gem/json@2.2.0" + "PURL": "pkg:gem/json@2.2.0", + "UID": "cb6c1eb54f8c6e9d" }, "Version": "2.2.0", "Relationship": "direct", @@ -437,7 +459,8 @@ "ID": "loofah@2.2.3", "Name": "loofah", "Identifier": { - "PURL": "pkg:gem/loofah@2.2.3" + "PURL": "pkg:gem/loofah@2.2.3", + "UID": "61fc41b2f5521a64" }, "Version": "2.2.3", "Indirect": true, @@ -458,7 +481,8 @@ "ID": "mail@2.7.1", "Name": "mail", "Identifier": { - "PURL": "pkg:gem/mail@2.7.1" + "PURL": "pkg:gem/mail@2.7.1", + "UID": "edee06a4b6e79f92" }, "Version": "2.7.1", "Indirect": true, @@ -478,7 +502,8 @@ "ID": "marcel@0.3.3", "Name": "marcel", "Identifier": { - "PURL": "pkg:gem/marcel@0.3.3" + "PURL": "pkg:gem/marcel@0.3.3", + "UID": "4695d691e0d7ac17" }, "Version": "0.3.3", "Indirect": true, @@ -498,7 +523,8 @@ "ID": "method_source@0.9.2", "Name": "method_source", "Identifier": { - "PURL": "pkg:gem/method_source@0.9.2" + "PURL": "pkg:gem/method_source@0.9.2", + "UID": "b96872ad7feeedb2" }, "Version": "0.9.2", "Indirect": true, @@ -515,7 +541,8 @@ "ID": "mimemagic@0.3.3", "Name": "mimemagic", "Identifier": { - "PURL": "pkg:gem/mimemagic@0.3.3" + "PURL": "pkg:gem/mimemagic@0.3.3", + "UID": "54089ae8801a3144" }, "Version": "0.3.3", "Indirect": true, @@ -532,7 +559,8 @@ "ID": "mini_mime@1.0.1", "Name": "mini_mime", "Identifier": { - "PURL": "pkg:gem/mini_mime@1.0.1" + "PURL": "pkg:gem/mini_mime@1.0.1", + "UID": "ea53b65af3f9c07c" }, "Version": "1.0.1", "Indirect": true, @@ -549,7 +577,8 @@ "ID": "mini_portile2@2.4.0", "Name": "mini_portile2", "Identifier": { - "PURL": "pkg:gem/mini_portile2@2.4.0" + "PURL": "pkg:gem/mini_portile2@2.4.0", + "UID": "503f9a3009616732" }, "Version": "2.4.0", "Indirect": true, @@ -566,7 +595,8 @@ "ID": "minitest@5.11.3", "Name": "minitest", "Identifier": { - "PURL": "pkg:gem/minitest@5.11.3" + "PURL": "pkg:gem/minitest@5.11.3", + "UID": "1d1c12205a5ea0c1" }, "Version": "5.11.3", "Indirect": true, @@ -583,7 +613,8 @@ "ID": "nio4r@2.3.1", "Name": "nio4r", "Identifier": { - "PURL": "pkg:gem/nio4r@2.3.1" + "PURL": "pkg:gem/nio4r@2.3.1", + "UID": "1f214c910b2d6498" }, "Version": "2.3.1", "Indirect": true, @@ -600,7 +631,8 @@ "ID": "nokogiri@1.10.3", "Name": "nokogiri", "Identifier": { - "PURL": "pkg:gem/nokogiri@1.10.3" + "PURL": "pkg:gem/nokogiri@1.10.3", + "UID": "4cadfe4426354933" }, "Version": "1.10.3", "Indirect": true, @@ -620,7 +652,8 @@ "ID": "parallel@1.17.0", "Name": "parallel", "Identifier": { - "PURL": "pkg:gem/parallel@1.17.0" + "PURL": "pkg:gem/parallel@1.17.0", + "UID": "f31aa3a8599717a1" }, "Version": "1.17.0", "Indirect": true, @@ -637,7 +670,8 @@ "ID": "parser@2.6.3.0", "Name": "parser", "Identifier": { - "PURL": "pkg:gem/parser@2.6.3.0" + "PURL": "pkg:gem/parser@2.6.3.0", + "UID": "fa2f74869e82d572" }, "Version": "2.6.3.0", "Indirect": true, @@ -657,7 +691,8 @@ "ID": "pry@0.12.2", "Name": "pry", "Identifier": { - "PURL": "pkg:gem/pry@0.12.2" + "PURL": "pkg:gem/pry@0.12.2", + "UID": "1349a1afdbbc80bc" }, "Version": "0.12.2", "Relationship": "direct", @@ -677,7 +712,8 @@ "ID": "psych@3.1.0", "Name": "psych", "Identifier": { - "PURL": "pkg:gem/psych@3.1.0" + "PURL": "pkg:gem/psych@3.1.0", + "UID": "34bd03308f382650" }, "Version": "3.1.0", "Indirect": true, @@ -694,7 +730,8 @@ "ID": "rack@2.0.7", "Name": "rack", "Identifier": { - "PURL": "pkg:gem/rack@2.0.7" + "PURL": "pkg:gem/rack@2.0.7", + "UID": "d9f77162d5199665" }, "Version": "2.0.7", "Indirect": true, @@ -711,7 +748,8 @@ "ID": "rack-test@1.1.0", "Name": "rack-test", "Identifier": { - "PURL": "pkg:gem/rack-test@1.1.0" + "PURL": "pkg:gem/rack-test@1.1.0", + "UID": "ce77144d56bbfcc7" }, "Version": "1.1.0", "Indirect": true, @@ -731,7 +769,8 @@ "ID": "rails@5.2.0", "Name": "rails", "Identifier": { - "PURL": "pkg:gem/rails@5.2.0" + "PURL": "pkg:gem/rails@5.2.0", + "UID": "edef417a0d4c73e" }, "Version": "5.2.0", "Relationship": "direct", @@ -760,7 +799,8 @@ "ID": "rails-dom-testing@2.0.3", "Name": "rails-dom-testing", "Identifier": { - "PURL": "pkg:gem/rails-dom-testing@2.0.3" + "PURL": "pkg:gem/rails-dom-testing@2.0.3", + "UID": "f86753ba2b01f92d" }, "Version": "2.0.3", "Indirect": true, @@ -781,7 +821,8 @@ "ID": "rails-html-sanitizer@1.0.3", "Name": "rails-html-sanitizer", "Identifier": { - "PURL": "pkg:gem/rails-html-sanitizer@1.0.3" + "PURL": "pkg:gem/rails-html-sanitizer@1.0.3", + "UID": "ca9d0e53040b92a7" }, "Version": "1.0.3", "Indirect": true, @@ -801,7 +842,8 @@ "ID": "railties@5.2.3", "Name": "railties", "Identifier": { - "PURL": "pkg:gem/railties@5.2.3" + "PURL": "pkg:gem/railties@5.2.3", + "UID": "79238ef7535ec96f" }, "Version": "5.2.3", "Indirect": true, @@ -825,7 +867,8 @@ "ID": "rainbow@3.0.0", "Name": "rainbow", "Identifier": { - "PURL": "pkg:gem/rainbow@3.0.0" + "PURL": "pkg:gem/rainbow@3.0.0", + "UID": "b370837d83c44cb7" }, "Version": "3.0.0", "Indirect": true, @@ -842,7 +885,8 @@ "ID": "rake@12.3.2", "Name": "rake", "Identifier": { - "PURL": "pkg:gem/rake@12.3.2" + "PURL": "pkg:gem/rake@12.3.2", + "UID": "4f4252bdb5e59b57" }, "Version": "12.3.2", "Indirect": true, @@ -859,7 +903,8 @@ "ID": "rubocop@0.67.2", "Name": "rubocop", "Identifier": { - "PURL": "pkg:gem/rubocop@0.67.2" + "PURL": "pkg:gem/rubocop@0.67.2", + "UID": "68a7b25b67dfb858" }, "Version": "0.67.2", "Relationship": "direct", @@ -884,7 +929,8 @@ "ID": "ruby-progressbar@1.10.0", "Name": "ruby-progressbar", "Identifier": { - "PURL": "pkg:gem/ruby-progressbar@1.10.0" + "PURL": "pkg:gem/ruby-progressbar@1.10.0", + "UID": "3955293b43d2fd52" }, "Version": "1.10.0", "Indirect": true, @@ -901,7 +947,8 @@ "ID": "sprockets@3.7.2", "Name": "sprockets", "Identifier": { - "PURL": "pkg:gem/sprockets@3.7.2" + "PURL": "pkg:gem/sprockets@3.7.2", + "UID": "116e2747536e43f5" }, "Version": "3.7.2", "Indirect": true, @@ -922,7 +969,8 @@ "ID": "sprockets-rails@3.2.1", "Name": "sprockets-rails", "Identifier": { - "PURL": "pkg:gem/sprockets-rails@3.2.1" + "PURL": "pkg:gem/sprockets-rails@3.2.1", + "UID": "24b0c150e29c714e" }, "Version": "3.2.1", "Indirect": true, @@ -944,7 +992,8 @@ "ID": "thor@0.20.3", "Name": "thor", "Identifier": { - "PURL": "pkg:gem/thor@0.20.3" + "PURL": "pkg:gem/thor@0.20.3", + "UID": "85877345b4057dc4" }, "Version": "0.20.3", "Indirect": true, @@ -961,7 +1010,8 @@ "ID": "thread_safe@0.3.6", "Name": "thread_safe", "Identifier": { - "PURL": "pkg:gem/thread_safe@0.3.6" + "PURL": "pkg:gem/thread_safe@0.3.6", + "UID": "2851ab474c97947e" }, "Version": "0.3.6", "Indirect": true, @@ -978,7 +1028,8 @@ "ID": "tzinfo@1.2.5", "Name": "tzinfo", "Identifier": { - "PURL": "pkg:gem/tzinfo@1.2.5" + "PURL": "pkg:gem/tzinfo@1.2.5", + "UID": "1ef6e099466a3dd" }, "Version": "1.2.5", "Indirect": true, @@ -998,7 +1049,8 @@ "ID": "unicode-display_width@1.5.0", "Name": "unicode-display_width", "Identifier": { - "PURL": "pkg:gem/unicode-display_width@1.5.0" + "PURL": "pkg:gem/unicode-display_width@1.5.0", + "UID": "5212ef154d81feeb" }, "Version": "1.5.0", "Indirect": true, @@ -1015,7 +1067,8 @@ "ID": "websocket-driver@0.7.0", "Name": "websocket-driver", "Identifier": { - "PURL": "pkg:gem/websocket-driver@0.7.0" + "PURL": "pkg:gem/websocket-driver@0.7.0", + "UID": "6d4862fcfa71d8db" }, "Version": "0.7.0", "Indirect": true, @@ -1035,7 +1088,8 @@ "ID": "websocket-extensions@0.1.3", "Name": "websocket-extensions", "Identifier": { - "PURL": "pkg:gem/websocket-extensions@0.1.3" + "PURL": "pkg:gem/websocket-extensions@0.1.3", + "UID": "84dd4f30cc911d14" }, "Version": "0.1.3", "Indirect": true, @@ -1058,7 +1112,8 @@ "ID": "ammonia@1.9.0", "Name": "ammonia", "Identifier": { - "PURL": "pkg:cargo/ammonia@1.9.0" + "PURL": "pkg:cargo/ammonia@1.9.0", + "UID": "3f782b3907f82c00" }, "Version": "1.9.0", "DependsOn": [ @@ -1081,7 +1136,8 @@ "ID": "autocfg@0.1.2", "Name": "autocfg", "Identifier": { - "PURL": "pkg:cargo/autocfg@0.1.2" + "PURL": "pkg:cargo/autocfg@0.1.2", + "UID": "527fae74cf16ee7b" }, "Version": "0.1.2", "Layer": {}, @@ -1096,7 +1152,8 @@ "ID": "bitflags@0.7.0", "Name": "bitflags", "Identifier": { - "PURL": "pkg:cargo/bitflags@0.7.0" + "PURL": "pkg:cargo/bitflags@0.7.0", + "UID": "7ed30462ad4d3f73" }, "Version": "0.7.0", "Layer": {}, @@ -1111,7 +1168,8 @@ "ID": "bitflags@1.0.4", "Name": "bitflags", "Identifier": { - "PURL": "pkg:cargo/bitflags@1.0.4" + "PURL": "pkg:cargo/bitflags@1.0.4", + "UID": "923d02b9471117a4" }, "Version": "1.0.4", "Layer": {}, @@ -1126,7 +1184,8 @@ "ID": "cfg-if@0.1.7", "Name": "cfg-if", "Identifier": { - "PURL": "pkg:cargo/cfg-if@0.1.7" + "PURL": "pkg:cargo/cfg-if@0.1.7", + "UID": "534d592a586af917" }, "Version": "0.1.7", "Layer": {}, @@ -1141,7 +1200,8 @@ "ID": "cloudabi@0.0.3", "Name": "cloudabi", "Identifier": { - "PURL": "pkg:cargo/cloudabi@0.0.3" + "PURL": "pkg:cargo/cloudabi@0.0.3", + "UID": "7d95ca530080060e" }, "Version": "0.0.3", "DependsOn": [ @@ -1159,7 +1219,8 @@ "ID": "fuchsia-cprng@0.1.1", "Name": "fuchsia-cprng", "Identifier": { - "PURL": "pkg:cargo/fuchsia-cprng@0.1.1" + "PURL": "pkg:cargo/fuchsia-cprng@0.1.1", + "UID": "31513de656860d15" }, "Version": "0.1.1", "Layer": {}, @@ -1174,7 +1235,8 @@ "ID": "futf@0.1.4", "Name": "futf", "Identifier": { - "PURL": "pkg:cargo/futf@0.1.4" + "PURL": "pkg:cargo/futf@0.1.4", + "UID": "d94fed27065b26e6" }, "Version": "0.1.4", "DependsOn": [ @@ -1193,7 +1255,8 @@ "ID": "gdi32-sys@0.2.0", "Name": "gdi32-sys", "Identifier": { - "PURL": "pkg:cargo/gdi32-sys@0.2.0" + "PURL": "pkg:cargo/gdi32-sys@0.2.0", + "UID": "f26b4cb6a1dc0271" }, "Version": "0.2.0", "DependsOn": [ @@ -1212,7 +1275,8 @@ "ID": "html5ever@0.23.0", "Name": "html5ever", "Identifier": { - "PURL": "pkg:cargo/html5ever@0.23.0" + "PURL": "pkg:cargo/html5ever@0.23.0", + "UID": "1da853b746306a1b" }, "Version": "0.23.0", "DependsOn": [ @@ -1235,7 +1299,8 @@ "ID": "idna@0.1.5", "Name": "idna", "Identifier": { - "PURL": "pkg:cargo/idna@0.1.5" + "PURL": "pkg:cargo/idna@0.1.5", + "UID": "f128a40f0ba385a8" }, "Version": "0.1.5", "DependsOn": [ @@ -1255,7 +1320,8 @@ "ID": "itoa@0.4.4", "Name": "itoa", "Identifier": { - "PURL": "pkg:cargo/itoa@0.4.4" + "PURL": "pkg:cargo/itoa@0.4.4", + "UID": "4aff7ab01356bada" }, "Version": "0.4.4", "Layer": {}, @@ -1270,7 +1336,8 @@ "ID": "kernel32-sys@0.2.2", "Name": "kernel32-sys", "Identifier": { - "PURL": "pkg:cargo/kernel32-sys@0.2.2" + "PURL": "pkg:cargo/kernel32-sys@0.2.2", + "UID": "2d5abd219ee22df7" }, "Version": "0.2.2", "DependsOn": [ @@ -1289,7 +1356,8 @@ "ID": "lazy_static@0.2.11", "Name": "lazy_static", "Identifier": { - "PURL": "pkg:cargo/lazy_static@0.2.11" + "PURL": "pkg:cargo/lazy_static@0.2.11", + "UID": "dc8cd0220cdde21c" }, "Version": "0.2.11", "Layer": {}, @@ -1304,7 +1372,8 @@ "ID": "lazy_static@1.3.0", "Name": "lazy_static", "Identifier": { - "PURL": "pkg:cargo/lazy_static@1.3.0" + "PURL": "pkg:cargo/lazy_static@1.3.0", + "UID": "2e4334f512c2da87" }, "Version": "1.3.0", "Layer": {}, @@ -1319,7 +1388,8 @@ "ID": "libc@0.2.54", "Name": "libc", "Identifier": { - "PURL": "pkg:cargo/libc@0.2.54" + "PURL": "pkg:cargo/libc@0.2.54", + "UID": "269b1cde2d08166e" }, "Version": "0.2.54", "Layer": {}, @@ -1334,7 +1404,8 @@ "ID": "libressl-pnacl-sys@2.1.6", "Name": "libressl-pnacl-sys", "Identifier": { - "PURL": "pkg:cargo/libressl-pnacl-sys@2.1.6" + "PURL": "pkg:cargo/libressl-pnacl-sys@2.1.6", + "UID": "8c256bb7e4378d69" }, "Version": "2.1.6", "DependsOn": [ @@ -1352,7 +1423,8 @@ "ID": "log@0.4.6", "Name": "log", "Identifier": { - "PURL": "pkg:cargo/log@0.4.6" + "PURL": "pkg:cargo/log@0.4.6", + "UID": "e8bdfac27c5210ae" }, "Version": "0.4.6", "DependsOn": [ @@ -1370,7 +1442,8 @@ "ID": "mac@0.1.1", "Name": "mac", "Identifier": { - "PURL": "pkg:cargo/mac@0.1.1" + "PURL": "pkg:cargo/mac@0.1.1", + "UID": "1185b2b0745c221" }, "Version": "0.1.1", "Layer": {}, @@ -1385,7 +1458,8 @@ "ID": "maplit@1.0.1", "Name": "maplit", "Identifier": { - "PURL": "pkg:cargo/maplit@1.0.1" + "PURL": "pkg:cargo/maplit@1.0.1", + "UID": "8c23f27efaff6301" }, "Version": "1.0.1", "Layer": {}, @@ -1400,7 +1474,8 @@ "ID": "markup5ever@0.8.1", "Name": "markup5ever", "Identifier": { - "PURL": "pkg:cargo/markup5ever@0.8.1" + "PURL": "pkg:cargo/markup5ever@0.8.1", + "UID": "f55027c499fea0c9" }, "Version": "0.8.1", "DependsOn": [ @@ -1426,7 +1501,8 @@ "ID": "matches@0.1.8", "Name": "matches", "Identifier": { - "PURL": "pkg:cargo/matches@0.1.8" + "PURL": "pkg:cargo/matches@0.1.8", + "UID": "81da4fade350ea84" }, "Version": "0.1.8", "Layer": {}, @@ -1441,7 +1517,8 @@ "ID": "new_debug_unreachable@1.0.3", "Name": "new_debug_unreachable", "Identifier": { - "PURL": "pkg:cargo/new_debug_unreachable@1.0.3" + "PURL": "pkg:cargo/new_debug_unreachable@1.0.3", + "UID": "a4666c488ce7b5cb" }, "Version": "1.0.3", "Layer": {}, @@ -1456,7 +1533,8 @@ "ID": "normal@0.1.0", "Name": "normal", "Identifier": { - "PURL": "pkg:cargo/normal@0.1.0" + "PURL": "pkg:cargo/normal@0.1.0", + "UID": "7553ca394bde0964" }, "Version": "0.1.0", "DependsOn": [ @@ -1476,7 +1554,8 @@ "ID": "openssl@0.8.3", "Name": "openssl", "Identifier": { - "PURL": "pkg:cargo/openssl@0.8.3" + "PURL": "pkg:cargo/openssl@0.8.3", + "UID": "4b76d62a38b7e8be" }, "Version": "0.8.3", "DependsOn": [ @@ -1497,7 +1576,8 @@ "ID": "openssl-sys@0.7.17", "Name": "openssl-sys", "Identifier": { - "PURL": "pkg:cargo/openssl-sys@0.7.17" + "PURL": "pkg:cargo/openssl-sys@0.7.17", + "UID": "c53e41230020f3" }, "Version": "0.7.17", "DependsOn": [ @@ -1519,7 +1599,8 @@ "ID": "percent-encoding@1.0.1", "Name": "percent-encoding", "Identifier": { - "PURL": "pkg:cargo/percent-encoding@1.0.1" + "PURL": "pkg:cargo/percent-encoding@1.0.1", + "UID": "c442dfa6d6be550d" }, "Version": "1.0.1", "Layer": {}, @@ -1534,7 +1615,8 @@ "ID": "phf@0.7.24", "Name": "phf", "Identifier": { - "PURL": "pkg:cargo/phf@0.7.24" + "PURL": "pkg:cargo/phf@0.7.24", + "UID": "af388c2916670a2b" }, "Version": "0.7.24", "DependsOn": [ @@ -1552,7 +1634,8 @@ "ID": "phf_codegen@0.7.24", "Name": "phf_codegen", "Identifier": { - "PURL": "pkg:cargo/phf_codegen@0.7.24" + "PURL": "pkg:cargo/phf_codegen@0.7.24", + "UID": "b5a34c00896c8a2d" }, "Version": "0.7.24", "DependsOn": [ @@ -1571,7 +1654,8 @@ "ID": "phf_generator@0.7.24", "Name": "phf_generator", "Identifier": { - "PURL": "pkg:cargo/phf_generator@0.7.24" + "PURL": "pkg:cargo/phf_generator@0.7.24", + "UID": "2ddb8ab0af22fc74" }, "Version": "0.7.24", "DependsOn": [ @@ -1590,7 +1674,8 @@ "ID": "phf_shared@0.7.24", "Name": "phf_shared", "Identifier": { - "PURL": "pkg:cargo/phf_shared@0.7.24" + "PURL": "pkg:cargo/phf_shared@0.7.24", + "UID": "afb775d34fd007ad" }, "Version": "0.7.24", "DependsOn": [ @@ -1608,7 +1693,8 @@ "ID": "pkg-config@0.3.14", "Name": "pkg-config", "Identifier": { - "PURL": "pkg:cargo/pkg-config@0.3.14" + "PURL": "pkg:cargo/pkg-config@0.3.14", + "UID": "5cf1d9ec06ce2165" }, "Version": "0.3.14", "Layer": {}, @@ -1623,7 +1709,8 @@ "ID": "pnacl-build-helper@1.4.11", "Name": "pnacl-build-helper", "Identifier": { - "PURL": "pkg:cargo/pnacl-build-helper@1.4.11" + "PURL": "pkg:cargo/pnacl-build-helper@1.4.11", + "UID": "86af875650c6f361" }, "Version": "1.4.11", "DependsOn": [ @@ -1642,7 +1729,8 @@ "ID": "precomputed-hash@0.1.1", "Name": "precomputed-hash", "Identifier": { - "PURL": "pkg:cargo/precomputed-hash@0.1.1" + "PURL": "pkg:cargo/precomputed-hash@0.1.1", + "UID": "3324b417bef2a649" }, "Version": "0.1.1", "Layer": {}, @@ -1657,7 +1745,8 @@ "ID": "proc-macro2@0.4.30", "Name": "proc-macro2", "Identifier": { - "PURL": "pkg:cargo/proc-macro2@0.4.30" + "PURL": "pkg:cargo/proc-macro2@0.4.30", + "UID": "743ee84514cbfaa2" }, "Version": "0.4.30", "DependsOn": [ @@ -1675,7 +1764,8 @@ "ID": "quote@0.6.12", "Name": "quote", "Identifier": { - "PURL": "pkg:cargo/quote@0.6.12" + "PURL": "pkg:cargo/quote@0.6.12", + "UID": "616e047380490e91" }, "Version": "0.6.12", "DependsOn": [ @@ -1693,7 +1783,8 @@ "ID": "rand@0.4.6", "Name": "rand", "Identifier": { - "PURL": "pkg:cargo/rand@0.4.6" + "PURL": "pkg:cargo/rand@0.4.6", + "UID": "36ea3ab1d79f2eff" }, "Version": "0.4.6", "DependsOn": [ @@ -1715,7 +1806,8 @@ "ID": "rand@0.6.5", "Name": "rand", "Identifier": { - "PURL": "pkg:cargo/rand@0.6.5" + "PURL": "pkg:cargo/rand@0.6.5", + "UID": "189ce5e3b97b9086" }, "Version": "0.6.5", "DependsOn": [ @@ -1743,7 +1835,8 @@ "ID": "rand_chacha@0.1.1", "Name": "rand_chacha", "Identifier": { - "PURL": "pkg:cargo/rand_chacha@0.1.1" + "PURL": "pkg:cargo/rand_chacha@0.1.1", + "UID": "1898cad64a773a50" }, "Version": "0.1.1", "DependsOn": [ @@ -1762,7 +1855,8 @@ "ID": "rand_core@0.3.1", "Name": "rand_core", "Identifier": { - "PURL": "pkg:cargo/rand_core@0.3.1" + "PURL": "pkg:cargo/rand_core@0.3.1", + "UID": "b89466bd93821e2c" }, "Version": "0.3.1", "DependsOn": [ @@ -1780,7 +1874,8 @@ "ID": "rand_core@0.4.0", "Name": "rand_core", "Identifier": { - "PURL": "pkg:cargo/rand_core@0.4.0" + "PURL": "pkg:cargo/rand_core@0.4.0", + "UID": "a17be2d5af86e701" }, "Version": "0.4.0", "Layer": {}, @@ -1795,7 +1890,8 @@ "ID": "rand_hc@0.1.0", "Name": "rand_hc", "Identifier": { - "PURL": "pkg:cargo/rand_hc@0.1.0" + "PURL": "pkg:cargo/rand_hc@0.1.0", + "UID": "876ebd10af20419d" }, "Version": "0.1.0", "DependsOn": [ @@ -1813,7 +1909,8 @@ "ID": "rand_isaac@0.1.1", "Name": "rand_isaac", "Identifier": { - "PURL": "pkg:cargo/rand_isaac@0.1.1" + "PURL": "pkg:cargo/rand_isaac@0.1.1", + "UID": "c82e2542dd4c548b" }, "Version": "0.1.1", "DependsOn": [ @@ -1831,7 +1928,8 @@ "ID": "rand_jitter@0.1.4", "Name": "rand_jitter", "Identifier": { - "PURL": "pkg:cargo/rand_jitter@0.1.4" + "PURL": "pkg:cargo/rand_jitter@0.1.4", + "UID": "f2fd4d5475b3e46" }, "Version": "0.1.4", "DependsOn": [ @@ -1851,7 +1949,8 @@ "ID": "rand_os@0.1.3", "Name": "rand_os", "Identifier": { - "PURL": "pkg:cargo/rand_os@0.1.3" + "PURL": "pkg:cargo/rand_os@0.1.3", + "UID": "f18975abcf140a0d" }, "Version": "0.1.3", "DependsOn": [ @@ -1874,7 +1973,8 @@ "ID": "rand_pcg@0.1.2", "Name": "rand_pcg", "Identifier": { - "PURL": "pkg:cargo/rand_pcg@0.1.2" + "PURL": "pkg:cargo/rand_pcg@0.1.2", + "UID": "2643a3fc473cf1e8" }, "Version": "0.1.2", "DependsOn": [ @@ -1893,7 +1993,8 @@ "ID": "rand_xorshift@0.1.1", "Name": "rand_xorshift", "Identifier": { - "PURL": "pkg:cargo/rand_xorshift@0.1.1" + "PURL": "pkg:cargo/rand_xorshift@0.1.1", + "UID": "d196ca24b2df097a" }, "Version": "0.1.1", "DependsOn": [ @@ -1911,7 +2012,8 @@ "ID": "rdrand@0.4.0", "Name": "rdrand", "Identifier": { - "PURL": "pkg:cargo/rdrand@0.4.0" + "PURL": "pkg:cargo/rdrand@0.4.0", + "UID": "1669ce8589bdb635" }, "Version": "0.4.0", "DependsOn": [ @@ -1929,7 +2031,8 @@ "ID": "remove_dir_all@0.5.1", "Name": "remove_dir_all", "Identifier": { - "PURL": "pkg:cargo/remove_dir_all@0.5.1" + "PURL": "pkg:cargo/remove_dir_all@0.5.1", + "UID": "754bd8e2f6347b0d" }, "Version": "0.5.1", "DependsOn": [ @@ -1947,7 +2050,8 @@ "ID": "ryu@0.2.8", "Name": "ryu", "Identifier": { - "PURL": "pkg:cargo/ryu@0.2.8" + "PURL": "pkg:cargo/ryu@0.2.8", + "UID": "4aae5dd6e37bffdb" }, "Version": "0.2.8", "Layer": {}, @@ -1962,7 +2066,8 @@ "ID": "same-file@0.1.3", "Name": "same-file", "Identifier": { - "PURL": "pkg:cargo/same-file@0.1.3" + "PURL": "pkg:cargo/same-file@0.1.3", + "UID": "cdadbdb5b52c4959" }, "Version": "0.1.3", "DependsOn": [ @@ -1981,7 +2086,8 @@ "ID": "serde@1.0.91", "Name": "serde", "Identifier": { - "PURL": "pkg:cargo/serde@1.0.91" + "PURL": "pkg:cargo/serde@1.0.91", + "UID": "5a88cd7c139193aa" }, "Version": "1.0.91", "Layer": {}, @@ -1996,7 +2102,8 @@ "ID": "serde_derive@1.0.91", "Name": "serde_derive", "Identifier": { - "PURL": "pkg:cargo/serde_derive@1.0.91" + "PURL": "pkg:cargo/serde_derive@1.0.91", + "UID": "afb0ddf32fd9ad05" }, "Version": "1.0.91", "DependsOn": [ @@ -2016,7 +2123,8 @@ "ID": "serde_json@1.0.39", "Name": "serde_json", "Identifier": { - "PURL": "pkg:cargo/serde_json@1.0.39" + "PURL": "pkg:cargo/serde_json@1.0.39", + "UID": "9b8a47a8820505f" }, "Version": "1.0.39", "DependsOn": [ @@ -2036,7 +2144,8 @@ "ID": "siphasher@0.2.3", "Name": "siphasher", "Identifier": { - "PURL": "pkg:cargo/siphasher@0.2.3" + "PURL": "pkg:cargo/siphasher@0.2.3", + "UID": "b790a7dc3920aecc" }, "Version": "0.2.3", "Layer": {}, @@ -2051,7 +2160,8 @@ "ID": "smallvec@0.6.9", "Name": "smallvec", "Identifier": { - "PURL": "pkg:cargo/smallvec@0.6.9" + "PURL": "pkg:cargo/smallvec@0.6.9", + "UID": "f222b109875a6950" }, "Version": "0.6.9", "Layer": {}, @@ -2066,7 +2176,8 @@ "ID": "string_cache@0.7.3", "Name": "string_cache", "Identifier": { - "PURL": "pkg:cargo/string_cache@0.7.3" + "PURL": "pkg:cargo/string_cache@0.7.3", + "UID": "f4fc88e341199b93" }, "Version": "0.7.3", "DependsOn": [ @@ -2090,7 +2201,8 @@ "ID": "string_cache_codegen@0.4.2", "Name": "string_cache_codegen", "Identifier": { - "PURL": "pkg:cargo/string_cache_codegen@0.4.2" + "PURL": "pkg:cargo/string_cache_codegen@0.4.2", + "UID": "325b6a21ff049d27" }, "Version": "0.4.2", "DependsOn": [ @@ -2112,7 +2224,8 @@ "ID": "string_cache_shared@0.3.0", "Name": "string_cache_shared", "Identifier": { - "PURL": "pkg:cargo/string_cache_shared@0.3.0" + "PURL": "pkg:cargo/string_cache_shared@0.3.0", + "UID": "eaf649152096f011" }, "Version": "0.3.0", "Layer": {}, @@ -2127,7 +2240,8 @@ "ID": "syn@0.15.34", "Name": "syn", "Identifier": { - "PURL": "pkg:cargo/syn@0.15.34" + "PURL": "pkg:cargo/syn@0.15.34", + "UID": "dec15b88d2b96dc6" }, "Version": "0.15.34", "DependsOn": [ @@ -2147,7 +2261,8 @@ "ID": "tempdir@0.3.7", "Name": "tempdir", "Identifier": { - "PURL": "pkg:cargo/tempdir@0.3.7" + "PURL": "pkg:cargo/tempdir@0.3.7", + "UID": "5199d2330f7fbafa" }, "Version": "0.3.7", "DependsOn": [ @@ -2166,7 +2281,8 @@ "ID": "tendril@0.4.1", "Name": "tendril", "Identifier": { - "PURL": "pkg:cargo/tendril@0.4.1" + "PURL": "pkg:cargo/tendril@0.4.1", + "UID": "7d6ea579b9fd4cc2" }, "Version": "0.4.1", "DependsOn": [ @@ -2186,7 +2302,8 @@ "ID": "unicode-bidi@0.3.4", "Name": "unicode-bidi", "Identifier": { - "PURL": "pkg:cargo/unicode-bidi@0.3.4" + "PURL": "pkg:cargo/unicode-bidi@0.3.4", + "UID": "7c952948878fa2d2" }, "Version": "0.3.4", "DependsOn": [ @@ -2204,7 +2321,8 @@ "ID": "unicode-normalization@0.1.8", "Name": "unicode-normalization", "Identifier": { - "PURL": "pkg:cargo/unicode-normalization@0.1.8" + "PURL": "pkg:cargo/unicode-normalization@0.1.8", + "UID": "a4be6e256079f76a" }, "Version": "0.1.8", "DependsOn": [ @@ -2222,7 +2340,8 @@ "ID": "unicode-xid@0.1.0", "Name": "unicode-xid", "Identifier": { - "PURL": "pkg:cargo/unicode-xid@0.1.0" + "PURL": "pkg:cargo/unicode-xid@0.1.0", + "UID": "812bfb20444d6773" }, "Version": "0.1.0", "Layer": {}, @@ -2237,7 +2356,8 @@ "ID": "url@1.7.2", "Name": "url", "Identifier": { - "PURL": "pkg:cargo/url@1.7.2" + "PURL": "pkg:cargo/url@1.7.2", + "UID": "7d7ba75dcebda226" }, "Version": "1.7.2", "DependsOn": [ @@ -2257,7 +2377,8 @@ "ID": "user32-sys@0.2.0", "Name": "user32-sys", "Identifier": { - "PURL": "pkg:cargo/user32-sys@0.2.0" + "PURL": "pkg:cargo/user32-sys@0.2.0", + "UID": "49dd6794a7a6486" }, "Version": "0.2.0", "DependsOn": [ @@ -2276,7 +2397,8 @@ "ID": "utf-8@0.7.5", "Name": "utf-8", "Identifier": { - "PURL": "pkg:cargo/utf-8@0.7.5" + "PURL": "pkg:cargo/utf-8@0.7.5", + "UID": "4bd5c4499e77b190" }, "Version": "0.7.5", "Layer": {}, @@ -2291,7 +2413,8 @@ "ID": "walkdir@1.0.7", "Name": "walkdir", "Identifier": { - "PURL": "pkg:cargo/walkdir@1.0.7" + "PURL": "pkg:cargo/walkdir@1.0.7", + "UID": "46be56ccb4ce809f" }, "Version": "1.0.7", "DependsOn": [ @@ -2311,7 +2434,8 @@ "ID": "winapi@0.2.8", "Name": "winapi", "Identifier": { - "PURL": "pkg:cargo/winapi@0.2.8" + "PURL": "pkg:cargo/winapi@0.2.8", + "UID": "2b9eef53fe7d8358" }, "Version": "0.2.8", "Layer": {}, @@ -2326,7 +2450,8 @@ "ID": "winapi@0.3.7", "Name": "winapi", "Identifier": { - "PURL": "pkg:cargo/winapi@0.3.7" + "PURL": "pkg:cargo/winapi@0.3.7", + "UID": "3be65d501e44878f" }, "Version": "0.3.7", "DependsOn": [ @@ -2345,7 +2470,8 @@ "ID": "winapi-build@0.1.1", "Name": "winapi-build", "Identifier": { - "PURL": "pkg:cargo/winapi-build@0.1.1" + "PURL": "pkg:cargo/winapi-build@0.1.1", + "UID": "96ec9e9d498b4ef7" }, "Version": "0.1.1", "Layer": {}, @@ -2360,7 +2486,8 @@ "ID": "winapi-i686-pc-windows-gnu@0.4.0", "Name": "winapi-i686-pc-windows-gnu", "Identifier": { - "PURL": "pkg:cargo/winapi-i686-pc-windows-gnu@0.4.0" + "PURL": "pkg:cargo/winapi-i686-pc-windows-gnu@0.4.0", + "UID": "1b230d529eec4e4f" }, "Version": "0.4.0", "Layer": {}, @@ -2375,7 +2502,8 @@ "ID": "winapi-x86_64-pc-windows-gnu@0.4.0", "Name": "winapi-x86_64-pc-windows-gnu", "Identifier": { - "PURL": "pkg:cargo/winapi-x86_64-pc-windows-gnu@0.4.0" + "PURL": "pkg:cargo/winapi-x86_64-pc-windows-gnu@0.4.0", + "UID": "94fafef2976facb5" }, "Version": "0.4.0", "Layer": {}, @@ -2396,7 +2524,8 @@ "ID": "guzzlehttp/guzzle@6.2.0", "Name": "guzzlehttp/guzzle", "Identifier": { - "PURL": "pkg:composer/guzzlehttp/guzzle@6.2.0" + "PURL": "pkg:composer/guzzlehttp/guzzle@6.2.0", + "UID": "9dfe1e5591642f22" }, "Version": "6.2.0", "Licenses": [ @@ -2418,7 +2547,8 @@ "ID": "guzzlehttp/promises@v1.3.1", "Name": "guzzlehttp/promises", "Identifier": { - "PURL": "pkg:composer/guzzlehttp/promises@v1.3.1" + "PURL": "pkg:composer/guzzlehttp/promises@v1.3.1", + "UID": "24c8c4cc0bc32a5a" }, "Version": "v1.3.1", "Licenses": [ @@ -2436,7 +2566,8 @@ "ID": "guzzlehttp/psr7@1.5.2", "Name": "guzzlehttp/psr7", "Identifier": { - "PURL": "pkg:composer/guzzlehttp/psr7@1.5.2" + "PURL": "pkg:composer/guzzlehttp/psr7@1.5.2", + "UID": "5a2f37cb99b96e3b" }, "Version": "1.5.2", "Licenses": [ @@ -2458,7 +2589,8 @@ "ID": "laravel/installer@v2.0.1", "Name": "laravel/installer", "Identifier": { - "PURL": "pkg:composer/laravel/installer@v2.0.1" + "PURL": "pkg:composer/laravel/installer@v2.0.1", + "UID": "5b2b8cb546357a8e" }, "Version": "v2.0.1", "Licenses": [ @@ -2482,7 +2614,8 @@ "ID": "pear/log@1.13.1", "Name": "pear/log", "Identifier": { - "PURL": "pkg:composer/pear/log@1.13.1" + "PURL": "pkg:composer/pear/log@1.13.1", + "UID": "a5defa6d09ddcecd" }, "Version": "1.13.1", "Licenses": [ @@ -2503,7 +2636,8 @@ "ID": "pear/pear_exception@v1.0.0", "Name": "pear/pear_exception", "Identifier": { - "PURL": "pkg:composer/pear/pear_exception@v1.0.0" + "PURL": "pkg:composer/pear/pear_exception@v1.0.0", + "UID": "9f4d1b12a2cdbcb0" }, "Version": "v1.0.0", "Licenses": [ @@ -2521,7 +2655,8 @@ "ID": "psr/http-message@1.0.1", "Name": "psr/http-message", "Identifier": { - "PURL": "pkg:composer/psr/http-message@1.0.1" + "PURL": "pkg:composer/psr/http-message@1.0.1", + "UID": "2157df4f82a58274" }, "Version": "1.0.1", "Licenses": [ @@ -2539,7 +2674,8 @@ "ID": "ralouphie/getallheaders@2.0.5", "Name": "ralouphie/getallheaders", "Identifier": { - "PURL": "pkg:composer/ralouphie/getallheaders@2.0.5" + "PURL": "pkg:composer/ralouphie/getallheaders@2.0.5", + "UID": "51f513d42ea55b0a" }, "Version": "2.0.5", "Licenses": [ @@ -2557,7 +2693,8 @@ "ID": "symfony/console@v4.2.7", "Name": "symfony/console", "Identifier": { - "PURL": "pkg:composer/symfony/console@v4.2.7" + "PURL": "pkg:composer/symfony/console@v4.2.7", + "UID": "f441e47bb09da6e3" }, "Version": "v4.2.7", "Licenses": [ @@ -2579,7 +2716,8 @@ "ID": "symfony/contracts@v1.0.2", "Name": "symfony/contracts", "Identifier": { - "PURL": "pkg:composer/symfony/contracts@v1.0.2" + "PURL": "pkg:composer/symfony/contracts@v1.0.2", + "UID": "42d464c36bfccb7" }, "Version": "v1.0.2", "Licenses": [ @@ -2597,7 +2735,8 @@ "ID": "symfony/filesystem@v4.2.7", "Name": "symfony/filesystem", "Identifier": { - "PURL": "pkg:composer/symfony/filesystem@v4.2.7" + "PURL": "pkg:composer/symfony/filesystem@v4.2.7", + "UID": "f56f8da2772fc03c" }, "Version": "v4.2.7", "Licenses": [ @@ -2618,7 +2757,8 @@ "ID": "symfony/polyfill-ctype@v1.11.0", "Name": "symfony/polyfill-ctype", "Identifier": { - "PURL": "pkg:composer/symfony/polyfill-ctype@v1.11.0" + "PURL": "pkg:composer/symfony/polyfill-ctype@v1.11.0", + "UID": "12e7a3c47387acbe" }, "Version": "v1.11.0", "Licenses": [ @@ -2636,7 +2776,8 @@ "ID": "symfony/polyfill-mbstring@v1.11.0", "Name": "symfony/polyfill-mbstring", "Identifier": { - "PURL": "pkg:composer/symfony/polyfill-mbstring@v1.11.0" + "PURL": "pkg:composer/symfony/polyfill-mbstring@v1.11.0", + "UID": "3089180417b349cc" }, "Version": "v1.11.0", "Licenses": [ @@ -2654,7 +2795,8 @@ "ID": "symfony/process@v4.2.7", "Name": "symfony/process", "Identifier": { - "PURL": "pkg:composer/symfony/process@v4.2.7" + "PURL": "pkg:composer/symfony/process@v4.2.7", + "UID": "3c70597c19dc7546" }, "Version": "v4.2.7", "Licenses": [ @@ -2678,7 +2820,8 @@ "ID": "asap@2.0.6", "Name": "asap", "Identifier": { - "PURL": "pkg:npm/asap@2.0.6" + "PURL": "pkg:npm/asap@2.0.6", + "UID": "abb547f5589e4959" }, "Version": "2.0.6", "Layer": {}, @@ -2693,7 +2836,8 @@ "ID": "jquery@3.3.9", "Name": "jquery", "Identifier": { - "PURL": "pkg:npm/jquery@3.3.9" + "PURL": "pkg:npm/jquery@3.3.9", + "UID": "1126bc6bfa8295d8" }, "Version": "3.3.9", "Layer": {}, @@ -2708,7 +2852,8 @@ "ID": "js-tokens@4.0.0", "Name": "js-tokens", "Identifier": { - "PURL": "pkg:npm/js-tokens@4.0.0" + "PURL": "pkg:npm/js-tokens@4.0.0", + "UID": "fbee11c088549b29" }, "Version": "4.0.0", "Layer": {}, @@ -2723,7 +2868,8 @@ "ID": "lodash@4.17.4", "Name": "lodash", "Identifier": { - "PURL": "pkg:npm/lodash@4.17.4" + "PURL": "pkg:npm/lodash@4.17.4", + "UID": "4473a912b2b0d935" }, "Version": "4.17.4", "Layer": {}, @@ -2738,7 +2884,8 @@ "ID": "loose-envify@1.4.0", "Name": "loose-envify", "Identifier": { - "PURL": "pkg:npm/loose-envify@1.4.0" + "PURL": "pkg:npm/loose-envify@1.4.0", + "UID": "3ebeb6506cca5763" }, "Version": "1.4.0", "DependsOn": [ @@ -2756,7 +2903,8 @@ "ID": "object-assign@4.1.1", "Name": "object-assign", "Identifier": { - "PURL": "pkg:npm/object-assign@4.1.1" + "PURL": "pkg:npm/object-assign@4.1.1", + "UID": "23ceee882eda18a4" }, "Version": "4.1.1", "Layer": {}, @@ -2771,7 +2919,8 @@ "ID": "promise@8.0.3", "Name": "promise", "Identifier": { - "PURL": "pkg:npm/promise@8.0.3" + "PURL": "pkg:npm/promise@8.0.3", + "UID": "41a88be886ae90fe" }, "Version": "8.0.3", "DependsOn": [ @@ -2789,7 +2938,8 @@ "ID": "prop-types@15.7.2", "Name": "prop-types", "Identifier": { - "PURL": "pkg:npm/prop-types@15.7.2" + "PURL": "pkg:npm/prop-types@15.7.2", + "UID": "f0609ce5dbe652fc" }, "Version": "15.7.2", "DependsOn": [ @@ -2809,7 +2959,8 @@ "ID": "react@16.8.6", "Name": "react", "Identifier": { - "PURL": "pkg:npm/react@16.8.6" + "PURL": "pkg:npm/react@16.8.6", + "UID": "f0d9536f5c050d74" }, "Version": "16.8.6", "DependsOn": [ @@ -2830,7 +2981,8 @@ "ID": "react-is@16.8.6", "Name": "react-is", "Identifier": { - "PURL": "pkg:npm/react-is@16.8.6" + "PURL": "pkg:npm/react-is@16.8.6", + "UID": "cb2875411ead1f9a" }, "Version": "16.8.6", "Layer": {}, @@ -2845,7 +2997,8 @@ "ID": "redux@4.0.1", "Name": "redux", "Identifier": { - "PURL": "pkg:npm/redux@4.0.1" + "PURL": "pkg:npm/redux@4.0.1", + "UID": "e463b04a52085d00" }, "Version": "4.0.1", "DependsOn": [ @@ -2864,7 +3017,8 @@ "ID": "scheduler@0.13.6", "Name": "scheduler", "Identifier": { - "PURL": "pkg:npm/scheduler@0.13.6" + "PURL": "pkg:npm/scheduler@0.13.6", + "UID": "cdc29e2ca0a03edf" }, "Version": "0.13.6", "DependsOn": [ @@ -2883,7 +3037,8 @@ "ID": "symbol-observable@1.2.0", "Name": "symbol-observable", "Identifier": { - "PURL": "pkg:npm/symbol-observable@1.2.0" + "PURL": "pkg:npm/symbol-observable@1.2.0", + "UID": "5318f6146dc0264" }, "Version": "1.2.0", "Layer": {}, @@ -2903,7 +3058,8 @@ { "Name": "amqp", "Identifier": { - "PURL": "pkg:pypi/amqp@2.4.2" + "PURL": "pkg:pypi/amqp@2.4.2", + "UID": "eaf235720b7bd6d4" }, "Version": "2.4.2", "Layer": {}, @@ -2917,7 +3073,8 @@ { "Name": "autopep8", "Identifier": { - "PURL": "pkg:pypi/autopep8@1.4.3" + "PURL": "pkg:pypi/autopep8@1.4.3", + "UID": "c72404a556d5fefc" }, "Version": "1.4.3", "Layer": {}, @@ -2931,7 +3088,8 @@ { "Name": "babel", "Identifier": { - "PURL": "pkg:pypi/babel@2.6.0" + "PURL": "pkg:pypi/babel@2.6.0", + "UID": "4d4043fc18530c4e" }, "Version": "2.6.0", "Layer": {}, @@ -2945,7 +3103,8 @@ { "Name": "billiard", "Identifier": { - "PURL": "pkg:pypi/billiard@3.6.0.0" + "PURL": "pkg:pypi/billiard@3.6.0.0", + "UID": "a49012bdf0aa6572" }, "Version": "3.6.0.0", "Layer": {}, @@ -2959,7 +3118,8 @@ { "Name": "boto3", "Identifier": { - "PURL": "pkg:pypi/boto3@1.9.130" + "PURL": "pkg:pypi/boto3@1.9.130", + "UID": "4bc185d0ab442a72" }, "Version": "1.9.130", "Layer": {}, @@ -2973,7 +3133,8 @@ { "Name": "botocore", "Identifier": { - "PURL": "pkg:pypi/botocore@1.12.130" + "PURL": "pkg:pypi/botocore@1.12.130", + "UID": "c13ca226c8938c5d" }, "Version": "1.12.130", "Layer": {}, @@ -2987,7 +3148,8 @@ { "Name": "celery", "Identifier": { - "PURL": "pkg:pypi/celery@4.3.0" + "PURL": "pkg:pypi/celery@4.3.0", + "UID": "f1e0486cb7f807fd" }, "Version": "4.3.0", "Layer": {}, @@ -3001,7 +3163,8 @@ { "Name": "certifi", "Identifier": { - "PURL": "pkg:pypi/certifi@2019.3.9" + "PURL": "pkg:pypi/certifi@2019.3.9", + "UID": "56ffce20ab1cfcbf" }, "Version": "2019.3.9", "Layer": {}, @@ -3015,7 +3178,8 @@ { "Name": "chardet", "Identifier": { - "PURL": "pkg:pypi/chardet@3.0.4" + "PURL": "pkg:pypi/chardet@3.0.4", + "UID": "f459dfb7e38575b6" }, "Version": "3.0.4", "Layer": {}, @@ -3029,7 +3193,8 @@ { "Name": "decorator", "Identifier": { - "PURL": "pkg:pypi/decorator@4.4.0" + "PURL": "pkg:pypi/decorator@4.4.0", + "UID": "5453b8bdb53908f4" }, "Version": "4.4.0", "Layer": {}, @@ -3043,7 +3208,8 @@ { "Name": "django", "Identifier": { - "PURL": "pkg:pypi/django@2.0.9" + "PURL": "pkg:pypi/django@2.0.9", + "UID": "ae1afb5dd98fda8d" }, "Version": "2.0.9", "Layer": {}, @@ -3057,7 +3223,8 @@ { "Name": "django-celery-beat", "Identifier": { - "PURL": "pkg:pypi/django-celery-beat@1.4.0" + "PURL": "pkg:pypi/django-celery-beat@1.4.0", + "UID": "2456816e402bc4b2" }, "Version": "1.4.0", "Layer": {}, @@ -3071,7 +3238,8 @@ { "Name": "django-cors-headers", "Identifier": { - "PURL": "pkg:pypi/django-cors-headers@2.5.2" + "PURL": "pkg:pypi/django-cors-headers@2.5.2", + "UID": "6b0c11924c07350" }, "Version": "2.5.2", "Layer": {}, @@ -3085,7 +3253,8 @@ { "Name": "django-extensions", "Identifier": { - "PURL": "pkg:pypi/django-extensions@2.1.6" + "PURL": "pkg:pypi/django-extensions@2.1.6", + "UID": "8837120b637a8fd3" }, "Version": "2.1.6", "Layer": {}, @@ -3099,7 +3268,8 @@ { "Name": "django-postgres-extra", "Identifier": { - "PURL": "pkg:pypi/django-postgres-extra" + "PURL": "pkg:pypi/django-postgres-extra", + "UID": "ef80d693bc9e6b51" }, "Layer": {}, "Locations": [ @@ -3112,7 +3282,8 @@ { "Name": "django-redis-cache", "Identifier": { - "PURL": "pkg:pypi/django-redis-cache@2.0.0" + "PURL": "pkg:pypi/django-redis-cache@2.0.0", + "UID": "d87630c5a30c9d3" }, "Version": "2.0.0", "Layer": {}, @@ -3126,7 +3297,8 @@ { "Name": "django-silk", "Identifier": { - "PURL": "pkg:pypi/django-silk@3.0.1" + "PURL": "pkg:pypi/django-silk@3.0.1", + "UID": "3d7f4ecf81af4fc3" }, "Version": "3.0.1", "Layer": {}, @@ -3140,7 +3312,8 @@ { "Name": "django-timezone-field", "Identifier": { - "PURL": "pkg:pypi/django-timezone-field@3.0" + "PURL": "pkg:pypi/django-timezone-field@3.0", + "UID": "2ed5c8d7d921f353" }, "Version": "3.0", "Layer": {}, @@ -3154,7 +3327,8 @@ { "Name": "djangorestframework", "Identifier": { - "PURL": "pkg:pypi/djangorestframework@3.9.2" + "PURL": "pkg:pypi/djangorestframework@3.9.2", + "UID": "b9818850a6395a78" }, "Version": "3.9.2", "Layer": {}, @@ -3168,7 +3342,8 @@ { "Name": "djangorestframework-jwt", "Identifier": { - "PURL": "pkg:pypi/djangorestframework-jwt@1.11.0" + "PURL": "pkg:pypi/djangorestframework-jwt@1.11.0", + "UID": "e0716ea8c627d52f" }, "Version": "1.11.0", "Layer": {}, @@ -3182,7 +3357,8 @@ { "Name": "docutils", "Identifier": { - "PURL": "pkg:pypi/docutils@0.14" + "PURL": "pkg:pypi/docutils@0.14", + "UID": "10ac97ed7a098f18" }, "Version": "0.14", "Layer": {}, @@ -3196,7 +3372,8 @@ { "Name": "flower", "Identifier": { - "PURL": "pkg:pypi/flower@0.9.3" + "PURL": "pkg:pypi/flower@0.9.3", + "UID": "9faba86de45abcc5" }, "Version": "0.9.3", "Layer": {}, @@ -3210,7 +3387,8 @@ { "Name": "gprof2dot", "Identifier": { - "PURL": "pkg:pypi/gprof2dot@2016.10.13" + "PURL": "pkg:pypi/gprof2dot@2016.10.13", + "UID": "41a5745039319984" }, "Version": "2016.10.13", "Layer": {}, @@ -3224,7 +3402,8 @@ { "Name": "gunicorn", "Identifier": { - "PURL": "pkg:pypi/gunicorn@19.9.0" + "PURL": "pkg:pypi/gunicorn@19.9.0", + "UID": "3feb80b6855d93fc" }, "Version": "19.9.0", "Layer": {}, @@ -3238,7 +3417,8 @@ { "Name": "hiredis", "Identifier": { - "PURL": "pkg:pypi/hiredis@1.0.0" + "PURL": "pkg:pypi/hiredis@1.0.0", + "UID": "bb90d823e31cc905" }, "Version": "1.0.0", "Layer": {}, @@ -3252,7 +3432,8 @@ { "Name": "httplib2", "Identifier": { - "PURL": "pkg:pypi/httplib2@0.12.1" + "PURL": "pkg:pypi/httplib2@0.12.1", + "UID": "cf158fa53fec4809" }, "Version": "0.12.1", "Layer": {}, @@ -3266,7 +3447,8 @@ { "Name": "idna", "Identifier": { - "PURL": "pkg:pypi/idna@2.8" + "PURL": "pkg:pypi/idna@2.8", + "UID": "b14fc2f2a7ef1e0d" }, "Version": "2.8", "Layer": {}, @@ -3280,7 +3462,8 @@ { "Name": "jinja2", "Identifier": { - "PURL": "pkg:pypi/jinja2@2.10.1" + "PURL": "pkg:pypi/jinja2@2.10.1", + "UID": "882fe2359f6ae7d" }, "Version": "2.10.1", "Layer": {}, @@ -3294,7 +3477,8 @@ { "Name": "jmespath", "Identifier": { - "PURL": "pkg:pypi/jmespath@0.9.4" + "PURL": "pkg:pypi/jmespath@0.9.4", + "UID": "82ca41bff20ffe7" }, "Version": "0.9.4", "Layer": {}, @@ -3308,7 +3492,8 @@ { "Name": "kombu", "Identifier": { - "PURL": "pkg:pypi/kombu@4.5.0" + "PURL": "pkg:pypi/kombu@4.5.0", + "UID": "16131f9ec1debbab" }, "Version": "4.5.0", "Layer": {}, @@ -3322,7 +3507,8 @@ { "Name": "markupsafe", "Identifier": { - "PURL": "pkg:pypi/markupsafe@1.1.1" + "PURL": "pkg:pypi/markupsafe@1.1.1", + "UID": "ccd31f5b6cf3b87b" }, "Version": "1.1.1", "Layer": {}, @@ -3336,7 +3522,8 @@ { "Name": "oauth2", "Identifier": { - "PURL": "pkg:pypi/oauth2@1.9.0.post1" + "PURL": "pkg:pypi/oauth2@1.9.0.post1", + "UID": "6ec03a1175710be8" }, "Version": "1.9.0.post1", "Layer": {}, @@ -3350,7 +3537,8 @@ { "Name": "psycopg2-binary", "Identifier": { - "PURL": "pkg:pypi/psycopg2-binary@2.8.1" + "PURL": "pkg:pypi/psycopg2-binary@2.8.1", + "UID": "24ca65b34656f4fe" }, "Version": "2.8.1", "Layer": {}, @@ -3364,7 +3552,8 @@ { "Name": "py", "Identifier": { - "PURL": "pkg:pypi/py@1.8.0" + "PURL": "pkg:pypi/py@1.8.0", + "UID": "cace845a08062384" }, "Version": "1.8.0", "Layer": {}, @@ -3378,7 +3567,8 @@ { "Name": "pycodestyle", "Identifier": { - "PURL": "pkg:pypi/pycodestyle@2.5.0" + "PURL": "pkg:pypi/pycodestyle@2.5.0", + "UID": "5ab70d21f916b062" }, "Version": "2.5.0", "Layer": {}, @@ -3392,7 +3582,8 @@ { "Name": "pycurl", "Identifier": { - "PURL": "pkg:pypi/pycurl@7.43.0.2" + "PURL": "pkg:pypi/pycurl@7.43.0.2", + "UID": "1196e92ba0352e75" }, "Version": "7.43.0.2", "Layer": {}, @@ -3406,7 +3597,8 @@ { "Name": "pygments", "Identifier": { - "PURL": "pkg:pypi/pygments@2.3.1" + "PURL": "pkg:pypi/pygments@2.3.1", + "UID": "ce312b70022257a2" }, "Version": "2.3.1", "Layer": {}, @@ -3420,7 +3612,8 @@ { "Name": "pyjwt", "Identifier": { - "PURL": "pkg:pypi/pyjwt@1.7.1" + "PURL": "pkg:pypi/pyjwt@1.7.1", + "UID": "ca80b0e4aec9de5d" }, "Version": "1.7.1", "Layer": {}, @@ -3434,7 +3627,8 @@ { "Name": "python-crontab", "Identifier": { - "PURL": "pkg:pypi/python-crontab@2.3.6" + "PURL": "pkg:pypi/python-crontab@2.3.6", + "UID": "bc6992ae46534e3" }, "Version": "2.3.6", "Layer": {}, @@ -3448,7 +3642,8 @@ { "Name": "python-dateutil", "Identifier": { - "PURL": "pkg:pypi/python-dateutil@2.8.0" + "PURL": "pkg:pypi/python-dateutil@2.8.0", + "UID": "b2ebaa709e6a347b" }, "Version": "2.8.0", "Layer": {}, @@ -3462,7 +3657,8 @@ { "Name": "python-http-client", "Identifier": { - "PURL": "pkg:pypi/python-http-client@3.1.0" + "PURL": "pkg:pypi/python-http-client@3.1.0", + "UID": "2917289cbf9e4763" }, "Version": "3.1.0", "Layer": {}, @@ -3476,7 +3672,8 @@ { "Name": "pytz", "Identifier": { - "PURL": "pkg:pypi/pytz@2019.1" + "PURL": "pkg:pypi/pytz@2019.1", + "UID": "4ee3e390bf941d50" }, "Version": "2019.1", "Layer": {}, @@ -3490,7 +3687,8 @@ { "Name": "pyyaml", "Identifier": { - "PURL": "pkg:pypi/pyyaml@5.1" + "PURL": "pkg:pypi/pyyaml@5.1", + "UID": "61b1761eb9c760ae" }, "Version": "5.1", "Layer": {}, @@ -3504,7 +3702,8 @@ { "Name": "redis", "Identifier": { - "PURL": "pkg:pypi/redis@3.2.1" + "PURL": "pkg:pypi/redis@3.2.1", + "UID": "265e9c7eea13d22d" }, "Version": "3.2.1", "Layer": {}, @@ -3518,7 +3717,8 @@ { "Name": "requests", "Identifier": { - "PURL": "pkg:pypi/requests@2.21.0" + "PURL": "pkg:pypi/requests@2.21.0", + "UID": "bfa4f165c40babce" }, "Version": "2.21.0", "Layer": {}, @@ -3532,7 +3732,8 @@ { "Name": "retry", "Identifier": { - "PURL": "pkg:pypi/retry@0.9.2" + "PURL": "pkg:pypi/retry@0.9.2", + "UID": "1a4ba07f9995e4ec" }, "Version": "0.9.2", "Layer": {}, @@ -3546,7 +3747,8 @@ { "Name": "s3transfer", "Identifier": { - "PURL": "pkg:pypi/s3transfer@0.2.0" + "PURL": "pkg:pypi/s3transfer@0.2.0", + "UID": "eb74f26bb04808e9" }, "Version": "0.2.0", "Layer": {}, @@ -3560,7 +3762,8 @@ { "Name": "sendgrid", "Identifier": { - "PURL": "pkg:pypi/sendgrid@6.0.4" + "PURL": "pkg:pypi/sendgrid@6.0.4", + "UID": "21f7c84bdff019e5" }, "Version": "6.0.4", "Layer": {}, @@ -3574,7 +3777,8 @@ { "Name": "sentry-sdk", "Identifier": { - "PURL": "pkg:pypi/sentry-sdk@0.7.10" + "PURL": "pkg:pypi/sentry-sdk@0.7.10", + "UID": "2608107c1c7a60c5" }, "Version": "0.7.10", "Layer": {}, @@ -3588,7 +3792,8 @@ { "Name": "six", "Identifier": { - "PURL": "pkg:pypi/six@1.12.0" + "PURL": "pkg:pypi/six@1.12.0", + "UID": "2f910bba245384" }, "Version": "1.12.0", "Layer": {}, @@ -3602,7 +3807,8 @@ { "Name": "sqlparse", "Identifier": { - "PURL": "pkg:pypi/sqlparse@0.3.0" + "PURL": "pkg:pypi/sqlparse@0.3.0", + "UID": "8a41dce5ceb6e25d" }, "Version": "0.3.0", "Layer": {}, @@ -3616,7 +3822,8 @@ { "Name": "tornado", "Identifier": { - "PURL": "pkg:pypi/tornado@5.1.1" + "PURL": "pkg:pypi/tornado@5.1.1", + "UID": "7cb12caf440e98d3" }, "Version": "5.1.1", "Layer": {}, @@ -3630,7 +3837,8 @@ { "Name": "urllib3", "Identifier": { - "PURL": "pkg:pypi/urllib3@1.24.1" + "PURL": "pkg:pypi/urllib3@1.24.1", + "UID": "e6ed0d9bee45f366" }, "Version": "1.24.1", "Layer": {}, @@ -3644,7 +3852,8 @@ { "Name": "vine", "Identifier": { - "PURL": "pkg:pypi/vine@1.3.0" + "PURL": "pkg:pypi/vine@1.3.0", + "UID": "143f2a81995593aa" }, "Version": "1.3.0", "Layer": {}, @@ -3658,7 +3867,8 @@ { "Name": "xmltodict", "Identifier": { - "PURL": "pkg:pypi/xmltodict@0.12.0" + "PURL": "pkg:pypi/xmltodict@0.12.0", + "UID": "c672df016be1530b" }, "Version": "0.12.0", "Layer": {}, diff --git a/pkg/fanal/types/artifact.go b/pkg/fanal/types/artifact.go index 1bc2a0a9575e..6c213a3fad18 100644 --- a/pkg/fanal/types/artifact.go +++ b/pkg/fanal/types/artifact.go @@ -119,6 +119,7 @@ type Package struct { // PkgIdentifier represents a software identifiers in one of more of the supported formats. type PkgIdentifier struct { + UID string `json:",omitempty"` // Calculated by the package struct PURL *packageurl.PackageURL `json:"-"` BOMRef string `json:",omitempty"` // For CycloneDX } @@ -167,7 +168,7 @@ func (id *PkgIdentifier) UnmarshalJSON(data []byte) error { } func (id *PkgIdentifier) Empty() bool { - return id.PURL == nil && id.BOMRef == "" + return id.UID == "" && id.PURL == nil && id.BOMRef == "" } func (id *PkgIdentifier) Match(s string) bool { diff --git a/pkg/rpc/convert.go b/pkg/rpc/convert.go index 5e21e4e1ce4c..033b1944274a 100644 --- a/pkg/rpc/convert.go +++ b/pkg/rpc/convert.go @@ -86,6 +86,7 @@ func ConvertToRPCPkgIdentifier(pkg ftypes.PkgIdentifier) *common.PkgIdentifier { p = pkg.PURL.String() } return &common.PkgIdentifier{ + Uid: pkg.UID, Purl: p, BomRef: pkg.BOMRef, } @@ -236,7 +237,8 @@ func ConvertFromRPCPkgIdentifier(pkg *common.PkgIdentifier) ftypes.PkgIdentifier } pkgID := ftypes.PkgIdentifier{ - BOMRef: pkg.BomRef, + UID: pkg.GetUid(), + BOMRef: pkg.GetBomRef(), } if pkg.Purl != "" { diff --git a/pkg/rpc/convert_test.go b/pkg/rpc/convert_test.go index a74f8eecb99b..f7c7b3d36d86 100644 --- a/pkg/rpc/convert_test.go +++ b/pkg/rpc/convert_test.go @@ -55,6 +55,9 @@ func TestConvertToRpcPkgs(t *testing.T) { }, Digest: "SHA1:901a7b55410321c4d35543506cff2a8613ef5aa2", Indirect: true, + Identifier: ftypes.PkgIdentifier{ + UID: "01", + }, }, }, }, @@ -86,6 +89,9 @@ func TestConvertToRpcPkgs(t *testing.T) { }, Digest: "SHA1:901a7b55410321c4d35543506cff2a8613ef5aa2", Indirect: true, + Identifier: &common.PkgIdentifier{ + Uid: "01", + }, }, }, }, @@ -137,6 +143,9 @@ func TestConvertFromRpcPkgs(t *testing.T) { }, Digest: "SHA1:901a7b55410321c4d35543506cff2a8613ef5aa2", Indirect: true, + Identifier: &common.PkgIdentifier{ + Uid: "01", + }, }, }, }, @@ -168,6 +177,9 @@ func TestConvertFromRpcPkgs(t *testing.T) { }, Digest: "SHA1:901a7b55410321c4d35543506cff2a8613ef5aa2", Indirect: true, + Identifier: ftypes.PkgIdentifier{ + UID: "01", + }, }, }, }, diff --git a/rpc/common/service.pb.go b/rpc/common/service.pb.go index 0174ab2c7f5f..4fcd09927d90 100644 --- a/rpc/common/service.pb.go +++ b/rpc/common/service.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.19.4 +// protoc-gen-go v1.34.0 +// protoc v5.26.1 // source: rpc/common/service.proto package common @@ -639,6 +639,7 @@ type PkgIdentifier struct { Purl string `protobuf:"bytes,1,opt,name=purl,proto3" json:"purl,omitempty"` BomRef string `protobuf:"bytes,2,opt,name=bom_ref,json=bomRef,proto3" json:"bom_ref,omitempty"` + Uid string `protobuf:"bytes,3,opt,name=uid,proto3" json:"uid,omitempty"` } func (x *PkgIdentifier) Reset() { @@ -687,6 +688,13 @@ func (x *PkgIdentifier) GetBomRef() string { return "" } +func (x *PkgIdentifier) GetUid() string { + if x != nil { + return x.Uid + } + return "" +} + type Location struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2457,322 +2465,323 @@ var file_rpc_common_service_proto_rawDesc = []byte{ 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x65, 0x76, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x64, 0x65, 0x76, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x22, 0x3c, 0x0a, 0x0d, 0x50, 0x6b, 0x67, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x74, 0x22, 0x4e, 0x0a, 0x0d, 0x50, 0x6b, 0x67, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x75, 0x72, 0x6c, 0x12, 0x17, 0x0a, 0x07, 0x62, 0x6f, 0x6d, 0x5f, 0x72, 0x65, - 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x6f, 0x6d, 0x52, 0x65, 0x66, 0x22, - 0x44, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, - 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, 0x6e, - 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0xb6, 0x02, 0x0a, 0x10, 0x4d, 0x69, 0x73, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, - 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x39, 0x0a, 0x09, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, + 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x6f, 0x6d, 0x52, 0x65, 0x66, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, + 0x64, 0x22, 0x44, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, + 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0xb6, 0x02, 0x0a, 0x10, 0x4d, 0x69, 0x73, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x66, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, + 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x39, 0x0a, 0x09, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x76, + 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x66, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x09, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x12, 0x37, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x4d, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, + 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x69, 0x73, 0x63, + 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x08, 0x66, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x52, 0x09, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, - 0x37, 0x0a, 0x08, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0a, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0xf3, 0x01, 0x0a, 0x0d, 0x4d, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x45, 0x0a, 0x0f, 0x70, 0x6f, + 0x6c, 0x69, 0x63, 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x0e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x42, 0x0a, 0x0e, 0x63, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x76, + 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x61, 0x75, 0x73, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x63, 0x61, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x07, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x52, 0x02, 0x69, 0x64, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x52, 0x08, 0x73, 0x65, + 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x22, 0xf0, 0x01, 0x0a, 0x0e, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x64, 0x76, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x64, 0x76, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, + 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0xf7, 0x03, 0x0a, 0x18, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4d, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x65, + 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, + 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x76, 0x65, + 0x72, 0x69, 0x74, 0x79, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1f, + 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x72, 0x6c, 0x12, + 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x12, 0x42, 0x0a, 0x0e, 0x63, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, 0x69, + 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x61, 0x75, 0x73, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x63, 0x61, 0x75, 0x73, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x76, 0x64, 0x5f, 0x69, 0x64, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x76, 0x64, 0x49, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x22, 0xff, 0x09, 0x0a, 0x0d, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x76, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x76, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x49, 0x64, + 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6b, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x6b, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, + 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, + 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x66, 0x69, 0x78, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, + 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, + 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, + 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, + 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x72, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0e, 0x70, 0x6b, 0x67, + 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x4d, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x08, - 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x61, 0x69, 0x6c, - 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, 0x69, - 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x69, 0x73, 0x63, 0x6f, 0x6e, - 0x66, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x08, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, - 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x52, 0x0a, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xf3, - 0x01, 0x0a, 0x0d, 0x4d, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x45, 0x0a, 0x0f, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x0e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x42, 0x0a, 0x0e, 0x63, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x61, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x63, 0x61, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x07, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x52, - 0x02, 0x69, 0x64, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, - 0x72, 0x69, 0x74, 0x79, 0x22, 0xf0, 0x01, 0x0a, 0x0e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x64, 0x76, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x64, 0x76, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, - 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, - 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, - 0x65, 0x6e, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0xf7, 0x03, 0x0a, 0x18, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x4d, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, - 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x73, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, - 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x72, 0x69, - 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, - 0x74, 0x79, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1f, 0x0a, 0x0b, - 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x1e, 0x0a, - 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x12, 0x42, 0x0a, 0x0e, 0x63, 0x61, 0x75, 0x73, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x61, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x63, 0x61, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x15, 0x0a, 0x06, 0x61, 0x76, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x61, 0x76, 0x64, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x22, 0xff, 0x09, 0x0a, 0x0d, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x76, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, - 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x49, 0x64, 0x12, 0x19, - 0x0a, 0x08, 0x70, 0x6b, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x70, 0x6b, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x65, 0x64, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x66, - 0x69, 0x78, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, 0x08, 0x73, - 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x0e, 0x70, 0x6b, 0x67, 0x5f, 0x69, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x50, - 0x6b, 0x67, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0d, 0x70, 0x6b, - 0x67, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x05, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x72, 0x69, - 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x52, - 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, - 0x74, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, - 0x39, 0x0a, 0x04, 0x63, 0x76, 0x73, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x56, 0x75, 0x6c, - 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x76, 0x73, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x63, 0x76, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x77, - 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x63, 0x77, 0x65, - 0x49, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x75, - 0x72, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, - 0x79, 0x55, 0x72, 0x6c, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x48, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x10, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x44, 0x61, 0x74, - 0x65, 0x12, 0x48, 0x0a, 0x14, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x61, 0x64, 0x76, 0x69, - 0x73, 0x6f, 0x72, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x41, - 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x10, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x76, 0x75, 0x6c, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x56, 0x75, 0x6c, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, - 0x0a, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x13, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0b, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x64, 0x61, 0x74, - 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x76, 0x65, 0x6e, 0x64, 0x6f, - 0x72, 0x5f, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2f, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x56, 0x65, + 0x2e, 0x50, 0x6b, 0x67, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0d, + 0x70, 0x6b, 0x67, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x29, 0x0a, + 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, + 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x61, 0x79, 0x65, + 0x72, 0x52, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x76, 0x65, + 0x72, 0x69, 0x74, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x12, 0x39, 0x0a, 0x04, 0x63, 0x76, 0x73, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x56, + 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x43, 0x76, 0x73, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x63, 0x76, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, + 0x63, 0x77, 0x65, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x63, + 0x77, 0x65, 0x49, 0x64, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6d, + 0x61, 0x72, 0x79, 0x55, 0x72, 0x6c, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x73, 0x68, 0x65, 0x64, 0x44, 0x61, 0x74, 0x65, 0x12, 0x48, 0x0a, 0x12, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x44, + 0x61, 0x74, 0x65, 0x12, 0x48, 0x0a, 0x14, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x61, 0x64, + 0x76, 0x69, 0x73, 0x6f, 0x72, 0x79, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, + 0x10, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x76, 0x75, 0x6c, 0x6e, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x56, 0x75, 0x6c, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, + 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x13, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x64, 0x73, 0x12, 0x39, + 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x14, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x64, + 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x76, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x5f, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x15, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x56, 0x75, 0x6c, 0x6e, 0x65, 0x72, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, + 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0e, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x53, 0x65, 0x76, 0x65, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6b, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6b, 0x67, 0x50, 0x61, 0x74, 0x68, 0x12, 0x15, + 0x0a, 0x06, 0x70, 0x6b, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x70, 0x6b, 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x4b, 0x0a, + 0x09, 0x43, 0x76, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x72, + 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x56, 0x53, 0x53, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x59, 0x0a, 0x13, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0e, 0x76, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, - 0x79, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6b, 0x67, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x16, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6b, 0x67, 0x50, 0x61, 0x74, 0x68, 0x12, 0x15, 0x0a, 0x06, - 0x70, 0x6b, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x6b, - 0x67, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x18, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x4b, 0x0a, 0x09, 0x43, - 0x76, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x72, 0x69, 0x76, - 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x56, 0x53, 0x53, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x59, 0x0a, 0x13, 0x56, 0x65, 0x6e, 0x64, - 0x6f, 0x72, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x16, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x42, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x57, 0x0a, 0x05, 0x4c, 0x61, 0x79, 0x65, 0x72, - 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x69, 0x66, 0x66, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x69, 0x66, 0x66, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x42, 0x79, - 0x22, 0xc3, 0x01, 0x0a, 0x0d, 0x43, 0x61, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6c, 0x69, - 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, - 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x26, - 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, - 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x64, 0x65, - 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x76, 0x0a, 0x04, 0x43, 0x56, 0x53, 0x53, 0x12, 0x1b, - 0x0a, 0x09, 0x76, 0x32, 0x5f, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x76, 0x32, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x76, - 0x33, 0x5f, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x76, 0x33, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x76, 0x32, 0x5f, 0x73, - 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x76, 0x32, 0x53, 0x63, - 0x6f, 0x72, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x76, 0x33, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x76, 0x33, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x98, - 0x01, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x29, 0x0a, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x12, 0x2a, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xf3, 0x01, 0x0a, 0x04, 0x4c, 0x69, - 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x63, 0x61, 0x75, 0x73, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x43, 0x61, 0x75, 0x73, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x20, 0x0a, - 0x0b, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x43, 0x61, 0x75, 0x73, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x61, 0x75, 0x73, 0x65, 0x22, - 0x30, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x22, 0x9f, 0x02, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x46, 0x69, 0x6e, 0x64, - 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, - 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, - 0x72, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, 0x6e, 0x64, - 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x12, 0x29, 0x0a, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4a, 0x04, 0x08, - 0x09, 0x10, 0x0a, 0x22, 0x5d, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x69, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, - 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x64, 0x69, 0x6e, - 0x67, 0x73, 0x22, 0x85, 0x02, 0x0a, 0x0f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, - 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, - 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x08, 0x63, 0x61, - 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x74, - 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x63, 0x65, - 0x6e, 0x73, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x6e, 0x75, 0x6d, - 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6b, - 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6b, - 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, - 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0xed, 0x01, 0x0a, 0x0b, 0x4c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x6c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1e, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x45, 0x6e, 0x75, 0x6d, - 0x52, 0x0b, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6b, - 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6b, - 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x67, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x46, 0x69, - 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x29, 0x0a, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x61, - 0x79, 0x65, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x22, 0x98, 0x01, 0x0a, 0x0e, 0x4c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x3e, 0x0a, - 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x22, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x45, - 0x6e, 0x75, 0x6d, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x95, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0x81, 0x01, 0x0a, 0x04, 0x45, 0x6e, - 0x75, 0x6d, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x4f, 0x52, 0x42, 0x49, 0x44, 0x44, 0x45, 0x4e, - 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x53, 0x54, 0x52, 0x49, 0x43, 0x54, 0x45, 0x44, - 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x43, 0x49, 0x50, 0x52, 0x4f, 0x43, 0x41, 0x4c, - 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x54, 0x49, 0x43, 0x45, 0x10, 0x04, 0x12, 0x0e, - 0x0a, 0x0a, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x56, 0x45, 0x10, 0x05, 0x12, 0x10, - 0x0a, 0x0c, 0x55, 0x4e, 0x45, 0x4e, 0x43, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x45, 0x44, 0x10, 0x06, - 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x07, 0x22, 0x4e, 0x0a, - 0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3f, 0x0a, 0x04, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x42, 0x0a, 0x0a, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x57, 0x0a, 0x05, 0x4c, 0x61, 0x79, + 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x69, + 0x66, 0x66, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x69, 0x66, + 0x66, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x62, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x42, 0x79, 0x22, 0xc3, 0x01, 0x0a, 0x0d, 0x43, 0x61, 0x75, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x4c, 0x69, 0x6e, 0x65, + 0x12, 0x26, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, + 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x76, 0x0a, 0x04, 0x43, 0x56, 0x53, 0x53, + 0x12, 0x1b, 0x0a, 0x09, 0x76, 0x32, 0x5f, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x76, 0x32, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1b, 0x0a, + 0x09, 0x76, 0x33, 0x5f, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x76, 0x33, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x76, 0x32, + 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x76, 0x32, + 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x76, 0x33, 0x5f, 0x73, 0x63, 0x6f, 0x72, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x07, 0x76, 0x33, 0x53, 0x63, 0x6f, 0x72, 0x65, + 0x22, 0x98, 0x01, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x29, 0x0a, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x12, + 0x2a, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xf3, 0x01, 0x0a, 0x04, + 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x43, 0x61, 0x75, 0x73, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x20, 0x0a, 0x0b, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x65, + 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x43, 0x61, 0x75, + 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x75, 0x73, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x61, 0x75, 0x73, + 0x65, 0x22, 0x30, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x05, 0x6c, 0x69, + 0x6e, 0x65, 0x73, 0x22, 0x9f, 0x02, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x46, 0x69, + 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, + 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, + 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x65, + 0x6e, 0x64, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, + 0x6e, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, + 0x61, 0x74, 0x63, 0x68, 0x12, 0x29, 0x0a, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4a, + 0x04, 0x08, 0x09, 0x10, 0x0a, 0x22, 0x5d, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x70, 0x61, 0x74, 0x68, 0x12, 0x37, 0x0a, 0x08, 0x66, + 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x22, 0x85, 0x02, 0x0a, 0x0f, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x65, 0x76, 0x65, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x74, 0x72, 0x69, + 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, + 0x74, 0x79, 0x52, 0x08, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x08, + 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, + 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, + 0x63, 0x65, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x6e, + 0x75, 0x6d, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x19, 0x0a, 0x08, + 0x70, 0x6b, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x6b, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0xed, 0x01, 0x0a, + 0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x0c, + 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x45, 0x6e, + 0x75, 0x6d, 0x52, 0x0b, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, + 0x70, 0x6b, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x6b, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x67, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x72, 0x69, 0x76, + 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, + 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x67, 0x69, 0x6e, 0x67, + 0x73, 0x12, 0x29, 0x0a, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x4c, 0x61, 0x79, 0x65, 0x72, 0x52, 0x05, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x22, 0x98, 0x01, 0x0a, + 0x0e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x46, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, + 0x3e, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x22, 0x95, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x63, 0x65, + 0x6e, 0x73, 0x65, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x22, 0x81, 0x01, 0x0a, 0x04, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x50, 0x4b, 0x47, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, - 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x44, 0x0a, - 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, - 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, - 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x49, 0x54, 0x49, 0x43, 0x41, - 0x4c, 0x10, 0x04, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x61, 0x71, 0x75, 0x61, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2f, 0x74, - 0x72, 0x69, 0x76, 0x79, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3b, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x4f, 0x52, 0x42, 0x49, 0x44, 0x44, + 0x45, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x53, 0x54, 0x52, 0x49, 0x43, 0x54, + 0x45, 0x44, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x43, 0x49, 0x50, 0x52, 0x4f, 0x43, + 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x4f, 0x54, 0x49, 0x43, 0x45, 0x10, 0x04, + 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x56, 0x45, 0x10, 0x05, + 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x4e, 0x45, 0x4e, 0x43, 0x55, 0x4d, 0x42, 0x45, 0x52, 0x45, 0x44, + 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x07, 0x22, + 0x4e, 0x0a, 0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x3f, + 0x0a, 0x04, 0x45, 0x6e, 0x75, 0x6d, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x50, 0x4b, 0x47, 0x10, + 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x48, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x02, 0x12, 0x10, 0x0a, + 0x0c, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x03, 0x2a, + 0x44, 0x0a, 0x08, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x12, 0x0b, 0x0a, 0x07, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, + 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, 0x10, 0x02, 0x12, 0x08, 0x0a, + 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x49, 0x54, 0x49, + 0x43, 0x41, 0x4c, 0x10, 0x04, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x71, 0x75, 0x61, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x2f, 0x74, 0x72, 0x69, 0x76, 0x79, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/rpc/common/service.proto b/rpc/common/service.proto index d5c1472b4aef..8882bbf20e39 100644 --- a/rpc/common/service.proto +++ b/rpc/common/service.proto @@ -59,6 +59,7 @@ message Package { message PkgIdentifier { string purl = 1; string bom_ref = 2; + string uid = 3; } message Location {