public static synchronized boolean contains(@NonNull String polygonInString, @NonNull Coordinates coordinates) {
        if (polygonInString.isEmpty() || polygonInString.isBlank()) {
            throw new RuntimeException("Polygon string can't be empty or null!");
        }

        JsonArray polygonsJson = normalizePolygonsJson(JsonParser.parseString(polygonInString).getAsJsonArray());
        List<Geometry> polygons = buildPolygonsFromJson(polygonsJson);
        Set<Geometry> holes = extractHolesFrom(polygons);
        polygons.removeIf(holes::contains);

        Geometry globalGeometry = unionToGlobalGeometry(polygons, holes);
        var point = jtsCtx.getShapeFactory().getGeometryFactory()
                .createPoint(new Coordinate(coordinates.getLatitude(), coordinates.getLongitude()));

        return globalGeometry.contains(point);
    }
@Test
    public void testPointsInComplexPolygons() {
        Assertions.assertTrue(GeoUtil.contains(SAND_CLOCK, POINT_INSIDE_SAND_CLOCK_CENTER),
                "Polygon " + SAND_CLOCK + " must contain the dot " + POINT_INSIDE_SAND_CLOCK_CENTER
                );
        Assertions.assertTrue(GeoUtil.contains(SAND_CLOCK, POINT_INSIDE_SAND_CLOCK_NEAR_BORDER),
                "Polygon " + SAND_CLOCK + " must contain the dot " + POINT_INSIDE_SAND_CLOCK_NEAR_BORDER
                );
        Assertions.assertTrue(GeoUtil.contains(SAND_CLOCK_WITH_HOLE_IN_CENTER, POINT_INSIDE_SAND_CLOCK_NEAR_BORDER),
                "Polygon " + SAND_CLOCK_WITH_HOLE_IN_CENTER + " must contain the dot "
                                + POINT_INSIDE_SAND_CLOCK_NEAR_BORDER
                );

        Assertions.assertFalse(GeoUtil.contains(SAND_CLOCK, POINT_OUTSIDE_SAND_CLOCK_1),
                "Polygon " + SAND_CLOCK + " must not contain the dot "
                                + POINT_OUTSIDE_SAND_CLOCK_1
                );
        Assertions.assertFalse(GeoUtil.contains(SAND_CLOCK, POINT_OUTSIDE_SAND_CLOCK_2),
                "Polygon " + SAND_CLOCK + " must not contain the dot "
                                + POINT_OUTSIDE_SAND_CLOCK_2
                );
        Assertions.assertFalse(GeoUtil.contains(SAND_CLOCK_WITH_HOLE_IN_CENTER, POINT_INSIDE_SAND_CLOCK_CENTER),
                "Polygon " + SAND_CLOCK_WITH_HOLE_IN_CENTER + " must not contain the dot "
                                + POINT_INSIDE_SAND_CLOCK_CENTER
                );
        Assertions.assertFalse(GeoUtil.contains(SAND_CLOCK_WITH_HOLE_IN_CENTER, POINT_OUTSIDE_SAND_CLOCK_1),
                "Polygon " + SAND_CLOCK_WITH_HOLE_IN_CENTER + " must not contain the dot "
                                + POINT_OUTSIDE_SAND_CLOCK_1
                );
        Assertions.assertFalse(GeoUtil.contains(SAND_CLOCK_WITH_HOLE_IN_CENTER, POINT_OUTSIDE_SAND_CLOCK_2),
                "Polygon " + SAND_CLOCK_WITH_HOLE_IN_CENTER + " must not contain the dot "
                                + POINT_OUTSIDE_SAND_CLOCK_2
                );
    }