- 
					BINassets/images/jpg/level-1.jpg
- 
					BINassets/images/jpg/level-2.jpg
- 
					BINassets/images/jpg/level-3.jpg
- 
					BINassets/images/jpg/level-4.jpg
- 
					BINassets/images/jpg/level-5.jpg
- 
					BINassets/images/jpg/level-6.jpg
- 
					BINassets/images/jpg/level-7.jpg
- 
					BINassets/images/jpg/level-8.jpg
- 
					BINassets/images/level_1_image.png
- 
					BINassets/images/level_2_image.png
- 
					BINassets/images/level_4_image.png
- 
					BINassets/images/png/avatar.png
- 
					0assets/images/png/default_image.png
- 
					0assets/images/png/level_screen_image.png
- 
					0assets/images/png/puzzle_side_image.png
- 
					0assets/images/png/splash_screen_image.png
- 
					0assets/images/png/start.png
- 
					3assets/images/svg/flash.svg
- 
					4assets/images/svg/refresh.svg
- 
					3assets/images/svg/timer.svg
- 
					3lib/application/notifiers/image_splitter_notifier.dart
- 
					10lib/cubits/count_down_timer_cubit.dart
- 
					15lib/main.dart
- 
					62lib/screens/level_list/screen/level_list_screen.dart
- 
					14lib/screens/photo/photo_screen.dart
- 
					225lib/screens/photo/photo_screen_large.dart
- 
					3lib/screens/puzzle/puzzle_starter_screen.dart
- 
					1lib/screens/splash/screen/splash_screen.dart
- 
					6lib/utils/extensions/string_extensions.dart
- 
					10lib/utils/image_splitter.dart
- 
					11lib/utils/puzzle_solver.dart
- 
					22lib/widgets/photo_screen/image_viewer.dart
- 
					15lib/widgets/solo_screen/animated_dash.dart
- 
					19lib/widgets/solo_screen/count_down_timer_widget.dart
- 
					85lib/widgets/solo_screen/countdown_widget.dart
- 
					4lib/widgets/solo_screen/moves_tiles_widget.dart
- 
					97lib/widgets/solo_screen/moves_tiles_widget/moves_tiles_text.dart
- 
					4lib/widgets/solo_screen/puzzle_widget/puzzle_board.dart
- 
					2pubspec.yaml
- 
					13test/my_queue_test.dart
- 
					16test/puzzle_solver_test.dart
- 
					29test/widget_test.dart
| After Width: 600 | Height: 600 | Size: 71 KiB | 
| After Width: 600 | Height: 600 | Size: 67 KiB | 
| After Width: 600 | Height: 600 | Size: 89 KiB | 
| After Width: 600 | Height: 600 | Size: 68 KiB | 
| After Width: 600 | Height: 600 | Size: 84 KiB | 
| After Width: 600 | Height: 600 | Size: 66 KiB | 
| After Width: 600 | Height: 600 | Size: 59 KiB | 
| After Width: 600 | Height: 600 | Size: 70 KiB | 
| Before Width: 70 | Height: 70 | Size: 10 KiB | 
| Before Width: 70 | Height: 71 | Size: 11 KiB | 
| Before Width: 70 | Height: 71 | Size: 13 KiB | 
| After Width: 126 | Height: 251 | Size: 37 KiB | 
| Before Width: 1006 | Height: 1007 | Size: 1.2 MiB After Width: 1006 | Height: 1007 | Size: 1.2 MiB | 
| Before Width: 214 | Height: 296 | Size: 54 KiB After Width: 214 | Height: 296 | Size: 54 KiB | 
| Before Width: 1061 | Height: 1400 | Size: 791 KiB After Width: 1061 | Height: 1400 | Size: 791 KiB | 
| Before Width: 266 | Height: 209 | Size: 45 KiB After Width: 266 | Height: 209 | Size: 45 KiB | 
| Before Width: 63 | Height: 63 | Size: 1.8 KiB After Width: 63 | Height: 63 | Size: 1.8 KiB | 
| @ -0,0 +1,3 @@ | |||
| <svg xmlns="http://www.w3.org/2000/svg" width="8.669" height="15.172" viewBox="0 0 8.669 15.172"> | |||
|   <path id="Icon_ionic-ios-flash" data-name="Icon ionic-ios-flash" d="M17.4,8.748H13.738L15.512,2.42a.137.137,0,0,0-.244-.115L9.049,10.461a.286.286,0,0,0,.213.454h3.663l-1.774,6.328a.137.137,0,0,0,.244.115l6.219-8.153A.289.289,0,0,0,17.4,8.748Z" transform="translate(-8.996 -2.246)" fill="#fa6400"/> | |||
| </svg> | |||
| @ -0,0 +1,4 @@ | |||
| <svg id="icon-refresh" xmlns="http://www.w3.org/2000/svg" width="12.871" height="12.995" viewBox="0 0 12.871 12.995"> | |||
|   <path id="Path" d="M1.609,5.785a4.877,4.877,0,0,1,7.995-3l-.629.629a.54.54,0,0,0,.381.921h2.474a.54.54,0,0,0,.54-.54V1.325a.54.54,0,0,0-.921-.381l-.7.7A6.488,6.488,0,0,0,.011,5.549a.817.817,0,0,0,.8.948A.817.817,0,0,0,1.609,5.785Z" transform="translate(0 0)" fill="#ff9700"/> | |||
|   <path id="Path-2" data-name="Path" d="M11.563,0a.817.817,0,0,0-.8.712,4.877,4.877,0,0,1-7.995,3L3.4,3.079a.54.54,0,0,0-.381-.921H.54A.54.54,0,0,0,0,2.7V5.172a.54.54,0,0,0,.921.381l.7-.7A6.488,6.488,0,0,0,12.36.949a.817.817,0,0,0-.8-.949Z" transform="translate(0.5 6.497)" fill="#ff9700"/> | |||
| </svg> | |||
| @ -0,0 +1,3 @@ | |||
| <svg xmlns="http://www.w3.org/2000/svg" width="13.763" height="17.144" viewBox="0 0 13.763 17.144"> | |||
|   <path id="Icon_material-timer" data-name="Icon material-timer" d="M13.342.5H8.921V1.974h4.421ZM10.394,11.25h1.474V7.408H10.394Zm5.917-4.87,1.046-1.046a8.14,8.14,0,0,0-1.039-1.039L15.272,5.341A6.631,6.631,0,1,0,16.311,6.38Zm-5.18,9.291a5.158,5.158,0,1,1,5.158-5.158A5.154,5.154,0,0,1,11.131,15.671Z" transform="translate(-4.25 -0.25)" fill="#fff" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="0.5"/> | |||
| </svg> | |||
| @ -1,13 +0,0 @@ | |||
| import 'package:flutter_test/flutter_test.dart'; | |||
| import 'package:freezed_annotation/freezed_annotation.dart'; | |||
| import 'package:tuple/tuple.dart'; | |||
| 
 | |||
