private void calculateUntagApi(
            Model model,
            ServiceShape service,
            Map<String, ShapeId> operationMap
    ) {
        TopDownIndex topDownIndex = TopDownIndex.of(model);
        OperationIndex operationIndex = OperationIndex.of(model);

        if (operationMap.containsKey(TaggingShapeUtils.UNTAG_RESOURCE_OPNAME)) {
            ShapeId untagOperationId = operationMap.get(TaggingShapeUtils.UNTAG_RESOURCE_OPNAME);
            shapeToUntagOperation.put(service.getId(), untagOperationId);
            OperationShape untagOperation = model.expectShape(untagOperationId, OperationShape.class);
            if (TaggingShapeUtils.verifyUntagResourceOperation(model, untagOperation, operationIndex)) {
                serviceUntagOperationIsValid.add(service.getId());
            }
        }
        for (ResourceShape resourceShape : topDownIndex.getContainedResources(service)) {
            shapeToUntagOperation.put(resourceShape.getId(),
                    resourceShape.getTrait(TaggableTrait.class)
                            .flatMap(TaggableTrait::getApiConfig)
                            .map(TaggableApiConfig::getUntagApi)
                            .orElse(shapeToUntagOperation.get(service.getId())));
        }
    }
Gets the verification result of whether or not the service has a named ListTagsForResource operation that meets
the expected critiera for ListTagsForResource.

@param serviceId the ShapeID of the service shape the ListTagsForResource operation should be bound to.
@return True iff the service shape has a service bound operation named 'ListTagsForResource' that also satisfies
  the criteria for a valid ListTagsForResource operation.
smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/tagging/AwsTagIndex.java