From 8b95ecac7155ad90c1021cb91920ded706dafdce Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 19 Jun 2020 16:24:02 -0700 Subject: [PATCH 01/11] [google_maps_flutter] Pass a constant identifier to plugin builder, so we can use cache effectively in web. --- .../google_maps_flutter/lib/google_maps_flutter.dart | 1 + .../google_maps_flutter/lib/src/google_map.dart | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/packages/google_maps_flutter/google_maps_flutter/lib/google_maps_flutter.dart b/packages/google_maps_flutter/google_maps_flutter/lib/google_maps_flutter.dart index b879f3d302cf..fa860d4a1b40 100644 --- a/packages/google_maps_flutter/google_maps_flutter/lib/google_maps_flutter.dart +++ b/packages/google_maps_flutter/google_maps_flutter/lib/google_maps_flutter.dart @@ -8,6 +8,7 @@ import 'dart:async'; import 'dart:io'; import 'dart:typed_data'; import 'dart:ui'; +import 'dart:math' as math show Random; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; diff --git a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart index a45a1c8e3fe4..4fbd19eef920 100644 --- a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart +++ b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart @@ -10,6 +10,8 @@ part of google_maps_flutter; /// map is created. typedef void MapCreatedCallback(GoogleMapController controller); +final _random = math.Random(); + /// A widget which displays a map with data obtained from the Google Maps service. class GoogleMap extends StatefulWidget { /// Creates a widget displaying data from Google Maps services. @@ -205,6 +207,8 @@ class GoogleMap extends StatefulWidget { } class _GoogleMapState extends State { + final _creationMapId = _random.nextInt(4294967296); // 1<<32 + final Completer _controller = Completer(); @@ -223,7 +227,10 @@ class _GoogleMapState extends State { 'polygonsToAdd': serializePolygonSet(widget.polygons), 'polylinesToAdd': serializePolylineSet(widget.polylines), 'circlesToAdd': serializeCircleSet(widget.circles), + 'creationMapId': _creationMapId, }; + // TODO: Can this call to buildView be moved to the initState method? + // That way we wouldn't need the _creationMapId return _googleMapsFlutterPlatform.buildView( creationParams, widget.gestureRecognizers, From 908115c1ec7b6bb7086797af5759dd7c5033e4ef Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Wed, 8 Jul 2020 14:09:53 -0700 Subject: [PATCH 02/11] [google_maps_flutter] Remove Platform check in polyline demo. --- .../google_maps_flutter/example/lib/place_polyline.dart | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polyline.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polyline.dart index 0c9da634faa7..b61463e691fe 100644 --- a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polyline.dart +++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polyline.dart @@ -4,8 +4,7 @@ // ignore_for_file: public_member_api_docs -import 'dart:io' show Platform; - +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; @@ -202,7 +201,7 @@ class PlacePolylineBodyState extends State { @override Widget build(BuildContext context) { - final bool iOSorNotSelected = Platform.isIOS || (selectedPolyline == null); + final bool iOSorNotSelected = (!kIsWeb && defaultTargetPlatform == TargetPlatform.iOS) || (selectedPolyline == null); return Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, From aedaa37d4f121a420dd27e516223e3d92941ff25 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 31 Jul 2020 14:38:23 -0700 Subject: [PATCH 03/11] [google_maps_flutter] Pass icon size to custom icon. --- .../google_maps_flutter/example/lib/marker_icons.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/marker_icons.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/marker_icons.dart index e0fcc427c1d6..b62d898c3a3b 100644 --- a/packages/google_maps_flutter/google_maps_flutter/example/lib/marker_icons.dart +++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/marker_icons.dart @@ -73,7 +73,7 @@ class MarkerIconsBodyState extends State { Future _createMarkerImageFromAsset(BuildContext context) async { if (_markerIcon == null) { final ImageConfiguration imageConfiguration = - createLocalImageConfiguration(context); + createLocalImageConfiguration(context, size: Size.square(48)); BitmapDescriptor.fromAssetImage( imageConfiguration, 'assets/red_square.png') .then(_updateBitmap); From d85551eecff662fc34a29464ee5d416126fec813 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 31 Jul 2020 15:03:31 -0700 Subject: [PATCH 04/11] [google_maps_flutter] Update version. --- .../google_maps_flutter/google_maps_flutter/CHANGELOG.md | 5 +++++ .../google_maps_flutter/google_maps_flutter/pubspec.yaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md index 8ad0c02d3f77..abd06ecaef71 100644 --- a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.5.29 + +* Pass a constant `creationMapId` to `platform.buildView`, so web can return a cached widget DOM when flutter attempts to repaint there. +* Modify some examples slightly so they're more web-friendly. + ## 0.5.28+2 * Move test introduced in #2449 to its right location. diff --git a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml index 5e3cf226f03d..3798a6bd0d0e 100644 --- a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml @@ -1,7 +1,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter/google_maps_flutter -version: 0.5.28+2 +version: 0.5.29 dependencies: flutter: From 007d7d3983b47eea665faf5de4ac6c25d6833deb Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 31 Jul 2020 15:04:01 -0700 Subject: [PATCH 05/11] [google_maps_flutter_platform_interface] Pass icon width/height (web) * Pass icon width/height if present on `fromAssetImage` BitmapDescriptors (web only) * Bump version --- .../google_maps_flutter_platform_interface/CHANGELOG.md | 4 ++++ .../lib/src/types/bitmap.dart | 6 ++++++ .../google_maps_flutter_platform_interface/pubspec.yaml | 4 ++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md index eca5c914a603..47cb8ecc15ad 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.3 + +* Pass icon width/height if present on `fromAssetImage` BitmapDescriptors (web only) + ## 1.0.2 * Update lower bound of dart dependency to 2.1.0. diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/bitmap.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/bitmap.dart index 40581b43e065..3f6801f7b7a1 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/bitmap.dart +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/bitmap.dart @@ -9,6 +9,8 @@ import 'package:flutter/material.dart' show ImageConfiguration, AssetImage, AssetBundleImageKey; import 'package:flutter/services.dart' show AssetBundle; +import 'package:flutter/foundation.dart' show kIsWeb; + /// Defines a bitmap image. For a marker, this class can be used to set the /// image of the marker icon. For a ground overlay, it can be used to set the /// image to place on the surface of the earth. @@ -100,6 +102,10 @@ class BitmapDescriptor { 'fromAssetImage', assetBundleImageKey.name, assetBundleImageKey.scale, + if (kIsWeb && configuration?.size != null) [ + configuration.size.width, + configuration.size.height, + ], ]); } diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml index b28b7f47652d..f062b25c79ea 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml @@ -3,7 +3,7 @@ description: A common platform interface for the google_maps_flutter plugin. homepage: https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter/google_maps_flutter_platform_interface # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 1.0.2 +version: 1.0.3 dependencies: flutter: @@ -19,5 +19,5 @@ dev_dependencies: pedantic: ^1.8.0 environment: - sdk: ">=2.1.0 <3.0.0" + sdk: ">=2.3.0 <3.0.0" flutter: ">=1.9.1+hotfix.4 <2.0.0" From abdce00a7efa61e398039f986ee48a2e0cc2d1c9 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Fri, 31 Jul 2020 15:14:14 -0700 Subject: [PATCH 06/11] dartfmt -w . --- .../google_maps_flutter/example/lib/place_polyline.dart | 4 +++- .../lib/src/types/bitmap.dart | 9 +++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polyline.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polyline.dart index b61463e691fe..35ffd33a53c2 100644 --- a/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polyline.dart +++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/place_polyline.dart @@ -201,7 +201,9 @@ class PlacePolylineBodyState extends State { @override Widget build(BuildContext context) { - final bool iOSorNotSelected = (!kIsWeb && defaultTargetPlatform == TargetPlatform.iOS) || (selectedPolyline == null); + final bool iOSorNotSelected = + (!kIsWeb && defaultTargetPlatform == TargetPlatform.iOS) || + (selectedPolyline == null); return Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/bitmap.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/bitmap.dart index 3f6801f7b7a1..a6fdcc1b7e33 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/bitmap.dart +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/bitmap.dart @@ -102,10 +102,11 @@ class BitmapDescriptor { 'fromAssetImage', assetBundleImageKey.name, assetBundleImageKey.scale, - if (kIsWeb && configuration?.size != null) [ - configuration.size.width, - configuration.size.height, - ], + if (kIsWeb && configuration?.size != null) + [ + configuration.size.width, + configuration.size.height, + ], ]); } From 0f9946d43f2d78b8a819293bc175df00f86c8f38 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Mon, 3 Aug 2020 13:49:41 -0700 Subject: [PATCH 07/11] [google_maps_flutter] Convert random to auto-increment, and make name of init param more obvious. --- .../lib/google_maps_flutter.dart | 1 - .../google_maps_flutter/lib/src/google_map.dart | 13 ++++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter/lib/google_maps_flutter.dart b/packages/google_maps_flutter/google_maps_flutter/lib/google_maps_flutter.dart index fa860d4a1b40..b879f3d302cf 100644 --- a/packages/google_maps_flutter/google_maps_flutter/lib/google_maps_flutter.dart +++ b/packages/google_maps_flutter/google_maps_flutter/lib/google_maps_flutter.dart @@ -8,7 +8,6 @@ import 'dart:async'; import 'dart:io'; import 'dart:typed_data'; import 'dart:ui'; -import 'dart:math' as math show Random; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; diff --git a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart index 4fbd19eef920..409f73f285c8 100644 --- a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart +++ b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart @@ -10,7 +10,11 @@ part of google_maps_flutter; /// map is created. typedef void MapCreatedCallback(GoogleMapController controller); -final _random = math.Random(); +// This counter is used to provide a stable "constant" initialization id +// to the buildView function, so the web implementation can use it as a +// cache key. This needs to be provided from the outside, because web +// views seem to re-render much more often that mobile platform views. +int _web_only_platformId = 0; /// A widget which displays a map with data obtained from the Google Maps service. class GoogleMap extends StatefulWidget { @@ -207,7 +211,7 @@ class GoogleMap extends StatefulWidget { } class _GoogleMapState extends State { - final _creationMapId = _random.nextInt(4294967296); // 1<<32 + final _web_only_mapCreationId = _web_only_platformId++; final Completer _controller = Completer(); @@ -227,10 +231,9 @@ class _GoogleMapState extends State { 'polygonsToAdd': serializePolygonSet(widget.polygons), 'polylinesToAdd': serializePolylineSet(widget.polylines), 'circlesToAdd': serializeCircleSet(widget.circles), - 'creationMapId': _creationMapId, + '_web_only_mapCreationId': _web_only_mapCreationId, }; - // TODO: Can this call to buildView be moved to the initState method? - // That way we wouldn't need the _creationMapId + return _googleMapsFlutterPlatform.buildView( creationParams, widget.gestureRecognizers, From 1c9afec4517529e4dcf8a1bbad0a6d8ebe3f7e55 Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Mon, 3 Aug 2020 13:58:46 -0700 Subject: [PATCH 08/11] Update param name in changelog --- packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md index abd06ecaef71..5d62a5179fd4 100644 --- a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.5.29 -* Pass a constant `creationMapId` to `platform.buildView`, so web can return a cached widget DOM when flutter attempts to repaint there. +* Pass a constant `_web_only_mapCreationId` to `platform.buildView`, so web can return a cached widget DOM when flutter attempts to repaint there. * Modify some examples slightly so they're more web-friendly. ## 0.5.28+2 From 33d7da2e64c2d722a0531a901c718bf6bdc9d6cc Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Tue, 4 Aug 2020 15:16:57 -0700 Subject: [PATCH 09/11] Address PR comments, and add unit test. --- .../lib/src/google_map.dart | 6 +- .../google_maps_flutter/pubspec.yaml | 1 + .../test/map_creation_test.dart | 61 +++++++++++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart diff --git a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart index 409f73f285c8..5cf3db120ccd 100644 --- a/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart +++ b/packages/google_maps_flutter/google_maps_flutter/lib/src/google_map.dart @@ -14,7 +14,7 @@ typedef void MapCreatedCallback(GoogleMapController controller); // to the buildView function, so the web implementation can use it as a // cache key. This needs to be provided from the outside, because web // views seem to re-render much more often that mobile platform views. -int _web_only_platformId = 0; +int _webOnlyMapId = 0; /// A widget which displays a map with data obtained from the Google Maps service. class GoogleMap extends StatefulWidget { @@ -211,7 +211,7 @@ class GoogleMap extends StatefulWidget { } class _GoogleMapState extends State { - final _web_only_mapCreationId = _web_only_platformId++; + final _webOnlyMapCreationId = _webOnlyMapId++; final Completer _controller = Completer(); @@ -231,7 +231,7 @@ class _GoogleMapState extends State { 'polygonsToAdd': serializePolygonSet(widget.polygons), 'polylinesToAdd': serializePolylineSet(widget.polylines), 'circlesToAdd': serializeCircleSet(widget.circles), - '_web_only_mapCreationId': _web_only_mapCreationId, + '_webOnlyMapCreationId': _webOnlyMapCreationId, }; return _googleMapsFlutterPlatform.buildView( diff --git a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml index 3798a6bd0d0e..34c305882168 100644 --- a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml @@ -19,6 +19,7 @@ dev_dependencies: sdk: flutter test: ^1.6.0 pedantic: ^1.8.0 + mockito: ^4.1.1 flutter: plugin: diff --git a/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart new file mode 100644 index 000000000000..26d46e36d494 --- /dev/null +++ b/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart @@ -0,0 +1,61 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:google_maps_flutter/google_maps_flutter.dart'; +import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:mockito/mockito.dart'; + +class MockGoogleMapsFlutterPlatform extends Mock + with MockPlatformInterfaceMixin + implements GoogleMapsFlutterPlatform {} + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + final platform = MockGoogleMapsFlutterPlatform(); + + setUp(() { + // Use a mock platform so we never need to hit the MethodChannel code. + GoogleMapsFlutterPlatform.instance = platform; + when(platform.buildView(any, any, any)).thenReturn(Container()); + }); + + testWidgets('_webOnlyMapCreationId increments with each GoogleMap widget', ( + WidgetTester tester, + ) async { + + // Inject two map widgets... + await tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Column( + children: const [ + GoogleMap( + initialCameraPosition: CameraPosition(target: LatLng(43.362, -5.849)), + ), + GoogleMap( + initialCameraPosition: CameraPosition(target: LatLng(47.649, -122.350)), + ), + ], + ), + ), + ); + + // Verify that each one was created with a different _webOnlyMapCreationId. + verifyInOrder([ + platform.buildView( + argThat(containsPair('_webOnlyMapCreationId', 0)), + any, + any, + ), + platform.buildView( + argThat(containsPair('_webOnlyMapCreationId', 1)), + any, + any, + ), + ]); + }); +} From 59c689a1b148f67fee5cb736940f1af42e73e3ae Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Tue, 4 Aug 2020 15:35:09 -0700 Subject: [PATCH 10/11] Add explicit dep in plugin_platform_interface package. --- packages/google_maps_flutter/google_maps_flutter/pubspec.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml index 34c305882168..120600a9823c 100644 --- a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml @@ -19,6 +19,7 @@ dev_dependencies: sdk: flutter test: ^1.6.0 pedantic: ^1.8.0 + plugin_platform_interface: ^1.0.2 mockito: ^4.1.1 flutter: From ee764031c966105d967b08f2d6052146d083fcbe Mon Sep 17 00:00:00 2001 From: David Iglesias Teixeira Date: Tue, 4 Aug 2020 15:47:34 -0700 Subject: [PATCH 11/11] dartfmt -w . --- .../google_maps_flutter/test/map_creation_test.dart | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart index 26d46e36d494..7861c86e9709 100644 --- a/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter/test/map_creation_test.dart @@ -26,7 +26,6 @@ void main() { testWidgets('_webOnlyMapCreationId increments with each GoogleMap widget', ( WidgetTester tester, ) async { - // Inject two map widgets... await tester.pumpWidget( Directionality( @@ -34,10 +33,14 @@ void main() { child: Column( children: const [ GoogleMap( - initialCameraPosition: CameraPosition(target: LatLng(43.362, -5.849)), + initialCameraPosition: CameraPosition( + target: LatLng(43.362, -5.849), + ), ), GoogleMap( - initialCameraPosition: CameraPosition(target: LatLng(47.649, -122.350)), + initialCameraPosition: CameraPosition( + target: LatLng(47.649, -122.350), + ), ), ], ),