| void main() { | |||
|   test('queue test', () { | |||
|     final queue = HeapPriorityQueue<Tuple2<int, int>>((a, b) => a.item1.compareTo(b.item1)); | |||
|     queue.add(const Tuple2(5, 515)); | |||
|     queue.add(const Tuple2(3, 245)); | |||
|     queue.add(const Tuple2(8, 645)); | |||
|     queue.add(const Tuple2(2, 345)); | |||
|   }); | |||
| } | |||
| @ -1,16 +0,0 @@ | |||
| import 'package:flutter_test/flutter_test.dart'; | |||
| import 'package:my_flutter_puzzle/utils/puzzle_solver.dart'; | |||
| 
 | |||
| void main() { | |||
|   test('solver logic test', () { | |||
|     final solver = PuzzleSolverClient(size: 4); | |||
|     final board = solver.createRandomBoard(); | |||
| 
 | |||
|     final boardStates = solver.runner(board); | |||
|     if (boardStates != null) { | |||
|       for (var board in boardStates) { | |||
|         print(board); | |||
|       } | |||
|     } | |||
|   }); | |||
| } | |||
| @ -1,29 +0,0 @@ | |||
| // This is a basic Flutter widget test. | |||
| // | |||
| // To perform an interaction with a widget in your test, use the WidgetTester | |||
| // utility that Flutter provides. For example, you can send tap and scroll | |||
| // gestures. You can also use WidgetTester to find child widgets in the widget | |||
| // tree, read text, and verify that the values of widget properties are correct. | |||
| 
 | |||
| import 'package:flutter/material.dart'; | |||
| import 'package:flutter_test/flutter_test.dart'; | |||
| import 'package:my_flutter_puzzle/main.dart'; | |||
| 
 | |||
| void main() { | |||
|   testWidgets('Counter increments smoke test', (WidgetTester tester) async { | |||
|     // Build our app and trigger a frame. | |||
|     await tester.pumpWidget(const MyApp()); | |||
| 
 | |||
|     // Verify that our counter starts at 0. | |||
|     expect(find.text('0'), findsOneWidget); | |||
|     expect(find.text('1'), findsNothing); | |||
| 
 | |||
|     // Tap the '+' icon and trigger a frame. | |||
|     await tester.tap(find.byIcon(Icons.add)); | |||
|     await tester.pump(); | |||
| 
 | |||
|     // Verify that our counter has incremented. | |||
|     expect(find.text('0'), findsNothing); | |||
|     expect(find.text('1'), findsOneWidget); | |||
|   }); | |||
| } | |||