private static @NotNull Pair<ThreeState, JsonSchemaObject> propertyStep(@NotNull String name,
                                                                          @NotNull JsonSchemaObject parent) {
    final JsonSchemaObject child = parent.getPropertyByName(name);
    if (child != null) {
      return Pair.create(ThreeState.UNSURE, inheritBaseSchemaIfNeeded(parent, child));
    }
    final JsonSchemaObject schema = parent.getMatchingPatternPropertySchema(name);
    if (schema != null) {
      return Pair.create(ThreeState.UNSURE, inheritBaseSchemaIfNeeded(parent, schema));
    }
    if (parent.getAdditionalPropertiesSchema() != null) {
      return Pair.create(ThreeState.UNSURE, inheritBaseSchemaIfNeeded(parent, parent.getAdditionalPropertiesSchema()));
    }
    if (Boolean.FALSE.equals(parent.getAdditionalPropertiesAllowed())) {
      return Pair.create(ThreeState.NO, null);
    }

    JsonSchemaObject unevaluatedPropertiesSchema = parent.getUnevaluatedPropertiesSchema();
    if (unevaluatedPropertiesSchema != null) {
      if (Boolean.TRUE.equals(unevaluatedPropertiesSchema.getConstantSchema())) {
        return Pair.create(ThreeState.YES, inheritBaseSchemaIfNeeded(parent, unevaluatedPropertiesSchema));
      }
      else {
        return Pair.create(ThreeState.UNSURE, inheritBaseSchemaIfNeeded(parent, unevaluatedPropertiesSchema));
      }
    }
    // by default, additional properties are allowed
    return Pair.create(ThreeState.YES, null);
  }
private static @NotNull Pair<ThreeState, JsonSchemaObject> propertyStep(@NotNull String name,
                                                                          @NotNull JsonSchemaObject parent)