FIREBASEAPPDISTRIBUTION

firebaseappdistribution.apps.get

enum_AppViewParameter := [ "APP_VIEW_UNSPECIFIED", "BASIC", "FULL" ]

valid {
    input.ReqMap.mobilesdkAppId == STRING
    input.Qs.appView == enum_AppViewParameter[_]
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.apps.getJwt

valid {
    input.ReqMap.mobilesdkAppId == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.apps.provisionApp

valid {
    input.ReqMap.mobilesdkAppId == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.apps.release_by_hash.get

valid {
    input.ReqMap.mobilesdkAppId == STRING
    input.ReqMap.uploadHash == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.apps.releases.enable_access

valid {
    input.Body.buildVersion == STRING
    input.Body.displayVersion == STRING
    input.Body.emails[_] == STRING
    input.Body.groupIds[_] == STRING
    input.ReqMap.mobilesdkAppId == STRING
    input.ReqMap.releaseId == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.apps.releases.notes.create

valid {
    input.Body.releaseNotes.releaseNotes == STRING
    input.ReqMap.mobilesdkAppId == STRING
    input.ReqMap.releaseId == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.apps.testers.getTesterUdids

valid {
    input.ReqMap.mobilesdkAppId == STRING
    input.Qs.project == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.apps.upload_status.get

valid {
    input.ReqMap.mobilesdkAppId == STRING
    input.ReqMap.uploadToken == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.media.upload

enum_GdataCompositeMediaReferenceType := [ "PATH", "BLOB_REF", "INLINE", "BIGSTORE_REF", "COSMO_BINARY_REFERENCE" ]
enum_GdataMediaReferenceType := [ "PATH", "BLOB_REF", "INLINE", "GET_MEDIA", "COMPOSITE_MEDIA", "BIGSTORE_REF", "DIFF_VERSION_RESPONSE", "DIFF_CHECKSUMS_RESPONSE", "DIFF_DOWNLOAD_RESPONSE", "DIFF_UPLOAD_REQUEST", "DIFF_UPLOAD_RESPONSE", "COSMO_BINARY_REFERENCE", "ARBITRARY_BYTES" ]

valid {
    input.Body.blob.algorithm == STRING
    input.Body.blob.bigstoreObjectRef == STRING
    input.Body.blob.blobRef == STRING
    input.Body.blob.blobstore2Info.blobGeneration == STRING
    input.Body.blob.blobstore2Info.blobId == STRING
    input.Body.blob.blobstore2Info.downloadReadHandle == STRING
    input.Body.blob.blobstore2Info.readToken == STRING
    input.Body.blob.blobstore2Info.uploadMetadataContainer == STRING
    input.Body.blob.compositeMedia[_].blobRef == STRING
    input.Body.blob.compositeMedia[_].blobstore2Info.blobGeneration == STRING
    input.Body.blob.compositeMedia[_].blobstore2Info.blobId == STRING
    input.Body.blob.compositeMedia[_].blobstore2Info.downloadReadHandle == STRING
    input.Body.blob.compositeMedia[_].blobstore2Info.readToken == STRING
    input.Body.blob.compositeMedia[_].blobstore2Info.uploadMetadataContainer == STRING
    input.Body.blob.compositeMedia[_].cosmoBinaryReference == STRING
    input.Body.blob.compositeMedia[_].crc32cHash == INTEGER
    input.Body.blob.compositeMedia[_].inline == STRING
    input.Body.blob.compositeMedia[_].length == STRING
    input.Body.blob.compositeMedia[_].md5Hash == STRING
    input.Body.blob.compositeMedia[_].objectId.bucketName == STRING
    input.Body.blob.compositeMedia[_].objectId.generation == STRING
    input.Body.blob.compositeMedia[_].objectId.objectName == STRING
    input.Body.blob.compositeMedia[_].path == STRING
    input.Body.blob.compositeMedia[_].referenceType == enum_GdataCompositeMediaReferenceType[_]
    input.Body.blob.compositeMedia[_].sha1Hash == STRING
    input.Body.blob.contentType == STRING
    input.Body.blob.contentTypeInfo.bestGuess == STRING
    input.Body.blob.contentTypeInfo.fromBytes == STRING
    input.Body.blob.contentTypeInfo.fromFileName == STRING
    input.Body.blob.contentTypeInfo.fromHeader == STRING
    input.Body.blob.contentTypeInfo.fromUrlPath == STRING
    input.Body.blob.cosmoBinaryReference == STRING
    input.Body.blob.crc32cHash == INTEGER
    input.Body.blob.diffChecksumsResponse.checksumsLocation.blobRef == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.blobstore2Info.blobGeneration == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.blobstore2Info.blobId == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.blobstore2Info.downloadReadHandle == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.blobstore2Info.readToken == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.blobstore2Info.uploadMetadataContainer == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.cosmoBinaryReference == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.crc32cHash == INTEGER
    input.Body.blob.diffChecksumsResponse.checksumsLocation.inline == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.length == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.md5Hash == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.objectId.bucketName == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.objectId.generation == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.objectId.objectName == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.path == STRING
    input.Body.blob.diffChecksumsResponse.checksumsLocation.referenceType == enum_GdataCompositeMediaReferenceType[_]
    input.Body.blob.diffChecksumsResponse.checksumsLocation.sha1Hash == STRING
    input.Body.blob.diffChecksumsResponse.chunkSizeBytes == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.blobRef == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.blobstore2Info.blobGeneration == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.blobstore2Info.blobId == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.blobstore2Info.downloadReadHandle == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.blobstore2Info.readToken == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.blobstore2Info.uploadMetadataContainer == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.cosmoBinaryReference == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.crc32cHash == INTEGER
    input.Body.blob.diffChecksumsResponse.objectLocation.inline == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.length == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.md5Hash == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.objectId.bucketName == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.objectId.generation == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.objectId.objectName == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.path == STRING
    input.Body.blob.diffChecksumsResponse.objectLocation.referenceType == enum_GdataCompositeMediaReferenceType[_]
    input.Body.blob.diffChecksumsResponse.objectLocation.sha1Hash == STRING
    input.Body.blob.diffChecksumsResponse.objectSizeBytes == STRING
    input.Body.blob.diffChecksumsResponse.objectVersion == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.blobRef == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.blobstore2Info.blobGeneration == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.blobstore2Info.blobId == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.blobstore2Info.downloadReadHandle == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.blobstore2Info.readToken == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.blobstore2Info.uploadMetadataContainer == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.cosmoBinaryReference == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.crc32cHash == INTEGER
    input.Body.blob.diffDownloadResponse.objectLocation.inline == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.length == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.md5Hash == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.objectId.bucketName == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.objectId.generation == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.objectId.objectName == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.path == STRING
    input.Body.blob.diffDownloadResponse.objectLocation.referenceType == enum_GdataCompositeMediaReferenceType[_]
    input.Body.blob.diffDownloadResponse.objectLocation.sha1Hash == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.blobRef == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.blobstore2Info.blobGeneration == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.blobstore2Info.blobId == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.blobstore2Info.downloadReadHandle == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.blobstore2Info.readToken == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.blobstore2Info.uploadMetadataContainer == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.cosmoBinaryReference == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.crc32cHash == INTEGER
    input.Body.blob.diffUploadRequest.checksumsInfo.inline == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.length == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.md5Hash == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.objectId.bucketName == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.objectId.generation == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.objectId.objectName == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.path == STRING
    input.Body.blob.diffUploadRequest.checksumsInfo.referenceType == enum_GdataCompositeMediaReferenceType[_]
    input.Body.blob.diffUploadRequest.checksumsInfo.sha1Hash == STRING
    input.Body.blob.diffUploadRequest.objectInfo.blobRef == STRING
    input.Body.blob.diffUploadRequest.objectInfo.blobstore2Info.blobGeneration == STRING
    input.Body.blob.diffUploadRequest.objectInfo.blobstore2Info.blobId == STRING
    input.Body.blob.diffUploadRequest.objectInfo.blobstore2Info.downloadReadHandle == STRING
    input.Body.blob.diffUploadRequest.objectInfo.blobstore2Info.readToken == STRING
    input.Body.blob.diffUploadRequest.objectInfo.blobstore2Info.uploadMetadataContainer == STRING
    input.Body.blob.diffUploadRequest.objectInfo.cosmoBinaryReference == STRING
    input.Body.blob.diffUploadRequest.objectInfo.crc32cHash == INTEGER
    input.Body.blob.diffUploadRequest.objectInfo.inline == STRING
    input.Body.blob.diffUploadRequest.objectInfo.length == STRING
    input.Body.blob.diffUploadRequest.objectInfo.md5Hash == STRING
    input.Body.blob.diffUploadRequest.objectInfo.objectId.bucketName == STRING
    input.Body.blob.diffUploadRequest.objectInfo.objectId.generation == STRING
    input.Body.blob.diffUploadRequest.objectInfo.objectId.objectName == STRING
    input.Body.blob.diffUploadRequest.objectInfo.path == STRING
    input.Body.blob.diffUploadRequest.objectInfo.referenceType == enum_GdataCompositeMediaReferenceType[_]
    input.Body.blob.diffUploadRequest.objectInfo.sha1Hash == STRING
    input.Body.blob.diffUploadRequest.objectVersion == STRING
    input.Body.blob.diffUploadResponse.objectVersion == STRING
    input.Body.blob.diffUploadResponse.originalObject.blobRef == STRING
    input.Body.blob.diffUploadResponse.originalObject.blobstore2Info.blobGeneration == STRING
    input.Body.blob.diffUploadResponse.originalObject.blobstore2Info.blobId == STRING
    input.Body.blob.diffUploadResponse.originalObject.blobstore2Info.downloadReadHandle == STRING
    input.Body.blob.diffUploadResponse.originalObject.blobstore2Info.readToken == STRING
    input.Body.blob.diffUploadResponse.originalObject.blobstore2Info.uploadMetadataContainer == STRING
    input.Body.blob.diffUploadResponse.originalObject.cosmoBinaryReference == STRING
    input.Body.blob.diffUploadResponse.originalObject.crc32cHash == INTEGER
    input.Body.blob.diffUploadResponse.originalObject.inline == STRING
    input.Body.blob.diffUploadResponse.originalObject.length == STRING
    input.Body.blob.diffUploadResponse.originalObject.md5Hash == STRING
    input.Body.blob.diffUploadResponse.originalObject.objectId.bucketName == STRING
    input.Body.blob.diffUploadResponse.originalObject.objectId.generation == STRING
    input.Body.blob.diffUploadResponse.originalObject.objectId.objectName == STRING
    input.Body.blob.diffUploadResponse.originalObject.path == STRING
    input.Body.blob.diffUploadResponse.originalObject.referenceType == enum_GdataCompositeMediaReferenceType[_]
    input.Body.blob.diffUploadResponse.originalObject.sha1Hash == STRING
    input.Body.blob.diffVersionResponse.objectSizeBytes == STRING
    input.Body.blob.diffVersionResponse.objectVersion == STRING
    input.Body.blob.downloadParameters.allowGzipCompression == BOOLEAN
    input.Body.blob.downloadParameters.ignoreRange == BOOLEAN
    input.Body.blob.filename == STRING
    input.Body.blob.hash == STRING
    input.Body.blob.hashVerified == BOOLEAN
    input.Body.blob.inline == STRING
    input.Body.blob.isPotentialRetry == BOOLEAN
    input.Body.blob.length == STRING
    input.Body.blob.md5Hash == STRING
    input.Body.blob.mediaId == STRING
    input.Body.blob.objectId.bucketName == STRING
    input.Body.blob.objectId.generation == STRING
    input.Body.blob.objectId.objectName == STRING
    input.Body.blob.path == STRING
    input.Body.blob.referenceType == enum_GdataMediaReferenceType[_]
    input.Body.blob.sha1Hash == STRING
    input.Body.blob.sha256Hash == STRING
    input.Body.blob.timestamp == STRING
    input.Body.blob.token == STRING
    input.ReqMap.app == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.getAabInfo

valid {
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.getTestConfig

valid {
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.batchDelete

valid {
    input.Body.names[_] == STRING
    input.ReqMap.parent == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.distribute

valid {
    input.Body.groupAliases[_] == STRING
    input.Body.testerEmails[_] == STRING
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.feedbackReports.delete

valid {
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.feedbackReports.get

valid {
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.feedbackReports.list

valid {
    input.ReqMap.parent == STRING
    input.Qs.pageSize == INTEGER
    input.Qs.pageToken == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.get

valid {
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.list

valid {
    input.ReqMap.parent == STRING
    input.Qs.filter == STRING
    input.Qs.orderBy == STRING
    input.Qs.pageSize == INTEGER
    input.Qs.pageToken == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.operations.cancel

valid {
    input.Body.STRING == STRING
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.operations.delete

valid {
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.operations.get

valid {
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.operations.list

valid {
    input.ReqMap.name == STRING
    input.Qs.filter == STRING
    input.Qs.pageSize == INTEGER
    input.Qs.pageToken == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.operations.wait

valid {
    input.Body.timeout == STRING
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.patch

valid {
    input.Body.name == STRING
    input.Body.releaseNotes.text == STRING
    input.ReqMap.name == STRING
    input.Qs.updateMask == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.tests.cancel

valid {
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.tests.create

valid {
    input.Body.aiInstructions.appDescription == STRING
    input.Body.aiInstructions.steps[_].assertion == STRING
    input.Body.aiInstructions.steps[_].goal == STRING
    input.Body.aiInstructions.steps[_].hint == STRING
    input.Body.aiInstructions.steps[_].successCriteria == STRING
    input.Body.deviceExecutions[_].device.locale == STRING
    input.Body.deviceExecutions[_].device.model == STRING
    input.Body.deviceExecutions[_].device.orientation == STRING
    input.Body.deviceExecutions[_].device.version == STRING
    input.Body.displayName == STRING
    input.Body.loginCredential.fieldHints.passwordResourceName == STRING
    input.Body.loginCredential.fieldHints.usernameResourceName == STRING
    input.Body.loginCredential.google == BOOLEAN
    input.Body.loginCredential.password == STRING
    input.Body.loginCredential.username == STRING
    input.Body.name == STRING
    input.Body.testCase == STRING
    input.ReqMap.parent == STRING
    input.Qs.releaseTestId == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.tests.get

valid {
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.releases.tests.list

enum_ViewParameter := [ "RELEASE_TEST_VIEW_UNSPECIFIED", "RELEASE_TEST_VIEW_BASIC", "RELEASE_TEST_VIEW_FULL" ]

valid {
    input.ReqMap.parent == STRING
    input.Qs.pageSize == INTEGER
    input.Qs.pageToken == STRING
    input.Qs.view == enum_ViewParameter[_]
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.testCases.create

valid {
    input.Body.aiInstructions.appDescription == STRING
    input.Body.aiInstructions.steps[_].assertion == STRING
    input.Body.aiInstructions.steps[_].goal == STRING
    input.Body.aiInstructions.steps[_].hint == STRING
    input.Body.aiInstructions.steps[_].successCriteria == STRING
    input.Body.displayName == STRING
    input.Body.name == STRING
    input.ReqMap.parent == STRING
    input.Qs.testCaseId == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.testCases.delete

valid {
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.testCases.get

valid {
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.testCases.list

valid {
    input.ReqMap.parent == STRING
    input.Qs.pageSize == INTEGER
    input.Qs.pageToken == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.testCases.patch

valid {
    input.Body.aiInstructions.appDescription == STRING
    input.Body.aiInstructions.steps[_].assertion == STRING
    input.Body.aiInstructions.steps[_].goal == STRING
    input.Body.aiInstructions.steps[_].hint == STRING
    input.Body.aiInstructions.steps[_].successCriteria == STRING
    input.Body.displayName == STRING
    input.Body.name == STRING
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.apps.updateTestConfig

valid {
    input.Body.displayName == STRING
    input.Body.name == STRING
    input.Body.roboCrawler.aiInstructions.appDescription == STRING
    input.Body.roboCrawler.aiInstructions.steps[_].assertion == STRING
    input.Body.roboCrawler.aiInstructions.steps[_].goal == STRING
    input.Body.roboCrawler.aiInstructions.steps[_].hint == STRING
    input.Body.roboCrawler.aiInstructions.steps[_].successCriteria == STRING
    input.Body.roboCrawler.loginCredential.fieldHints.passwordResourceName == STRING
    input.Body.roboCrawler.loginCredential.fieldHints.usernameResourceName == STRING
    input.Body.roboCrawler.loginCredential.google == BOOLEAN
    input.Body.roboCrawler.loginCredential.password == STRING
    input.Body.roboCrawler.loginCredential.username == STRING
    input.Body.testDevices[_].locale == STRING
    input.Body.testDevices[_].model == STRING
    input.Body.testDevices[_].orientation == STRING
    input.Body.testDevices[_].version == STRING
    input.ReqMap.name == STRING
    input.Qs.updateMask == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.groups.batchJoin

valid {
    input.Body.createMissingTesters == BOOLEAN
    input.Body.emails[_] == STRING
    input.ReqMap.group == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.groups.batchLeave

valid {
    input.Body.emails[_] == STRING
    input.ReqMap.group == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.groups.create

valid {
    input.Body.displayName == STRING
    input.Body.name == STRING
    input.ReqMap.parent == STRING
    input.Qs.groupId == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.groups.delete

valid {
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.groups.get

valid {
    input.ReqMap.name == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.groups.list

valid {
    input.ReqMap.parent == STRING
    input.Qs.pageSize == INTEGER
    input.Qs.pageToken == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.groups.patch

valid {
    input.Body.displayName == STRING
    input.Body.name == STRING
    input.ReqMap.name == STRING
    input.Qs.updateMask == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.testers.batchAdd

valid {
    input.Body.emails[_] == STRING
    input.ReqMap.ProjectID == STRING
    input.ProviderMetadata.Region == STRING
    input.ProviderMetadata.ProjectID == STRING
}

firebaseappdistribution.projects.testers.batchRemove

valid {
    input.Body.emails[_] == STRING
    input.ReqMap.ProjectID == STRING
    input.ProviderMetadata.Region == STRING
    input.ProviderMetadata.ProjectID == STRING
}

firebaseappdistribution.projects.testers.getUdids

valid {
    input.ReqMap.ProjectID == STRING
    input.Qs.mobilesdkAppId == STRING
    input.ProviderMetadata.Region == STRING
    input.ProviderMetadata.ProjectID == STRING
}

firebaseappdistribution.projects.testers.list

valid {
    input.ReqMap.parent == STRING
    input.Qs.filter == STRING
    input.Qs.pageSize == INTEGER
    input.Qs.pageToken == STRING
    input.ProviderMetadata.Region == STRING
}

firebaseappdistribution.projects.testers.patch

valid {
    input.Body.displayName == STRING
    input.Body.groups[_] == STRING
    input.Body.name == STRING
    input.ReqMap.name == STRING
    input.Qs.updateMask == STRING
    input.ProviderMetadata.Region == STRING
}